From 009e4f2b3c60dcb9a4b670d9fb1cbcb6ec1b80b3 Mon Sep 17 00:00:00 2001 From: usantos Date: Tue, 18 Aug 2026 20:30:26 -0300 Subject: [PATCH 01/21] Adicionado Mapa Treta no Gelo --- AGENTS.md | 6 +- KNOWN-BUGS.md | 19 + README.md | 17 +- STATUS.md | 6 +- docs/docs/arquitetura.md | 6 +- docs/docs/colaborar.md | 3 +- docs/docs/comecando.md | 17 +- .../current/arquitetura.md | 6 +- .../current/colaborar.md | 3 +- .../current/comecando.md | 17 +- graphify-out/.graphify_query_args.json | 1 + package.json | 4 +- public/img/map-previews/treta_no_gelo.jpg | Bin 0 -> 31976 bytes public/js/audio.js | 9 +- public/js/game.js | 15 +- public/js/main.js | 2 + public/js/map_gelo.js | 250 ++ public/js/maps.js | 2 + public/models/anims/foot-offsets.json | 2 +- src/data/jogo.ts | 9 +- src/pages/maps.astro | 7 + tools/eval/ARCH.md | 120 +- tools/eval/char_probe.json | 16 +- tools/eval/g2ui-map-previews.mjs | 4 +- tools/eval/map_check.json | 673 ++++- tools/eval/mat_check.json | 2249 ++++++++++++++++- tools/eval/mat_scenes.json | 212 +- tools/eval/mat_shade.json | 2030 ++++++++++++++- tools/eval/pickup_check.json | 1428 ++++++++++- tools/eval/treta-gelo-check.mjs | 141 ++ 30 files changed, 7138 insertions(+), 136 deletions(-) create mode 100644 graphify-out/.graphify_query_args.json create mode 100644 public/img/map-previews/treta_no_gelo.jpg create mode 100644 public/js/map_gelo.js create mode 100644 tools/eval/treta-gelo-check.mjs diff --git a/AGENTS.md b/AGENTS.md index 012e48224..c891af9e1 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -41,7 +41,7 @@ algo está errado e o quality gate está verde, o defeito é do quality gate. | Zona | O que é | Tamanho medido | Regra | |---|---|---|---| -| `public/` | o **jogo** | 39 arquivos `.js`, 29.655 linhas · Three.js `r160` vendorizado | ES modules servidos crus, **zero build**, sem dependência de runtime | +| `public/` | o **jogo** | 39 arquivos `.js`, 29.673 linhas · Three.js `r160` vendorizado | ES modules servidos crus, **zero build**, sem dependência de runtime | | `src/` | o **site** | 18 páginas `.astro`, 19 rotas `/api` · Astro `^7.1.1` | framework é bem-vindo; `service_role` só no servidor | | `tools/` | o **arnês** | 177 scripts em `tools/eval/`, 54 em `tools/` | node puro: sobe o jogo real sem browser | @@ -149,10 +149,10 @@ Um assunto, um arquivo. Se você precisa da informação, é daqui que você sai ```bash npm run check # npm run syntax && npm run audio:check && npm run eval:medianet && npm run eval:ctfhud && npm run eval:vm && npm run eval:invariants && npm run eval:kick && npm run eval:bots -npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock +npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:gelo ``` -`package.json` tem **104 scripts**. Vários trazem uma chave `//nome` logo acima com o motivo de existirem — é onde mora o porquê. +`package.json` tem **105 scripts**. Vários trazem uma chave `//nome` logo acima com o motivo de existirem — é onde mora o porquê. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `node -p "Object.keys(require('./package.json').scripts)"` diff --git a/KNOWN-BUGS.md b/KNOWN-BUGS.md index afafe524a..687fe6d27 100644 --- a/KNOWN-BUGS.md +++ b/KNOWN-BUGS.md @@ -2371,6 +2371,25 @@ publicação em potencial, e o `.gitignore` não protege de um deploy local. ## Relatos recentes e resolução +- **BUG-68 · RESOLVIDO — rampa do Treta no Gelo aparecia sem textura.** Palavras do dono: + *"A rampa esta sem textura"*. A régua existente só conferia `material.map.name`, portanto + ficava verde mesmo com UV degenerado nas faces laterais da cunha. **Evidência:** GELO8 em + `eval:gelo` media 67%/67% de cobertura UV antes e 100%/100% depois de separar as costuras + das faces. O mutante `rampa-sem-uv` reprova em 0%/0%. A captura real confirmou os blocos + de gelo contínuos nas faces inclinadas e laterais. **Custo:** 18 vértices adicionais por + rampa, sem textura, material ou draw call extra. + +- **~~BUG-67 · rampas do Treta no Gelo não são transitáveis e destoam dos blocos~~ · RESOLVIDO 18/08.** Palavras do + dono: *"Deixe as rampas com a cor dos blocos e faca com que seja possivel subir nela"*. + A rampa visível foi cadastrada como um AABB sólido de 2,4 m e o mapa exporta + `groundHeightAt: () => 0`; portanto o motor enxergava parede, não inclinação. Agora a + altura acompanha continuamente a cunha, o AABB foi retirado e a geometria tem UV para + receber a mesma `gelo-pedra` da fortaleza. **Antes:** GELO6 vermelha. **Depois:** o + `_updatePlayer()` real subiu ambas as rampas até 2,39 m. A cláusula GELO6 de `eval:gelo` + mede altura, colisão, material e movimento; `rampa-plana`, `rampa-parede` e `rampa-cor` + deixam a cláusula vermelha. **Custo:** 27 → 25 colisores; as rampas deixam de ocluir por + AABB, mas continuam em `occluders` para linha de visão e o grafo permanece conectado. + - **~~BUG-66 · Faria Limer ainda fala com a voz do Lula~~ · RESOLVIDO 16/08.** Palavras do dono: *"o farialimer ainda tá com som do Lula; precisamos usar um do time do Bolsonaro"*. O vínculo explícito criado no BUG-65 aponta para `55678d5886537476`, hash do arquivo-fonte `cana_doce.mp3`: diff --git a/README.md b/README.md index e33450615..7d6895571 100644 --- a/README.md +++ b/README.md @@ -34,15 +34,15 @@ contra bots, direto na aba. Sem download, sem instalação, sem cadastro. | O que | Quanto | Onde confere | |---|---:|---| -| Código do jogo | 29.655 linhas em 39 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | -| `game.js` | **6.560** linhas | `wc -l public/js/game.js` | -| `main.js` | 2.512 linhas | `wc -l public/js/main.js` | +| Código do jogo | 29.673 linhas em 39 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | +| `game.js` | **6.567** linhas | `wc -l public/js/game.js` | +| `main.js` | 2.514 linhas | `wc -l public/js/main.js` | | Armas com GLB | 26 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | | GLBs de personagem | 45 | `git ls-files 'public/models/characters/*.glb' \| wc -l` | | Props em GLB | 108 | `git ls-files 'public/models/props/*.glb' \| wc -l` | | Clipes de animação versionados | 573 | `git ls-files public/models/anims \| wc -l` | | Personagens jogáveis | 44, em 5 facções | array `CHARACTERS` de `characters.js` | -| Mapas no registro | 7 | objeto `MAPS` de `maps.js` | +| Mapas no registro | 8 | objeto `MAPS` de `maps.js` | | Arnêses visuais em HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | | Scripts do arnês | 177 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | @@ -196,10 +196,10 @@ está lá. Use `npm run dev`. ```bash npm run check # npm run syntax && npm run audio:check && npm run eval:medianet && npm run eval:ctfhud && npm run eval:vm && npm run eval:invariants && npm run eval:kick && npm run eval:bots -npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock +npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:gelo ``` -`package.json` tem **104 scripts**. Vários trazem uma chave `//nome` logo acima com o motivo de existirem — é onde mora o porquê. +`package.json` tem **105 scripts**. Vários trazem uma chave `//nome` logo acima com o motivo de existirem — é onde mora o porquê. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `node -p "Object.keys(require('./package.json').scripts)"` @@ -290,7 +290,7 @@ projeto. | Regra | Valor | Constante | |---|---|---| | Facções · personagens | 5 · 44 (B 9 · C 9 · E 8 · F 9 · U 9) | `CHARACTERS` | -| Mapas no menu | 7 — 2 abrem em rodadas, **5 em captura** | `MAPS` / `ctfMode` | +| Mapas no menu | 8 — 3 abrem em rodadas, **5 em captura** | `MAPS` / `ctfMode` | | Respawn | 2,2 s | `RESPAWN_DELAY` | | Round | 99 s, 3 vitórias | `ROUND_TIME` / `ROUNDS_TO_WIN` | | Captura | alvo = **todas as bandeiras do mapa**, 2 rodadas (rede de segurança 480 s) | `capsToWin = ctfPts.length` / `CTF_ROUNDS_TO_WIN` | @@ -324,8 +324,9 @@ Os mapas registrados, e em que modo cada um abre: | `quebrada` | Quebrada (Rua do Baile) | **captura** | `map_quebrada.js` | 1.599 | | `posto_treta` | Posto da Treta | **captura** | `map_posto.js` | 489 | | `atacadao_treta` | Atacadão da Treta | **captura** | `map_atacadao.js` | 255 | +| `treta_no_gelo` | Treta no Gelo | rodadas | `map_gelo.js` | 250 | -**7 mapas registrados** — 2 abrem em rodadas e 5 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 9 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. +**8 mapas registrados** — 3 abrem em rodadas e 5 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 9 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `objeto MAPS de public/js/maps.js` diff --git a/STATUS.md b/STATUS.md index 8a20af50e..c9a1d028f 100644 --- a/STATUS.md +++ b/STATUS.md @@ -3,9 +3,9 @@ - **Versão:** `2.0.0-alpha.136` -- **Conteúdo jogável:** 5 facções, 44 personagens, 7 mapas e 26 armas com GLB -- **Código do jogo:** 29.655 linhas em 39 módulos JavaScript -- **Automação:** 104 comandos npm, 177 scripts de avaliação e 54 scripts de pipeline +- **Conteúdo jogável:** 5 facções, 44 personagens, 8 mapas e 26 armas com GLB +- **Código do jogo:** 29.673 linhas em 39 módulos JavaScript +- **Automação:** 105 comandos npm, 177 scripts de avaliação e 54 scripts de pipeline > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `package.json · CHARACTERS · MAPS · public/models/weapons · public/js · tools/` diff --git a/docs/docs/arquitetura.md b/docs/docs/arquitetura.md index a668531cb..60e9fb5ea 100644 --- a/docs/docs/arquitetura.md +++ b/docs/docs/arquitetura.md @@ -62,15 +62,15 @@ Tamanho dos arquivos que o `gen-arch.mjs` indexa — bloco gerado, regenerado po | Arquivo | Linhas | |---|---:| -| `public/js/game.js` | 6.560 | -| `public/js/main.js` | 2.512 | +| `public/js/game.js` | 6.567 | +| `public/js/main.js` | 2.514 | | `public/js/characters.js` | 1.068 | | `public/js/glbchars.js` | 837 | | `public/js/vmattach.js` | 628 | | `public/js/weapons.js` | 344 | | `public/js/springs.js` | 260 | -Total de `public/js/`: **29.655 linhas em 39 arquivos**. O índice símbolo→linha, com a tabela de conflito, é outro bloco gerado: `tools/eval/ARCH.md` (`npm run arch`). +Total de `public/js/`: **29.673 linhas em 39 arquivos**. O índice símbolo→linha, com a tabela de conflito, é outro bloco gerado: `tools/eval/ARCH.md` (`npm run arch`). > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: ``git ls-files public/js/*.js | xargs wc -l`` diff --git a/docs/docs/colaborar.md b/docs/docs/colaborar.md index 7049c17c3..5e4daa741 100644 --- a/docs/docs/colaborar.md +++ b/docs/docs/colaborar.md @@ -255,8 +255,9 @@ O registro, gerado do `MAPS` de `public/js/maps.js`: | `quebrada` | Quebrada (Rua do Baile) | **captura** | `map_quebrada.js` | 1.599 | | `posto_treta` | Posto da Treta | **captura** | `map_posto.js` | 489 | | `atacadao_treta` | Atacadão da Treta | **captura** | `map_atacadao.js` | 255 | +| `treta_no_gelo` | Treta no Gelo | rodadas | `map_gelo.js` | 250 | -**7 mapas registrados** — 2 abrem em rodadas e 5 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 9 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. +**8 mapas registrados** — 3 abrem em rodadas e 5 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 9 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `objeto MAPS de public/js/maps.js` diff --git a/docs/docs/comecando.md b/docs/docs/comecando.md index 32aa3c06d..a2b2ffb7a 100644 --- a/docs/docs/comecando.md +++ b/docs/docs/comecando.md @@ -39,15 +39,15 @@ esta página envelhecia no primeiro commit — ver | O que | Quanto | Onde confere | |---|---:|---| -| Código do jogo | 29.655 linhas em 39 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | -| `game.js` | **6.560** linhas | `wc -l public/js/game.js` | -| `main.js` | 2.512 linhas | `wc -l public/js/main.js` | +| Código do jogo | 29.673 linhas em 39 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | +| `game.js` | **6.567** linhas | `wc -l public/js/game.js` | +| `main.js` | 2.514 linhas | `wc -l public/js/main.js` | | Armas com GLB | 26 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | | GLBs de personagem | 45 | `git ls-files 'public/models/characters/*.glb' \| wc -l` | | Props em GLB | 108 | `git ls-files 'public/models/props/*.glb' \| wc -l` | | Clipes de animação versionados | 573 | `git ls-files public/models/anims \| wc -l` | | Personagens jogáveis | 44, em 5 facções | array `CHARACTERS` de `characters.js` | -| Mapas no registro | 7 | objeto `MAPS` de `maps.js` | +| Mapas no registro | 8 | objeto `MAPS` de `maps.js` | | Arnêses visuais em HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | | Scripts do arnês | 177 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | @@ -66,7 +66,7 @@ E as regras de partida que mais mudam de lugar, todas lidas das constantes de | Regra | Valor | Constante | |---|---|---| | Facções · personagens | 5 · 44 (B 9 · C 9 · E 8 · F 9 · U 9) | `CHARACTERS` | -| Mapas no menu | 7 — 2 abrem em rodadas, **5 em captura** | `MAPS` / `ctfMode` | +| Mapas no menu | 8 — 3 abrem em rodadas, **5 em captura** | `MAPS` / `ctfMode` | | Respawn | 2,2 s | `RESPAWN_DELAY` | | Round | 99 s, 3 vitórias | `ROUND_TIME` / `ROUNDS_TO_WIN` | | Captura | alvo = **todas as bandeiras do mapa**, 2 rodadas (rede de segurança 480 s) | `capsToWin = ctfPts.length` / `CTF_ROUNDS_TO_WIN` | @@ -228,8 +228,9 @@ Os mapas registrados hoje, e em que modo cada um abre: | `quebrada` | Quebrada (Rua do Baile) | **captura** | `map_quebrada.js` | 1.599 | | `posto_treta` | Posto da Treta | **captura** | `map_posto.js` | 489 | | `atacadao_treta` | Atacadão da Treta | **captura** | `map_atacadao.js` | 255 | +| `treta_no_gelo` | Treta no Gelo | rodadas | `map_gelo.js` | 250 | -**7 mapas registrados** — 2 abrem em rodadas e 5 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 9 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. +**8 mapas registrados** — 3 abrem em rodadas e 5 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 9 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `objeto MAPS de public/js/maps.js` @@ -271,10 +272,10 @@ E os dois quality gates, com a lista exata do que cada um roda — direto do `pa ```bash npm run check # npm run syntax && npm run audio:check && npm run eval:medianet && npm run eval:ctfhud && npm run eval:vm && npm run eval:invariants && npm run eval:kick && npm run eval:bots -npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock +npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:gelo ``` -`package.json` tem **104 scripts**. Vários trazem uma chave `//nome` logo acima com o motivo de existirem — é onde mora o porquê. +`package.json` tem **105 scripts**. Vários trazem uma chave `//nome` logo acima com o motivo de existirem — é onde mora o porquê. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `node -p "Object.keys(require('./package.json').scripts)"` diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/arquitetura.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/arquitetura.md index 73686d976..5a0f1a4b7 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/arquitetura.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/arquitetura.md @@ -69,15 +69,15 @@ Size of the files `gen-arch.mjs` indexes — a generated block, regenerated by | File | Lines | |---|---:| -| `public/js/game.js` | 6,560 | -| `public/js/main.js` | 2,512 | +| `public/js/game.js` | 6,567 | +| `public/js/main.js` | 2,514 | | `public/js/characters.js` | 1,068 | | `public/js/glbchars.js` | 837 | | `public/js/vmattach.js` | 628 | | `public/js/weapons.js` | 344 | | `public/js/springs.js` | 260 | -Total in `public/js/`: **29,655 lines in 39 files**. The symbol-to-line index lives in `tools/eval/ARCH.md`. +Total in `public/js/`: **29,673 lines in 39 files**. The symbol-to-line index lives in `tools/eval/ARCH.md`. > Block generated by `node tools/gen-docs.mjs`. Source: ``wc -l public/js/*.js`` diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md index 276b542e5..21fa6ff34 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md @@ -258,8 +258,9 @@ The registry, generated from the `MAPS` of `public/js/maps.js`: | `quebrada` | Quebrada (Rua do Baile) | **capture** | `map_quebrada.js` | 1,599 | | `posto_treta` | Posto da Treta | **capture** | `map_posto.js` | 489 | | `atacadao_treta` | Atacadão da Treta | **capture** | `map_atacadao.js` | 255 | +| `treta_no_gelo` | Treta no Gelo | rounds | `map_gelo.js` | 250 | -**7 registered maps** - 2 open in rounds and 5 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 9 `map_*.js` files on disk, so a file alone does **not** make a map playable. +**8 registered maps** - 3 open in rounds and 5 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 9 `map_*.js` files on disk, so a file alone does **not** make a map playable. > Block generated by `node tools/gen-docs.mjs`. Source: `objeto MAPS de public/js/maps.js` diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md index 662c1725f..3538d9a19 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md @@ -41,15 +41,15 @@ this page was aging at the very first commit — see | What | How much | Where to check | |---|---:|---| -| Game code | 29,655 lines in 39 files | `git ls-files public/js/*.js \| xargs wc -l` | -| `game.js` | **6,560** lines | `wc -l public/js/game.js` | -| `main.js` | 2,512 lines | `wc -l public/js/main.js` | +| Game code | 29,673 lines in 39 files | `git ls-files public/js/*.js \| xargs wc -l` | +| `game.js` | **6,567** lines | `wc -l public/js/game.js` | +| `main.js` | 2,514 lines | `wc -l public/js/main.js` | | Weapons with GLB | 26 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | | Character GLBs | 45 | `git ls-files 'public/models/characters/*.glb' \| wc -l` | | Props in GLB | 108 | `git ls-files 'public/models/props/*.glb' \| wc -l` | | Versioned animation clips | 573 | `git ls-files public/models/anims \| wc -l` | | Playable characters | 44, in 5 factions | `CHARACTERS` array in `characters.js` | -| Maps in the registry | 7 | `MAPS` object in `maps.js` | +| Maps in the registry | 8 | `MAPS` object in `maps.js` | | Visual harnesses in HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | | Harness scripts | 177 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Pipeline scripts | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | @@ -68,7 +68,7 @@ And the match rules that move around the most, all read from the constants in | Rule | Value | Constant | |---|---|---| | Factions · characters | 5 · 44 (B 9 · C 9 · E 8 · F 9 · U 9) | `CHARACTERS` | -| Maps in the menu | 7 - 2 open in rounds, **5 in capture** | `MAPS` / `ctfMode` | +| Maps in the menu | 8 - 3 open in rounds, **5 in capture** | `MAPS` / `ctfMode` | | Respawn | 2.2 s | `RESPAWN_DELAY` | | Round | 99 s, 3 wins | `ROUND_TIME` / `ROUNDS_TO_WIN` | | Capture | target = **all flags on the map**, 2 rounds (480 s safety net) | `capsToWin = ctfPts.length` / `CTF_ROUNDS_TO_WIN` | @@ -230,8 +230,9 @@ The maps registered today, and which mode each one opens in: | `quebrada` | Quebrada (Rua do Baile) | **capture** | `map_quebrada.js` | 1,599 | | `posto_treta` | Posto da Treta | **capture** | `map_posto.js` | 489 | | `atacadao_treta` | Atacadão da Treta | **capture** | `map_atacadao.js` | 255 | +| `treta_no_gelo` | Treta no Gelo | rounds | `map_gelo.js` | 250 | -**7 registered maps** - 2 open in rounds and 5 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 9 `map_*.js` files on disk, so a file alone does **not** make a map playable. +**8 registered maps** - 3 open in rounds and 5 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 9 `map_*.js` files on disk, so a file alone does **not** make a map playable. > Block generated by `node tools/gen-docs.mjs`. Source: `objeto MAPS de public/js/maps.js` @@ -273,10 +274,10 @@ And the two gates, with the exact list of what each one runs — straight from ` ```bash npm run check # npm run syntax && npm run audio:check && npm run eval:medianet && npm run eval:ctfhud && npm run eval:vm && npm run eval:invariants && npm run eval:kick && npm run eval:bots -npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock +npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:gelo ``` -`package.json` has **104 scripts**. Keys prefixed with `//` explain why the adjacent command exists. +`package.json` has **105 scripts**. Keys prefixed with `//` explain why the adjacent command exists. > Block generated by `node tools/gen-docs.mjs`. Source: `node -p "Object.keys(require('./package.json').scripts)"` diff --git a/graphify-out/.graphify_query_args.json b/graphify-out/.graphify_query_args.json new file mode 100644 index 000000000..94406bccf --- /dev/null +++ b/graphify-out/.graphify_query_args.json @@ -0,0 +1 @@ +{"original_question":"Tem como colocar um som de passo no gelo?","expanded_question":"audio step surface ground updateplayer","mode":"bfs","budget":2000,"node_a":"","node_b":"","node_name":"","save_question":"","answer":"","result_type":"query","nodes":[],"outcome":"useful","correction":""} diff --git a/package.json b/package.json index a7cc5bbbc..8ec425da5 100644 --- a/package.json +++ b/package.json @@ -175,7 +175,9 @@ "//check:deploy": "O PORTÃO QUE RODA NO BUILD DA VERCEL, entre o assert:assets e o astro build. Existe porque a integração Git da Vercel publica em PARALELO com o CI: commit vermelho vai pro ar do mesmo jeito (aconteceu em 07/08, arch:check quebrado deployado). Aqui, vermelho = não publica. É subconjunto do check:fast de propósito — só o que foi PROVADO em clone descartável, sem navegador e sem rede. O eval:invariants ficou de FORA por medição: 376 s no clone limpo, e 6 min em todo deploy compram pouco (ele já roda no CI). Entram aqui só passos baratos e determinísticos: sintaxe, telemetria, identidade, poda do build, HUD do vmlab, default do vm-inspect, ARCH, docs geradas, manifesto de mídia e animação, texto público e aspecto dos cartazes.", "check:deploy": "node tools/eval/runner.mjs syntax eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vmlabhud eval:vminspect eval:redesign eval:charvoice eval:screenquery arch:check docs:check media:check menuwalls:check anims:check anims:merge:check travessao:check eval:medianet eval:posters", "//check:fast": "O runner percorre TODOS os passos e só reprova no fim; nenhum vermelho pode esconder os portões seguintes. A ordem ainda é deliberada: docs:check vem antes de arch:check para diagnosticar documentação derivada primeiro, e eval:redesign roda antes dos checks de mídia/animação porque também verifica o contrato entre fonte e assets.", - "check:fast": "node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock", + "check:fast": "node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:gelo", + "//eval:gelo": "Contrato do Treta no Gelo: fortaleza central com quatro bastiões e rampas, materiais de pedra/neve/gelo, coberturas densas, arsenal, quatro objetivos, colisores, rota entre spawns e preview sem armas. Mutantes: sem-fortaleza|sem-rampas|sem-texturas|sem-cobertura|preview-com-arma.", + "eval:gelo": "node tools/eval/treta-gelo-check.mjs", "//check": "eval:vm ANTES de eval:invariants: as invariantes de VM LEEM o vm_mint_audit.json que o eval:vm ESCREVE. Na ordem antiga o && cortava no primeiro vermelho e o JSON nunca era regenerado — o portão media o viewmodel de ontem e inventava vermelha (26/26 armas 'fora' que viraram 3/26 depois de regenerar). Ver KNOWN-BUGS.md BUG-02.", "check": "npm run syntax && npm run audio:check && npm run eval:medianet && npm run eval:ctfhud && npm run eval:vm && npm run eval:invariants && npm run eval:kick && npm run eval:bots", "//eval:tags": "Tag, main e versao contam a MESMA historia. Nasceu de defeito real: push nao atomico de dois refspecs deixou a v2.0.0-alpha.93 apontando pra commit que nunca chegou na main, e a sequencia pulou .92 -> .94. O versao-bumpada compara arquivo x arquivo e o eval:release valida gatilho; ninguem olhava o grafo do git. TM3 exige rede e gh: rode com --rede fora do portao rapido. Mutacoes: --mutante=tag-orfa|versao-atrasada|release-faltando|tag-fora-do-padrao", diff --git a/public/img/map-previews/treta_no_gelo.jpg b/public/img/map-previews/treta_no_gelo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c9dc9fc0ac249cee0861f97cae7077c9a684ed7b GIT binary patch literal 31976 zcmeEuWk4K3v)~d45CQ~ucX!tWcX#*2U4mP1cemg!iv$VovbaMC?(Uk~`~%wtN39{aFQw0$~1=-oJ-|{hL0(!@zryoEF zfC9XOhJqx(eW{<8u=gofOT0*wLzJ+nL;BL45M z{QuJbdkUbFEN8dbtz|ME65NY3^Ue{pC^@fx8FPbUgcMb%Ij0Hst|qWd2v43R`_n7LHm(L+2-sEy~;?wLsG(&n_PCdohVRYN%Sy^>FKbd1_V39oJLKQdKIdnyo zonpm!cEiMmc2!jqA8xdA^pLWianZn>S@lc z|6nXRXf>&uNlo3rQLYjFL;Y;o4p zm46}^sCEJUrQD~(XF0C;nl;La$v7KFnrZ#1U29!soI8B^<98k~HrKqFh}H8gH-0tr#kB>-Qi~wZ_?e}UZ%54qG*W}8 zhE?ZhvIB=x`ct47{Bk**szGHEFx{v_e$2d%rY}F+P{!2OeinqdEim(dnEboZCzsJ3$MwKqTX2@62prfhKO<@ z^&v?Em8iX>5d*fNP7G~6oES*w6nZ?JR6aewuC_4_&c-Y4hj%FQt>ONY`D!xc$0=Loc5(x3h*4pasKk z)30Zmg9l>er?;T4k8y=hR<$X<)U%3l_TQSAcW35W>TCQ(r(8SUavda@g^Qy>pWoxM zpyL7n>;ce_902u&Wf<}?__=!w7huZ6hTsEi9lXBiLV9W=%46O>c+0vF>SFQ|YWw9N zICaGOlinTe@bHeU1NW9UYd-Vq;Af~{ zD#U#pw(eopc!1F`02(k1FeS%@3d}ZRVe1C7!6MeNy%YGz*J&dX`{FIHS=-Y*haV%5 zWhZ9Oan<5{4+7>4G(bbllxG+g7iSm|F_b;}n;C!wF@QZNebf{U2Mo{Q}VRdlh zxi`u?f6ch|9J$M1vubut#Y}^`yloGMw);N%u?sFW_JgZ$fXsj@Lz0hd9_B{fKpv&x3vfzNVnFn`S|W-xutYG>6N(k9V@C$(;c?pcVQ zKaIaMb$#b9aB9HaMJ#>kPdWP3#moje>5LQl1L&HcjG8V6{Yn$c&dFJ@<)R0A(25_4 zAF;L2ivM!>IX?HYZr{1zH8iyI6!R0U8w zrRdaFkQ~E3`^&21&7{)iNe-hT_eJN6;KsO9T=_MA`?`v-+9Pn0$Mu906m>MWKe@6t zAJQt-sv)cXyM^QX$&~JK_{%P$V5jY*sN>?suB+{q)vY&PoPbqcDO00>r?W>wMoh>p`_B^ z`Jhm)+Z=z{oHu<^KI0hsSH;~8Y5CN~+2y9)y>r*f8vPKmljGk@O3W%uYPuj9A&1hOQpK7A)-a62IADtjtbBn&_Zb5eU(&C*tFuK-VA@l_zr?S_$ zdkhI{wj`<4gzpU%Cttn#^B*^Hx=h8o<*!dTA0LfyODdgmthPPi znATrVr&luweJc_>mN^UDfOA3#-FHIFa#N1y_1pdo4{-@kpO#e~&wswc?Ve63tTCx3 z&TH$clby_4@2T5EtorVT-NU)up@RiJxOq)O1Ye1H_m)@UZe5L_vqiW$ebbefb5Wfa z$fKj2v7leeP{=k?I(XvLk|!BmUnND?kY)Y!J37Bc{%N&sQWPiFwV^d}f;W1Ur&((t zEb-O=IJ35^-r9Jo>Qrq*uV8mH_C##)Dd#j3CvN}ZrR(%<_O>hFb^lg4x`k6HY`jg4 z+=j1xd5(SI@cOuS+%^bJve8fLiQ}oo^_|>#lMq!)9Aot*Kg^%DA$TgX||I zY}%_e$|r6G1fRL<%hIgdtho#K+rJf;wwd5HWyy(oAk5qt0bOkM>aYrE*Qr*E9rlk$KfSXP5? zp{K4bnAy2=zcs<9hxqPS=UkWNX8O5^C#Ty=?Vi)f+!h*klZt5PqLNg{174L7HvxX# za@S|SaxNtY?|SVv=VRfe@r3&=zH^y&H!-~cR0 z6&$)3Pz?*>5SwNIp>nV@K=2y>n)kut5o!9 zku-hJr62SmR>GJOSWM5FV^d3&;``n>Lzd32XzR{rqkO?S`7%ca3cL}0(z_;W2siZ@ z1DswaumBNMs`|m$*HBL7336@IGGHxubZ%ds*E+6Exy()V=rBqbq-4T_ICpZ56SYIl zQ&m#Tl~eujS0C&qlV?A^3fRuARCBpC^UhBrgZ|p39b2=~p?2 zsaGbhO()4}df`pVxM}9tN$P;?_3RUxVw6E*M!DV#7fiO&Xc&aogt>t#dqYH{sHZnYEH;e+KU&TZP%K3?V_a-Zb^bl%20Qj0-yxpoBc znN3Y#{s2$vtE^{T@*N9_Ol+3#;o%a{Qz`R9E z&o~<$rP*KMV_2EqYrhiIK*M}Dwx9Ry&SGqsB~qJR-S{4s#+xk0vn$%sKsp}1dPjEG z;b+e6sY-1sN6NDiqrciHZJce6Iqkh-k{4>+={eonv>T+R8S9cG?I!l_vnx;Tg$j9w z@`@5D5_&M$WLY6XQ8w>`p4Y4$vzU7-fe_DcXW1%PCk34}%#vF549iI)3(Im=7nf^ZT2D2}~mZTZLf4gPzO&6R$a-GgS=!0F=}vx?gln>toJ~4c8#U8khq=#gUugaF0FH(K`v0G%wb`DnZFi4lIwZ z(y0P}qCeoOH#2oL@8hLQOS#psvOhLNU7233A>Q!Qf0CTsU=T1!&D{cHg;iD7GLs8! zkhc(W==M)D-kE66!&hbUqxE@3v9=z4S7b>BWm9sR6^L25 zJ&EOOfwFv8se3;qZhX=T<;$(HU9#+vx!t+6Yt?AoV{* zfOqepprPNrfA=051`=oa7j*%=M@2)&AcbXxL%}5bLc)fHP0k`h!LH2lS;<&b#i7T}RC~;3lum_^Py&hkh*c)*eV)Y~ss&1{@-8<~<0z#IBn5^nrn_p8FJKP+~h@n6NU>9)buJc){n?7HDV6?|EIwN#= zBG%T$G*6>AOtUmhw~XZ}C>`flQ4#A;RdL_F+s-WPVBvl{KGq~3iCHPgtcpN6D?#G+ zJE@*fqodHqwhd)ugrJqHUH8+Z(skW!O?i8H(gI!vozqXCXQg~!w3}iYb0z~x-ai}Drlt4J*>W%TYLq- zdlW1;vXpR6vVFelfQ2!i*crAJXpqb32xbtut_b4Yjri4}NJZXG*X%$t{M$TN+u4eU zVhs!DJLz}@Hd`kVK^h(vFeW$`fPT1b&T&IS-3)C6GII!eIg%#V%=o~2Ti#a=H^&}w zAt=kT1plgROY`1W(}!^6*8H*s^_cK8bi&i5`d0fN0G_o^ip#^yLH}(|?da2jf?RdU zQ;TehmTuG>QJ!Ow=n)c5V6UK|Y|@h9On8rr3=hL05N5^r?o%nTm7sBD{FkJ8J`hG< z?a{i5%h6M1s>)&$uLlyrN}e2@D<|)dD?I&jVK;q3iOr%?3tnv!FOSa*>mi|6eG2w^ z+KmI^)UYYAeNH9wdz$!)6&)AfW#4cGm3yppkt$f~aCQ3kL#?$8^ z7f-|(U|UFj)xMo~R3iJ#z65}Ml^hZ71~!v!_8%e z`cSbiG44ry5{?0CJHQh?yKf0QU3F*NBqqe2U-DjpDew#Wb`_{k^%QNpY7M5bV5|ME zkNCdbQ7-qV_b9$IODpLBo#A3DqeNiz6Aq`^L&5KNYKf(j*qhoO0emzXfN1Dr{h!|oCMV~>5tgB+qsXR4Cz6-s$h;#J2hiw6<*kqU;gd<<+l8CIe*^{6nLdgj?`M6+G4P;#pawL4slMTv+;#Yl>`(9e zDba`KhM{txE2T3G(pGQ{xxvRF#4psIKQH801n*1bjnF4Zm1yFka%zX5{sK6|4mF$g z+aTJfM|Ji}wN#^lE5*@Ux@3KXKw?D#CSECvJg>8Jzxaj$Kw#qxCB6i!K zT>SLt@G)dcRjQSE+aWZYN)jL*G`AK7r1~`zl+jkS@7L<4G-g{;`@y{@#lih?@{R*2zZdyfDh zUf=iwfacVh{R3#_3Y5R66$<9?)6~#5ZLyW6M!_(pM{zOIvqxy$`GDBXtOyn>2Wz4= z;F5}xrkQP$u1i^FcUU{QBd?;oDmg3hG*4`*)xS=FCI~3y609q5VergHP7ZJO>KDK@ zZlLNM+hfE~+|t*&*;rvFF5(BIKY&w)=~5>It+_Ws%N7sLCgM=9UGZNZIUJ@l3L8TW zR9u|!WwD;iHb~%2cZqM?+Rcvf2iF33D%5!^h$>~#c-POAk*mz+D=r-iH4OkXz6zU^ zt{c+pbA-AawUUb!7|XHZksRX3`-XhW3!`(@+Dnm7dMGD`e*mBV0BnZtS{@x<`~Cpz z1ikK*iWWPGp6vI@u?jC*lmo|;-H@=gX6DOiT{b2ahXyldIMU5GDJ zjx+q_E9eUPnP|D?0OFgN`ltQ@Fbl8p?mtueXMO)cdMhm9<*&9g>9J{+(jQaWcgRR2 z7}Zx`ISn<4BvfU1Qtb@`z{(z4Q-%AKz04)o1^gB4`Hp1X?n@nu z4d>1!nN(uTEZ3vwE0K^NyZ@ZOL?7G{gxLcA%ge1u;*_UHs>^F8J^H?3a^5buW4!wU z``K4o1zGnKGU984S_LGxur57xpIij2xoOFG)>R~<&*E*k(2XhZinW_zSV&M5K1~UE zTlD+1ObQFXz9l{NJf5&SoIUj9x=bFf0fVnSwB|ETkKPXT*K?xyWx8TLC;z?UI@KAh zJxL)|f-kV*jWn);i*o5i_U7wSp)_tw zV-D_$$!8b;6ML3yI9LK4VaaT`-R%z(Z<78A5DXkn36_4pP5hKV$S(sqd&{>UwG9vw zwaZ&OXz1NyfkYYw_4e3v-Pp^suOXE3oC8D9*$&^u7kIMdPxm9$NTE^lBp@mRV)fs) zB+~g+=O}&j;;x|12n*X6pT6-I(3+v|DjlW3!CD4vbJoqzE70TjHW`TIwQpVqTD%|f}-Ajj9`4CB5Q1VdF zX4V0><4yfX$u9O+c%`qZx5(Af+uJ2i&4qqPUN6NcKYeA23+{|42>bDh%X~K%=tt@j zC}IXLgFX%aeuN71eFOUE_U&%({@&aF(9^QLe|~&0}^QPgLp;o&&t2e|8UXwQ zsB`+=W4_;gA>m3lCOMx*r%*Rm{1h8p|FzNvR2D6(t6Xa1MEu6IzA|URwsgx~yOUyo z#AQXKV1N1sO+RCUHZb<&rfd>Ci|YQQ=6wzR%2V6Iu$#5dumQnfgL?wPD9B|aWii7^ zfr1^mcFK_QJu3l~BDqk^XnM4jD+#eZeW%dAKB=6qJo58pyfRO{6Pr)PQCrSOR1Qo* zL&SE<31PjQIYH~E6J!i6zQL4W{b}uGxCM@?r@@pwy&0F|Oa)&T>B$-^9?l7Bq1K}P zMUL#Jw^-yQ-!Fv#>8N?3yo|`9+jVl-)}lOz+JooQJpCE=e>X|>9U+mRu|I@KPHqtr z3x_w_3VomMrWiW@q%cMrBOLDP^F}&-{SYMq0ptHqHB7Sah>!qyi5!>L&nLuP&S7@1 zsO{ypd&qoA71z1cHkjLuTI1EHIFnB$XrtR+B|Ewb`|R#7@VT@&jh^9^D^-nk{2k}l z?OC-Rks>n|-nM;)-Rw@iP!|Z-xc|es-Rw{Wn0SSBvslRl_>d%13{9i-O@>$T>H9KQPQXqDCrT}4Yu&J|X# zbD$PMVk~`(Jdy)RoCDL<+?ebey|WvkQaP6y?&~orY9DBE2VS~^v*-+6g=rf8(eJxL zy6`142xo_7US1-XrJ7>k=17*M>98O5-wBQmG8U#;OQ+`0G=2pe;};t$PE~5L0}aK; zur0;k=D2C4{4Ry!;d1xIMrsaNYPlod0_nm;9mK)sl6@ZHM6A^Z-%#V#Z*I5{w+Lm$ zznyUstBC{@^HPIMJQ7V5IiTZsQ4rKjf=C4_bb17G#)z_&owQ9N)GpQa{_4Fa__ML^ zb*e+I%OEjs=YNSh+k=|85a* zo|QLIcFG%<4;R=qdJ-=Q#je5XYRc-{x=lp8GV|kEnAl;I4gL}@RwcVq#oGnYFdtg1 zA*R(rGb3`&9TM1#Og=s3tNaBrPI7wcEAv8>N%(b#J@=h1Z{X=a8G-1P&xW9+f^fBg z+i^09%oI71)k321eWW;F%v~-$g^5FJ3 zZ46l%s#`4@AJGV&R{?%2QH6^*dd(>3xsS-6-6@H#Q2_}jKaz>=>+e+osI96QX^Mh- z+`HYStwhFLKm;DmWmb*cNqwtKgVZH7^J=i^Hj^my#D{pNC1Bi8bQ8xk$w48OIO7-` zdW1oJ+ZEE##D}eqR+&zXIjU`+v1k%0Ma<%Zg|MMrKbPxcqKk&8K>U($?PYb>CmUs6 zt_S#y5xdZL(wD!zuc4P(gP6 za5M)2iuup5l>lJ4@8xg<(sUnF6?ynlBJ+J8eaT^oYOR$WLvv$>DdqPZYBl@#Putu) zdXJ+L37LLt=wUwB*$(%*`|Ejr+H@rGW1lrGp{gPAA|h|XO3I5F+&f#kAx`99JhQD) z_L+{)u};*~(&KWZwS+0*ADVrZ8$7ME>LsZrI&CF9$CTIn2-}MCk#&V^A!}4ZrT17- zwl{!0rU^YCOO#aEBbHYrHj&863B#x>Inz-l=ut*vM^qToPQS6Yd^eU}IJuH8R!x2= zKCD-BgPv(fS5J=b>H5$X=RzvP{*MX}W9qY;{f{D-?;2-T;!5$0%6AJA?8JrG#Ceuh zL%Y59F$;49bc-p%zfrch2Y$vU5_vl^}ea^J?MOO1-vr$b#S(-4P$hLp-Hcf z6W^8-xG`j9U~dNH6lZhVB4PrG7F>rKJIrcJq+yIP$wJ>RX-XF-j)!FOm;%(w zjAQspvlnm^?b1pKR14|o%##{z*{7#)T)z*-C;()s9y_%QG^PY)bqK=)S)^jnF?}J5 z@mD+k5$T_nIO+%u8o_8_NQF*{r&yT70hQi90|Quhg50C}ufz$CxFs{m2m0$rb`9D> z8LBKp7TZiQ{Qr`hq)@Y8Ucl;Mun=jBm)UZrCxQKM8iSGAV1HG%K0`)GiEwYAHidOp+Bb$} z#M}O*&-JbAC&yD%L#0}6J?_$=0s@MkH{P;+5$a+>nwY}j4q7H=s5@t!asbd=Esk35 z`;aruJnqsQ`Iu7Kr`W+7cTN}WAiN9MIO%G{CiNXWU-q*VH!>Ehc~~T&jC(wTT;$Eh zm4L5LzP2YepKvVag`mFNrklE@Gd3s`6!N{k1$Ug zL^gnpd*0monFy!*qTBfO0sVS+TPt2*b_C1>33bX}rzUn9S|`+f@O3+pkpt*^xW z?uuYR|5PFhIghVL8})e!)EVVl_sg(XKRAvSTVr;I(&W5wvWyA;I9N&i{wb2!Mp-*e z86757I+?)(leCnsLgI=Jy8-bOLph!-xXRjHwW14FP!9=s`u19+*^BM?$J#ycA=UXnUFr8)|bM1YDO z4HzN0w=&m&am(c8Ez9_cgbJ$dKmR*i`~e7uY9Q*IhPyx}1bdII-O~KVK{U1uF+IgGW~<&Bz>>O)}J8NaWNK;E_eqvo%{jl zXBl=o>@8lMm0Bl<$KV?zaySj1InE(Fbv@>OTp+j1jLotLH_9^X+1S(#TM{oL#--B_ z(T-u1IUUJmC6FH$04+0eD2cU`eN);v1_GPz!)06dN+g$VJR50DBgy^%km+vDtkJk0 zAvAh<#kXm?rAlA!bnceEAT6-AYYvl&wl$CJK#BX0iSf@aYZzd#R;{Ux=Xo%*|%D2o4cO--qd+Ak@JSh^}cN z&J+>y35qK}%K9C?5!~aD!7WKP6Z6);*lsY28mrjeTrQh~Jx3gG?k=w{v!d4>2^N9{ z48q-0fvTg7qhtliS zcrRymWm3mCG!z!lzl_{ch2LR1TBR&~<g#6&YGmo8P)m8g5Hi8KU*4KCE$zQcAdz3z7qB^Jo4Jj@*xyei64=T?3VthVYGE zBD`)=)8t}ekLQ22r|{nxGf!z_(~@v!*-?t}ER9W>jFHGAFTIq3dO4Bvs4ZbM@eTCe*m$~+osi`CQH$xvR`c^qRk;Kl}1@_UWHWcNani` z*C$6*0*-KfE5V+fr4ekJjL>~|(O*|fdm5l5a|8_o)JBMT$zeh@R47FG=Q&LI5kjKg z>dpWqzy|j#{y)iq5b8xFdZ;R`n}ay1F8ME(#v`V(98RSHc;$brO0b^Ss%O>*AAY zsB%w~+*ji|N(k z4gs0O>;gwA7WBgNs-p805qqr?4n`ne73=#Y*V#Uz%*wQcLDh&8>v=M0a{$s`R=@sJ zf-6W@&a+-xCLy6oMdfnx$8Yv9G?d4MWMlW_sdf@S;+?~&cUEFt@MNUn_qfATBYBOR zaOqUE;FhA3h62s1pV6d>VTLRMGP$K@K9*JFOS)VS{(2a3e70uSEB>UUl(;)ARzx{5 zIDt9Nd6Lx1dGbbGZr^XgU0A9pg&AE8io(oy?D3$CU7@8)IbJv!L5HW_7?J@qXmGDx zWZ~hiF1wmbKW!J9@?o(T3c=f&k1g7)NuiRaS0qg*@q5-SuIWiFB^;@*dA2qS?i>14Rfllw)+C=HK?1iXig;lXyFA~=S}1b@*BulMRJ zXp}^m&{!M=;OUHxQ;661U#5={eb@qTA)b*;IBVq=eEhx?LmRNZhGX~Hcc5aMzv97e z9(R2nd{*<3)1|F~&AUlX1*&i~!rH>gq6A+Z)+6O_VCh!wDMZ8tQdno;rj0Z9D;qZjZWR>Q`K2TpXISI>WesXQc7LLPp7xx+E(jP?nQBMNxVY^D7k2 zva%HX%e>iS*d;C}K3dMdPQQ8oZ{zlIKkz;-W?ry`dSkInC__i2Fke6#N}DuQFyeW; ziS-XaX8H`@)sqS%+ISuMGL>hY^1Ze-LZUPSza*dUN`(R)A5Mx{E!L|viSYc~yPvpV zl_1#44^&lfSO~{w#??_shF6@M_wPF3h^l=--_uE>AR!JN71Vr*P!Rfz{)HsUJ?*FM zQX(93YAl-B(FZV%OSC7mVkwnn8Qw|%rQQePox!Y!t=2wx9O2tKIPf;k`N`^7m9a72 znFEQ|HuI)*Lbv)atBvk9DHm8WL)H>w7!xuds`tkn^FBkAruZ?Fp9G#YsF``ii_k5xC}Vuo`U8+}ne7--Bq?7(^s5AV`aBIUclg;&tig9qv+% z<$<#A0_(v7WcvMJC3fcprKsGD8K1-v{WZwU?v9jA^;M@^J>Q-i`({0_?5UaQpDoVX z8+upY9rumx`8?|_z0VAbN^=YH+RmFI_96*!aF|LM-Cp@+&lgRwb+FA#_<@_< z-Re}USS!?=>UGqyyE%_f>rTk2eNHNCyR39M!$~6x*(~F~FzWA|(ruROzSnuMp66Yj zCmPcz-I*_KiCt-SZvv?Vb+}O)=l7xao@`Ycj+D#&E>|PKta$Ub{yJ~t$IsIx*vPvw zkok>OQUyZ2-q;2Z?~a!=0(Offss3<`R?VuJ3ob=^Vrkir1UIwjnkHK-*8xjE!UK7k z!Xs6SzmChk{&h8#8}UbUh|7Bov2$;_FD;J^VUl_a9PXtSeN+imojGg+l#v&Gc-j?` zicbj-=IEjfPI@6z-NE^FQXfBm_Oz2ldN4&y7|oc-UpD*N=dVnjTu(EzXgpC+l6KTf zPNuv1c(l@eoshJWSY;tuSvKbMaRB_wr9JQzbw4F~jH;2tA>b{1At~7f(EfQ51BU1Zq8&BH>$uk4p54A=VpISu%dR_Xf*uHmhnAOtGc(Llx3BCLV0GuDiEsKH6djy1z$GPNsAqo-~e74*Ke5{ z2YwOPP8mQ<$8F}DP_B5!rAR{#ry{87ozJKcZCFA>`- z_DY1(YPJ$544w!Z`bwE()+VCZ*==n7b-vPY#tY5T%Y^);lxI5RkQth5y?}6y*Ypu`rIflbc-+L7K!~3mSl*}QnSaoxHZdk1y((mgDK?+&b z2-WID*sL999Wtir1hdvXY%*pTv~l*Mb>M|gPP)^x#!BYEWp&&YHSkP{yBlO4&r^XV zj|XpF5<^n1db#}BH%8|8_g&rZNffqN_4aAXq8bT(f5|YSg07H4zCdbL0rZN zHT7kZCCV}>uTY2Oj4~@t(Hq?TD*Hy=hi)H?adAZothBfisZ z7Sj)ddt@kG+ywH=Ehx?GZ?kLz9bU0@+zWow6z)l8ba zo|sZ&%iWWF$Fo|!MY94y-eCi=d1T<6c%{F<qM4QPq2Rf|x(uV9%u`@HEe6-flgr z#A+U-f*Ik_`fcsSrAlL7Lqg5`)5ZU9I1&x>%1H1{nBt0=}7hZJcsx0-I`Zk zx?jPjFcFWt*xLq1)^?e^;zj8V03Y0;oesP635?BL!MZUVaHD^08MsQ!b1_|-0?N9> z3Pu!hIvRZ-XOw`w0KA2C2liF`=q&jbZ8eUfD^QzV3P?2Dtv#YTEw26q`LSF!23ih% zvJ33RqS#86JwHOGHL{*&8bmED2vKi{Blo7e!@~Z^G+hRbIP~IKf8TQ@%@YK;as*bq zGBgw|R#@|SYowUP$;_9|nyoT~8*sGh?DXPzr%x59_Y5Q?^gAOQYiLu&eAj;0CP_;D zEm>VYt74tzZk10ND8s-i=G%|L+#*Ao!z1AswaRCd1JYF{RFX)>ESJy?dPB&0n~7A6 zhb4^bf&qUBfZB1P?pXjY{C)@cjxz}OArl8}oUJJ|z6{?h{2MwKR=n5FXy;o@0%d?K zqZ>?ZYl&GCLmy}5SjntR-3!l6{d^N~na-;`qQkjKVHp*5rrERZey2nTxF_F@Sny30 ztQp`iDt*HBqUj4+Q1FO|!-Dietns8yj;3GkRaeXZU8(sZ7Rf!@{bs?-t;hPJPD6S= z;dfh!rwu>cx3st?4JA}eewGQ2s3yqLMh(F@cgZMudz@Uk*&4mhnkB6L07MU#KFgeu z$fdhhk@ckqX_e}Vdic5Gz9_=JZ9Z<0N~?P$J;L7HMN!ObBP>iyAP^dtntULJWI4q= zUepW#Cj)k^GKw5j^gHoLZ3{PBa+pbTAp9^{AJl!%qTtL(#$&-wwNAMTO=FCZlhHC- zH&is8>5WmLdrQ;=gL;UkZ-=i~EAvmcU(tFnwtsaC%2A^jGF)M40yB zxM`g^XfC$7`8V5!%u8|{?%5{KA1M?bJCwFZC(qcrzL`e*Z3pkLm`F?nk|{D+yfE!N zN9*DCv(WvjzsXeDx34Ldu8_u^px3M~8L7*}sp)5$S*G0jjp;kx!U@?7JXq<#g#$-y zU(iFM+R9M94?DCTWVda4b^Ga+%_8j&KpYG3g$E~^+Gq70mFEQ5-Z5=x`L^JS_}MPv z0*XgD)YcI?AmMZbq$*%F?lODWh$aMkAKy-C=922hT`VV#4bf70LKn?5YJ3`i!)t+d z*Rc4z=dh~I)kRye2wf*Oj<~y!NYr+Lleg8EP&gy5#~3gLGDL=pi8#iWI}veM9Zj|+ z5(~+nx@KSl6TjL|TgPQ;R0^dzvW?g2e{|1!p99+~K{7yhco~7Ge(KU_%PBR+!r?f) zEtNU|u2oa>@2S|xU3{AS;WKd5jE$0bh7=C8CFyv(8E-!-rI(?UA^G+afk!)Qj2ITX! zo(Rn1VwHvZa&ZG<#e-1j8cg;r#eqZGK+85#)V-g~MXh6BP{C$@Di# z!)TBt;{G%~q@J-z2pNr2Q7MHiJDl0`t?I)(z`EtC$C+2oYO4y3j+rQfNUm!dIx|;g+U`_{i2+Z zNM`I5_#OqFgiWP@MI!mL)8ABhlBq)pP9*4#iytw=(cT2Pje~?kO#S6XD_xt|4?p^n;>~)fz9LY&?_Oo-clQ`>Uy2CPb?N!3n zq+bkY%SuR=#g}M3z3IewZI<9v>rDgHwq!j^OkR2MmF7E*B5633mUo#JN}4L*v`V9B zB+n{f+tgvB*6Xh*W@mF5>ul8z3?G;*-W4KMJ{{jdEIb{xDr0(KoPLoQb*7#zi?vIp zW3N!e30s6IZd07c2K`tp?0En`$0=1KrZ$?o>+6Gd{{dtV_Z4@Lq%WT9fHD67+Uq5N z{-0R=#Ik?eqQ@?FASpWd-qetF0?=-q?uN~n+kbsZk#?#Cbo5YGJrlz%=HajsM-AWlsRQ$v+MK3uOw7(9FSgSCc=VQ$Au<$05(~Jku-X@_&UikP^I!hnEp)(;0J*i0 zJT1g4K0HRyDQTpAN-TQoERbBdU0F^IZjLtvowdMfb|ZDa zR_4A8%{eAjiq(2ENteVz7sWzIBx?{<&rduv(e54DV}wi^8s2i{DRf9ZL8o4ASkR+$ z6M>J0IFggXaj~tRefC8Rh%DMiSJXRJY4;3{V$|C@*@z!@AbCK%KS9s9VujW)b)Jc; zdBD1nyGBvG5tVNma83rrnwrT<<0~->J3m@;C4M(O;9#mO3K+3Dg9X*4&FHrBDbIQq zlG3u4(oU zO>M#x8y2gXsqb$Q4}o$47>=9Rdj&4|edZ}3B3T`cy4VoSHd?im*xobQF5^D{ipmWu zhha#Z8zO!yfh}c;jxI|SIoc$#Vdz}Xudgw3q6{z3^i^^J^U~7%bg|_ik)czN74-IY zgw2}79XHsh7XlA?hx)#kHNSRXGs5WTzd&c;U9)VQu^2KZuQP#Wy<`E3u9(mJSBWOI zAKc~vMZX`D-&;&UNrm;D0(LB$mVA)$xMJp_V(+b(O_-g{9E4>H;F*`_OYjfV8AJ`DYxxp44U-*CH|9xV`?VwNzVZY`#~euiX+3TLh1Xw)<&5nAEY%v+;7&ikvTR}ahthQ48$Gr|b8b(RH7 zR8+TP7UNkezFirAzk-$}D(&)RCe}mXc%(%ZPrRwSEb8amckuz7G;fa~=Cc^@_Ky@G zF0jW?dMAIv{)mkYh39VBJY2$Gzf+_~lrLmQ+oD%5uT}O?wv4Bu)8TJiFsVH2B9~y* z_@al1JrRj}&n14HCWze@uv`|ID@Bl}+(~Vv(6cAs8{Wr^mAa`G7fsL62zRm~%4cmk zK@cdY9bMTO`w=q*3~m-0YV}J{9$lb4zAf3a30Bg@3Hu=b>zK4(H%4$`Zjk%B4pZBf ztTPDfAmyPX@9UBMp36O*AJgN&r^xBVuNw`&q#hC^h*6fvT5^8?bCcr>7PnRZC%=02 z{FhXZvsAzRUKlEcL@UAYQ{*2&ZAm_jsqsby?#%+jp}`-(ik~$VF4m%qC|q0wZ*Ofdj=dY}v?WGI%Y&T9kWm=1ZIU3!yCWROcq;EGep>$)tls6s z{T)o%k$Qn==Cx9cPttjvC86>5%LDV5_C6=x8rp?+7m~Og>RC^N#ztYXEuR==V5o=D z{*y2#!cF?4TzE6CGHttI(@=0ZK)jLvf@I*%vE#;Tq|QNksyA0`Rk;lx7`<>W{(k+i zxY7VF7E<%&URCdS2~+orcJHA9KS8l2#;Cpy4{cmO&lIk}BogPfv3B3=D zaTZSF>SV-(tdt5OIvH1z?p>=r=)ONQ2-j#H^4zhS`iM(ejJ z^66v0NN5E7j99l3oN)X~xj8v8U;j>8Yr@nQ5j~OJQ6%X6REDN?y$yhK7f9iJE|i{p zLHa6+lK+*W_rgCEfK?lt-PkMKZmL z6gA|$E&agB`H3CPl4k4O-jRY}OWm?cZ0@4@a4D@uh_+@btP*!p4Nv>MeKbcGR!B$5 ztHcR(+P#Io%mCY-Nqh~Q-}S1$x>n&{FpL_i;kyy>a7BT1MsO*-6%R770~zl14}Kz* z$ar=Q1B=U0Bls2b{s7K(j%fFpZxOY|8>>2mhHP<0>QDGLoYlJ^kUr*)5-3t2#xVK) z=RSK74p~Ohvsag71dazH&mrm;q`gExJ^ujEr6!mfTNNjX}+Q95s74Zun8^HqYo_s2uY^+=jPRRaHOnkOlE z0>yf+2SZ-i3xgGrF0S|2&{yZ;P9$%O2d5nvk(1xhx3}jc;P^4kqgSWdMuD#XV^G)AFg(NiipbZHAUKB zRbvk@eB_6nXTuya&!g=bw!BmI3?ZEwgXMW_+hQ?l&-{?F{>}HjN5l)n^^#|oVTYEv zGATq4J4|FyLQT&#UvzYlTm0>k8dSwF6E2)y)6%onHC({a;x;6Pz` zDs-$)NTA5?jR1dYXLA=?13|0NF(T)!mNlfTI(wo3%6+!HdEO5#hW1c%z1z9wb@Yo`?uU1boKum6?qfeBwXef4P4>8+dpn2b3pK(U7bK-dD|G zI_Qe-O&;n_t}|ab8PL;Yfl}IkV`C8#^5raTWgdts0FbEOSix;0qn%Xd?My z1|T_3rM=zNCj+#SW!7P^EN25LEGh{TNmSm&jVwVg#nd-y9`U10kq z(TI=XrGwha07Tp?pDBnn4?(X(^XrG;NgiGyjCbL&Z{)P?Ch~^8Tc^5%C(N{0jnX(m zp1ywxWpA%13$!F|UT{58il&Z(>ETkWU( z+t@Vc{LepD=;6R-jDvyX5c(;jy@?R5Yy9*W<6p<8gCbg`=iCz9*t;2zQ|1!FNnK5PET?rP&-Ymlw; zcO=tZB&sB6RSrI#vHoEF@lfKadd;#me;I$-(6GC@ySl@_&gxu{t|NY+gpEIJh&HL+ zb!d{pPrcGl9coa^km3Jwhb8^hJ*Y(%yA6?E-P2>rHJ26e#x{dRJJ>Ea`8MeU+G;Gj z15~0<>VV#pp0N>G;gcwH*~kjr5S2r@9dr*z}WL7Nantfd>L zpTUP5+Wid2?+t`+3Mc$jvwlUN&-f|7i`i$9V6UH01*}T&Y7F$q|0=W69O0E<=45_Z z9mj7y6qESr!;_9Th4^K2(ukdX#A+U*SQ6cu#-hznG0(asCZ^q)T}jBopEMUPxC-Um z;ke2?4PQcc`p0+{^N8#qWRdS;Q#hf-z3bI7%9uNZ@#M>XBvY`LajBy>iRD$a$iq4X z>9LCojYsKyLi12R&!@!RK3ScX&j+lL@|c3pg3eh8M5EuEX-tPpf9toQ?-hz!Up=UR z*}V7&72Lmbac_iT#O{|{hDspYHfFiTJ#z6Z&tJkrjuBfcZk_+Geu{0tuv zszsmf<#4sM(+OimMoHJ8ckbwmVY!C+<0z`ztf@YF{6(@La_H zUJG*j+O-~N8{{D+N?+7&z;C8|kC)z->s$&f7wVSCd`>)#;ic+~G?6B}jO}*(M^Jhh zBBIAGxnV5)W<^eVS@%KrqmV`0Y}!HE!TYuX*leTs`@-vM4XNGk$Sf=uI)| zZv5l)Kk%M+O?LDE%70s@8u#;7HdzW15$|ca&r$R{&nEL4LFR z2ZP;Dg0z&0&f^aN;R{KU%jd=Ude4&Ey!=6e7zyVJGA)xk-&SQx;~oc`7Gw5df2HUs z&q?Jlwn*dFJuhL9;`ZnK@;g+optLiA*~ZUYFT4-(yOy5N3CAXIEBCF+Wy1z2Vgv`{JRlR;Jk%y zrKxpOwGo0{U#nTLMB4D4x>e5wytI_*Or4zp6|h}h!8BrgK zo$iFqk#Sn|Vg3F)Db1wwaa5n`J5fC*yl@g5h-!(DBrB)Zb#-a5oeYleC07Ws1)jZ& zXHTF8(QTLfC6i7hDQ>u$COBFi+>4t~Xj*Y?|5!yWm>tVP@Y{!Ioe%U=N+iltCpbT* zO#J$zkaZ27wN3-ZFB1F=pXQ{N+c7M}0Zkxb>g@p&3%8J}*GB>V^{c`@VM^7H4F@d9 zg|M!5AbZKi7M@rP<%Rtw19xuKC!239Y9|Wmjnxf0@aHy z!4%HS{lkOrI3Y%%x_3w(@OLh}NU{(Zm9|laJkCbODOHKhd4sDK&*6Q zR&b-K#67w{ZpwPawzvyzvqjFmq3ekVxsZ2fRARCT2fMl4(m?R}1p7RfH?hH7KO*yk z#<19U`JU1|y7l`dAuu^P*TzI12Y22Hu&8ONdXrqIQS%3pC-Ct!%x;U`gDms`|Qm$#$v+v6Mhcx!XhXAWc$bcSZFz?knhKaa5wOy)? zu?cJNZ%)0J@m2xx0R=H+d2G=ThBoy#d*H7s>38a*Doh~QvP*rPWl-d&$=osfajWS) z{y7nX;wPQhyylT{hUW{A^56$2klwyPf^Ao=#R}|9tN8E-2~&w>9R7A7XAZ> zgqCS1KCuydz~%@F1I_-f2O0dX=hE8~B!qB0LO^W+!{6WfN_&m}WJeU~NF$@#-$l;T z3pNu!WNMDGBWAgIH~dTbd|XdRyjN!EMTu!ErmMrcFoFZ@;AFWMjC&nMIHJ-QX&&VB zpMz4qGh)bqN-u$ckaLkJfr7m(v{_}xJwBoyUI1-KeM00#opdWOp6VY-svO*@NvT5r zGaN@TS3z0f=z(l4gv%MJ`>ES$x)p9hw$dL!LeiCB-5&sG@qn?O=mryi6zy=zZzx=j z=tjgpY6hCXoshh0#Ej~q)x?$F7)Ct~%tD=+?y)l?&!Ol*6U#NJce%~4X#+hKGVRl# zOBDXcP!j^r%`}UkPdfb#i6$*}972r8?Y@3t7I@wUP0$XLaMz-#_}<`n46upO5nG$t zc-Z{POJ?SZ8enwjVZG>sZNyt)1EBnTTkiahh*CWW%SfSfihlEwtX~~z-)4)uh<3uS zDtcecEPT$^!##DC0J9Zl)ybQ(;g(R;Et;~SGgB0z0Gx69Q#IYEYbHTdJ^eBu1ta-7 zJ3s76M6d-u@R_wDke)9ZO61aEr<+--=JI2e%$pc9g<~It^3-= z_gsl2$fZOkvC$>5F=m8yVDLcRo?+`33?ZjlX?3&z05%!ZRFafrg2TsNxBAQt5^UN; zgq)@we@q`Zlv!glg%szyVxDH0m(RHZE$g^A3@-((N^JaZx)+`R%x^26$eCkht_l-t zPd;sp`us|ZYhyt*qCGMcqH~3QFeGz9s>WByP-xU^-H+5*jt8s>8 z=|C0oWnf-|UA;@|J74CwFDC1xAG7QN75~aRk5oFpgk-xDshW%@o*FPWPLx$o3yv$P zKdy80ith+0Y}77n{p)p@iMIi;(KweJrEC1mq^L|7LcZn+k#Tx1P{6;|h9^(lAX1{) zssGd$bBwG#$v32e!?tPT**|!5i}A<2Vi`}})`jSWNvuAANHDG$1y9?K$!3k8i8)q@}g- zeXivkpq2i|gs`c}FAHM{LjYHDC-rIK7|AQNi5OWy@3|I87 zz}gzWHs6{K+B84c(*)bi!Ir*y*M|aX)ewt!x-9ji1-MOD(f{}W)l7b}%-Kwb0`nHw zsOci*mU|e2&U2;|j%MBpFr=Mirvdejqj=m%wtg;IKM;5f4ZMuE9_o7|GKUt6T*Bo) zzoj)|>ah+akdmX7-h?6F54sB8(?~`V?}Pazv7uQk;>u~;&xX2|@)>n#i17@Y&*xUy zn7HC!76&1!1B!6oGT4Y<5-Q|NfizlGwUCe?h*%=Kf;SGdLF@q#vZYuT){$_&uCFmh z-eZSOu=|T_-MJ!YO&G68%#ZP+hX@%U$w`|1O9!V{A#jPSf3~Ud?NyuN9st9Vsf#me z{)Lpv=}*$D@+PwZGb1J;@Ku$UQ=dlWq}yqhH_A5ZqsLE1Fr3{8yhyjnKXjk4&b4VB zqqSDacUTkC;0VnlvDMlko|45KE#3$ynDt#LpczQy#Ra=WP88Sn`pQ}}y52`JoZf|8 z=IA6GJcT@;z=xRWFc`hhS|27co#Nv_i{ z`H)A@PUCtO-YE$j46nz?3z;hEB<_3376}|UTS6(VJIpC>EBhvEnArOudx-Gn-!^{M zr$|`Nsj-2=$#;Ix4}Sa~{CGcjO4R%KAlv ziy2sRdsg;My>*=9@bP4FT^L{7b;gK_mvI$mbESv2Prb$e`SOkZk;d3HczM}_|11aB zdG=U{?;%Bq<)I+w<_~}%Ah+hb4gq_f%r*d|M-J_CjU-e8+xFJ}0lYioxCbI=UN(_H z+fM$l#Ko*P4_wvIAxL> zTwe>_mgU8;te0xT*am$6Qe8o^EV^WxpW=2{pRX*gXqrd&3*-w)ZZ@7Esq(vF4M`7j zt*k!CF3%*24*vdl@w`PXS7F9lz$Hah*A_<@GRUc~v&oZ3mJ1(eB#9JXbj`@z6Zrsb zZ=M>R{4g94*)3F|M>w%@6L`6`$;`6%=S>%1H{XcM(`G`7og#(Hl|@kDg` zshNUjArHk3h{dk-s!L`^@cdLLvF|3TPa%KbnD(mX0CGukBu3gmTkv#cNhX}fWo?CD zwdt2siKn*Gw|k8Rf$ZEtfF34=IIGT4LTh}9QYn(6ZS0s!=RhEqLtM*1Cs>jM1aZp`{J zLEh8{IfZB@vDVr8Fa4No=~g!hC{s#-gFMp>l7DmR7fsk0n{irEv@RKlzQOPg!F_HK z!u0dG%<1C}J_i~41g2ji0aO9+iV-KSG8YVs%>$s_4cAIcTp!GjCi5;7XZnIfl zyWB)pqB|V=2V~_(o3x7U!!}aUN}74xpS9uCrK)999C|x{$vB{|GOMpN2XBRqYwB2_ zQL^lnSa^BXHY({gigu;GVig+{cKlIHr{L(2>m~$y?fVyoF?(MNUpQKCODof}M-A-* z>E#s`9I=D;cwsMX;?zw(I4JHqjMqn7&RI~W2ME3~bqXD6IdQ=a5@ODq3t(>5f&XYq zqV*{nNxLSA#KObowB1mFMG2ySQwOqROG(hn4AWg9i(SxpC1V3FiH@dizl4#)^0SI4 z_7Q#o#f&-Xxu0aUHB-R9?&R~d3RSs?Nid76s?XlZh{@+>vqJZO#mMF;!$9X`aK03- zi7gI_Ee_0mvd{!c9TEngm|P~(HP&SG^3)~FAJWG`la`Cr@+{hJ>~hyC9#qGtC9dMz zkYk6kktGoXZdt5)!)%23@x^r&9e>nur3Z-A(|~1WA(Wtfz1(ik$0xeG=4Y8sdk3l* zdM`;rHGi}gP0dwZCvIZRQw?^wk$fnzemuoiEmbi;>(J1=d*vs#Pr6c+c0i7>AP7gVY;GhUG)kfP6f?L=G12|7K9I^AP0k!sT**3}?; z72uciSTEJ*cST}mx(NaWVXC-*jR`nk0Z8|N-=4VdP2H|U@|XMcBa<&X9E`RcM7F~8 z@6uJnw%3fc^TXbAK4F^1B0l)kdzV|VogpEFGoWACb<9rVJaW15rf=bKtG5*LIbg0_ zkdf2D?3)bXb!)iMGfRw8rq+3zNFakmxe#|@($x`YwF#OmI|nr>SrvY!ka;PwFC3x&4h*AMcN*ut&f z+1#)Rzmhpi(i1QY6RnD-N4xW>z%cVU_=krDm}n!4Ij~?<|2FT)d-;;=mUIOhOc;f# zmA0mCs45;(M^iV}J+|DX4WjFt!Zo?g^(+}?h$7TC5RUo`IJQC0Shyym^LJgNb0a#B z(Z0wf%h=)q%x`)Z^uc@OE-UIcbs?R-@z7)LP+}61hJ1}DP7WeKQ z6Zl$H(@cxh%AeSY?sRZDbs!qXvQz^$CUIJ5M^x$6|3m?;#Xkd>6*%qcGf|bn4G~lMbcV z&}vn-WzLxT;(UhoeD3I0{Y9zNKu&4Gr)2;%cvo?sXPrt1o>0W2ir-&0nGH+a7!88%TQy1X!i!`J#a_0{q;55NcZ=}N*fMC_4D6Y#uzC}V%t&A9r zR9+7@eya*10e#s^gMEa_^W$*EO|X9E%IAt^jp>uO2$v^Ij%AIp!$dcMp)*8Vo%eOWt5dWDE}cD=A!a- zv=DprjIh6&h4WLO9x}JSxYS#y#iutlzm)05YCfv3L%dI-aBfK^E?ui%>yqI#(^(u> zppMDTr5p)sQ?Jk}M8a+r3+I(E=rXWQI1LJeF)P&a4NAs?-x=qqJZyVnwA%Q2)9aph z@+CdM_nA;OWOe@r?K?+@o8bG^PV<}`ew@sns++}Dyf?O7sb;CKV(ExKSOw=>CCT?Q zzUM*5TTC^)!;5y7waQFJlx%VG-r_}<(jSW{4xc!A02|-do@`1|+#%53a4bCBQ-OHR zbLoiR2SX{a3UkRX7`7f_F@7?+Zj+dvfgeH=sPJW6Jy{_mQ4X&S3(kEK_dQe+qrxrh zqsq=oh|UD+TH2ZKd#@AVgFS=yv}$~QvTH}@8P)wRXCN5ALfJb~P8s zK1Ep36q(L5oLwLDYx_RzMvk9`%+0cBd%&=TY zv-DCd-XU927iI4$G_oo3Dt_6P>OfF3Y)7D?4m55H7SVa%7B4qt#aI9`b!A7&_`eqp ztNThEK;=D^NRO#I&0V9j#2WYBFX2M+;wnDSN~k>#pkdWzgWOA>cg11*&Nt1cy~? z%iN%%V32ZXh|PkUs>(E1iC%$v5Etx{s&n{C>k|i`E$_ed#B{hw<#QLJG`iP>-1qA` zXRK%n4Xk*k^QQ;Ny~BbIj{DhtASSglf4rS#3J`hz#bK)UccHT`VB_N*{8t^_|0eBF#P_7+j3yU?o+utg zunGNjvT(X8jvn>TDspf?ZdxXu@$rLBETW2W?f-fYX}NjReoq(-|Lf)F3YsTIasPt7 zpfsq<9I^{3XDN zDn;yr^Lg{&0&9=Qw(ulyl@)HA@v{h9?#*tRu*N1+va1Z%Q=!VE>$lWGNxXf}lau-y zK3?;Zs|s;JJi^;7NW-VTO0SKV4{Rdu=`{{T3g4ucGDd0b4+zkd7o z4AsS%-=EJT;f2I^@WvoJdm@(w>av$#4=$C;=?sq_S&E1(Ba;PPVBC)trsAPYEF*k0 z&lC!hZizYgLo>aM$I+u~V|Y7Y2e+7}W-*Ul{)=I;wlI@RVaW3gzWahd0Bzxe$8I@A zKI5sVr3A%zx=+{Qu_198m>+U1U_M+eZRf#lvz<9=(dv^9#HBc#_MX`>yb?O)e);E( zSz(_ntF-Xymp2-ePs=Lein_J(CwO3nKMAifWb5bFmSng@DWq9Xa|&vI zQ)-Zobd`XU%1UckCn)G)|KlieIR5_*OXeH)hq4KeVWB#G21?jk`_k5RWca?@hXlDU z)?G%fZ`ygX;fq<5({3_-%xjKboMO)U&-vqm`|gNc@QjnTC8-K-wIWI%WgD4>0(h0q znecUfNA*kvvvr^t%F;)ynYcoPh{03hp0;4 z`OBcj8vi#Z$YV2Al{}m~Hdml-YcS+NSx*bEqlKf6rGh-R(;=Dx>#w<*P=%Q%>x|(k z+K3Yqr?^(bb{>O9X6D?2{Up$~ZEb6WHS^@DUg_V5Q;F;YL*`>YP{26?bIWuaV?PuY zgy_i8orXhvZ4ATi(%1sQyUoe4Z))431M;!qE0LVyNmp@Xz4*gIV=BCDKv5EMsNUGuhQLht5~5(U7)jDRFkLO zzZm*Wj?&v(VWQd)L?YX28jTU#Y8rzHs2%~}$pfklSznKCTcF-cY29{H{~@$UHk*{d z5?GU`b9b%DwI;&3*Mv!KFK7=?2##&BOw~90WuKTVE`pl!Zib zKkMiV<$rQwxbu0$BI6{}t)Je_Y>Ix?YndL9DUELGio1_?BEYxy9tV^E7IRKX4`OO0 z^CVkFr>uuCeNN${8&&_LC0OT67yF_BpdmUA@S&kR=fcGcSGlWrnvEpm*pXLI7?|>b zgybKte2BTxYi=)~erYI`xB2I9fyLWFs=wiLX~>6$jEn-?mHV2!zf*Jm19w>1nEx-_>7wvX1_gG^tkC~~ zJ2yG&|G*sz8~+1$^s&n?DBF%XoZD4QswWH%8{q#h!QEKqG=cK8{C#k}vqE!O7Y7Io6+WOK={b!V67_=B@U&zLNjI|2hj&!!*J z;unOTQCk=n?@n2(#lzeFb0e8=GPg|ML}V;b<}y29Q+zg+Tq<2HmFz2(I5v3rBphey zn(|xVUY`zwitCE*(kgU)#?aUO4mw|z1r>dTyfRg78}k~dD!n%Kn=d}5lpznk>#)vD zV2)fF^_)#AD*Vi(#I}7Oq@YUVJc^tUG2OdeFUA@qPUgp*$KYraI3FkUQg!mi>Y|XO ztRrryYJTm+TU=laZI+e|nKH!sbQq!$k{&;08b>b>#V+T7KD$vY=f2-3i|dI18~(2)P}-sUK%!RadZOZFPUyJ=kYrPiwwHk2HOxsEBDodGf68UN~14zkIGwuQDu$|ESJOA$Zyuj@(4NXg(s(<`58GPUGh zgp`}EszFRRaM4LDN3a{Qxb@29hq!M{@~Bd*9Xf0MN}5PxoxDY@@!w@cd37wywXNFb zp$7a-{By6~GR%@@40`pIRCUhW3pJxsYEdahC(ZMfKBlUE|4I2jPf0wC9&tKpfn7GY zZA{Lr9L8vw_?It2KuZ(!TX%`2HUruY)F9m=RX8dW4ZPzvR4JBj&RBHKc$TIXQ+!Vk zsHrb;rydOd9>4D6$K7E%FtE50CAX9?w?ru`TtBcpDN#0s6!NjW4BeprORF!i`n=vZ zkripw6={@^Z}VbNAsXi1898!Uy$tQP+_l8aWu2IC)hN7Lku9s6vN^sac404T*a%3m zeS)S)Tczw&_JC#ubJY}{K#$XXY$KECOnZ*A6p z2=U7QjV7BeImBPEf^2E{9aDe8p$cd5)Xnsqmqg0uyne&J7z&phqU{|TD=XKVKRbAn zAhQ;z&Q?dU_#W zEpj`-QDeU<7k>av56GkG`O+sx)8CroknKY5!1ANXRvAMcIC9I$nTdA}s8MVA2SBaB zqHIRJ%>O!qMXPQv)3w`E_n*CZ#CcMR@E0Fv>9N$?I{gCzWT$!IFiQNRQ|=)#lRwLo z$^MOaXA)8W^BmnDUp*X`b?G?CpZ%wNbwzpHj-j5b>?!*^;{jl&t?Ubjmzf?h=hGcb zX;$(%BW=NL8q4Z$rq$ofJ|r1DIfBpg)R~d?VuDdm7BHih$J**INv45!G2?QD^5drs zp?8Jy5>c1bPA$F9VHSLCAv|&hB|{+=Csyq{;V@y<+_8>dH6d=e6ZEkjB5s+M3VBve zxKF_^WwflzUZ6jDS=lb+{q_V^49NX{vkXzI(Dvt0)9Mi-hi!LK*D_O+TyW+EUi4{W|+%V*Wh%&;0)aK>kQM literal 0 HcmV?d00001 diff --git a/public/js/audio.js b/public/js/audio.js index a378566c8..ccfa5e120 100644 --- a/public/js/audio.js +++ b/public/js/audio.js @@ -528,8 +528,15 @@ export class Sfx { land() { this.ensure(); this._burst(.08, .18, 400); } // passos: round-robin nos samples (nunca repete o anterior) + playbackRate ±8% + // volume ±15%. Fallback synth: timbre por surface (água do piscinão = splash grave+ruído, - // metal = brilho agudo, concreto = seco). surface vem do game.js (world.slowAt). + // gelo = crocância seca + cristais agudos, metal = brilho agudo, concreto = seco). step(surface = 'concrete') { + if (surface === 'ice') { + this.ensure(); + const v = 0.85 + Math.random() * 0.3; + this._burst(.055, .075 * v, 620 + Math.random() * 260, .75, 'lowpass'); + this._burst(.075, .045 * v, 2600 + Math.random() * 1100, 1.8, 'bandpass', .008); + return; + } const arr = this.pack?.cs?.footsteps; if (arr && arr.length) { this._stepI = (this._stepI + 1) % arr.length; diff --git a/public/js/game.js b/public/js/game.js index b17047824..d6e5ed253 100644 --- a/public/js/game.js +++ b/public/js/game.js @@ -4163,7 +4163,8 @@ export class Game { while (dy > Math.PI) dy -= Math.PI * 2; while (dy < -Math.PI) dy += Math.PI * 2; const cturn = dy * Math.min(1, dt * 8); b.yaw += BOT_MOVE2 ? Math.max(-YAW_CAP * dt, Math.min(YAW_CAP * dt, cturn)) : cturn; - const bSlow = this.world.slowAt && this.world.slowAt(b.pos.x, b.pos.z) ? 0.5 : 1; + const bSlow = this.world.speedMulAt?.(b.pos.x, b.pos.z) + ?? (this.world.slowAt && this.world.slowAt(b.pos.x, b.pos.z) ? 0.5 : 1); const px = b.pos.x, pz = b.pos.z; b.pos.x += Math.sin(b.yaw) * BOT_SPEED * bSlow * dt; b.pos.z += Math.cos(b.yaw) * BOT_SPEED * bSlow * dt; @@ -4485,7 +4486,8 @@ export class Game { p.crouchF = Math.max(0, Math.min(1, p.crouchF + (wantCrouch ? dt * 7 : -dt * (MOVE2 ? 4.2 : 7)))); const walking = MOVE2 && !!(this.keys.ShiftLeft || this.keys.ShiftRight); // Shift = ANDAR (silencioso) const sprint = !MOVE2 && !!(this.keys.ShiftLeft || this.keys.ShiftRight) && p.crouchF < 0.3; - const slowMul = this.world.slowAt && this.world.slowAt(p.pos.x, p.pos.z) ? 0.45 : 1; // água/lago + const slowMul = this.world.speedMulAt?.(p.pos.x, p.pos.z) + ?? (this.world.slowAt && this.world.slowAt(p.pos.x, p.pos.z) ? 0.45 : 1); // terreno específico ou água/lago // velocidade base × ARMA (MOVE_MUL) × andar × ADS × agachado × água const wpnMul = MOVE2 ? (MOVE_MUL[p.weapon] !== undefined ? MOVE_MUL[p.weapon] : 0.9) : 1; const maxSp = MOVE2 @@ -4593,7 +4595,11 @@ export class Game { if (moving) { p.stepPhase += dt * sp * 1.6; const prev = Math.sin(p.stepPhase - dt * sp * 1.6), now = Math.sin(p.stepPhase); - if (prev >= 0 && now < 0) this.sfx.step(this.world.slowAt && this.world.slowAt(p.pos.x, p.pos.z) ? 'water' : 'concrete'); + if (prev >= 0 && now < 0) { + const surface = this.world.surfaceAt?.(p.pos.x, p.pos.z) + ?? (this.world.slowAt && this.world.slowAt(p.pos.x, p.pos.z) ? 'water' : 'concrete'); + this.sfx.step(surface); + } } // Aim: real scopes (AWP / Mosin / Rem700) hide the gun and show the scope overlay. // Every other weapon does light iron-sight ADS — the gun stays on screen and the @@ -5910,7 +5916,8 @@ export class Game { // 180° custa ~0,9 s e lê como uma curva de pessoa. const turn = dy * Math.min(1, dt * (BOT_MOVE2 ? 6 : 12)); b.yaw += BOT_MOVE2 ? Math.max(-YAW_CAP * dt, Math.min(YAW_CAP * dt, turn)) : turn; - const bSlow = this.world.slowAt && this.world.slowAt(b.pos.x, b.pos.z) ? 0.5 : 1; // bots também vadear + const bSlow = this.world.speedMulAt?.(b.pos.x, b.pos.z) + ?? (this.world.slowAt && this.world.slowAt(b.pos.x, b.pos.z) ? 0.5 : 1); // bots também respeitam o terreno const px = b.pos.x, pz = b.pos.z; b.pos.x += Math.sin(b.yaw) * BOT_SPEED * bSlow * dt; b.pos.z += Math.cos(b.yaw) * BOT_SPEED * bSlow * dt; diff --git a/public/js/main.js b/public/js/main.js index 90ffee1fe..73945da5d 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -1484,11 +1484,13 @@ const MAP_DESC = { quebrada: 'Rua de baile: muros baixos, beco cego e o paredão marcando o compasso do round.', posto_treta: 'Posto de combustível na beira da BR: loja de conveniência, bombas de cobertura e treta no fluorescente.', atacadao_treta: 'Galpão de atacado em guerra: gôndolas apertadas, caixas de cobertura e o estacionamento disputado carrinho por carrinho.', + treta_no_gelo: 'Fortaleza congelada de pedra e neve: bastiões octogonais, rampas defensivas e rotas apertadas em volta do bloco central.', }; const MAP_CAT = { praca_poderes: 'CIDADES', piscina_treta: 'ARENA', loja_h: 'CIDADES', ferro_velho: 'ARENA', quebrada: 'FAVELA', posto_treta: 'ARENA', atacadao_treta: 'CIDADES', + treta_no_gelo: 'ARENA', }; let mapCategory = 'TODOS'; function visibleMapIds() { diff --git a/public/js/map_gelo.js b/public/js/map_gelo.js new file mode 100644 index 000000000..479e1c801 --- /dev/null +++ b/public/js/map_gelo.js @@ -0,0 +1,250 @@ +import * as THREE from 'three'; + +const HALF_X = 40; +const HALF_Z = 42; + +function canvasTexture(name, base, light, dark, mode, repeatX = 4, repeatY = repeatX) { + const canvas = document.createElement('canvas'); + canvas.width = canvas.height = 256; + const ctx = canvas.getContext('2d'); + ctx.fillStyle = base; + ctx.fillRect(0, 0, 256, 256); + let seed = [...name].reduce((value, char) => (value * 33 + char.charCodeAt(0)) >>> 0, 1977); + const random = () => ((seed = (seed * 1664525 + 1013904223) >>> 0) / 4294967296); + + if (mode === 'stone') { + for (let row = 0; row < 8; row++) { + const y = row * 32; + const offset = row % 2 ? 24 : 0; + ctx.strokeStyle = dark; + ctx.lineWidth = 3; + ctx.beginPath(); ctx.moveTo(0, y); ctx.lineTo(256, y); ctx.stroke(); + for (let x = offset; x < 256; x += 52) { + ctx.beginPath(); ctx.moveTo(x, y); ctx.lineTo(x, y + 32); ctx.stroke(); + } + } + for (let i = 0; i < 850; i++) { + const alpha = .025 + random() * .11; + ctx.fillStyle = random() > .45 ? `rgba(235,248,255,${alpha})` : `rgba(18,39,55,${alpha})`; + ctx.fillRect(random() * 256, random() * 256, 1 + random() * 7, 1 + random() * 4); + } + } else if (mode === 'snow') { + for (let i = 0; i < 900; i++) { + const alpha = .03 + random() * .12; + ctx.fillStyle = random() > .35 ? `rgba(255,255,255,${alpha})` : `rgba(85,130,158,${alpha})`; + ctx.beginPath(); ctx.arc(random() * 256, random() * 256, 1 + random() * 5, 0, Math.PI * 2); ctx.fill(); + } + } else { + const gradient = ctx.createLinearGradient(0, 0, 256, 256); + gradient.addColorStop(0, light); gradient.addColorStop(.45, base); gradient.addColorStop(1, dark); + ctx.fillStyle = gradient; ctx.fillRect(0, 0, 256, 256); + ctx.strokeStyle = 'rgba(205,239,255,.34)'; ctx.lineWidth = 2; + for (let i = 0; i < 18; i++) { + let x = random() * 256, y = random() * 256; + ctx.beginPath(); ctx.moveTo(x, y); + for (let j = 0; j < 4; j++) { x += random() * 30 - 15; y += random() * 24; ctx.lineTo(x, y); } + ctx.stroke(); + } + } + + const texture = new THREE.CanvasTexture(canvas); + texture.name = name; + texture.colorSpace = THREE.SRGBColorSpace; + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(repeatX, repeatY); + texture.anisotropy = 8; + return texture; +} + +export function buildTretaNoGelo(scene) { + const root = new THREE.Group(); + root.name = 'treta-no-gelo'; + scene.add(root); + const colliders = [], occluders = [], pickups = []; + const geometries = new Map(); + const boxGeometry = (w, h, d) => { + const key = `${w}:${h}:${d}`; + if (!geometries.has(key)) geometries.set(key, new THREE.BoxGeometry(w, h, d)); + return geometries.get(key); + }; + + const textures = { + stone: canvasTexture('gelo-pedra', '#7894a5', '#b8d0dc', '#3e5d70', 'stone', 5, 3), + snow: canvasTexture('gelo-neve', '#dbeaf0', '#ffffff', '#8db0c2', 'snow', 6, 6), + floor: canvasTexture('gelo-piso', '#8cb7cc', '#d8f2fb', '#416c86', 'ice', 8, 9), + trim: canvasTexture('gelo-friso', '#5d7d92', '#afcedc', '#294657', 'stone', 8, 1), + }; + const materials = { + stone: new THREE.MeshStandardMaterial({ map: textures.stone, bumpMap: textures.stone, bumpScale: .055, color: 0xc7dbe4, roughness: .84 }), + stoneDark: new THREE.MeshStandardMaterial({ map: textures.stone, bumpMap: textures.stone, bumpScale: .04, color: 0x7894a5, roughness: .9 }), + snow: new THREE.MeshStandardMaterial({ map: textures.snow, bumpMap: textures.snow, bumpScale: .035, color: 0xffffff, roughness: .92 }), + ice: new THREE.MeshPhysicalMaterial({ map: textures.floor, bumpMap: textures.floor, bumpScale: .025, color: 0xbfe7f4, roughness: .3, metalness: .04, clearcoat: .45, clearcoatRoughness: .28 }), + trim: new THREE.MeshStandardMaterial({ map: textures.trim, color: 0xa3c0cf, roughness: .76 }), + wood: new THREE.MeshStandardMaterial({ color: 0x5b3c2a, roughness: .88 }), + woodLight: new THREE.MeshStandardMaterial({ color: 0x9a7551, roughness: .82 }), + metal: new THREE.MeshStandardMaterial({ color: 0x526674, metalness: .58, roughness: .5 }), + crystal: new THREE.MeshPhysicalMaterial({ color: 0x8edcf2, emissive: 0x17435a, emissiveIntensity: .3, roughness: .18, metalness: .05, transparent: true, opacity: .82 }), + }; + + function addCollider(x, y, z, w, h, d, tag) { + const collider = { minX: x-w/2, maxX: x+w/2, minY: y, maxY: y+h, minZ: z-d/2, maxZ: z+d/2, tag }; + colliders.push(collider); + return collider; + } + function addBox(w, h, d, material, x, y, z, options = {}) { + const mesh = new THREE.Mesh(boxGeometry(w, h, d), material); + mesh.position.set(x, y + h / 2, z); + if (options.ry) mesh.rotation.y = options.ry; + mesh.name = options.name || ''; + mesh.castShadow = options.cast !== false; + mesh.receiveShadow = true; + root.add(mesh); + if (options.collide !== false) { + const hx = Math.abs(Math.cos(options.ry || 0))*w/2 + Math.abs(Math.sin(options.ry || 0))*d/2; + const hz = Math.abs(Math.sin(options.ry || 0))*w/2 + Math.abs(Math.cos(options.ry || 0))*d/2; + const collider = addCollider(x, y, z, hx*2, h, hz*2, options.tag || options.name); + mesh.userData.collider = collider; + if (h > 1.1) occluders.push(mesh); + } + return mesh; + } + function addOctagon(radius, height, material, x, y, z, name, collide = true) { + const mesh = new THREE.Mesh(new THREE.CylinderGeometry(radius, radius, height, 8), material); + mesh.position.set(x, y + height / 2, z); + mesh.rotation.y = Math.PI / 8; + mesh.name = name; + mesh.castShadow = true; + mesh.receiveShadow = true; + root.add(mesh); + if (collide) { + const collider = addCollider(x, y, z, radius*1.86, height, radius*1.86, name); + mesh.userData.collider = collider; + occluders.push(mesh); + } + return mesh; + } + + scene.background = new THREE.Color(0x9fb9ca); + scene.fog = new THREE.Fog(0xa8bfcd, 62, 135); + const ground = new THREE.Mesh(new THREE.PlaneGeometry(110, 116), materials.ice); + ground.rotation.x = -Math.PI/2; + ground.position.y = -.025; + ground.receiveShadow = true; + ground.name = 'gelo-patio-congelado'; + root.add(ground); + + for (const [w,d,x,z,name] of [ + [82,1.2,0,-HALF_Z,'sul'], [82,1.2,0,HALF_Z,'norte'], + [1.2,84,-HALF_X,0,'oeste'], [1.2,84,HALF_X,0,'leste'], + ]) { + addBox(w, 5.4, d, materials.stone, x, 0, z, { name:`gelo-muro-${name}` }); + addBox(w+.15, .45, d+.18, materials.trim, x, 4.2, z, { name:`gelo-friso-muro-${name}`, collide:false }); + addBox(w+.35, .35, d+.35, materials.snow, x, 5.35, z, { name:`gelo-neve-muro-${name}`, collide:false }); + } + + function fortressPart(id, radius, height, x, z, central = false) { + const group = new THREE.Group(); + group.name = central ? 'gelo-fortaleza-central' : `gelo-fortaleza-bastiao-${id}`; + root.add(group); + const body = addOctagon(radius, height, central ? materials.stoneDark : materials.stone, x, 0, z, `gelo-bloco-${central ? 'central' : id}`); + const lowerTrim = addOctagon(radius+.1, .38, materials.trim, x, .38, z, `gelo-friso-inferior-${id}`, false); + const upperTrim = addOctagon(radius+.16, .48, materials.trim, x, height-.68, z, `gelo-friso-superior-${id}`, false); + const roof = addOctagon(radius+.32, .28, materials.snow, x, height, z, `gelo-telhado-neve-${id}`, false); + for (const object of [body, lowerTrim, upperTrim, roof]) { root.remove(object); group.add(object); } + return group; + } + fortressPart('centro', 10.8, 8.2, 0, 0, true); + [[-23,-21],[23,-21],[-23,21],[23,21]].forEach(([x,z], index) => fortressPart(index, 6.8, 6.4, x, z)); + + const wallSpecs = [ + { id: 'sul', x: -12, z: -8.5, yaw: 0 }, + { id: 'norte', x: 12, z: 8.5, yaw: Math.PI }, + ]; + function iceWall(id, x, z, yaw) { + const group = new THREE.Group(); group.name = `gelo-parede-${id}`; root.add(group); + const body = addBox(7.2,3.2,.9,materials.stone,x,0,z,{ry:yaw,name:`gelo-estrutura-parede-${id}`,tag:`gelo-parede-${id}`}); + const trim = addBox(7.34,.32,1.02,materials.trim,x,2.48,z,{ry:yaw,collide:false,name:`gelo-friso-parede-${id}`}); + const snow = addBox(7.48,.2,1.14,materials.snow,x,3.2,z,{ry:yaw,collide:false,name:`gelo-neve-parede-${id}`}); + for (const object of [body, trim, snow]) { root.remove(object); group.add(object); } + } + wallSpecs.forEach(({ id, x, z, yaw }) => iceWall(id, x, z, yaw)); + + const groundHeightAt = () => 0; + + function crate(id, x, z, yaw = 0) { + const group = new THREE.Group(); group.name = `gelo-cobertura-caixa-${id}`; root.add(group); + const body = addBox(2.35,1.75,2.35,materials.wood,x,0,z,{ry:yaw,name:`gelo-caixa-corpo-${id}`}); + root.remove(body); group.add(body); group.userData.collider = body.userData.collider; + for (const side of [-1,1]) { + const band = addBox(.18,1.82,2.46,materials.metal,x+side*.78*Math.cos(yaw),0,z-side*.78*Math.sin(yaw),{ry:yaw,collide:false,name:`gelo-caixa-cinta-${id}-${side}`}); + root.remove(band); group.add(band); + } + const snow = addBox(2.48,.14,2.48,materials.snow,x,1.72,z,{ry:yaw,collide:false,name:`gelo-caixa-neve-${id}`}); + root.remove(snow); group.add(snow); + } + [[-32,-8,.1],[32,8,.1],[-31,10,-.2],[31,-10,-.2],[-13,-30,.2],[13,30,.2],[-4,-18,-.1],[4,18,-.1]].forEach((p,i)=>crate(i,...p)); + + function crystalCover(id, x, z, scale = 1) { + const group = new THREE.Group(); group.name = `gelo-cobertura-cristal-${id}`; root.add(group); + for (const [dx,dz,h,r] of [[0,0,2.8,.72],[-.7,.25,1.9,.48],[.65,.35,2.2,.55]]) { + const mesh = new THREE.Mesh(new THREE.ConeGeometry(r*scale, h*scale, 5), materials.crystal); + mesh.position.set(x+dx*scale,h*scale/2,z+dz*scale); mesh.rotation.y = id*.7+dx; + mesh.name=`gelo-cristal-${id}`; mesh.castShadow=true; group.add(mesh); + } + group.userData.collider = addCollider(x,0,z,2.6*scale,2.8*scale,2.2*scale,`cristal-${id}`); + occluders.push(group); + } + [[-17,0,1],[17,0,1],[0,-28,1.05],[0,28,1.05]].forEach((p,i)=>crystalCover(i,...p)); + + for (const [id,x,z,yaw] of [['so',-27,-33,.2],['se',27,-33,-.2],['no',-27,33,-.2],['ne',27,33,.2]]) { + addBox(7.2,1.4,.9,materials.stone,x,0,z,{ry:yaw,name:`gelo-cobertura-barreira-${id}`}); + addBox(7.35,.18,1.02,materials.snow,x,1.36,z,{ry:yaw,collide:false,name:`gelo-neve-barreira-${id}`}); + } + + const gunMaterials = { dark: materials.metal, wood: materials.woodLight }; + function gun(kind, x, z, yaw) { + const group = new THREE.Group(); group.name = `arma-gelo-${kind}`; group.position.set(x,.12,z); group.rotation.y=yaw; root.add(group); + const long = !['pistol','deagle'].includes(kind); + const body = new THREE.Mesh(boxGeometry(.15,.13,long?.92:.42),gunMaterials.dark); body.position.y=.12; group.add(body); + if (long) { const barrel = new THREE.Mesh(boxGeometry(.07,.07,.56),gunMaterials.dark); barrel.position.set(0,.14,-.62); group.add(barrel); } + const grip = new THREE.Mesh(boxGeometry(.12,.27,.15),gunMaterials.wood); grip.position.set(0,-.02,long?.22:.1); group.add(grip); + pickups.push({x,z,kind,weapon:kind,readyAt:0,mesh:group}); + } + const arsenal = ['ak','m4','awp','shotgun','mp5','smg','deagle','pistol']; + for (let i=0;i<12;i++) { + const x=-16+i*(32/11), kind=arsenal[i%arsenal.length]; + gun(kind,x,-13+(i%2)*2.5,.12*i); gun(kind,-x,13-(i%2)*2.5,Math.PI+.12*i); + } + + const blocked = (x,z,pad=.72) => colliders.some((c)=>x>c.minX-pad&&xc.minZ-pad&&z[]); + for(let i=0;i1, speedMulAt:()=>.55, surfaceAt:()=> 'ice', + spawns:{E:[-18,-6,6,18].map(x=>({x,z:-36,yaw:0})),B:[18,6,-6,-18].map(x=>({x,z:36,yaw:Math.PI}))}, + ctfPoints:[ + {id:'E',x:0,z:-34,label:'PORTÃO SUL'},{id:'O',x:-31,z:0,label:'BASTIÃO OESTE'}, + {id:'L',x:31,z:0,label:'BASTIÃO LESTE'},{id:'B',x:0,z:34,label:'PORTÃO NORTE'}, + ], + waypoints:{nodes,adj},nearestWaypoint,findPath,bounds, + }; +} diff --git a/public/js/maps.js b/public/js/maps.js index 770cf7950..eade76f8f 100644 --- a/public/js/maps.js +++ b/public/js/maps.js @@ -6,6 +6,7 @@ import { buildFerroVelho, FERRO_PROPS } from './map_ferrovelho.js'; import { buildQuebrada, QUEBRADA_PROPS } from './map_quebrada.js'; import { buildPosto, POSTO_PROPS } from './map_posto.js'; import { buildAtacadao, ATACADAO_PROPS } from './map_atacadao.js'; +import { buildTretaNoGelo } from './map_gelo.js'; /* IDS SEM NOME DE COUNTER-STRIKE (rodada de 11/08). ═══════════════════════════════════════════════════════════════════════════════════ @@ -62,6 +63,7 @@ export const MAPS = { // por portas de verdade na fachada. Gôndolas reais (gondola_mercado/eletro), caixas, doca, e um // bairro/skyline em volta. A treta é o preço absurdo. Simétrico funcional, A* pelos corredores. atacadao_treta: { name: 'Atacadão da Treta', build: buildAtacadao, props: ATACADAO_PROPS, ctfMode: true }, + treta_no_gelo: { name: 'Treta no Gelo', build: buildTretaNoGelo }, }; export const MAP_IDS = Object.keys(MAPS); export const DEFAULT_MAP = 'praca_poderes'; diff --git a/public/models/anims/foot-offsets.json b/public/models/anims/foot-offsets.json index 7bc8e3041..46f1a339b 100644 --- a/public/models/anims/foot-offsets.json +++ b/public/models/anims/foot-offsets.json @@ -1,5 +1,5 @@ { - "gerado": "2026-08-16T03:26:44.444Z", + "gerado": "2026-08-18T22:41:12.557Z", "fonte": "tools/eval/char_probe.json (C3.porPose) — via tools/gen-foot-offsets.mjs", "nota": "offset em METROS somado ao Y do modelo enquanto o clipe está ativo. offset = -desvio medido.", "tolerancia": 0.01, diff --git a/src/data/jogo.ts b/src/data/jogo.ts index 56eac74d6..b152fec7d 100644 --- a/src/data/jogo.ts +++ b/src/data/jogo.ts @@ -128,7 +128,7 @@ export interface Mapa { ctf: boolean; } -/** 5 arenas jogáveis - a ordem é a do registro (public/js/maps.js, objeto MAPS). */ +/** Arenas jogáveis - a ordem é a do registro (public/js/maps.js, objeto MAPS). */ export const MAPAS: Mapa[] = [ { id: 'praca_poderes', nome: 'Praça dos Três Poderes', modo: 'Rounds · padrão', ctf: false, @@ -171,6 +171,13 @@ export const MAPAS: Mapa[] = [ 'impede a rua virar corredor de sniper. Quatro bandeiras: campinho, bar de esquina, ponto de ' + 'ônibus e praça do baile.', }, + { + id: 'treta_no_gelo', nome: 'Treta no Gelo', modo: 'Rounds · padrão', ctf: false, + resumo: 'Fortaleza congelada com bastiões octogonais e corredores de neve.', + detalhe: 'O bloco central corta as linhas de tiro e obriga a escolher entre os corredores curtos, ' + + 'as rampas defensivas e os flancos junto aos quatro bastiões. Pedra congelada, cristais, caixas ' + + 'e barreiras cobertas de neve criam cobertura sem esconder os pontos de referência da arena.', + }, ]; export interface Personagem { faccao: string; nome: string; blurb: string; } diff --git a/src/pages/maps.astro b/src/pages/maps.astro index 9eb0acea6..bb50e3cc2 100644 --- a/src/pages/maps.astro +++ b/src/pages/maps.astro @@ -52,6 +52,13 @@ const MAP_EN: Record 'that keeps the street from becoming a sniper corridor. Four flags: dirt pitch, corner bar, ' + 'bus stop and baile square.', }, + treta_no_gelo: { + nome: 'Fight on Ice', + resumo: 'A frozen fortress with octagonal bastions and snow-covered corridors.', + detalhe: 'The central block breaks long sightlines and forces a choice between short corridors, ' + + 'defensive ramps and flanks around the four bastions. Frozen stone, crystals, crates and ' + + 'snow-covered barriers create cover without hiding the arena landmarks.', + }, }; const en = (id: string) => MAP_EN[id]; diff --git a/tools/eval/ARCH.md b/tools/eval/ARCH.md index 6b2534269..50613d134 100644 --- a/tools/eval/ARCH.md +++ b/tools/eval/ARCH.md @@ -9,8 +9,8 @@ | Arquivo | Linhas | Símbolos | |---|---:|---:| -| `public/js/game.js` | 6561 | 230 | -| `public/js/main.js` | 2513 | 230 | +| `public/js/game.js` | 6568 | 230 | +| `public/js/main.js` | 2515 | 230 | | `public/js/glbchars.js` | 838 | 60 | | `public/js/characters.js` | 1069 | 40 | | `public/js/vmattach.js` | 629 | 4 | @@ -19,24 +19,24 @@ ## Maiores métodos de `game.js` — onde o conflito mora -Os 15 maiores somam **3042 linhas (46% do arquivo)**. Método grande = PR irrevisável e merge conflitante. +Os 15 maiores somam **3049 linhas (46% do arquivo)**. Método grande = PR irrevisável e merge conflitante. | Linhas | Início | Método | | |---:|---:|---|---| -| 809 | 5223 | `_updateBot()` | ⚠️ candidato a extração | +| 810 | 5229 | `_updateBot()` | ⚠️ candidato a extração | | 546 | 574 | `constructor()` | 🔴 append-only | -| 310 | 4461 | `_updatePlayer()` | ⚠️ candidato a extração | +| 315 | 4462 | `_updatePlayer()` | ⚠️ candidato a extração | | 248 | 1888 | `_resetPositions()` | | | 241 | 1217 | `_buildViewModels()` | | -| 148 | 4771 | `_updatePickups()` | | -| 133 | 4071 | `_botCtf()` | | +| 148 | 4777 | `_updatePickups()` | | +| 134 | 4071 | `_botCtf()` | | | 84 | 3805 | `_initCTF()` | | | 83 | 2670 | `_tryShoot()` | | -| 80 | 6375 | `_updateHud()` | | +| 80 | 6382 | `_updateHud()` | | | 79 | 3006 | `_dmgArc()` | | -| 76 | 4210 | `_updateCtfHud()` | | -| 71 | 6045 | `_updateBotNN()` | | -| 70 | 6455 | `update()` | 🔴 append-only | +| 76 | 4211 | `_updateCtfHud()` | | +| 71 | 6052 | `_updateBotNN()` | | +| 70 | 6462 | `update()` | 🔴 append-only | | 64 | 2942 | `_kill()` | | ## Tabela de CONFLITO — resolvida para as linhas de hoje @@ -48,19 +48,19 @@ faixas disjuntas simultaneamente com zero conflito de conteúdo. | Frente | Faixas em `game.js` | Arquivos exclusivos | |---|---|---| | **ARMAS / VIEWMODEL** | `25–73` `335–335` `363–457` `484–505` `1217–1615` `2435–2440` `2522–2605` `2624–2817` `3227–3250` `3298–3360` `3426–3442` | `public/js/vmattach.js` `public/js/springs.js` `public/js/weapons.js` `public/js/fparms.js` `public/js/handik.js` `public/js/recoil.js` `public/js/vmlab.js` | -| **BOTS / JOGABILIDADE** | `189–192` `243–243` `269–280` `547–558` `2903–3005` `3749–3804` `3967–4203` `4286–4308` `4461–4770` `5095–5112` `5194–6031` | — | -| **MAPAS / MUNDO** | `1163–1216` `1888–2135` `3805–3944` `4771–4918` | `public/js/maps.js` `public/js/mapprops.js` `public/js/map_brasilia.js` `public/js/map_havan.js` `public/js/map_piscina.js` `public/js/map_piscinao_ramos.js` `public/js/map_ferrovelho.js` | +| **BOTS / JOGABILIDADE** | `189–192` `243–243` `269–280` `547–558` `2903–3005` `3749–3804` `3967–4204` `4287–4309` `4462–4776` `5101–5118` `5200–6038` | — | +| **MAPAS / MUNDO** | `1163–1216` `1888–2135` `3805–3944` `4777–4924` | `public/js/maps.js` `public/js/mapprops.js` `public/js/map_brasilia.js` `public/js/map_havan.js` `public/js/map_piscina.js` `public/js/map_piscinao_ramos.js` `public/js/map_ferrovelho.js` | | **GRÁFICOS / FX** | `1616–1658` `2368–2380` `3251–3289` `3371–3425` | `public/js/bloom.js` `public/js/textures.js` `public/js/vao.js` `public/js/stylize.js` `public/js/gpuparticles.js` | -| **UI / HUD / MENU** | `1120–1162` `2328–2346` `2362–2367` `2381–2387` `3006–3147` `3163–3226` `6198–6261` `6292–6339` `6375–6454` | `public/js/main.js` `public/style.css` `src/pages/index.astro` | +| **UI / HUD / MENU** | `1120–1162` `2328–2346` `2362–2367` `2381–2387` `3006–3147` `3163–3226` `6205–6268` `6299–6346` `6382–6461` | `public/js/main.js` `public/style.css` `src/pages/index.astro` | | **ÁUDIO** | — | `public/js/audio.js` | | **PERSONAGENS** | — | `public/js/characters.js` `public/js/glbchars.js` | | **SITE / BACKEND** | — | `src/` `supabase/` | -**🔴 Zonas vermelhas (append-only, qualquer frente pode precisar):** `update()` 6455–6524 · `_dom()` 1120–1162 · `constructor()` 574–1119 +**🔴 Zonas vermelhas (append-only, qualquer frente pode precisar):** `update()` 6462–6531 · `_dom()` 1120–1162 · `constructor()` 574–1119 Nenhuma sobreposição entre frentes — todas as faixas são disjuntas. ✓ -Cobertura: **3755 de 6561 linhas (57%)** do `game.js` têm dono declarado. O resto é território neutro — declare a frente mesmo assim. +Cobertura: **3762 de 6568 linhas (57%)** do `game.js` têm dono declarado. O resto é território neutro — declare a frente mesmo assim.
Índice completo de game.js (todos os símbolos) @@ -218,50 +218,50 @@ Cobertura: **3755 de 6561 linhas (57%)** do `game.js` têm dono declarado. O res | 4015 | `_walkReach()` | 18 | | 4033 | `_wpComp()` | 16 | | 4049 | `_findPathLocal()` | 22 | -| 4071 | `_botCtf()` | 133 | -| 4204 | `_hideCtfHud()` | 6 | -| 4210 | `_updateCtfHud()` | 76 | -| 4286 | `_collide()` | 23 | -| 4309 | `_collideRot()` | 26 | -| 4335 | `_freeSpot()` | 30 | -| 4365 | `_retaAndavel()` | 20 | -| 4385 | `_walkDepth()` | 16 | -| 4401 | `_noteHit()` | 17 | -| 4418 | `_deathFeedback()` | 43 | -| 4461 | `_updatePlayer()` | 310 | -| 4771 | `_updatePickups()` | 148 | -| 4919 | `_wpnMode()` | 5 | -| 4924 | `_botWeapon()` | 12 | -| 4936 | `_municaoInfinita()` | 1 | -| 4937 | `_pickupAllowed()` | 7 | -| 4944 | `_grabPickup()` | 35 | -| 4979 | `_assentarNoChao()` | 11 | -| 4990 | `_dropWeapon()` | 18 | -| 5008 | `_sumirDrop()` | 36 | -| 5044 | `_spawnY()` | 3 | -| 5047 | `_pickSpawn()` | 23 | -| 5070 | `_respawnPlayer()` | 25 | -| 5095 | `_losClear()` | 18 | -| 5113 | `_botCall()` | 37 | -| 5150 | `_teamMarkTex()` | 23 | -| 5173 | `_makeTeamMark()` | 14 | -| 5187 | `_updateTeamMark()` | 7 | -| 5194 | `_botEye()` | 1 | -| 5195 | `_enemyOf()` | 8 | -| 5203 | `_duelToken()` | 20 | -| 5223 | `_updateBot()` | 809 | -| 6032 | `_flushTraining()` | 13 | -| 6045 | `_updateBotNN()` | 71 | -| 6116 | `_botShootNN()` | 44 | -| 6160 | `_radarFoot()` | 38 | -| 6198 | `_updateRadar()` | 64 | -| 6262 | `_banner()` | 26 | -| 6288 | `_resultadoDaRodada()` | 4 | -| 6292 | `_showScoreboard()` | 48 | -| 6340 | `_updateWeaponHud()` | 35 | -| 6375 | `_updateHud()` | 80 | -| 6455 | `update()` | 70 | -| 6525 | `dispose()` | 36 | +| 4071 | `_botCtf()` | 134 | +| 4205 | `_hideCtfHud()` | 6 | +| 4211 | `_updateCtfHud()` | 76 | +| 4287 | `_collide()` | 23 | +| 4310 | `_collideRot()` | 26 | +| 4336 | `_freeSpot()` | 30 | +| 4366 | `_retaAndavel()` | 20 | +| 4386 | `_walkDepth()` | 16 | +| 4402 | `_noteHit()` | 17 | +| 4419 | `_deathFeedback()` | 43 | +| 4462 | `_updatePlayer()` | 315 | +| 4777 | `_updatePickups()` | 148 | +| 4925 | `_wpnMode()` | 5 | +| 4930 | `_botWeapon()` | 12 | +| 4942 | `_municaoInfinita()` | 1 | +| 4943 | `_pickupAllowed()` | 7 | +| 4950 | `_grabPickup()` | 35 | +| 4985 | `_assentarNoChao()` | 11 | +| 4996 | `_dropWeapon()` | 18 | +| 5014 | `_sumirDrop()` | 36 | +| 5050 | `_spawnY()` | 3 | +| 5053 | `_pickSpawn()` | 23 | +| 5076 | `_respawnPlayer()` | 25 | +| 5101 | `_losClear()` | 18 | +| 5119 | `_botCall()` | 37 | +| 5156 | `_teamMarkTex()` | 23 | +| 5179 | `_makeTeamMark()` | 14 | +| 5193 | `_updateTeamMark()` | 7 | +| 5200 | `_botEye()` | 1 | +| 5201 | `_enemyOf()` | 8 | +| 5209 | `_duelToken()` | 20 | +| 5229 | `_updateBot()` | 810 | +| 6039 | `_flushTraining()` | 13 | +| 6052 | `_updateBotNN()` | 71 | +| 6123 | `_botShootNN()` | 44 | +| 6167 | `_radarFoot()` | 38 | +| 6205 | `_updateRadar()` | 64 | +| 6269 | `_banner()` | 26 | +| 6295 | `_resultadoDaRodada()` | 4 | +| 6299 | `_showScoreboard()` | 48 | +| 6347 | `_updateWeaponHud()` | 35 | +| 6382 | `_updateHud()` | 80 | +| 6462 | `update()` | 70 | +| 6532 | `dispose()` | 36 |
diff --git a/tools/eval/char_probe.json b/tools/eval/char_probe.json index 3fa6f12b3..8a66461cb 100644 --- a/tools/eval/char_probe.json +++ b/tools/eval/char_probe.json @@ -1,5 +1,5 @@ { - "gerado": "2026-08-16T03:26:44.444Z", + "gerado": "2026-08-18T22:41:12.557Z", "protocolo": "node puro; DOM stubado + three vendorizado (mesmo protocolo de botsim.mjs/pickup-check.mjs); GLB lido por tp-mount-probe.mjs", "fontes": { "glb": 44, @@ -138,11 +138,21 @@ "aoMap": 0, "meshes": 325, "triangulos": 3410 + }, + { + "mapa": "treta_no_gelo", + "materiais": 9, + "map": 5, + "normalMap": 0, + "roughnessMap": 0, + "aoMap": 0, + "meshes": 157, + "triangulos": 2302 } ], "total": { - "materiais": 1295, - "map": 877, + "materiais": 1304, + "map": 882, "normalMap": 53, "roughnessMap": 53, "aoMap": 0 diff --git a/tools/eval/g2ui-map-previews.mjs b/tools/eval/g2ui-map-previews.mjs index d8cc25670..379d5a1ac 100644 --- a/tools/eval/g2ui-map-previews.mjs +++ b/tools/eval/g2ui-map-previews.mjs @@ -45,6 +45,8 @@ const POSES = process.env.POSES ? JSON.parse(process.env.POSES) : { // Rua inteira do campinho até a rotunda do baile, comércio dos dois lados, faixa na // frente. Câmera alta e pitch fundo porque a -0,17 metade do cartaz era céu. quebrada: { pos: [0, 8.0, 30], pitch: -0.30, yaw: 0.0 }, + // Vista diagonal elevada como a referência: fortaleza central, bastiões e rotas laterais. + treta_no_gelo: { pos: [32, 8.0, 32], pitch: -0.24, yaw: 0.78 }, }; const NOPOSE = process.env.NOPOSE === '1'; // captura do spawn, sem pino de posição const TAG = process.env.TAG || ''; @@ -89,7 +91,7 @@ page.on('pageerror', e => { errors++; console.error('[pageerror]', e.message); } for (const mapId of LIST) { await page.goto(`${BASE}/?debug=1&auto=P,mst&map=${mapId}`, { waitUntil: 'domcontentloaded', timeout: 60000 }); await page.waitForFunction(() => window.__game && window.__game.state === 'live', null, { timeout: 180000 }); - await page.addStyleTag({ content: '#hud{display:none!important}' }); + await page.addStyleTag({ content: '#hud,#hud-shortcuts{display:none!important}' }); await page.evaluate((pose) => { const g = window.__game; g.player.hp = 1e9; diff --git a/tools/eval/map_check.json b/tools/eval/map_check.json index f3357fd12..952599956 100644 --- a/tools/eval/map_check.json +++ b/tools/eval/map_check.json @@ -1,5 +1,5 @@ { - "gerado": "2026-08-16T03:27:43.781Z", + "gerado": "2026-08-18T22:48:22.603Z", "criterios": { "map1": "corpo dentro de sólido: raycast do peito (1.4 m) até o chão; sólido com topo > 0.3 m acima do chão local reprova", "map2": "exposição: fração dos pontos andáveis a ≥ 25 m com _losClear até a cabeça (1.62 m) de quem nasce", @@ -6769,6 +6769,677 @@ } ], "alturaTrianguloMin": 18 + }, + { + "map": "treta_no_gelo", + "celulasAlcancadas": 78616, + "amostrasChao": 4916, + "observadores": 1172, + "corpoDentroDeSolido": 5, + "submersosAcimaDoPeito": 0, + "piorPenetracao": 0.418, + "piores": [ + { + "tipo": "chao", + "x": 13.9, + "z": 6.9, + "pen": 0.418 + }, + { + "tipo": "chao", + "x": -13.1, + "z": -6.1, + "pen": 0.369 + }, + { + "tipo": "chao", + "x": 12.9, + "z": 5.9, + "pen": 0.356 + }, + { + "tipo": "chao", + "x": 12.9, + "z": -13.1, + "pen": 0.35 + }, + { + "tipo": "chao", + "x": -12.1, + "z": -5.1, + "pen": 0.307 + } + ], + "dentroTodos": [ + { + "tipo": "chao", + "x": 13.9, + "z": 6.9, + "pen": 0.418 + }, + { + "tipo": "chao", + "x": -13.1, + "z": -6.1, + "pen": 0.369 + }, + { + "tipo": "chao", + "x": 12.9, + "z": 5.9, + "pen": 0.356 + }, + { + "tipo": "chao", + "x": 12.9, + "z": -13.1, + "pen": 0.35 + }, + { + "tipo": "chao", + "x": -12.1, + "z": -5.1, + "pen": 0.307 + } + ], + "spawns": [ + { + "team": "E", + "x": -18, + "z": -36, + "chao": 0, + "penetracao": 0 + }, + { + "team": "E", + "x": -6, + "z": -36, + "chao": 0, + "penetracao": 0 + }, + { + "team": "E", + "x": 6, + "z": -36, + "chao": 0, + "penetracao": 0 + }, + { + "team": "E", + "x": 18, + "z": -36, + "chao": 0, + "penetracao": 0 + }, + { + "team": "B", + "x": 18, + "z": 36, + "chao": 0, + "penetracao": 0 + }, + { + "team": "B", + "x": 6, + "z": 36, + "chao": 0, + "penetracao": 0 + }, + { + "team": "B", + "x": -6, + "z": 36, + "chao": 0, + "penetracao": 0 + }, + { + "team": "B", + "x": -18, + "z": 36, + "chao": 0, + "penetracao": 0 + } + ], + "exposicaoPorTime": [ + { + "team": "E", + "chaoMin": 0, + "chaoMax": 0, + "fracMedia": 0.3707, + "maiorVisada": 82.1 + }, + { + "team": "B", + "chaoMin": 0, + "chaoMax": 0, + "fracMedia": 0.3708, + "maiorVisada": 82.1 + } + ], + "exposicaoPorSpawn": [ + { + "team": "E", + "x": -18, + "z": -36, + "chao": 0, + "obsLonge": 957, + "obsVendo": 265, + "frac": 0.2769, + "maiorVisada": 76.4 + }, + { + "team": "E", + "x": -6, + "z": -36, + "chao": 0, + "obsLonge": 926, + "obsVendo": 425, + "frac": 0.459, + "maiorVisada": 77.8 + }, + { + "team": "E", + "x": 6, + "z": -36, + "chao": 0, + "obsLonge": 925, + "obsVendo": 391, + "frac": 0.4227, + "maiorVisada": 77.9 + }, + { + "team": "E", + "x": 18, + "z": -36, + "chao": 0, + "obsLonge": 953, + "obsVendo": 309, + "frac": 0.3242, + "maiorVisada": 82.1 + }, + { + "team": "B", + "x": 18, + "z": 36, + "chao": 0, + "obsLonge": 961, + "obsVendo": 265, + "frac": 0.2758, + "maiorVisada": 76.2 + }, + { + "team": "B", + "x": 6, + "z": 36, + "chao": 0, + "obsLonge": 927, + "obsVendo": 430, + "frac": 0.4639, + "maiorVisada": 78.1 + }, + { + "team": "B", + "x": -6, + "z": 36, + "chao": 0, + "obsLonge": 928, + "obsVendo": 393, + "frac": 0.4235, + "maiorVisada": 77.6 + }, + { + "team": "B", + "x": -18, + "z": 36, + "chao": 0, + "obsLonge": 953, + "obsVendo": 305, + "frac": 0.32, + "maiorVisada": 82.1 + } + ], + "salaDoSpawn": [ + { + "team": "E", + "x": -18, + "z": -36, + "folgaParede": 5.45, + "dirPior": 264, + "areaContigua": 78.3, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": -6, + "z": -36, + "folgaParede": 5.45, + "dirPior": 264, + "areaContigua": 78.3, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": 6, + "z": -36, + "folgaParede": 5.45, + "dirPior": 264, + "areaContigua": 78.3, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": 18, + "z": -36, + "folgaParede": 5.45, + "dirPior": 264, + "areaContigua": 78.3, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 18, + "z": 36, + "folgaParede": 5.45, + "dirPior": 84, + "areaContigua": 78.4, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 6, + "z": 36, + "folgaParede": 5.45, + "dirPior": 84, + "areaContigua": 78.4, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": -6, + "z": 36, + "folgaParede": 5.45, + "dirPior": 84, + "areaContigua": 78.4, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": -18, + "z": 36, + "folgaParede": 5.45, + "dirPior": 84, + "areaContigua": 78.4, + "okFolga": true, + "okArea": true + } + ], + "piorFolga": 5.45, + "piorArea": 78.3, + "escadas": [], + "travessia": [], + "occluderSemMalha": [], + "occMedidos": 21, + "occPulados": 6, + "fracSemMalha": 0.0005, + "quadrantes": [ + { + "q": "0,0", + "x0": -39.1, + "z0": -41.1, + "areaAndavel": 292, + "props": 1, + "waypoints": 38, + "densProp": 0.34, + "densWp": 13.03, + "espacamento": 17.08, + "razaoProp": 1.05, + "razaoWp": 1 + }, + { + "q": "0,1", + "x0": -39.1, + "z0": -20.6, + "areaAndavel": 319, + "props": 1, + "waypoints": 39, + "densProp": 0.31, + "densWp": 12.24, + "espacamento": 17.85, + "razaoProp": 0.95, + "razaoWp": 0.94 + }, + { + "q": "0,2", + "x0": -39.1, + "z0": 0, + "areaAndavel": 318, + "props": 1, + "waypoints": 44, + "densProp": 0.31, + "densWp": 13.82, + "espacamento": 17.84, + "razaoProp": 0.95, + "razaoWp": 1.06 + }, + { + "q": "0,3", + "x0": -39.1, + "z0": 20.6, + "areaAndavel": 292, + "props": 1, + "waypoints": 34, + "densProp": 0.34, + "densWp": 11.66, + "espacamento": 17.08, + "razaoProp": 1.05, + "razaoWp": 0.89 + }, + { + "q": "1,0", + "x0": -19.6, + "z0": -41.1, + "areaAndavel": 354, + "props": 1, + "waypoints": 52, + "densProp": 0.28, + "densWp": 14.69, + "espacamento": 18.81, + "razaoProp": 0.86, + "razaoWp": 1.13 + }, + { + "q": "1,1", + "x0": -19.6, + "z0": -20.6, + "areaAndavel": 252, + "props": 1, + "waypoints": 34, + "densProp": 0.4, + "densWp": 13.48, + "espacamento": 15.88, + "razaoProp": 1.23, + "razaoWp": 1.03 + }, + { + "q": "1,2", + "x0": -19.6, + "z0": 0, + "areaAndavel": 264, + "props": 1, + "waypoints": 43, + "densProp": 0.38, + "densWp": 16.28, + "espacamento": 16.25, + "razaoProp": 1.17, + "razaoWp": 1.25 + }, + { + "q": "1,3", + "x0": -19.6, + "z0": 20.6, + "areaAndavel": 366, + "props": 0, + "waypoints": 49, + "densProp": 0, + "densWp": 13.38, + "espacamento": 99, + "razaoProp": 0, + "razaoWp": 1.03 + }, + { + "q": "2,0", + "x0": 0, + "z0": -41.1, + "areaAndavel": 366, + "props": 1, + "waypoints": 53, + "densProp": 0.27, + "densWp": 14.48, + "espacamento": 19.13, + "razaoProp": 0.83, + "razaoWp": 1.11 + }, + { + "q": "2,1", + "x0": 0, + "z0": -20.6, + "areaAndavel": 264, + "props": 0, + "waypoints": 31, + "densProp": 0, + "densWp": 11.73, + "espacamento": 99, + "razaoProp": 0, + "razaoWp": 0.9 + }, + { + "q": "2,2", + "x0": 0, + "z0": 0, + "areaAndavel": 252, + "props": 2, + "waypoints": 32, + "densProp": 0.79, + "densWp": 12.68, + "espacamento": 11.23, + "razaoProp": 2.43, + "razaoWp": 0.97 + }, + { + "q": "2,3", + "x0": 0, + "z0": 20.6, + "areaAndavel": 354, + "props": 2, + "waypoints": 45, + "densProp": 0.57, + "densWp": 12.72, + "espacamento": 13.3, + "razaoProp": 1.75, + "razaoWp": 0.98 + }, + { + "q": "3,0", + "x0": 19.6, + "z0": -41.1, + "areaAndavel": 292, + "props": 1, + "waypoints": 38, + "densProp": 0.34, + "densWp": 13.03, + "espacamento": 17.08, + "razaoProp": 1.05, + "razaoWp": 1 + }, + { + "q": "3,1", + "x0": 19.6, + "z0": -20.6, + "areaAndavel": 318, + "props": 1, + "waypoints": 39, + "densProp": 0.31, + "densWp": 12.25, + "espacamento": 17.84, + "razaoProp": 0.95, + "razaoWp": 0.94 + }, + { + "q": "3,2", + "x0": 19.6, + "z0": 0, + "areaAndavel": 319, + "props": 1, + "waypoints": 47, + "densProp": 0.31, + "densWp": 14.75, + "espacamento": 17.85, + "razaoProp": 0.95, + "razaoWp": 1.13 + }, + { + "q": "3,3", + "x0": 19.6, + "z0": 20.6, + "areaAndavel": 292, + "props": 1, + "waypoints": 34, + "densProp": 0.34, + "densWp": 11.66, + "espacamento": 17.08, + "razaoProp": 1.05, + "razaoWp": 0.89 + } + ], + "medianaProp": 0.325, + "medianaWp": 13.03, + "piorRazaoProp": 0, + "piorRazaoWp": 0.89, + "piorEspacamento": 99, + "rotasSpawnBandeira": [ + { + "time": "E", + "bandeira": "E", + "rotas": 4, + "comprimentos": [ + 18.9, + 18.9, + 18.9, + 18.9 + ] + }, + { + "time": "E", + "bandeira": "O", + "rotas": 4, + "comprimentos": [ + 44, + 47.2, + 66.3, + 119.4 + ] + }, + { + "time": "E", + "bandeira": "L", + "rotas": 4, + "comprimentos": [ + 65.8, + 88.4, + 96.9, + 149.7 + ] + }, + { + "time": "E", + "bandeira": "B", + "rotas": 4, + "comprimentos": [ + 75.3, + 91.3, + 107.7, + 150 + ] + }, + { + "time": "B", + "bandeira": "E", + "rotas": 4, + "comprimentos": [ + 78, + 90.1, + 108.8, + 130.8 + ] + }, + { + "time": "B", + "bandeira": "O", + "rotas": 3, + "comprimentos": [ + 63.1, + 67.9, + 112.4 + ] + }, + { + "time": "B", + "bandeira": "L", + "rotas": 4, + "comprimentos": [ + 44.5, + 46.1, + 59.1, + 119.8 + ] + }, + { + "time": "B", + "bandeira": "B", + "rotas": 4, + "comprimentos": [ + 20, + 20, + 20, + 20 + ] + } + ], + "piorRotas": 3, + "bandeiras": [ + { + "id": "E", + "label": "PORTÃO SUL", + "x": 0, + "z": -34, + "distSpawn": 6.32, + "timeSpawn": "E", + "maiorLinhaTiro": 74.8, + "chao": 0, + "penetracao": 0 + }, + { + "id": "O", + "label": "BASTIÃO OESTE", + "x": -31, + "z": 0, + "distSpawn": 38.28, + "timeSpawn": "E", + "maiorLinhaTiro": 78.4, + "chao": 0, + "penetracao": 0 + }, + { + "id": "L", + "label": "BASTIÃO LESTE", + "x": 31, + "z": 0, + "distSpawn": 38.28, + "timeSpawn": "E", + "maiorLinhaTiro": 78.5, + "chao": 0, + "penetracao": 0 + }, + { + "id": "B", + "label": "PORTÃO NORTE", + "x": 0, + "z": 34, + "distSpawn": 6.32, + "timeSpawn": "B", + "maiorLinhaTiro": 74.9, + "chao": 0, + "penetracao": 0 + } + ], + "alturaTrianguloMin": 31 } ] } \ No newline at end of file diff --git a/tools/eval/mat_check.json b/tools/eval/mat_check.json index f651ee564..8ef970e56 100644 --- a/tools/eval/mat_check.json +++ b/tools/eval/mat_check.json @@ -1,5 +1,5 @@ { - "gerado": "2026-08-16T03:27:47.239Z", + "gerado": "2026-08-18T22:49:49.054Z", "renderer": { "toneMappingInicial": "ACESFilmicToneMapping", "toneMappingExposureInicial": 1.25, @@ -69,6 +69,15 @@ "razaoCromaMediana": 1.07, "matizVmMediano": 268.8, "matizChaoMediano": 264.3 + }, + "treta_no_gelo": { + "dLmediano": 2.53, + "dABmediano": 0.29, + "dABmax": 0.91, + "dABpior": "p90", + "razaoCromaMediana": 1.06, + "matizVmMediano": 265.4, + "matizChaoMediano": 261.4 } }, "looks": { @@ -395,7 +404,7 @@ "mutacoes": [] }, "chao_drop": { - "linha": 4993, + "linha": 4991, "mutacoes": [] }, "tp_mount": { @@ -2693,10 +2702,180 @@ "fonteCeu": "bloom.js skyRadiance(atacadao_treta) — AERIAL, medida por r3_fog.py" }, "nevoa": null + }, + { + "map": "treta_no_gelo", + "sun": { + "pos": [ + -32, + 48, + -28 + ], + "color": "#e8f5ff", + "intensity": 1.72 + }, + "mapa": { + "lights": [ + { + "type": "HemisphereLight", + "intensity": 1.42, + "color": "#dceeff", + "pos": [ + 0, + 1, + 0 + ], + "ground": "#304657" + }, + { + "type": "DirectionalLight", + "intensity": 1.72, + "color": "#e8f5ff", + "pos": [ + -32, + 48, + -28 + ] + }, + { + "type": "DirectionalLight", + "intensity": 0.42, + "color": "#6aa7cb", + "pos": [ + 30, + 18, + 24 + ] + } + ], + "dir": 2.14, + "hemi": 1.42, + "amb": 0, + "pontual": 0, + "global": 3.56 + }, + "vm": { + "lights": [ + { + "type": "DirectionalLight", + "intensity": 1.499, + "color": "#d8ede7", + "pos": [ + -0.45, + 0.75, + 0.55 + ] + }, + { + "type": "DirectionalLight", + "intensity": 0.543, + "color": "#70a9ff", + "pos": [ + 0.6, + -0.15, + 0.5 + ] + }, + { + "type": "DirectionalLight", + "intensity": 0.17, + "color": "#77adff", + "pos": [ + 0.55, + 0.35, + 0.75 + ] + }, + { + "type": "DirectionalLight", + "intensity": 0.749, + "color": "#d8dbc6", + "pos": [ + 0.2, + 0.35, + -0.9 + ] + }, + { + "type": "DirectionalLight", + "intensity": 0.398, + "color": "#d8bc91", + "pos": [ + -0.2, + -0.86, + 0.47 + ] + }, + { + "type": "HemisphereLight", + "intensity": 0.611, + "color": "#659dff", + "pos": [ + 0, + 1, + 0 + ], + "ground": "#24282a" + } + ], + "dir": 3.36, + "hemi": 0.611, + "amb": 0, + "pontual": 0, + "global": 3.971 + }, + "razaoVmMapa": 1.12, + "env": { + "cena": true, + "vm": true, + "mesmaTextura": true + }, + "fog": { + "tipo": "Fog", + "cor": "#a8bfcd", + "densidade": null, + "near": 62, + "far": 135 + }, + "look": { + "exposure": 2.4, + "floor": 0.0042, + "expAces": 2.61, + "sat": 1.12 + }, + "superficies": [], + "fumaca": { + "sprites": 18, + "raio": 4, + "duracao": 13, + "corSprite": "#6d89a4", + "opacidadeSprite": 0.953, + "escalaSprite": [ + 3.02, + 5.06 + ], + "spritesCobrindoCentro": 8, + "alfaAcumuladoCentro": 0.9915, + "maiorAlfaSprite": 0.72, + "radianciaFumaca": 0.2379, + "radianciaCeu": 0.3172, + "razaoFumacaCeu": 0.75, + "fonteCeu": "bloom.js skyRadiance(treta_no_gelo) — AERIAL, medida por r3_fog.py" + }, + "nevoa": { + "cor": "#a8bfcd", + "radianciaNevoa": 0.4999, + "radianciaNevoaContraluz": 0.752, + "fogFactor": { + "m50": null, + "m100": null, + "m200": null + } + } } ], "shade": { - "gerado": "2026-08-16T03:27:47.239Z", + "gerado": "2026-08-18T22:49:49.054Z", "armas": [ { "arma": "ak", @@ -3251,6 +3430,84 @@ "matiz": 37.44059839474892, "metal_ef": 0.28665568627450977, "rough_ef": 0.43389176470588225 + }, + "vm@treta_no_gelo": { + "Lmean": 38.87353814922729, + "Lmedia_por_texel": 41.39897500180011, + "Lp05": 15.523107112790289, + "Lp50": 39.23434997419274, + "Lp95": 59.884629180492965, + "Lp99": 89.7341944061984, + "pct_preto": 1.6929391304347823, + "pct_branco": 0.8331826086956524, + "rgb": [ + 0.14103280686039696, + 0.12574537679584682, + 0.12972362084044498 + ], + "Lab": [ + 12.742294374796096, + 2.0860217281085944, + -0.015884244466013442 + ], + "aStar": 2.0860217281085944, + "bStar": -0.015884244466013442, + "croma": 2.086082203405087, + "matiz": 359.5637233461647, + "metal_ef": 0.28665568627450977, + "rough_ef": 0.43389176470588225 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 48.13107253625702, + "Lmedia_por_texel": 50.10357814189081, + "Lp05": 20.76762464214265, + "Lp50": 49.49877694296353, + "Lp95": 68.46962112879574, + "Lp99": 94.40537703696441, + "pct_preto": 0.032626086956521735, + "pct_branco": 1.1760000000000006, + "rgb": [ + 0.20974237597284032, + 0.193606657190744, + 0.2007768097795256 + ], + "Lab": [ + 20.975010350654415, + 2.2349385874367025, + -0.5026040047420466 + ], + "aStar": 2.2349385874367025, + "bStar": -0.5026040047420466, + "croma": 2.2907556122808708, + "matiz": 347.32589207362156, + "metal_ef": 0.15766062745098042, + "rough_ef": 0.43389176470588225 + }, + "chao@treta_no_gelo": { + "Lmean": 36.116121646365585, + "Lmedia_por_texel": 39.72974134913669, + "Lp05": 10.907993327856044, + "Lp50": 36.179777843932264, + "Lp95": 65.9293047500833, + "Lp99": 77.63372743035028, + "pct_preto": 6.158956521739129, + "pct_branco": 0, + "rgb": [ + 0.13089537135485677, + 0.11525487878500522, + 0.11755642165857577 + ], + "Lab": [ + 11.423078958738007, + 2.0539619600813683, + 0.2946442103233915 + ], + "aStar": 2.0539619600813683, + "bStar": 0.2946442103233915, + "croma": 2.0749879383115437, + "matiz": 8.163480469161755, + "metal_ef": 0.28665568627450977, + "rough_ef": 0.43389176470588225 } } }, @@ -3807,6 +4064,84 @@ "matiz": 58.58285655883628, "metal_ef": 0.429675294117647, "rough_ef": 0.503193725490196 + }, + "vm@treta_no_gelo": { + "Lmean": 45.464412622036136, + "Lmedia_por_texel": 47.06605435915872, + "Lp05": 30.51981396041041, + "Lp50": 44.16960303232291, + "Lp95": 58.60196942277969, + "Lp99": 86.58386737116123, + "pct_preto": 0, + "pct_branco": 0.3165217391304351, + "rgb": [ + 0.17701049051289552, + 0.15793019376658354, + 0.14631758963828853 + ], + "Lab": [ + 16.663380433398046, + 1.5975476572977487, + 2.7584833769576766 + ], + "aStar": 1.5975476572977487, + "bStar": 2.7584833769576766, + "croma": 3.187693375826689, + "matiz": 59.923157894576434, + "metal_ef": 0.429675294117647, + "rough_ef": 0.503193725490196 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 55.901562679417886, + "Lmedia_por_texel": 57.09565369085474, + "Lp05": 42.09268356630335, + "Lp50": 55.742347475361925, + "Lp95": 68.49632572588025, + "Lp99": 92.08408360692005, + "pct_preto": 0, + "pct_branco": 1.0498782608695658, + "rgb": [ + 0.2672997936683356, + 0.24702984530676025, + 0.23276439269532498 + ], + "Lab": [ + 27.041642467655777, + 1.4582055390484905, + 3.025031646100307 + ], + "aStar": 1.4582055390484905, + "bStar": 3.025031646100307, + "croma": 3.358151255381453, + "matiz": 64.26377716419938, + "metal_ef": 0.23632141176470586, + "rough_ef": 0.503193725490196 + }, + "chao@treta_no_gelo": { + "Lmean": 42.35589660059481, + "Lmedia_por_texel": 44.83588598276543, + "Lp05": 25.984117736886198, + "Lp50": 41.074371875640196, + "Lp95": 70.90504032204592, + "Lp99": 72.6738471827351, + "pct_preto": 0, + "pct_branco": 0, + "rgb": [ + 0.16197394054517472, + 0.14170141788408408, + 0.12827097312004618 + ], + "Lab": [ + 14.71139944934363, + 1.6827044318610818, + 3.170298707389163 + ], + "aStar": 1.6827044318610818, + "bStar": 3.170298707389163, + "croma": 3.589190451770193, + "matiz": 62.04190816670007, + "metal_ef": 0.429675294117647, + "rough_ef": 0.503193725490196 } } }, @@ -4363,6 +4698,84 @@ "matiz": 202.4916518912684, "metal_ef": 0.2696, "rough_ef": 0.3459592156862745 + }, + "vm@treta_no_gelo": { + "Lmean": 35.21498534763821, + "Lmedia_por_texel": 37.97134664356583, + "Lp05": 16.506198898704547, + "Lp50": 34.72216650962368, + "Lp95": 52.559921217974235, + "Lp99": 95.13593837020713, + "pct_preto": 0.41419130434782614, + "pct_branco": 1.1263304347826095, + "rgb": [ + 0.0821359249493859, + 0.10859993666410972, + 0.12171088548852886 + ], + "Lab": [ + 9.592749144499532, + -2.0894989670082467, + -3.3357038593554544 + ], + "aStar": -2.0894989670082467, + "bStar": -3.3357038593554544, + "croma": 3.9361054572314758, + "matiz": 237.9367974769666, + "metal_ef": 0.2696, + "rough_ef": 0.3459592156862745 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 43.97369544177676, + "Lmedia_por_texel": 46.09318376626837, + "Lp05": 24.8856009028531, + "Lp50": 43.93073981405377, + "Lp95": 60.46646164082114, + "Lp99": 97.80165616391821, + "pct_preto": 0.03144347826086956, + "pct_branco": 1.1915826086956527, + "rgb": [ + 0.12513168855071669, + 0.16349674469610959, + 0.18178926735692946 + ], + "Lab": [ + 16.20423659812429, + -2.876437514646335, + -4.432856749099479 + ], + "aStar": -2.876437514646335, + "bStar": -4.432856749099479, + "croma": 5.284326989664964, + "matiz": 237.02085396297065, + "metal_ef": 0.14828000000000002, + "rough_ef": 0.3459592156862745 + }, + "chao@treta_no_gelo": { + "Lmean": 33.403351877327026, + "Lmedia_por_texel": 36.78571123923444, + "Lp05": 13.49748918148865, + "Lp50": 31.969217400139144, + "Lp95": 63.36060992239125, + "Lp99": 67.7109485747606, + "pct_preto": 2.407304347826087, + "pct_branco": 0, + "rgb": [ + 0.0765571815601091, + 0.10191711087162067, + 0.11191949847012163 + ], + "Lab": [ + 8.72597635630553, + -2.2242646323981234, + -2.772822696232591 + ], + "aStar": -2.2242646323981234, + "bStar": -2.772822696232591, + "croma": 3.554700952215212, + "matiz": 231.26459249931094, + "metal_ef": 0.2696, + "rough_ef": 0.3459592156862745 } } }, @@ -4919,6 +5332,84 @@ "matiz": 49.324648885352985, "metal_ef": 0.5445505882352941, "rough_ef": 0.60392 + }, + "vm@treta_no_gelo": { + "Lmean": 45.52553366986617, + "Lmedia_por_texel": 47.31689404265745, + "Lp05": 27.26319666859588, + "Lp50": 45.10042712365696, + "Lp95": 62.26418770797849, + "Lp99": 69.31212575740325, + "pct_preto": 0.003895652173913043, + "pct_branco": 0.4080695652173915, + "rgb": [ + 0.18972173555385355, + 0.15808923331772123, + 0.14709854257623325 + ], + "Lab": [ + 17.052110143582397, + 3.1599532394175345, + 3.2238901504497375 + ], + "aStar": 3.1599532394175345, + "bStar": 3.2238901504497375, + "croma": 4.514285345154003, + "matiz": 45.57382245355575, + "metal_ef": 0.5445505882352941, + "rough_ef": 0.60392 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 57.2145597848579, + "Lmedia_por_texel": 58.32108783304512, + "Lp05": 42.23099809025652, + "Lp50": 57.19909525439398, + "Lp95": 71.6095977721808, + "Lp99": 77.63208813338458, + "pct_preto": 0, + "pct_branco": 0.6914782608695655, + "rgb": [ + 0.2918250336587278, + 0.25787922021924403, + 0.2487835687067391 + ], + "Lab": [ + 28.654821825129545, + 3.231120630371731, + 2.7594228434330126 + ], + "aStar": 3.231120630371731, + "bStar": 2.7594228434330126, + "croma": 4.249065186234938, + "matiz": 40.49779672109605, + "metal_ef": 0.2995028235294118, + "rough_ef": 0.60392 + }, + "chao@treta_no_gelo": { + "Lmean": 41.51068485642224, + "Lmedia_por_texel": 44.5150619268876, + "Lp05": 20.519224912697993, + "Lp50": 41.292283694321945, + "Lp95": 66.9980520453881, + "Lp99": 79.3965171117403, + "pct_preto": 0.05606956521739129, + "pct_branco": 0, + "rgb": [ + 0.16982219410449848, + 0.13786762895480012, + 0.12571428165976503 + ], + "Lab": [ + 14.602693160857356, + 3.2217928081786082, + 3.5133633158832334 + ], + "aStar": 3.2217928081786082, + "bStar": 3.5133633158832334, + "croma": 4.766935146215588, + "matiz": 47.47883417511565, + "metal_ef": 0.5445505882352941, + "rough_ef": 0.60392 } } }, @@ -5475,6 +5966,84 @@ "matiz": 267.1059206479258, "metal_ef": 0.6823058823529411, "rough_ef": 0.3891749019607843 + }, + "vm@treta_no_gelo": { + "Lmean": 39.42907759403769, + "Lmedia_por_texel": 42.10972242320386, + "Lp05": 17.55976963575339, + "Lp50": 39.22518974254199, + "Lp95": 62.0376286505966, + "Lp99": 88.65043313038701, + "pct_preto": 1.3132521739130434, + "pct_branco": 0.9237565217391309, + "rgb": [ + 0.1108186021064146, + 0.1357015797998718, + 0.16768883192557885 + ], + "Lab": [ + 13.242585353878052, + -0.43494230281740376, + -6.365020879419081 + ], + "aStar": -0.43494230281740376, + "bStar": -6.365020879419081, + "croma": 6.379864073961213, + "matiz": 266.0908724215255, + "metal_ef": 0.6823058823529411, + "rough_ef": 0.3891749019607843 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 52.44719426898714, + "Lmedia_por_texel": 53.96210306155104, + "Lp05": 28.15506735890004, + "Lp50": 53.26506178591623, + "Lp95": 71.95403282387674, + "Lp99": 93.64959919207126, + "pct_preto": 0, + "pct_branco": 1.0372173913043485, + "rgb": [ + 0.19405096354761228, + 0.23618968536594956, + 0.28858922055783215 + ], + "Lab": [ + 24.981452427806822, + -0.7234170537232798, + -9.607750586717334 + ], + "aStar": -0.7234170537232798, + "bStar": -9.607750586717334, + "croma": 9.634946993636495, + "matiz": 265.69403059340004, + "metal_ef": 0.3752682352941177, + "rough_ef": 0.3891749019607843 + }, + "chao@treta_no_gelo": { + "Lmean": 36.99897668681528, + "Lmedia_por_texel": 40.54270792581937, + "Lp05": 13.877463655628027, + "Lp50": 35.4427275368467, + "Lp95": 64.98275741452386, + "Lp99": 79.83900709251506, + "pct_preto": 3.3367652173913043, + "pct_branco": 0, + "rgb": [ + 0.10027276617068816, + 0.1254763729332715, + 0.15563780135628705 + ], + "Lab": [ + 11.94337251958552, + -0.5925522465346639, + -6.130981812492825 + ], + "aStar": -0.5925522465346639, + "bStar": -6.130981812492825, + "croma": 6.159549995737602, + "matiz": 264.4795758359128, + "metal_ef": 0.6823058823529411, + "rough_ef": 0.3891749019607843 } } }, @@ -6031,6 +6600,84 @@ "matiz": 261.7609737481189, "metal_ef": 0.6201584313725491, "rough_ef": 0.376398431372549 + }, + "vm@treta_no_gelo": { + "Lmean": 37.35363334369719, + "Lmedia_por_texel": 40.538563812982346, + "Lp05": 15.12002508100759, + "Lp50": 37.68768882767433, + "Lp95": 59.38012085401721, + "Lp99": 96.46593591443028, + "pct_preto": 1.0025043478260869, + "pct_branco": 1.2052173913043487, + "rgb": [ + 0.10793976165352379, + 0.12264930210547086, + 0.13704337555357568 + ], + "Lab": [ + 11.659324694740043, + -0.7076894486461455, + -3.076354254094271 + ], + "aStar": -0.7076894486461455, + "bStar": -3.076354254094271, + "croma": 3.156703953874833, + "matiz": 257.04497186372214, + "metal_ef": 0.6201584313725491, + "rough_ef": 0.376398431372549 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 49.03975923704451, + "Lmedia_por_texel": 51.07715985195497, + "Lp05": 20.45451259996559, + "Lp50": 50.54820590928463, + "Lp95": 69.6340891850245, + "Lp99": 98.61628973452102, + "pct_preto": 0.008626086956521738, + "pct_branco": 1.2096000000000007, + "rgb": [ + 0.181657673795918, + 0.20754484537204348, + 0.23285390302405196 + ], + "Lab": [ + 21.75282945168351, + -1.1089211779818364, + -4.99016217842827 + ], + "aStar": -1.1089211779818364, + "bStar": -4.99016217842827, + "croma": 5.111890525626757, + "matiz": 257.47123332731843, + "metal_ef": 0.34108713725490203, + "rough_ef": 0.376398431372549 + }, + "chao@treta_no_gelo": { + "Lmean": 34.16791739156404, + "Lmedia_por_texel": 38.62984584466098, + "Lp05": 12.492910161428398, + "Lp50": 32.83044002864294, + "Lp95": 66.42516614350563, + "Lp99": 79.92738088377783, + "pct_preto": 4.148869565217391, + "pct_branco": 0, + "rgb": [ + 0.09460272264583587, + 0.11073820569804992, + 0.12581609014646639 + ], + "Lab": [ + 10.124502597164362, + -0.8134307114229244, + -3.289850769683617 + ], + "aStar": -0.8134307114229244, + "bStar": -3.289850769683617, + "croma": 3.388921304644575, + "matiz": 256.1118992056103, + "metal_ef": 0.6201584313725491, + "rough_ef": 0.376398431372549 } } }, @@ -6587,6 +7234,84 @@ "matiz": 146.9894526537048, "metal_ef": 0.5187654901960784, "rough_ef": 0.2633960784313725 + }, + "vm@treta_no_gelo": { + "Lmean": 31.703404179545114, + "Lmedia_por_texel": 35.423913889680094, + "Lp05": 10.427729222836827, + "Lp50": 31.063405107215935, + "Lp95": 55.04260260813216, + "Lp99": 94.20518266741384, + "pct_preto": 10.626921739130434, + "pct_branco": 1.0528000000000008, + "rgb": [ + 0.0841635140639936, + 0.09713622656753633, + 0.10219480984537109 + ], + "Lab": [ + 8.348680308539006, + -1.2104279483112075, + -1.4423847998264572 + ], + "aStar": -1.2104279483112075, + "bStar": -1.4423847998264572, + "croma": 1.8829789507116876, + "matiz": 229.99712374189482, + "metal_ef": 0.5187654901960784, + "rough_ef": 0.2633960784313725 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 42.308783023314426, + "Lmedia_por_texel": 44.62177921172991, + "Lp05": 22.571267724837504, + "Lp50": 41.555890543870625, + "Lp95": 63.63054470014269, + "Lp99": 97.19012657586501, + "pct_preto": 0.05697391304347826, + "pct_branco": 1.1088000000000007, + "rgb": [ + 0.13188948713350027, + 0.1540151941685378, + 0.16524768322384717 + ], + "Lab": [ + 15.334654048239145, + -1.7279428293978938, + -2.7322261490544064 + ], + "aStar": -1.7279428293978938, + "bStar": -2.7322261490544064, + "croma": 3.232776848352554, + "matiz": 237.6894960198333, + "metal_ef": 0.2853210196078431, + "rough_ef": 0.2633960784313725 + }, + "chao@treta_no_gelo": { + "Lmean": 30.559817363659803, + "Lmedia_por_texel": 33.877022832881366, + "Lp05": 9.888070441024546, + "Lp50": 29.13828161661806, + "Lp95": 58.16944041631871, + "Lp99": 68.28415117918506, + "pct_preto": 12.84250434782609, + "pct_branco": 0, + "rgb": [ + 0.07724556322885508, + 0.08985471880307283, + 0.09357486321121528 + ], + "Lab": [ + 7.409435390198741, + -1.196208367869045, + -1.1738346813852663 + ], + "aStar": -1.196208367869045, + "bStar": -1.1738346813852663, + "croma": 1.6759481849337627, + "matiz": 224.45913230154014, + "metal_ef": 0.5187654901960784, + "rough_ef": 0.2633960784313725 } } }, @@ -7143,6 +7868,84 @@ "matiz": 264.7737704423674, "metal_ef": 0.35726274509803924, "rough_ef": 0.4065349019607843 + }, + "vm@treta_no_gelo": { + "Lmean": 34.3242092623857, + "Lmedia_por_texel": 37.01742857299168, + "Lp05": 20.147915575975865, + "Lp50": 32.59005324078035, + "Lp95": 49.09938164549996, + "Lp99": 92.80492414590958, + "pct_preto": 0.1328, + "pct_branco": 1.0172521739130438, + "rgb": [ + 0.0788714586602507, + 0.09827569724853713, + 0.1228262502418717 + ], + "Lab": [ + 8.553489578219853, + -0.39955510100198044, + -5.1203966529679015 + ], + "aStar": -0.39955510100198044, + "bStar": -5.1203966529679015, + "croma": 5.135962048386027, + "matiz": 265.5381337181112, + "metal_ef": 0.35726274509803924, + "rough_ef": 0.4065349019607843 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 43.70806993386795, + "Lmedia_por_texel": 45.763792739237154, + "Lp05": 28.800816702455826, + "Lp50": 42.85263676982434, + "Lp95": 58.05272293310489, + "Lp99": 96.34369232792527, + "pct_preto": 0, + "pct_branco": 1.1331478260869572, + "rgb": [ + 0.1254380863428362, + 0.15499372146873078, + 0.1909022390508027 + ], + "Lab": [ + 15.547497152964812, + -0.6265691264479845, + -7.061688595252058 + ], + "aStar": -0.6265691264479845, + "bStar": -7.061688595252058, + "croma": 7.089431196261853, + "matiz": 264.92954131227907, + "metal_ef": 0.1964945098039216, + "rough_ef": 0.4065349019607843 + }, + "chao@treta_no_gelo": { + "Lmean": 32.148291079562746, + "Lmedia_por_texel": 35.68236714132979, + "Lp05": 16.799558056864086, + "Lp50": 30.446939172641542, + "Lp95": 63.540686645607536, + "Lp99": 67.92712515621784, + "pct_preto": 0.4448695652173912, + "pct_branco": 0, + "rgb": [ + 0.07289726879275694, + 0.09125462811703557, + 0.11210558193612247 + ], + "Lab": [ + 7.628912094668337, + -0.5617485160786528, + -4.462294399237093 + ], + "aStar": -0.5617485160786528, + "bStar": -4.462294399237093, + "croma": 4.497514057874561, + "matiz": 262.82490336221446, + "metal_ef": 0.35726274509803924, + "rough_ef": 0.4065349019607843 } } }, @@ -7699,6 +8502,84 @@ "matiz": 267.59978504113303, "metal_ef": 0.33774901960784315, "rough_ef": 0.5028125490196079 + }, + "vm@treta_no_gelo": { + "Lmean": 33.17803118951315, + "Lmedia_por_texel": 35.18008585686794, + "Lp05": 16.081375909456547, + "Lp50": 32.08395628200324, + "Lp95": 60.95325122148043, + "Lp99": 69.79296628005764, + "pct_preto": 0.03353043478260869, + "pct_branco": 0.40563478260869584, + "rgb": [ + 0.08092079543064373, + 0.09912219079841754, + 0.12290099200387568 + ], + "Lab": [ + 8.681879936264586, + -0.3376047377551955, + -4.935875762281672 + ], + "aStar": -0.3376047377551955, + "bStar": -4.935875762281672, + "croma": 4.9474080587348395, + "matiz": 266.0871692745303, + "metal_ef": 0.33774901960784315, + "rough_ef": 0.5028125490196079 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 43.79188446659612, + "Lmedia_por_texel": 45.34829464205235, + "Lp05": 21.238320019752607, + "Lp50": 40.79313998685027, + "Lp95": 73.02023838272578, + "Lp99": 78.22848806821084, + "pct_preto": 0, + "pct_branco": 0.4168347826086959, + "rgb": [ + 0.14618113328138432, + 0.1765634709453954, + 0.21363791906519145 + ], + "Lab": [ + 18.133387685217606, + -0.66061436816503, + -7.1570410036366 + ], + "aStar": -0.66061436816503, + "bStar": -7.1570410036366, + "croma": 7.187464592689252, + "matiz": 264.72638639804154, + "metal_ef": 0.18576196078431373, + "rough_ef": 0.5028125490196079 + }, + "chao@treta_no_gelo": { + "Lmean": 30.64729082032788, + "Lmedia_por_texel": 33.52363237592698, + "Lp05": 11.638421220279, + "Lp50": 28.09624462059628, + "Lp95": 56.98959487539216, + "Lp99": 71.30345429803667, + "pct_preto": 7.397704347826087, + "pct_branco": 0, + "rgb": [ + 0.07483655205750075, + 0.09166537708774831, + 0.11309700514199467 + ], + "Lab": [ + 7.722787331570149, + -0.36058752627829427, + -4.508806963131046 + ], + "aStar": -0.36058752627829427, + "bStar": -4.508806963131046, + "croma": 4.523202802758959, + "matiz": 265.42755645730045, + "metal_ef": 0.33774901960784315, + "rough_ef": 0.5028125490196079 } } }, @@ -8255,6 +9136,84 @@ "matiz": 266.7883395236812, "metal_ef": 0.49659294117647057, "rough_ef": 0.34850039215686274 + }, + "vm@treta_no_gelo": { + "Lmean": 33.41334890374441, + "Lmedia_por_texel": 36.665998633190156, + "Lp05": 14.173527174302055, + "Lp50": 32.381454318711114, + "Lp95": 54.78444599705037, + "Lp99": 91.99210733556073, + "pct_preto": 2.359373913043478, + "pct_branco": 0.9987478260869567, + "rgb": [ + 0.08212483569472556, + 0.09959143449136898, + 0.12215975455379528 + ], + "Lab": [ + 8.745775822988811, + -0.3590493994262145, + -4.694455433527528 + ], + "aStar": -0.3590493994262145, + "bStar": -4.694455433527528, + "croma": 4.708166127974295, + "matiz": 265.62632089153567, + "metal_ef": 0.49659294117647057, + "rough_ef": 0.34850039215686274 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 44.40651781611572, + "Lmedia_por_texel": 46.614639898745416, + "Lp05": 21.60206684330069, + "Lp50": 44.636318360109286, + "Lp95": 65.3250047037336, + "Lp99": 95.83666100486771, + "pct_preto": 0.12132173913043476, + "pct_branco": 1.211060869565218, + "rgb": [ + 0.13944873756392548, + 0.16866195983843899, + 0.20429129098551838 + ], + "Lab": [ + 17.1992670786245, + -0.6435478040356657, + -6.927350226572093 + ], + "aStar": -0.6435478040356657, + "bStar": -6.927350226572093, + "croma": 6.957178662192567, + "matiz": 264.69248072475546, + "metal_ef": 0.27312611764705885, + "rough_ef": 0.34850039215686274 + }, + "chao@treta_no_gelo": { + "Lmean": 31.544727814385208, + "Lmedia_por_texel": 35.4074791483367, + "Lp05": 11.363716828105474, + "Lp50": 29.459508395164946, + "Lp95": 62.43008730366539, + "Lp99": 71.07406037351186, + "pct_preto": 6.096347826086958, + "pct_branco": 0, + "rgb": [ + 0.07547595104688548, + 0.09294691646542524, + 0.11380268228805555 + ], + "Lab": [ + 7.865375572603931, + -0.48167997871245705, + -4.429236349546784 + ], + "aStar": -0.48167997871245705, + "bStar": -4.429236349546784, + "croma": 4.45535074287524, + "matiz": 263.79346785471336, + "metal_ef": 0.49659294117647057, + "rough_ef": 0.34850039215686274 } } }, @@ -8811,6 +9770,84 @@ "matiz": 267.1806582710731, "metal_ef": 0.749035294117647, "rough_ef": 0.5204564705882353 + }, + "vm@treta_no_gelo": { + "Lmean": 27.107150676521076, + "Lmedia_por_texel": 30.472752073238183, + "Lp05": 9.397792736934559, + "Lp50": 25.344449161348585, + "Lp95": 50.288211818343726, + "Lp99": 85.99382539579192, + "pct_preto": 11.793530434782609, + "pct_branco": 0.0073043478260869585, + "rgb": [ + 0.06128202155506181, + 0.0705455645595634, + 0.08001724264171325 + ], + "Lab": [ + 5.339463840879684, + -0.3468629875081619, + -1.7455532343596536 + ], + "aStar": -0.3468629875081619, + "bStar": -1.7455532343596536, + "croma": 1.7796825632922673, + "matiz": 258.7610243261027, + "metal_ef": 0.749035294117647, + "rough_ef": 0.5204564705882353 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 38.91717603266631, + "Lmedia_por_texel": 41.3871689629251, + "Lp05": 18.435595328570187, + "Lp50": 38.238389099477246, + "Lp95": 61.9580221839434, + "Lp99": 92.00324923490258, + "pct_preto": 0.05071304347826086, + "pct_branco": 1.0006956521739134, + "rgb": [ + 0.11264619971797776, + 0.13090558596731938, + 0.15008930903968037 + ], + "Lab": [ + 12.658011190452847, + -0.7389506363917608, + -3.997268512632507 + ], + "aStar": -0.7389506363917608, + "bStar": -3.997268512632507, + "croma": 4.064997368401004, + "matiz": 259.52632208320426, + "metal_ef": 0.4119694117647059, + "rough_ef": 0.5204564705882353 + }, + "chao@treta_no_gelo": { + "Lmean": 24.068228074804427, + "Lmedia_por_texel": 28.818688878533244, + "Lp05": 7.215634338851766, + "Lp50": 20.035368854879643, + "Lp95": 56.55471070686208, + "Lp99": 69.85367005828134, + "pct_preto": 23.795339130434787, + "pct_branco": 0, + "rgb": [ + 0.053546918461484336, + 0.06239175431866739, + 0.07185630902875881 + ], + "Lab": [ + 4.546008809764206, + -0.2775581218675549, + -1.5795486299268469 + ], + "aStar": -0.2775581218675549, + "bStar": -1.5795486299268469, + "croma": 1.6037494771062042, + "matiz": 260.03373801140003, + "metal_ef": 0.749035294117647, + "rough_ef": 0.5204564705882353 } } }, @@ -9367,6 +10404,84 @@ "matiz": 267.2649705649817, "metal_ef": 0.38976, "rough_ef": 0.43755921568627454 + }, + "vm@treta_no_gelo": { + "Lmean": 30.495351512842166, + "Lmedia_por_texel": 33.74480842217129, + "Lp05": 12.394493595399897, + "Lp50": 29.513363504612755, + "Lp95": 50.2906595437784, + "Lp99": 90.06667843105053, + "pct_preto": 4.432765217391303, + "pct_branco": 0.8867478260869567, + "rgb": [ + 0.06780257976666627, + 0.08399411125297715, + 0.10514503747986063 + ], + "Lab": [ + 6.792215552156929, + -0.27813931244778656, + -4.3689249696337304 + ], + "aStar": -0.27813931244778656, + "bStar": -4.3689249696337304, + "croma": 4.377769622469645, + "matiz": 266.3572889742566, + "metal_ef": 0.38976, + "rough_ef": 0.43755921568627454 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 39.691005501735575, + "Lmedia_por_texel": 42.27114821341745, + "Lp05": 19.271493471314926, + "Lp50": 39.41842150174219, + "Lp95": 59.90620545536724, + "Lp99": 94.63214559305523, + "pct_preto": 0.08514782608695647, + "pct_branco": 1.1521391304347832, + "rgb": [ + 0.10911067371532049, + 0.13455490922224989, + 0.166628444675426 + ], + "Lab": [ + 13.089327618693119, + -0.48164760159181974, + -6.406069456770968 + ], + "aStar": -0.48164760159181974, + "bStar": -6.406069456770968, + "croma": 6.424150550624809, + "matiz": 265.7002417347569, + "metal_ef": 0.21436800000000003, + "rough_ef": 0.43755921568627454 + }, + "chao@treta_no_gelo": { + "Lmean": 28.04608723445087, + "Lmedia_por_texel": 32.36688232748994, + "Lp05": 9.441564975960098, + "Lp50": 25.21631411043866, + "Lp95": 61.135426497689096, + "Lp99": 68.84078413859872, + "pct_preto": 11.312417391304349, + "pct_branco": 0, + "rgb": [ + 0.061990899827061983, + 0.07725770969860556, + 0.09594354164328954 + ], + "Lab": [ + 6.017474703246343, + -0.3335739018041767, + -3.71521960950823 + ], + "aStar": -0.3335739018041767, + "bStar": -3.71521960950823, + "croma": 3.7301646471488823, + "matiz": 264.8694107841204, + "metal_ef": 0.38976, + "rough_ef": 0.43755921568627454 } } }, @@ -9923,6 +11038,84 @@ "matiz": 297.13782104957784, "metal_ef": 0.7195058823529412, "rough_ef": 0.39399372549019607 + }, + "vm@treta_no_gelo": { + "Lmean": 33.15736402319425, + "Lmedia_por_texel": 36.65190775013295, + "Lp05": 11.620429513864472, + "Lp50": 32.42346173817829, + "Lp95": 56.21450333604275, + "Lp99": 93.68391815937305, + "pct_preto": 5.378295652173913, + "pct_branco": 1.0625391304347835, + "rgb": [ + 0.0919143589299741, + 0.09918751611005804, + 0.1163794514697143 + ], + "Lab": [ + 8.885208745164434, + 0.34839486841174716, + -3.352064078370798 + ], + "aStar": 0.34839486841174716, + "bStar": -3.352064078370798, + "croma": 3.370120557166984, + "matiz": 275.933699374639, + "metal_ef": 0.7195058823529412, + "rough_ef": 0.39399372549019607 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 45.55235272032207, + "Lmedia_por_texel": 47.72948998324039, + "Lp05": 20.768423983372585, + "Lp50": 45.761902513211155, + "Lp95": 67.20372338521655, + "Lp99": 96.83550645471814, + "pct_preto": 0.18573913043478257, + "pct_branco": 1.199860869565218, + "rgb": [ + 0.15970954389725653, + 0.17627438358336261, + 0.20798686080166262 + ], + "Lab": [ + 18.347683992587392, + 0.3157991171045538, + -5.805341664668163 + ], + "aStar": 0.3157991171045538, + "bStar": -5.805341664668163, + "croma": 5.813924743742056, + "matiz": 273.1137083227966, + "metal_ef": 0.3957282352941177, + "rough_ef": 0.39399372549019607 + }, + "chao@treta_no_gelo": { + "Lmean": 30.329739417405513, + "Lmedia_por_texel": 35.06326196175039, + "Lp05": 9.103265359715024, + "Lp50": 27.54358712313499, + "Lp95": 63.94607661845403, + "Lp99": 77.72648524273826, + "pct_preto": 11.06587826086956, + "pct_branco": 0, + "rgb": [ + 0.08204716302953717, + 0.09018182571719945, + 0.10776511825376135 + ], + "Lab": [ + 7.7013305425694725, + 0.2851415953430969, + -3.4891722955890825 + ], + "aStar": 0.2851415953430969, + "bStar": -3.4891722955890825, + "croma": 3.500804055885047, + "matiz": 274.6719347916955, + "metal_ef": 0.7195058823529412, + "rough_ef": 0.39399372549019607 } } }, @@ -10454,29 +11647,107 @@ "metal_ef": 0.31524015686274515, "rough_ef": 0.4820533333333334 }, - "chao@atacadao_treta": { - "Lmean": 33.10181593903698, - "Lmedia_por_texel": 35.53680587097878, - "Lp05": 14.741312043692226, - "Lp50": 32.860021038207734, - "Lp95": 54.57718378134203, - "Lp99": 63.49591056093847, - "pct_preto": 2.997286956521739, + "chao@atacadao_treta": { + "Lmean": 33.10181593903698, + "Lmedia_por_texel": 35.53680587097878, + "Lp05": 14.741312043692226, + "Lp50": 32.860021038207734, + "Lp95": 54.57718378134203, + "Lp99": 63.49591056093847, + "pct_preto": 2.997286956521739, + "pct_branco": 0, + "rgb": [ + 0.08693473272134704, + 0.09050970274627014, + 0.09739835488863673 + ], + "Lab": [ + 7.749740864303487, + 0.03322937788459435, + -1.3900238810237775 + ], + "aStar": 0.03322937788459435, + "bStar": -1.3900238810237775, + "croma": 1.3904210086772286, + "matiz": 271.36943010766055, + "metal_ef": 0.5731639215686275, + "rough_ef": 0.4820533333333334 + }, + "vm@treta_no_gelo": { + "Lmean": 36.40555472143309, + "Lmedia_por_texel": 39.10776958229938, + "Lp05": 18.184797008308088, + "Lp50": 35.218150787620544, + "Lp95": 58.724325625827774, + "Lp99": 84.39700803218942, + "pct_preto": 1.1993043478260865, + "pct_branco": 0.6130782608695656, + "rgb": [ + 0.09981422828746887, + 0.1124088990435658, + 0.12644836177829663 + ], + "Lab": [ + 10.412229289312773, + -0.49766461639681736, + -2.9665633770911306 + ], + "aStar": -0.49766461639681736, + "bStar": -2.9665633770911306, + "croma": 3.008017343818304, + "matiz": 260.47685205650305, + "metal_ef": 0.5731639215686275, + "rough_ef": 0.4820533333333334 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 48.04810814140434, + "Lmedia_por_texel": 49.82071566494767, + "Lp05": 28.217917376357555, + "Lp50": 48.07865293863584, + "Lp95": 68.42412637157834, + "Lp99": 90.74338621586897, + "pct_preto": 0, + "pct_branco": 0.8550956521739135, + "rgb": [ + 0.1699544423251823, + 0.19238216787792226, + 0.21725920356456427 + ], + "Lab": [ + 20.051917179182638, + -0.7849571564647606, + -4.853379296628346 + ], + "aStar": -0.7849571564647606, + "bStar": -4.853379296628346, + "croma": 4.916446718355229, + "matiz": 260.8128702247625, + "metal_ef": 0.31524015686274515, + "rough_ef": 0.4820533333333334 + }, + "chao@treta_no_gelo": { + "Lmean": 32.63633221291781, + "Lmedia_por_texel": 36.75549833077598, + "Lp05": 13.916703204621953, + "Lp50": 30.75753266702528, + "Lp95": 62.86608902117837, + "Lp99": 79.59103649268907, + "pct_preto": 3.435965217391305, "pct_branco": 0, "rgb": [ - 0.08693473272134704, - 0.09050970274627014, - 0.09739835488863673 + 0.08580882665151002, + 0.09846968109655235, + 0.1118883845566064 ], "Lab": [ - 7.749740864303487, - 0.03322937788459435, - -1.3900238810237775 + 8.615786490415129, + -0.5494322642377453, + -2.9083169141607246 ], - "aStar": 0.03322937788459435, - "bStar": -1.3900238810237775, - "croma": 1.3904210086772286, - "matiz": 271.36943010766055, + "aStar": -0.5494322642377453, + "bStar": -2.9083169141607246, + "croma": 2.959760646771758, + "matiz": 259.30190067496494, "metal_ef": 0.5731639215686275, "rough_ef": 0.4820533333333334 } @@ -11035,6 +12306,84 @@ "matiz": 21.20474427395783, "metal_ef": 0.5535827450980393, "rough_ef": 0.5134086274509804 + }, + "vm@treta_no_gelo": { + "Lmean": 35.68351251015059, + "Lmedia_por_texel": 37.98178838752978, + "Lp05": 16.614419850028618, + "Lp50": 35.69443395538287, + "Lp95": 54.53788693247124, + "Lp99": 80.71885672339647, + "pct_preto": 0.04417391304347826, + "pct_branco": 0.428034782608696, + "rgb": [ + 0.10626390336006941, + 0.10454097744899678, + 0.11401637606435674 + ], + "Lab": [ + 9.733010099943684, + 0.8395957362830192, + -1.5979360365358186 + ], + "aStar": 0.8395957362830192, + "bStar": -1.5979360365358186, + "croma": 1.8050818754960747, + "matiz": 297.7185641638705, + "metal_ef": 0.5535827450980393, + "rough_ef": 0.5134086274509804 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 47.14781645786313, + "Lmedia_por_texel": 48.805556334311945, + "Lp05": 29.07687714593957, + "Lp50": 46.5958587255711, + "Lp95": 64.53584109482696, + "Lp99": 88.07316199399908, + "pct_preto": 0, + "pct_branco": 0.6471652173913048, + "rgb": [ + 0.17591825290241214, + 0.17743408644869935, + 0.1951588842472901 + ], + "Lab": [ + 18.707510471935997, + 0.9438111513349057, + -2.959135199346985 + ], + "aStar": 0.9438111513349057, + "bStar": -2.959135199346985, + "croma": 3.106003962875521, + "matiz": 287.6899944117152, + "metal_ef": 0.3044705098039216, + "rough_ef": 0.5134086274509804 + }, + "chao@treta_no_gelo": { + "Lmean": 32.11374713633986, + "Lmedia_por_texel": 35.73807557769378, + "Lp05": 11.061087244887172, + "Lp50": 29.914189251753626, + "Lp95": 62.66329765901459, + "Lp99": 70.03331312263273, + "pct_preto": 7.32918260869565, + "pct_branco": 0, + "rgb": [ + 0.09482625474524067, + 0.09246591856948685, + 0.10014183943271251 + ], + "Lab": [ + 8.173319906988517, + 0.8072100245393038, + -1.272889868316368 + ], + "aStar": 0.8072100245393038, + "bStar": -1.272889868316368, + "croma": 1.5072613046778598, + "matiz": 302.3810491787798, + "metal_ef": 0.5535827450980393, + "rough_ef": 0.5134086274509804 } } }, @@ -11591,6 +12940,84 @@ "matiz": 269.38517317830895, "metal_ef": 0.2990572549019607, "rough_ef": 0.28835137254901966 + }, + "vm@treta_no_gelo": { + "Lmean": 28.475163608161186, + "Lmedia_por_texel": 32.440188269475385, + "Lp05": 13.333809257548161, + "Lp50": 26.052958066286465, + "Lp95": 46.12272152732298, + "Lp99": 97.76308136953466, + "pct_preto": 2.5860173913043476, + "pct_branco": 1.2173913043478268, + "rgb": [ + 0.061449296653591355, + 0.07504433526358702, + 0.09471864171334196 + ], + "Lab": [ + 5.819127431446226, + -0.10692909059382971, + -3.763864819311663 + ], + "aStar": -0.10692909059382971, + "bStar": -3.763864819311663, + "croma": 3.7653834078971613, + "matiz": 268.3726997519851, + "metal_ef": 0.2990572549019607, + "rough_ef": 0.28835137254901966 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 36.866191635433125, + "Lmedia_por_texel": 39.79916415136815, + "Lp05": 20.299354551564846, + "Lp50": 36.27639229721117, + "Lp95": 53.74073990428312, + "Lp99": 99.852774079648, + "pct_preto": 0, + "pct_branco": 1.2173913043478266, + "rgb": [ + 0.0933775592959882, + 0.11500360274840371, + 0.14447358839729943 + ], + "Lab": [ + 10.698322554492641, + -0.26108007236362585, + -5.948373925406846 + ], + "aStar": -0.26108007236362585, + "bStar": -5.948373925406846, + "croma": 5.954100701251655, + "matiz": 267.4868439841799, + "metal_ef": 0.16448149019607844, + "rough_ef": 0.28835137254901966 + }, + "chao@treta_no_gelo": { + "Lmean": 27.17539505152569, + "Lmedia_por_texel": 31.329933857928378, + "Lp05": 11.828750470409076, + "Lp50": 24.348438505546383, + "Lp95": 56.85735191549588, + "Lp99": 64.75758355814789, + "pct_preto": 5.623443478260868, + "pct_branco": 0, + "rgb": [ + 0.05619163110391214, + 0.07037219387471338, + 0.08928441445453326 + ], + "Lab": [ + 5.309175304364988, + -0.19229647396599991, + -3.4697088795888176 + ], + "aStar": -0.19229647396599991, + "bStar": -3.4697088795888176, + "croma": 3.475033473651332, + "matiz": 266.82782706695264, + "metal_ef": 0.2990572549019607, + "rough_ef": 0.28835137254901966 } } }, @@ -12147,6 +13574,84 @@ "matiz": 261.86253205866336, "metal_ef": 0.07786509803921567, "rough_ef": 0.32012235294117647 + }, + "vm@treta_no_gelo": { + "Lmean": 37.56022471374518, + "Lmedia_por_texel": 40.080523823739554, + "Lp05": 19.50857245018716, + "Lp50": 36.84188968489142, + "Lp95": 54.63866348510976, + "Lp99": 97.55647667204074, + "pct_preto": 0.26817391304347826, + "pct_branco": 1.211547826086957, + "rgb": [ + 0.09671106456226113, + 0.11874404450822605, + 0.1462650196469837 + ], + "Lab": [ + 11.138926877735724, + -0.4705887112982782, + -5.609496979142597 + ], + "aStar": -0.4705887112982782, + "bStar": -5.609496979142597, + "croma": 5.629201550327657, + "matiz": 265.2046038441057, + "metal_ef": 0.07786509803921567, + "rough_ef": 0.32012235294117647 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 45.22699997731446, + "Lmedia_por_texel": 47.27362923063682, + "Lp05": 25.36772841907686, + "Lp50": 45.074679578461335, + "Lp95": 62.996304058841446, + "Lp99": 99.67914008436597, + "pct_preto": 0, + "pct_branco": 1.214469565217392, + "rgb": [ + 0.1404572397490113, + 0.17064980481740027, + 0.20651821356710656 + ], + "Lab": [ + 17.41892550316328, + -0.7242319078046289, + -6.988746572721083 + ], + "aStar": -0.7242319078046289, + "bStar": -6.988746572721083, + "croma": 7.026171824970054, + "matiz": 264.0836538160562, + "metal_ef": 0.04282580392156863, + "rough_ef": 0.32012235294117647 + }, + "chao@treta_no_gelo": { + "Lmean": 35.995710236595535, + "Lmedia_por_texel": 38.97322523234915, + "Lp05": 16.91688365945687, + "Lp50": 34.724557204896506, + "Lp95": 64.90151330358923, + "Lp99": 68.39585776308144, + "pct_preto": 0.8377739130434781, + "pct_branco": 0, + "rgb": [ + 0.09110757691607227, + 0.11222127709356594, + 0.13471918307301575 + ], + "Lab": [ + 10.277563076796643, + -0.7704978252452005, + -4.752268207909416 + ], + "aStar": -0.7704978252452005, + "bStar": -4.752268207909416, + "croma": 4.81432446129404, + "matiz": 260.79062121361204, + "metal_ef": 0.07786509803921567, + "rough_ef": 0.32012235294117647 } } }, @@ -12703,6 +14208,84 @@ "matiz": 264.2504045440904, "metal_ef": 0.04073098039215686, "rough_ef": 0.36523921568627454 + }, + "vm@treta_no_gelo": { + "Lmean": 30.68934868123351, + "Lmedia_por_texel": 34.0091151620117, + "Lp05": 16.8528424306826, + "Lp50": 27.29059412759983, + "Lp95": 44.974818489750774, + "Lp99": 96.74856532088147, + "pct_preto": 0.052939130434782586, + "pct_branco": 1.2105739130434785, + "rgb": [ + 0.06607170411096154, + 0.0821504006712747, + 0.1022354562968407 + ], + "Lab": [ + 6.567701548103869, + -0.33618114323868964, + -4.135583005020865 + ], + "aStar": -0.33618114323868964, + "bStar": -4.135583005020865, + "croma": 4.149224572433587, + "matiz": 265.3526502756117, + "metal_ef": 0.04073098039215686, + "rough_ef": 0.36523921568627454 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 37.43157233771581, + "Lmedia_por_texel": 40.267235979050355, + "Lp05": 22.22333966210084, + "Lp50": 35.14001813881234, + "Lp95": 52.21832488952299, + "Lp99": 98.92758439875418, + "pct_preto": 0, + "pct_branco": 1.2134956521739138, + "rgb": [ + 0.09438874162963655, + 0.1170815391018202, + 0.1436589119681722 + ], + "Lab": [ + 10.903539218785355, + -0.6122291419938114, + -5.482309035899507 + ], + "aStar": -0.6122291419938114, + "bStar": -5.482309035899507, + "croma": 5.516388029083148, + "matiz": 263.62797546846707, + "metal_ef": 0.02240203921568628, + "rough_ef": 0.36523921568627454 + }, + "chao@treta_no_gelo": { + "Lmean": 28.776331933407953, + "Lmedia_por_texel": 32.97552949869137, + "Lp05": 13.991082298623784, + "Lp50": 26.285535249390072, + "Lp95": 63.700492818976244, + "Lp99": 66.04272782964361, + "pct_preto": 0.19290434782608692, + "pct_branco": 0, + "rgb": [ + 0.06136452658631113, + 0.07739631996526952, + 0.09576068826418749 + ], + "Lab": [ + 6.014282086085547, + -0.4251124384911653, + -3.6852028572009865 + ], + "aStar": -0.4251124384911653, + "bStar": -3.6852028572009865, + "croma": 3.70964158431542, + "matiz": 263.4196399363021, + "metal_ef": 0.04073098039215686, + "rough_ef": 0.36523921568627454 } } }, @@ -13259,6 +14842,84 @@ "matiz": 268.20550903159983, "metal_ef": 0.5008360784313726, "rough_ef": 0.3276627450980392 + }, + "vm@treta_no_gelo": { + "Lmean": 34.22764805430198, + "Lmedia_por_texel": 37.596019591828046, + "Lp05": 13.794051808277008, + "Lp50": 33.390642067109, + "Lp95": 56.58264628767898, + "Lp99": 96.59432083472146, + "pct_preto": 1.4893217391304348, + "pct_branco": 1.1803826086956528, + "rgb": [ + 0.08723894200887992, + 0.10565926400026426, + 0.13028533621892838 + ], + "Lab": [ + 9.526929766117977, + -0.303663524383338, + -5.054048051396226 + ], + "aStar": -0.303663524383338, + "bStar": -5.054048051396226, + "croma": 5.063162375616932, + "matiz": 266.56161811973726, + "metal_ef": 0.5008360784313726, + "rough_ef": 0.3276627450980392 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 44.991805093823515, + "Lmedia_por_texel": 47.33089165984888, + "Lp05": 18.34197664297413, + "Lp50": 45.94946431217627, + "Lp95": 67.1221027311365, + "Lp99": 98.8082956890095, + "pct_preto": 0.06518260869565218, + "pct_branco": 1.2154434782608703, + "rgb": [ + 0.14685933170228269, + 0.17769037967593446, + 0.21689656841068072 + ], + "Lab": [ + 18.28099506569847, + -0.5415926533632598, + -7.507610023957223 + ], + "aStar": -0.5415926533632598, + "bStar": -7.507610023957223, + "croma": 7.527119693083141, + "matiz": 265.87387842258767, + "metal_ef": 0.2754598431372549, + "rough_ef": 0.3276627450980392 + }, + "chao@treta_no_gelo": { + "Lmean": 32.27350856233189, + "Lmedia_por_texel": 36.44562912000457, + "Lp05": 11.061827053932976, + "Lp50": 30.23722684637535, + "Lp95": 64.45657500868286, + "Lp99": 74.86759318731303, + "pct_preto": 7.620730434782609, + "pct_branco": 0, + "rgb": [ + 0.08008314702170692, + 0.0992834594756454, + 0.12297244969623713 + ], + "Lab": [ + 8.67832409781461, + -0.45148171446261764, + -4.956839742768182 + ], + "aStar": -0.45148171446261764, + "bStar": -4.956839742768182, + "croma": 4.977358332889067, + "matiz": 264.7957129659758, + "metal_ef": 0.5008360784313726, + "rough_ef": 0.3276627450980392 } } }, @@ -13815,6 +15476,84 @@ "matiz": 56.16942491740241, "metal_ef": 0.6914870588235295, "rough_ef": 0.41562352941176467 + }, + "vm@treta_no_gelo": { + "Lmean": 38.21215909165936, + "Lmedia_por_texel": 41.03957922393855, + "Lp05": 19.104864697223185, + "Lp50": 38.63010281601324, + "Lp95": 55.321227763757406, + "Lp99": 87.24073937191778, + "pct_preto": 0, + "pct_branco": 0.9787826086956525, + "rgb": [ + 0.12281858586973503, + 0.1196526728591145, + 0.11720057416295292 + ], + "Lab": [ + 11.580399776639634, + 0.2287121491683919, + 0.5622849823121834 + ], + "aStar": 0.2287121491683919, + "bStar": 0.5622849823121834, + "croma": 0.6070203032115459, + "matiz": 67.86572738593833, + "metal_ef": 0.6914870588235295, + "rough_ef": 0.41562352941176467 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 51.08070550555284, + "Lmedia_por_texel": 52.667752732858155, + "Lp05": 35.03766740572975, + "Lp50": 50.42652170286814, + "Lp95": 65.01229739153166, + "Lp99": 92.61315394027717, + "pct_preto": 0, + "pct_branco": 1.0045913043478265, + "rgb": [ + 0.20588006837903644, + 0.20834137661544477, + 0.20936094864845564 + ], + "Lab": [ + 22.166415039965926, + -0.2114254961564921, + -0.25893160869668863 + ], + "aStar": -0.2114254961564921, + "bStar": -0.25893160869668863, + "croma": 0.33428478638321835, + "matiz": 230.76732141763097, + "metal_ef": 0.38031788235294123, + "rough_ef": 0.41562352941176467 + }, + "chao@treta_no_gelo": { + "Lmean": 35.27941857587042, + "Lmedia_por_texel": 39.33213275394024, + "Lp05": 15.73927492029338, + "Lp50": 33.30239078465903, + "Lp95": 65.8147740801394, + "Lp99": 74.87758948835821, + "pct_preto": 0, + "pct_branco": 0, + "rgb": [ + 0.1113319096643507, + 0.10947297688906253, + 0.10821059923814848 + ], + "Lab": [ + 10.26518948848074, + 0.1460997497854527, + 0.302530454601152 + ], + "aStar": 0.1460997497854527, + "bStar": 0.302530454601152, + "croma": 0.335961028764575, + "matiz": 64.22290649535176, + "metal_ef": 0.6914870588235295, + "rough_ef": 0.41562352941176467 } } }, @@ -14371,6 +16110,84 @@ "matiz": 73.6256948802453, "metal_ef": 0.31780392156862747, "rough_ef": 0.4084517647058824 + }, + "vm@treta_no_gelo": { + "Lmean": 39.07593667344407, + "Lmedia_por_texel": 41.746313123370264, + "Lp05": 15.467767518348541, + "Lp50": 38.53795573783585, + "Lp95": 64.6939038629343, + "Lp99": 93.48610110996381, + "pct_preto": 1.8596173913043479, + "pct_branco": 1.150191304347827, + "rgb": [ + 0.12655631905217496, + 0.1350822742346135, + 0.14244931271002184 + ], + "Lab": [ + 13.29407555016575, + -0.507843141565989, + -1.603986440546823 + ], + "aStar": -0.507843141565989, + "bStar": -1.603986440546823, + "croma": 1.6824616363809548, + "matiz": 252.4315299682072, + "metal_ef": 0.31780392156862747, + "rough_ef": 0.4084517647058824 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 47.934202286716676, + "Lmedia_por_texel": 50.07266455308599, + "Lp05": 20.3237001849703, + "Lp50": 48.61702965493035, + "Lp95": 73.2647699775097, + "Lp99": 96.47632848797737, + "pct_preto": 0.10622608695652173, + "pct_branco": 1.2173913043478268, + "rgb": [ + 0.19066410079035315, + 0.20414303078923338, + 0.21538195259505527 + ], + "Lab": [ + 21.50427291393948, + -0.7719253022058226, + -2.315407199258035 + ], + "aStar": -0.7719253022058226, + "bStar": -2.315407199258035, + "croma": 2.440692354755406, + "matiz": 251.56231407245576, + "metal_ef": 0.1747921568627451, + "rough_ef": 0.4084517647058824 + }, + "chao@treta_no_gelo": { + "Lmean": 36.420717267293384, + "Lmedia_por_texel": 40.03312963512416, + "Lp05": 12.365633330778241, + "Lp50": 34.54890956860211, + "Lp95": 66.18680519683042, + "Lp99": 80.46378496737313, + "pct_preto": 4.567234782608696, + "pct_branco": 0, + "rgb": [ + 0.11391545742850917, + 0.12297338612171677, + 0.128764274811062 + ], + "Lab": [ + 11.753631520958546, + -0.6818265472871982, + -1.3737948999578753 + ], + "aStar": -0.6818265472871982, + "bStar": -1.3737948999578753, + "croma": 1.533688321575101, + "matiz": 243.60438901108262, + "metal_ef": 0.31780392156862747, + "rough_ef": 0.4084517647058824 } } }, @@ -14927,6 +16744,84 @@ "matiz": 32.86303973813199, "metal_ef": 0.4659780392156863, "rough_ef": 0.6615796078431373 + }, + "vm@treta_no_gelo": { + "Lmean": 31.653242406949435, + "Lmedia_por_texel": 33.764434937006676, + "Lp05": 14.312429583329024, + "Lp50": 31.021764172867428, + "Lp95": 52.09673337921927, + "Lp99": 67.34874705767717, + "pct_preto": 1.6895999999999998, + "pct_branco": 0.22886956521739146, + "rgb": [ + 0.09937524941645412, + 0.07879487922603255, + 0.07646369643523736 + ], + "Lab": [ + 6.895537129865595, + 2.352215836504648, + 1.2384081289317783 + ], + "aStar": 2.352215836504648, + "bStar": 1.2384081289317783, + "croma": 2.6583028486813856, + "matiz": 27.766165911171413, + "metal_ef": 0.4659780392156863, + "rough_ef": 0.6615796078431373 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 42.581124177366036, + "Lmedia_por_texel": 44.12003510487159, + "Lp05": 26.972469358143087, + "Lp50": 41.336661499474275, + "Lp95": 64.51671703642381, + "Lp99": 76.19323108251561, + "pct_preto": 0.011408695652173912, + "pct_branco": 0.4587130434782611, + "rgb": [ + 0.16650311640001356, + 0.14008842074032932, + 0.1392269714053175 + ], + "Lab": [ + 14.797287687596079, + 3.1201253837292997, + 1.3150036914685526 + ], + "aStar": 3.1201253837292997, + "bStar": 1.3150036914685526, + "croma": 3.3859145173450305, + "matiz": 22.853409102352202, + "metal_ef": 0.25628792156862745, + "rough_ef": 0.6615796078431373 + }, + "chao@treta_no_gelo": { + "Lmean": 28.336864030650222, + "Lmedia_por_texel": 31.723880934168346, + "Lp05": 9.87894687876716, + "Lp50": 26.367730750087084, + "Lp95": 52.818539039343904, + "Lp99": 69.22996766923366, + "pct_preto": 9.773286956521739, + "pct_branco": 0, + "rgb": [ + 0.08994561736803239, + 0.06824855168493098, + 0.06608604126056702 + ], + "Lab": [ + 5.735508383918475, + 2.2597489069299814, + 1.134901292594731 + ], + "aStar": 2.2597489069299814, + "bStar": 1.134901292594731, + "croma": 2.5287281519183584, + "matiz": 26.666924553008187, + "metal_ef": 0.4659780392156863, + "rough_ef": 0.6615796078431373 } } }, @@ -15483,6 +17378,84 @@ "matiz": 354.8824524843353, "metal_ef": 0.5383984313725491, "rough_ef": 0.36683921568627453 + }, + "vm@treta_no_gelo": { + "Lmean": 36.69135393208334, + "Lmedia_por_texel": 39.559988653872345, + "Lp05": 17.849280631346282, + "Lp50": 36.52548956683278, + "Lp95": 54.545944676814855, + "Lp99": 96.22552227524604, + "pct_preto": 0.3778086956521738, + "pct_branco": 1.2086260869565224, + "rgb": [ + 0.11776518068123665, + 0.1087361929253306, + 0.1294898054153213 + ], + "Lab": [ + 10.587173470763094, + 2.46545678781529, + -3.2303425420591783 + ], + "aStar": 2.46545678781529, + "bStar": -3.2303425420591783, + "croma": 4.063691685108732, + "matiz": 307.35153886985825, + "metal_ef": 0.5383984313725491, + "rough_ef": 0.36683921568627453 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 47.942557859489554, + "Lmedia_por_texel": 49.779178648619784, + "Lp05": 30.129916767132386, + "Lp50": 48.03221752242777, + "Lp95": 64.17387165254347, + "Lp99": 98.5041017674134, + "pct_preto": 0, + "pct_branco": 1.21544347826087, + "rgb": [ + 0.1869992768670352, + 0.1811598195230158, + 0.2165955028730426 + ], + "Lab": [ + 19.507759168110013, + 2.896805461581775, + -5.511674522776822 + ], + "aStar": 2.896805461581775, + "bStar": -5.511674522776822, + "croma": 6.226559076028839, + "matiz": 297.72535133868814, + "metal_ef": 0.296119137254902, + "rough_ef": 0.36683921568627453 + }, + "chao@treta_no_gelo": { + "Lmean": 34.36847771333244, + "Lmedia_por_texel": 38.21842498536419, + "Lp05": 14.46048458523844, + "Lp50": 32.817430066044416, + "Lp95": 66.22934404505548, + "Lp99": 74.23007922985202, + "pct_preto": 1.8082086956521737, + "pct_branco": 0, + "rgb": [ + 0.1099213509948529, + 0.10098301911790011, + 0.12019714584446017 + ], + "Lab": [ + 9.578886073542115, + 2.3725989973702593, + -2.9945396251726097 + ], + "aStar": 2.3725989973702593, + "bStar": -2.9945396251726097, + "croma": 3.820535769895536, + "matiz": 308.39008217111086, + "metal_ef": 0.5383984313725491, + "rough_ef": 0.36683921568627453 } } }, @@ -16039,6 +18012,84 @@ "matiz": 41.86871493725732, "metal_ef": 0.4697207843137255, "rough_ef": 0.4065098039215686 + }, + "vm@treta_no_gelo": { + "Lmean": 38.85100061954119, + "Lmedia_por_texel": 41.45695377571865, + "Lp05": 15.099029734266118, + "Lp50": 39.54931832759965, + "Lp95": 60.487381450689156, + "Lp99": 91.85025407068866, + "pct_preto": 2.514434782608695, + "pct_branco": 0.9938782608695654, + "rgb": [ + 0.14403541307963252, + 0.12603308420561884, + 0.12661146654987268 + ], + "Lab": [ + 12.826918928435386, + 2.215462377943039, + 0.6951595186420301 + ], + "aStar": 2.215462377943039, + "bStar": 0.6951595186420301, + "croma": 2.321964750903778, + "matiz": 17.420619458805845, + "metal_ef": 0.4697207843137255, + "rough_ef": 0.4065098039215686 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 49.73311096384659, + "Lmedia_por_texel": 51.46341703059529, + "Lp05": 24.406642687530386, + "Lp50": 50.6120512318835, + "Lp95": 69.06222513579664, + "Lp99": 95.71966622905731, + "pct_preto": 0.1791304347826087, + "pct_branco": 1.1014956521739139, + "rgb": [ + 0.21885525012649445, + 0.2025489748751015, + 0.20844181155364613 + ], + "Lab": [ + 22.01135435201931, + 2.1652744360063925, + -0.2877135545925169 + ], + "aStar": 2.1652744360063925, + "bStar": -0.2877135545925169, + "croma": 2.184305947599617, + "matiz": 352.4310894774111, + "metal_ef": 0.25834643137254903, + "rough_ef": 0.4065098039215686 + }, + "chao@treta_no_gelo": { + "Lmean": 36.58847073190199, + "Lmedia_por_texel": 40.035746810020996, + "Lp05": 11.76961237560895, + "Lp50": 36.160286259514386, + "Lp95": 66.64306264616012, + "Lp99": 74.63348481296951, + "pct_preto": 5.207721739130435, + "pct_branco": 0, + "rgb": [ + 0.13529023844263963, + 0.11709090410842415, + 0.11638800442382699 + ], + "Lab": [ + 11.703318206550552, + 2.189267998702518, + 0.9369722274097159 + ], + "aStar": 2.189267998702518, + "bStar": 0.9369722274097159, + "croma": 2.3813465361177597, + "matiz": 23.17016217019159, + "metal_ef": 0.4697207843137255, + "rough_ef": 0.4065098039215686 } } }, @@ -16595,6 +18646,84 @@ "matiz": 262.73821829847157, "metal_ef": 0.3309505882352941, "rough_ef": 0.4665992156862745 + }, + "vm@treta_no_gelo": { + "Lmean": 35.95169392910092, + "Lmedia_por_texel": 38.466219398481925, + "Lp05": 15.563824198242347, + "Lp50": 36.15426291045941, + "Lp95": 54.0109404423671, + "Lp99": 87.57250097571989, + "pct_preto": 2.0019478260869565, + "pct_branco": 0.7732869565217396, + "rgb": [ + 0.08836330785431713, + 0.10999389462626652, + 0.13613428053035956 + ], + "Lab": [ + 10.02382293854842, + -0.5246325805346314, + -5.409210136908843 + ], + "aStar": -0.5246325805346314, + "bStar": -5.409210136908843, + "croma": 5.434592316797628, + "matiz": 264.4602804465461, + "metal_ef": 0.3309505882352941, + "rough_ef": 0.4665992156862745 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 45.21439481010589, + "Lmedia_por_texel": 47.25892442399836, + "Lp05": 22.374545419755904, + "Lp50": 45.95609323785069, + "Lp95": 63.546158844096624, + "Lp99": 92.89051870721202, + "pct_preto": 0.16640000000000002, + "pct_branco": 1.0357565217391311, + "rgb": [ + 0.14018711710024642, + 0.17208622431128204, + 0.20954794665245058 + ], + "Lab": [ + 17.57184348008291, + -0.7682913589661944, + -7.295582619083052 + ], + "aStar": -0.7682913589661944, + "bStar": -7.295582619083052, + "croma": 7.335925119855631, + "matiz": 263.98838968599915, + "metal_ef": 0.1820228235294118, + "rough_ef": 0.4665992156862745 + }, + "chao@treta_no_gelo": { + "Lmean": 33.30748143682418, + "Lmedia_por_texel": 36.79257912725428, + "Lp05": 12.080574727126777, + "Lp50": 31.745555446730272, + "Lp95": 64.37781554401752, + "Lp99": 69.56438182990365, + "pct_preto": 4.891339130434783, + "pct_branco": 0, + "rgb": [ + 0.08039009593573215, + 0.10012114487029737, + 0.12161001183626523 + ], + "Lab": [ + 8.748751478081907, + -0.6904391454413544, + -4.588541409844781 + ], + "aStar": -0.6904391454413544, + "bStar": -4.588541409844781, + "croma": 4.640195953127209, + "matiz": 261.44288364986147, + "metal_ef": 0.3309505882352941, + "rough_ef": 0.4665992156862745 } } }, @@ -17151,6 +19280,84 @@ "matiz": 270.2901044610101, "metal_ef": 0.7173474509803922, "rough_ef": 0.32817411764705884 + }, + "vm@treta_no_gelo": { + "Lmean": 27.50612141324035, + "Lmedia_por_texel": 31.776235020761995, + "Lp05": 12.261594019189133, + "Lp50": 25.75202871937112, + "Lp95": 45.33308787313588, + "Lp99": 97.53446012199902, + "pct_preto": 3.7803826086956516, + "pct_branco": 1.1974260869565223, + "rgb": [ + 0.05965442471297929, + 0.0720894337063236, + 0.08970526437161606 + ], + "Lab": [ + 5.508449416052368, + -0.13183613741288291, + -3.2502251907376767 + ], + "aStar": -0.13183613741288291, + "bStar": -3.2502251907376767, + "croma": 3.2528978707659597, + "matiz": 267.6772330358217, + "metal_ef": 0.7173474509803922, + "rough_ef": 0.32817411764705884 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 39.23371202228858, + "Lmedia_por_texel": 41.9238000876031, + "Lp05": 20.69980086119265, + "Lp50": 38.77809747077548, + "Lp95": 55.67112932220799, + "Lp99": 99.66154247143174, + "pct_preto": 0.035547826086956516, + "pct_branco": 1.2173913043478266, + "rgb": [ + 0.10507561850586943, + 0.1291430521893297, + 0.16141054844777833 + ], + "Lab": [ + 12.450123004826718, + -0.3149082613665005, + -6.4220497617644865 + ], + "aStar": -0.3149082613665005, + "bStar": -6.4220497617644865, + "croma": 6.42976596429887, + "matiz": 267.1927227997644, + "metal_ef": 0.3945410980392157, + "rough_ef": 0.32817411764705884 + }, + "chao@treta_no_gelo": { + "Lmean": 25.72971355512959, + "Lmedia_por_texel": 30.812924971057836, + "Lp05": 10.122391735725348, + "Lp50": 21.993707409765342, + "Lp95": 59.51325502065326, + "Lp99": 67.35022232878804, + "pct_preto": 18.957217391304347, + "pct_branco": 0, + "rgb": [ + 0.05457632177120524, + 0.06802050189839931, + 0.08603004439697363 + ], + "Lab": [ + 5.07702855840753, + -0.17939074880411743, + -3.2088124754301783 + ], + "aStar": -0.17939074880411743, + "bStar": -3.2088124754301783, + "croma": 3.213823041679932, + "matiz": 266.8001730252423, + "metal_ef": 0.7173474509803922, + "rough_ef": 0.32817411764705884 } } } diff --git a/tools/eval/mat_scenes.json b/tools/eval/mat_scenes.json index 163e2ea6a..58bac8126 100644 --- a/tools/eval/mat_scenes.json +++ b/tools/eval/mat_scenes.json @@ -1,5 +1,5 @@ { - "gerado": "2026-08-16T03:27:47.239Z", + "gerado": "2026-08-18T22:49:49.054Z", "nota": "luzes e env MEDIDOS em runtime (harness.mjs); fatores lidos do chunk JSON dos GLB", "maps": [ { @@ -85,6 +85,18 @@ "color": "#ffffff", "intensity": 1.15 } + }, + { + "map": "treta_no_gelo", + "sun": { + "pos": [ + -32, + 48, + -28 + ], + "color": "#e8f5ff", + "intensity": 1.72 + } } ], "paths": [ @@ -1443,6 +1455,204 @@ "roughFactor": 1, "envMapIntensity": 1, "lightMul": 1 + }, + { + "id": "vm@treta_no_gelo", + "envMap": "treta_no_gelo", + "scene": { + "lights": [ + { + "type": "DirectionalLight", + "intensity": 1.499, + "color": "#d8ede7", + "pos": [ + -0.45, + 0.75, + 0.55 + ] + }, + { + "type": "DirectionalLight", + "intensity": 0.543, + "color": "#70a9ff", + "pos": [ + 0.6, + -0.15, + 0.5 + ] + }, + { + "type": "DirectionalLight", + "intensity": 0.17, + "color": "#77adff", + "pos": [ + 0.55, + 0.35, + 0.75 + ] + }, + { + "type": "DirectionalLight", + "intensity": 0.749, + "color": "#d8dbc6", + "pos": [ + 0.2, + 0.35, + -0.9 + ] + }, + { + "type": "DirectionalLight", + "intensity": 0.398, + "color": "#d8bc91", + "pos": [ + -0.2, + -0.86, + 0.47 + ] + }, + { + "type": "HemisphereLight", + "intensity": 0.611, + "color": "#659dff", + "pos": [ + 0, + 1, + 0 + ], + "ground": "#24282a" + } + ] + }, + "exposure": 2.4, + "floor": 0.0042, + "sat": 1.12, + "metalFactor": 1, + "roughFactor": 1, + "envMapIntensity": 1, + "lightMul": 1 + }, + { + "id": "vmLegado@treta_no_gelo", + "envMap": "treta_no_gelo", + "scene": { + "lights": [ + { + "type": "DirectionalLight", + "intensity": 1.499, + "color": "#d8ede7", + "pos": [ + -0.45, + 0.75, + 0.55 + ] + }, + { + "type": "DirectionalLight", + "intensity": 0.543, + "color": "#70a9ff", + "pos": [ + 0.6, + -0.15, + 0.5 + ] + }, + { + "type": "DirectionalLight", + "intensity": 0.17, + "color": "#77adff", + "pos": [ + 0.55, + 0.35, + 0.75 + ] + }, + { + "type": "DirectionalLight", + "intensity": 0.749, + "color": "#d8dbc6", + "pos": [ + 0.2, + 0.35, + -0.9 + ] + }, + { + "type": "DirectionalLight", + "intensity": 0.398, + "color": "#d8bc91", + "pos": [ + -0.2, + -0.86, + 0.47 + ] + }, + { + "type": "HemisphereLight", + "intensity": 0.611, + "color": "#659dff", + "pos": [ + 0, + 1, + 0 + ], + "ground": "#24282a" + } + ] + }, + "exposure": 2.4, + "floor": 0.0042, + "sat": 1.12, + "metalFactor": 0.55, + "roughFactor": 1, + "envMapIntensity": 1.2, + "lightMul": 1.9139 + }, + { + "id": "chao@treta_no_gelo", + "envMap": "treta_no_gelo", + "scene": { + "lights": [ + { + "type": "HemisphereLight", + "intensity": 1.42, + "color": "#dceeff", + "pos": [ + 0, + 1, + 0 + ], + "ground": "#304657" + }, + { + "type": "DirectionalLight", + "intensity": 1.72, + "color": "#e8f5ff", + "pos": [ + -32, + 48, + -28 + ] + }, + { + "type": "DirectionalLight", + "intensity": 0.42, + "color": "#6aa7cb", + "pos": [ + 30, + 18, + 24 + ] + } + ] + }, + "exposure": 2.4, + "floor": 0.0042, + "sat": 1.12, + "metalFactor": 1, + "roughFactor": 1, + "envMapIntensity": 1, + "lightMul": 1 } ] } \ No newline at end of file diff --git a/tools/eval/mat_shade.json b/tools/eval/mat_shade.json index b4fbff47a..3527cf86c 100644 --- a/tools/eval/mat_shade.json +++ b/tools/eval/mat_shade.json @@ -1,5 +1,5 @@ { - "gerado": "2026-08-16T03:27:47.239Z", + "gerado": "2026-08-18T22:49:49.054Z", "armas": [ { "arma": "ak", @@ -554,6 +554,84 @@ "matiz": 37.44059839474892, "metal_ef": 0.28665568627450977, "rough_ef": 0.43389176470588225 + }, + "vm@treta_no_gelo": { + "Lmean": 38.87353814922729, + "Lmedia_por_texel": 41.39897500180011, + "Lp05": 15.523107112790289, + "Lp50": 39.23434997419274, + "Lp95": 59.884629180492965, + "Lp99": 89.7341944061984, + "pct_preto": 1.6929391304347823, + "pct_branco": 0.8331826086956524, + "rgb": [ + 0.14103280686039696, + 0.12574537679584682, + 0.12972362084044498 + ], + "Lab": [ + 12.742294374796096, + 2.0860217281085944, + -0.015884244466013442 + ], + "aStar": 2.0860217281085944, + "bStar": -0.015884244466013442, + "croma": 2.086082203405087, + "matiz": 359.5637233461647, + "metal_ef": 0.28665568627450977, + "rough_ef": 0.43389176470588225 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 48.13107253625702, + "Lmedia_por_texel": 50.10357814189081, + "Lp05": 20.76762464214265, + "Lp50": 49.49877694296353, + "Lp95": 68.46962112879574, + "Lp99": 94.40537703696441, + "pct_preto": 0.032626086956521735, + "pct_branco": 1.1760000000000006, + "rgb": [ + 0.20974237597284032, + 0.193606657190744, + 0.2007768097795256 + ], + "Lab": [ + 20.975010350654415, + 2.2349385874367025, + -0.5026040047420466 + ], + "aStar": 2.2349385874367025, + "bStar": -0.5026040047420466, + "croma": 2.2907556122808708, + "matiz": 347.32589207362156, + "metal_ef": 0.15766062745098042, + "rough_ef": 0.43389176470588225 + }, + "chao@treta_no_gelo": { + "Lmean": 36.116121646365585, + "Lmedia_por_texel": 39.72974134913669, + "Lp05": 10.907993327856044, + "Lp50": 36.179777843932264, + "Lp95": 65.9293047500833, + "Lp99": 77.63372743035028, + "pct_preto": 6.158956521739129, + "pct_branco": 0.0, + "rgb": [ + 0.13089537135485677, + 0.11525487878500522, + 0.11755642165857577 + ], + "Lab": [ + 11.423078958738007, + 2.0539619600813683, + 0.2946442103233915 + ], + "aStar": 2.0539619600813683, + "bStar": 0.2946442103233915, + "croma": 2.0749879383115437, + "matiz": 8.163480469161755, + "metal_ef": 0.28665568627450977, + "rough_ef": 0.43389176470588225 } } }, @@ -1110,6 +1188,84 @@ "matiz": 58.58285655883628, "metal_ef": 0.429675294117647, "rough_ef": 0.503193725490196 + }, + "vm@treta_no_gelo": { + "Lmean": 45.464412622036136, + "Lmedia_por_texel": 47.06605435915872, + "Lp05": 30.51981396041041, + "Lp50": 44.16960303232291, + "Lp95": 58.60196942277969, + "Lp99": 86.58386737116123, + "pct_preto": 0.0, + "pct_branco": 0.3165217391304351, + "rgb": [ + 0.17701049051289552, + 0.15793019376658354, + 0.14631758963828853 + ], + "Lab": [ + 16.663380433398046, + 1.5975476572977487, + 2.7584833769576766 + ], + "aStar": 1.5975476572977487, + "bStar": 2.7584833769576766, + "croma": 3.187693375826689, + "matiz": 59.923157894576434, + "metal_ef": 0.429675294117647, + "rough_ef": 0.503193725490196 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 55.901562679417886, + "Lmedia_por_texel": 57.09565369085474, + "Lp05": 42.09268356630335, + "Lp50": 55.742347475361925, + "Lp95": 68.49632572588025, + "Lp99": 92.08408360692005, + "pct_preto": 0.0, + "pct_branco": 1.0498782608695658, + "rgb": [ + 0.2672997936683356, + 0.24702984530676025, + 0.23276439269532498 + ], + "Lab": [ + 27.041642467655777, + 1.4582055390484905, + 3.025031646100307 + ], + "aStar": 1.4582055390484905, + "bStar": 3.025031646100307, + "croma": 3.358151255381453, + "matiz": 64.26377716419938, + "metal_ef": 0.23632141176470586, + "rough_ef": 0.503193725490196 + }, + "chao@treta_no_gelo": { + "Lmean": 42.35589660059481, + "Lmedia_por_texel": 44.83588598276543, + "Lp05": 25.984117736886198, + "Lp50": 41.074371875640196, + "Lp95": 70.90504032204592, + "Lp99": 72.6738471827351, + "pct_preto": 0.0, + "pct_branco": 0.0, + "rgb": [ + 0.16197394054517472, + 0.14170141788408408, + 0.12827097312004618 + ], + "Lab": [ + 14.71139944934363, + 1.6827044318610818, + 3.170298707389163 + ], + "aStar": 1.6827044318610818, + "bStar": 3.170298707389163, + "croma": 3.589190451770193, + "matiz": 62.04190816670007, + "metal_ef": 0.429675294117647, + "rough_ef": 0.503193725490196 } } }, @@ -1666,6 +1822,84 @@ "matiz": 202.4916518912684, "metal_ef": 0.2696, "rough_ef": 0.3459592156862745 + }, + "vm@treta_no_gelo": { + "Lmean": 35.21498534763821, + "Lmedia_por_texel": 37.97134664356583, + "Lp05": 16.506198898704547, + "Lp50": 34.72216650962368, + "Lp95": 52.559921217974235, + "Lp99": 95.13593837020713, + "pct_preto": 0.41419130434782614, + "pct_branco": 1.1263304347826095, + "rgb": [ + 0.0821359249493859, + 0.10859993666410972, + 0.12171088548852886 + ], + "Lab": [ + 9.592749144499532, + -2.0894989670082467, + -3.3357038593554544 + ], + "aStar": -2.0894989670082467, + "bStar": -3.3357038593554544, + "croma": 3.9361054572314758, + "matiz": 237.9367974769666, + "metal_ef": 0.2696, + "rough_ef": 0.3459592156862745 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 43.97369544177676, + "Lmedia_por_texel": 46.09318376626837, + "Lp05": 24.8856009028531, + "Lp50": 43.93073981405377, + "Lp95": 60.46646164082114, + "Lp99": 97.80165616391821, + "pct_preto": 0.03144347826086956, + "pct_branco": 1.1915826086956527, + "rgb": [ + 0.12513168855071669, + 0.16349674469610959, + 0.18178926735692946 + ], + "Lab": [ + 16.20423659812429, + -2.876437514646335, + -4.432856749099479 + ], + "aStar": -2.876437514646335, + "bStar": -4.432856749099479, + "croma": 5.284326989664964, + "matiz": 237.02085396297065, + "metal_ef": 0.14828000000000002, + "rough_ef": 0.3459592156862745 + }, + "chao@treta_no_gelo": { + "Lmean": 33.403351877327026, + "Lmedia_por_texel": 36.78571123923444, + "Lp05": 13.49748918148865, + "Lp50": 31.969217400139144, + "Lp95": 63.36060992239125, + "Lp99": 67.7109485747606, + "pct_preto": 2.407304347826087, + "pct_branco": 0.0, + "rgb": [ + 0.0765571815601091, + 0.10191711087162067, + 0.11191949847012163 + ], + "Lab": [ + 8.72597635630553, + -2.2242646323981234, + -2.772822696232591 + ], + "aStar": -2.2242646323981234, + "bStar": -2.772822696232591, + "croma": 3.554700952215212, + "matiz": 231.26459249931094, + "metal_ef": 0.2696, + "rough_ef": 0.3459592156862745 } } }, @@ -2222,6 +2456,84 @@ "matiz": 49.324648885352985, "metal_ef": 0.5445505882352941, "rough_ef": 0.60392 + }, + "vm@treta_no_gelo": { + "Lmean": 45.52553366986617, + "Lmedia_por_texel": 47.31689404265745, + "Lp05": 27.26319666859588, + "Lp50": 45.10042712365696, + "Lp95": 62.26418770797849, + "Lp99": 69.31212575740325, + "pct_preto": 0.003895652173913043, + "pct_branco": 0.4080695652173915, + "rgb": [ + 0.18972173555385355, + 0.15808923331772123, + 0.14709854257623325 + ], + "Lab": [ + 17.052110143582397, + 3.1599532394175345, + 3.2238901504497375 + ], + "aStar": 3.1599532394175345, + "bStar": 3.2238901504497375, + "croma": 4.514285345154003, + "matiz": 45.57382245355575, + "metal_ef": 0.5445505882352941, + "rough_ef": 0.60392 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 57.2145597848579, + "Lmedia_por_texel": 58.32108783304512, + "Lp05": 42.23099809025652, + "Lp50": 57.19909525439398, + "Lp95": 71.6095977721808, + "Lp99": 77.63208813338458, + "pct_preto": 0.0, + "pct_branco": 0.6914782608695655, + "rgb": [ + 0.2918250336587278, + 0.25787922021924403, + 0.2487835687067391 + ], + "Lab": [ + 28.654821825129545, + 3.231120630371731, + 2.7594228434330126 + ], + "aStar": 3.231120630371731, + "bStar": 2.7594228434330126, + "croma": 4.249065186234938, + "matiz": 40.49779672109605, + "metal_ef": 0.2995028235294118, + "rough_ef": 0.60392 + }, + "chao@treta_no_gelo": { + "Lmean": 41.51068485642224, + "Lmedia_por_texel": 44.5150619268876, + "Lp05": 20.519224912697993, + "Lp50": 41.292283694321945, + "Lp95": 66.9980520453881, + "Lp99": 79.3965171117403, + "pct_preto": 0.05606956521739129, + "pct_branco": 0.0, + "rgb": [ + 0.16982219410449848, + 0.13786762895480012, + 0.12571428165976503 + ], + "Lab": [ + 14.602693160857356, + 3.2217928081786082, + 3.5133633158832334 + ], + "aStar": 3.2217928081786082, + "bStar": 3.5133633158832334, + "croma": 4.766935146215588, + "matiz": 47.47883417511565, + "metal_ef": 0.5445505882352941, + "rough_ef": 0.60392 } } }, @@ -2778,6 +3090,84 @@ "matiz": 267.1059206479258, "metal_ef": 0.6823058823529411, "rough_ef": 0.3891749019607843 + }, + "vm@treta_no_gelo": { + "Lmean": 39.42907759403769, + "Lmedia_por_texel": 42.10972242320386, + "Lp05": 17.55976963575339, + "Lp50": 39.22518974254199, + "Lp95": 62.0376286505966, + "Lp99": 88.65043313038701, + "pct_preto": 1.3132521739130434, + "pct_branco": 0.9237565217391309, + "rgb": [ + 0.1108186021064146, + 0.1357015797998718, + 0.16768883192557885 + ], + "Lab": [ + 13.242585353878052, + -0.43494230281740376, + -6.365020879419081 + ], + "aStar": -0.43494230281740376, + "bStar": -6.365020879419081, + "croma": 6.379864073961213, + "matiz": 266.0908724215255, + "metal_ef": 0.6823058823529411, + "rough_ef": 0.3891749019607843 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 52.44719426898714, + "Lmedia_por_texel": 53.96210306155104, + "Lp05": 28.15506735890004, + "Lp50": 53.26506178591623, + "Lp95": 71.95403282387674, + "Lp99": 93.64959919207126, + "pct_preto": 0.0, + "pct_branco": 1.0372173913043485, + "rgb": [ + 0.19405096354761228, + 0.23618968536594956, + 0.28858922055783215 + ], + "Lab": [ + 24.981452427806822, + -0.7234170537232798, + -9.607750586717334 + ], + "aStar": -0.7234170537232798, + "bStar": -9.607750586717334, + "croma": 9.634946993636495, + "matiz": 265.69403059340004, + "metal_ef": 0.3752682352941177, + "rough_ef": 0.3891749019607843 + }, + "chao@treta_no_gelo": { + "Lmean": 36.99897668681528, + "Lmedia_por_texel": 40.54270792581937, + "Lp05": 13.877463655628027, + "Lp50": 35.4427275368467, + "Lp95": 64.98275741452386, + "Lp99": 79.83900709251506, + "pct_preto": 3.3367652173913043, + "pct_branco": 0.0, + "rgb": [ + 0.10027276617068816, + 0.1254763729332715, + 0.15563780135628705 + ], + "Lab": [ + 11.94337251958552, + -0.5925522465346639, + -6.130981812492825 + ], + "aStar": -0.5925522465346639, + "bStar": -6.130981812492825, + "croma": 6.159549995737602, + "matiz": 264.4795758359128, + "metal_ef": 0.6823058823529411, + "rough_ef": 0.3891749019607843 } } }, @@ -3334,6 +3724,84 @@ "matiz": 261.7609737481189, "metal_ef": 0.6201584313725491, "rough_ef": 0.376398431372549 + }, + "vm@treta_no_gelo": { + "Lmean": 37.35363334369719, + "Lmedia_por_texel": 40.538563812982346, + "Lp05": 15.12002508100759, + "Lp50": 37.68768882767433, + "Lp95": 59.38012085401721, + "Lp99": 96.46593591443028, + "pct_preto": 1.0025043478260869, + "pct_branco": 1.2052173913043487, + "rgb": [ + 0.10793976165352379, + 0.12264930210547086, + 0.13704337555357568 + ], + "Lab": [ + 11.659324694740043, + -0.7076894486461455, + -3.076354254094271 + ], + "aStar": -0.7076894486461455, + "bStar": -3.076354254094271, + "croma": 3.156703953874833, + "matiz": 257.04497186372214, + "metal_ef": 0.6201584313725491, + "rough_ef": 0.376398431372549 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 49.03975923704451, + "Lmedia_por_texel": 51.07715985195497, + "Lp05": 20.45451259996559, + "Lp50": 50.54820590928463, + "Lp95": 69.6340891850245, + "Lp99": 98.61628973452102, + "pct_preto": 0.008626086956521738, + "pct_branco": 1.2096000000000007, + "rgb": [ + 0.181657673795918, + 0.20754484537204348, + 0.23285390302405196 + ], + "Lab": [ + 21.75282945168351, + -1.1089211779818364, + -4.99016217842827 + ], + "aStar": -1.1089211779818364, + "bStar": -4.99016217842827, + "croma": 5.111890525626757, + "matiz": 257.47123332731843, + "metal_ef": 0.34108713725490203, + "rough_ef": 0.376398431372549 + }, + "chao@treta_no_gelo": { + "Lmean": 34.16791739156404, + "Lmedia_por_texel": 38.62984584466098, + "Lp05": 12.492910161428398, + "Lp50": 32.83044002864294, + "Lp95": 66.42516614350563, + "Lp99": 79.92738088377783, + "pct_preto": 4.148869565217391, + "pct_branco": 0.0, + "rgb": [ + 0.09460272264583587, + 0.11073820569804992, + 0.12581609014646639 + ], + "Lab": [ + 10.124502597164362, + -0.8134307114229244, + -3.289850769683617 + ], + "aStar": -0.8134307114229244, + "bStar": -3.289850769683617, + "croma": 3.388921304644575, + "matiz": 256.1118992056103, + "metal_ef": 0.6201584313725491, + "rough_ef": 0.376398431372549 } } }, @@ -3890,6 +4358,84 @@ "matiz": 146.9894526537048, "metal_ef": 0.5187654901960784, "rough_ef": 0.2633960784313725 + }, + "vm@treta_no_gelo": { + "Lmean": 31.703404179545114, + "Lmedia_por_texel": 35.423913889680094, + "Lp05": 10.427729222836827, + "Lp50": 31.063405107215935, + "Lp95": 55.04260260813216, + "Lp99": 94.20518266741384, + "pct_preto": 10.626921739130434, + "pct_branco": 1.0528000000000008, + "rgb": [ + 0.0841635140639936, + 0.09713622656753633, + 0.10219480984537109 + ], + "Lab": [ + 8.348680308539006, + -1.2104279483112075, + -1.4423847998264572 + ], + "aStar": -1.2104279483112075, + "bStar": -1.4423847998264572, + "croma": 1.8829789507116876, + "matiz": 229.99712374189482, + "metal_ef": 0.5187654901960784, + "rough_ef": 0.2633960784313725 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 42.308783023314426, + "Lmedia_por_texel": 44.62177921172991, + "Lp05": 22.571267724837504, + "Lp50": 41.555890543870625, + "Lp95": 63.63054470014269, + "Lp99": 97.19012657586501, + "pct_preto": 0.05697391304347826, + "pct_branco": 1.1088000000000007, + "rgb": [ + 0.13188948713350027, + 0.1540151941685378, + 0.16524768322384717 + ], + "Lab": [ + 15.334654048239145, + -1.7279428293978938, + -2.7322261490544064 + ], + "aStar": -1.7279428293978938, + "bStar": -2.7322261490544064, + "croma": 3.232776848352554, + "matiz": 237.6894960198333, + "metal_ef": 0.2853210196078431, + "rough_ef": 0.2633960784313725 + }, + "chao@treta_no_gelo": { + "Lmean": 30.559817363659803, + "Lmedia_por_texel": 33.877022832881366, + "Lp05": 9.888070441024546, + "Lp50": 29.13828161661806, + "Lp95": 58.16944041631871, + "Lp99": 68.28415117918506, + "pct_preto": 12.84250434782609, + "pct_branco": 0.0, + "rgb": [ + 0.07724556322885508, + 0.08985471880307283, + 0.09357486321121528 + ], + "Lab": [ + 7.409435390198741, + -1.196208367869045, + -1.1738346813852663 + ], + "aStar": -1.196208367869045, + "bStar": -1.1738346813852663, + "croma": 1.6759481849337627, + "matiz": 224.45913230154014, + "metal_ef": 0.5187654901960784, + "rough_ef": 0.2633960784313725 } } }, @@ -4446,6 +4992,84 @@ "matiz": 264.7737704423674, "metal_ef": 0.35726274509803924, "rough_ef": 0.4065349019607843 + }, + "vm@treta_no_gelo": { + "Lmean": 34.3242092623857, + "Lmedia_por_texel": 37.01742857299168, + "Lp05": 20.147915575975865, + "Lp50": 32.59005324078035, + "Lp95": 49.09938164549996, + "Lp99": 92.80492414590958, + "pct_preto": 0.1328, + "pct_branco": 1.0172521739130438, + "rgb": [ + 0.0788714586602507, + 0.09827569724853713, + 0.1228262502418717 + ], + "Lab": [ + 8.553489578219853, + -0.39955510100198044, + -5.1203966529679015 + ], + "aStar": -0.39955510100198044, + "bStar": -5.1203966529679015, + "croma": 5.135962048386027, + "matiz": 265.5381337181112, + "metal_ef": 0.35726274509803924, + "rough_ef": 0.4065349019607843 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 43.70806993386795, + "Lmedia_por_texel": 45.763792739237154, + "Lp05": 28.800816702455826, + "Lp50": 42.85263676982434, + "Lp95": 58.05272293310489, + "Lp99": 96.34369232792527, + "pct_preto": 0.0, + "pct_branco": 1.1331478260869572, + "rgb": [ + 0.1254380863428362, + 0.15499372146873078, + 0.1909022390508027 + ], + "Lab": [ + 15.547497152964812, + -0.6265691264479845, + -7.061688595252058 + ], + "aStar": -0.6265691264479845, + "bStar": -7.061688595252058, + "croma": 7.089431196261853, + "matiz": 264.92954131227907, + "metal_ef": 0.1964945098039216, + "rough_ef": 0.4065349019607843 + }, + "chao@treta_no_gelo": { + "Lmean": 32.148291079562746, + "Lmedia_por_texel": 35.68236714132979, + "Lp05": 16.799558056864086, + "Lp50": 30.446939172641542, + "Lp95": 63.540686645607536, + "Lp99": 67.92712515621784, + "pct_preto": 0.4448695652173912, + "pct_branco": 0.0, + "rgb": [ + 0.07289726879275694, + 0.09125462811703557, + 0.11210558193612247 + ], + "Lab": [ + 7.628912094668337, + -0.5617485160786528, + -4.462294399237093 + ], + "aStar": -0.5617485160786528, + "bStar": -4.462294399237093, + "croma": 4.497514057874561, + "matiz": 262.82490336221446, + "metal_ef": 0.35726274509803924, + "rough_ef": 0.4065349019607843 } } }, @@ -5002,6 +5626,84 @@ "matiz": 267.59978504113303, "metal_ef": 0.33774901960784315, "rough_ef": 0.5028125490196079 + }, + "vm@treta_no_gelo": { + "Lmean": 33.17803118951315, + "Lmedia_por_texel": 35.18008585686794, + "Lp05": 16.081375909456547, + "Lp50": 32.08395628200324, + "Lp95": 60.95325122148043, + "Lp99": 69.79296628005764, + "pct_preto": 0.03353043478260869, + "pct_branco": 0.40563478260869584, + "rgb": [ + 0.08092079543064373, + 0.09912219079841754, + 0.12290099200387568 + ], + "Lab": [ + 8.681879936264586, + -0.3376047377551955, + -4.935875762281672 + ], + "aStar": -0.3376047377551955, + "bStar": -4.935875762281672, + "croma": 4.9474080587348395, + "matiz": 266.0871692745303, + "metal_ef": 0.33774901960784315, + "rough_ef": 0.5028125490196079 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 43.79188446659612, + "Lmedia_por_texel": 45.34829464205235, + "Lp05": 21.238320019752607, + "Lp50": 40.79313998685027, + "Lp95": 73.02023838272578, + "Lp99": 78.22848806821084, + "pct_preto": 0.0, + "pct_branco": 0.4168347826086959, + "rgb": [ + 0.14618113328138432, + 0.1765634709453954, + 0.21363791906519145 + ], + "Lab": [ + 18.133387685217606, + -0.66061436816503, + -7.1570410036366 + ], + "aStar": -0.66061436816503, + "bStar": -7.1570410036366, + "croma": 7.187464592689252, + "matiz": 264.72638639804154, + "metal_ef": 0.18576196078431373, + "rough_ef": 0.5028125490196079 + }, + "chao@treta_no_gelo": { + "Lmean": 30.64729082032788, + "Lmedia_por_texel": 33.52363237592698, + "Lp05": 11.638421220279, + "Lp50": 28.09624462059628, + "Lp95": 56.98959487539216, + "Lp99": 71.30345429803667, + "pct_preto": 7.397704347826087, + "pct_branco": 0.0, + "rgb": [ + 0.07483655205750075, + 0.09166537708774831, + 0.11309700514199467 + ], + "Lab": [ + 7.722787331570149, + -0.36058752627829427, + -4.508806963131046 + ], + "aStar": -0.36058752627829427, + "bStar": -4.508806963131046, + "croma": 4.523202802758959, + "matiz": 265.42755645730045, + "metal_ef": 0.33774901960784315, + "rough_ef": 0.5028125490196079 } } }, @@ -5558,6 +6260,84 @@ "matiz": 266.7883395236812, "metal_ef": 0.49659294117647057, "rough_ef": 0.34850039215686274 + }, + "vm@treta_no_gelo": { + "Lmean": 33.41334890374441, + "Lmedia_por_texel": 36.665998633190156, + "Lp05": 14.173527174302055, + "Lp50": 32.381454318711114, + "Lp95": 54.78444599705037, + "Lp99": 91.99210733556073, + "pct_preto": 2.359373913043478, + "pct_branco": 0.9987478260869567, + "rgb": [ + 0.08212483569472556, + 0.09959143449136898, + 0.12215975455379528 + ], + "Lab": [ + 8.745775822988811, + -0.3590493994262145, + -4.694455433527528 + ], + "aStar": -0.3590493994262145, + "bStar": -4.694455433527528, + "croma": 4.708166127974295, + "matiz": 265.62632089153567, + "metal_ef": 0.49659294117647057, + "rough_ef": 0.34850039215686274 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 44.40651781611572, + "Lmedia_por_texel": 46.614639898745416, + "Lp05": 21.60206684330069, + "Lp50": 44.636318360109286, + "Lp95": 65.3250047037336, + "Lp99": 95.83666100486771, + "pct_preto": 0.12132173913043476, + "pct_branco": 1.211060869565218, + "rgb": [ + 0.13944873756392548, + 0.16866195983843899, + 0.20429129098551838 + ], + "Lab": [ + 17.1992670786245, + -0.6435478040356657, + -6.927350226572093 + ], + "aStar": -0.6435478040356657, + "bStar": -6.927350226572093, + "croma": 6.957178662192567, + "matiz": 264.69248072475546, + "metal_ef": 0.27312611764705885, + "rough_ef": 0.34850039215686274 + }, + "chao@treta_no_gelo": { + "Lmean": 31.544727814385208, + "Lmedia_por_texel": 35.4074791483367, + "Lp05": 11.363716828105474, + "Lp50": 29.459508395164946, + "Lp95": 62.43008730366539, + "Lp99": 71.07406037351186, + "pct_preto": 6.096347826086958, + "pct_branco": 0.0, + "rgb": [ + 0.07547595104688548, + 0.09294691646542524, + 0.11380268228805555 + ], + "Lab": [ + 7.865375572603931, + -0.48167997871245705, + -4.429236349546784 + ], + "aStar": -0.48167997871245705, + "bStar": -4.429236349546784, + "croma": 4.45535074287524, + "matiz": 263.79346785471336, + "metal_ef": 0.49659294117647057, + "rough_ef": 0.34850039215686274 } } }, @@ -6114,6 +6894,84 @@ "matiz": 267.1806582710731, "metal_ef": 0.749035294117647, "rough_ef": 0.5204564705882353 + }, + "vm@treta_no_gelo": { + "Lmean": 27.107150676521076, + "Lmedia_por_texel": 30.472752073238183, + "Lp05": 9.397792736934559, + "Lp50": 25.344449161348585, + "Lp95": 50.288211818343726, + "Lp99": 85.99382539579192, + "pct_preto": 11.793530434782609, + "pct_branco": 0.0073043478260869585, + "rgb": [ + 0.06128202155506181, + 0.0705455645595634, + 0.08001724264171325 + ], + "Lab": [ + 5.339463840879684, + -0.3468629875081619, + -1.7455532343596536 + ], + "aStar": -0.3468629875081619, + "bStar": -1.7455532343596536, + "croma": 1.7796825632922673, + "matiz": 258.7610243261027, + "metal_ef": 0.749035294117647, + "rough_ef": 0.5204564705882353 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 38.91717603266631, + "Lmedia_por_texel": 41.3871689629251, + "Lp05": 18.435595328570187, + "Lp50": 38.238389099477246, + "Lp95": 61.9580221839434, + "Lp99": 92.00324923490258, + "pct_preto": 0.05071304347826086, + "pct_branco": 1.0006956521739134, + "rgb": [ + 0.11264619971797776, + 0.13090558596731938, + 0.15008930903968037 + ], + "Lab": [ + 12.658011190452847, + -0.7389506363917608, + -3.997268512632507 + ], + "aStar": -0.7389506363917608, + "bStar": -3.997268512632507, + "croma": 4.064997368401004, + "matiz": 259.52632208320426, + "metal_ef": 0.4119694117647059, + "rough_ef": 0.5204564705882353 + }, + "chao@treta_no_gelo": { + "Lmean": 24.068228074804427, + "Lmedia_por_texel": 28.818688878533244, + "Lp05": 7.215634338851766, + "Lp50": 20.035368854879643, + "Lp95": 56.55471070686208, + "Lp99": 69.85367005828134, + "pct_preto": 23.795339130434787, + "pct_branco": 0.0, + "rgb": [ + 0.053546918461484336, + 0.06239175431866739, + 0.07185630902875881 + ], + "Lab": [ + 4.546008809764206, + -0.2775581218675549, + -1.5795486299268469 + ], + "aStar": -0.2775581218675549, + "bStar": -1.5795486299268469, + "croma": 1.6037494771062042, + "matiz": 260.03373801140003, + "metal_ef": 0.749035294117647, + "rough_ef": 0.5204564705882353 } } }, @@ -6670,6 +7528,84 @@ "matiz": 267.2649705649817, "metal_ef": 0.38976, "rough_ef": 0.43755921568627454 + }, + "vm@treta_no_gelo": { + "Lmean": 30.495351512842166, + "Lmedia_por_texel": 33.74480842217129, + "Lp05": 12.394493595399897, + "Lp50": 29.513363504612755, + "Lp95": 50.2906595437784, + "Lp99": 90.06667843105053, + "pct_preto": 4.432765217391303, + "pct_branco": 0.8867478260869567, + "rgb": [ + 0.06780257976666627, + 0.08399411125297715, + 0.10514503747986063 + ], + "Lab": [ + 6.792215552156929, + -0.27813931244778656, + -4.3689249696337304 + ], + "aStar": -0.27813931244778656, + "bStar": -4.3689249696337304, + "croma": 4.377769622469645, + "matiz": 266.3572889742566, + "metal_ef": 0.38976, + "rough_ef": 0.43755921568627454 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 39.691005501735575, + "Lmedia_por_texel": 42.27114821341745, + "Lp05": 19.271493471314926, + "Lp50": 39.41842150174219, + "Lp95": 59.90620545536724, + "Lp99": 94.63214559305523, + "pct_preto": 0.08514782608695647, + "pct_branco": 1.1521391304347832, + "rgb": [ + 0.10911067371532049, + 0.13455490922224989, + 0.166628444675426 + ], + "Lab": [ + 13.089327618693119, + -0.48164760159181974, + -6.406069456770968 + ], + "aStar": -0.48164760159181974, + "bStar": -6.406069456770968, + "croma": 6.424150550624809, + "matiz": 265.7002417347569, + "metal_ef": 0.21436800000000003, + "rough_ef": 0.43755921568627454 + }, + "chao@treta_no_gelo": { + "Lmean": 28.04608723445087, + "Lmedia_por_texel": 32.36688232748994, + "Lp05": 9.441564975960098, + "Lp50": 25.21631411043866, + "Lp95": 61.135426497689096, + "Lp99": 68.84078413859872, + "pct_preto": 11.312417391304349, + "pct_branco": 0.0, + "rgb": [ + 0.061990899827061983, + 0.07725770969860556, + 0.09594354164328954 + ], + "Lab": [ + 6.017474703246343, + -0.3335739018041767, + -3.71521960950823 + ], + "aStar": -0.3335739018041767, + "bStar": -3.71521960950823, + "croma": 3.7301646471488823, + "matiz": 264.8694107841204, + "metal_ef": 0.38976, + "rough_ef": 0.43755921568627454 } } }, @@ -7226,6 +8162,84 @@ "matiz": 297.13782104957784, "metal_ef": 0.7195058823529412, "rough_ef": 0.39399372549019607 + }, + "vm@treta_no_gelo": { + "Lmean": 33.15736402319425, + "Lmedia_por_texel": 36.65190775013295, + "Lp05": 11.620429513864472, + "Lp50": 32.42346173817829, + "Lp95": 56.21450333604275, + "Lp99": 93.68391815937305, + "pct_preto": 5.378295652173913, + "pct_branco": 1.0625391304347835, + "rgb": [ + 0.0919143589299741, + 0.09918751611005804, + 0.1163794514697143 + ], + "Lab": [ + 8.885208745164434, + 0.34839486841174716, + -3.352064078370798 + ], + "aStar": 0.34839486841174716, + "bStar": -3.352064078370798, + "croma": 3.370120557166984, + "matiz": 275.933699374639, + "metal_ef": 0.7195058823529412, + "rough_ef": 0.39399372549019607 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 45.55235272032207, + "Lmedia_por_texel": 47.72948998324039, + "Lp05": 20.768423983372585, + "Lp50": 45.761902513211155, + "Lp95": 67.20372338521655, + "Lp99": 96.83550645471814, + "pct_preto": 0.18573913043478257, + "pct_branco": 1.199860869565218, + "rgb": [ + 0.15970954389725653, + 0.17627438358336261, + 0.20798686080166262 + ], + "Lab": [ + 18.347683992587392, + 0.3157991171045538, + -5.805341664668163 + ], + "aStar": 0.3157991171045538, + "bStar": -5.805341664668163, + "croma": 5.813924743742056, + "matiz": 273.1137083227966, + "metal_ef": 0.3957282352941177, + "rough_ef": 0.39399372549019607 + }, + "chao@treta_no_gelo": { + "Lmean": 30.329739417405513, + "Lmedia_por_texel": 35.06326196175039, + "Lp05": 9.103265359715024, + "Lp50": 27.54358712313499, + "Lp95": 63.94607661845403, + "Lp99": 77.72648524273826, + "pct_preto": 11.06587826086956, + "pct_branco": 0.0, + "rgb": [ + 0.08204716302953717, + 0.09018182571719945, + 0.10776511825376135 + ], + "Lab": [ + 7.7013305425694725, + 0.2851415953430969, + -3.4891722955890825 + ], + "aStar": 0.2851415953430969, + "bStar": -3.4891722955890825, + "croma": 3.500804055885047, + "matiz": 274.6719347916955, + "metal_ef": 0.7195058823529412, + "rough_ef": 0.39399372549019607 } } }, @@ -7782,6 +8796,84 @@ "matiz": 271.36943010766055, "metal_ef": 0.5731639215686275, "rough_ef": 0.4820533333333334 + }, + "vm@treta_no_gelo": { + "Lmean": 36.40555472143309, + "Lmedia_por_texel": 39.10776958229938, + "Lp05": 18.184797008308088, + "Lp50": 35.218150787620544, + "Lp95": 58.724325625827774, + "Lp99": 84.39700803218942, + "pct_preto": 1.1993043478260865, + "pct_branco": 0.6130782608695656, + "rgb": [ + 0.09981422828746887, + 0.1124088990435658, + 0.12644836177829663 + ], + "Lab": [ + 10.412229289312773, + -0.49766461639681736, + -2.9665633770911306 + ], + "aStar": -0.49766461639681736, + "bStar": -2.9665633770911306, + "croma": 3.008017343818304, + "matiz": 260.47685205650305, + "metal_ef": 0.5731639215686275, + "rough_ef": 0.4820533333333334 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 48.04810814140434, + "Lmedia_por_texel": 49.82071566494767, + "Lp05": 28.217917376357555, + "Lp50": 48.07865293863584, + "Lp95": 68.42412637157834, + "Lp99": 90.74338621586897, + "pct_preto": 0.0, + "pct_branco": 0.8550956521739135, + "rgb": [ + 0.1699544423251823, + 0.19238216787792226, + 0.21725920356456427 + ], + "Lab": [ + 20.051917179182638, + -0.7849571564647606, + -4.853379296628346 + ], + "aStar": -0.7849571564647606, + "bStar": -4.853379296628346, + "croma": 4.916446718355229, + "matiz": 260.8128702247625, + "metal_ef": 0.31524015686274515, + "rough_ef": 0.4820533333333334 + }, + "chao@treta_no_gelo": { + "Lmean": 32.63633221291781, + "Lmedia_por_texel": 36.75549833077598, + "Lp05": 13.916703204621953, + "Lp50": 30.75753266702528, + "Lp95": 62.86608902117837, + "Lp99": 79.59103649268907, + "pct_preto": 3.435965217391305, + "pct_branco": 0.0, + "rgb": [ + 0.08580882665151002, + 0.09846968109655235, + 0.1118883845566064 + ], + "Lab": [ + 8.615786490415129, + -0.5494322642377453, + -2.9083169141607246 + ], + "aStar": -0.5494322642377453, + "bStar": -2.9083169141607246, + "croma": 2.959760646771758, + "matiz": 259.30190067496494, + "metal_ef": 0.5731639215686275, + "rough_ef": 0.4820533333333334 } } }, @@ -8338,6 +9430,84 @@ "matiz": 21.20474427395783, "metal_ef": 0.5535827450980393, "rough_ef": 0.5134086274509804 + }, + "vm@treta_no_gelo": { + "Lmean": 35.68351251015059, + "Lmedia_por_texel": 37.98178838752978, + "Lp05": 16.614419850028618, + "Lp50": 35.69443395538287, + "Lp95": 54.53788693247124, + "Lp99": 80.71885672339647, + "pct_preto": 0.04417391304347826, + "pct_branco": 0.428034782608696, + "rgb": [ + 0.10626390336006941, + 0.10454097744899678, + 0.11401637606435674 + ], + "Lab": [ + 9.733010099943684, + 0.8395957362830192, + -1.5979360365358186 + ], + "aStar": 0.8395957362830192, + "bStar": -1.5979360365358186, + "croma": 1.8050818754960747, + "matiz": 297.7185641638705, + "metal_ef": 0.5535827450980393, + "rough_ef": 0.5134086274509804 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 47.14781645786313, + "Lmedia_por_texel": 48.805556334311945, + "Lp05": 29.07687714593957, + "Lp50": 46.5958587255711, + "Lp95": 64.53584109482696, + "Lp99": 88.07316199399908, + "pct_preto": 0.0, + "pct_branco": 0.6471652173913048, + "rgb": [ + 0.17591825290241214, + 0.17743408644869935, + 0.1951588842472901 + ], + "Lab": [ + 18.707510471935997, + 0.9438111513349057, + -2.959135199346985 + ], + "aStar": 0.9438111513349057, + "bStar": -2.959135199346985, + "croma": 3.106003962875521, + "matiz": 287.6899944117152, + "metal_ef": 0.3044705098039216, + "rough_ef": 0.5134086274509804 + }, + "chao@treta_no_gelo": { + "Lmean": 32.11374713633986, + "Lmedia_por_texel": 35.73807557769378, + "Lp05": 11.061087244887172, + "Lp50": 29.914189251753626, + "Lp95": 62.66329765901459, + "Lp99": 70.03331312263273, + "pct_preto": 7.32918260869565, + "pct_branco": 0.0, + "rgb": [ + 0.09482625474524067, + 0.09246591856948685, + 0.10014183943271251 + ], + "Lab": [ + 8.173319906988517, + 0.8072100245393038, + -1.272889868316368 + ], + "aStar": 0.8072100245393038, + "bStar": -1.272889868316368, + "croma": 1.5072613046778598, + "matiz": 302.3810491787798, + "metal_ef": 0.5535827450980393, + "rough_ef": 0.5134086274509804 } } }, @@ -8894,6 +10064,84 @@ "matiz": 269.38517317830895, "metal_ef": 0.2990572549019607, "rough_ef": 0.28835137254901966 + }, + "vm@treta_no_gelo": { + "Lmean": 28.475163608161186, + "Lmedia_por_texel": 32.440188269475385, + "Lp05": 13.333809257548161, + "Lp50": 26.052958066286465, + "Lp95": 46.12272152732298, + "Lp99": 97.76308136953466, + "pct_preto": 2.5860173913043476, + "pct_branco": 1.2173913043478268, + "rgb": [ + 0.061449296653591355, + 0.07504433526358702, + 0.09471864171334196 + ], + "Lab": [ + 5.819127431446226, + -0.10692909059382971, + -3.763864819311663 + ], + "aStar": -0.10692909059382971, + "bStar": -3.763864819311663, + "croma": 3.7653834078971613, + "matiz": 268.3726997519851, + "metal_ef": 0.2990572549019607, + "rough_ef": 0.28835137254901966 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 36.866191635433125, + "Lmedia_por_texel": 39.79916415136815, + "Lp05": 20.299354551564846, + "Lp50": 36.27639229721117, + "Lp95": 53.74073990428312, + "Lp99": 99.852774079648, + "pct_preto": 0.0, + "pct_branco": 1.2173913043478266, + "rgb": [ + 0.0933775592959882, + 0.11500360274840371, + 0.14447358839729943 + ], + "Lab": [ + 10.698322554492641, + -0.26108007236362585, + -5.948373925406846 + ], + "aStar": -0.26108007236362585, + "bStar": -5.948373925406846, + "croma": 5.954100701251655, + "matiz": 267.4868439841799, + "metal_ef": 0.16448149019607844, + "rough_ef": 0.28835137254901966 + }, + "chao@treta_no_gelo": { + "Lmean": 27.17539505152569, + "Lmedia_por_texel": 31.329933857928378, + "Lp05": 11.828750470409076, + "Lp50": 24.348438505546383, + "Lp95": 56.85735191549588, + "Lp99": 64.75758355814789, + "pct_preto": 5.623443478260868, + "pct_branco": 0.0, + "rgb": [ + 0.05619163110391214, + 0.07037219387471338, + 0.08928441445453326 + ], + "Lab": [ + 5.309175304364988, + -0.19229647396599991, + -3.4697088795888176 + ], + "aStar": -0.19229647396599991, + "bStar": -3.4697088795888176, + "croma": 3.475033473651332, + "matiz": 266.82782706695264, + "metal_ef": 0.2990572549019607, + "rough_ef": 0.28835137254901966 } } }, @@ -9450,6 +10698,84 @@ "matiz": 261.86253205866336, "metal_ef": 0.07786509803921567, "rough_ef": 0.32012235294117647 + }, + "vm@treta_no_gelo": { + "Lmean": 37.56022471374518, + "Lmedia_por_texel": 40.080523823739554, + "Lp05": 19.50857245018716, + "Lp50": 36.84188968489142, + "Lp95": 54.63866348510976, + "Lp99": 97.55647667204074, + "pct_preto": 0.26817391304347826, + "pct_branco": 1.211547826086957, + "rgb": [ + 0.09671106456226113, + 0.11874404450822605, + 0.1462650196469837 + ], + "Lab": [ + 11.138926877735724, + -0.4705887112982782, + -5.609496979142597 + ], + "aStar": -0.4705887112982782, + "bStar": -5.609496979142597, + "croma": 5.629201550327657, + "matiz": 265.2046038441057, + "metal_ef": 0.07786509803921567, + "rough_ef": 0.32012235294117647 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 45.22699997731446, + "Lmedia_por_texel": 47.27362923063682, + "Lp05": 25.36772841907686, + "Lp50": 45.074679578461335, + "Lp95": 62.996304058841446, + "Lp99": 99.67914008436597, + "pct_preto": 0.0, + "pct_branco": 1.214469565217392, + "rgb": [ + 0.1404572397490113, + 0.17064980481740027, + 0.20651821356710656 + ], + "Lab": [ + 17.41892550316328, + -0.7242319078046289, + -6.988746572721083 + ], + "aStar": -0.7242319078046289, + "bStar": -6.988746572721083, + "croma": 7.026171824970054, + "matiz": 264.0836538160562, + "metal_ef": 0.04282580392156863, + "rough_ef": 0.32012235294117647 + }, + "chao@treta_no_gelo": { + "Lmean": 35.995710236595535, + "Lmedia_por_texel": 38.97322523234915, + "Lp05": 16.91688365945687, + "Lp50": 34.724557204896506, + "Lp95": 64.90151330358923, + "Lp99": 68.39585776308144, + "pct_preto": 0.8377739130434781, + "pct_branco": 0.0, + "rgb": [ + 0.09110757691607227, + 0.11222127709356594, + 0.13471918307301575 + ], + "Lab": [ + 10.277563076796643, + -0.7704978252452005, + -4.752268207909416 + ], + "aStar": -0.7704978252452005, + "bStar": -4.752268207909416, + "croma": 4.81432446129404, + "matiz": 260.79062121361204, + "metal_ef": 0.07786509803921567, + "rough_ef": 0.32012235294117647 } } }, @@ -10006,6 +11332,84 @@ "matiz": 264.2504045440904, "metal_ef": 0.04073098039215686, "rough_ef": 0.36523921568627454 + }, + "vm@treta_no_gelo": { + "Lmean": 30.68934868123351, + "Lmedia_por_texel": 34.0091151620117, + "Lp05": 16.8528424306826, + "Lp50": 27.29059412759983, + "Lp95": 44.974818489750774, + "Lp99": 96.74856532088147, + "pct_preto": 0.052939130434782586, + "pct_branco": 1.2105739130434785, + "rgb": [ + 0.06607170411096154, + 0.0821504006712747, + 0.1022354562968407 + ], + "Lab": [ + 6.567701548103869, + -0.33618114323868964, + -4.135583005020865 + ], + "aStar": -0.33618114323868964, + "bStar": -4.135583005020865, + "croma": 4.149224572433587, + "matiz": 265.3526502756117, + "metal_ef": 0.04073098039215686, + "rough_ef": 0.36523921568627454 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 37.43157233771581, + "Lmedia_por_texel": 40.267235979050355, + "Lp05": 22.22333966210084, + "Lp50": 35.14001813881234, + "Lp95": 52.21832488952299, + "Lp99": 98.92758439875418, + "pct_preto": 0.0, + "pct_branco": 1.2134956521739138, + "rgb": [ + 0.09438874162963655, + 0.1170815391018202, + 0.1436589119681722 + ], + "Lab": [ + 10.903539218785355, + -0.6122291419938114, + -5.482309035899507 + ], + "aStar": -0.6122291419938114, + "bStar": -5.482309035899507, + "croma": 5.516388029083148, + "matiz": 263.62797546846707, + "metal_ef": 0.02240203921568628, + "rough_ef": 0.36523921568627454 + }, + "chao@treta_no_gelo": { + "Lmean": 28.776331933407953, + "Lmedia_por_texel": 32.97552949869137, + "Lp05": 13.991082298623784, + "Lp50": 26.285535249390072, + "Lp95": 63.700492818976244, + "Lp99": 66.04272782964361, + "pct_preto": 0.19290434782608692, + "pct_branco": 0.0, + "rgb": [ + 0.06136452658631113, + 0.07739631996526952, + 0.09576068826418749 + ], + "Lab": [ + 6.014282086085547, + -0.4251124384911653, + -3.6852028572009865 + ], + "aStar": -0.4251124384911653, + "bStar": -3.6852028572009865, + "croma": 3.70964158431542, + "matiz": 263.4196399363021, + "metal_ef": 0.04073098039215686, + "rough_ef": 0.36523921568627454 } } }, @@ -10562,6 +11966,84 @@ "matiz": 268.20550903159983, "metal_ef": 0.5008360784313726, "rough_ef": 0.3276627450980392 + }, + "vm@treta_no_gelo": { + "Lmean": 34.22764805430198, + "Lmedia_por_texel": 37.596019591828046, + "Lp05": 13.794051808277008, + "Lp50": 33.390642067109, + "Lp95": 56.58264628767898, + "Lp99": 96.59432083472146, + "pct_preto": 1.4893217391304348, + "pct_branco": 1.1803826086956528, + "rgb": [ + 0.08723894200887992, + 0.10565926400026426, + 0.13028533621892838 + ], + "Lab": [ + 9.526929766117977, + -0.303663524383338, + -5.054048051396226 + ], + "aStar": -0.303663524383338, + "bStar": -5.054048051396226, + "croma": 5.063162375616932, + "matiz": 266.56161811973726, + "metal_ef": 0.5008360784313726, + "rough_ef": 0.3276627450980392 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 44.991805093823515, + "Lmedia_por_texel": 47.33089165984888, + "Lp05": 18.34197664297413, + "Lp50": 45.94946431217627, + "Lp95": 67.1221027311365, + "Lp99": 98.8082956890095, + "pct_preto": 0.06518260869565218, + "pct_branco": 1.2154434782608703, + "rgb": [ + 0.14685933170228269, + 0.17769037967593446, + 0.21689656841068072 + ], + "Lab": [ + 18.28099506569847, + -0.5415926533632598, + -7.507610023957223 + ], + "aStar": -0.5415926533632598, + "bStar": -7.507610023957223, + "croma": 7.527119693083141, + "matiz": 265.87387842258767, + "metal_ef": 0.2754598431372549, + "rough_ef": 0.3276627450980392 + }, + "chao@treta_no_gelo": { + "Lmean": 32.27350856233189, + "Lmedia_por_texel": 36.44562912000457, + "Lp05": 11.061827053932976, + "Lp50": 30.23722684637535, + "Lp95": 64.45657500868286, + "Lp99": 74.86759318731303, + "pct_preto": 7.620730434782609, + "pct_branco": 0.0, + "rgb": [ + 0.08008314702170692, + 0.0992834594756454, + 0.12297244969623713 + ], + "Lab": [ + 8.67832409781461, + -0.45148171446261764, + -4.956839742768182 + ], + "aStar": -0.45148171446261764, + "bStar": -4.956839742768182, + "croma": 4.977358332889067, + "matiz": 264.7957129659758, + "metal_ef": 0.5008360784313726, + "rough_ef": 0.3276627450980392 } } }, @@ -11118,6 +12600,84 @@ "matiz": 56.16942491740241, "metal_ef": 0.6914870588235295, "rough_ef": 0.41562352941176467 + }, + "vm@treta_no_gelo": { + "Lmean": 38.21215909165936, + "Lmedia_por_texel": 41.03957922393855, + "Lp05": 19.104864697223185, + "Lp50": 38.63010281601324, + "Lp95": 55.321227763757406, + "Lp99": 87.24073937191778, + "pct_preto": 0.0, + "pct_branco": 0.9787826086956525, + "rgb": [ + 0.12281858586973503, + 0.1196526728591145, + 0.11720057416295292 + ], + "Lab": [ + 11.580399776639634, + 0.2287121491683919, + 0.5622849823121834 + ], + "aStar": 0.2287121491683919, + "bStar": 0.5622849823121834, + "croma": 0.6070203032115459, + "matiz": 67.86572738593833, + "metal_ef": 0.6914870588235295, + "rough_ef": 0.41562352941176467 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 51.08070550555284, + "Lmedia_por_texel": 52.667752732858155, + "Lp05": 35.03766740572975, + "Lp50": 50.42652170286814, + "Lp95": 65.01229739153166, + "Lp99": 92.61315394027717, + "pct_preto": 0.0, + "pct_branco": 1.0045913043478265, + "rgb": [ + 0.20588006837903644, + 0.20834137661544477, + 0.20936094864845564 + ], + "Lab": [ + 22.166415039965926, + -0.2114254961564921, + -0.25893160869668863 + ], + "aStar": -0.2114254961564921, + "bStar": -0.25893160869668863, + "croma": 0.33428478638321835, + "matiz": 230.76732141763097, + "metal_ef": 0.38031788235294123, + "rough_ef": 0.41562352941176467 + }, + "chao@treta_no_gelo": { + "Lmean": 35.27941857587042, + "Lmedia_por_texel": 39.33213275394024, + "Lp05": 15.73927492029338, + "Lp50": 33.30239078465903, + "Lp95": 65.8147740801394, + "Lp99": 74.87758948835821, + "pct_preto": 0.0, + "pct_branco": 0.0, + "rgb": [ + 0.1113319096643507, + 0.10947297688906253, + 0.10821059923814848 + ], + "Lab": [ + 10.26518948848074, + 0.1460997497854527, + 0.302530454601152 + ], + "aStar": 0.1460997497854527, + "bStar": 0.302530454601152, + "croma": 0.335961028764575, + "matiz": 64.22290649535176, + "metal_ef": 0.6914870588235295, + "rough_ef": 0.41562352941176467 } } }, @@ -11674,6 +13234,84 @@ "matiz": 73.6256948802453, "metal_ef": 0.31780392156862747, "rough_ef": 0.4084517647058824 + }, + "vm@treta_no_gelo": { + "Lmean": 39.07593667344407, + "Lmedia_por_texel": 41.746313123370264, + "Lp05": 15.467767518348541, + "Lp50": 38.53795573783585, + "Lp95": 64.6939038629343, + "Lp99": 93.48610110996381, + "pct_preto": 1.8596173913043479, + "pct_branco": 1.150191304347827, + "rgb": [ + 0.12655631905217496, + 0.1350822742346135, + 0.14244931271002184 + ], + "Lab": [ + 13.29407555016575, + -0.507843141565989, + -1.603986440546823 + ], + "aStar": -0.507843141565989, + "bStar": -1.603986440546823, + "croma": 1.6824616363809548, + "matiz": 252.4315299682072, + "metal_ef": 0.31780392156862747, + "rough_ef": 0.4084517647058824 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 47.934202286716676, + "Lmedia_por_texel": 50.07266455308599, + "Lp05": 20.3237001849703, + "Lp50": 48.61702965493035, + "Lp95": 73.2647699775097, + "Lp99": 96.47632848797737, + "pct_preto": 0.10622608695652173, + "pct_branco": 1.2173913043478268, + "rgb": [ + 0.19066410079035315, + 0.20414303078923338, + 0.21538195259505527 + ], + "Lab": [ + 21.50427291393948, + -0.7719253022058226, + -2.315407199258035 + ], + "aStar": -0.7719253022058226, + "bStar": -2.315407199258035, + "croma": 2.440692354755406, + "matiz": 251.56231407245576, + "metal_ef": 0.1747921568627451, + "rough_ef": 0.4084517647058824 + }, + "chao@treta_no_gelo": { + "Lmean": 36.420717267293384, + "Lmedia_por_texel": 40.03312963512416, + "Lp05": 12.365633330778241, + "Lp50": 34.54890956860211, + "Lp95": 66.18680519683042, + "Lp99": 80.46378496737313, + "pct_preto": 4.567234782608696, + "pct_branco": 0.0, + "rgb": [ + 0.11391545742850917, + 0.12297338612171677, + 0.128764274811062 + ], + "Lab": [ + 11.753631520958546, + -0.6818265472871982, + -1.3737948999578753 + ], + "aStar": -0.6818265472871982, + "bStar": -1.3737948999578753, + "croma": 1.533688321575101, + "matiz": 243.60438901108262, + "metal_ef": 0.31780392156862747, + "rough_ef": 0.4084517647058824 } } }, @@ -12230,6 +13868,84 @@ "matiz": 32.86303973813199, "metal_ef": 0.4659780392156863, "rough_ef": 0.6615796078431373 + }, + "vm@treta_no_gelo": { + "Lmean": 31.653242406949435, + "Lmedia_por_texel": 33.764434937006676, + "Lp05": 14.312429583329024, + "Lp50": 31.021764172867428, + "Lp95": 52.09673337921927, + "Lp99": 67.34874705767717, + "pct_preto": 1.6895999999999998, + "pct_branco": 0.22886956521739146, + "rgb": [ + 0.09937524941645412, + 0.07879487922603255, + 0.07646369643523736 + ], + "Lab": [ + 6.895537129865595, + 2.352215836504648, + 1.2384081289317783 + ], + "aStar": 2.352215836504648, + "bStar": 1.2384081289317783, + "croma": 2.6583028486813856, + "matiz": 27.766165911171413, + "metal_ef": 0.4659780392156863, + "rough_ef": 0.6615796078431373 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 42.581124177366036, + "Lmedia_por_texel": 44.12003510487159, + "Lp05": 26.972469358143087, + "Lp50": 41.336661499474275, + "Lp95": 64.51671703642381, + "Lp99": 76.19323108251561, + "pct_preto": 0.011408695652173912, + "pct_branco": 0.4587130434782611, + "rgb": [ + 0.16650311640001356, + 0.14008842074032932, + 0.1392269714053175 + ], + "Lab": [ + 14.797287687596079, + 3.1201253837292997, + 1.3150036914685526 + ], + "aStar": 3.1201253837292997, + "bStar": 1.3150036914685526, + "croma": 3.3859145173450305, + "matiz": 22.853409102352202, + "metal_ef": 0.25628792156862745, + "rough_ef": 0.6615796078431373 + }, + "chao@treta_no_gelo": { + "Lmean": 28.336864030650222, + "Lmedia_por_texel": 31.723880934168346, + "Lp05": 9.87894687876716, + "Lp50": 26.367730750087084, + "Lp95": 52.818539039343904, + "Lp99": 69.22996766923366, + "pct_preto": 9.773286956521739, + "pct_branco": 0.0, + "rgb": [ + 0.08994561736803239, + 0.06824855168493098, + 0.06608604126056702 + ], + "Lab": [ + 5.735508383918475, + 2.2597489069299814, + 1.134901292594731 + ], + "aStar": 2.2597489069299814, + "bStar": 1.134901292594731, + "croma": 2.5287281519183584, + "matiz": 26.666924553008187, + "metal_ef": 0.4659780392156863, + "rough_ef": 0.6615796078431373 } } }, @@ -12786,6 +14502,84 @@ "matiz": 354.8824524843353, "metal_ef": 0.5383984313725491, "rough_ef": 0.36683921568627453 + }, + "vm@treta_no_gelo": { + "Lmean": 36.69135393208334, + "Lmedia_por_texel": 39.559988653872345, + "Lp05": 17.849280631346282, + "Lp50": 36.52548956683278, + "Lp95": 54.545944676814855, + "Lp99": 96.22552227524604, + "pct_preto": 0.3778086956521738, + "pct_branco": 1.2086260869565224, + "rgb": [ + 0.11776518068123665, + 0.1087361929253306, + 0.1294898054153213 + ], + "Lab": [ + 10.587173470763094, + 2.46545678781529, + -3.2303425420591783 + ], + "aStar": 2.46545678781529, + "bStar": -3.2303425420591783, + "croma": 4.063691685108732, + "matiz": 307.35153886985825, + "metal_ef": 0.5383984313725491, + "rough_ef": 0.36683921568627453 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 47.942557859489554, + "Lmedia_por_texel": 49.779178648619784, + "Lp05": 30.129916767132386, + "Lp50": 48.03221752242777, + "Lp95": 64.17387165254347, + "Lp99": 98.5041017674134, + "pct_preto": 0.0, + "pct_branco": 1.21544347826087, + "rgb": [ + 0.1869992768670352, + 0.1811598195230158, + 0.2165955028730426 + ], + "Lab": [ + 19.507759168110013, + 2.896805461581775, + -5.511674522776822 + ], + "aStar": 2.896805461581775, + "bStar": -5.511674522776822, + "croma": 6.226559076028839, + "matiz": 297.72535133868814, + "metal_ef": 0.296119137254902, + "rough_ef": 0.36683921568627453 + }, + "chao@treta_no_gelo": { + "Lmean": 34.36847771333244, + "Lmedia_por_texel": 38.21842498536419, + "Lp05": 14.46048458523844, + "Lp50": 32.817430066044416, + "Lp95": 66.22934404505548, + "Lp99": 74.23007922985202, + "pct_preto": 1.8082086956521737, + "pct_branco": 0.0, + "rgb": [ + 0.1099213509948529, + 0.10098301911790011, + 0.12019714584446017 + ], + "Lab": [ + 9.578886073542115, + 2.3725989973702593, + -2.9945396251726097 + ], + "aStar": 2.3725989973702593, + "bStar": -2.9945396251726097, + "croma": 3.820535769895536, + "matiz": 308.39008217111086, + "metal_ef": 0.5383984313725491, + "rough_ef": 0.36683921568627453 } } }, @@ -13342,6 +15136,84 @@ "matiz": 41.86871493725732, "metal_ef": 0.4697207843137255, "rough_ef": 0.4065098039215686 + }, + "vm@treta_no_gelo": { + "Lmean": 38.85100061954119, + "Lmedia_por_texel": 41.45695377571865, + "Lp05": 15.099029734266118, + "Lp50": 39.54931832759965, + "Lp95": 60.487381450689156, + "Lp99": 91.85025407068866, + "pct_preto": 2.514434782608695, + "pct_branco": 0.9938782608695654, + "rgb": [ + 0.14403541307963252, + 0.12603308420561884, + 0.12661146654987268 + ], + "Lab": [ + 12.826918928435386, + 2.215462377943039, + 0.6951595186420301 + ], + "aStar": 2.215462377943039, + "bStar": 0.6951595186420301, + "croma": 2.321964750903778, + "matiz": 17.420619458805845, + "metal_ef": 0.4697207843137255, + "rough_ef": 0.4065098039215686 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 49.73311096384659, + "Lmedia_por_texel": 51.46341703059529, + "Lp05": 24.406642687530386, + "Lp50": 50.6120512318835, + "Lp95": 69.06222513579664, + "Lp99": 95.71966622905731, + "pct_preto": 0.1791304347826087, + "pct_branco": 1.1014956521739139, + "rgb": [ + 0.21885525012649445, + 0.2025489748751015, + 0.20844181155364613 + ], + "Lab": [ + 22.01135435201931, + 2.1652744360063925, + -0.2877135545925169 + ], + "aStar": 2.1652744360063925, + "bStar": -0.2877135545925169, + "croma": 2.184305947599617, + "matiz": 352.4310894774111, + "metal_ef": 0.25834643137254903, + "rough_ef": 0.4065098039215686 + }, + "chao@treta_no_gelo": { + "Lmean": 36.58847073190199, + "Lmedia_por_texel": 40.035746810020996, + "Lp05": 11.76961237560895, + "Lp50": 36.160286259514386, + "Lp95": 66.64306264616012, + "Lp99": 74.63348481296951, + "pct_preto": 5.207721739130435, + "pct_branco": 0.0, + "rgb": [ + 0.13529023844263963, + 0.11709090410842415, + 0.11638800442382699 + ], + "Lab": [ + 11.703318206550552, + 2.189267998702518, + 0.9369722274097159 + ], + "aStar": 2.189267998702518, + "bStar": 0.9369722274097159, + "croma": 2.3813465361177597, + "matiz": 23.17016217019159, + "metal_ef": 0.4697207843137255, + "rough_ef": 0.4065098039215686 } } }, @@ -13898,6 +15770,84 @@ "matiz": 262.73821829847157, "metal_ef": 0.3309505882352941, "rough_ef": 0.4665992156862745 + }, + "vm@treta_no_gelo": { + "Lmean": 35.95169392910092, + "Lmedia_por_texel": 38.466219398481925, + "Lp05": 15.563824198242347, + "Lp50": 36.15426291045941, + "Lp95": 54.0109404423671, + "Lp99": 87.57250097571989, + "pct_preto": 2.0019478260869565, + "pct_branco": 0.7732869565217396, + "rgb": [ + 0.08836330785431713, + 0.10999389462626652, + 0.13613428053035956 + ], + "Lab": [ + 10.02382293854842, + -0.5246325805346314, + -5.409210136908843 + ], + "aStar": -0.5246325805346314, + "bStar": -5.409210136908843, + "croma": 5.434592316797628, + "matiz": 264.4602804465461, + "metal_ef": 0.3309505882352941, + "rough_ef": 0.4665992156862745 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 45.21439481010589, + "Lmedia_por_texel": 47.25892442399836, + "Lp05": 22.374545419755904, + "Lp50": 45.95609323785069, + "Lp95": 63.546158844096624, + "Lp99": 92.89051870721202, + "pct_preto": 0.16640000000000002, + "pct_branco": 1.0357565217391311, + "rgb": [ + 0.14018711710024642, + 0.17208622431128204, + 0.20954794665245058 + ], + "Lab": [ + 17.57184348008291, + -0.7682913589661944, + -7.295582619083052 + ], + "aStar": -0.7682913589661944, + "bStar": -7.295582619083052, + "croma": 7.335925119855631, + "matiz": 263.98838968599915, + "metal_ef": 0.1820228235294118, + "rough_ef": 0.4665992156862745 + }, + "chao@treta_no_gelo": { + "Lmean": 33.30748143682418, + "Lmedia_por_texel": 36.79257912725428, + "Lp05": 12.080574727126777, + "Lp50": 31.745555446730272, + "Lp95": 64.37781554401752, + "Lp99": 69.56438182990365, + "pct_preto": 4.891339130434783, + "pct_branco": 0.0, + "rgb": [ + 0.08039009593573215, + 0.10012114487029737, + 0.12161001183626523 + ], + "Lab": [ + 8.748751478081907, + -0.6904391454413544, + -4.588541409844781 + ], + "aStar": -0.6904391454413544, + "bStar": -4.588541409844781, + "croma": 4.640195953127209, + "matiz": 261.44288364986147, + "metal_ef": 0.3309505882352941, + "rough_ef": 0.4665992156862745 } } }, @@ -14454,6 +16404,84 @@ "matiz": 270.2901044610101, "metal_ef": 0.7173474509803922, "rough_ef": 0.32817411764705884 + }, + "vm@treta_no_gelo": { + "Lmean": 27.50612141324035, + "Lmedia_por_texel": 31.776235020761995, + "Lp05": 12.261594019189133, + "Lp50": 25.75202871937112, + "Lp95": 45.33308787313588, + "Lp99": 97.53446012199902, + "pct_preto": 3.7803826086956516, + "pct_branco": 1.1974260869565223, + "rgb": [ + 0.05965442471297929, + 0.0720894337063236, + 0.08970526437161606 + ], + "Lab": [ + 5.508449416052368, + -0.13183613741288291, + -3.2502251907376767 + ], + "aStar": -0.13183613741288291, + "bStar": -3.2502251907376767, + "croma": 3.2528978707659597, + "matiz": 267.6772330358217, + "metal_ef": 0.7173474509803922, + "rough_ef": 0.32817411764705884 + }, + "vmLegado@treta_no_gelo": { + "Lmean": 39.23371202228858, + "Lmedia_por_texel": 41.9238000876031, + "Lp05": 20.69980086119265, + "Lp50": 38.77809747077548, + "Lp95": 55.67112932220799, + "Lp99": 99.66154247143174, + "pct_preto": 0.035547826086956516, + "pct_branco": 1.2173913043478266, + "rgb": [ + 0.10507561850586943, + 0.1291430521893297, + 0.16141054844777833 + ], + "Lab": [ + 12.450123004826718, + -0.3149082613665005, + -6.4220497617644865 + ], + "aStar": -0.3149082613665005, + "bStar": -6.4220497617644865, + "croma": 6.42976596429887, + "matiz": 267.1927227997644, + "metal_ef": 0.3945410980392157, + "rough_ef": 0.32817411764705884 + }, + "chao@treta_no_gelo": { + "Lmean": 25.72971355512959, + "Lmedia_por_texel": 30.812924971057836, + "Lp05": 10.122391735725348, + "Lp50": 21.993707409765342, + "Lp95": 59.51325502065326, + "Lp99": 67.35022232878804, + "pct_preto": 18.957217391304347, + "pct_branco": 0.0, + "rgb": [ + 0.05457632177120524, + 0.06802050189839931, + 0.08603004439697363 + ], + "Lab": [ + 5.07702855840753, + -0.17939074880411743, + -3.2088124754301783 + ], + "aStar": -0.17939074880411743, + "bStar": -3.2088124754301783, + "croma": 3.213823041679932, + "matiz": 266.8001730252423, + "metal_ef": 0.7173474509803922, + "rough_ef": 0.32817411764705884 } } } diff --git a/tools/eval/pickup_check.json b/tools/eval/pickup_check.json index 62407ba40..dd5a97cbf 100644 --- a/tools/eval/pickup_check.json +++ b/tools/eval/pickup_check.json @@ -1,5 +1,5 @@ { - "gerado": "2026-08-16T03:26:37.943Z", + "gerado": "2026-08-18T22:47:04.250Z", "criterios": { "chaoMinimoM": -0.1, "vaoMaximoM": 0.05, @@ -9,7 +9,7 @@ "reta": "reta andável de um spawn do time" } }, - "totalPickups": 440, + "totalPickups": 514, "semAlcance": 0, "abaixoDoPiso": 0, "flutuando": 0, @@ -8499,6 +8499,1430 @@ "okAssentada": true } ] + }, + { + "map": "treta_no_gelo", + "waypoints": 652, + "pickups": 74, + "spawnPiorDistWaypoint": 1.77, + "celulasAlcancadas": 78616, + "semAlcance": 0, + "semAlcanceWpVelho": 0, + "semAlcanceRetaVelho": 2, + "piorDistAndavel": 0.19, + "abaixoDoPiso": 0, + "flutuando": 0, + "piorDistWaypoint": 2.84, + "piorChao": 0, + "piorVao": 0.01, + "itens": [ + { + "arma": "ak", + "fonte": "mapa", + "x": -16, + "z": -13, + "chao": 0, + "distWaypoint": 0.51, + "yOrigem": 0.165, + "vaoOrigem": 0.165, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.14, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "ak", + "fonte": "mapa", + "x": 16, + "z": 13, + "chao": 0, + "distWaypoint": 0.91, + "yOrigem": 0.165, + "vaoOrigem": 0.165, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.14, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "m4", + "fonte": "mapa", + "x": -13.09, + "z": -10.5, + "chao": 0.935, + "distWaypoint": 0.72, + "yOrigem": 1.1, + "vaoOrigem": 0.165, + "baseMesh": 0.945, + "vao": 0.01, + "distAndavel": 0.1, + "retaDoSpawn": false, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": false, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "m4", + "fonte": "mapa", + "x": 13.09, + "z": 10.5, + "chao": 0.935, + "distWaypoint": 0.71, + "yOrigem": 1.1, + "vaoOrigem": 0.165, + "baseMesh": 0.945, + "vao": 0.01, + "distAndavel": 0.12, + "retaDoSpawn": false, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": false, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "awp", + "fonte": "mapa", + "x": -10.18, + "z": -13, + "chao": 0, + "distWaypoint": 0.92, + "yOrigem": 0.165, + "vaoOrigem": 0.165, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.13, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "awp", + "fonte": "mapa", + "x": 10.18, + "z": 13, + "chao": 0, + "distWaypoint": 0.95, + "yOrigem": 0.165, + "vaoOrigem": 0.165, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.1, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "shotgun", + "fonte": "mapa", + "x": -7.27, + "z": -10.5, + "chao": 0, + "distWaypoint": 2.83, + "yOrigem": 0.165, + "vaoOrigem": 0.165, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.13, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "shotgun", + "fonte": "mapa", + "x": 7.27, + "z": 10.5, + "chao": 0, + "distWaypoint": 0.88, + "yOrigem": 0.165, + "vaoOrigem": 0.165, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.19, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "mp5", + "fonte": "mapa", + "x": -4.36, + "z": -13, + "chao": 0, + "distWaypoint": 1.34, + "yOrigem": 0.165, + "vaoOrigem": 0.165, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.1, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "mp5", + "fonte": "mapa", + "x": 4.36, + "z": 13, + "chao": 0, + "distWaypoint": 1.16, + "yOrigem": 0.165, + "vaoOrigem": 0.165, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.11, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "smg", + "fonte": "mapa", + "x": -1.45, + "z": -10.5, + "chao": 0, + "distWaypoint": 2.84, + "yOrigem": 0.165, + "vaoOrigem": 0.165, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.14, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "smg", + "fonte": "mapa", + "x": 1.45, + "z": 10.5, + "chao": 0, + "distWaypoint": 1.18, + "yOrigem": 0.165, + "vaoOrigem": 0.165, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.16, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "deagle", + "fonte": "mapa", + "x": 1.45, + "z": -13, + "chao": 0, + "distWaypoint": 0.95, + "yOrigem": 0.165, + "vaoOrigem": 0.165, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.11, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "deagle", + "fonte": "mapa", + "x": -1.45, + "z": 13, + "chao": 0, + "distWaypoint": 1.46, + "yOrigem": 0.165, + "vaoOrigem": 0.165, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.14, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "pistol", + "fonte": "mapa", + "x": 4.36, + "z": -10.5, + "chao": 0, + "distWaypoint": 2.7, + "yOrigem": 0.165, + "vaoOrigem": 0.165, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.11, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "pistol", + "fonte": "mapa", + "x": -4.36, + "z": 10.5, + "chao": 0, + "distWaypoint": 1.51, + "yOrigem": 0.165, + "vaoOrigem": 0.165, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.15, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "ak", + "fonte": "mapa", + "x": 7.27, + "z": -13, + "chao": 0, + "distWaypoint": 0.54, + "yOrigem": 0.165, + "vaoOrigem": 0.165, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.16, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "ak", + "fonte": "mapa", + "x": -7.27, + "z": 13, + "chao": 0, + "distWaypoint": 1.44, + "yOrigem": 0.165, + "vaoOrigem": 0.165, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.13, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "m4", + "fonte": "mapa", + "x": 10.18, + "z": -10.5, + "chao": 0, + "distWaypoint": 2.62, + "yOrigem": 0.165, + "vaoOrigem": 0.165, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.1, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "m4", + "fonte": "mapa", + "x": -10.18, + "z": 10.5, + "chao": 0, + "distWaypoint": 1.15, + "yOrigem": 0.165, + "vaoOrigem": 0.165, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.17, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "awp", + "fonte": "mapa", + "x": 13.09, + "z": -13, + "chao": 0, + "distWaypoint": 0.15, + "yOrigem": 0.165, + "vaoOrigem": 0.165, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.12, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "awp", + "fonte": "mapa", + "x": -13.09, + "z": 13, + "chao": 0, + "distWaypoint": 1.15, + "yOrigem": 0.165, + "vaoOrigem": 0.165, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.1, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "shotgun", + "fonte": "mapa", + "x": 16, + "z": -10.5, + "chao": 0, + "distWaypoint": 0.14, + "yOrigem": 0.165, + "vaoOrigem": 0.165, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.14, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "shotgun", + "fonte": "mapa", + "x": -16, + "z": 10.5, + "chao": 0, + "distWaypoint": 0.86, + "yOrigem": 0.165, + "vaoOrigem": 0.165, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.14, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "awp", + "fonte": "rack", + "x": -24.9, + "z": -37.6, + "chao": 0, + "distWaypoint": 0.36, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.05, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "mosin", + "fonte": "rack", + "x": -23.75, + "z": -37.6, + "chao": 0, + "distWaypoint": 0.87, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.1, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "rem700", + "fonte": "rack", + "x": -22.6, + "z": -37.6, + "chao": 0, + "distWaypoint": 0.73, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "m400", + "fonte": "rack", + "x": -21.45, + "z": -37.6, + "chao": 0, + "distWaypoint": 0.49, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.1, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "svd", + "fonte": "rack", + "x": -20.3, + "z": -37.6, + "chao": 0, + "distWaypoint": 1.12, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.05, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "g3sg1", + "fonte": "rack", + "x": -19.15, + "z": -37.6, + "chao": 0, + "distWaypoint": 0.21, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.05, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "sks", + "fonte": "rack", + "x": -18, + "z": -37.6, + "chao": 0, + "distWaypoint": 1.22, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.1, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "ak", + "fonte": "rack", + "x": -16.85, + "z": -37.6, + "chao": 0, + "distWaypoint": 0.4, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "akm", + "fonte": "rack", + "x": -15.7, + "z": -37.6, + "chao": 0, + "distWaypoint": 0.82, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.1, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "m4", + "fonte": "rack", + "x": -14.55, + "z": -37.6, + "chao": 0, + "distWaypoint": 0.78, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.05, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "md97", + "fonte": "rack", + "x": -13.4, + "z": -37.6, + "chao": 0, + "distWaypoint": 0.45, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.05, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "g3", + "fonte": "rack", + "x": -12.25, + "z": -37.6, + "chao": 0, + "distWaypoint": 1.17, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.1, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "scar", + "fonte": "rack", + "x": -11.1, + "z": -37.6, + "chao": 0, + "distWaypoint": 0.2, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "carbine", + "fonte": "rack", + "x": -24.32, + "z": -39.6, + "chao": 0, + "distWaypoint": 0.57, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.03, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "m92", + "fonte": "rack", + "x": -23.18, + "z": -39.6, + "chao": 0, + "distWaypoint": 1.37, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.07, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "tavor", + "fonte": "rack", + "x": -22.02, + "z": -39.6, + "chao": 0, + "distWaypoint": 0.52, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.08, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "famas", + "fonte": "rack", + "x": -20.88, + "z": -39.6, + "chao": 0, + "distWaypoint": 1.14, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.02, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "p90", + "fonte": "rack", + "x": -19.73, + "z": -39.6, + "chao": 0, + "distWaypoint": 0.73, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.13, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "mp5", + "fonte": "rack", + "x": -18.57, + "z": -39.6, + "chao": 0, + "distWaypoint": 0.8, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.03, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "uzi", + "fonte": "rack", + "x": -17.43, + "z": -39.6, + "chao": 0, + "distWaypoint": 1.05, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.07, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "shotgun", + "fonte": "rack", + "x": -16.27, + "z": -39.6, + "chao": 0, + "distWaypoint": 0.55, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.08, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "lmg", + "fonte": "rack", + "x": -15.13, + "z": -39.6, + "chao": 0, + "distWaypoint": 1.42, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.02, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "deagle", + "fonte": "rack", + "x": -13.97, + "z": -39.6, + "chao": 0, + "distWaypoint": 0.53, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.12, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "revolver38", + "fonte": "rack", + "x": -12.82, + "z": -39.6, + "chao": 0, + "distWaypoint": 1.1, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.03, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "pistol", + "fonte": "rack", + "x": -11.68, + "z": -39.6, + "chao": 0, + "distWaypoint": 0.76, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.07, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "awp", + "fonte": "rack", + "x": 11.1, + "z": 37.6, + "chao": 0, + "distWaypoint": 0.85, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.07, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "mosin", + "fonte": "rack", + "x": 12.25, + "z": 37.6, + "chao": 0, + "distWaypoint": 1.12, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.11, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "rem700", + "fonte": "rack", + "x": 13.4, + "z": 37.6, + "chao": 0, + "distWaypoint": 0.63, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.05, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "m400", + "fonte": "rack", + "x": 14.55, + "z": 37.6, + "chao": 0, + "distWaypoint": 1.48, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.11, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "svd", + "fonte": "rack", + "x": 15.7, + "z": 37.6, + "chao": 0, + "distWaypoint": 0.63, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.07, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "g3sg1", + "fonte": "rack", + "x": 16.85, + "z": 37.6, + "chao": 0, + "distWaypoint": 1.12, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.07, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "sks", + "fonte": "rack", + "x": 18, + "z": 37.6, + "chao": 0, + "distWaypoint": 0.85, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.11, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "ak", + "fonte": "rack", + "x": 19.15, + "z": 37.6, + "chao": 0, + "distWaypoint": 0.81, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.05, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "akm", + "fonte": "rack", + "x": 20.3, + "z": 37.6, + "chao": 0, + "distWaypoint": 1.17, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.11, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "m4", + "fonte": "rack", + "x": 21.45, + "z": 37.6, + "chao": 0, + "distWaypoint": 0.62, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.07, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "md97", + "fonte": "rack", + "x": 22.6, + "z": 37.6, + "chao": 0, + "distWaypoint": 1.43, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.07, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "g3", + "fonte": "rack", + "x": 23.75, + "z": 37.6, + "chao": 0, + "distWaypoint": 0.65, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.11, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "scar", + "fonte": "rack", + "x": 24.9, + "z": 37.6, + "chao": 0, + "distWaypoint": 1.08, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.05, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "carbine", + "fonte": "rack", + "x": 11.68, + "z": 39.6, + "chao": 0, + "distWaypoint": 1.83, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.06, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "m92", + "fonte": "rack", + "x": 12.83, + "z": 39.6, + "chao": 0, + "distWaypoint": 1.45, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.09, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "tavor", + "fonte": "rack", + "x": 13.98, + "z": 39.6, + "chao": 0, + "distWaypoint": 1.6, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.09, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "famas", + "fonte": "rack", + "x": 15.13, + "z": 39.6, + "chao": 0, + "distWaypoint": 1.6, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.06, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "p90", + "fonte": "rack", + "x": 16.27, + "z": 39.6, + "chao": 0, + "distWaypoint": 1.45, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.13, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "mp5", + "fonte": "rack", + "x": 17.43, + "z": 39.6, + "chao": 0, + "distWaypoint": 1.83, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.06, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "uzi", + "fonte": "rack", + "x": 18.57, + "z": 39.6, + "chao": 0, + "distWaypoint": 1.4, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.09, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "shotgun", + "fonte": "rack", + "x": 19.73, + "z": 39.6, + "chao": 0, + "distWaypoint": 1.8, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.09, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "lmg", + "fonte": "rack", + "x": 20.88, + "z": 39.6, + "chao": 0, + "distWaypoint": 1.46, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.06, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "deagle", + "fonte": "rack", + "x": 22.02, + "z": 39.6, + "chao": 0, + "distWaypoint": 1.58, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.13, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "revolver38", + "fonte": "rack", + "x": 23.18, + "z": 39.6, + "chao": 0, + "distWaypoint": 1.62, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.06, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "pistol", + "fonte": "rack", + "x": 24.32, + "z": 39.6, + "chao": 0, + "distWaypoint": 1.44, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.09, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + } + ] } ] } \ No newline at end of file diff --git a/tools/eval/treta-gelo-check.mjs b/tools/eval/treta-gelo-check.mjs new file mode 100644 index 000000000..e63310ecf --- /dev/null +++ b/tools/eval/treta-gelo-check.mjs @@ -0,0 +1,141 @@ +import { readFileSync } from 'node:fs'; +import { bootGame, MAPS, THREE, initTextures } from './harness.mjs'; + +const MUTANTE = (process.argv.find((arg) => arg.startsWith('--mutante=')) || '').split('=')[1] || ''; +const entry = MAPS.treta_no_gelo; +if (!entry) { + console.error('GELO FALHA — treta_no_gelo não está no registro de mapas'); + process.exit(1); +} + +const scene = new THREE.Scene(); +const harnessTextures = await initTextures(); +const world = entry.build(scene, harnessTextures); +const objects = []; +world.root.traverse((object) => objects.push(object)); +const named = (prefix) => objects.filter((object) => object.name?.startsWith(prefix)); + +if (MUTANTE === 'sem-paredes') for (const object of [...named('gelo-parede-'), ...named('gelo-estrutura-parede-')]) object.name = 'mutante-sem-parede'; +if (MUTANTE === 'sem-fortaleza') for (const object of named('gelo-fortaleza-')) object.name = 'mutante-sem-fortaleza'; +if (MUTANTE === 'sem-texturas') { + for (const object of objects) for (const material of Array.isArray(object.material) ? object.material : [object.material]) { + if (material?.map) material.map.name = 'mutante-sem-textura'; + } +} +if (MUTANTE === 'sem-cobertura') for (const object of named('gelo-cobertura-')) object.name = 'mutante-sem-cobertura'; +if (MUTANTE === 'parede-cor') for (const object of named('gelo-estrutura-parede-')) object.material.map.name = 'mutante-cor-parede'; +if (MUTANTE === 'gelo-lento') world.speedMulAt = () => .45; +if (MUTANTE === 'gelo-rapido') world.speedMulAt = () => 1; +if (MUTANTE === 'parede-sem-uv') for (const object of named('gelo-estrutura-parede-')) object.geometry.deleteAttribute('uv'); +if (MUTANTE === 'passo-concreto') world.surfaceAt = () => 'concrete'; +if (MUTANTE === 'parede-sem-colisao') world.colliders = world.colliders.filter((collider) => !String(collider.tag || '').startsWith('gelo-parede-')); + +const textures = new Set(); +for (const object of objects) for (const material of Array.isArray(object.material) ? object.material : [object.material]) { + if (material?.map?.name) textures.add(material.map.name); +} + +const fortress = named('gelo-fortaleza-'); +const ramps = named('gelo-rampa-'); +const iceWalls = named('gelo-estrutura-parede-'); +const cover = named('gelo-cobertura-'); +const architectureOk = named('gelo-fortaleza-central').length === 1 + && named('gelo-fortaleza-bastiao-').length === 4 + && fortress.length >= 5 && iceWalls.length === 2 && ramps.length === 0; +const textureOk = ['gelo-pedra', 'gelo-neve', 'gelo-piso'].every((name) => textures.has(name)); +const gameplayOk = cover.length >= 12 && world.colliders.length >= 25 + && world.pickups.length >= 20 && world.ctfPoints?.length === 4; +const wallReplacementOk = iceWalls.length === 2 && ramps.length === 0 + && world.colliders.filter((collider) => String(collider.tag || '').startsWith('gelo-parede-')).length === 2; + +const spawnE = world.spawns?.E?.[0], spawnB = world.spawns?.B?.[0]; +let route = []; +if (spawnE && spawnB) route = world.findPath(world.nearestWaypoint(spawnE.x, spawnE.z), world.nearestWaypoint(spawnB.x, spawnB.z)); +const navigationOk = world.waypoints?.nodes?.length >= 100 && route.length >= 8 + && world.waypoints.adj.every((line) => Array.isArray(line)); +let previewSource = readFileSync('tools/eval/g2ui-map-previews.mjs', 'utf8'); +if (MUTANTE === 'preview-com-arma') previewSource = previewSource.replaceAll('g.vmScene.visible = false', 'g.vmScene.visible = true').replaceAll('mute(d.mesh)', 'd.mesh.visible = true'); +const cleanPreviewOk = /g\.vmScene\.visible = false/.test(previewSource) + && /for \(const d of g\.drops\)[\s\S]{0,80}mute\(d\.mesh\)/.test(previewSource) + && /#hud,#hud-shortcuts\{display:none!important\}/.test(previewSource); +const wallUvRatios = iceWalls.map((mesh) => { + const uv = mesh.geometry.getAttribute('uv'); + const index = mesh.geometry.index?.array; + if (!uv || !index) return 0; + let visible = 0, mapped = 0; + for (let offset = 0; offset < index.length; offset += 3) { + visible++; + const a = index[offset], b = index[offset + 1], c = index[offset + 2]; + const area = Math.abs((uv.getX(b)-uv.getX(a))*(uv.getY(c)-uv.getY(a)) + - (uv.getY(b)-uv.getY(a))*(uv.getX(c)-uv.getX(a))) / 2; + if (area > .01) mapped++; + } + return visible ? mapped / visible : 0; +}); +const wallUvOk = wallUvRatios.length === 2 && wallUvRatios.every((ratio) => ratio === 1); +const wallMaterialOk = iceWalls.every((mesh) => mesh.geometry.type === 'BoxGeometry' + && mesh.material?.map?.name === 'gelo-pedra'); +const game = bootGame('treta_no_gelo', { textures: harnessTextures, ctf: false, seed: 4242 }); +game.state = 'live'; +if (MUTANTE === 'parede-sem-colisao') game.world.colliders = game.world.colliders.filter((collider) => !String(collider.tag || '').startsWith('gelo-parede-')); +const wallStops = [ + { x: -12, z: -8.5, yaw: 0 }, + { x: 12, z: 8.5, yaw: Math.PI }, +].map((wallSpec) => { + const localStart = -5; + const startX = wallSpec.x + Math.sin(wallSpec.yaw) * localStart; + const startZ = wallSpec.z + Math.cos(wallSpec.yaw) * localStart; + const player = game.player; + player.pos.set(startX, 0, startZ); + player.vel.set(0, 0, 0); player.yaw = wallSpec.yaw + Math.PI; player.grounded = true; + game.keys.KeyW = true; + for (let frame = 0; frame < 240; frame++) { game.time += 1 / 60; game._updatePlayer(1 / 60); } + game.keys.KeyW = false; + const dx = player.pos.x - wallSpec.x, dz = player.pos.z - wallSpec.z; + return Math.sin(wallSpec.yaw) * dx + Math.cos(wallSpec.yaw) * dz; +}); +const wallsBlockingOk = wallReplacementOk && wallMaterialOk && wallStops.every((localZ) => localZ < 0); +const walkDistance = (speedMul) => { + const player = game.player; + game.world.speedMulAt = speedMul; + player.pos.set(-34, 0, -28); player.vel.set(0, 0, 0); player.yaw = Math.PI; player.grounded = true; + game.keys.KeyW = true; + const startZ = player.pos.z; + for (let frame = 0; frame < 180; frame++) { game.time += 1 / 60; game._updatePlayer(1 / 60); } + game.keys.KeyW = false; + return player.pos.z - startZ; +}; +const slowDistance = walkDistance(() => .45); +const iceSpeedMul = MUTANTE === 'gelo-lento' ? () => .45 : MUTANTE === 'gelo-rapido' ? () => 1 : world.speedMulAt; +const iceDistance = walkDistance(iceSpeedMul); +const icePaceRatio = iceDistance / slowDistance; +const icePaceOk = typeof world.speedMulAt === 'function' && icePaceRatio >= 1.15 && icePaceRatio <= 1.30; +if (MUTANTE === 'passo-concreto') game.world.surfaceAt = () => 'concrete'; +const stepSurfaces = []; +game.sfx = { step: (surface) => stepSurfaces.push(surface) }; +game.player.pos.set(-34, 0, -28); game.player.vel.set(0, 0, 0); game.player.yaw = Math.PI; +game.player.grounded = true; game.player.stepPhase = 0; game.keys.KeyW = true; +for (let frame = 0; frame < 120; frame++) { game.time += 1 / 60; game._updatePlayer(1 / 60); } +game.keys.KeyW = false; +const { Sfx } = await import('../../public/js/audio.js'); +const iceBursts = []; +const synth = Object.create(Sfx.prototype); +synth.pack = null; synth.ensure = () => {}; synth._burst = (...args) => iceBursts.push(args); +synth.step('ice'); +const iceStepOk = typeof world.surfaceAt === 'function' && world.surfaceAt(0, 0) === 'ice' + && stepSurfaces.length >= 2 && stepSurfaces.every((surface) => surface === 'ice') + && iceBursts.length >= 2 && iceBursts.some((burst) => burst[4] === 'bandpass'); +game.dispose(); + +console.log(`GELO1 ${architectureOk ? 'PASSA' : 'FALHA'} — fortaleza central, quatro bastiões e duas paredes internas`); +console.log(`GELO2 ${textureOk ? 'PASSA' : 'FALHA'} — pedra congelada, neve e piso de gelo texturizados`); +console.log(`GELO3 ${gameplayOk ? 'PASSA' : 'FALHA'} — ${cover.length} coberturas · ${world.colliders.length} colisores · ${world.pickups.length} armas · ${world.ctfPoints?.length || 0} objetivos`); +console.log(`GELO4 ${navigationOk ? 'PASSA' : 'FALHA'} — ${world.waypoints?.nodes?.length || 0} nós · rota entre spawns com ${route.length} passos`); +console.log(`GELO5 ${cleanPreviewOk ? 'PASSA' : 'FALHA'} — preview oculta HUD, viewmodel e armas do chão`); +console.log(`GELO6 ${wallsBlockingOk ? 'PASSA' : 'FALHA'} — paredes de gelo bloquearam o jogador em ${wallStops.map((localZ) => localZ.toFixed(2)).join('/')} m locais`); +console.log(`GELO7 ${icePaceOk ? 'PASSA' : 'FALHA'} — passada no gelo ${icePaceRatio.toFixed(2)}× a passada lenta (${iceDistance.toFixed(2)} m em 3 s)`); +console.log(`GELO8 ${wallUvOk ? 'PASSA' : 'FALHA'} — cobertura UV das paredes ${wallUvRatios.map((ratio) => (ratio*100).toFixed(0)+'%').join('/')}`); +console.log(`GELO9 ${iceStepOk ? 'PASSA' : 'FALHA'} — ${stepSurfaces.length} passos receberam superfície de gelo · ${iceBursts.length} camadas procedurais`); +console.log(`GELO10 ${wallReplacementOk ? 'PASSA' : 'FALHA'} — ${iceWalls.length} paredes substituem ${ramps.length} rampas · colisão sólida nos dois lados`); + +process.exit(architectureOk && textureOk && gameplayOk && navigationOk && cleanPreviewOk && wallsBlockingOk && icePaceOk && wallUvOk && iceStepOk && wallReplacementOk ? 0 : 1); From 36a2fa07bf6515d56bbc3e65d511a995239d7a21 Mon Sep 17 00:00:00 2001 From: rubenmarcus Date: Sat, 22 Aug 2026 02:17:42 +0100 Subject: [PATCH 02/21] =?UTF-8?q?fix(port=C3=A3o):=20liga=20o=20eval:gelo,?= =?UTF-8?q?=20que=20o=20check:fast=20citava=20sem=20existir?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit O `check:fast` deste PR cita `eval:gelo`, a chave de documentação `//eval:gelo` descreve o contrato e a régua `tools/eval/treta-gelo-check.mjs` existe em disco - mas o script nunca foi definido em `scripts`. Com um nome órfão na lista, o npm morre em "missing script" e TODOS os passos depois dele não rodam: o portão parava no meio sem ninguém perceber. A régua roda e passa (GELO1 a GELO10). Agent: Claude Opus 5 (Claude Code) Co-Authored-By: Claude Opus 5 Signed-off-by: rubenmarcus --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index d51df6518..a75053767 100644 --- a/package.json +++ b/package.json @@ -123,7 +123,8 @@ "check:fast": "node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:pickuparma eval:parquewheel eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:backendhints changelog:check eval:gelo eval:velhooeste eval:penitenciaria eval:comentario eval:fixture eval:preload eval:docsautoria eval:replaycam", "//eval:gelo": "Contrato do Treta no Gelo: fortaleza central com quatro bastiões e rampas, materiais de pedra/neve/gelo, coberturas densas, arsenal, quatro objetivos, colisores, rota entre spawns e preview sem armas. Mutantes: sem-fortaleza|sem-rampas|sem-texturas|sem-cobertura|preview-com-arma.", "eval:tags": "node tools/eval/tag-main-check.mjs", - "eval:simclock": "node tools/eval/sim-clock-check.mjs" + "eval:simclock": "node tools/eval/sim-clock-check.mjs", + "eval:gelo": "node tools/eval/treta-gelo-check.mjs" }, "repository": { "type": "git", From dda8e9f4f277b1b1196f37f2a4a0c2d47bfb66bc Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 04:17:58 +0000 Subject: [PATCH 03/21] =?UTF-8?q?Merge=20da=20base=20(conflito=20s=C3=B3?= =?UTF-8?q?=20em=20arquivo=20gerado,=20resolvido=20pelo=20autofix)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agent: csbrasil-bot (autofix) Signed-off-by: csbrasil-bot --- package-lock.json | 4 +- package.json | 14 +-- scripts/ci/autofix_allowlist.py | 123 ++++++++++++++++++++++ scripts/ci/ensure_labels.py | 44 ++++++-- scripts/ci/workflow_security_check.py | 122 +++++++++++++++++++++- scripts/fetch-audio.sh | 2 +- scripts/fetch-decals.sh | 2 +- tools/eval/ARCH.md | 122 +++++++++++----------- tools/eval/autofix-check.mjs | 141 ++++++++++++++++++++++++++ tools/eval/deploy-gate-check.mjs | 75 ++++++++++++++ tools/eval/fixture-check.mjs | 1 - tools/eval/g2ui-map-previews.mjs | 4 +- tools/eval/portao-inteiro-check.mjs | 68 +++++++++++++ tools/eval/workflow-secret-check.mjs | 74 ++++++++++++++ 14 files changed, 711 insertions(+), 85 deletions(-) create mode 100644 scripts/ci/autofix_allowlist.py create mode 100644 tools/eval/autofix-check.mjs create mode 100644 tools/eval/deploy-gate-check.mjs create mode 100644 tools/eval/portao-inteiro-check.mjs create mode 100644 tools/eval/workflow-secret-check.mjs diff --git a/package-lock.json b/package-lock.json index 07a86a805..e25564558 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "coro-solto", - "version": "2.0.0-alpha.175", + "version": "2.0.0-alpha.176", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "coro-solto", - "version": "2.0.0-alpha.175", + "version": "2.0.0-alpha.176", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/vercel": "^11.0.6", diff --git a/package.json b/package.json index 038ad3c9a..29eebdad5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "coro-solto", - "version": "2.0.0-alpha.175", + "version": "2.0.0-alpha.176", "license": "AGPL-3.0-only", "description": "CORO SOLTO: Treta Suprema (ex-CS BRASIL) — FPS satírico de navegador com 5 facções brasileiras (site Astro + jogo vanilla em Three.js), gerado em par com agentes de IA (AI generated & AI friendly)", "scripts": { @@ -119,13 +119,15 @@ "eval:regen": "node tools/eval/regen-check.mjs", "eval:ctfwin": "node tools/eval/ctf-win-check.mjs", "eval:spawn": "node tools/eval/spawn-settle-check.mjs", - "check:deploy": "node tools/eval/runner.mjs syntax eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vmlabhud eval:vminspect eval:redesign eval:charvoice eval:screenquery arch:check docs:check media:check menuwalls:check anims:check anims:merge:check travessao:check eval:medianet eval:posters eval:comentario eval:fixture eval:preload eval:docsautoria eval:replaycam", - "check:fast": "node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:pickuparma eval:parquewheel eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:backendhints changelog:check eval:gelo eval:velhooeste eval:penitenciaria eval:comentario eval:fixture eval:preload eval:docsautoria eval:replaycam", - "//eval:gelo": "Contrato do Treta no Gelo: fortaleza central com quatro bastiões e rampas, materiais de pedra/neve/gelo, coberturas densas, arsenal, quatro objetivos, colisores, rota entre spawns e preview sem armas. Mutantes: sem-fortaleza|sem-rampas|sem-texturas|sem-cobertura|preview-com-arma.", + "check:deploy": "node tools/eval/runner.mjs syntax eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vmlabhud eval:vminspect eval:redesign eval:charvoice eval:screenquery arch:check docs:check media:check menuwalls:check anims:check anims:merge:check travessao:check eval:medianet eval:posters eval:mutcega eval:autofix eval:deploygate eval:portaointeiro eval:wfsecret eval:comentario eval:fixture eval:preload eval:docsautoria eval:replaycam", + "check:fast": "node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:pickuparma eval:parquewheel eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:backendhints changelog:check eval:velhooeste eval:penitenciaria eval:mutcega eval:autofix eval:deploygate eval:portaointeiro eval:wfsecret eval:comentario eval:fixture eval:preload eval:docsautoria eval:replaycam", "eval:tags": "node tools/eval/tag-main-check.mjs", "eval:simclock": "node tools/eval/sim-clock-check.mjs", - "eval:gelo": "node tools/eval/treta-gelo-check.mjs", - "eval:mutcega": "node tools/eval/mutacao-cega-check.mjs" + "eval:mutcega": "node tools/eval/mutacao-cega-check.mjs", + "eval:wfsecret": "node tools/eval/workflow-secret-check.mjs", + "eval:deploygate": "node tools/eval/deploy-gate-check.mjs", + "eval:autofix": "node tools/eval/autofix-check.mjs", + "eval:portaointeiro": "node tools/eval/portao-inteiro-check.mjs" }, "repository": { "type": "git", diff --git a/scripts/ci/autofix_allowlist.py b/scripts/ci/autofix_allowlist.py new file mode 100644 index 000000000..812c79212 --- /dev/null +++ b/scripts/ci/autofix_allowlist.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python3 +"""A trava do autofix: decide se o que o bot mexeu pode virar commit. + +O bot só pode tocar em ARQUIVO GERADO — o que uma ferramenta do repositório +reescreve inteiro a partir do código. Se o conserto encostar em qualquer outro +caminho, o run aborta e comenta em vez de commitar. + +A regra não é conveniência: sem ela, o primeiro conserto errado reescreve o mapa +de um colaborador e ninguém repara. Com ela, o pior caso do bot é regenerar uma +doc que já era derivada. + +Uso: git status --porcelain | python3 scripts/ci/autofix_allowlist.py + python3 scripts/ci/autofix_allowlist.py --selftest +""" +import sys + +# Caminhos que uma ferramenta REGERA por inteiro. Crescer esta lista é decisão de +# dono: cada entrada nova é um arquivo que o bot passa a poder sobrescrever sozinho. +PERMITIDOS = ( + "ARCH.generated.md", + "README.md", + "STATUS.md", + "SCRIPTS.md", + "docs/", + "tools/eval/ARCH.md", +) + +# Caminhos que NUNCA entram, mesmo que um prefixo permitido pareça cobri-los. O +# `.github/` fica de fora porque um bot que edita o próprio workflow que o governa +# consegue ampliar a própria permissão em um commit. +PROIBIDOS = ( + ".github/", + "scripts/", + "supabase/", + "package.json", + "package-lock.json", + "vercel.json", +) + + +def permitido(caminho: str) -> bool: + if any(caminho.startswith(p) for p in PROIBIDOS): + return False + return any(caminho == p or caminho.startswith(p) for p in PERMITIDOS) + + +def separa(caminhos: list[str]) -> tuple[list[str], list[str]]: + ok = [c for c in caminhos if permitido(c)] + fora = [c for c in caminhos if not permitido(c)] + return ok, fora + + +def caminhos_do_porcelain(texto: str) -> list[str]: + """`git status --porcelain` -> lista de caminhos. + + Renomeio vem como `R velho -> novo`; o que importa é o destino, senão um + rename para fora da lista passaria como se fosse o arquivo de origem. + """ + saida = [] + for linha in texto.splitlines(): + if len(linha) < 4: + continue + caminho = linha[3:].strip() + if " -> " in caminho: + caminho = caminho.split(" -> ", 1)[1] + saida.append(caminho.strip('"')) + return saida + + +def selftest() -> int: + casos = [ + ("doc gerada passa", ["ARCH.generated.md"], True), + ("pasta docs passa", ["docs/docs/comecando.md"], True), + ("código do jogo NÃO passa", ["public/js/main.js"], False), + ("mapa de colaborador NÃO passa", ["public/js/map_havan.js"], False), + ("workflow NÃO passa", [".github/workflows/ci.yml"], False), + ("script de CI NÃO passa", ["scripts/ci/pr_classify.py"], False), + ("package.json NÃO passa", ["package.json"], False), + ("uma proibida contamina o lote", ["STATUS.md", "public/js/game.js"], False), + ("nada mexido é lote vazio", [], True), + ("CHANGELOG não é gerado por ferramenta nossa", ["CHANGELOG.md"], False), + ("lote típico de release só toca gerado", ["README.md", "STATUS.md", "docs/docs/comecando.md"], True), + ] + erros = 0 + for nome, caminhos, esperado in casos: + _, fora = separa(caminhos) + obtido = not fora + ok = obtido == esperado + erros += 0 if ok else 1 + print(f"{'ok ' if ok else 'FALHA'} {nome}: fora={fora!r}") + + porcelain = ' M ARCH.generated.md\nR docs/a.md -> public/js/game.js\n?? novo.txt\n' + lidos = caminhos_do_porcelain(porcelain) + ok = lidos == ["ARCH.generated.md", "public/js/game.js", "novo.txt"] + erros += 0 if ok else 1 + print(f"{'ok ' if ok else 'FALHA'} renomeio é julgado pelo DESTINO: {lidos!r}") + + print("selftest verde" if not erros else f"{erros} caso(s) vermelho(s)") + return 0 if not erros else 1 + + +def main() -> int: + if "--selftest" in sys.argv: + return selftest() + # `--caminhos`: a entrada já é uma lista crua (o `git diff --name-only` do merge), + # e não o porcelain. É o modo que o resolvedor de conflito usa. + if "--caminhos" in sys.argv: + caminhos = [l.strip() for l in sys.stdin.read().splitlines() if l.strip()] + else: + caminhos = caminhos_do_porcelain(sys.stdin.read()) + ok, fora = separa(caminhos) + if fora: + print("BLOQUEADO: o conserto encostou em arquivo que o bot não pode reescrever:") + for c in fora: + print(f" - {c}") + return 1 + for c in ok: + print(c) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/ci/ensure_labels.py b/scripts/ci/ensure_labels.py index 6810e02e0..e54053b22 100644 --- a/scripts/ci/ensure_labels.py +++ b/scripts/ci/ensure_labels.py @@ -17,18 +17,50 @@ "crash-auto": ("B60205", "crash de produção reportado por /api/jserror ou prod-watch"), "stale-backlog": ("c2e0c6", "Issue antiga ou desalinhada com o checkout atual; precisa revalidação"), "needs-repro": ("f9d0c4", "Issue precisa passos de reprodução mais concretos"), + "preview-autorizado": ("0e8a16", "Mantenedor revisou o SHA atual e liberou preview do fork na Vercel"), + "pronto-pra-merge": ("0e8a16", "Portões verdes e diff dentro do aceito: falta só o merge, que é humano"), } -def main() -> int: - for label in sys.argv[1:]: +def comandos(nomes: list[str]) -> list[list[str]]: + """Os `gh label create` que ESTE pedido produz. + + Nome fora do dicionário some em silêncio, e foi assim que `preview-autorizado` + passou meses sendo pedida por um workflow sem nunca ser criada — o job de preview + de fork inteiro virou código morto atrás de um rótulo que ninguém podia aplicar. + """ + out = [] + for label in nomes: if label not in LABELS: continue color, description = LABELS[label] - subprocess.run( - ["gh", "label", "create", label, "--color", color, "--description", description, "--force"], - check=True, - ) + out.append(["gh", "label", "create", label, "--color", color, "--description", description, "--force"]) + return out + + +def selftest() -> int: + casos = [ + ("rótulo conhecido vira um comando", ["safe-automerge"], ["safe-automerge"]), + ("desconhecido é ignorado", ["nao-existe"], []), + ("conhecido junto de desconhecido não contamina", ["nao-existe", "bot-fixable"], ["bot-fixable"]), + ("lista vazia não faz nada", [], []), + ("preview-autorizado está registrado", ["preview-autorizado"], ["preview-autorizado"]), + ] + erros = 0 + for nome, pedido, esperado in casos: + obtido = [c[3] for c in comandos(pedido)] + ok = obtido == esperado + erros += 0 if ok else 1 + print(f"{'ok ' if ok else 'FALHA'} {nome}: {obtido!r}") + print("selftest verde" if not erros else f"{erros} caso(s) vermelho(s)") + return 0 if not erros else 1 + + +def main() -> int: + if "--selftest" in sys.argv: + return selftest() + for comando in comandos(sys.argv[1:]): + subprocess.run(comando, check=True) return 0 diff --git a/scripts/ci/workflow_security_check.py b/scripts/ci/workflow_security_check.py index 1740ca9f9..53baec243 100644 --- a/scripts/ci/workflow_security_check.py +++ b/scripts/ci/workflow_security_check.py @@ -9,6 +9,16 @@ def preview_failures(source: str) -> list[str]: + """Contrato do preview de fork POR APROVAÇÃO (desenho antigo). + + Vale enquanto o `preview-bot.yml` tiver o job que publica: ele roda `vercel build`, + isto é, executa o build DO FORK com o token no ambiente, e por isso depende de um + mantenedor revisar o SHA. Quando o preview passou a ser build-sem-segredo + + deploy-sem-código (ver `separacao_failures`), este job deixou de ser necessário — + mas enquanto existir, ele tem de manter TODAS as travas. + """ + if 'vercel deploy' not in source: + return [] # o job de publicação saiu do arquivo: nada a guardar aqui errors = [] required = { 'types: [opened, synchronize, reopened, labeled]': 'evento labeled ausente', @@ -27,13 +37,84 @@ def preview_failures(source: str) -> list[str]: for marker, message in required.items(): if marker not in source: errors.append(message) - if '--add-label "preview-autorizado"' in source: + if '--add-label' in source and 'preview-autorizado' in source: errors.append('workflow autoaprova código de fork') if 'preview_autorizado=true' in source: errors.append('workflow decide autorização sem mantenedor') return errors +def separacao_failures(build: str, deploy: str) -> list[str]: + """Contrato do preview de fork POR SEPARAÇÃO (desenho de 22/08). + + A aprovação manual existia porque UM job fazia as duas coisas: rodava o build do + fork E tinha o token. Separando, os dois lados ficam seguros sozinhos e ninguém + precisa clicar: + + PRV1 quem COMPILA roda código do fork e não recebe segredo — `pull_request` (não + `pull_request_target`), e nenhuma referência a `secrets.` no arquivo; + PRV2 quem PUBLICA roda no contexto base (`workflow_run`), que é o que lhe dá o + segredo mesmo vindo de fork; + PRV4 quem PUBLICA não interpola `${{ }}` dentro de `run:`. A expressão é substituída + no TEXTO do script antes do shell existir, então valor com aspas ou `$(...)` vira + comando — e no caminho de deploy os valores vêm de fora (o número do PR atravessa + um artefato escrito por job que rodou código do fork, a URL é saída de comando). + O CodeQL pegou exatamente isso aqui, como injeção crítica, antes do merge. + PRV3 quem PUBLICA não executa NADA do PR: sem checkout da branch do fork, sem + `npm ci`, sem `npm run`, e o deploy é `--prebuilt` (só envia arquivo). + Furar isto devolve o token para as mãos de quem abriu o PR. + """ + errors = [] + if not build or not deploy: + return ['preview por separação incompleto: falta preview-build.yml ou preview-deploy.yml'] + + # Só a INSTRUÇÃO conta. Os dois arquivos explicam em comentário o que NÃO fazem + # ("não roda npm ci", "não usa pull_request_target") e ler o comentário como se + # fosse código acusaria justamente quem documentou a trava. + def codigo(texto: str) -> str: + return '\n'.join(l for l in texto.splitlines() if not l.lstrip().startswith('#')) + + build, deploy = codigo(build), codigo(deploy) + + if 'pull_request_target' in build: + errors.append('PRV1 o job que COMPILA usa pull_request_target — passaria a enxergar segredo rodando código do fork') + if 'pull_request:' not in build: + errors.append('PRV1 o job que COMPILA não roda em pull_request') + if 'secrets.' in build: + errors.append('PRV1 o job que COMPILA referencia `secrets.` — ele roda código do fork e não pode ter o que roubar') + + if 'workflow_run:' not in deploy: + errors.append('PRV2 o job que PUBLICA não roda em workflow_run — sem contexto base não há segredo em PR de fork') + if 'secrets.VERCEL_TOKEN' not in deploy: + errors.append('PRV2 o job que PUBLICA não usa o token da Vercel') + + # PRV4: `${{ }}` só pode aparecer em `env:`/`with:`/`if:`, nunca dentro do script. + dentro_de_run = False + for linha in deploy.splitlines(): + despido = linha.strip() + if re.match(r'run:\s*\|', despido): + dentro_de_run = True + continue + if dentro_de_run: + # o bloco acaba quando a indentação volta para o nível da chave do passo + if despido and not linha.startswith(' '): + dentro_de_run = False + elif '${{' in linha: + errors.append(f'PRV4 `{despido[:60]}` interpola expressão dentro de run: — passe por env:') + + if '--prebuilt' not in deploy: + errors.append('PRV3 o deploy não é --prebuilt: estaria construindo, e construir é executar código do PR') + for proibido, motivo in ( + ('actions/checkout', 'faz checkout — traria código do PR para o job que tem o token'), + ('npm ci', 'roda npm ci — executaria script do PR'), + ('npm run', 'roda npm run — executaria script do PR'), + ('vercel build', 'roda vercel build — é o build do fork com o token no ambiente'), + ): + if proibido in deploy: + errors.append(f'PRV3 o job que PUBLICA {motivo}') + return errors + + def supply_failures(workflows: dict[Path, str]) -> list[str]: errors = [] for path, source in workflows.items(): @@ -54,7 +135,26 @@ def read_workflows(root: Path = Path('.github/workflows')) -> dict[Path, str]: } +BUILD = Path('.github/workflows/preview-build.yml') +DEPLOY = Path('.github/workflows/preview-deploy.yml') + + +def _ler(p: Path) -> str: + return p.read_text(encoding='utf-8') if p.exists() else '' + + def selftest(source: str) -> list[str]: + build, deploy = _ler(BUILD), _ler(DEPLOY) + separacao = { + 'compila-com-segredo': (build + '\n env:\n X: ${{ secrets.VERCEL_TOKEN }}\n', deploy), + 'compila-com-target': (build.replace(' pull_request:', ' pull_request_target:'), deploy), + 'publica-sem-run': (build, deploy.replace(' workflow_run:', ' schedule:')), + 'publica-faz-checkout': (build, deploy + '\n - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683\n'), + 'publica-constroi': (build, deploy.replace('--prebuilt', '')), + 'publica-interpola': (build, deploy.replace('gh pr comment "$PR_NUM"', 'gh pr comment "${{ steps.pr.outputs.numero }}"')), + } + missed_sep = [n for n, (b, d) in separacao.items() if not separacao_failures(b, d)] + mutations = { 'auto-label': source + '\n# --add-label "preview-autorizado"\n', 'sem-ator': source.replace('repos/$REPO/collaborators/$ACTOR/permission', 'repos/$REPO'), @@ -65,10 +165,22 @@ def selftest(source: str) -> list[str]: 'action-mutável': re.sub(r'actions/checkout@[0-9a-f]{40}', 'actions/checkout@v4', source), 'cli-mutável': re.sub(r'vercel@\d+\.\d+\.\d+', 'vercel@latest', source), } + # As mutações acima descrevem o contrato ANTIGO (preview por aprovação). Quando o + # job que publicava sai do arquivo, elas deixam de ter alvo — testá-las ali seria + # exigir mordida de uma régua que não tem mais o que guardar. O contrato novo é + # medido pelas mutações de `separacao` logo acima. + antigo_vivo = 'vercel deploy' in source missed = [ name for name, mutated in mutations.items() - if not (preview_failures(mutated) + supply_failures({WORKFLOW: mutated})) + if antigo_vivo and not (preview_failures(mutated) + supply_failures({WORKFLOW: mutated})) ] + # Fornecimento (action e CLI presas) vale sempre, e o alvo passou a ser os dois + # arquivos novos: um tem as actions, o outro tem a CLI da Vercel. + fornecimento = { + 'action-mutável': (BUILD, re.sub(r'actions/checkout@[0-9a-f]{40}', 'actions/checkout@v4', build)), + 'cli-mutável': (DEPLOY, re.sub(r'vercel@\d+\.\d+\.\d+', 'vercel@latest', deploy)), + } + missed += [n for n, (alvo, mutado) in fornecimento.items() if not supply_failures({alvo: mutado})] with tempfile.TemporaryDirectory() as tmp: mutant = Path(tmp) / 'mutable-action.yaml' mutant.write_text('steps:\\n - uses: actions/checkout@v4\\n', encoding='utf-8') @@ -83,12 +195,14 @@ def main() -> int: args = parser.parse_args() source = WORKFLOW.read_text(encoding='utf-8') workflows = read_workflows() - errors = preview_failures(source) + supply_failures(workflows) + errors = (preview_failures(source) + + separacao_failures(_ler(BUILD), _ler(DEPLOY)) + + supply_failures(workflows)) if errors: for error in errors: print(f'WFS FAIL: {error}') return 1 - print('WFS PASS: preview de fork exige aprovação manual presa ao SHA') + print('WFS PASS: quem compila código de fork não tem segredo; quem tem segredo não executa código de fork') if args.selftest: missed = selftest(source) if missed: diff --git a/scripts/fetch-audio.sh b/scripts/fetch-audio.sh index 58d27b672..3dd9e6b25 100755 --- a/scripts/fetch-audio.sh +++ b/scripts/fetch-audio.sh @@ -18,7 +18,7 @@ if [ -f "$DEST/manifest.json" ]; then fi mkdir -p "$DEST" echo "Baixando pacote de áudio de: $URL" -curl -fsSL "$URL" -o /tmp/csbrasil-audio.zip +curl --retry 5 --retry-delay 3 --retry-all-errors --connect-timeout 20 -fsSL "$URL" -o /tmp/csbrasil-audio.zip unzip -o -q /tmp/csbrasil-audio.zip -d "$DEST/" [ -f "$DEST/manifest.json" ] || cp "$DEST/manifest.example.json" "$DEST/manifest.json" echo "Pronto. Áudio instalado em $DEST/." diff --git a/scripts/fetch-decals.sh b/scripts/fetch-decals.sh index b9697f17b..dcafbcf85 100755 --- a/scripts/fetch-decals.sh +++ b/scripts/fetch-decals.sh @@ -24,6 +24,6 @@ if [ -d "$DEST" ] && [ "$(ls -1 "$DEST"/*.png 2>/dev/null | grep -cv '/or-')" -g fi mkdir -p "$DEST" echo "Baixando decalques de: $URL" -curl -fsSL "$URL" -o /tmp/csbrasil-decals.zip +curl --retry 5 --retry-delay 3 --retry-all-errors --connect-timeout 20 -fsSL "$URL" -o /tmp/csbrasil-decals.zip unzip -o -q /tmp/csbrasil-decals.zip -d "$DEST/" echo "Pronto. $(ls -1 "$DEST"/*.png | wc -l | tr -d ' ') decalques em $DEST/." diff --git a/tools/eval/ARCH.md b/tools/eval/ARCH.md index 728666e60..e8d932ec1 100644 --- a/tools/eval/ARCH.md +++ b/tools/eval/ARCH.md @@ -3,14 +3,14 @@ > Gerado por `node tools/gen-arch.mjs`. **Não edite este bloco à mão.** -> Versão do jogo: 2.0.0-alpha.175 · `npm run arch` para regenerar · `npm run arch:check` no CI. +> Versão do jogo: 2.0.0-alpha.176 · `npm run arch` para regenerar · `npm run arch:check` no CI. ## Tamanho dos arquivos indexados | Arquivo | Linhas | Símbolos | |---|---:|---:| -| `public/js/game.js` | 6918 | 251 | -| `public/js/main.js` | 2703 | 252 | +| `public/js/game.js` | 6911 | 251 | +| `public/js/main.js` | 2699 | 252 | | `public/js/glbchars.js` | 845 | 60 | | `public/js/characters.js` | 1069 | 40 | | `public/js/vmattach.js` | 629 | 4 | @@ -19,24 +19,24 @@ ## Maiores métodos de `game.js` — onde o conflito mora -Os 15 maiores somam **3112 linhas (45% do arquivo)**. Método grande = PR irrevisável e merge conflitante. +Os 15 maiores somam **3105 linhas (45% do arquivo)**. Método grande = PR irrevisável e merge conflitante. | Linhas | Início | Método | | |---:|---:|---|---| -| 813 | 5568 | `_updateBot()` | ⚠️ candidato a extração | +| 812 | 5562 | `_updateBot()` | ⚠️ candidato a extração | | 542 | 586 | `constructor()` | 🔴 append-only | -| 320 | 4798 | `_updatePlayer()` | ⚠️ candidato a extração | +| 315 | 4797 | `_updatePlayer()` | ⚠️ candidato a extração | | 248 | 2159 | `_resetPositions()` | | | 241 | 1225 | `_buildViewModels()` | | -| 148 | 5118 | `_updatePickups()` | | -| 134 | 4374 | `_botCtf()` | | +| 148 | 5112 | `_updatePickups()` | | +| 133 | 4374 | `_botCtf()` | | | 115 | 1903 | `_touchControls()` | | | 84 | 4108 | `_initCTF()` | | | 83 | 2947 | `_tryShoot()` | | -| 80 | 6725 | `_updateHud()` | | +| 80 | 6718 | `_updateHud()` | | | 79 | 3308 | `_dmgArc()` | | -| 76 | 4514 | `_updateCtfHud()` | | -| 76 | 6805 | `update()` | 🔴 append-only | +| 76 | 4513 | `_updateCtfHud()` | | +| 76 | 6798 | `update()` | 🔴 append-only | | 73 | 3235 | `_kill()` | | ## Tabela de CONFLITO — resolvida para as linhas de hoje @@ -48,19 +48,19 @@ faixas disjuntas simultaneamente com zero conflito de conteúdo. | Frente | Faixas em `game.js` | Arquivos exclusivos | |---|---|---| | **ARMAS / VIEWMODEL** | `304–306` `335–429` `456–477` `1225–1623` `2712–2717` `2799–2882` `2901–3094` `3529–3552` `3600–3662` `3729–3745` | `public/js/vmattach.js` `public/js/springs.js` `public/js/weapons.js` `public/js/fparms.js` `public/js/handik.js` `public/js/recoil.js` `public/js/vmlab.js` | -| **BOTS / JOGABILIDADE** | `158–161` `212–212` `238–249` `519–530` `3196–3307` `4052–4107` `4270–4507` `4590–4612` `4798–5117` `5440–5457` `5539–6380` | — | -| **MAPAS / MUNDO** | `1171–1224` `2159–2406` `4108–4247` `5118–5265` | `public/js/maps.js` `public/js/mapprops.js` `public/js/map_brasilia.js` `public/js/map_havan.js` `public/js/map_piscina.js` `public/js/map_piscinao_ramos.js` `public/js/map_ferrovelho.js` | +| **BOTS / JOGABILIDADE** | `158–161` `212–212` `238–249` `519–530` `3196–3307` `4052–4107` `4270–4506` `4589–4611` `4797–5111` `5434–5451` `5533–6373` | — | +| **MAPAS / MUNDO** | `1171–1224` `2159–2406` `4108–4247` `5112–5259` | `public/js/maps.js` `public/js/mapprops.js` `public/js/map_brasilia.js` `public/js/map_havan.js` `public/js/map_piscina.js` `public/js/map_piscinao_ramos.js` `public/js/map_ferrovelho.js` | | **GRÁFICOS / FX** | `1624–1633` `1748–1779` `2642–2654` `3553–3591` `3673–3728` | `public/js/bloom.js` `public/js/textures.js` `public/js/vao.js` `public/js/stylize.js` `public/js/gpuparticles.js` | -| **UI / HUD / MENU** | `1128–1170` `2599–2620` `2636–2641` `2655–2661` `3308–3449` `3465–3528` `6548–6611` `6642–6689` `6725–6804` | `public/js/main.js` `public/style.css` `src/pages/index.astro` | +| **UI / HUD / MENU** | `1128–1170` `2599–2620` `2636–2641` `2655–2661` `3308–3449` `3465–3528` `6541–6604` `6635–6682` `6718–6797` | `public/js/main.js` `public/style.css` `src/pages/index.astro` | | **ÁUDIO** | — | `public/js/audio.js` | | **PERSONAGENS** | — | `public/js/characters.js` `public/js/glbchars.js` | | **SITE / BACKEND** | — | `src/` `supabase/` | -**🔴 Zonas vermelhas (append-only, qualquer frente pode precisar):** `update()` 6805–6880 · `_dom()` 1128–1170 · `constructor()` 586–1127 +**🔴 Zonas vermelhas (append-only, qualquer frente pode precisar):** `update()` 6798–6873 · `_dom()` 1128–1170 · `constructor()` 586–1127 Nenhuma sobreposição entre frentes — todas as faixas são disjuntas. ✓ -Cobertura: **3735 de 6918 linhas (54%)** do `game.js` têm dono declarado. O resto é território neutro — declare a frente mesmo assim. +Cobertura: **3728 de 6911 linhas (54%)** do `game.js` têm dono declarado. O resto é território neutro — declare a frente mesmo assim.
Índice completo de game.js (todos os símbolos) @@ -234,51 +234,51 @@ Cobertura: **3735 de 6918 linhas (54%)** do `game.js` têm dono declarado. O res | 4318 | `_walkReach()` | 18 | | 4336 | `_wpComp()` | 16 | | 4352 | `_findPathLocal()` | 22 | -| 4374 | `_botCtf()` | 134 | -| 4508 | `_hideCtfHud()` | 6 | -| 4514 | `_updateCtfHud()` | 76 | -| 4590 | `_collide()` | 23 | -| 4613 | `_collideRot()` | 26 | -| 4639 | `_freeSpot()` | 30 | -| 4669 | `_retaAndavel()` | 20 | -| 4689 | `_walkDepth()` | 16 | -| 4705 | `_noteHit()` | 17 | -| 4722 | `_deathFeedback()` | 43 | -| 4765 | `_updateReplayCam()` | 33 | -| 4798 | `_updatePlayer()` | 320 | -| 5118 | `_updatePickups()` | 148 | -| 5266 | `_wpnMode()` | 5 | -| 5271 | `_botWeapon()` | 10 | -| 5281 | `_municaoInfinita()` | 1 | -| 5282 | `_pickupAllowed()` | 7 | -| 5289 | `_grabPickup()` | 35 | -| 5324 | `_assentarNoChao()` | 11 | -| 5335 | `_dropWeapon()` | 18 | -| 5353 | `_sumirDrop()` | 36 | -| 5389 | `_spawnY()` | 3 | -| 5392 | `_pickSpawn()` | 23 | -| 5415 | `_respawnPlayer()` | 25 | -| 5440 | `_losClear()` | 18 | -| 5458 | `_botCall()` | 37 | -| 5495 | `_teamMarkTex()` | 23 | -| 5518 | `_makeTeamMark()` | 14 | -| 5532 | `_updateTeamMark()` | 7 | -| 5539 | `_botEye()` | 1 | -| 5540 | `_enemyOf()` | 8 | -| 5548 | `_duelToken()` | 20 | -| 5568 | `_updateBot()` | 813 | -| 6381 | `_flushTraining()` | 13 | -| 6394 | `_updateBotNN()` | 71 | -| 6465 | `_botShootNN()` | 45 | -| 6510 | `_radarFoot()` | 38 | -| 6548 | `_updateRadar()` | 64 | -| 6612 | `_banner()` | 26 | -| 6638 | `_resultadoDaRodada()` | 4 | -| 6642 | `_showScoreboard()` | 48 | -| 6690 | `_updateWeaponHud()` | 35 | -| 6725 | `_updateHud()` | 80 | -| 6805 | `update()` | 76 | -| 6881 | `dispose()` | 37 | +| 4374 | `_botCtf()` | 133 | +| 4507 | `_hideCtfHud()` | 6 | +| 4513 | `_updateCtfHud()` | 76 | +| 4589 | `_collide()` | 23 | +| 4612 | `_collideRot()` | 26 | +| 4638 | `_freeSpot()` | 30 | +| 4668 | `_retaAndavel()` | 20 | +| 4688 | `_walkDepth()` | 16 | +| 4704 | `_noteHit()` | 17 | +| 4721 | `_deathFeedback()` | 43 | +| 4764 | `_updateReplayCam()` | 33 | +| 4797 | `_updatePlayer()` | 315 | +| 5112 | `_updatePickups()` | 148 | +| 5260 | `_wpnMode()` | 5 | +| 5265 | `_botWeapon()` | 10 | +| 5275 | `_municaoInfinita()` | 1 | +| 5276 | `_pickupAllowed()` | 7 | +| 5283 | `_grabPickup()` | 35 | +| 5318 | `_assentarNoChao()` | 11 | +| 5329 | `_dropWeapon()` | 18 | +| 5347 | `_sumirDrop()` | 36 | +| 5383 | `_spawnY()` | 3 | +| 5386 | `_pickSpawn()` | 23 | +| 5409 | `_respawnPlayer()` | 25 | +| 5434 | `_losClear()` | 18 | +| 5452 | `_botCall()` | 37 | +| 5489 | `_teamMarkTex()` | 23 | +| 5512 | `_makeTeamMark()` | 14 | +| 5526 | `_updateTeamMark()` | 7 | +| 5533 | `_botEye()` | 1 | +| 5534 | `_enemyOf()` | 8 | +| 5542 | `_duelToken()` | 20 | +| 5562 | `_updateBot()` | 812 | +| 6374 | `_flushTraining()` | 13 | +| 6387 | `_updateBotNN()` | 71 | +| 6458 | `_botShootNN()` | 45 | +| 6503 | `_radarFoot()` | 38 | +| 6541 | `_updateRadar()` | 64 | +| 6605 | `_banner()` | 26 | +| 6631 | `_resultadoDaRodada()` | 4 | +| 6635 | `_showScoreboard()` | 48 | +| 6683 | `_updateWeaponHud()` | 35 | +| 6718 | `_updateHud()` | 80 | +| 6798 | `update()` | 76 | +| 6874 | `dispose()` | 37 |
diff --git a/tools/eval/autofix-check.mjs b/tools/eval/autofix-check.mjs new file mode 100644 index 000000000..ec57c4434 --- /dev/null +++ b/tools/eval/autofix-check.mjs @@ -0,0 +1,141 @@ +#!/usr/bin/env node +/* ============================================================================ + autofix-check.mjs — O BOT CONSERTA, MAS SÓ O QUE É DERIVADO + ---------------------------------------------------------------------------- + O autofix é a primeira máquina deste repositório com permissão de ESCREVER num + PR. Isso só é aceitável enquanto três coisas valerem, e esta régua é quem as + segura: + + AF1 · toda escrita passa pela lista de permissão. Um `git commit`/`git push` no + autofix.yml que não seja precedido pela trava é a régua inteira contornada. + AF2 · a lista nunca cobre caminho de código. `public/`, `src/`, `scripts/`, + `.github/` e os manifestos ficam de fora — inclusive `.github/`, porque um + bot que edita o workflow que o governa amplia a própria permissão. + AF3 · o bot não mergeia. Deixar o PR pronto e fechá-lo são coisas diferentes, e + a segunda é humana (decisão do dono, 21/08). + AF4 · e isso vale para o repositório INTEIRO, não só para o autofix: nenhum + workflow pode chamar `gh pr merge`. O `csbrasil-bot-automerge` chamava, e + era a única coisa que um bot daqui fazia sozinho — justamente a que não + devia. Ele agora aplica `pronto-pra-merge` e o botão continua humano. + AF6 · o autofix acorda quando a MAIN anda, não só quando o PR se mexe. Foram 9 + releases em 20 horas e cada um reabre conflito em todo PR aberto; sem o + gatilho de push o bot só conserta quem empurra commit — ou seja, nunca + quem está parado esperando revisão, que é justamente quem precisa. + AF5 · o resolvedor de conflito passa pela MESMA trava e ABORTA quando sobra + conflito fora dela. Resolver conflito de arquivo gerado é mecânico (todo + `chore(release)` reabre um em cada PR aberto); resolver conflito de código + é julgamento. Sem o `git merge --abort` no caminho de exceção, o bot + resolveria código escolhendo um lado no escuro. + + Uso: node tools/eval/autofix-check.mjs [--mutante=] + ============================================================================ */ +import { readFileSync, readdirSync } from 'node:fs'; + +const MUT = (process.argv.find((a) => a.startsWith('--mutante=')) || '').split('=')[1] || ''; +const MUTANTES = { + 'autofix-sem-trava': 'AF1', + 'lista-abre-codigo': 'AF2', + 'lista-abre-workflow': 'AF2', + 'autofix-mergeia': 'AF3', + 'automerge-volta': 'AF4', + 'resolve-conflito-de-codigo': 'AF5', + 'sem-varredura-pos-release': 'AF6', +}; +if (MUT && !MUTANTES[MUT]) { console.error(`mutante desconhecido: ${MUT}`); process.exit(2); } + +const ler = (p) => { try { return readFileSync(p, 'utf8'); } catch { return ''; } }; +const falhas = []; + +let wf = ler('.github/workflows/autofix.yml'); +let lista = ler('scripts/ci/autofix_allowlist.py'); + +if (MUT === 'autofix-sem-trava') wf = wf.replace(/autofix_allowlist\.py/g, 'cat'); +if (MUT === 'autofix-mergeia') wf = wf.replace('git push origin "HEAD:$HEAD_REF"', 'git push origin "HEAD:$HEAD_REF"\n gh pr merge "$PR_NUMBER" --squash --auto'); +if (MUT === 'lista-abre-codigo') lista = lista.replace(' "docs/",', ' "docs/",\n "public/",'); +if (MUT === 'lista-abre-workflow') lista = lista.replace(/^\s*"\.github\/",$/m, ''); + +if (!wf) { console.log(' \x1b[31m✗\x1b[0m AF0 .github/workflows/autofix.yml não existe'); process.exit(1); } + +/* ---- AF1: escrita só depois da trava ---- */ +const usaTrava = /autofix_allowlist\.py/.test(wf); +const escreve = /git (commit|push)/.test(wf); +const posTrava = wf.indexOf('autofix_allowlist.py'); +const posCommit = wf.search(/git commit/); +if (escreve && (!usaTrava || posCommit < posTrava)) { + falhas.push('AF1 autofix.yml escreve no PR sem passar pela lista de permissão antes'); +} +/* O commit tem de usar SÓ o que a trava liberou, não um `git add -A`. */ +if (/git add\s+(-A|--all|\.)(\s|$)/.test(wf)) { + falhas.push('AF1 autofix.yml usa `git add` abrangente — o commit deve sair da saída da trava'); +} + +/* ---- AF2: a lista não cobre código ---- */ +if (!lista) falhas.push('AF2 scripts/ci/autofix_allowlist.py não existe'); +else { + const bloco = (lista.match(/PERMITIDOS = \(([\s\S]*?)\)/) || [])[1] || ''; + const proibidos = (lista.match(/PROIBIDOS = \(([\s\S]*?)\)/) || [])[1] || ''; + for (const perigoso of ['public/', 'src/', 'supabase/', 'scripts/', '.github/']) { + if (new RegExp(`"${perigoso.replace('.', '\\.')}`).test(bloco)) { + falhas.push(`AF2 a lista de permissão cobre \`${perigoso}\` — o bot passa a poder reescrever código`); + } + } + for (const obrigatorio of ['.github/', 'scripts/', 'package.json']) { + if (!new RegExp(`"${obrigatorio.replace('.', '\\.')}`).test(proibidos)) { + falhas.push(`AF2 \`${obrigatorio}\` não está na lista de proibidos`); + } + } +} + +/* ---- AF3: o bot não mergeia ---- */ +if (/gh pr merge/.test(wf)) { + falhas.push('AF3 autofix.yml mergeia PR — o autofix deixa pronto, quem fecha é gente'); +} + +/* ---- AF5: o resolvedor de conflito aborta quando o conflito é de gente ---- */ +if (MUT === 'resolve-conflito-de-codigo') { + wf = wf.replace(/\s*git merge --abort\n/, '\n'); +} +const resolveConflito = /--caminhos/.test(wf) && /git checkout --theirs/.test(wf); +if (resolveConflito) { + const trecho = wf.slice(wf.indexOf('diff-filter=U'), wf.indexOf('git checkout --theirs')); + if (!/autofix_allowlist\.py --caminhos/.test(trecho)) { + falhas.push('AF5 o resolvedor escolhe lado do conflito sem consultar a lista de permissão'); + } + if (!/git merge --abort/.test(trecho)) { + falhas.push('AF5 o resolvedor não aborta o merge quando sobra conflito fora da lista — passaria a decidir código no escuro'); + } + if (!/--caminhos/.test(ler('scripts/ci/autofix_allowlist.py'))) { + falhas.push('AF5 autofix_allowlist.py não entende `--caminhos`, que é como o resolvedor o consulta'); + } +} + +/* ---- AF6: a varredura pós-release existe e enxerga quem ficou para trás ---- */ +if (MUT === 'sem-varredura-pos-release') wf = wf.replace(/\n push:\n branches: \[main\]/, ''); +const temPush = /^\s{2}push:\n\s{4}branches: \[main\]/m.test(wf); +const temVarredura = /varredura:\n\s+if: github\.event_name == 'push'/.test(wf); +const filtraAtrasado = /mergeable != "MERGEABLE"/.test(wf) && /gh workflow run autofix\.yml/.test(wf); +if (!temPush) falhas.push('AF6 autofix.yml não acorda quando a main anda — PR parado esperando revisão nunca é consertado'); +else if (!temVarredura) falhas.push('AF6 o gatilho de push existe mas não há job de varredura'); +else if (!filtraAtrasado) falhas.push('AF6 a varredura não seleciona os PRs desatualizados nem dispara o autofix de cada um'); + +/* ---- AF4: e nenhum outro workflow mergeia tampouco ---- */ +const WORKFLOWS = readdirSync('.github/workflows').filter((f) => /\.ya?ml$/.test(f)); +for (const nome of WORKFLOWS) { + let texto = ler(`.github/workflows/${nome}`); + if (MUT === 'automerge-volta' && nome === 'csbrasil-bot-automerge.yml') { + texto += "\n subprocess.run(['gh', 'pr', 'merge', pr, '--squash', '--auto'])\n"; + } + /* Só a CHAMADA conta: o comentário que explica por que ela saiu tem de poder citá-la. */ + const linhas = texto.split('\n').filter((l) => !/^\s*#/.test(l)); + if (linhas.some((l) => /gh['"]?,\s*['"]pr['"],\s*['"]merge['"]|gh pr merge/.test(l))) { + falhas.push(`AF4 ${nome} mergeia PR sozinho — deixar pronto e fechar são coisas diferentes`); + } +} + +for (const f of falhas) console.log(` \x1b[31m✗\x1b[0m ${f}`); +if (!falhas.length) console.log(' \x1b[32m✓\x1b[0m AF autofix escreve só o que a trava libera, a lista não cobre código e o bot não mergeia'); +if (MUT && !falhas.length) { + console.log(` \x1b[31m✗\x1b[0m MUTAÇÃO '${MUT}' não acendeu nenhuma cláusula — portão cego`); + falhas.push('mutacao-cega'); // prova que não morde é vermelho, não aviso (MC1) +} +process.exit(falhas.length ? 1 : 0); diff --git a/tools/eval/deploy-gate-check.mjs b/tools/eval/deploy-gate-check.mjs new file mode 100644 index 000000000..6b5e5716b --- /dev/null +++ b/tools/eval/deploy-gate-check.mjs @@ -0,0 +1,75 @@ +#!/usr/bin/env node +/* ============================================================================ + deploy-gate-check.mjs — QUEM BLOQUEIA O PR É O CI, NÃO A VERCEL + ---------------------------------------------------------------------------- + MEDIDO EM 21/08/2026: Vercel vermelha em 13 dos 14 PRs vindos de fork, sempre + com `Authorization required to deploy.` - a proteção de fork da própria Vercel, + que não se resolve por commit nenhum. E em 4 PRs de casa o vermelho era build + real, uma vez por `fetch-decals.sh` não ter baixado o acervo (196 de 197 + decalques faltando) num soluço de rede. + + Para poder tirar a Vercel do caminho crítico do PR, duas coisas precisam valer: + + DG1 · o CI constrói o site no próprio PR. Sem isso, tirar a Vercel do bloqueio + deixaria o PR sem NENHUMA prova de que o site compila. + DG2 · nenhum download do caminho do build corre sem retry. `set -e` mais um + `curl` sem `--retry` transforma soluço de rede em PR vermelho, e o autor + não tem o que consertar - é o mesmo dano do portão que não pode medir. + DG3 · o preview de fork roda sem pedir aprovação a ninguém, porque quem compila + não tem segredo e quem tem segredo não compila. Os dois arquivos existem e o + contrato deles é guardado em detalhe pelo `scripts/ci/workflow_security_check.py` + (PRV1/PRV2/PRV3); aqui só se confere que o par não sumiu. + + Uso: node tools/eval/deploy-gate-check.mjs [--mutante=] + ============================================================================ */ +import { readFileSync, readdirSync } from 'node:fs'; + +const MUT = (process.argv.find((a) => a.startsWith('--mutante=')) || '').split('=')[1] || ''; +const MUTANTES = { 'ci-sem-build': 'DG1', 'download-sem-retry': 'DG2', 'preview-sem-par': 'DG3' }; +if (MUT && !MUTANTES[MUT]) { console.error(`mutante desconhecido: ${MUT}`); process.exit(2); } + +const ler = (p) => { try { return readFileSync(p, 'utf8'); } catch { return ''; } }; +const falhas = []; + +/* ---- DG1: o CI constrói no PR ---- */ +let ci = ler('.github/workflows/ci.yml'); +if (MUT === 'ci-sem-build') ci = ci.replace('run: npm run build', 'run: echo pulei o build'); +const on = (ci.match(/^on:\n([\s\S]*?)(?=^\S)/m) || [])[1] || ''; +if (!/^\s{2}pull_request:/m.test(on) || !/run:\s*npm run build/.test(ci)) { + falhas.push('DG1 ci.yml não constrói o site em pull_request — sem isso a Vercel não pode sair do bloqueio'); +} + +/* ---- DG2: download do build com retry ---- */ +const FETCHERS = readdirSync('scripts').filter((f) => /^fetch-.*\.sh$/.test(f)); +for (const f of FETCHERS) { + let sh = ler(`scripts/${f}`); + if (MUT === 'download-sem-retry' && f === 'fetch-decals.sh') { + sh = sh.replace(/curl --retry \d+[^"]*-fsSL/, 'curl -fsSL'); + } + for (const linha of sh.split('\n')) { + if (!/^\s*curl\s/.test(linha)) continue; + if (!/--retry\b/.test(linha)) { + falhas.push(`DG2 scripts/${f}: curl sem --retry no caminho do build — soluço de rede vira PR vermelho`); + } + } +} +if (!FETCHERS.length) falhas.push('DG2 nenhum scripts/fetch-*.sh encontrado — a régua perdeu o alvo'); + +/* ---- DG3: a etiqueta do preview nasce com quem a usa ---- */ +let preview = ler('.github/workflows/preview-bot.yml'); +if (MUT === 'preview-sem-par') preview = preview.replace(/ensure_labels\.py preview-autorizado/, 'ensure_labels.py'); +const temBuild = ler('.github/workflows/preview-build.yml'); +const temDeploy = ler('.github/workflows/preview-deploy.yml'); +if (MUT === 'preview-sem-par') { /* nome antigo do mutante: agora derruba o par */ } +const par = (MUT === 'preview-sem-par') ? '' : (temBuild && temDeploy); +if (!par) { + falhas.push('DG3 falta preview-build.yml ou preview-deploy.yml — sem o par, preview de fork volta a depender de aprovação humana'); +} + +for (const f of falhas) console.log(` \x1b[31m✗\x1b[0m ${f}`); +if (!falhas.length) console.log(` \x1b[32m✓\x1b[0m DG o PR é bloqueado pelo build do CI; download tem retry (${FETCHERS.length} fetchers); preview de fork sem aprovação`); +if (MUT && !falhas.length) { + console.log(` \x1b[31m✗\x1b[0m MUTAÇÃO '${MUT}' não acendeu nenhuma cláusula — portão cego`); + falhas.push('mutacao-cega'); // prova que não morde é vermelho, não aviso (MC1) +} +process.exit(falhas.length ? 1 : 0); diff --git a/tools/eval/fixture-check.mjs b/tools/eval/fixture-check.mjs index 987f43be2..a10fd1b42 100644 --- a/tools/eval/fixture-check.mjs +++ b/tools/eval/fixture-check.mjs @@ -35,7 +35,6 @@ const base = arg('base') || 'origin/main'; /* Dívida herdada: script de decisão que nasceu sem fixture. A lista só encolhe. Quem tocar num destes escreve o `--selftest` no mesmo PR. */ const SEM_FIXTURE = new Set([ - 'scripts/ci/ensure_labels.py', 'scripts/ci/issue_triage.py', 'scripts/ci/pr_classify.py', 'scripts/ci/pr_route.py', diff --git a/tools/eval/g2ui-map-previews.mjs b/tools/eval/g2ui-map-previews.mjs index 01fffa608..6c9a0fa51 100644 --- a/tools/eval/g2ui-map-previews.mjs +++ b/tools/eval/g2ui-map-previews.mjs @@ -52,8 +52,6 @@ const POSES = process.env.POSES ? JSON.parse(process.env.POSES) : { velho_oeste: { pos: [0, 30, -35], pitch: -0.55, yaw: 3.14 }, penitenciaria: { pos: [0, 30, -35], pitch: -0.55, yaw: 3.14 }, parque_treta: { pos: [0, 30, -35], pitch: -0.55, yaw: 3.14 }, - // Vista diagonal elevada como a referência: fortaleza central, bastiões e rotas laterais. - treta_no_gelo: { pos: [32, 8.0, 32], pitch: -0.24, yaw: 0.78 }, }; const NOPOSE = process.env.NOPOSE === '1'; // captura do spawn, sem pino de posição const TAG = process.env.TAG || ''; @@ -98,7 +96,7 @@ page.on('pageerror', e => { errors++; console.error('[pageerror]', e.message); } for (const mapId of LIST) { await page.goto(`${BASE}/?debug=1&auto=P,mst&map=${mapId}`, { waitUntil: 'domcontentloaded', timeout: 60000 }); await page.waitForFunction(() => window.__game && window.__game.state === 'live', null, { timeout: 180000 }); - await page.addStyleTag({ content: '#hud,#hud-shortcuts{display:none!important}' }); + await page.addStyleTag({ content: '#hud{display:none!important}' }); await page.evaluate((pose) => { const g = window.__game; g.player.hp = 1e9; diff --git a/tools/eval/portao-inteiro-check.mjs b/tools/eval/portao-inteiro-check.mjs new file mode 100644 index 000000000..b0b361e8f --- /dev/null +++ b/tools/eval/portao-inteiro-check.mjs @@ -0,0 +1,68 @@ +#!/usr/bin/env node +/* ============================================================================ + portao-inteiro-check.mjs — PORTÃO NÃO PODE CITAR PASSO QUE NÃO EXISTE + ---------------------------------------------------------------------------- + `check:fast` e `check:deploy` são listas de nomes de script. Se um nome citado + ali não está definido em `scripts`, o npm morre com "missing script" e o portão + inteiro para no meio - os passos DEPOIS do nome quebrado nunca rodam. + + DOIS CASOS REAIS, os dois em 22/08/2026: + · o PR #372 citava `eval:gelo` no `check:fast` e nunca definiu o script. A régua + `treta-gelo-check.mjs` existia e simplesmente não estava ligada em lugar nenhum; + · resolvendo o conflito de `package.json` do #408, eu fiquei com a linha do + `check:` de um lado e perdi as DEFINIÇÕES do outro. Três réguas viraram nome + órfão de uma vez - e conflito de `package.json` é justamente o que mais + acontece, porque todo PR que acrescenta régua mexe na mesma linha. + + PI1 · todo nome citado em `check:fast`/`check:deploy` existe em `scripts`. + PI2 · todo script `eval:*` aponta para arquivo que existe em disco. + + Uso: node tools/eval/portao-inteiro-check.mjs [--mutante=] + ============================================================================ */ +import { readFileSync, existsSync } from 'node:fs'; + +const MUT = (process.argv.find((a) => a.startsWith('--mutante=')) || '').split('=')[1] || ''; +const MUTANTES = { 'passo-orfao': 'PI1', 'regua-fantasma': 'PI2' }; +if (MUT && !MUTANTES[MUT]) { console.error(`mutante desconhecido: ${MUT}`); process.exit(2); } + +const pkg = JSON.parse(readFileSync('package.json', 'utf8')); +const scripts = { ...pkg.scripts }; +if (MUT === 'passo-orfao') scripts['check:fast'] += ' eval:nao-existe'; +if (MUT === 'regua-fantasma') scripts['eval:fantasma'] = 'node tools/eval/nao-existe-check.mjs'; + +const falhas = []; +const PORTOES = ['check:fast', 'check:deploy']; + +/* ---- PI1: nome citado tem de estar definido ---- */ +for (const portao of PORTOES) { + const linha = scripts[portao]; + if (!linha) { falhas.push(`PI1 o portão \`${portao}\` não existe em scripts`); continue; } + /* A linha é `node tools/eval/runner.mjs a b c`: passo é token com `:` que não é + caminho. `syntax` é o único passo sem `:` e está definido como script. */ + const passos = linha.split(/\s+/).slice(2).filter((t) => t && !t.includes('/')); + for (const passo of passos) { + if (!scripts[passo]) { + falhas.push(`PI1 ${portao} cita \`${passo}\`, que não está definido em scripts — o npm morre em "missing script" e os passos seguintes NÃO rodam`); + } + } +} + +/* ---- PI2: régua citada tem de existir em disco ---- */ +for (const [nome, cmd] of Object.entries(scripts)) { + if (nome.startsWith('//')) continue; // chave de documentação, não é script + const m = String(cmd).match(/node\s+(tools\/[^\s]+\.mjs)/); + if (m && !existsSync(m[1])) { + falhas.push(`PI2 \`${nome}\` aponta para ${m[1]}, que não existe em disco`); + } +} + +for (const f of falhas) console.log(` \x1b[31m✗\x1b[0m ${f}`); +if (!falhas.length) { + const total = PORTOES.reduce((n, p) => n + (scripts[p] || '').split(/\s+/).slice(2).filter((t) => t && !t.includes('/')).length, 0); + console.log(` \x1b[32m✓\x1b[0m PI todo passo dos dois portões está definido e aponta para arquivo que existe (${total} citações)`); +} +if (MUT && !falhas.length) { + console.log(` \x1b[31m✗\x1b[0m MUTAÇÃO '${MUT}' não acendeu nenhuma cláusula — portão cego (lei 3)`); + falhas.push('mutacao-cega'); // prova que não morde é vermelho, não aviso (MC1) +} +process.exit(falhas.length ? 1 : 0); diff --git a/tools/eval/workflow-secret-check.mjs b/tools/eval/workflow-secret-check.mjs new file mode 100644 index 000000000..37254ec04 --- /dev/null +++ b/tools/eval/workflow-secret-check.mjs @@ -0,0 +1,74 @@ +#!/usr/bin/env node +/* ============================================================================ + workflow-secret-check.mjs — PORTÃO QUE NÃO PODE MEDIR NÃO VOTA + ---------------------------------------------------------------------------- + MEDIDO EM 21/08/2026, nos últimos 29 PRs: `classify` vermelho em 11 dos 14 PRs + vindos de FORK e em 0 dos 15 de casa. A causa não era o código de ninguém. + + A regra do GitHub: um workflow disparado por `pull_request`, `pull_request_review` + ou `pull_request_review_comment` a partir de um FORK roda SEM os secrets do + repositório. Só `pull_request_target`, `workflow_dispatch`, `schedule` e + `workflow_run` correm no contexto base e enxergam secret. + + Um job que (a) escuta um desses gatilhos cegos e (b) sai com erro quando o secret + está vazio, reprova todo PR externo por um motivo que o autor não tem como + consertar - e ainda ensina o time a ignorar vermelho, que é o dano caro. + + O QUE ESTA RÉGUA EXIGE: se o job pode ser disparado por gatilho cego, ele precisa + de um `if:` que o exclua desse caso. O guard de secret continua podendo existir e + continuar falhando alto onde o secret DEVERIA estar lá. + + Uso: node tools/eval/workflow-secret-check.mjs [--mutante=] + ============================================================================ */ +import { readFileSync, readdirSync } from 'node:fs'; +import { join } from 'node:path'; + +const DIR = '.github/workflows'; +const MUT = (process.argv.find((a) => a.startsWith('--mutante=')) || '').split('=')[1] || ''; +const MUTANTES = { 'guard-sem-if': 'WSEC1', 'gatilho-cego-novo': 'WSEC1' }; +if (MUT && !MUTANTES[MUT]) { console.error(`mutante desconhecido: ${MUT}`); process.exit(2); } + +/* Gatilhos que, num PR de fork, chegam sem secret. `pull_request` entra na lista + porque é o caso clássico; os outros dois foram os que sangraram aqui. */ +const CEGOS = ['pull_request', 'pull_request_review', 'pull_request_review_comment']; + +const arquivos = readdirSync(DIR).filter((f) => f.endsWith('.yml') || f.endsWith('.yaml')); +const falhas = []; + +for (const nome of arquivos) { + let texto = readFileSync(join(DIR, nome), 'utf8'); + if (MUT === 'guard-sem-if' && nome === 'csbrasil-bot-pr-classify.yml') { + texto = texto.replace(/ if: >-\n( github\.event_name[^\n]*\n)+/, ''); + } + if (MUT === 'gatilho-cego-novo' && nome === 'preview-bot.yml') { + texto = texto.replace(' pull_request_target:', ' pull_request_review:\n types: [submitted]\n pull_request_target:'); + } + + /* O bloco `on:` vai até a primeira chave de topo seguinte (coluna zero). Ler o + arquivo inteiro daria falso positivo com `pull_request` citado em comentário + dentro de um step. */ + const mOn = texto.match(/^on:\n([\s\S]*?)(?=^\S)/m); + if (!mOn) continue; + const bloco = mOn[1]; + const cegos = CEGOS.filter((g) => new RegExp(`^\\s{2}${g}:`, 'm').test(bloco)); + if (!cegos.length) continue; + + /* Guard de secret = o job aborta quando a variável de secret está vazia. */ + const temGuard = /-z "\$GH_TOKEN"|-z "\$\{?[A-Z_]*TOKEN/.test(texto) && /exit 1/.test(texto); + if (!temGuard) continue; + + /* A defesa aceita: um `if:` de job que amarre o event_name ou compare o repo da + head com o repositório - as duas formas de dizer "aqui eu tenho secret". */ + const temDefesa = /if:[\s\S]{0,400}?(github\.event_name\s*==|head\.repo\.full_name\s*==)/.test(texto); + if (!temDefesa) { + falhas.push(`WSEC1 ${nome}: guard de secret + gatilho cego (${cegos.join(', ')}) sem \`if:\` que exclua o caso de fork`); + } +} + +for (const f of falhas) console.log(` \x1b[31m✗\x1b[0m ${f}`); +if (!falhas.length) console.log(` \x1b[32m✓\x1b[0m WSEC1 nenhum portão reprova PR de fork por secret que aquele gatilho não pode ter (${arquivos.length} workflows)`); +if (MUT && !falhas.length) { + console.log(` \x1b[31m✗\x1b[0m MUTAÇÃO '${MUT}' não acendeu nenhuma cláusula — portão cego`); + falhas.push('mutacao-cega'); // prova que não morde é vermelho, não aviso (MC1) +} +process.exit(falhas.length ? 1 : 0); From a8dc5c51621bf56ca2d557a570ebeca3e933a5ff Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 04:17:59 +0000 Subject: [PATCH 04/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Signed-off-by: csbrasil-bot --- ARCH.generated.md | 6 +++--- README.md | 4 ++-- STATUS.md | 2 +- docs/docs/comecando.md | 8 ++++---- docs/docs/quality-gates.md | 2 +- .../docusaurus-plugin-content-docs/current/comecando.md | 8 ++++---- .../current/quality-gates.md | 2 +- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/ARCH.generated.md b/ARCH.generated.md index 1208bc62b..7bfc059f6 100644 --- a/ARCH.generated.md +++ b/ARCH.generated.md @@ -10,7 +10,7 @@ Números atuais das zonas, do quality gate e do `package.json`: |---|---|---|---| | `public/` | o **jogo** | 45 arquivos `.js`, 32.271 linhas · Three.js `r160` vendorizado | ES modules servidos crus, **zero build**, sem dependência de runtime | | `src/` | o **site** | 18 páginas `.astro`, 21 rotas `/api` · Astro `^7.1.1` | framework é bem-vindo; `service_role` só no servidor | -| `tools/` | o **arnês** | 197 scripts em `tools/eval/`, 54 em `tools/` | node puro: sobe o jogo real sem browser | +| `tools/` | o **arnês** | 201 scripts em `tools/eval/`, 54 em `tools/` | node puro: sobe o jogo real sem browser | **Não existe `public/index.html`.** O HTML do jogo é `src/pages/index.astro`, servido na rota `/`. Servir `public/` estaticamente entrega os arnêses visuais, **não o jogo** — é a pegadinha que custa a primeira hora de todo mundo. @@ -25,10 +25,10 @@ Comandos e scripts atuais do quality gate: ```bash -npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:pickuparma eval:parquewheel eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:backendhints changelog:check eval:gelo eval:velhooeste eval:penitenciaria eval:comentario eval:fixture eval:preload eval:docsautoria eval:replaycam +npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:pickuparma eval:parquewheel eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:backendhints changelog:check eval:velhooeste eval:penitenciaria eval:mutcega eval:autofix eval:deploygate eval:portaointeiro eval:wfsecret eval:comentario eval:fixture eval:preload eval:docsautoria eval:replaycam ``` -`package.json` tem **121 scripts**; o motivo de cada um mora em `SCRIPTS.md` (migrado das chaves `//nome` em 18/08/2026) — é onde está o porquê. +`package.json` tem **124 scripts**; o motivo de cada um mora em `SCRIPTS.md` (migrado das chaves `//nome` em 18/08/2026) — é onde está o porquê. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `node -p "Object.keys(require('./package.json').scripts)"` diff --git a/README.md b/README.md index 16d720822..f9576bf5a 100644 --- a/README.md +++ b/README.md @@ -44,10 +44,10 @@ contra bots, direto na aba. Sem download, sem instalação, sem cadastro. | Personagens jogáveis | 44, em 5 facções | array `CHARACTERS` de `characters.js` | | Mapas no registro | 13 | objeto `MAPS` de `maps.js` | | Arnêses visuais em HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Scripts do arnês | 197 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Scripts do arnês | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | -| Versão | `2.0.0-alpha.175` | `public/js/version.js` e `package.json` (batem) | +| Versão | `2.0.0-alpha.175` | `public/js/version.js` — **DIVERGE do `package.json`: `2.0.0-alpha.176`** | > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `o comando da coluna direita de cada linha` diff --git a/STATUS.md b/STATUS.md index 081547e1f..6e5d78c29 100644 --- a/STATUS.md +++ b/STATUS.md @@ -5,7 +5,7 @@ - **Versão:** `2.0.0-alpha.175` - **Conteúdo jogável:** 5 facções, 44 personagens, 13 mapas e 26 armas com GLB - **Código do jogo:** 32.271 linhas em 45 módulos JavaScript -- **Automação:** 121 comandos npm, 197 scripts de avaliação e 54 scripts de pipeline +- **Automação:** 124 comandos npm, 201 scripts de avaliação e 54 scripts de pipeline > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `package.json · CHARACTERS · MAPS · public/models/weapons · public/js · tools/` diff --git a/docs/docs/comecando.md b/docs/docs/comecando.md index e4304abca..59cd554ff 100644 --- a/docs/docs/comecando.md +++ b/docs/docs/comecando.md @@ -49,10 +49,10 @@ esta página envelhecia no primeiro commit — ver | Personagens jogáveis | 44, em 5 facções | array `CHARACTERS` de `characters.js` | | Mapas no registro | 13 | objeto `MAPS` de `maps.js` | | Arnêses visuais em HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Scripts do arnês | 197 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Scripts do arnês | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | -| Versão | `2.0.0-alpha.175` | `public/js/version.js` e `package.json` (batem) | +| Versão | `2.0.0-alpha.175` | `public/js/version.js` — **DIVERGE do `package.json`: `2.0.0-alpha.176`** | > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `o comando da coluna direita de cada linha` @@ -276,10 +276,10 @@ E os dois quality gates, com a lista exata do que cada um roda — direto do `pa {/* BEGIN:GERADO:scripts — não edite à mão, rode `npm run docs` */} ```bash -npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:pickuparma eval:parquewheel eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:backendhints changelog:check eval:gelo eval:velhooeste eval:penitenciaria eval:comentario eval:fixture eval:preload eval:docsautoria eval:replaycam +npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:pickuparma eval:parquewheel eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:backendhints changelog:check eval:velhooeste eval:penitenciaria eval:mutcega eval:autofix eval:deploygate eval:portaointeiro eval:wfsecret eval:comentario eval:fixture eval:preload eval:docsautoria eval:replaycam ``` -`package.json` tem **121 scripts**; o motivo de cada um mora em `SCRIPTS.md` (migrado das chaves `//nome` em 18/08/2026) — é onde está o porquê. +`package.json` tem **124 scripts**; o motivo de cada um mora em `SCRIPTS.md` (migrado das chaves `//nome` em 18/08/2026) — é onde está o porquê. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `node -p "Object.keys(require('./package.json').scripts)"` diff --git a/docs/docs/quality-gates.md b/docs/docs/quality-gates.md index a5ab9d591..c0f22a897 100644 --- a/docs/docs/quality-gates.md +++ b/docs/docs/quality-gates.md @@ -15,7 +15,7 @@ PR (`.github/workflows/ci.yml`). {/* BEGIN:GERADO:invariantes — não edite à mão, rode `npm run docs` */} - `tools/eval/invariants.mjs`: **2.275 linhas**, **65 identificadores de invariante declarados** (`put()`), dos quais **28** têm caminho de `skip()` declarado. -- O arnês inteiro são **197 scripts** em `tools/eval/` (`.mjs` + `.py`), mais **54 scripts** de pipeline em `tools/`. +- O arnês inteiro são **201 scripts** em `tools/eval/` (`.mjs` + `.py`), mais **54 scripts** de pipeline em `tools/`. - Quantas invariantes rodam como **críticas** numa execução **não é derivável do fonte**: depende de qual insumo existe na máquina (o JSON do auditor de viewmodel, um GLB, uma pasta de anims). Esse número só sai rodando o quality gate — e o lugar dele é o cabeçalho do `KNOWN-BUGS.md`, atualizado com saída real. Reproduza: diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md index 60334bb1d..c57ca2020 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md @@ -51,10 +51,10 @@ this page was aging at the very first commit — see | Playable characters | 44, in 5 factions | `CHARACTERS` array in `characters.js` | | Maps in the registry | 13 | `MAPS` object in `maps.js` | | Visual harnesses in HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Harness scripts | 197 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Harness scripts | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Pipeline scripts | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Written entry tasks | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | -| Version | `2.0.0-alpha.175` | `public/js/version.js` and `package.json` (match) | +| Version | `2.0.0-alpha.175` | `public/js/version.js` and `package.json` **DIVERGE** | > Block generated by `node tools/gen-docs.mjs`. Source: `the command in the right column of each row` @@ -278,10 +278,10 @@ And the two gates, with the exact list of what each one runs — straight from ` {/* BEGIN:GERADO:scripts — não edite à mão, rode `npm run docs` */} ```bash -npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:pickuparma eval:parquewheel eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:backendhints changelog:check eval:gelo eval:velhooeste eval:penitenciaria eval:comentario eval:fixture eval:preload eval:docsautoria eval:replaycam +npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:pickuparma eval:parquewheel eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:backendhints changelog:check eval:velhooeste eval:penitenciaria eval:mutcega eval:autofix eval:deploygate eval:portaointeiro eval:wfsecret eval:comentario eval:fixture eval:preload eval:docsautoria eval:replaycam ``` -`package.json` has **121 scripts**; the reason behind each one lives in `SCRIPTS.md`. +`package.json` has **124 scripts**; the reason behind each one lives in `SCRIPTS.md`. > Block generated by `node tools/gen-docs.mjs`. Source: `node -p "Object.keys(require('./package.json').scripts)"` diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md index 7673a7059..ef263f297 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md @@ -18,7 +18,7 @@ PR (`.github/workflows/ci.yml`). {/* BEGIN:GERADO:invariantes — não edite à mão, rode `npm run docs` */} - `tools/eval/invariants.mjs`: **2,275 lines**, **65 declared invariant identifiers**, with **28** declared `skip()` paths. -- The harness contains **197 scripts** in `tools/eval/`, plus **54 pipeline scripts** in `tools/`. +- The harness contains **201 scripts** in `tools/eval/`, plus **54 pipeline scripts** in `tools/`. - The number of critical checks in one run depends on the inputs present on that machine; dated results belong in `KNOWN-BUGS.md`. ```bash From 245fe6758068c7a490ae106e2a68b7959f9042da Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 04:19:36 +0000 Subject: [PATCH 05/21] =?UTF-8?q?Merge=20da=20base=20(conflito=20s=C3=B3?= =?UTF-8?q?=20em=20arquivo=20gerado,=20resolvido=20pelo=20autofix)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agent: csbrasil-bot (autofix) Signed-off-by: csbrasil-bot --- package-lock.json | 4 ++-- package.json | 2 +- tools/eval/ARCH.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index e25564558..3d6977d77 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "coro-solto", - "version": "2.0.0-alpha.176", + "version": "2.0.0-alpha.177", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "coro-solto", - "version": "2.0.0-alpha.176", + "version": "2.0.0-alpha.177", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/vercel": "^11.0.6", diff --git a/package.json b/package.json index 29eebdad5..c574a47b5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "coro-solto", - "version": "2.0.0-alpha.176", + "version": "2.0.0-alpha.177", "license": "AGPL-3.0-only", "description": "CORO SOLTO: Treta Suprema (ex-CS BRASIL) — FPS satírico de navegador com 5 facções brasileiras (site Astro + jogo vanilla em Three.js), gerado em par com agentes de IA (AI generated & AI friendly)", "scripts": { diff --git a/tools/eval/ARCH.md b/tools/eval/ARCH.md index e8d932ec1..cb96bc69f 100644 --- a/tools/eval/ARCH.md +++ b/tools/eval/ARCH.md @@ -3,7 +3,7 @@ > Gerado por `node tools/gen-arch.mjs`. **Não edite este bloco à mão.** -> Versão do jogo: 2.0.0-alpha.176 · `npm run arch` para regenerar · `npm run arch:check` no CI. +> Versão do jogo: 2.0.0-alpha.177 · `npm run arch` para regenerar · `npm run arch:check` no CI. ## Tamanho dos arquivos indexados From 1405ca19cc1ada2d2afdff6be72c7232e37538ca Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 04:19:36 +0000 Subject: [PATCH 06/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Signed-off-by: csbrasil-bot --- README.md | 2 +- docs/docs/comecando.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f9576bf5a..04b2493e7 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ contra bots, direto na aba. Sem download, sem instalação, sem cadastro. | Scripts do arnês | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | -| Versão | `2.0.0-alpha.175` | `public/js/version.js` — **DIVERGE do `package.json`: `2.0.0-alpha.176`** | +| Versão | `2.0.0-alpha.175` | `public/js/version.js` — **DIVERGE do `package.json`: `2.0.0-alpha.177`** | > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `o comando da coluna direita de cada linha` diff --git a/docs/docs/comecando.md b/docs/docs/comecando.md index 59cd554ff..921b45c19 100644 --- a/docs/docs/comecando.md +++ b/docs/docs/comecando.md @@ -52,7 +52,7 @@ esta página envelhecia no primeiro commit — ver | Scripts do arnês | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | -| Versão | `2.0.0-alpha.175` | `public/js/version.js` — **DIVERGE do `package.json`: `2.0.0-alpha.176`** | +| Versão | `2.0.0-alpha.175` | `public/js/version.js` — **DIVERGE do `package.json`: `2.0.0-alpha.177`** | > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `o comando da coluna direita de cada linha` From 783a21e30ef929182617876af1dc9715b4132a9a Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 04:20:05 +0000 Subject: [PATCH 07/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Signed-off-by: csbrasil-bot --- ARCH.generated.md | 4 ++-- README.md | 17 +++++++++-------- STATUS.md | 6 +++--- docs/docs/colaborar.md | 5 +++-- docs/docs/comecando.md | 15 ++++++++------- docs/docs/quality-gates.md | 2 +- .../current/colaborar.md | 5 +++-- .../current/comecando.md | 15 ++++++++------- .../current/quality-gates.md | 2 +- 9 files changed, 38 insertions(+), 33 deletions(-) diff --git a/ARCH.generated.md b/ARCH.generated.md index e23771a09..7bfc059f6 100644 --- a/ARCH.generated.md +++ b/ARCH.generated.md @@ -8,9 +8,9 @@ Números atuais das zonas, do quality gate e do `package.json`: | Zona | O que é | Tamanho medido | Regra | |---|---|---|---| -| `public/` | o **jogo** | 44 arquivos `.js`, 32.001 linhas · Three.js `r160` vendorizado | ES modules servidos crus, **zero build**, sem dependência de runtime | +| `public/` | o **jogo** | 45 arquivos `.js`, 32.271 linhas · Three.js `r160` vendorizado | ES modules servidos crus, **zero build**, sem dependência de runtime | | `src/` | o **site** | 18 páginas `.astro`, 21 rotas `/api` · Astro `^7.1.1` | framework é bem-vindo; `service_role` só no servidor | -| `tools/` | o **arnês** | 200 scripts em `tools/eval/`, 54 em `tools/` | node puro: sobe o jogo real sem browser | +| `tools/` | o **arnês** | 201 scripts em `tools/eval/`, 54 em `tools/` | node puro: sobe o jogo real sem browser | **Não existe `public/index.html`.** O HTML do jogo é `src/pages/index.astro`, servido na rota `/`. Servir `public/` estaticamente entrega os arnêses visuais, **não o jogo** — é a pegadinha que custa a primeira hora de todo mundo. diff --git a/README.md b/README.md index 391db7ab2..3f3369b8c 100644 --- a/README.md +++ b/README.md @@ -34,17 +34,17 @@ contra bots, direto na aba. Sem download, sem instalação, sem cadastro. | O que | Quanto | Onde confere | |---|---:|---| -| Código do jogo | 32.001 linhas em 44 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | -| `game.js` | **6.910** linhas | `wc -l public/js/game.js` | -| `main.js` | 2.698 linhas | `wc -l public/js/main.js` | +| Código do jogo | 32.271 linhas em 45 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | +| `game.js` | **6.917** linhas | `wc -l public/js/game.js` | +| `main.js` | 2.702 linhas | `wc -l public/js/main.js` | | Armas com GLB | 26 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | | GLBs de personagem | 45 | `git ls-files 'public/models/characters/*.glb' \| wc -l` | | Props em GLB | 108 | `git ls-files 'public/models/props/*.glb' \| wc -l` | | Clipes de animação versionados | 573 | `git ls-files public/models/anims \| wc -l` | | Personagens jogáveis | 44, em 5 facções | array `CHARACTERS` de `characters.js` | -| Mapas no registro | 12 | objeto `MAPS` de `maps.js` | +| Mapas no registro | 13 | objeto `MAPS` de `maps.js` | | Arnêses visuais em HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Scripts do arnês | 200 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Scripts do arnês | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | | Versão | `2.0.0-alpha.177` | `public/js/version.js` e `package.json` (batem) | @@ -89,7 +89,7 @@ arquitetura): `cd docs && npm install && npm start` → Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `objeto MAPS de public/js/maps.js` diff --git a/STATUS.md b/STATUS.md index 40aeac98b..645a9de52 100644 --- a/STATUS.md +++ b/STATUS.md @@ -3,9 +3,9 @@ - **Versão:** `2.0.0-alpha.177` -- **Conteúdo jogável:** 5 facções, 44 personagens, 12 mapas e 26 armas com GLB -- **Código do jogo:** 32.001 linhas em 44 módulos JavaScript -- **Automação:** 124 comandos npm, 200 scripts de avaliação e 54 scripts de pipeline +- **Conteúdo jogável:** 5 facções, 44 personagens, 13 mapas e 26 armas com GLB +- **Código do jogo:** 32.271 linhas em 45 módulos JavaScript +- **Automação:** 124 comandos npm, 201 scripts de avaliação e 54 scripts de pipeline > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `package.json · CHARACTERS · MAPS · public/models/weapons · public/js · tools/` diff --git a/docs/docs/colaborar.md b/docs/docs/colaborar.md index 2d5b3e074..10057223a 100644 --- a/docs/docs/colaborar.md +++ b/docs/docs/colaborar.md @@ -14,7 +14,7 @@ O número abaixo não é retórica, e não é escrito à mão: sai de `git short {/* BEGIN:GERADO:pessoas — não edite à mão, rode `npm run docs` */} -**11 identidades de autoria humana** assinam commit no histórico **desta branch**: `ruben-cytonic`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`. O resto dos commits é assinado por agentes de IA. Branch não é repositório: quem contribuiu num ramo que esta branch não contém **não aparece aqui**. +**12 identidades de autoria humana** assinam commit no histórico **desta branch**: `ruben-cytonic`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`, `usantos`. O resto dos commits é assinado por agentes de IA. Branch não é repositório: quem contribuiu num ramo que esta branch não contém **não aparece aqui**. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `git shortlog -sn --no-merges (descontando autores que são agentes)` @@ -260,8 +260,9 @@ O registro, gerado do `MAPS` de `public/js/maps.js`: | `parque_treta` | Parque da Treta | **captura** | `map_parque.js` | 402 | | `velho_oeste` | Velho Oeste da Treta | **captura** | `map_velho_oeste.js` | 433 | | `penitenciaria` | Penitenciária da Treta | **captura** | `map_penitenciaria.js` | 247 | +| `treta_no_gelo` | Treta no Gelo | rodadas | `map_gelo.js` | 250 | -**12 mapas registrados** — 2 abrem em rodadas e 10 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 14 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. +**13 mapas registrados** — 3 abrem em rodadas e 10 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 15 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `objeto MAPS de public/js/maps.js` diff --git a/docs/docs/comecando.md b/docs/docs/comecando.md index 8c9d253c4..57f08fb35 100644 --- a/docs/docs/comecando.md +++ b/docs/docs/comecando.md @@ -39,17 +39,17 @@ esta página envelhecia no primeiro commit — ver | O que | Quanto | Onde confere | |---|---:|---| -| Código do jogo | 32.001 linhas em 44 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | -| `game.js` | **6.910** linhas | `wc -l public/js/game.js` | -| `main.js` | 2.698 linhas | `wc -l public/js/main.js` | +| Código do jogo | 32.271 linhas em 45 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | +| `game.js` | **6.917** linhas | `wc -l public/js/game.js` | +| `main.js` | 2.702 linhas | `wc -l public/js/main.js` | | Armas com GLB | 26 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | | GLBs de personagem | 45 | `git ls-files 'public/models/characters/*.glb' \| wc -l` | | Props em GLB | 108 | `git ls-files 'public/models/props/*.glb' \| wc -l` | | Clipes de animação versionados | 573 | `git ls-files public/models/anims \| wc -l` | | Personagens jogáveis | 44, em 5 facções | array `CHARACTERS` de `characters.js` | -| Mapas no registro | 12 | objeto `MAPS` de `maps.js` | +| Mapas no registro | 13 | objeto `MAPS` de `maps.js` | | Arnêses visuais em HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Scripts do arnês | 200 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Scripts do arnês | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | | Versão | `2.0.0-alpha.177` | `public/js/version.js` e `package.json` (batem) | @@ -66,7 +66,7 @@ E as regras de partida que mais mudam de lugar, todas lidas das constantes de | Regra | Valor | Constante | |---|---|---| | Facções · personagens | 5 · 44 (B 9 · C 9 · E 8 · F 9 · U 9) | `CHARACTERS` | -| Mapas no menu | 12 — 2 abrem em rodadas, **10 em captura** | `MAPS` / `ctfMode` | +| Mapas no menu | 13 — 3 abrem em rodadas, **10 em captura** | `MAPS` / `ctfMode` | | Respawn | 2,2 s | `RESPAWN_DELAY` | | Round | 99 s, 3 vitórias | `ROUND_TIME` / `ROUNDS_TO_WIN` | | Captura | alvo = **todas as bandeiras do mapa**, 2 rodadas (rede de segurança 480 s) | `capsToWin = ctfPts.length` / `CTF_ROUNDS_TO_WIN` | @@ -233,8 +233,9 @@ Os mapas registrados hoje, e em que modo cada um abre: | `parque_treta` | Parque da Treta | **captura** | `map_parque.js` | 402 | | `velho_oeste` | Velho Oeste da Treta | **captura** | `map_velho_oeste.js` | 433 | | `penitenciaria` | Penitenciária da Treta | **captura** | `map_penitenciaria.js` | 247 | +| `treta_no_gelo` | Treta no Gelo | rodadas | `map_gelo.js` | 250 | -**12 mapas registrados** — 2 abrem em rodadas e 10 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 14 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. +**13 mapas registrados** — 3 abrem em rodadas e 10 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 15 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `objeto MAPS de public/js/maps.js` diff --git a/docs/docs/quality-gates.md b/docs/docs/quality-gates.md index e1fad825a..c0f22a897 100644 --- a/docs/docs/quality-gates.md +++ b/docs/docs/quality-gates.md @@ -15,7 +15,7 @@ PR (`.github/workflows/ci.yml`). {/* BEGIN:GERADO:invariantes — não edite à mão, rode `npm run docs` */} - `tools/eval/invariants.mjs`: **2.275 linhas**, **65 identificadores de invariante declarados** (`put()`), dos quais **28** têm caminho de `skip()` declarado. -- O arnês inteiro são **200 scripts** em `tools/eval/` (`.mjs` + `.py`), mais **54 scripts** de pipeline em `tools/`. +- O arnês inteiro são **201 scripts** em `tools/eval/` (`.mjs` + `.py`), mais **54 scripts** de pipeline em `tools/`. - Quantas invariantes rodam como **críticas** numa execução **não é derivável do fonte**: depende de qual insumo existe na máquina (o JSON do auditor de viewmodel, um GLB, uma pasta de anims). Esse número só sai rodando o quality gate — e o lugar dele é o cabeçalho do `KNOWN-BUGS.md`, atualizado com saída real. Reproduza: diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md index ad72a3a1d..25c4ae7e8 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md @@ -17,7 +17,7 @@ The number below is not rhetoric, and it is not hand-written: it comes from `git {/* BEGIN:GERADO:pessoas — não edite à mão, rode `npm run docs` */} -**11 human author identities** sign commits in this branch: `ruben-cytonic`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`. Automated identities are excluded. A Git author name is not necessarily one unique person. +**12 human author identities** sign commits in this branch: `ruben-cytonic`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`, `usantos`. Automated identities are excluded. A Git author name is not necessarily one unique person. > Block generated by `node tools/gen-docs.mjs`. Source: `git shortlog -sn --no-merges (descontando autores que são agentes)` @@ -263,8 +263,9 @@ The registry, generated from the `MAPS` of `public/js/maps.js`: | `parque_treta` | Parque da Treta | **capture** | `map_parque.js` | 402 | | `velho_oeste` | Velho Oeste da Treta | **capture** | `map_velho_oeste.js` | 433 | | `penitenciaria` | Penitenciária da Treta | **capture** | `map_penitenciaria.js` | 247 | +| `treta_no_gelo` | Treta no Gelo | rounds | `map_gelo.js` | 250 | -**12 registered maps** - 2 open in rounds and 10 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 14 `map_*.js` files on disk, so a file alone does **not** make a map playable. +**13 registered maps** - 3 open in rounds and 10 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 15 `map_*.js` files on disk, so a file alone does **not** make a map playable. > Block generated by `node tools/gen-docs.mjs`. Source: `objeto MAPS de public/js/maps.js` diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md index 888a3d9ae..e0c99ec5e 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md @@ -41,17 +41,17 @@ this page was aging at the very first commit — see | What | How much | Where to check | |---|---:|---| -| Game code | 32,001 lines in 44 files | `git ls-files public/js/*.js \| xargs wc -l` | -| `game.js` | **6,910** lines | `wc -l public/js/game.js` | -| `main.js` | 2,698 lines | `wc -l public/js/main.js` | +| Game code | 32,271 lines in 45 files | `git ls-files public/js/*.js \| xargs wc -l` | +| `game.js` | **6,917** lines | `wc -l public/js/game.js` | +| `main.js` | 2,702 lines | `wc -l public/js/main.js` | | Weapons with GLB | 26 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | | Character GLBs | 45 | `git ls-files 'public/models/characters/*.glb' \| wc -l` | | Props in GLB | 108 | `git ls-files 'public/models/props/*.glb' \| wc -l` | | Versioned animation clips | 573 | `git ls-files public/models/anims \| wc -l` | | Playable characters | 44, in 5 factions | `CHARACTERS` array in `characters.js` | -| Maps in the registry | 12 | `MAPS` object in `maps.js` | +| Maps in the registry | 13 | `MAPS` object in `maps.js` | | Visual harnesses in HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Harness scripts | 200 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Harness scripts | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Pipeline scripts | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Written entry tasks | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | | Version | `2.0.0-alpha.177` | `public/js/version.js` and `package.json` (match) | @@ -68,7 +68,7 @@ And the match rules that move around the most, all read from the constants in | Rule | Value | Constant | |---|---|---| | Factions · characters | 5 · 44 (B 9 · C 9 · E 8 · F 9 · U 9) | `CHARACTERS` | -| Maps in the menu | 12 - 2 open in rounds, **10 in capture** | `MAPS` / `ctfMode` | +| Maps in the menu | 13 - 3 open in rounds, **10 in capture** | `MAPS` / `ctfMode` | | Respawn | 2.2 s | `RESPAWN_DELAY` | | Round | 99 s, 3 wins | `ROUND_TIME` / `ROUNDS_TO_WIN` | | Capture | target = **all flags on the map**, 2 rounds (480 s safety net) | `capsToWin = ctfPts.length` / `CTF_ROUNDS_TO_WIN` | @@ -235,8 +235,9 @@ The maps registered today, and which mode each one opens in: | `parque_treta` | Parque da Treta | **capture** | `map_parque.js` | 402 | | `velho_oeste` | Velho Oeste da Treta | **capture** | `map_velho_oeste.js` | 433 | | `penitenciaria` | Penitenciária da Treta | **capture** | `map_penitenciaria.js` | 247 | +| `treta_no_gelo` | Treta no Gelo | rounds | `map_gelo.js` | 250 | -**12 registered maps** - 2 open in rounds and 10 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 14 `map_*.js` files on disk, so a file alone does **not** make a map playable. +**13 registered maps** - 3 open in rounds and 10 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 15 `map_*.js` files on disk, so a file alone does **not** make a map playable. > Block generated by `node tools/gen-docs.mjs`. Source: `objeto MAPS de public/js/maps.js` diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md index 53b1f97a3..ef263f297 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md @@ -18,7 +18,7 @@ PR (`.github/workflows/ci.yml`). {/* BEGIN:GERADO:invariantes — não edite à mão, rode `npm run docs` */} - `tools/eval/invariants.mjs`: **2,275 lines**, **65 declared invariant identifiers**, with **28** declared `skip()` paths. -- The harness contains **200 scripts** in `tools/eval/`, plus **54 pipeline scripts** in `tools/`. +- The harness contains **201 scripts** in `tools/eval/`, plus **54 pipeline scripts** in `tools/`. - The number of critical checks in one run depends on the inputs present on that machine; dated results belong in `KNOWN-BUGS.md`. ```bash From a38ea9bc97e4a5049256b6f4719df86a55364450 Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 05:50:15 +0000 Subject: [PATCH 08/21] =?UTF-8?q?Merge=20da=20base=20(conflito=20s=C3=B3?= =?UTF-8?q?=20em=20arquivo=20gerado,=20resolvido=20pelo=20autofix)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agent: csbrasil-bot (autofix) Signed-off-by: csbrasil-bot --- tools/eval/autofix-check.mjs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tools/eval/autofix-check.mjs b/tools/eval/autofix-check.mjs index ec57c4434..c60da58a7 100644 --- a/tools/eval/autofix-check.mjs +++ b/tools/eval/autofix-check.mjs @@ -17,6 +17,10 @@ workflow pode chamar `gh pr merge`. O `csbrasil-bot-automerge` chamava, e era a única coisa que um bot daqui fazia sozinho — justamente a que não devia. Ele agora aplica `pronto-pra-merge` e o botão continua humano. + AF7 · todo commit que o bot faz carrega os trailers que o CI cobra de humano: + `Agent:` (agente_check) e `Signed-off-by:` (dco_check). Sem eles o bot conserta + o PR e reprova o mesmo PR no passo seguinte - foi o que aconteceu no primeiro + disparo real, em 22/08. AF6 · o autofix acorda quando a MAIN anda, não só quando o PR se mexe. Foram 9 releases em 20 horas e cada um reabre conflito em todo PR aberto; sem o gatilho de push o bot só conserta quem empurra commit — ou seja, nunca @@ -40,6 +44,7 @@ const MUTANTES = { 'automerge-volta': 'AF4', 'resolve-conflito-de-codigo': 'AF5', 'sem-varredura-pos-release': 'AF6', + 'commit-sem-trailer': 'AF7', }; if (MUT && !MUTANTES[MUT]) { console.error(`mutante desconhecido: ${MUT}`); process.exit(2); } @@ -109,6 +114,14 @@ if (resolveConflito) { } } +/* ---- AF7: os commits do bot levam os trailers que o CI cobra ---- */ +if (MUT === 'commit-sem-trailer') wf = wf.replace(/\n\s*-m "Agent: csbrasil-bot \(autofix\)" \\/g, ''); +const commits = [...wf.matchAll(/git commit[\s\S]{0,600}?(?=\n\s{0,10}[a-z-]+:|\n\s*$)/g)].map((m) => m[0]); +for (const c of commits) { + if (!/Agent:/.test(c)) falhas.push('AF7 um `git commit` do bot não leva o trailer `Agent:` — o agente_check reprova o PR que ele acabou de consertar'); + if (!/Signed-off-by:/.test(c)) falhas.push('AF7 um `git commit` do bot não leva `Signed-off-by:` — o dco reprova o PR que ele acabou de consertar'); +} + /* ---- AF6: a varredura pós-release existe e enxerga quem ficou para trás ---- */ if (MUT === 'sem-varredura-pos-release') wf = wf.replace(/\n push:\n branches: \[main\]/, ''); const temPush = /^\s{2}push:\n\s{4}branches: \[main\]/m.test(wf); From 6555a20240a5e1869f6ca4aac10e5528d55fbd1c Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 05:51:17 +0000 Subject: [PATCH 09/21] =?UTF-8?q?Merge=20da=20base=20(conflito=20s=C3=B3?= =?UTF-8?q?=20em=20arquivo=20gerado,=20resolvido=20pelo=20autofix)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agent: csbrasil-bot (autofix) Signed-off-by: csbrasil-bot --- package-lock.json | 4 ++-- package.json | 2 +- tools/eval/ARCH.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3d6977d77..30c2652b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "coro-solto", - "version": "2.0.0-alpha.177", + "version": "2.0.0-alpha.178", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "coro-solto", - "version": "2.0.0-alpha.177", + "version": "2.0.0-alpha.178", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/vercel": "^11.0.6", diff --git a/package.json b/package.json index c574a47b5..efd435237 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "coro-solto", - "version": "2.0.0-alpha.177", + "version": "2.0.0-alpha.178", "license": "AGPL-3.0-only", "description": "CORO SOLTO: Treta Suprema (ex-CS BRASIL) — FPS satírico de navegador com 5 facções brasileiras (site Astro + jogo vanilla em Three.js), gerado em par com agentes de IA (AI generated & AI friendly)", "scripts": { diff --git a/tools/eval/ARCH.md b/tools/eval/ARCH.md index cb96bc69f..d1020873f 100644 --- a/tools/eval/ARCH.md +++ b/tools/eval/ARCH.md @@ -3,7 +3,7 @@ > Gerado por `node tools/gen-arch.mjs`. **Não edite este bloco à mão.** -> Versão do jogo: 2.0.0-alpha.177 · `npm run arch` para regenerar · `npm run arch:check` no CI. +> Versão do jogo: 2.0.0-alpha.178 · `npm run arch` para regenerar · `npm run arch:check` no CI. ## Tamanho dos arquivos indexados From 6b420ef5915cc85a0d0a95bb2fd1bed607c9628a Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 05:51:17 +0000 Subject: [PATCH 10/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Agent: csbrasil-bot (autofix) Signed-off-by: csbrasil-bot --- README.md | 2 +- docs/docs/comecando.md | 2 +- .../i18n/en/docusaurus-plugin-content-docs/current/comecando.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3f3369b8c..1dedac73e 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ contra bots, direto na aba. Sem download, sem instalação, sem cadastro. | Scripts do arnês | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | -| Versão | `2.0.0-alpha.177` | `public/js/version.js` e `package.json` (batem) | +| Versão | `2.0.0-alpha.177` | `public/js/version.js` — **DIVERGE do `package.json`: `2.0.0-alpha.178`** | > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `o comando da coluna direita de cada linha` diff --git a/docs/docs/comecando.md b/docs/docs/comecando.md index 57f08fb35..3b5e594d1 100644 --- a/docs/docs/comecando.md +++ b/docs/docs/comecando.md @@ -52,7 +52,7 @@ esta página envelhecia no primeiro commit — ver | Scripts do arnês | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | -| Versão | `2.0.0-alpha.177` | `public/js/version.js` e `package.json` (batem) | +| Versão | `2.0.0-alpha.177` | `public/js/version.js` — **DIVERGE do `package.json`: `2.0.0-alpha.178`** | > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `o comando da coluna direita de cada linha` diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md index e0c99ec5e..104014a30 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md @@ -54,7 +54,7 @@ this page was aging at the very first commit — see | Harness scripts | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Pipeline scripts | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Written entry tasks | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | -| Version | `2.0.0-alpha.177` | `public/js/version.js` and `package.json` (match) | +| Version | `2.0.0-alpha.177` | `public/js/version.js` and `package.json` **DIVERGE** | > Block generated by `node tools/gen-docs.mjs`. Source: `the command in the right column of each row` From 9e5100d37f6eb53e9d5462171bec253c3bf1903f Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 05:51:47 +0000 Subject: [PATCH 11/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Agent: csbrasil-bot (autofix) Signed-off-by: csbrasil-bot --- README.md | 17 +++++++++-------- STATUS.md | 6 +++--- docs/docs/comecando.md | 15 ++++++++------- .../current/comecando.md | 15 ++++++++------- 4 files changed, 28 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index f24151e75..e47c29284 100644 --- a/README.md +++ b/README.md @@ -34,17 +34,17 @@ contra bots, direto na aba. Sem download, sem instalação, sem cadastro. | O que | Quanto | Onde confere | |---|---:|---| -| Código do jogo | 32.001 linhas em 44 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | -| `game.js` | **6.910** linhas | `wc -l public/js/game.js` | -| `main.js` | 2.698 linhas | `wc -l public/js/main.js` | +| Código do jogo | 32.271 linhas em 45 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | +| `game.js` | **6.917** linhas | `wc -l public/js/game.js` | +| `main.js` | 2.702 linhas | `wc -l public/js/main.js` | | Armas com GLB | 26 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | | GLBs de personagem | 45 | `git ls-files 'public/models/characters/*.glb' \| wc -l` | | Props em GLB | 108 | `git ls-files 'public/models/props/*.glb' \| wc -l` | | Clipes de animação versionados | 573 | `git ls-files public/models/anims \| wc -l` | | Personagens jogáveis | 44, em 5 facções | array `CHARACTERS` de `characters.js` | -| Mapas no registro | 12 | objeto `MAPS` de `maps.js` | +| Mapas no registro | 13 | objeto `MAPS` de `maps.js` | | Arnêses visuais em HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Scripts do arnês | 200 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Scripts do arnês | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | | Versão | `2.0.0-alpha.178` | `public/js/version.js` e `package.json` (batem) | @@ -89,7 +89,7 @@ arquitetura): `cd docs && npm install && npm start` → Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `objeto MAPS de public/js/maps.js` diff --git a/STATUS.md b/STATUS.md index d811ae59d..32159b999 100644 --- a/STATUS.md +++ b/STATUS.md @@ -3,9 +3,9 @@ - **Versão:** `2.0.0-alpha.178` -- **Conteúdo jogável:** 5 facções, 44 personagens, 12 mapas e 26 armas com GLB -- **Código do jogo:** 32.001 linhas em 44 módulos JavaScript -- **Automação:** 124 comandos npm, 200 scripts de avaliação e 54 scripts de pipeline +- **Conteúdo jogável:** 5 facções, 44 personagens, 13 mapas e 26 armas com GLB +- **Código do jogo:** 32.271 linhas em 45 módulos JavaScript +- **Automação:** 124 comandos npm, 201 scripts de avaliação e 54 scripts de pipeline > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `package.json · CHARACTERS · MAPS · public/models/weapons · public/js · tools/` diff --git a/docs/docs/comecando.md b/docs/docs/comecando.md index 60a11d299..6cfb89808 100644 --- a/docs/docs/comecando.md +++ b/docs/docs/comecando.md @@ -39,17 +39,17 @@ esta página envelhecia no primeiro commit — ver | O que | Quanto | Onde confere | |---|---:|---| -| Código do jogo | 32.001 linhas em 44 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | -| `game.js` | **6.910** linhas | `wc -l public/js/game.js` | -| `main.js` | 2.698 linhas | `wc -l public/js/main.js` | +| Código do jogo | 32.271 linhas em 45 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | +| `game.js` | **6.917** linhas | `wc -l public/js/game.js` | +| `main.js` | 2.702 linhas | `wc -l public/js/main.js` | | Armas com GLB | 26 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | | GLBs de personagem | 45 | `git ls-files 'public/models/characters/*.glb' \| wc -l` | | Props em GLB | 108 | `git ls-files 'public/models/props/*.glb' \| wc -l` | | Clipes de animação versionados | 573 | `git ls-files public/models/anims \| wc -l` | | Personagens jogáveis | 44, em 5 facções | array `CHARACTERS` de `characters.js` | -| Mapas no registro | 12 | objeto `MAPS` de `maps.js` | +| Mapas no registro | 13 | objeto `MAPS` de `maps.js` | | Arnêses visuais em HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Scripts do arnês | 200 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Scripts do arnês | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | | Versão | `2.0.0-alpha.178` | `public/js/version.js` e `package.json` (batem) | @@ -66,7 +66,7 @@ E as regras de partida que mais mudam de lugar, todas lidas das constantes de | Regra | Valor | Constante | |---|---|---| | Facções · personagens | 5 · 44 (B 9 · C 9 · E 8 · F 9 · U 9) | `CHARACTERS` | -| Mapas no menu | 12 — 2 abrem em rodadas, **10 em captura** | `MAPS` / `ctfMode` | +| Mapas no menu | 13 — 3 abrem em rodadas, **10 em captura** | `MAPS` / `ctfMode` | | Respawn | 2,2 s | `RESPAWN_DELAY` | | Round | 99 s, 3 vitórias | `ROUND_TIME` / `ROUNDS_TO_WIN` | | Captura | alvo = **todas as bandeiras do mapa**, 2 rodadas (rede de segurança 480 s) | `capsToWin = ctfPts.length` / `CTF_ROUNDS_TO_WIN` | @@ -233,8 +233,9 @@ Os mapas registrados hoje, e em que modo cada um abre: | `parque_treta` | Parque da Treta | **captura** | `map_parque.js` | 402 | | `velho_oeste` | Velho Oeste da Treta | **captura** | `map_velho_oeste.js` | 433 | | `penitenciaria` | Penitenciária da Treta | **captura** | `map_penitenciaria.js` | 247 | +| `treta_no_gelo` | Treta no Gelo | rodadas | `map_gelo.js` | 250 | -**12 mapas registrados** — 2 abrem em rodadas e 10 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 14 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. +**13 mapas registrados** — 3 abrem em rodadas e 10 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 15 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `objeto MAPS de public/js/maps.js` diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md index 18eac13ad..2e7c2e998 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md @@ -41,17 +41,17 @@ this page was aging at the very first commit — see | What | How much | Where to check | |---|---:|---| -| Game code | 32,001 lines in 44 files | `git ls-files public/js/*.js \| xargs wc -l` | -| `game.js` | **6,910** lines | `wc -l public/js/game.js` | -| `main.js` | 2,698 lines | `wc -l public/js/main.js` | +| Game code | 32,271 lines in 45 files | `git ls-files public/js/*.js \| xargs wc -l` | +| `game.js` | **6,917** lines | `wc -l public/js/game.js` | +| `main.js` | 2,702 lines | `wc -l public/js/main.js` | | Weapons with GLB | 26 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | | Character GLBs | 45 | `git ls-files 'public/models/characters/*.glb' \| wc -l` | | Props in GLB | 108 | `git ls-files 'public/models/props/*.glb' \| wc -l` | | Versioned animation clips | 573 | `git ls-files public/models/anims \| wc -l` | | Playable characters | 44, in 5 factions | `CHARACTERS` array in `characters.js` | -| Maps in the registry | 12 | `MAPS` object in `maps.js` | +| Maps in the registry | 13 | `MAPS` object in `maps.js` | | Visual harnesses in HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Harness scripts | 200 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Harness scripts | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Pipeline scripts | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Written entry tasks | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | | Version | `2.0.0-alpha.178` | `public/js/version.js` and `package.json` (match) | @@ -68,7 +68,7 @@ And the match rules that move around the most, all read from the constants in | Rule | Value | Constant | |---|---|---| | Factions · characters | 5 · 44 (B 9 · C 9 · E 8 · F 9 · U 9) | `CHARACTERS` | -| Maps in the menu | 12 - 2 open in rounds, **10 in capture** | `MAPS` / `ctfMode` | +| Maps in the menu | 13 - 3 open in rounds, **10 in capture** | `MAPS` / `ctfMode` | | Respawn | 2.2 s | `RESPAWN_DELAY` | | Round | 99 s, 3 wins | `ROUND_TIME` / `ROUNDS_TO_WIN` | | Capture | target = **all flags on the map**, 2 rounds (480 s safety net) | `capsToWin = ctfPts.length` / `CTF_ROUNDS_TO_WIN` | @@ -235,8 +235,9 @@ The maps registered today, and which mode each one opens in: | `parque_treta` | Parque da Treta | **capture** | `map_parque.js` | 402 | | `velho_oeste` | Velho Oeste da Treta | **capture** | `map_velho_oeste.js` | 433 | | `penitenciaria` | Penitenciária da Treta | **capture** | `map_penitenciaria.js` | 247 | +| `treta_no_gelo` | Treta no Gelo | rounds | `map_gelo.js` | 250 | -**12 registered maps** - 2 open in rounds and 10 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 14 `map_*.js` files on disk, so a file alone does **not** make a map playable. +**13 registered maps** - 3 open in rounds and 10 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 15 `map_*.js` files on disk, so a file alone does **not** make a map playable. > Block generated by `node tools/gen-docs.mjs`. Source: `objeto MAPS de public/js/maps.js` From a4ecec141a7e6a23070c094d024230d05e048f7c Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 07:12:03 +0000 Subject: [PATCH 12/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Signed-off-by: csbrasil-bot --- STATUS.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/STATUS.md b/STATUS.md index 93c643885..6d0671819 100644 --- a/STATUS.md +++ b/STATUS.md @@ -3,9 +3,9 @@ - **Versão:** `2.0.0-alpha.179` -- **Conteúdo jogável:** 5 facções, 44 personagens, 12 mapas e 26 armas com GLB -- **Código do jogo:** 32.001 linhas em 44 módulos JavaScript -- **Automação:** 124 comandos npm, 200 scripts de avaliação e 54 scripts de pipeline +- **Conteúdo jogável:** 5 facções, 44 personagens, 13 mapas e 26 armas com GLB +- **Código do jogo:** 32.271 linhas em 45 módulos JavaScript +- **Automação:** 124 comandos npm, 201 scripts de avaliação e 54 scripts de pipeline > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `package.json · CHARACTERS · MAPS · public/models/weapons · public/js · tools/` From 072bce2f9aeb5b82d9878999f34a52283b8fc49a Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 20:58:18 +0000 Subject: [PATCH 13/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Signed-off-by: csbrasil-bot --- STATUS.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/STATUS.md b/STATUS.md index f4837dea7..576487bd4 100644 --- a/STATUS.md +++ b/STATUS.md @@ -3,9 +3,9 @@ - **Versão:** `2.0.0-alpha.180` -- **Conteúdo jogável:** 5 facções, 44 personagens, 12 mapas e 26 armas com GLB -- **Código do jogo:** 32.001 linhas em 44 módulos JavaScript -- **Automação:** 124 comandos npm, 200 scripts de avaliação e 54 scripts de pipeline +- **Conteúdo jogável:** 5 facções, 44 personagens, 13 mapas e 26 armas com GLB +- **Código do jogo:** 32.271 linhas em 45 módulos JavaScript +- **Automação:** 124 comandos npm, 201 scripts de avaliação e 54 scripts de pipeline > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `package.json · CHARACTERS · MAPS · public/models/weapons · public/js · tools/` From 86c7b171f267db099c722890047235033b5aac32 Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 21:13:49 +0000 Subject: [PATCH 14/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Signed-off-by: csbrasil-bot --- ARCH.generated.md | 4 ++-- README.md | 17 +++++++++-------- STATUS.md | 6 +++--- docs/docs/comecando.md | 15 ++++++++------- docs/docs/quality-gates.md | 2 +- .../current/comecando.md | 15 ++++++++------- .../current/quality-gates.md | 2 +- 7 files changed, 32 insertions(+), 29 deletions(-) diff --git a/ARCH.generated.md b/ARCH.generated.md index 725b84f0c..c1441775e 100644 --- a/ARCH.generated.md +++ b/ARCH.generated.md @@ -8,9 +8,9 @@ Números atuais das zonas, do quality gate e do `package.json`: | Zona | O que é | Tamanho medido | Regra | |---|---|---|---| -| `public/` | o **jogo** | 44 arquivos `.js`, 32.001 linhas · Three.js `r160` vendorizado | ES modules servidos crus, **zero build**, sem dependência de runtime | +| `public/` | o **jogo** | 45 arquivos `.js`, 32.271 linhas · Three.js `r160` vendorizado | ES modules servidos crus, **zero build**, sem dependência de runtime | | `src/` | o **site** | 18 páginas `.astro`, 21 rotas `/api` · Astro `^7.1.1` | framework é bem-vindo; `service_role` só no servidor | -| `tools/` | o **arnês** | 201 scripts em `tools/eval/`, 55 em `tools/` | node puro: sobe o jogo real sem browser | +| `tools/` | o **arnês** | 202 scripts em `tools/eval/`, 55 em `tools/` | node puro: sobe o jogo real sem browser | **Não existe `public/index.html`.** O HTML do jogo é `src/pages/index.astro`, servido na rota `/`. Servir `public/` estaticamente entrega os arnêses visuais, **não o jogo** — é a pegadinha que custa a primeira hora de todo mundo. diff --git a/README.md b/README.md index 182647bda..441d29a90 100644 --- a/README.md +++ b/README.md @@ -34,17 +34,17 @@ contra bots, direto na aba. Sem download, sem instalação, sem cadastro. | O que | Quanto | Onde confere | |---|---:|---| -| Código do jogo | 32.001 linhas em 44 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | -| `game.js` | **6.910** linhas | `wc -l public/js/game.js` | -| `main.js` | 2.698 linhas | `wc -l public/js/main.js` | +| Código do jogo | 32.271 linhas em 45 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | +| `game.js` | **6.917** linhas | `wc -l public/js/game.js` | +| `main.js` | 2.702 linhas | `wc -l public/js/main.js` | | Armas com GLB | 26 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | | GLBs de personagem | 45 | `git ls-files 'public/models/characters/*.glb' \| wc -l` | | Props em GLB | 108 | `git ls-files 'public/models/props/*.glb' \| wc -l` | | Clipes de animação versionados | 573 | `git ls-files public/models/anims \| wc -l` | | Personagens jogáveis | 44, em 5 facções | array `CHARACTERS` de `characters.js` | -| Mapas no registro | 12 | objeto `MAPS` de `maps.js` | +| Mapas no registro | 13 | objeto `MAPS` de `maps.js` | | Arnêses visuais em HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Scripts do arnês | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Scripts do arnês | 202 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 55 | `git ls-files 'tools/*.mjs' \| wc -l` | | Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | | Versão | `2.0.0-alpha.180` | `public/js/version.js` e `package.json` (batem) | @@ -89,7 +89,7 @@ arquitetura): `cd docs && npm install && npm start` → Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `objeto MAPS de public/js/maps.js` diff --git a/STATUS.md b/STATUS.md index 1678591de..afc551241 100644 --- a/STATUS.md +++ b/STATUS.md @@ -3,9 +3,9 @@ - **Versão:** `2.0.0-alpha.180` -- **Conteúdo jogável:** 5 facções, 44 personagens, 12 mapas e 26 armas com GLB -- **Código do jogo:** 32.001 linhas em 44 módulos JavaScript -- **Automação:** 124 comandos npm, 201 scripts de avaliação e 55 scripts de pipeline +- **Conteúdo jogável:** 5 facções, 44 personagens, 13 mapas e 26 armas com GLB +- **Código do jogo:** 32.271 linhas em 45 módulos JavaScript +- **Automação:** 124 comandos npm, 202 scripts de avaliação e 55 scripts de pipeline > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `package.json · CHARACTERS · MAPS · public/models/weapons · public/js · tools/` diff --git a/docs/docs/comecando.md b/docs/docs/comecando.md index 476fa7596..da11983e2 100644 --- a/docs/docs/comecando.md +++ b/docs/docs/comecando.md @@ -39,17 +39,17 @@ esta página envelhecia no primeiro commit — ver | O que | Quanto | Onde confere | |---|---:|---| -| Código do jogo | 32.001 linhas em 44 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | -| `game.js` | **6.910** linhas | `wc -l public/js/game.js` | -| `main.js` | 2.698 linhas | `wc -l public/js/main.js` | +| Código do jogo | 32.271 linhas em 45 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | +| `game.js` | **6.917** linhas | `wc -l public/js/game.js` | +| `main.js` | 2.702 linhas | `wc -l public/js/main.js` | | Armas com GLB | 26 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | | GLBs de personagem | 45 | `git ls-files 'public/models/characters/*.glb' \| wc -l` | | Props em GLB | 108 | `git ls-files 'public/models/props/*.glb' \| wc -l` | | Clipes de animação versionados | 573 | `git ls-files public/models/anims \| wc -l` | | Personagens jogáveis | 44, em 5 facções | array `CHARACTERS` de `characters.js` | -| Mapas no registro | 12 | objeto `MAPS` de `maps.js` | +| Mapas no registro | 13 | objeto `MAPS` de `maps.js` | | Arnêses visuais em HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Scripts do arnês | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Scripts do arnês | 202 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 55 | `git ls-files 'tools/*.mjs' \| wc -l` | | Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | | Versão | `2.0.0-alpha.180` | `public/js/version.js` e `package.json` (batem) | @@ -66,7 +66,7 @@ E as regras de partida que mais mudam de lugar, todas lidas das constantes de | Regra | Valor | Constante | |---|---|---| | Facções · personagens | 5 · 44 (B 9 · C 9 · E 8 · F 9 · U 9) | `CHARACTERS` | -| Mapas no menu | 12 — 2 abrem em rodadas, **10 em captura** | `MAPS` / `ctfMode` | +| Mapas no menu | 13 — 3 abrem em rodadas, **10 em captura** | `MAPS` / `ctfMode` | | Respawn | 2,2 s | `RESPAWN_DELAY` | | Round | 99 s, 3 vitórias | `ROUND_TIME` / `ROUNDS_TO_WIN` | | Captura | alvo = **todas as bandeiras do mapa**, 2 rodadas (rede de segurança 480 s) | `capsToWin = ctfPts.length` / `CTF_ROUNDS_TO_WIN` | @@ -233,8 +233,9 @@ Os mapas registrados hoje, e em que modo cada um abre: | `parque_treta` | Parque da Treta | **captura** | `map_parque.js` | 402 | | `velho_oeste` | Velho Oeste da Treta | **captura** | `map_velho_oeste.js` | 433 | | `penitenciaria` | Penitenciária da Treta | **captura** | `map_penitenciaria.js` | 247 | +| `treta_no_gelo` | Treta no Gelo | rodadas | `map_gelo.js` | 250 | -**12 mapas registrados** — 2 abrem em rodadas e 10 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 14 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. +**13 mapas registrados** — 3 abrem em rodadas e 10 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 15 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `objeto MAPS de public/js/maps.js` diff --git a/docs/docs/quality-gates.md b/docs/docs/quality-gates.md index d802c0845..e76544e9d 100644 --- a/docs/docs/quality-gates.md +++ b/docs/docs/quality-gates.md @@ -15,7 +15,7 @@ PR (`.github/workflows/ci.yml`). {/* BEGIN:GERADO:invariantes — não edite à mão, rode `npm run docs` */} - `tools/eval/invariants.mjs`: **2.275 linhas**, **65 identificadores de invariante declarados** (`put()`), dos quais **28** têm caminho de `skip()` declarado. -- O arnês inteiro são **201 scripts** em `tools/eval/` (`.mjs` + `.py`), mais **55 scripts** de pipeline em `tools/`. +- O arnês inteiro são **202 scripts** em `tools/eval/` (`.mjs` + `.py`), mais **55 scripts** de pipeline em `tools/`. - Quantas invariantes rodam como **críticas** numa execução **não é derivável do fonte**: depende de qual insumo existe na máquina (o JSON do auditor de viewmodel, um GLB, uma pasta de anims). Esse número só sai rodando o quality gate — e o lugar dele é o cabeçalho do `KNOWN-BUGS.md`, atualizado com saída real. Reproduza: diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md index 72fb351e4..2b4ed8378 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md @@ -41,17 +41,17 @@ this page was aging at the very first commit — see | What | How much | Where to check | |---|---:|---| -| Game code | 32,001 lines in 44 files | `git ls-files public/js/*.js \| xargs wc -l` | -| `game.js` | **6,910** lines | `wc -l public/js/game.js` | -| `main.js` | 2,698 lines | `wc -l public/js/main.js` | +| Game code | 32,271 lines in 45 files | `git ls-files public/js/*.js \| xargs wc -l` | +| `game.js` | **6,917** lines | `wc -l public/js/game.js` | +| `main.js` | 2,702 lines | `wc -l public/js/main.js` | | Weapons with GLB | 26 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | | Character GLBs | 45 | `git ls-files 'public/models/characters/*.glb' \| wc -l` | | Props in GLB | 108 | `git ls-files 'public/models/props/*.glb' \| wc -l` | | Versioned animation clips | 573 | `git ls-files public/models/anims \| wc -l` | | Playable characters | 44, in 5 factions | `CHARACTERS` array in `characters.js` | -| Maps in the registry | 12 | `MAPS` object in `maps.js` | +| Maps in the registry | 13 | `MAPS` object in `maps.js` | | Visual harnesses in HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Harness scripts | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Harness scripts | 202 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Pipeline scripts | 55 | `git ls-files 'tools/*.mjs' \| wc -l` | | Written entry tasks | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | | Version | `2.0.0-alpha.180` | `public/js/version.js` and `package.json` (match) | @@ -68,7 +68,7 @@ And the match rules that move around the most, all read from the constants in | Rule | Value | Constant | |---|---|---| | Factions · characters | 5 · 44 (B 9 · C 9 · E 8 · F 9 · U 9) | `CHARACTERS` | -| Maps in the menu | 12 - 2 open in rounds, **10 in capture** | `MAPS` / `ctfMode` | +| Maps in the menu | 13 - 3 open in rounds, **10 in capture** | `MAPS` / `ctfMode` | | Respawn | 2.2 s | `RESPAWN_DELAY` | | Round | 99 s, 3 wins | `ROUND_TIME` / `ROUNDS_TO_WIN` | | Capture | target = **all flags on the map**, 2 rounds (480 s safety net) | `capsToWin = ctfPts.length` / `CTF_ROUNDS_TO_WIN` | @@ -235,8 +235,9 @@ The maps registered today, and which mode each one opens in: | `parque_treta` | Parque da Treta | **capture** | `map_parque.js` | 402 | | `velho_oeste` | Velho Oeste da Treta | **capture** | `map_velho_oeste.js` | 433 | | `penitenciaria` | Penitenciária da Treta | **capture** | `map_penitenciaria.js` | 247 | +| `treta_no_gelo` | Treta no Gelo | rounds | `map_gelo.js` | 250 | -**12 registered maps** - 2 open in rounds and 10 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 14 `map_*.js` files on disk, so a file alone does **not** make a map playable. +**13 registered maps** - 3 open in rounds and 10 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 15 `map_*.js` files on disk, so a file alone does **not** make a map playable. > Block generated by `node tools/gen-docs.mjs`. Source: `objeto MAPS de public/js/maps.js` diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md index 2a6ea015a..b56f29e01 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md @@ -18,7 +18,7 @@ PR (`.github/workflows/ci.yml`). {/* BEGIN:GERADO:invariantes — não edite à mão, rode `npm run docs` */} - `tools/eval/invariants.mjs`: **2,275 lines**, **65 declared invariant identifiers**, with **28** declared `skip()` paths. -- The harness contains **201 scripts** in `tools/eval/`, plus **55 pipeline scripts** in `tools/`. +- The harness contains **202 scripts** in `tools/eval/`, plus **55 pipeline scripts** in `tools/`. - The number of critical checks in one run depends on the inputs present on that machine; dated results belong in `KNOWN-BUGS.md`. ```bash From 29832d57a08176868cfb62fbb0932fd036f6c4a5 Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 21:15:15 +0000 Subject: [PATCH 15/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Signed-off-by: csbrasil-bot --- STATUS.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/STATUS.md b/STATUS.md index 290f742d2..8c1ddf7d4 100644 --- a/STATUS.md +++ b/STATUS.md @@ -3,9 +3,9 @@ - **Versão:** `2.0.0-alpha.181` -- **Conteúdo jogável:** 5 facções, 44 personagens, 12 mapas e 26 armas com GLB -- **Código do jogo:** 32.001 linhas em 44 módulos JavaScript -- **Automação:** 124 comandos npm, 201 scripts de avaliação e 55 scripts de pipeline +- **Conteúdo jogável:** 5 facções, 44 personagens, 13 mapas e 26 armas com GLB +- **Código do jogo:** 32.271 linhas em 45 módulos JavaScript +- **Automação:** 124 comandos npm, 202 scripts de avaliação e 55 scripts de pipeline > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `package.json · CHARACTERS · MAPS · public/models/weapons · public/js · tools/` From 3dbbdce3ad7641d04e80f0c8ae52202038ba71a2 Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 21:35:14 +0000 Subject: [PATCH 16/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Signed-off-by: csbrasil-bot --- STATUS.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/STATUS.md b/STATUS.md index c8355808a..1a185d0ac 100644 --- a/STATUS.md +++ b/STATUS.md @@ -3,9 +3,9 @@ - **Versão:** `2.0.0-alpha.182` -- **Conteúdo jogável:** 5 facções, 44 personagens, 12 mapas e 26 armas com GLB -- **Código do jogo:** 32.001 linhas em 44 módulos JavaScript -- **Automação:** 124 comandos npm, 201 scripts de avaliação e 55 scripts de pipeline +- **Conteúdo jogável:** 5 facções, 44 personagens, 13 mapas e 26 armas com GLB +- **Código do jogo:** 32.271 linhas em 45 módulos JavaScript +- **Automação:** 124 comandos npm, 202 scripts de avaliação e 55 scripts de pipeline > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `package.json · CHARACTERS · MAPS · public/models/weapons · public/js · tools/` From 3bdef3021037d5e0c2e8d90ae85d4ff3ec90cf8e Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sun, 23 Aug 2026 22:21:56 +0000 Subject: [PATCH 17/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Signed-off-by: csbrasil-bot --- STATUS.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/STATUS.md b/STATUS.md index c90fa4ff1..9df388848 100644 --- a/STATUS.md +++ b/STATUS.md @@ -3,9 +3,9 @@ - **Versão:** `2.0.0-alpha.183` -- **Conteúdo jogável:** 5 facções, 44 personagens, 12 mapas e 26 armas com GLB -- **Código do jogo:** 32.001 linhas em 44 módulos JavaScript -- **Automação:** 124 comandos npm, 201 scripts de avaliação e 55 scripts de pipeline +- **Conteúdo jogável:** 5 facções, 44 personagens, 13 mapas e 26 armas com GLB +- **Código do jogo:** 32.271 linhas em 45 módulos JavaScript +- **Automação:** 124 comandos npm, 202 scripts de avaliação e 55 scripts de pipeline > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `package.json · CHARACTERS · MAPS · public/models/weapons · public/js · tools/` From 4f7aa39adc665206df7327af57b43cd9cd294ee6 Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Mon, 24 Aug 2026 17:46:52 +0000 Subject: [PATCH 18/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Signed-off-by: csbrasil-bot --- STATUS.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/STATUS.md b/STATUS.md index cdef2610e..a22cf0eb5 100644 --- a/STATUS.md +++ b/STATUS.md @@ -3,9 +3,9 @@ - **Versão:** `2.0.0-alpha.184` -- **Conteúdo jogável:** 5 facções, 44 personagens, 12 mapas e 26 armas com GLB -- **Código do jogo:** 32.001 linhas em 44 módulos JavaScript -- **Automação:** 124 comandos npm, 201 scripts de avaliação e 55 scripts de pipeline +- **Conteúdo jogável:** 5 facções, 44 personagens, 13 mapas e 26 armas com GLB +- **Código do jogo:** 32.271 linhas em 45 módulos JavaScript +- **Automação:** 124 comandos npm, 202 scripts de avaliação e 55 scripts de pipeline > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `package.json · CHARACTERS · MAPS · public/models/weapons · public/js · tools/` From 382eb834575a610381640b73865705c7eb072e24 Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Wed, 26 Aug 2026 03:20:58 +0000 Subject: [PATCH 19/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Agent: csbrasil-bot (autofix) Signed-off-by: csbrasil-bot --- docs/docs/colaborar.md | 5 +++-- .../en/docusaurus-plugin-content-docs/current/colaborar.md | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/docs/colaborar.md b/docs/docs/colaborar.md index e8008507e..10057223a 100644 --- a/docs/docs/colaborar.md +++ b/docs/docs/colaborar.md @@ -14,7 +14,7 @@ O número abaixo não é retórica, e não é escrito à mão: sai de `git short {/* BEGIN:GERADO:pessoas — não edite à mão, rode `npm run docs` */} -**12 identidades de autoria humana** assinam commit no histórico **desta branch**: `ruben-cytonic`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`, `nunreasonable`. O resto dos commits é assinado por agentes de IA. Branch não é repositório: quem contribuiu num ramo que esta branch não contém **não aparece aqui**. +**12 identidades de autoria humana** assinam commit no histórico **desta branch**: `ruben-cytonic`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`, `usantos`. O resto dos commits é assinado por agentes de IA. Branch não é repositório: quem contribuiu num ramo que esta branch não contém **não aparece aqui**. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `git shortlog -sn --no-merges (descontando autores que são agentes)` @@ -260,8 +260,9 @@ O registro, gerado do `MAPS` de `public/js/maps.js`: | `parque_treta` | Parque da Treta | **captura** | `map_parque.js` | 402 | | `velho_oeste` | Velho Oeste da Treta | **captura** | `map_velho_oeste.js` | 433 | | `penitenciaria` | Penitenciária da Treta | **captura** | `map_penitenciaria.js` | 247 | +| `treta_no_gelo` | Treta no Gelo | rodadas | `map_gelo.js` | 250 | -**12 mapas registrados** — 2 abrem em rodadas e 10 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 14 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. +**13 mapas registrados** — 3 abrem em rodadas e 10 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 15 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `objeto MAPS de public/js/maps.js` diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md index e6f135e39..25c4ae7e8 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md @@ -17,7 +17,7 @@ The number below is not rhetoric, and it is not hand-written: it comes from `git {/* BEGIN:GERADO:pessoas — não edite à mão, rode `npm run docs` */} -**12 human author identities** sign commits in this branch: `ruben-cytonic`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`, `nunreasonable`. Automated identities are excluded. A Git author name is not necessarily one unique person. +**12 human author identities** sign commits in this branch: `ruben-cytonic`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`, `usantos`. Automated identities are excluded. A Git author name is not necessarily one unique person. > Block generated by `node tools/gen-docs.mjs`. Source: `git shortlog -sn --no-merges (descontando autores que são agentes)` @@ -263,8 +263,9 @@ The registry, generated from the `MAPS` of `public/js/maps.js`: | `parque_treta` | Parque da Treta | **capture** | `map_parque.js` | 402 | | `velho_oeste` | Velho Oeste da Treta | **capture** | `map_velho_oeste.js` | 433 | | `penitenciaria` | Penitenciária da Treta | **capture** | `map_penitenciaria.js` | 247 | +| `treta_no_gelo` | Treta no Gelo | rounds | `map_gelo.js` | 250 | -**12 registered maps** - 2 open in rounds and 10 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 14 `map_*.js` files on disk, so a file alone does **not** make a map playable. +**13 registered maps** - 3 open in rounds and 10 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 15 `map_*.js` files on disk, so a file alone does **not** make a map playable. > Block generated by `node tools/gen-docs.mjs`. Source: `objeto MAPS de public/js/maps.js` From cf46559ce11153a4a47564949cc17c17339695a7 Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Wed, 26 Aug 2026 03:21:57 +0000 Subject: [PATCH 20/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Agent: csbrasil-bot (autofix) Signed-off-by: csbrasil-bot --- STATUS.md | 6 +++--- docs/docs/colaborar.md | 5 +++-- .../en/docusaurus-plugin-content-docs/current/colaborar.md | 5 +++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/STATUS.md b/STATUS.md index cf5d7b7a5..16d1f372a 100644 --- a/STATUS.md +++ b/STATUS.md @@ -3,9 +3,9 @@ - **Versão:** `2.0.0-alpha.185` -- **Conteúdo jogável:** 5 facções, 44 personagens, 12 mapas e 26 armas com GLB -- **Código do jogo:** 32.001 linhas em 44 módulos JavaScript -- **Automação:** 124 comandos npm, 201 scripts de avaliação e 55 scripts de pipeline +- **Conteúdo jogável:** 5 facções, 44 personagens, 13 mapas e 26 armas com GLB +- **Código do jogo:** 32.271 linhas em 45 módulos JavaScript +- **Automação:** 124 comandos npm, 202 scripts de avaliação e 55 scripts de pipeline > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `package.json · CHARACTERS · MAPS · public/models/weapons · public/js · tools/` diff --git a/docs/docs/colaborar.md b/docs/docs/colaborar.md index 2d5b3e074..10057223a 100644 --- a/docs/docs/colaborar.md +++ b/docs/docs/colaborar.md @@ -14,7 +14,7 @@ O número abaixo não é retórica, e não é escrito à mão: sai de `git short {/* BEGIN:GERADO:pessoas — não edite à mão, rode `npm run docs` */} -**11 identidades de autoria humana** assinam commit no histórico **desta branch**: `ruben-cytonic`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`. O resto dos commits é assinado por agentes de IA. Branch não é repositório: quem contribuiu num ramo que esta branch não contém **não aparece aqui**. +**12 identidades de autoria humana** assinam commit no histórico **desta branch**: `ruben-cytonic`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`, `usantos`. O resto dos commits é assinado por agentes de IA. Branch não é repositório: quem contribuiu num ramo que esta branch não contém **não aparece aqui**. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `git shortlog -sn --no-merges (descontando autores que são agentes)` @@ -260,8 +260,9 @@ O registro, gerado do `MAPS` de `public/js/maps.js`: | `parque_treta` | Parque da Treta | **captura** | `map_parque.js` | 402 | | `velho_oeste` | Velho Oeste da Treta | **captura** | `map_velho_oeste.js` | 433 | | `penitenciaria` | Penitenciária da Treta | **captura** | `map_penitenciaria.js` | 247 | +| `treta_no_gelo` | Treta no Gelo | rodadas | `map_gelo.js` | 250 | -**12 mapas registrados** — 2 abrem em rodadas e 10 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 14 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. +**13 mapas registrados** — 3 abrem em rodadas e 10 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 15 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `objeto MAPS de public/js/maps.js` diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md index ad72a3a1d..25c4ae7e8 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md @@ -17,7 +17,7 @@ The number below is not rhetoric, and it is not hand-written: it comes from `git {/* BEGIN:GERADO:pessoas — não edite à mão, rode `npm run docs` */} -**11 human author identities** sign commits in this branch: `ruben-cytonic`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`. Automated identities are excluded. A Git author name is not necessarily one unique person. +**12 human author identities** sign commits in this branch: `ruben-cytonic`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`, `usantos`. Automated identities are excluded. A Git author name is not necessarily one unique person. > Block generated by `node tools/gen-docs.mjs`. Source: `git shortlog -sn --no-merges (descontando autores que são agentes)` @@ -263,8 +263,9 @@ The registry, generated from the `MAPS` of `public/js/maps.js`: | `parque_treta` | Parque da Treta | **capture** | `map_parque.js` | 402 | | `velho_oeste` | Velho Oeste da Treta | **capture** | `map_velho_oeste.js` | 433 | | `penitenciaria` | Penitenciária da Treta | **capture** | `map_penitenciaria.js` | 247 | +| `treta_no_gelo` | Treta no Gelo | rounds | `map_gelo.js` | 250 | -**12 registered maps** - 2 open in rounds and 10 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 14 `map_*.js` files on disk, so a file alone does **not** make a map playable. +**13 registered maps** - 3 open in rounds and 10 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 15 `map_*.js` files on disk, so a file alone does **not** make a map playable. > Block generated by `node tools/gen-docs.mjs`. Source: `objeto MAPS de public/js/maps.js` From 01e98318bd29945fe7948ac59667044ca28ae21b Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Wed, 26 Aug 2026 03:43:12 +0000 Subject: [PATCH 21/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Agent: csbrasil-bot (autofix) Signed-off-by: csbrasil-bot --- STATUS.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/STATUS.md b/STATUS.md index 02b49e34b..c021663ae 100644 --- a/STATUS.md +++ b/STATUS.md @@ -3,9 +3,9 @@ - **Versão:** `2.0.0-alpha.186` -- **Conteúdo jogável:** 5 facções, 44 personagens, 12 mapas e 26 armas com GLB -- **Código do jogo:** 32.001 linhas em 44 módulos JavaScript -- **Automação:** 124 comandos npm, 201 scripts de avaliação e 55 scripts de pipeline +- **Conteúdo jogável:** 5 facções, 44 personagens, 13 mapas e 26 armas com GLB +- **Código do jogo:** 32.271 linhas em 45 módulos JavaScript +- **Automação:** 124 comandos npm, 202 scripts de avaliação e 55 scripts de pipeline > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `package.json · CHARACTERS · MAPS · public/models/weapons · public/js · tools/`