diff --git a/ARCH.generated.md b/ARCH.generated.md index 78d40edb..6250fcee 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** | 59 arquivos `.js`, 41.159 linhas · Three.js `r160` vendorizado | ES modules servidos crus, **zero build**, sem dependência de runtime | +| `public/` | o **jogo** | 59 arquivos `.js`, 41.619 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** | 300 scripts em `tools/eval/`, 77 em `tools/` | node puro: sobe o jogo real sem browser | +| `tools/` | o **arnês** | 304 scripts em `tools/eval/`, 77 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:ambience-registry 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:charhard eval:charpbr eval:motoca-visual eval:camera-grip eval:pilot-system eval:pilot-grip eval:char-thumbnail eval:asset-integrity eval:gltf-validator eval:props-acervo eval:propsuv1 eval:character-voice eval:audio-pack-character-voice eval:cinematic-ui eval:grafite-editorial eval:map-source eval:map-new eval:campo-contract eval:lajes-rooftop eval:lajes-visual eval:lajes-authored eval:lajes-spatial eval:lajes-gap eval:lajes-circuito eval:lajes-antitrap eval:mansao-water eval:mansao-garden eval:corrego-contract eval:corrego-water eval:look eval:mansao-ocean eval:wind eval:softparticles eval:escala-favela eval:escadao-contract eval:slice-abilities eval:faction-registry eval:mapview eval:devport spec:check skills:check eval:pickuparma eval:mutcega eval:autofix eval:deploygate eval:portaointeiro eval:wfsecret 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:ambience-registry 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:charhard eval:charpbr eval:motoca-visual eval:camera-grip eval:pilot-system eval:pilot-grip eval:char-thumbnail eval:asset-integrity eval:gltf-validator eval:props-acervo eval:propsuv1 eval:character-voice eval:audio-pack-character-voice eval:cinematic-ui eval:grafite-editorial eval:map-source eval:map-new eval:campo-contract eval:lajes-rooftop eval:lajes-visual eval:lajes-authored eval:lajes-spatial eval:lajes-gap eval:lajes-circuito eval:lajes-antitrap eval:lajes-bots eval:mansao-water eval:mansao-garden eval:corrego-contract eval:corrego-water eval:look eval:mansao-ocean eval:wind eval:softparticles eval:escala-favela eval:escadao-contract eval:slice-abilities eval:faction-registry eval:mapview eval:devport spec:check skills:check eval:pickuparma eval:mutcega eval:autofix eval:deploygate eval:portaointeiro eval:wfsecret eval:comentario eval:fixture eval:preload eval:docsautoria eval:replaycam ``` -`package.json` tem **186 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 **188 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/KNOWN-BUGS.md b/KNOWN-BUGS.md index 97800a31..fa7d2da6 100644 --- a/KNOWN-BUGS.md +++ b/KNOWN-BUGS.md @@ -1822,6 +1822,48 @@ animais tambem"*. riggado CC0 (varredura Quaternius + Poly Pizza 19/08, documentada no FONTE.md); o pipeline de animação Mint é humanoid-only. Integração no córrego é da frente B. +### BUG-75 · Bot do lajes não sai de perto do respawn porque atira de 50 m — ABERTO 26/08 + +**Sintoma literal do dono (26/08):** *"os bots ficam so no respawn em cima e nao tentam +circular pelo mapa embaixo tambem"*. + +**O portão estava INTEIRO VERDE quando isso foi dito.** A `LV1` provava rota por baixo, a +`LV6` provava aresta de térreo andável, a `CTF2` contava duas rotas separadas. Nenhuma das +três olha para o bot. + +**Duas causas foram achadas e CONSERTADAS** na rodada de 26/08 (porta da laje tapada por +guarda de patamar; `nearestWaypoint` respondendo em planta num mapa de duas camadas) — ver +`docs/maps/LAJES-BOTS.md` e a régua `eval:lajes-bots` (LB1/LB2, antes 4 arestas bloqueadas e +84,6% de acerto de camada; depois 0 e 100%). + +**O QUE CONTINUA ABERTO, e é o que o dono vê.** Com o combate ligado, o raio de exploração do +bot no lajes é **12,8 m**, contra 23,2 m (escadão), 23,0 m (piscinão) e 38,5 m (ferro velho). +A causa não é o grafo: com o combate suprimido, no MESMO grafo, o raio vai a **44,1 m** e a +escada aparece no rastro. A causa é a soma de duas coisas: + +1. no lajes **100% dos engajamentos acontecem acima de 25 m**, mediana **49,9 m** (escadão + 19,0 m) — as duas lajes de spawn se enxergam por um corredor de ar sobre o miolo; +2. `_updateBot` **não avança rota nenhuma enquanto `b.target` existe** (`game.js`, ramo + `else` do roam). + +O bot não precisa andar para atirar, então não anda: congela onde viu o primeiro inimigo, a +poucos metros do respawn. + +**Conserto precisa de decisão do dono**, porque as duas saídas custam caro fora desta frente: +(a) redesenhar a visada do telhado para quebrar o corredor spawn↔spawn — mexe no visual que +o próprio dono chamou de melhor do jogo; (b) deixar o bot progredir na rota com alvo distante +em mãos — mexe na IA de combate de **todos** os mapas. + +**Tentativa parcial já medida e insuficiente:** massa de cobertura na frente das duas lajes +de spawn levou o engajamento mediano de 48,6 m para 41,9 m e o térreo de 7,3% para 12,8%, +mas o raio CAIU (15,1 → 13,0 m). + +**Sem cláusula de propósito.** `eval:lajes-bots` imprime navegação e partida real lado a lado +em toda execução; a distância entre os dois números é o defeito. Uma cláusula "o bot põe pé +no térreo" foi escrita e **descartada**: medida no estado anterior à rodada ela nascia VERDE +(7,2% das amostras, combate suprimido). Régua que não morde dá por resolvido o que continua +aberto. + ### BUG-58 · Lajes é a régua visual de favela, mas está labiríntico e grande demais — ABERTO 17/08 **Sintoma literal do dono:** *"mapa esta muito labirintico e confuso apesar que os becos @@ -1836,6 +1878,45 @@ circuito (LC1-LC6) já mede conectividade — falta um teto de COMPLEXIDADE (nº área total / decisões por travessia) medido contra o que o dono aprovar na versão simplificada. +**Escala dos barracos — CORRIGIDO EM ARQUIVO 26/08, aguardando olho do dono.** Frase literal +do dono (26/08): *"os barracos estao em escala errada 3-4 barracos onde deviam ser apenas +um, varias estruturas confusas"*. + +Medido antes de mexer (o colisor de casa passou a carregar id, altura, fachada e rumo, que é +o que deixa a régua contar barraco sem adivinhar pela caixa): + +| | antes | depois | +|---|---|---| +| casas de kit no mapa | **127** | **63** | +| fachada mediana | 1,87 m (para 5,15 m de altura — razão **0,36**) | igual | +| casas com fachada < 2,2 m | 125 de 127 | 62 de 63 | +| casas por célula de 6 × 6 m (mediana / máximo) | 4 / **7** | 2 / **4** | +| pé-direito fora da faixa 2,40–2,80 m (BUG-55) | 1 | 0 | + +A causa é a combinação de duas coisas certas isoladamente: as casas do kit são **torres +estreitas** (2,3 m de largura para 6,2 m de altura) e o mapa as escala pela altura da laje +(5,15 m). A fachada sai com 1,87 m, e o laço da fileira enchia a face até acabar — três casas +numa face de 5,8 m. + +Conserto: **uma casa por face de bloco**, descentrada por bloco (fachada sempre no meio +devolve simetria de maquete), e o resto da face vira `wallWithRelief` — o mesmo painel de +alvenaria com viga de coroamento e janela que o mapa já usa nos vãos vetados, então nada de +novo entra no vocabulário visual. No beco, painel de 2,2 m entre uma casa e a próxima: o +passo casa→casa vai de ~2,0 m para ~4,1 m. As alturas do beco passam a fechar em pavimento +inteiro (5,20/5,40 de sobrado, 2,70 de térrea) — 4,20 m não era nem um pé-direito nem dois. + +**Por que não alargar a casa em vez de tirar as vizinhas:** `placeProp` e `PropBatch` escalam +UNIFORME (o `targetLen` é média geométrica com a altura, não estica só a largura), e para a +fachada encher a face o modelo precisaria de 2,24× no horizontal. Escala não uniforme em +malha instanciada é outra frente. O que separa "casa" de "palito" aqui é o contexto: casa +ladeada por alvenaria lê como casa, três lado a lado leem como cerca de torres. + +Régua: **ESC6** em `escala-favela-check.mjs` — no máximo 4 casas por célula de 6 m (o teto é +geométrico: uma célula cabe um bloco, e um bloco tem quatro faces) e pé-direito por pavimento +na MESMA faixa 2,40–2,80 m das outras cláusulas. Vermelha no estado anterior (pior célula 7, +14 células acima do teto), verde depois. Mutante `barracada` repõe as casas enfileiradas e é +mordido (pior célula 10). + **Anti-trap (v2.1, plans/13) — CORRIGIDO EM ARQUIVO 19/08, aguardando olho do dono.** Frase literal do dono (17/08): *"a parte debaixo tem cantos intransponiveis se vc cai de cima voce nao sai nunca mais isso nao pode acontecer"*. O LC1-6 media o térreo contíguo diff --git a/README.md b/README.md index d489e9b4..de170ed4 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ contra bots, direto na aba. Sem download, sem instalação, sem cadastro. | O que | Quanto | Onde confere | |---|---:|---| -| Código do jogo | 41.159 linhas em 59 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | +| Código do jogo | 41.619 linhas em 59 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | | `game.js` | **7.260** linhas | `wc -l public/js/game.js` | | `main.js` | 2.812 linhas | `wc -l public/js/main.js` | | Armas com GLB | 27 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | @@ -44,7 +44,7 @@ contra bots, direto na aba. Sem download, sem instalação, sem cadastro. | Personagens jogáveis | 62, em 10 facções | array `CHARACTERS` de `characters.js` | | Mapas no registro | 17 | objeto `MAPS` de `maps.js` | | Arnêses visuais em HTML | 16 | `git ls-files 'public/*.html' \| wc -l` | -| Scripts do arnês | 300 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Scripts do arnês | 304 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 77 | `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.184` | `public/js/version.js` e `package.json` (batem) | @@ -313,7 +313,7 @@ Os mapas registrados, e em que modo cada um abre: | `quebrada` | Quebrada (Rua do Baile) | **captura** | `map_quebrada.js` | 1.656 | | `escadao` | Escadão (Morro) | **captura** | `map_escadao.js` | 813 | | `campomorro` | Campo do Morro | **captura** | `map_campomorro.js` | 713 | -| `lajes` | Lajes (Comunidade) | **captura** | `map_lajes_authored.js` | 1.263 | +| `lajes` | Lajes (Comunidade) | **captura** | `map_lajes_authored.js` | 1.580 | | `corrego` | Córrego (Favela de SP) | **captura** | `map_corrego.js` | 1.258 | | `mansao` | Mansão do Joá | **captura** | `map_mansao.js` | 955 | | `posto_treta` | Posto da Treta | **captura** | `map_posto.js` | 506 | diff --git a/STATUS.md b/STATUS.md index 8480b985..0fc2daec 100644 --- a/STATUS.md +++ b/STATUS.md @@ -4,8 +4,8 @@ - **Versão:** `2.0.0-alpha.184` - **Conteúdo jogável:** 10 facções, 62 personagens, 17 mapas e 27 armas com GLB -- **Código do jogo:** 41.159 linhas em 59 módulos JavaScript -- **Automação:** 186 comandos npm, 300 scripts de avaliação e 77 scripts de pipeline +- **Código do jogo:** 41.619 linhas em 59 módulos JavaScript +- **Automação:** 188 comandos npm, 304 scripts de avaliação e 77 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 044e6f5d..031bccc0 100644 --- a/docs/docs/arquitetura.md +++ b/docs/docs/arquitetura.md @@ -70,7 +70,7 @@ Tamanho dos arquivos que o `gen-arch.mjs` indexa — bloco gerado, regenerado po | `public/js/weapons.js` | 356 | | `public/js/springs.js` | 260 | -Total de `public/js/`: **41.159 linhas em 59 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/`: **41.619 linhas em 59 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 20d9de6d..a7a59e02 100644 --- a/docs/docs/colaborar.md +++ b/docs/docs/colaborar.md @@ -255,7 +255,7 @@ O registro, gerado do `MAPS` de `public/js/maps.js`: | `quebrada` | Quebrada (Rua do Baile) | **captura** | `map_quebrada.js` | 1.656 | | `escadao` | Escadão (Morro) | **captura** | `map_escadao.js` | 813 | | `campomorro` | Campo do Morro | **captura** | `map_campomorro.js` | 713 | -| `lajes` | Lajes (Comunidade) | **captura** | `map_lajes_authored.js` | 1.263 | +| `lajes` | Lajes (Comunidade) | **captura** | `map_lajes_authored.js` | 1.580 | | `corrego` | Córrego (Favela de SP) | **captura** | `map_corrego.js` | 1.258 | | `mansao` | Mansão do Joá | **captura** | `map_mansao.js` | 955 | | `posto_treta` | Posto da Treta | **captura** | `map_posto.js` | 506 | diff --git a/docs/docs/comecando.md b/docs/docs/comecando.md index 66039d5b..392d9e04 100644 --- a/docs/docs/comecando.md +++ b/docs/docs/comecando.md @@ -39,7 +39,7 @@ esta página envelhecia no primeiro commit — ver | O que | Quanto | Onde confere | |---|---:|---| -| Código do jogo | 41.159 linhas em 59 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | +| Código do jogo | 41.619 linhas em 59 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | | `game.js` | **7.260** linhas | `wc -l public/js/game.js` | | `main.js` | 2.812 linhas | `wc -l public/js/main.js` | | Armas com GLB | 27 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | @@ -49,7 +49,7 @@ esta página envelhecia no primeiro commit — ver | Personagens jogáveis | 62, em 10 facções | array `CHARACTERS` de `characters.js` | | Mapas no registro | 17 | objeto `MAPS` de `maps.js` | | Arnêses visuais em HTML | 16 | `git ls-files 'public/*.html' \| wc -l` | -| Scripts do arnês | 300 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Scripts do arnês | 304 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 77 | `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.184` | `public/js/version.js` e `package.json` (batem) | @@ -228,7 +228,7 @@ Os mapas registrados hoje, e em que modo cada um abre: | `quebrada` | Quebrada (Rua do Baile) | **captura** | `map_quebrada.js` | 1.656 | | `escadao` | Escadão (Morro) | **captura** | `map_escadao.js` | 813 | | `campomorro` | Campo do Morro | **captura** | `map_campomorro.js` | 713 | -| `lajes` | Lajes (Comunidade) | **captura** | `map_lajes_authored.js` | 1.263 | +| `lajes` | Lajes (Comunidade) | **captura** | `map_lajes_authored.js` | 1.580 | | `corrego` | Córrego (Favela de SP) | **captura** | `map_corrego.js` | 1.258 | | `mansao` | Mansão do Joá | **captura** | `map_mansao.js` | 955 | | `posto_treta` | Posto da Treta | **captura** | `map_posto.js` | 506 | @@ -280,10 +280,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:ambience-registry 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:charhard eval:charpbr eval:motoca-visual eval:camera-grip eval:pilot-system eval:pilot-grip eval:char-thumbnail eval:asset-integrity eval:gltf-validator eval:props-acervo eval:propsuv1 eval:character-voice eval:audio-pack-character-voice eval:cinematic-ui eval:grafite-editorial eval:map-source eval:map-new eval:campo-contract eval:lajes-rooftop eval:lajes-visual eval:lajes-authored eval:lajes-spatial eval:lajes-gap eval:lajes-circuito eval:lajes-antitrap eval:mansao-water eval:mansao-garden eval:corrego-contract eval:corrego-water eval:look eval:mansao-ocean eval:wind eval:softparticles eval:escala-favela eval:escadao-contract eval:slice-abilities eval:faction-registry eval:mapview eval:devport spec:check skills:check eval:pickuparma eval:mutcega eval:autofix eval:deploygate eval:portaointeiro eval:wfsecret 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:ambience-registry 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:charhard eval:charpbr eval:motoca-visual eval:camera-grip eval:pilot-system eval:pilot-grip eval:char-thumbnail eval:asset-integrity eval:gltf-validator eval:props-acervo eval:propsuv1 eval:character-voice eval:audio-pack-character-voice eval:cinematic-ui eval:grafite-editorial eval:map-source eval:map-new eval:campo-contract eval:lajes-rooftop eval:lajes-visual eval:lajes-authored eval:lajes-spatial eval:lajes-gap eval:lajes-circuito eval:lajes-antitrap eval:lajes-bots eval:mansao-water eval:mansao-garden eval:corrego-contract eval:corrego-water eval:look eval:mansao-ocean eval:wind eval:softparticles eval:escala-favela eval:escadao-contract eval:slice-abilities eval:faction-registry eval:mapview eval:devport spec:check skills:check eval:pickuparma eval:mutcega eval:autofix eval:deploygate eval:portaointeiro eval:wfsecret eval:comentario eval:fixture eval:preload eval:docsautoria eval:replaycam ``` -`package.json` tem **186 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 **188 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 25f5d1e7..ba60b94c 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.281 linhas**, **65 identificadores de invariante declarados** (`put()`), dos quais **28** têm caminho de `skip()` declarado. -- O arnês inteiro são **300 scripts** em `tools/eval/` (`.mjs` + `.py`), mais **77 scripts** de pipeline em `tools/`. +- O arnês inteiro são **304 scripts** em `tools/eval/` (`.mjs` + `.py`), mais **77 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/docs/stack.md b/docs/docs/stack.md index 2617cc0b..5fa42ae8 100644 --- a/docs/docs/stack.md +++ b/docs/docs/stack.md @@ -127,7 +127,7 @@ hipotético: | **Meshy** | props 3D por texto (alternativa) e rig | `tools/gen-asset.mjs --provider meshy` | `MESHY_API_KEY` | | **OpenRouter** | arte 2D (cartaz de facção, wallpaper, splash) | `tools/gen-image.mjs` | `OPENROUTER_API_KEY` | -`mint-assets.json` registra **65 assets** gerados via Mint (19 `openrouter-image-concept` · 2 `openrouter-concept-tripo-blender-model` · 5 `imagegen-concept` · 30 `mint-model` · 2 `tripo3d-task` · 2 `openrouter-concept-meshy-model` · 5 `mint-asset-pack`), cada um com `assetId`, `chatUrl` e notas do que deu errado na tentativa anterior. +`mint-assets.json` registra **66 assets** gerados via Mint (19 `openrouter-image-concept` · 2 `openrouter-concept-tripo-blender-model` · 5 `imagegen-concept` · 31 `mint-model` · 2 `tripo3d-task` · 2 `openrouter-concept-meshy-model` · 5 `mint-asset-pack`), cada um com `assetId`, `chatUrl` e notas do que deu errado na tentativa anterior. As três chaves de API vivem em `.env` na raiz — **gitignored, modo 600, nunca em `argv`** (argv vaza no `ps` de qualquer processo da máquina). Sem elas o jogo roda igual: o pipeline de geração é offline, o resultado é que entra no repositório. 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 f0ea18ae..43d1ef22 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/arquitetura.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/arquitetura.md @@ -77,7 +77,7 @@ Size of the files `gen-arch.mjs` indexes — a generated block, regenerated by | `public/js/weapons.js` | 356 | | `public/js/springs.js` | 260 | -Total in `public/js/`: **41,159 lines in 59 files**. The symbol-to-line index lives in `tools/eval/ARCH.md`. +Total in `public/js/`: **41,619 lines in 59 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 9eec8f33..f9607d56 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md @@ -258,7 +258,7 @@ The registry, generated from the `MAPS` of `public/js/maps.js`: | `quebrada` | Quebrada (Rua do Baile) | **capture** | `map_quebrada.js` | 1,656 | | `escadao` | Escadão (Morro) | **capture** | `map_escadao.js` | 813 | | `campomorro` | Campo do Morro | **capture** | `map_campomorro.js` | 713 | -| `lajes` | Lajes (Comunidade) | **capture** | `map_lajes_authored.js` | 1,263 | +| `lajes` | Lajes (Comunidade) | **capture** | `map_lajes_authored.js` | 1,580 | | `corrego` | Córrego (Favela de SP) | **capture** | `map_corrego.js` | 1,258 | | `mansao` | Mansão do Joá | **capture** | `map_mansao.js` | 955 | | `posto_treta` | Posto da Treta | **capture** | `map_posto.js` | 506 | 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 d5f1adac..97354e80 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md @@ -41,7 +41,7 @@ this page was aging at the very first commit — see | What | How much | Where to check | |---|---:|---| -| Game code | 41,159 lines in 59 files | `git ls-files public/js/*.js \| xargs wc -l` | +| Game code | 41,619 lines in 59 files | `git ls-files public/js/*.js \| xargs wc -l` | | `game.js` | **7,260** lines | `wc -l public/js/game.js` | | `main.js` | 2,812 lines | `wc -l public/js/main.js` | | Weapons with GLB | 27 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | @@ -51,7 +51,7 @@ this page was aging at the very first commit — see | Playable characters | 62, in 10 factions | `CHARACTERS` array in `characters.js` | | Maps in the registry | 17 | `MAPS` object in `maps.js` | | Visual harnesses in HTML | 16 | `git ls-files 'public/*.html' \| wc -l` | -| Harness scripts | 300 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Harness scripts | 304 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Pipeline scripts | 77 | `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.184` | `public/js/version.js` and `package.json` (match) | @@ -230,7 +230,7 @@ The maps registered today, and which mode each one opens in: | `quebrada` | Quebrada (Rua do Baile) | **capture** | `map_quebrada.js` | 1,656 | | `escadao` | Escadão (Morro) | **capture** | `map_escadao.js` | 813 | | `campomorro` | Campo do Morro | **capture** | `map_campomorro.js` | 713 | -| `lajes` | Lajes (Comunidade) | **capture** | `map_lajes_authored.js` | 1,263 | +| `lajes` | Lajes (Comunidade) | **capture** | `map_lajes_authored.js` | 1,580 | | `corrego` | Córrego (Favela de SP) | **capture** | `map_corrego.js` | 1,258 | | `mansao` | Mansão do Joá | **capture** | `map_mansao.js` | 955 | | `posto_treta` | Posto da Treta | **capture** | `map_posto.js` | 506 | @@ -282,10 +282,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:ambience-registry 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:charhard eval:charpbr eval:motoca-visual eval:camera-grip eval:pilot-system eval:pilot-grip eval:char-thumbnail eval:asset-integrity eval:gltf-validator eval:props-acervo eval:propsuv1 eval:character-voice eval:audio-pack-character-voice eval:cinematic-ui eval:grafite-editorial eval:map-source eval:map-new eval:campo-contract eval:lajes-rooftop eval:lajes-visual eval:lajes-authored eval:lajes-spatial eval:lajes-gap eval:lajes-circuito eval:lajes-antitrap eval:mansao-water eval:mansao-garden eval:corrego-contract eval:corrego-water eval:look eval:mansao-ocean eval:wind eval:softparticles eval:escala-favela eval:escadao-contract eval:slice-abilities eval:faction-registry eval:mapview eval:devport spec:check skills:check eval:pickuparma eval:mutcega eval:autofix eval:deploygate eval:portaointeiro eval:wfsecret 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:ambience-registry 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:charhard eval:charpbr eval:motoca-visual eval:camera-grip eval:pilot-system eval:pilot-grip eval:char-thumbnail eval:asset-integrity eval:gltf-validator eval:props-acervo eval:propsuv1 eval:character-voice eval:audio-pack-character-voice eval:cinematic-ui eval:grafite-editorial eval:map-source eval:map-new eval:campo-contract eval:lajes-rooftop eval:lajes-visual eval:lajes-authored eval:lajes-spatial eval:lajes-gap eval:lajes-circuito eval:lajes-antitrap eval:lajes-bots eval:mansao-water eval:mansao-garden eval:corrego-contract eval:corrego-water eval:look eval:mansao-ocean eval:wind eval:softparticles eval:escala-favela eval:escadao-contract eval:slice-abilities eval:faction-registry eval:mapview eval:devport spec:check skills:check eval:pickuparma eval:mutcega eval:autofix eval:deploygate eval:portaointeiro eval:wfsecret eval:comentario eval:fixture eval:preload eval:docsautoria eval:replaycam ``` -`package.json` has **186 scripts**; the reason behind each one lives in `SCRIPTS.md`. +`package.json` has **188 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 65c8f779..10447594 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,281 lines**, **65 declared invariant identifiers**, with **28** declared `skip()` paths. -- The harness contains **300 scripts** in `tools/eval/`, plus **77 pipeline scripts** in `tools/`. +- The harness contains **304 scripts** in `tools/eval/`, plus **77 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 diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/stack.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/stack.md index a3a39e34..33196987 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/stack.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/stack.md @@ -126,7 +126,7 @@ hypothetical one: | **Meshy** | 3D props and rigging | `tools/gen-asset.mjs --provider meshy` | `MESHY_API_KEY` | | **OpenRouter** | 2D art | `tools/gen-image.mjs` | `OPENROUTER_API_KEY` | -`mint-assets.json` records **65 assets** generated through Mint (19 `openrouter-image-concept` · 2 `openrouter-concept-tripo-blender-model` · 5 `imagegen-concept` · 30 `mint-model` · 2 `tripo3d-task` · 2 `openrouter-concept-meshy-model` · 5 `mint-asset-pack`). +`mint-assets.json` records **66 assets** generated through Mint (19 `openrouter-image-concept` · 2 `openrouter-concept-tripo-blender-model` · 5 `imagegen-concept` · 31 `mint-model` · 2 `tripo3d-task` · 2 `openrouter-concept-meshy-model` · 5 `mint-asset-pack`). API keys live in the gitignored root `.env`; generation is offline and the game runs without them. diff --git a/docs/maps/LAJES-BOTS.md b/docs/maps/LAJES-BOTS.md new file mode 100644 index 00000000..6c8bf251 --- /dev/null +++ b/docs/maps/LAJES-BOTS.md @@ -0,0 +1,99 @@ +# Lajes — por que o bot morava no respawn de cima + +Relato do dono (26/08/2026): *"os bots ficam so no respawn em cima e nao tentam circular +pelo mapa embaixo tambem"*. + +O portão estava **inteiro verde** quando isso foi dito. A `LV1` já provava que existe rota +por baixo entre spawn e bandeira; a `LV6` já provava que toda aresta de térreo do grafo é +andável; a `CTF2` já contava duas rotas separadas por par. Nenhuma das três olha para o +**bot**. Este arquivo registra o que faltava medir, o que foi consertado e o que continua +aberto, para a próxima pessoa não recomeçar a investigação do zero. + +## O que a medição mostrou + +Sonda no harness real (o `_updateBot` de produção em node puro, sem Chrome e sem render), +3 sementes × 60 s × 7 bots: + +| | antes | +|---|---| +| bots que pisaram no chão | **0 de 21** | +| `ymin` de todos os bots | **5,20 m** (a cota da laje) | +| amostras no térreo | **0,0%** | +| amostras em escada | **0,0%** | + +Zero absoluto, não "pouco". E um bot rastreado ficou **preso em (−6,97 / −26,67) de +t = 6 s a t = 34 s** — ou seja, saía do spawn, andava 6 segundos e encostava numa parede +pelo resto da partida. + +## As duas causas + +**1. A porta da laje estava tapada.** A abertura da platibanda era decidida em PLANTA, sobre +a linha da borda (`roofAccessOnHorizontal/Vertical`, janela de ±0,9 m). Só que quem sai da +tábua não anda pela borda — anda para DENTRO, na diagonal, rumo ao miolo do telhado. Na +tábua `CN-NE` essa diagonal batia no guarda do patamar da `DESCIDA NORTE`, 0,6 m depois de +já ter passado pela abertura. A abertura agora acompanha o **corredor** boca → miolo da +laje, e só onde há laje **dos dois lados**: a primeira versão abriu na borda sul da `SE` e a +`MAP6` pegou na hora (2 bordas alcançáveis com queda de 5,2 m sem guarda). Trocar bot preso +por jogador despencando não é conserto. + +**2. `nearestWaypoint` respondia em planta, num mapa de duas camadas.** A projeção em XZ de +um bot na laje cai em cima de um nó de **beco**, e era esse nó que o A\* recebia como origem. +O bot então "seguia" uma rota de térreo andando pelo telhado — nunca encostava numa escada. +Agora `y` pesa 3× (5,2 m de desnível custam 15,6 m de planta, mais que a maior laje do +mapa), e o `game.js` passa a cota. O `map_mansao` já aceitava o terceiro argumento e nunca o +recebia. + +De quebra: `livreEm` passou a respeitar colisor **girado**. O corrimão de 7 cm da tábua +diagonal tem AABB de 6,0 × 1,7 m, e testar pela AABB apagava a laje inteira em volta de toda +tábua diagonal. + +Régua: `npm run eval:lajes-bots` (LB1 aresta andável em TODA camada — a `LV6` promovida para +fora do térreo; LB2 origem de rota na camada certa). Antes: 4 arestas bloqueadas e 84,6% de +acerto de camada. Depois: 0 e 100%. + +## Duas tentativas medidas e recusadas + +Ficam registradas para não voltarem como "boa ideia". + +**Carpete de waypoints na laje.** Uma grade na camada de cima, igual à do térreo. Resolvia o +bot e derrubava `LS2`, `LV1` e `CTF2` de duas rotas para uma: com célula em qualquer x da +laje, a rota mais curta desliza ~2 m para o lado, e o `rotasSeparadas` apaga a faixa de 6 m +em **planta**, não em 3D — a faixa da rota de cima passava a engolir o beco que corria por +baixo. (Uma separação 3D seria mais correta em mapa de duas camadas, mas afrouxa uma régua +compartilhada por todos os mapas: é decisão do dono, não de quem conserta.) + +**Metade das vagas de spawn no térreo.** Levava o bot ao chão de verdade (0,0% → 7,3% das +amostras) e reprovava a `LS1` — *"os dois times nascem nas lajes"* é contrato do mapa. + +## O que continua aberto — BUG-75 + +Com o combate **ligado**, que é como o dono joga, o raio de exploração do bot no lajes é +**12,8 m**, contra 23,2 m no escadão, 23,0 m no piscinão e 38,5 m no ferro velho. + +A causa **não é o grafo**. Com o combate suprimido, no mesmo grafo, o raio vai a **44,1 m** e +a escada finalmente aparece no rastro. A causa é esta: + +- no lajes **100% dos engajamentos acontecem acima de 25 m**, com mediana de **49,9 m** + (escadão 19,0 m, ferro velho 18,6 m) — as duas lajes de spawn se enxergam por um corredor + de ar sobre o miolo do mapa; +- e `_updateBot` **não avança rota nenhuma enquanto `b.target` existe** (`game.js`, ramo + `else` do roam). + +Somando: o bot não precisa andar para atirar, então não anda. Ele congela onde viu o +primeiro inimigo, que é a poucos metros do respawn. + +Consertar isso é **redesenhar a visada do telhado** (quebrar o corredor spawn↔spawn, o que +mexe no visual que o dono aprovou) ou **mexer na IA de combate de todos os mapas** (deixar o +bot progredir na rota com alvo distante em mãos). Nenhuma das duas cabe numa frente de mapa, +e as duas precisam da chamada do dono. + +Uma tentativa parcial foi medida: massa de cobertura na frente das duas lajes de spawn levou +o engajamento mediano de 48,6 m para 41,9 m e o térreo de 7,3% para 12,8%, mas o raio caiu +(15,1 → 13,0 m). Não é o conserto. + +Enquanto isso, `eval:lajes-bots` **imprime os dois números em toda execução, sem cláusula** — +navegação (combate suprimido) e partida real, lado a lado. A distância entre eles É o defeito +em aberto. Uma cláusula "o bot põe pé no térreo" chegou a ser escrita e foi **descartada**: +medida no estado anterior à rodada, ela nascia VERDE (7,2% das amostras, com combate +suprimido). Régua que não morde é pior que régua ausente — ela dá por resolvido o que +continua aberto. diff --git a/docs/maps/LAJES-PIPA.md b/docs/maps/LAJES-PIPA.md new file mode 100644 index 00000000..8a48f293 --- /dev/null +++ b/docs/maps/LAJES-PIPA.md @@ -0,0 +1,63 @@ +# Lajes — a pipa que voa (e por que não precisou de clipe) + +Relato do dono (26/08/2026): *"pipas nao voam (precisa de um clipe no mintgg ou outro ate +blender)"*. + +## O que havia + +`addKite` no `map_lajes_authored.js` desenhava **12 losangos de `BufferGeometry` parados** +entre 14 e 22 m, com rotação fixa por índice e uma rabiola de `TubeGeometry` congelada. Pipa +parada não é pipa — é enfeite pendurado, e foi exatamente assim que o dono leu. + +## Por que não precisou de clipe de animação + +O dono sugeriu gerar um clipe no Mint ou no Blender. Não é necessário, e a razão é do +objeto: **pipa não tem parte móvel**. O que se move é a pipa INTEIRA contra a linha +esticada. Isso é cinemática de corpo rígido, não deformação de malha — um clipe assado +entregaria um loop fixo, e o que se quer é justamente o que não se repete. O GLB entra como +casca; o movimento é simulado. + +## O modelo de voo + +Em `ambientlife.js`, região append-only **PIPA NO CÉU** (`attachPipaSky`): + +- **linha de comprimento fixo** — a pipa anda sobre uma casca esférica em volta de quem a + segura, nunca em linha reta pelo céu. Quando sobe de um lado, recua do outro (o raio + horizontal encolhe com a altura ganha); +- **o abanar é a soma de duas oscilações de períodos que não fecham entre si** — 7,3 s de + rajada larga + 1,73 s de tremida. Uma senoide só devolve balanço de pêndulo de brinquedo, + que é o defeito de leitura já reprovado noutro asset desta base; +- **atitude tirada da velocidade do quadro** — aponta para onde VAI, inclina o nariz com a + subida e banca para o lado da guinada. Nada de rotação constante por índice; +- **rabiola como RASTRO** — cada um dos 14 nós ocupa uma posição por onde a pipa passou há + *k* quadros. É o que faz o rabo chicotear DEPOIS da pipa, em vez de acompanhá-la rígido. + +## Integração + +Três pipas, âncoras em pontos distintos (laje norte, praça, laje sul), altitudes escalonadas +de **26 a 38 m** — acima da laje (5,2 m) e do horizonte de prédios, que é onde pipa de +comunidade voa. De qualquer canto do mapa dá para ver pelo menos uma abanando, e nenhuma +some atrás da outra. + +Não é colisor, não é occluder e **não projeta sombra**: a 30 m da cena, sombra de pipa é +orçamento gasto em pixel que ninguém vê. + +O `update` da pipa **envolve** o da ambiência em vez de rodar em laço próprio no `game.js`. +Pausa, reset e descarte ficam com um dono só — pipa abanando com o jogo pausado é o tipo de +detalhe que denuncia enfeite colado por fora. + +A pipa fica **fora** de `FAVELA_AMBIENCE_ASSETS`: só o lajes baixa o GLB. Pipa dentro da UPA +ou da Loja H seria pipa dentro do prédio. + +## Procedência + +`pipa.glb` — “Red Yellow Diamond Kite”, Mint text-to-3D, kit de revisão r2 do lajes +(`kits-mint.json`, item `lajes.pipa`). 4532 triângulos, WebP 1024, bbox +0,553 × 0,998 × 0,361 m, integrada com envergadura de 1,35 m. Registro `pipa-lajes` em +`mint-assets.json` (com `finalSha256` do arquivo servido) e em +`public/models/ambient/FONTE.md`. + +## Limite conhecido + +O harness node **não carrega GLB**, então toda régua que roda ali vê a pipa no fallback de +losango. O voo medido é o mesmo nos dois caminhos; a leitura do modelo Mint é da captura 3:2. diff --git a/docs/maps/LAJES-PRACA.md b/docs/maps/LAJES-PRACA.md new file mode 100644 index 00000000..4b5b9a71 --- /dev/null +++ b/docs/maps/LAJES-PRACA.md @@ -0,0 +1,89 @@ +# Lajes — a praça do térreo e a rota cima × baixo + +> Rodada de 25/08/2026, branch `map2/lajes` (PR #438). Este arquivo guarda o +> **porquê** das decisões e os **números medidos**; o código aponta para cá em vez de +> narrar (orçamento de comentário do `AGENTS.md`). + +## O defeito, nas palavras do dono + +> "O lajes é o mais bonito visualmente mas está muito confuso. A ideia era os times irem +> tanto por baixo quanto por cima, e agora só vai por cima. Por baixo tinha que ter uma +> praça no meio, ver os becos e jogar cima contra baixo." + +O portão do mapa estava **8/8 verde**. Era o portão que estava cego, não o dono. + +## A causa raiz: o térreo e o telhado eram dois grafos + +`map_lajes_authored.js` ligava o pé de cada escada ao nó de térreo mais próximo com um +laço `if (nodes[i].y < 1)` — e o mais próximo era **o primeiro degrau da própria +escada** (y = 0,17, a 0,28 m). A escada ligava em si mesma. + +Medido no harness: **300 nós de térreo num componente, 307 de laje em outro**. Os 4 +spawns e as 4 bandeiras estão todos em laje, então as 20 rotas que a CTF2 enumerava +corriam **100% em laje, 0% de térreo**. O chão do mapa era cenário. + +A CTF2 não podia pegar isso: ela conta *quantas* rotas separadas existem, nunca *a que +altura* elas correm. Régua que mede numa direção é cega na outra (lição 1). + +## O que entrou + +| | | +|---|---| +| **Praça** | retângulo `PRACA` (x −7,2..7,2 · z −8,2..9): nenhuma casa, muro ou pilastra de beco nasce dentro. Quadra pintada, traves, bancos, floreiras com mangueira, mesa de bar, caixa d'água e pneus como cover | +| **Descidas** | `DESCIDA NORTE` (topo em NE) e `DESCIDA SUL` (topo em SW), cada uma a um plank do spawn, com **ramal de beco próprio** — é assim que o pé entra no circuito de baixo | +| **Malha de térreo** | grade de 2,0 m com diagonais sobre o chão livre. O chão sempre foi andável fora do beco; só o beco tinha nós | +| **Alvenaria sob os lances** | os degraus não têm colisor (pisa-se neles pelo `groundHeightAt`), então o chão sob a escada ficava andável e cercado — 7 células sem volta ao spawn | + +### Números medidos (`eval:lajes-vertical`) + +| | antes | depois | +|---|---|---| +| travessia por baixo | **não existia** (grafos separados) | 1,03–1,48× o flanco por cima, 48–63% do caminho no chão | +| visada das lajes para o térreo | 20,4% | 63,1% | +| sala do miolo | 16 m², centro a 13,4 m do meio | 146 m², centro a 0,8 m do meio | +| cover na praça | 0 peças | 17 peças, espaçamento 3,5 m | + +## Decisões que custaram uma tentativa cada + +**Não ponha escada no meio da praça.** Tentado (`ESCADA DA PRAÇA`, topo em ES): encurtou +o detour da LV1 para 1,54×, mas as paredes de 5,9 m do poço ficam na borda leste da sala +e derrubaram a visada de **62,4% para 42,9%** — matando o "ver os becos" que comprou a +rodada. A praça sobe pela BECO DO VARAL (oeste) e pelas escadas das pontas; o miolo dela +fica limpo de propósito. + +**Não feche o fundo de quintal com divisas.** A faixa de 2,1 m entre a traseira das lajes +(|x| = 13,2) e o muro de perímetro (15,32) corre os 78 m do mapa, e a rota de baixo +preferia dar a volta por ela (142 m). Fechá-la a cada ~10 m quebra o corredor, mas os vãos +de serviço em que cada trecho ligaria de volta ao miolo são eles próprios becos sem saída: +o `lajes-antitrap` saltou de **15 para 97 células sem volta ao spawn**. A faixa ficou +aberta como sempre esteve; quem não entra nela é a **malha de navegação**, então ela segue +fundo de quintal em vez de virar a rota preferida dos bots e da régua. + +**Aresta de grafo se testa no vão inteiro, não no ponto médio.** Com nós a 2,0 m e muro de +0,26 m, o ponto médio cai fora da parede e o grafo jura passagem onde há muro. É o que a +**LV6** passou a cobrar, com o mutante `aresta-fantasma`. + +## Por que a LV1 compara com o FLANCO, e não com a rota mais curta + +A rota de cima mais curta é quase a reta entre spawn e bandeira (53,5 m para 49 m de +distância no par E→P): as lajes formam um tabuleiro contínuo. Ir por baixo carrega dois +custos que o projeto do mapa impõe e que nenhum conserto tira: + +- as duas escadas em U custam **22,6 m fixos** de caminhada (2 lances de 4,2 m + 2 + patamares de 1,45 m, por escada — geometria da `addStaircase`); +- a espinha inferior é **sinuosa de propósito** (`LAJES_LOOPS.beco`): 62 m de beco para + 46 m de reta entre os pés das escadas, **1,35×**. + +Sobre a rota de cima mais curta isso já dá ~1,87× antes de qualquer desperdício — cobrar +1,6× seria cobrar que o térreo deixasse de ser o térreo deste mapa. O par honesto do +pedido do dono ("ir tanto por baixo quanto por cima") é o **flanco**: a segunda rota +separada que a CTF2 já conta como alternativa jogável por cima (100,4 m no E→P, 1,88× a +direta). Se atravessar por baixo custa o mesmo que flanquear por cima, ir por baixo é +escolha e não castigo. + +## Evidência + +`tools/eval/asset-evidence/maps/lajes/praca-ab/` — antes × depois na **mesma câmera** (o +antes foi re-tirado com o mapa de `d954ca41` restaurado; câmera diferente não é +comparação). Do chão: parede de tijolo na cara → praça aberta com quadra. Da laje leste: +parede cega → a praça inteira e quem está nela. diff --git a/mint-assets.json b/mint-assets.json index 53ec2ba4..155afa99 100644 --- a/mint-assets.json +++ b/mint-assets.json @@ -1883,6 +1883,28 @@ ], "finalSha256": "d5fdc03244bbb0acf4599ea6358b8083a1b6a1f91ce7f9a531c9413ec6052e1c" } + }, + "pipa-lajes": { + "artifactType": "model/gltf-binary", + "files": [ + "public/models/ambient/pipa.glb" + ], + "source": { + "kind": "mint-model", + "assetId": "ks77pb3qdfmp4wezctvrpqsmkn8d62ta", + "chatUrl": "https://mint.gg/chat/ph724bnemdzzbkp3va6bxdf5v98d6rrb", + "displayName": "Red Yellow Diamond Kite (pipa do lajes)", + "sha256": "9ae646b40e18403bd861d35198b25be72d20c727de7a90ca7df1a389d6b2583e", + "notes": "Kit de revisao r2 do lajes (kits-mint.json, item lajes.pipa, 26/08/2026). Pipa de losango vermelha e amarela, 4532 triangulos, WebP 1024, sem esqueleto e SEM CLIPE DE ANIMACAO — e nao precisa: pipa nao tem parte movel, o que se move e a pipa inteira contra a linha esticada. O voo e PROCEDURAL (ambientlife.js, regiao 'PIPA NO CEU'): casca esferica em volta da ancora porque a linha tem comprimento fixo, abanar por soma de duas oscilacoes de periodos que nao fecham entre si (7,3 s e 1,73 s), yaw/pitch/roll tirados da velocidade do quadro e rabiola como RASTRO de posicoes passadas. Bbox nativo 0,553 x 0,998 x 0,361 m; integrada com envergadura 1,35 m e altura de voo de 26 a 38 m. Substituiu 12 losangos de BufferGeometry parados no ceu entre 14 e 22 m ('pipas nao voam', dono 26/08/2026). Nao e colisor, nao e occluder e nao projeta sombra." + }, + "processing": { + "provider": "mint", + "model": "mint text-to-3d (padrao gen-asset: webp 1024, ~4-5k tris)", + "tools": [ + "mint.gg" + ], + "finalSha256": "9ae646b40e18403bd861d35198b25be72d20c727de7a90ca7df1a389d6b2583e" + } } } } diff --git a/package.json b/package.json index 7d705e10..ad84827a 100644 --- a/package.json +++ b/package.json @@ -169,7 +169,10 @@ "eval:lajes-gap": "node tools/eval/lajes-gap-check.mjs", "eval:lajes-circuito": "node tools/eval/lajes-circuito-check.mjs", "eval:lajes-antitrap": "node tools/eval/lajes-antitrap-check.mjs", - "eval:map-source": "node tools/eval/map-source-check.mjs", + "//eval:lajes-vertical": "cima × baixo do lajes: rota térrea + rota superior por par spawn↔bandeira, praça no meio com cover, e becos visíveis das lajes (dono, 25/08/2026)", + "eval:lajes-vertical": "node tools/eval/lajes-vertical-check.mjs", + "//eval:lajes-bots": "bots do lajes: aresta andável em toda camada, origem de rota na camada certa e bot simulado pisando no térreo (dono, 26/08/2026)", + "eval:lajes-bots": "node tools/eval/lajes-bots-check.mjs", "eval:map-source": "node tools/eval/map-source-check.mjs", "eval:faction-registry": "node tools/eval/faction-registry-check.mjs", "eval:origmaps": "node tools/eval/original-map-check.mjs", "voices": "node tools/gen-character-voices.mjs --provider openrouter", @@ -178,7 +181,7 @@ "skills:sync": "node tools/sync-skills.mjs", "skills:check": "node tools/sync-skills.mjs --check", "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:ambience-registry 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:charhard eval:charpbr eval:motoca-visual eval:camera-grip eval:pilot-system eval:pilot-grip eval:char-thumbnail eval:asset-integrity eval:gltf-validator eval:props-acervo eval:propsuv1 eval:character-voice eval:audio-pack-character-voice eval:cinematic-ui eval:grafite-editorial eval:map-source eval:map-new eval:campo-contract eval:lajes-rooftop eval:lajes-visual eval:lajes-authored eval:lajes-spatial eval:lajes-gap eval:lajes-circuito eval:lajes-antitrap eval:mansao-water eval:mansao-garden eval:corrego-contract eval:corrego-water eval:look eval:mansao-ocean eval:wind eval:softparticles eval:escala-favela eval:escadao-contract eval:slice-abilities eval:faction-registry eval:mapview eval:devport spec:check skills:check eval:pickuparma 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:ambience-registry 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:charhard eval:charpbr eval:motoca-visual eval:camera-grip eval:pilot-system eval:pilot-grip eval:char-thumbnail eval:asset-integrity eval:gltf-validator eval:props-acervo eval:propsuv1 eval:character-voice eval:audio-pack-character-voice eval:cinematic-ui eval:grafite-editorial eval:map-source eval:map-new eval:campo-contract eval:lajes-rooftop eval:lajes-visual eval:lajes-authored eval:lajes-spatial eval:lajes-gap eval:lajes-circuito eval:lajes-antitrap eval:lajes-bots eval:mansao-water eval:mansao-garden eval:corrego-contract eval:corrego-water eval:look eval:mansao-ocean eval:wind eval:softparticles eval:escala-favela eval:escadao-contract eval:slice-abilities eval:faction-registry eval:mapview eval:devport spec:check skills:check eval:pickuparma 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:deps": "node tools/eval/deps-check.mjs", diff --git a/public/js/ambientlife.js b/public/js/ambientlife.js index 0cccef5d..4492fd4d 100644 --- a/public/js/ambientlife.js +++ b/public/js/ambientlife.js @@ -19,8 +19,11 @@ const ASSETS = Object.freeze({ armadillo: 'models/ambient/tatu_campo.glb', cockroach: 'models/ambient/barata_urbana.glb', parrot: 'models/ambient/papagaio_poleiro.glb', + /* pipa fica FORA de FAVELA_AMBIENCE_ASSETS (só o lajes baixa): pipa dentro + da UPA seria pipa dentro do prédio. docs/maps/LAJES-PIPA.md */ + pipa: 'models/ambient/pipa.glb', }); -export const FAVELA_AMBIENCE_ASSETS = Object.freeze(Object.keys(ASSETS)); +export const FAVELA_AMBIENCE_ASSETS = Object.freeze(Object.keys(ASSETS).filter((id) => id !== 'pipa')); const TYPE_ASSET = Object.freeze({ rat: 'rat', pigeon: 'pigeonGround', dog: 'dog', cat: 'cat', chicken: 'chicken', cow: 'cow', armadillo: 'armadillo', cockroach: 'cockroach', parrot: 'parrot' }); const FAUNA_NAME = Object.freeze({ rat: 'rato', pigeon: 'pomba', dog: 'cachorro', cat: 'gato', chicken: 'galinha', cow: 'vaca', armadillo: 'tatu', cockroach: 'barata', parrot: 'papagaio' }); const QUADS = new Set(['dog', 'cat', 'chicken', 'cow', 'armadillo']); @@ -559,3 +562,143 @@ export function placeFauna(id, { x = 0, y = 0, z = 0, ry = 0, targetLen, submerg }); return root; } + +/* PIPA NO CÉU — região append-only. Voo procedural: a linha tem comprimento fixo, o abanar + é soma de dois períodos que não fecham e a rabiola é rastro. docs/maps/LAJES-PIPA.md */ + +/* Só o lajes baixa: pipa em mapa fechado (UPA, Loja H) seria pipa dentro do prédio. */ +export const PIPA_ASSETS = Object.freeze(['pipa']); +/* envergadura da vela em metros; nós do rastro; quadros entre um nó e o seguinte */ +const PIPA_ENVERGADURA = 1.35, PIPA_RABIOLA_NOS = 14, PIPA_RABIOLA_ATRASO = 3; +const PIPA_HIST = PIPA_RABIOLA_NOS * PIPA_RABIOLA_ATRASO + 2; + +function pipaFallback() { + /* Sem GLB (harness node, sem rede) a pipa vira losango e o voo é o mesmo: + fallback mudo devolveria céu vazio sem ninguém perceber. */ + const grupo = new THREE.Group(); + const vela = new THREE.Mesh(new THREE.PlaneGeometry(PIPA_ENVERGADURA * .82, PIPA_ENVERGADURA), + new THREE.MeshStandardMaterial({ color: 0xd63b42, roughness: .85, side: THREE.DoubleSide })); + vela.rotation.z = Math.PI / 4; grupo.add(vela); + return grupo; +} + +/* Envolve o `update` da ambiência em vez de abrir laço no game.js: pausa, reset e descarte + ficam com um dono só — pipa abanando com o jogo pausado denuncia enfeite colado por fora. */ +export function attachPipaSky(ambience, root, configs = []) { + if (!ambience || !configs.length) return null; + const grupo = new THREE.Group(); + grupo.name = 'PIPA_SKY'; + grupo.userData.skyLife = 'pipa'; + root.add(grupo); + const modelo = templates.get('pipa'); + const pipas = configs.map((config, indice) => { + const corpo = modelo ? modelo.scene.clone(true) : pipaFallback(); + if (modelo) { + corpo.updateMatrixWorld(true); + const caixa = new THREE.Box3().setFromObject(corpo); + const tamanho = caixa.getSize(new THREE.Vector3()); + corpo.scale.setScalar(PIPA_ENVERGADURA / Math.max(.001, Math.max(tamanho.x, tamanho.y))); + } + const no = new THREE.Group(); + no.add(corpo); + no.userData.skyLife = 'pipa'; + no.userData.nonCollider = true; + grupo.add(no); + // Line, não tubo: 2 draw calls por pipa e nada de geometria refeita por quadro + const linha = new THREE.Line(new THREE.BufferGeometry().setAttribute('position', + new THREE.BufferAttribute(new Float32Array(6), 3)), + new THREE.LineBasicMaterial({ color: 0xe8e2d4, transparent: true, opacity: .5 })); + linha.frustumCulled = false; grupo.add(linha); + const rabiola = new THREE.Line(new THREE.BufferGeometry().setAttribute('position', + new THREE.BufferAttribute(new Float32Array(PIPA_RABIOLA_NOS * 3), 3)), + new THREE.LineBasicMaterial({ color: [0xf0bd2b, 0x2f70c1, 0xd63b42][indice % 3] })); + rabiola.frustumCulled = false; grupo.add(rabiola); + return { + no, linha, rabiola, + /* âncora = quem segura a linha, na laje ou no quintal */ + ancora: new THREE.Vector3(...(config.ancora || [0, 5.2, 0])), + alt: config.alt ?? (26 + indice * 5), // 25–40 m: acima da laje e dos prédios + raio: config.raio ?? (9 + indice * 2.5), // afastamento horizontal da âncora + fase: config.fase ?? indice * 2.1, + giro: config.giro ?? (.55 + indice * .12), // amplitude da guinada, em radianos + hist: Array.from({ length: PIPA_HIST }, () => new THREE.Vector3()), + cursor: 0, iniciado: false, anterior: new THREE.Vector3(), + }; + }); + + const passo = (pipa, t) => { + /* Períodos que não fecham entre si (7,3 s e 1,73 s): a soma nunca repete o + mesmo desenho, que é o que separa "abanando" de "oscilando". */ + const largo = Math.sin(t / 7.3 * Math.PI * 2 + pipa.fase); + const tremido = Math.sin(t / 1.73 * Math.PI * 2 + pipa.fase * 1.7); + const azimute = pipa.fase + largo * pipa.giro + tremido * .09; + /* A linha esticada é o vínculo: sobe de um lado, a pipa recua do outro. */ + const subida = largo * .18 + tremido * .05; + const alt = pipa.alt + subida * 6; + const raio = pipa.raio * Math.sqrt(Math.max(.05, 1 - subida * subida * .8)); + return new THREE.Vector3( + pipa.ancora.x + Math.sin(azimute) * raio, + alt, + pipa.ancora.z + Math.cos(azimute) * raio); + }; + + let tempo = 0; + const atualizar = (dt) => { + tempo += Math.max(0, Math.min(.05, dt)); + const pos = new THREE.Vector3(), vel = new THREE.Vector3(); + for (const pipa of pipas) { + pos.copy(passo(pipa, tempo)); + if (!pipa.iniciado) { + for (const p of pipa.hist) p.copy(pos); + pipa.anterior.copy(pos); pipa.iniciado = true; + } + vel.copy(pos).sub(pipa.anterior); + pipa.anterior.copy(pos); + pipa.no.position.copy(pos); + /* Aponta para onde VAI e banca para o lado da guinada; sem velocidade (jogo + pausado) mantém a pose em vez de saltar para o eixo zero. */ + if (vel.lengthSq() > 1e-8) { + pipa.no.rotation.y = Math.atan2(vel.x, vel.z); + pipa.no.rotation.x = -Math.atan2(vel.y, Math.hypot(vel.x, vel.z)) * .6; + pipa.no.rotation.z = THREE.MathUtils.clamp(-vel.x * 9, -.5, .5); + } + pipa.hist[pipa.cursor].copy(pos); + const linhaPos = pipa.linha.geometry.attributes.position; + linhaPos.setXYZ(0, pipa.ancora.x, pipa.ancora.y, pipa.ancora.z); + linhaPos.setXYZ(1, pos.x, pos.y, pos.z); + linhaPos.needsUpdate = true; + const rabPos = pipa.rabiola.geometry.attributes.position; + for (let i = 0; i < PIPA_RABIOLA_NOS; i++) { + // cada nó ocupa onde a pipa esteve há i × atraso quadros: o rabo CHEGA depois + const p = pipa.hist[(pipa.cursor - i * PIPA_RABIOLA_ATRASO + PIPA_HIST * 4) % PIPA_HIST]; + rabPos.setXYZ(i, p.x, p.y - i * .012, p.z); + } + rabPos.needsUpdate = true; + pipa.cursor = (pipa.cursor + 1) % PIPA_HIST; + } + }; + + grupo.traverse((objeto) => { + if (!objeto.isMesh) return; + objeto.castShadow = false; // 30 m acima da cena: sombra é orçamento sem pixel + objeto.receiveShadow = false; + objeto.userData.nonSolidSurface = true; + objeto.userData.nonCollider = true; + }); + atualizar(0); + + const updateOriginal = ambience.update.bind(ambience); + ambience.update = (dt, playerPosition) => { + updateOriginal(dt, playerPosition); + if (!ambience.paused) atualizar(dt); + }; + const disposeOriginal = ambience.dispose.bind(ambience); + ambience.dispose = () => { grupo.removeFromParent(); disposeOriginal(); }; + ambience.pipaSky = { + group: grupo, count: pipas.length, + snapshot: () => pipas.map((pipa, i) => ({ id: `pipa-${i}`, + x: +pipa.no.position.x.toFixed(3), y: +pipa.no.position.y.toFixed(3), z: +pipa.no.position.z.toFixed(3), + rabiola: PIPA_RABIOLA_NOS, fonte: modelo ? 'gltf' : 'fallback' })), + }; + return ambience.pipaSky; +} diff --git a/public/js/game.js b/public/js/game.js index b43192de..eb5447df 100644 --- a/public/js/game.js +++ b/public/js/game.js @@ -4631,13 +4631,13 @@ export class Game { if (BOT_MOVE2) { // mesmo tratamento do roam: nó de partida FISICAMENTE alcançável + A* que pula os // hops que o bot já provou não caber (senão ele serrilha a quina pra sempre). - let from = W.nearestWaypoint(b.pos.x, b.pos.z); + let from = W.nearestWaypoint(b.pos.x, b.pos.z, b.pos.y); if (!this._walkReach(b, W.waypoints.nodes[from])) { const cands = W.waypoints.nodes.map((n, i) => ({ i, d: (n.x - b.pos.x) ** 2 + (n.z - b.pos.z) ** 2 })).sort((a, c) => a.d - c.d); for (let k = 0; k < Math.min(6, cands.length); k++) if (this._walkReach(b, W.waypoints.nodes[cands[k].i])) { from = cands[k].i; break; } } - b.path = this._findPathLocal(W, from, W.nearestWaypoint(pt.x, pt.z), b._banNodes); - } else b.path = W.findPath(W.nearestWaypoint(b.pos.x, b.pos.z), W.nearestWaypoint(pt.x, pt.z)); + b.path = this._findPathLocal(W, from, W.nearestWaypoint(pt.x, pt.z, pt.y), b._banNodes); + } else b.path = W.findPath(W.nearestWaypoint(b.pos.x, b.pos.z, b.pos.y), W.nearestWaypoint(pt.x, pt.z, pt.y)); b.pathIdx = 1; } if (BOT_MOVE2 && b.path) { @@ -6390,7 +6390,7 @@ export class Game { // path[0] e ficava serrilhando a quina do muro ("andando pro lado e pro outro", // latFlips 68-94/min medido). Agora escolhe o nó mais próximo FISICAMENTE // ALCANÇÁVEL: simula a caminhada reta com _collide (a mesma física do bot). - let from = W.nearestWaypoint(b.pos.x, b.pos.z); + let from = W.nearestWaypoint(b.pos.x, b.pos.z, b.pos.y); let pocket = false; if (!this._walkReach(b, W.waypoints.nodes[from])) { let found = -1; diff --git a/public/js/graffiti_layout.js b/public/js/graffiti_layout.js index f5c8ac04..ef332352 100644 --- a/public/js/graffiti_layout.js +++ b/public/js/graffiti_layout.js @@ -20,4 +20,4 @@ export const GRAFITE = {"ferro_velho":{"arquivos":["peca-bolha.png","tag-selvage /* IMPRESSÃO DIGITAL DAS ENTRADAS (issue #82) — GERADA junto com o layout, ver tools/eval/graffiti-fingerprint.mjs. Cobrada por tools/eval/graffiti-layout-check.mjs. */ -export const GRAFITE_FP = {"pass":"101826ab448fb518","maps":{"praca_poderes":"8df6e066c8fb326b","piscina_treta":"3976e55620a2f273","loja_h":"4a25d99f19b040d4","ferro_velho":"53f2528495764aeb","quebrada":"1eda70f779199109","escadao":"6bb83f408dee7d2a","campomorro":"6d77de54740e982c","lajes":"3a7e584bbd3d06a1","corrego":"c99b9a7cd2712db9","mansao":"42a5f138c7b9a806"}}; +export const GRAFITE_FP = {"pass":"101826ab448fb518","maps":{"praca_poderes":"8df6e066c8fb326b","piscina_treta":"3976e55620a2f273","loja_h":"4a25d99f19b040d4","ferro_velho":"53f2528495764aeb","quebrada":"1eda70f779199109","escadao":"6bb83f408dee7d2a","campomorro":"6d77de54740e982c","lajes":"86c81e232ba0aeb4","corrego":"c99b9a7cd2712db9","mansao":"42a5f138c7b9a806"}}; diff --git a/public/js/map_lajes_authored.js b/public/js/map_lajes_authored.js index 053fc64b..eefb3b52 100644 --- a/public/js/map_lajes_authored.js +++ b/public/js/map_lajes_authored.js @@ -3,7 +3,7 @@ import { placeProp, PropBatch } from './mapprops.js'; import { makeAerialFog } from './bloom.js'; import { decalIds } from './map_decals.js'; import { grafitar } from './graffiti_pass.js'; -import { createFavelaAmbience, FAVELA_AMBIENCE_ASSETS } from './ambientlife.js'; +import { createFavelaAmbience, attachPipaSky, FAVELA_AMBIENCE_ASSETS, PIPA_ASSETS } from './ambientlife.js'; import { AMB_LOOPS } from './soundscape.js'; const QP = new URLSearchParams(typeof location !== 'undefined' ? location.search : ''); @@ -14,15 +14,12 @@ export const LAJES_AUTHORED_ASSETS = Object.freeze([ 'lajes_casa_01', 'lajes_casa_02', 'lajes_casa_03', 'lajes_casa_04', 'lajes_casa_05', 'lajes_casa_06', 'lajes_casa_07', 'lajes_varal', 'caixa_dagua', ]); -export const LAJES_CONNECTIONS = Object.freeze([ - 'ESCADARIA', 'BECO DO VARAL', 'ACESSO SUL', - 'ROTA DE MADEIRA OESTE', 'ROTA DE MADEIRA LESTE', -]); export const LAJES_LOOPS = Object.freeze({ beco: 'espinha sinuosa inferior com três ramais e retornos pelas escadas', laje: 'duas travessias superiores independentes ligadas por tábuas ancoradas', }); -export const LAJES_AMBIENCE = FAVELA_AMBIENCE_ASSETS; +/* + pipa: só o lajes baixa o GLB da pipa (ambientlife.js, região PIPA NO CÉU) */ +export const LAJES_AMBIENCE = Object.freeze([...FAVELA_AMBIENCE_ASSETS, ...PIPA_ASSETS]); export const LAJES_PROPS = [...LAJES_AUTHORED_ASSETS, 'moto_cg', 'stall', 'dumpster', 'pilha_pneus', 'botijao_gas']; @@ -74,7 +71,9 @@ const PLANKS = Object.freeze([ { id: 'CS-SE', a: [2.5, 28.5], b: [7.4, 27] }, { id: 'NW-CN', a: [-7.4, -27.2], b: [-2.5, -28.5] }, { id: 'CN-NE', a: [2.5, -28.5], b: [7.4, -27.2] }, - { id: 'WN-MN', a: [-7.4, -11], b: [-5.9, -11] }, + /* z −10,2 e não −11: em −11 a ponta caía no VÃO entre as partes da WN e o A* ligava + por cima do guarda — aresta que o corpo não anda (LB1). */ + { id: 'WN-MN', a: [-7.4, -10.2], b: [-5.9, -10.2] }, { id: 'MS-SE', a: [3.8, 25], b: [7.4, 25] }, { id: 'CS-MS', a: [3, 28.5], b: [3, 27] }, ]); @@ -88,14 +87,43 @@ const MAIN_BECO = Object.freeze([ [0, -27], [0, -18], [-3, -18], [-3, -10], [-3, -3], [2.5, -3], [2.5, 2], [2.5, 10], [-2, 10], [-2, 22], [1.5, 22], [1.5, 27.5], ]); +/* Cada escada é servida por um ramal do beco: é assim que o pé dela entra no circuito + de baixo. Sem ramal o pé fica em bolso — docs/maps/LAJES-PRACA.md */ const BRANCHES = Object.freeze([ [[-3, -10], [4.2, -10]], [[2.5, 2], [-4.2, 2]], [[1.5, 22], [4.2, 22]], + [[0, -26], [4.2, -26]], [[-2, 18], [-4.2, 18]], ]); +/* `roof` = laje que o patamar de topo encosta (o A* liga o topo a ela). + DESCIDA NORTE/SUL: por que existem em docs/maps/LAJES-PRACA.md */ const STAIR_CONFIGS = Object.freeze([ - { name: 'ESCADARIA', side: 1, bottomZ: -10, dirZ: 1 }, - { name: 'BECO DO VARAL', side: -1, bottomZ: 2, dirZ: 1 }, - { name: 'ACESSO SUL', side: 1, bottomZ: 22, dirZ: -1 }, + { name: 'ESCADARIA', side: 1, bottomZ: -10, dirZ: 1, roof: 'EN' }, + { name: 'BECO DO VARAL', side: -1, bottomZ: 2, dirZ: 1, roof: 'WS' }, + { name: 'ACESSO SUL', side: 1, bottomZ: 22, dirZ: -1, roof: 'SE' }, + { name: 'DESCIDA NORTE', side: 1, bottomZ: -26, dirZ: 1, roof: 'NE' }, + /* z = 18 e não 24: em 24 o pé cai em bolso que só abre ao sul e a ala oeste fica sem + subida — docs/maps/LAJES-PRACA.md */ + { name: 'DESCIDA SUL', side: -1, bottomZ: 18, dirZ: 1, roof: 'SW' }, +]); +/* NÃO acrescente escada no meio da praça: o poço de 5,9 m derruba a visada das lajes de + 62,4% para 42,9% (LV5). Tentativa medida em docs/maps/LAJES-PRACA.md */ +/* PRAÇA DO MEIO (dono, 25/08/2026: "por baixo tinha que ter uma praça no meio, ver os becos"). + Retângulo entre as lajes WS/ES (x = ∓7,4) e entre os vãos de serviço (z = −6 e 7): nenhuma + casa de beco, muro de beco ou pilastra nasce aqui, e o miolo vira sala em vez de corredor. */ +/* LITERAL de propósito: a LA5 lê o FONTE, e spread deixa a régua vendo zero escada. + Quem impede a enumeração de envelhecer é a guarda abaixo, não o formato. */ +export const LAJES_CONNECTIONS = Object.freeze([ + 'ESCADARIA', 'BECO DO VARAL', 'ACESSO SUL', 'DESCIDA NORTE', 'DESCIDA SUL', + 'ROTA DE MADEIRA OESTE', 'ROTA DE MADEIRA LESTE', ]); +for (const c of STAIR_CONFIGS) { + if (!LAJES_CONNECTIONS.includes(c.name)) throw new Error(`escada ${c.name} fora de LAJES_CONNECTIONS`); +} +/* Vão de alvenaria entre duas casas de beco: 2,2 m é a fachada do kit (1,87 m) com folga, + e leva o passo casa→casa de ~2,0 m para ~4,1 m (ESC6). */ +const VAO_ENTRE_CASAS = 2.2; +const PRACA = Object.freeze({ x0: -7.2, x1: 7.2, z0: -8.2, z1: 9.0 }); +const naPraca = (x, z, hx = 0, hz = 0) => x + hx > PRACA.x0 && x - hx < PRACA.x1 + && z + hz > PRACA.z0 && z - hz < PRACA.z1; function setSky(scene) { if (typeof document === 'undefined') { scene.background = new THREE.Color(0xb8c8d2); return; } @@ -234,8 +262,10 @@ export function buildLajes(scene, T) { const hz = Math.abs(-hxL * sn) + Math.abs(hzL * cs); const x = options.x, z = options.z; // batchHouse centraliza a Box3 exatamente no alvo const y = options.y || 0; + // `casa` marca o colisor como CASA DO KIT: é o que a ESC6 conta sem adivinhar colliders.push({ minX: x - hx, maxX: x + hx, minY: y, maxY: y + options.targetH, - minZ: z - hz, maxZ: z + hz }); + minZ: z - hz, maxZ: z + hz, casa: id, casaH: options.targetH, + casaFrente: hxL * 2, casaFundo: hzL * 2, casaRy: ry }); /* Sem proxy de bala: o occluder da casa é a PRÓPRIA malha instanciada (empurrada em build()). Caixa sólida divergia da silhueta real nos recuos e pergolados do kit — era o "bala=9 m, visível=26 m" da régua. */ @@ -358,7 +388,7 @@ export function buildLajes(scene, T) { while (clearance >= 1.6) { const pool = clearance < 3.2 ? SHALLOW_HOUSES : HOUSE_IDS; let id = pool[(index * 2 + i + (side > 0 ? 3 : 0)) % pool.length]; - let targetH = hBase + .2 + (i % 2) * .35; + let targetH = hBase; let native = HOUSE_BOUNDS[id]; let s = targetH / native[4]; const front = width / 2 + .02 + (i % 2) * .04; @@ -368,7 +398,7 @@ export function buildLajes(scene, T) { desconta a faixa livre do vizinho; +0,45 é o raio do corpo que ninguém usa). */ id = SHALLOW_HOUSES[(index + i) % SHALLOW_HOUSES.length]; native = HOUSE_BOUNDS[id]; - targetH = 4.2 + (i % 2) * .5; // raso em altura plena: feição grande, fundo curto + targetH = 2.70; // raso vira TÉRREA de um pavimento — não meio sobrado s = targetH / native[4]; } const halfAlong = (native[1] - native[0]) / 2 * s; // largura nativa: ao longo do beco @@ -377,10 +407,13 @@ export function buildLajes(scene, T) { const centro = cursor + halfAlong; const ux = a[0] + tx * centro + nx * side * (front + halfOut); const uz = a[1] + tz * centro + nz * side * (front + halfOut); - if (!tunnelPartAt(ux, uz) && !stairBandAt(ux, uz, halfAlong, halfOut) && front + halfOut * 2 <= clearance + .45) { + if (!tunnelPartAt(ux, uz) && !stairBandAt(ux, uz, halfAlong, halfOut) && !naPraca(ux, uz, halfAlong, halfOut) + && front + halfOut * 2 <= clearance + .45) { solidHouse(id, { x: ux, z: uz, targetH, ry }); placedAny = true; } else if (cursor >= 1.3 && cursor + halfAlong * 2 <= length - 1.3 + && !naPraca(a[0] + tx * centro + nx * side * (front + .01), + a[1] + tz * centro + nz * side * (front + .01), halfAlong, halfAlong) && !VANS_DE_FUGA.some((van) => Math.hypot(van.x - (a[0] + tx * centro + nx * side * (front + .01)), van.z - (a[1] + tz * centro + nz * side * (front + .01))) < van.r + 1)) { /* Slot vetado (escada/túnel/folga) longe da boca: painel de muro rente cobre o @@ -392,7 +425,22 @@ export function buildLajes(scene, T) { a[1] + tz * centro + nz * side * (front + .01), index + i); placedAny = true; } - cursor += halfAlong * 2 + .12; + /* MURO ENTRE CASAS: o passo era fachada colada em fachada e o beco lia como cerca + de torres. A casa volta a ter vizinha de muro. ESC6, KNOWN-BUGS BUG-58 */ + const vao = VAO_ENTRE_CASAS; + if (placedAny && cursor + halfAlong * 2 + vao < length - .95) { + const mx = cursor + halfAlong * 2 + vao / 2; + const px = a[0] + tx * mx + nx * side * (front + .01); + const pz = a[1] + tz * mx + nz * side * (front + .01); + if (!naPraca(px, pz, vao / 2, vao / 2) + && !VANS_DE_FUGA.some((van) => Math.hypot(van.x - px, van.z - pz) < van.r + 1)) { + const pw = Math.abs(dx) > Math.abs(dz) ? vao : .26; + const pd = Math.abs(dx) > Math.abs(dz) ? .26 : vao; + wallWithRelief(pw, 2.9 + ((index + i) % 3) * .45, pd, + (index + i) % 2 ? MAT.brick : MAT.roof, px, pz, index + i); + } + } + cursor += halfAlong * 2 + vao; i++; } /* Cada lado vira uma wallLine cortada depois (boca de ramal, túnel, esquina) — fim @@ -525,6 +573,14 @@ export function buildLajes(scene, T) { if (s1 <= span0 || s0 >= span0 + wlen) continue; cortes.push([Math.max(span0, s0), Math.min(span0 + wlen, s1)]); } + /* PRAÇA: muro de beco nenhum atravessa a sala do meio — é o corte que transforma o + zigue-zague de corredor em praça (e o que abre a visada das lajes para o térreo). */ + const perp = aoLongoX ? wcz : wcx; + if (aoLongoX ? (perp > PRACA.z0 && perp < PRACA.z1) : (perp > PRACA.x0 && perp < PRACA.x1)) { + const pa0 = aoLongoX ? PRACA.x0 : PRACA.z0, pa1 = aoLongoX ? PRACA.x1 : PRACA.z1; + const s0 = Math.max(span0, pa0), s1 = Math.min(span0 + wlen, pa1); + if (s1 > s0) cortes.push([s0, s1]); + } const emit = (from, to) => { const len = to - from; if (len < .55) return; @@ -546,6 +602,7 @@ export function buildLajes(scene, T) { for (let i = 1; i < MAIN_BECO.length - 1; i++) { const A = MAIN_BECO[i - 1], V = MAIN_BECO[i], B = MAIN_BECO[i + 1]; if (branchMouthAt.has(`${V[0]},${V[1]}`)) continue; + if (naPraca(V[0], V[1], 1.2, 1.2)) continue; // a praça não tem pilastra de esquina de beco const d1 = [V[0] - A[0], V[1] - A[1]], d2 = [B[0] - V[0], B[1] - V[1]]; const l1 = Math.hypot(d1[0], d1[1]), l2 = Math.hypot(d2[0], d2[1]); const cross = (d1[0] / l1) * (d2[1] / l2) - (d1[1] / l1) * (d2[0] / l2); @@ -634,34 +691,50 @@ export function buildLajes(scene, T) { roofGroup.add(divisa); continue; } - let cursor = -face.len / 2 + .06; // cursor = borda do slot; casa centrada no slot - while (true) { - let id = HOUSE_IDS[(roofIndex * 3 + fi) % HOUSE_IDS.length]; - let native = HOUSE_BOUNDS[id]; - const targetH = ROOF_H - .05; - let s = targetH / native[4]; - const depthLimit = (face.dx ? part.z1 - part.z0 : part.x1 - part.x0) - .12; - if ((native[3] - native[2]) * s > depthLimit) { - id = SHALLOW_HOUSES[(roofIndex + fi) % SHALLOW_HOUSES.length]; // modelo fundo atravessa o bloco - native = HOUSE_BOUNDS[id]; - s = targetH / native[4]; - } - const halfAlong = (native[1] - native[0]) / 2 * s; - const halfOut = (native[3] - native[2]) / 2 * s; - if (cursor + halfAlong * 2 > face.len / 2 - .06) break; - const centro = cursor + halfAlong; - const hx = face.cx + face.dx * centro - face.outward[0] * (halfOut - .03); - const hz = face.cz + face.dz * centro - face.outward[1] * (halfOut - .03); - const ry = face.outward[1] === -1 ? Math.PI : face.outward[1] === 1 ? 0 - : face.outward[0] === 1 ? Math.PI / 2 : -Math.PI / 2; - const hxW = face.dx ? halfAlong : halfOut, hzW = face.dx ? halfOut : halfAlong; - const invadeGap = (part.z0 > roof.z0 && hz - hzW < part.z0 + .06) - || (part.z1 < roof.z1 && hz + hzW > part.z1 - .06); - if (!invadeGap && !stairBandAt(hx, hz, hxW, hzW) && !roofAccessNear(hx, hz)) - solidHouse(id, { x: hx, z: hz, targetH, ry }); - cursor += halfAlong * 2 + .14; - fi++; + /* UMA CASA POR FACE, o resto é MURO: enfileiradas, as torres estreitas do kit + davam três por face. Números e porquê em KNOWN-BUGS BUG-58 (ESC6). */ + let id = HOUSE_IDS[(roofIndex * 3 + fi) % HOUSE_IDS.length]; + let native = HOUSE_BOUNDS[id]; + const targetH = ROOF_H - .05; + let s = targetH / native[4]; + const depthLimit = (face.dx ? part.z1 - part.z0 : part.x1 - part.x0) - .12; + if ((native[3] - native[2]) * s > depthLimit) { + id = SHALLOW_HOUSES[(roofIndex + fi) % SHALLOW_HOUSES.length]; // modelo fundo atravessa o bloco + native = HOUSE_BOUNDS[id]; + s = targetH / native[4]; + } + const halfAlong = (native[1] - native[0]) / 2 * s; + const halfOut = (native[3] - native[2]) / 2 * s; + const ry = face.outward[1] === -1 ? Math.PI : face.outward[1] === 1 ? 0 + : face.outward[0] === 1 ? Math.PI / 2 : -Math.PI / 2; + const hxW = face.dx ? halfAlong : halfOut, hzW = face.dx ? halfOut : halfAlong; + /* Descentrada por bloco: fachada sempre no meio de toda face devolve + simetria de maquete, que é o oposto de comunidade. */ + const util = face.len / 2 - .06 - halfAlong; + const terco = [0, -1, 1, -1, 1, 0][(roofIndex + fi) % 6] * util * .55; + const centro = Math.max(-util, Math.min(util, terco)); + const hx = face.cx + face.dx * centro - face.outward[0] * (halfOut - .03); + const hz = face.cz + face.dz * centro - face.outward[1] * (halfOut - .03); + const invadeGap = (part.z0 > roof.z0 && hz - hzW < part.z0 + .06) + || (part.z1 < roof.z1 && hz + hzW > part.z1 - .06); + const coube = halfAlong * 2 <= face.len - .12 + && !invadeGap && !stairBandAt(hx, hz, hxW, hzW) && !roofAccessNear(hx, hz); + if (coube) solidHouse(id, { x: hx, z: hz, targetH, ry }); + /* Muro rente no que a casa não ocupa; rente à face do proxy, para bala, + corpo e pixel seguirem concordando sobre onde a parede está. */ + for (const [a, b] of coube + ? [[-face.len / 2, centro - halfAlong], [centro + halfAlong, face.len / 2]] + : [[-face.len / 2, face.len / 2]]) { + const trecho = b - a; + if (trecho < .35) continue; + const meio = (a + b) / 2; + const mx = face.cx + face.dx * meio - face.outward[0] * .07; + const mz = face.cz + face.dz * meio - face.outward[1] * .07; + const muro = wallWithRelief(face.dx ? trecho : .14, targetH, face.dx ? .14 : trecho, + (roofIndex + fi) % 2 ? MAT.brick : MAT.plaster, mx, mz, roofIndex + fi); + roofGroup.add(muro); } + fi++; } } const slab = addBox(w, .16, d, slabMaterial, x, ROOF_H - .16, z, { collide: false, bala: true }); @@ -691,6 +764,39 @@ export function buildLajes(scene, T) { } } + /* CORREDOR DE ACESSO da boca (tábua/escada) até o miolo da laje: a abertura da platibanda + era medida em planta e prendia o bot na diagonal. LB1, docs/maps/LAJES-BOTS.md */ + const R_CORREDOR = .58; // corpo de 0,38 m + 0,20 m de folga para não sair raspando + const BOCAS = [...PLANKS, ...INTERNAL_PLANKS].flatMap((plank) => [plank.a, plank.b]) + .concat(STAIR_CONFIGS.map((config) => [config.side * 7.4, config.bottomZ])); + const corredores = BOCAS.flatMap(([px, pz]) => ROOF_PARTS + .filter((part) => !part.tunnel && px >= part.x0 - .45 && px <= part.x1 + .45 + && pz >= part.z0 - .45 && pz <= part.z1 + .45) + .map((part) => ({ ax: px, az: pz, bx: (part.x0 + part.x1) / 2, bz: (part.z0 + part.z1) / 2 }))); + const noCorredor = (x, z) => corredores.some(({ ax, az, bx, bz }) => { + const dx = bx - ax, dz = bz - az, len2 = dx * dx + dz * dz; + const t = len2 < 1e-6 ? 0 : Math.max(0, Math.min(1, ((x - ax) * dx + (z - az) * dz) / len2)); + return Math.hypot(x - (ax + dx * t), z - (az + dz * t)) < R_CORREDOR; + }); + const sobreLaje = (x, z) => ROOF_PARTS.some((part) => !part.tunnel && x >= part.x0 - .05 + && x <= part.x1 + .05 && z >= part.z0 - .05 && z <= part.z1 + .05); + /* Abre só onde há laje DOS DOIS LADOS: a 1ª versão abriu na borda sul da SE e a MAP6 pegou + (2 quedas de 5,2 m sem guarda). Trocar bot preso por jogador despencando não é conserto. */ + const LADO = .5; // meio passo do corpo: o suficiente para a borda do vão aparecer + const lajeDosDoisLados = (x, z, alongX) => sobreLaje(x + (alongX ? 0 : LADO), z + (alongX ? LADO : 0)) + && sobreLaje(x - (alongX ? 0 : LADO), z - (alongX ? LADO : 0)); + // guarda em fatias: abre só o pedaço que cai no corredor E tem laje dos dois lados + const guardaFatiado = (x0, x1, z, alongX, mat, altura = .62) => { + const passo = .66, comprimento = Math.abs(x1 - x0), n = Math.max(1, Math.round(comprimento / passo)); + for (let i = 0; i < n; i++) { + const a = x0 + (x1 - x0) * (i / n), b = x0 + (x1 - x0) * ((i + 1) / n); + const meio = (a + b) / 2; + const [mx, mz] = alongX ? [meio, z] : [z, meio]; + if (lajeDosDoisLados(mx, mz, alongX) && noCorredor(mx, mz)) continue; + addBox(alongX ? Math.abs(b - a) : .14, altura, alongX ? .14 : Math.abs(b - a), mat, mx, ROOF_H, mz); + } + }; + const plankAt = (x, z) => { for (const p of plankSurfaces) { const lx = (x - p.cx) * p.cos - (z - p.cz) * p.sin; @@ -785,14 +891,21 @@ export function buildLajes(scene, T) { fica aberta só no trecho do lance; o restante da borda e a borda oposta levam guarda. */ const chegadaZ = config.bottomZ + config.dirZ * width / 2; const opostaZ = config.bottomZ - config.dirZ * width / 2; - addBox(Math.abs(topX - outerX) + width, .62, .14, MAT.brick, topMidX, ROOF_H, opostaZ); + guardaFatiado(topMidX - (Math.abs(topX - outerX) + width) / 2, topMidX + (Math.abs(topX - outerX) + width) / 2, + opostaZ, true, MAT.brick); const livreAte = outerX + Math.sign(topX - outerX) * width / 2; const bordaAte = topX + Math.sign(topX - outerX) * width / 2; const gA = Math.min(livreAte, bordaAte), gB = Math.max(livreAte, bordaAte); - if (gB - gA > .3) addBox(gB - gA, .62, .14, MAT.brick, (gA + gB) / 2, ROOF_H, chegadaZ); + if (gB - gA > .3) guardaFatiado(gA, gB, chegadaZ, true, MAT.brick); /* Borda lateral do patamar de topo que olha o poço do primeiro lance (AT1/MAP6): sem ela, quem chega pela laje despenca 5 m na valeta entre os lances. */ addBox(.14, .62, width, MAT.brick, outerX - config.side * width / 2, ROOF_H, config.bottomZ); + /* Fecha o vão sob os lances: degrau não tem colisor, então o chão sob a escada ficava + andável e cercado (lajes-antitrap). A partir de 2,9 m o lance já passa de 1,79 m. */ + const encheZ0 = config.bottomZ + config.dirZ * 2.9, encheZ1 = config.bottomZ + config.dirZ * (run + .65); + addBox(Math.abs(outerX - innerX) + width, 1.7, Math.abs(encheZ1 - encheZ0), + wallMat(MAT.stair, Math.abs(outerX - innerX) + width, 1.7), + (innerX + outerX) / 2, 0, (encheZ0 + encheZ1) / 2, { semBala: true }); const left = Math.min(innerX, outerX) - width / 2 - .12, right = Math.max(innerX, outerX) + width / 2 + .12; /* Paredes do poço da escada são VISÍVEIS (tijolo) e PARAM 1,8 m depois do pé do lance: cruzar a faixa do ramal isolava o pé da escada num enclave de 14 células. */ @@ -805,13 +918,103 @@ export function buildLajes(scene, T) { { x: facadeX, z: config.bottomZ + config.dirZ * (run / 2 + .45), targetH: 6.45, ry: config.side > 0 ? -Math.PI / 2 : Math.PI / 2 }); return { - nome: config.name, width, + nome: config.name, width, roof: config.roof, flights: [{ steps, direction: [0, config.dirZ] }, { steps, direction: [0, -config.dirZ] }], landings: [{ x: midX, z: midZ }, { x: topMidX, z: config.bottomZ }], bottom: { x: innerX, z: config.bottomZ }, top: { x: topX, z: config.bottomZ }, topo: ROOF_H, }; }; const stairs = STAIR_CONFIGS.map(addStaircase); + /* Entre a parede do poço da DESCIDA SUL (x ≈ −3,84) e o muro oeste do beco (x ≈ −2,95) + sobrava uma fresta de 0,68 m fechada nas duas pontas — construção, não passagem. A + alvenaria une as duas paredes, que é como isso existe em obra real. */ + addBox(1.15, 2.9, 2.6, wallMat(MAT.brick, 1.15, 2.9), -3.38, 0, 21.0); + + /* PRAÇA DO MEIO — o que faz a sala LER como praça. Cover baixo de propósito: peça alta + no miolo devolve a parede cega à laje (LV5). Porquê em docs/maps/LAJES-PRACA.md */ + const MAT_PRACA = { + piso: mat({ map: concrete, color: 0x9a958c, roughness: .95 }), + pintura: mat({ color: 0xd9d4c6, roughness: .9 }), + banco: mat({ map: concrete, color: 0xc4bcae, roughness: .93 }), + folha: mat({ color: 0x4a6b39, roughness: .95, flatShading: true }), + folhaClara: mat({ color: 0x6f8f45, roughness: .93, flatShading: true }), + folhaEscura: mat({ color: 0x33502b, roughness: .96, flatShading: true }), + tronco: mat({ color: 0x5a4530, roughness: .96 }), + tinta: mat({ color: 0x2f6ea8, roughness: .85 }), + }; + const pracaCX = (PRACA.x0 + PRACA.x1) / 2, pracaCZ = (PRACA.z0 + PRACA.z1) / 2; + addFloor(PRACA.x1 - PRACA.x0, PRACA.z1 - PRACA.z0, pracaCX, pracaCZ, MAT_PRACA.piso, .012); + /* Quadra pintada: dá escala e direção à sala (o piso liso não dizia onde era o meio). */ + const risco = (w, d, x, z) => { + const m = addFloor(w, d, x, z, MAT_PRACA.pintura, .02); + m.userData.pracaRisco = true; return m; + }; + for (const [w, d, x, z] of [[7.2, .12, pracaCX, pracaCZ - 6.8], [7.2, .12, pracaCX, pracaCZ + 6.8], + [.12, 13.6, pracaCX - 3.6, pracaCZ], [.12, 13.6, pracaCX + 3.6, pracaCZ], [7.2, .12, pracaCX, pracaCZ]]) + risco(w, d, x, z); + for (let a = 0; a < 28; a++) { // círculo central da quadra + const ang = a / 28 * Math.PI * 2; + risco(.34, .12, pracaCX + Math.cos(ang) * 1.85, pracaCZ + Math.sin(ang) * 1.85); + } + /* Traves da pelada: estrutura fina, 1,15 m de travessão — não tampa a visada da laje. */ + const trave = (z) => { + for (const dx of [-2.2, 2.2]) addBox(.1, 1.15, .1, MAT_PRACA.tinta, pracaCX + dx, 0, z, { cast: true }); + addBox(4.5, .1, .1, MAT_PRACA.tinta, pracaCX, 1.15, z, { collide: false, bala: true }); + }; + trave(pracaCZ - 6.8); trave(pracaCZ + 6.8); + /* Cover da praça: peças BAIXAS espalhadas (a régua LV4 cobra ≥ 6 e espaçamento ≤ 7 m, o + mesmo teto da QUAD_ESPAC do map-check). Todas de caixa procedural — em node nenhum GLB + carrega, e cover que só existe no navegador é cover que a régua não vê (lição 3). */ + const bancoDePraca = (x, z, alongX) => { + addBox(alongX ? 2.1 : .5, .45, alongX ? .5 : 2.1, MAT_PRACA.banco, x, 0, z); + addBox(alongX ? 2.1 : .12, .38, alongX ? .12 : 2.1, MAT_PRACA.banco, x + (alongX ? 0 : .19), + .45, z + (alongX ? .19 : 0), { collide: false, bala: true }); + }; + const floreira = (x, z) => { + addBox(1.5, .62, 1.5, MAT_PRACA.banco, x, 0, z); + const tronco = new THREE.Mesh(new THREE.CylinderGeometry(.13, .17, 2.5, 8), MAT_PRACA.tronco); + tronco.position.set(x, 1.87, z); tronco.castShadow = true; root.add(tronco); + for (const [gx, gy, gz, gr, ang] of [[.28, 2.9, .1, .55, .5], [-.3, 3.05, -.15, .5, -.7]]) { + const galho = new THREE.Mesh(new THREE.CylinderGeometry(.05, .08, gr * 2, 6), MAT_PRACA.tronco); + galho.position.set(x + gx, gy, z + gz); galho.rotation.z = ang; galho.castShadow = true; root.add(galho); + } + /* Copa em massas sobrepostas com dois verdes e facetas: três bolas lisas liam como balão + de desenho na captura de 25/08 — a mangueira da praça é o único vegetal do mapa e não + pode ser o elemento mais pobre do mapa mais bonito do jogo. */ + const massas = [[0, 3.62, 0, 1.02, 'folha'], [-.78, 3.3, .46, .74, 'folhaEscura'], + [.82, 3.38, -.4, .7, 'folhaClara'], [.15, 3.1, -.85, .62, 'folhaEscura'], + [-.5, 3.05, -.55, .56, 'folha'], [.55, 3.05, .72, .58, 'folhaClara'], + [-.25, 4.12, .12, .66, 'folhaClara'], [.42, 3.92, -.3, .52, 'folha']]; + for (const [ox, oy, oz, r, tom] of massas) { + const copa = new THREE.Mesh(new THREE.IcosahedronGeometry(r, 1), MAT_PRACA[tom]); + copa.position.set(x + ox, oy, z + oz); + copa.rotation.set(ox, oz, oy * .3); // quebra a repetição do icosaedro + copa.castShadow = true; copa.userData.pracaCopa = true; root.add(copa); + } + colliders.push({ minX: x - .22, maxX: x + .22, minY: .62, maxY: 3.1, minZ: z - .22, maxZ: z + .22 }); + }; + const mesaDeBar = (x, z) => { + addBox(1.05, .74, 1.05, MAT_PRACA.tinta, x, 0, z); + for (const [dx, dz] of [[-.95, 0], [.95, 0], [0, -.95], [0, .95]]) + addBox(.42, .44, .42, MAT_PRACA.tinta, x + dx, 0, z + dz); + }; + /* Cover encostado nas BORDAS: o miolo da quadra fica limpo (é a sala que a LV3 cobra) e + quem atravessa a praça tem peça de peito ao alcance dos dois lados. */ + bancoDePraca(-1.6, -7.4, true); bancoDePraca(1.8, 8.2, true); + /* Encostar peça na face da laje (x = ∓7,4) abre nicho de uma célula entre a peça e a + parede: andável, fechado, sem volta ao spawn (lajes-antitrap). Todas ficam a ≥ 1,0 m da + face, deixando corredor de corpo rente à laje. */ + bancoDePraca(-5.8, -4.2, false); bancoDePraca(5.8, -5.6, false); + floreira(-5.7, -1.4); floreira(5.3, 7.6); + mesaDeBar(-5.6, 7.6); mesaDeBar(-3.2, -7.6); + /* Caixa d'água comunitária no chão + pilha de pneus: cover na altura do peito, nas pontas. */ + addBox(1.25, 1.28, 1.25, MAT_PRACA.tinta, 3.9, 0, -7.4); + for (let i = 0; i < 3; i++) { + const pneu = new THREE.Mesh(new THREE.TorusGeometry(.42, .16, 8, 16), MAT.charcoal); + pneu.rotation.x = Math.PI / 2; pneu.position.set(-3.6, .17 + i * .3, 8.0); + pneu.castShadow = true; pneu.userData.pracaPneu = true; root.add(pneu); + } + colliders.push({ minX: -4.18, maxX: -3.02, minY: 0, maxY: .95, minZ: 7.42, maxZ: 8.58 }); /* CHÃO MULTINÍVEL (yRef): mesma regra da Havan (map_havan.js:1632) — chão embaixo quando há pé-direito; sem yRef devolve o topo (comportamento antigo das réguas). */ @@ -855,6 +1058,12 @@ export function buildLajes(scene, T) { const roofAccessOnHorizontal = (x, z) => accessPoints.some(([px, pz]) => Math.abs(pz - z) < .1 && Math.abs(px - x) < .9); const roofAccessOnVertical = (x, z) => accessPoints.some(([px, pz]) => Math.abs(px - x) < .1 && Math.abs(pz - z) < .9); const guard = (x, z, alongX, length, index) => { + // pontas e meio: o guarda tem 0,82 m e testar só o centro passa meio trecho + const meia = length / 2; + for (const t of [-1, 0, 1]) { + const px = x + (alongX ? meia * t : 0), pz = z + (alongX ? 0 : meia * t); + if (noCorredor(px, pz) && lajeDosDoisLados(px, pz, alongX)) return; + } const key = `${x.toFixed(2)}:${z.toFixed(2)}:${alongX ? 'x' : 'z'}`; if (guardKeys.has(key)) return; guardKeys.add(key); const spawnFront = Math.abs(Math.abs(z) - 28.5) < .08; @@ -905,6 +1114,9 @@ export function buildLajes(scene, T) { perimeterRun(true, MIN_Z + .32, -HALF_X + .3, HALF_X - .3); perimeterRun(true, MAX_Z - .32, -HALF_X + .3, HALF_X - .3); + /* FUNDO DE QUINTAL (|x| > 13,3): fica aberto como sempre esteve; quem não entra é a MALHA + abaixo. Fechá-lo com divisas foi tentado e trava 97 células — docs/maps/LAJES-PRACA.md */ + const addAntenna = (x, y, z, rotation = 0) => { const group = new THREE.Group(); group.position.set(x, y, z); group.rotation.y = rotation; group.userData.rooftopDetail = 'antenna'; @@ -1011,25 +1223,8 @@ export function buildLajes(scene, T) { for (const [x, z] of [[-13.4, -10], [13.4, -2], [-13.4, 17], [13.4, 20]]) addWire([x < 0 ? -5.8 : 5.7, 9.3, z - 2], [x, 8.4, z], .7, 0); - const kiteMaterials = [MAT.kiteRed, MAT.kiteBlue, MAT.kiteYellow]; - const addKite = (x, y, z, scale, index) => { - const geometry = new THREE.BufferGeometry(); - geometry.setAttribute('position', new THREE.Float32BufferAttribute([ - 0, scale, 0, -scale * .72, 0, 0, 0, -scale * 1.08, 0, - 0, scale, 0, 0, -scale * 1.08, 0, scale * .72, 0, 0, - ], 3)); geometry.computeVertexNormals(); - const kite = new THREE.Mesh(geometry, kiteMaterials[index % kiteMaterials.length]); - kite.position.set(x, y, z); kite.rotation.set(.08 * (index % 3), .35 * index, -.12 + .04 * index); - kite.userData.skyLife = 'pipa'; root.add(kite); - const tailCurve = new THREE.CatmullRomCurve3([ - new THREE.Vector3(x, y - scale, z), new THREE.Vector3(x + .3, y - scale * 2.1, z + .15), - new THREE.Vector3(x - .15, y - scale * 3.2, z + .25), - ]); - const tail = new THREE.Mesh(new THREE.TubeGeometry(tailCurve, 8, .012, 4), MAT.woodDark); root.add(tail); - }; - const kites = [[-15, 15, -30], [-8, 18, -20], [2, 16, -25], [11, 20, -14], [17, 17, -4], - [-17, 19, 7], [-9, 14, 15], [1, 21, 7], [8, 17, 21], [15, 22, 29], [-3, 15, 34], [5, 19, 37]]; - kites.forEach((kite, i) => addKite(kite[0], kite[1], kite[2], .42 + (i % 3) * .1, i)); + /* PIPAS saíram daqui: eram 12 losangos PARADOS ("pipas nao voam", dono). Agora são GLB + com voo procedural, criadas junto da ambiência. docs/maps/LAJES-PIPA.md */ for (const [x, z] of [[-8.7, 20], [2, -30]]) { const reel = new THREE.Mesh(new THREE.CylinderGeometry(.18, .18, .34, 16), MAT.wood); reel.rotation.z = Math.PI / 2; reel.position.set(x, ROOF_H + .22, z); reel.userData.rooftopUse = 'carretel'; root.add(reel); @@ -1126,6 +1321,95 @@ export function buildLajes(scene, T) { for (let i = 1; i < MAIN_BECO.length; i++) line(MAIN_BECO[i - 1], MAIN_BECO[i]); for (const branch of BRANCHES) line(branch[0], branch[1]); + /* MALHA DE TÉRREO (docs/maps/LAJES-PRACA.md). A laje segue com o nó de CENTRO por parte: + carpetá-la foi medido e RECUSADO — derruba LS2/LV1/CTF2. docs/maps/LAJES-BOTS.md */ + const livreEm = (y, x, z, r = .45) => { + for (const c of colliders) { + if (c.minY > y + 1.4 || c.maxY < y + .25) continue; + if (x + r > c.minX && x - r < c.maxX && z + r > c.minZ && z - r < c.maxZ) { + /* Colisor GIRADO tem AABB muito maior que a peça (corrimão de 7 cm → AABB de + 6,0 × 1,7 m): o teste real é na caixa local, como no `_collideRot`. */ + if (!c.ry) return false; + const wx = x - c.cx, wz = z - c.cz; + const lx = wx * c.cos - wz * c.sin, lz = wx * c.sin + wz * c.cos; + const ex = Math.max(0, Math.abs(lx) - c.hx), ez = Math.max(0, Math.abs(lz) - c.hz); + if (ex * ex + ez * ez < r * r) return false; + } + } + return true; + }; + const terreoLivre = (x, z, r = .45) => groundHeightAt(x, z, 0) <= .55 && livreEm(0, x, z, r); + /* Vão INTEIRO, não o ponto médio: com nós a 2,0 m o médio cai fora de um muro de 0,26 m e + o grafo jura passagem onde há parede. Cobrado pela LV6 (térreo) e pela LB2 (toda camada). */ + const vaoLivreEm = (livre, ax, az, bx, bz, r) => { + const d = Math.hypot(bx - ax, bz - az), n = Math.max(1, Math.ceil(d / .35)); + for (let s = 1; s < n; s++) { + const t = s / n; + if (!livre(ax + (bx - ax) * t, az + (bz - az) * t, r)) return false; + } + return true; + }; + const vaoLivre = (ax, az, bx, bz) => vaoLivreEm(terreoLivre, ax, az, bx, bz); + const GRID = 2.0; + const gx0 = -HALF_X + 1.3, gz0 = MIN_Z + 1.3; + const gnx = Math.floor((HALF_X - 1.3 - gx0) / GRID) + 1, gnz = Math.floor((MAX_Z - 1.3 - gz0) / GRID) + 1; + const emCelula = (i, k) => [gx0 + i * GRID, gz0 + k * GRID]; + /* Uma grade por camada, mesma matemática. `pula` é o que cada camada não quer como rota. */ + const construirMalha = ({ y, livre, vao, pula }) => { + const grade = new Int32Array(gnx * gnz).fill(-1); + for (let i = 0; i < gnx; i++) for (let k = 0; k < gnz; k++) { + const [x, z] = emCelula(i, k); + if (pula && pula(x, z)) continue; + if (!livre(x, z)) continue; + const id = addNode(x, z, y); + /* `malha` distingue o nó de NAVEGAÇÃO do nó da espinha AUTORADA (beco/ramal). A + lajes-spatial mede a largura do beco escolhendo trecho reto por GRAU do nó, e a malha + muda esse grau — sem a marca ela passaria a medir a praça achando que é beco (LS4). */ + nodes[id].malha = true; + grade[i * gnz + k] = id; + } + for (let i = 0; i < gnx; i++) for (let k = 0; k < gnz; k++) { + const id = grade[i * gnz + k]; + if (id < 0) continue; + const [x, z] = emCelula(i, k); + /* Diagonal só nasce com os DOIS vizinhos ortogonais livres, senão corta quina de muro. + Sem diagonal o caminho anda em escada e infla ~10% (a LV1 mede comprimento). */ + for (const [di, dk] of [[1, 0], [0, 1], [1, 1], [1, -1]]) { + const j = i + di, l = k + dk; + if (j < 0 || j >= gnx || l < 0 || l >= gnz) continue; + const outro = grade[j * gnz + l]; + if (outro < 0) continue; + if (!vao(x, z, x + di * GRID, z + dk * GRID)) continue; + if (di && dk && (grade[j * gnz + k] < 0 || grade[i * gnz + l] < 0)) continue; + link(id, outro); + } + } + return grade; + }; + const malha = construirMalha({ y: 0, livre: terreoLivre, vao: vaoLivre, + // fundo de quintal: andável, não é rota + pula: (x, z) => Math.abs(x) > 13.3 && Math.abs(z) < 30 }); + void emCelula; + /* Costura com a linha do beco: nó de beco encosta na malha só quando o caminho entre os + dois está livre — é o que impede a aresta que fura o muro do beco. */ + const costurar = (grade, vao, alturaDoNo) => { + for (let n = 0; n < nodes.length; n++) { + if (!alturaDoNo(nodes[n]) || nodes[n].malha) continue; + const i0 = Math.round((nodes[n].x - gx0) / GRID), k0 = Math.round((nodes[n].z - gz0) / GRID); + for (let di = -1; di <= 1; di++) for (let dk = -1; dk <= 1; dk++) { + const i = i0 + di, k = k0 + dk; + if (i < 0 || i >= gnx || k < 0 || k >= gnz) continue; + const outro = grade[i * gnz + k]; + if (outro < 0 || outro === n) continue; + const [bx, bz] = emCelula(i, k); + if (Math.hypot(bx - nodes[n].x, bz - nodes[n].z) > GRID * 1.5) continue; + if (!vao(nodes[n].x, nodes[n].z, bx, bz)) continue; + link(n, outro); + } + } + }; + costurar(malha, vaoLivre, (n) => n.y <= .6); + const roofPartNodes = new Map(); for (const roof of ROOFS) roofPartNodes.set(roof.name, ROOF_PARTS.filter((part) => part.name === roof.name) .map((part) => addNode((part.x0 + part.x1) / 2, (part.z0 + part.z1) / 2, ROOF_H))); @@ -1146,30 +1430,45 @@ export function buildLajes(scene, T) { } for (const stair of stairs) { const groundNode = addNode(stair.bottom.x, stair.bottom.z, 0), topNode = addNode(stair.top.x, stair.top.z, ROOF_H); + const meus = new Set([groundNode, topNode]); let previous = groundNode; for (const config of STAIR_CONFIGS.filter((item) => item.name === stair.nome)) { const innerX = config.side * 4.6, outerX = config.side * 6.05, run = 4.2; for (let i = 1; i <= 15; i++) { const n = addNode(innerX, config.bottomZ + config.dirZ * run * i / 15, - ROOF_H / 2 * i / 15); link(previous, n); previous = n; } - const landing = addNode(outerX, config.bottomZ + config.dirZ * run, ROOF_H / 2); link(previous, landing); previous = landing; + ROOF_H / 2 * i / 15); link(previous, n); previous = n; meus.add(n); } + const landing = addNode(outerX, config.bottomZ + config.dirZ * run, ROOF_H / 2); link(previous, landing); previous = landing; meus.add(landing); for (let i = 1; i <= 15; i++) { const n = addNode(outerX, config.bottomZ + config.dirZ * run * (1 - i / 15), - ROOF_H / 2 + ROOF_H / 2 * i / 15); link(previous, n); previous = n; } + ROOF_H / 2 + ROOF_H / 2 * i / 15); link(previous, n); previous = n; meus.add(n); } } link(previous, topNode); - let closestGround = 0, gd = Infinity; - for (let i = 0; i < nodes.length; i++) if (nodes[i].y < 1) { + /* O pé entra no grafo do TÉRREO, não nos próprios degraus: o laço antigo achava o + primeiro degrau desta escada e separava chão de telhado — docs/maps/LAJES-PRACA.md */ + let ligou = 0; + for (let i = 0; i < nodes.length; i++) { + if (meus.has(i) || nodes[i].y > .6) continue; const d = Math.hypot(nodes[i].x - stair.bottom.x, nodes[i].z - stair.bottom.z); - if (d < gd) { gd = d; closestGround = i; } + if (d > GRID * 1.6) continue; + if (!vaoLivre(stair.bottom.x, stair.bottom.z, nodes[i].x, nodes[i].z)) continue; + link(groundNode, i); ligou++; + } + if (!ligou) { // falha silenciosa aqui devolve o mapa só-por-cima que o dono reprovou + console.warn(`[lajes] pé da escada ${stair.nome} não encontrou o grafo do térreo`); } - link(groundNode, closestGround); - const roofName = stair.nome === 'ESCADARIA' ? 'EN' : stair.nome === 'BECO DO VARAL' ? 'WS' : 'SE'; - link(topNode, nearestRoofNode(roofName, [stair.top.x, stair.top.z])); + /* Sem `roof` o nearestRoofNode devolve undefined e o link entra MUDO no grafo: a escada + existe no pixel e não existe para o A*. Não saber tem que custar o mesmo que errar. */ + const alvoLaje = nearestRoofNode(stair.roof, [stair.top.x, stair.top.z]); + if (alvoLaje == null) throw new Error(`escada ${stair.nome} sem laje de topo declarada (roof)`); + link(topNode, alvoLaje); } - function nearestWaypoint(x, z) { + /* NÓ MAIS PRÓXIMO EM 3D: em planta, um bot na laje recebia origem no BECO. Peso 3× em y + (5,2 m viram 15,6 m); `yRef` é opcional. LB2, docs/maps/LAJES-BOTS.md */ + const PESO_Y = 3; + function nearestWaypoint(x, z, yRef) { let best = 0, distance = Infinity; for (let i = 0; i < nodes.length; i++) { - const d = (nodes[i].x - x) ** 2 + (nodes[i].z - z) ** 2; + let d = (nodes[i].x - x) ** 2 + (nodes[i].z - z) ** 2; + if (yRef != null) d += ((nodes[i].y - yRef) * PESO_Y) ** 2; if (d < distance) { distance = d; best = i; } } return best; @@ -1191,6 +1490,8 @@ export function buildLajes(scene, T) { const path = [to]; for (let current = previous[to]; current >= 0; current = previous[current]) path.unshift(current); return path; } + /* AS QUATRO VAGAS FICAM NA LAJE: mover duas ao térreo levava o bot para baixo e reprovava + a LS1, que é contrato do mapa. Medição em docs/maps/LAJES-BOTS.md */ const spawns = { E: [-1.9, -.65, .65, 1.9].map((x) => ({ x, z: -32.3, yaw: 0 })), B: [-1.9, -.65, .65, 1.9].map((x) => ({ x, z: 32.3, yaw: Math.PI })), @@ -1242,18 +1543,34 @@ export function buildLajes(scene, T) { { mode: 'ground', pos: [-11.3, ROOF_H, -19.5], phase: 4.6 }, { mode: 'ground', pos: [10.9, ROOF_H, -2.2], phase: 5.3 }, { mode: 'ground', pos: [1.6, ROOF_H, 30.5], phase: 6.1 }, + /* Pombo de PRAÇA, no chão: junto da mesa de bar e do banco, não na laje. */ + /* z 6,4 → 4,0: em 6,4 a pomba nascia DENTRO da mesa de bar e a AR3 + reprovava o mapa inteiro. Ao lado da mesa é onde pomba de praça fica. */ + { mode: 'ground', pos: [-5.7, 0, 4.0], phase: 1.8 }, + { mode: 'ground', pos: [2.9, 0, -5.8], phase: 3.7 }, ], /* Caramelo do circuito inferior: trecho do beco [-2,10]→[-2,22], verificado livre - pelo lajes-circuito-check (LC4). Não é collider nem occluder. */ - dogs: [{ pos: [-2, 0, 12.5], to: [-2, 0, 18.5], phase: .6 }], + pelo lajes-circuito-check (LC4). Não é collider nem occluder. O segundo cruza a PRAÇA + pelo eixo da quadra — praça de comunidade sem cachorro atravessando não existe. */ + dogs: [{ pos: [-2, 0, 12.5], to: [-2, 0, 18.5], phase: .6 }, + { pos: [-4.4, 0, 2.6], to: [3.2, 0, -2.4], phase: 2.4 }], /* Gato de telhado (BUG-57): ronda a laje do churrasco, parte sul [21.2,27] */ cats: [{ pos: [-11.5, ROOF_H, 22.2], to: [-9.3, ROOF_H, 24.5], phase: 1.2 }], }); + /* Três âncoras distintas (laje norte, praça, laje sul) e altura de 26 a 38 m: de qualquer + canto vê-se uma abanando e nenhuma some atrás da outra. docs/maps/LAJES-PIPA.md */ + attachPipaSky(ambience, root, [ + { ancora: [-3.2, ROOF_H, -30.5], alt: 26, raio: 9.5, fase: .4, giro: .62 }, + { ancora: [1.8, 0, 3.4], alt: 33, raio: 12.5, fase: 2.3, giro: .48 }, + { ancora: [10.4, ROOF_H, 24.6], alt: 38, raio: 15, fase: 4.1, giro: .55 }, + ]); return { root, colliders, occluders, decalSolids: [root], groundHeightAt, spawns, sun, hemi, - pickups, ctfPoints, ambience,sound:{loops:[{src:AMB_LOOPS.funk,pos:[0,3,0],radius:60,vol:.3},{src:AMB_LOOPS.passaros,pos:[0,3,0],radius:60,vol:.2}],bioma:'favela'}, waypoints: { nodes, adj }, nearestWaypoint, findPath, - stairs: mapStairs, staircases: stairs, + pickups, ctfPoints, ambience,sound:{loops:[{src:AMB_LOOPS.funk,pos:[0,3,0],radius:60,vol:.3},{src:AMB_LOOPS.passaros,pos:[0,3,0],radius:60,vol:.2}, + /* Burburinho da PRAÇA, raio 26 contra 60: descer SOA diferente. CC0 — FONTE.md */ + {src:AMB_LOOPS.cidade,pos:[0,1.6,0.4],radius:26,vol:.16}],bioma:'favela'}, waypoints: { nodes, adj }, nearestWaypoint, findPath, + stairs: mapStairs, staircases: stairs, praca: PRACA, jumpImpulse: 5.85, levels: ROOFS.filter((roof) => roof.name !== 'MN' && roof.name !== 'MS').map((roof) => ({ nome: roof.label, x0: roof.x0 + .6, x1: roof.x1 - .6, z0: roof.z0 + .6, z1: roof.z1 - .6, diff --git a/public/models/ambient/FONTE.md b/public/models/ambient/FONTE.md index f8bcb103..981e9128 100644 --- a/public/models/ambient/FONTE.md +++ b/public/models/ambient/FONTE.md @@ -68,6 +68,16 @@ de malha skinned. `barata-urbana`. (Primeira geração bloqueada pela moderação do Mint; regenerada com prompt de "garden beetle".) +- `pipa.glb` — “Red Yellow Diamond Kite”, Mint text-to-3D, 26/08/2026 (kit de + revisão r2 do lajes, `kits-mint.json` item `lajes.pipa`). Chat: + . Registro `pipa-lajes`. + 4532 triângulos, WebP 1024, bbox 0,553 × 0,998 × 0,361 m. SEM clipe de + animação, e não precisa de um: pipa não tem parte móvel — o que se move é a + pipa inteira contra a linha esticada. O voo é procedural (`attachPipaSky`, em + `ambientlife.js`, região “PIPA NO CÉU”). Call-site: lajes, três pipas com + âncoras distintas entre 26 e 38 m. Fica FORA de `FAVELA_AMBIENCE_ASSETS`: + pipa dentro da UPA ou da Loja H seria pipa dentro do prédio. + Pipeline reproduzível: `node tools/optimize-ambient-fauna.mjs` (filtre por `quaternius_cat`/`quaternius_chicken`/`quaternius_cow` para regenerar as espécies v2.1). Referências de silhueta/procedência de medidas: diff --git a/public/models/ambient/pipa.glb b/public/models/ambient/pipa.glb new file mode 100644 index 00000000..3beb5c93 Binary files /dev/null and b/public/models/ambient/pipa.glb differ diff --git a/scratchpad/bolsao.mjs b/scratchpad/bolsao.mjs new file mode 100644 index 00000000..ad93bcfb --- /dev/null +++ b/scratchpad/bolsao.mjs @@ -0,0 +1,15 @@ +import { THREE, bootGame, initTextures } from '../tools/eval/harness.mjs'; +const g = bootGame('lajes', { textures: initTextures(), bots: 0, seed: 1 }); +const W = g.world; const p = new THREE.Vector3(); +const livre=(x,z)=>{ if(W.groundHeightAt(x,z,0)>0.55) return false; p.set(x,0,z); g._collide(p,0.38); + return Math.abs(p.x-x)<1e-3&&Math.abs(p.z-z)<1e-3; }; +for (const [cx,cz] of [[-3.4,20.9],[7.1,7.9],[-6.9,-2.9]]) { + console.log(`\n=== bolsão (${cx},${cz}) ===`); + for (let z=cz-3; z<=cz+3.01; z+=0.5) { + let row = z.toFixed(1).padStart(6); + for (let x=cx-4; x<=cx+4.01; x+=0.5) row += livre(x,z)?'.':'#'; + console.log(row + (Math.abs(z-cz)<0.26?' <':'')); + } + const hits = W.colliders.filter(c=>cx>c.minX-1&&cxc.minZ-1&&cz0.55) continue; + P.set(x,0,z); g._collide(P,0.38); + if (Math.abs(P.x-x)<1e-3&&Math.abs(P.z-z)<1e-3){const o=(k*w+i)*3;px[o]=70;px[o+1]=70;px[o+2]=72;} +} +const put=(x,z,r,gg,b)=>{const i=Math.round((x-B.minX)*S),k=Math.round((z-B.minZ)*S); + if(i<0||i>=w||k<0||k>=h)return; const o=(k*w+i)*3; px[o]=r;px[o+1]=gg;px[o+2]=b;}; +// arestas de térreo em verde +for (let a=0;a=1.6) continue; + for (const b of adj[a]){ if(b=1.6) continue; + const n=Math.ceil(Math.hypot(nodes[b].x-nodes[a].x,nodes[b].z-nodes[a].z)*S); + for(let s=0;s<=n;s++){const t=s/n; put(nodes[a].x+(nodes[b].x-nodes[a].x)*t, nodes[a].z+(nodes[b].z-nodes[a].z)*t, 60,210,90);} } } +// nós +for (const n of nodes) if (n.y<1.6) for(const [dx,dz] of [[0,0],[1,0],[0,1],[-1,0],[0,-1]]) put(n.x+dx/S,n.z+dz/S,250,220,60); +await sharp(px,{raw:{width:w,height:h,channels:3}}).png().toFile('/tmp/grafo-terreo.png'); +console.log('ok',w,h); diff --git a/scratchpad/sonda-barracos.mjs b/scratchpad/sonda-barracos.mjs new file mode 100644 index 00000000..b5b48517 --- /dev/null +++ b/scratchpad/sonda-barracos.mjs @@ -0,0 +1,18 @@ +/* "3-4 barracos onde deviam ser apenas um": casas ombro a ombro na mesma fachada. + Métrica sem depender de rumo — distância centro a centro. */ +import { bootGame, initTextures } from '../tools/eval/harness.mjs'; +const g = bootGame('lajes', { textures: initTextures(), bots: 0, seed: 1 }); +const casas = g.world.colliders.filter((c) => c.casa) + .map((c) => ({ x: (c.minX + c.maxX) / 2, z: (c.minZ + c.maxZ) / 2 })); +const OMBRO = 2.3; // abaixo disso as duas fachadas se encostam +let coladas = 0; const graus = []; +for (let i = 0; i < casas.length; i++) { + let n = 0; + for (let j = 0; j < casas.length; j++) { + if (i === j) continue; + if (Math.hypot(casas[i].x - casas[j].x, casas[i].z - casas[j].z) <= OMBRO) n++; + } + graus.push(n); if (n) coladas++; +} +console.log('casas', casas.length, '| coladas em outra (<=2,3 m):', coladas, + `(${(100 * coladas / casas.length).toFixed(0)}%)`, '| pior grau', Math.max(...graus)); diff --git a/scratchpad/sonda-bots-lajes.mjs b/scratchpad/sonda-bots-lajes.mjs new file mode 100644 index 00000000..74917f1e --- /dev/null +++ b/scratchpad/sonda-bots-lajes.mjs @@ -0,0 +1,36 @@ +/* SONDA: onde os bots do lajes realmente andam? (y por amostra, praça alcançada) */ +import { bootGame, initTextures } from '../tools/eval/harness.mjs'; + +const textures = initTextures(); +const PRACA = { x0: -7.2, x1: 7.2, z0: -8.2, z1: 9.0 }; +const DT = 1 / 60; +const SECS = parseFloat(process.argv[2] || '90'); +const CTF = process.env.SONDA_CTF === '1'; + +let totAmostras = 0, terreo = 0, praca = 0; +const botsQueDesceram = new Set(); let botsTot = 0; +for (const seed of [12345, 777, 4242]) { + const g = bootGame('lajes', { textures, bots: 4, seed, ctf: CTF }); + g.player.pos.set(0, -400, 0); g.player.hp = 1e9; g.player.alive = true; + const marca = new Map(g.bots.map((b) => [b, { desceu: false, praca: false, ymin: 99 }])); + for (let i = 0; i < Math.round(SECS / DT); i++) { + g.update(DT); + if (i % 9) continue; + for (const b of g.bots) { + if (!b.alive) continue; + totAmostras++; + const s = marca.get(b); + s.ymin = Math.min(s.ymin, b.pos.y); + if (b.pos.y < 1.6) { terreo++; s.desceu = true; } + if (b.pos.y < 1.6 && b.pos.x > PRACA.x0 && b.pos.x < PRACA.x1 && b.pos.z > PRACA.z0 && b.pos.z < PRACA.z1) { praca++; s.praca = true; } + } + } + for (const [b, s] of marca) { botsTot++; if (s.praca) botsQueDesceram.add(`${seed}:${b.name || botsTot}`); } + console.log(`seed ${seed}: ymin por bot = ${[...marca.values()].map((s) => s.ymin.toFixed(2)).join(', ')} | praca = ${[...marca.values()].map((s) => (s.praca ? 'S' : 'n')).join('')}`); +} +console.log(JSON.stringify({ + amostras: totAmostras, + fracTerreo: +(terreo / totAmostras).toFixed(3), + fracPraca: +(praca / totAmostras).toFixed(3), + botsQueChegaramNaPraca: botsQueDesceram.size, botsTot, +}, null, 1)); diff --git a/scratchpad/sonda-bots-lajes5.mjs b/scratchpad/sonda-bots-lajes5.mjs new file mode 100644 index 00000000..44d3c889 --- /dev/null +++ b/scratchpad/sonda-bots-lajes5.mjs @@ -0,0 +1,25 @@ +import { bootGame, initTextures } from '../tools/eval/harness.mjs'; +const textures = initTextures(); +const DT = 1 / 60, SECS = parseFloat(process.argv[2] || '60'); +const PRACA = { x0: -7.2, x1: 7.2, z0: -8.2, z1: 9.0 }; +let am = 0, terreo = 0, escada = 0, praca = 0, alvoTerreo = 0, alvoTot = 0, chegou = 0, botsTot = 0; +for (const seed of [12345, 777, 4242]) { + const g = bootGame('lajes', { textures, bots: 4, seed }); + g.player.pos.set(0, -400, 0); g.player.hp = 1e9; g.player.alive = true; + const N = g.world.waypoints.nodes; + const tocou = new Map(g.bots.map((b) => [b, false])); + for (let i = 0; i < Math.round(SECS / DT); i++) { + g.update(DT); + if (i % 9) continue; + for (const b of g.bots) { + if (!b.alive) continue; + am++; + if (b.pos.y < 1.6) { terreo++; if (b.pos.x > PRACA.x0 && b.pos.x < PRACA.x1 && b.pos.z > PRACA.z0 && b.pos.z < PRACA.z1) { praca++; tocou.set(b, true); } } + else if (b.pos.y < 4.6) escada++; + if (b.roamIdx !== undefined) { alvoTot++; if (N[b.roamIdx].y < 1.6) alvoTerreo++; } + } + } + for (const [, v] of tocou) { botsTot++; if (v) chegou++; } +} +console.log(JSON.stringify({ amostras: am, fracTerreo: +(terreo/am).toFixed(3), fracEscada: +(escada/am).toFixed(3), + fracPraca: +(praca/am).toFixed(3), alvosNoTerreo: +(alvoTerreo/alvoTot).toFixed(3), botsNaPraca: chegou, botsTot }, null, 1)); diff --git a/scratchpad/sonda-combate.mjs b/scratchpad/sonda-combate.mjs new file mode 100644 index 00000000..d6aebb02 --- /dev/null +++ b/scratchpad/sonda-combate.mjs @@ -0,0 +1,23 @@ +import { bootGame, initTextures } from '../tools/eval/harness.mjs'; +const textures = initTextures(); +const DT = 1 / 60, SECS = 60; +for (const mapa of ['lajes', 'escadao', 'piscina_treta', 'ferro_velho']) { + let am = 0, comAlvo = 0, path = 0, netSoma = 0, nb = 0; + for (const seed of [12345, 777]) { + const g = bootGame(mapa, { textures, bots: 4, seed }); + g.player.pos.set(0, -400, 0); g.player.hp = 1e9; g.player.alive = true; + const p0 = new Map(g.bots.map((b) => [b, { x: b.pos.x, z: b.pos.z, max: 0 }])); + for (let i = 0; i < Math.round(SECS / DT); i++) { + g.update(DT); + if (i % 9) continue; + for (const b of g.bots) { + if (!b.alive) continue; + am++; if (b.target) comAlvo++; if (b.path && b.path.length > 1) path++; + const s = p0.get(b); s.max = Math.max(s.max, Math.hypot(b.pos.x - s.x, b.pos.z - s.z)); + } + } + for (const [, s] of p0) { nb++; netSoma += s.max; } + } + console.log(mapa, 'fracComAlvo', +(comAlvo / am).toFixed(3), 'fracComRota', +(path / am).toFixed(3), + 'raio maximo medio (m)', +(netSoma / nb).toFixed(1)); +} diff --git a/scratchpad/sonda-dist-alvo.mjs b/scratchpad/sonda-dist-alvo.mjs new file mode 100644 index 00000000..b503994e --- /dev/null +++ b/scratchpad/sonda-dist-alvo.mjs @@ -0,0 +1,19 @@ +import { bootGame, initTextures } from '../tools/eval/harness.mjs'; +const textures = initTextures(); +const DT = 1 / 60; +for (const mapa of ['lajes', 'escadao', 'ferro_velho']) { + const ds = []; + for (const seed of [12345, 777]) { + const g = bootGame(mapa, { textures, bots: 4, seed }); + g.player.pos.set(0, -400, 0); g.player.hp = 1e9; g.player.alive = true; + for (let i = 0; i < Math.round(60 / DT); i++) { + g.update(DT); + if (i % 9) continue; + for (const b of g.bots) if (b.alive && b.target) ds.push(Math.hypot(b.pos.x - b.target.pos.x, b.pos.z - b.target.pos.z)); + } + } + ds.sort((a, c) => a - c); + const q = (p) => ds[Math.floor(ds.length * p)].toFixed(1); + console.log(mapa, 'n', ds.length, 'p25', q(.25), 'mediana', q(.5), 'p75', q(.75), 'p90', q(.9), + '| > 25 m:', (100 * ds.filter((d) => d > 25).length / ds.length).toFixed(0) + '%'); +} diff --git a/scratchpad/sonda-hipotese.mjs b/scratchpad/sonda-hipotese.mjs new file mode 100644 index 00000000..d33c14fe --- /dev/null +++ b/scratchpad/sonda-hipotese.mjs @@ -0,0 +1,27 @@ +/* Duas hipóteses para o raio curto do lajes: + A) combate prende (path só avança sem alvo) B) geometria confina */ +import { bootGame, initTextures } from '../tools/eval/harness.mjs'; +const textures = initTextures(); +const DT = 1 / 60, SECS = 60; +const rodar = (rotulo, mexer) => { + let nb = 0, soma = 0, am = 0, terreo = 0, escada = 0; + for (const seed of [12345, 777, 4242]) { + const g = bootGame('lajes', { textures, bots: 4, seed }); + g.player.pos.set(0, -400, 0); g.player.hp = 1e9; g.player.alive = true; + mexer(g); + const s0 = new Map(g.bots.map((b) => [b, { x: b.pos.x, z: b.pos.z, max: 0 }])); + for (let i = 0; i < Math.round(SECS / DT); i++) { + g.update(DT); + if (i % 9) continue; + for (const b of g.bots) { + if (!b.alive) continue; + am++; if (b.pos.y < 1.6) terreo++; else if (b.pos.y < 4.6) escada++; + const s = s0.get(b); s.max = Math.max(s.max, Math.hypot(b.pos.x - s.x, b.pos.z - s.z)); + } + } + for (const [, s] of s0) { nb++; soma += s.max; } + } + console.log(rotulo, 'raio', +(soma / nb).toFixed(1), 'fracTerreo', +(terreo / am).toFixed(3), 'fracEscada', +(escada / am).toFixed(3)); +}; +rodar('controle ', () => {}); +rodar('sem combate (A) ', (g) => { const f = g._updateBot.bind(g); g._updateBot = (b, dt) => { b.target = null; return f(b, dt); }; }); diff --git a/scratchpad/sonda-lajes-vertical.mjs b/scratchpad/sonda-lajes-vertical.mjs new file mode 100644 index 00000000..c9c108b3 --- /dev/null +++ b/scratchpad/sonda-lajes-vertical.mjs @@ -0,0 +1,67 @@ +/* Sonda: perfil de ALTURA das rotas separadas spawn↔bandeira no lajes. + Reproduz o CTF2 do map-check e mede, por rota, quanto do comprimento corre no térreo. */ +import { bootGame, initTextures } from '../tools/eval/harness.mjs'; + +const game = bootGame('lajes', { textures: initTextures(), bots: 0, seed: 16082026 }); +const W = game.world; +const nodes = W.waypoints.nodes, adj = W.waypoints.adj; +const SEP_ROTA = 6.0; + +const caminho = (from, to, bloq) => { + const n = nodes.length, dist = new Float64Array(n).fill(Infinity), prev = new Int32Array(n).fill(-1); + const vis = new Uint8Array(n); + if (bloq[from] || bloq[to]) return null; + dist[from] = 0; + for (;;) { + let cur = -1, bd = Infinity; + for (let i = 0; i < n; i++) if (!vis[i] && dist[i] < bd) { bd = dist[i]; cur = i; } + if (cur === -1 || cur === to) break; + vis[cur] = 1; + for (const m of adj[cur]) { + if (bloq[m]) continue; + const d = dist[cur] + Math.hypot(nodes[cur].x - nodes[m].x, nodes[cur].z - nodes[m].z); + if (d < dist[m]) { dist[m] = d; prev[m] = cur; } + } + } + if (!isFinite(dist[to])) return null; + const p = [to]; let c = prev[to]; while (c !== -1) { p.unshift(c); c = prev[c]; } + return p; +}; + +const TERREO_Y = 1.6; // abaixo disso é térreo (laje está a 5,2) +console.log('time bandeira | rota | comprimento | %térreo | classe'); +let piorTerreo = 0, paresSemTerrea = []; +for (const [team, ss] of Object.entries(W.spawns)) { + for (const p of W.ctfPoints) { + const from = W.nearestWaypoint(ss[0].x, ss[0].z), to = W.nearestWaypoint(p.x, p.z); + const bloq = new Uint8Array(nodes.length); + const classes = []; + for (let k = 0; k < 4; k++) { + const cam = caminho(from, to, bloq); + if (!cam) break; + let total = 0, terreo = 0; + for (let i = 1; i < cam.length; i++) { + const A = nodes[cam[i - 1]], B = nodes[cam[i]]; + const seg = Math.hypot(B.x - A.x, B.z - A.z); + total += seg; + if ((A.y + B.y) / 2 < TERREO_Y) terreo += seg; + } + const frac = total ? terreo / total : 0; + const classe = frac >= .5 ? 'TÉRREA' : frac <= .2 ? 'SUPERIOR' : 'mista'; + classes.push(classe); + console.log(`${team} ${p.id} | ${k + 1} | ${total.toFixed(1)}m | ${(frac * 100).toFixed(0)}% | ${classe}`); + const RAIO_PONTA = SEP_ROTA + 3.4, pA = nodes[from], pB = nodes[to]; + for (let i = 0; i < nodes.length; i++) { + if (i === from || i === to) continue; + if (Math.hypot(nodes[i].x - pA.x, nodes[i].z - pA.z) <= RAIO_PONTA) continue; + if (Math.hypot(nodes[i].x - pB.x, nodes[i].z - pB.z) <= RAIO_PONTA) continue; + for (const c2 of cam) if (Math.hypot(nodes[i].x - nodes[c2].x, nodes[i].z - nodes[c2].z) <= SEP_ROTA) { bloq[i] = 1; break; } + } + } + if (!classes.includes('TÉRREA')) paresSemTerrea.push(`${team}→${p.id}`); + piorTerreo = Math.max(piorTerreo, 0); + } +} +console.log('\nPares spawn↔bandeira SEM nenhuma rota térrea:', paresSemTerrea.length, paresSemTerrea.join(', ')); +const yTerreo = nodes.filter((n) => n.y < TERREO_Y).length; +console.log(`nós do grafo: ${nodes.length} total, ${yTerreo} no térreo (${(yTerreo / nodes.length * 100).toFixed(0)}%)`); diff --git a/scratchpad/sonda-miolo.mjs b/scratchpad/sonda-miolo.mjs new file mode 100644 index 00000000..3cf6f181 --- /dev/null +++ b/scratchpad/sonda-miolo.mjs @@ -0,0 +1,12 @@ +import { THREE, bootGame, initTextures } from '../tools/eval/harness.mjs'; +const game = bootGame('lajes', { textures: initTextures(), bots: 0, seed: 1 }); +const W = game.world; const p = new THREE.Vector3(); +const livre = (x,z) => { if (W.groundHeightAt(x,z,0) > .55) return false; p.set(x,0,z); game._collide(p,.38); + return Math.abs(p.x-x)<1e-3 && Math.abs(p.z-z)<1e-3; }; +console.log('MIOLO x de -9 a 9, z de -14 a 13 (passo 0.5). "." livre "#" bloqueado'); +let head=' '; for (let x=-9;x<=9.01;x+=0.5) head += (Math.abs(x%3)<0.01? (x<0?'-':'+') : ' '); console.log(head); +for (let z=-14; z<=13.01; z+=0.5) { + let row = String(z.toFixed(1)).padStart(6); + for (let x=-9; x<=9.01; x+=0.5) row += livre(x,z) ? '.' : '#'; + console.log(row); +} diff --git a/scratchpad/sonda-raio.mjs b/scratchpad/sonda-raio.mjs new file mode 100644 index 00000000..b0f057e1 --- /dev/null +++ b/scratchpad/sonda-raio.mjs @@ -0,0 +1,26 @@ +import { bootGame, initTextures } from '../tools/eval/harness.mjs'; +const textures = initTextures(); +const DT = 1 / 60, SECS = 60; +const mapas = process.argv[2] ? [process.argv[2]] : ['lajes']; +for (const mapa of mapas) { + let nb = 0, soma = 0, am = 0, terreo = 0, escada = 0, praca = 0; + for (const seed of [12345, 777, 4242]) { + const g = bootGame(mapa, { textures, bots: 4, seed }); + g.player.pos.set(0, -400, 0); g.player.hp = 1e9; g.player.alive = true; + const s0 = new Map(g.bots.map((b) => [b, { x: b.pos.x, z: b.pos.z, max: 0 }])); + for (let i = 0; i < Math.round(SECS / DT); i++) { + g.update(DT); + if (i % 9) continue; + for (const b of g.bots) { + if (!b.alive) continue; + am++; + if (b.pos.y < 1.6) { terreo++; if (Math.abs(b.pos.x) < 7.2 && b.pos.z > -8.2 && b.pos.z < 9) praca++; } + else if (b.pos.y < 4.6) escada++; + const s = s0.get(b); s.max = Math.max(s.max, Math.hypot(b.pos.x - s.x, b.pos.z - s.z)); + } + } + for (const [, s] of s0) { nb++; soma += s.max; } + } + console.log(mapa, 'raio', +(soma / nb).toFixed(1), 'fracTerreo', +(terreo / am).toFixed(3), + 'fracEscada', +(escada / am).toFixed(3), 'fracPraca', +(praca / am).toFixed(3)); +} diff --git a/scratchpad/tracado2.mjs b/scratchpad/tracado2.mjs new file mode 100644 index 00000000..392506d3 --- /dev/null +++ b/scratchpad/tracado2.mjs @@ -0,0 +1,13 @@ +import { bootGame, initTextures } from '../tools/eval/harness.mjs'; +import { caminhoBloqueado } from '../tools/eval/rotas-separadas.mjs'; +const g = bootGame('lajes', { textures: initTextures(), bots: 0, seed: 1 }); +const W = g.world, nodes = W.waypoints.nodes, adj = W.waypoints.adj; +const bloq = new Uint8Array(nodes.length); +for (let i=0;i=1.6 && Math.abs(nodes[i].z)<=13) bloq[i]=1; +for (const [nome, sx,sz, fx,fz] of [['B->R',0,32.3,-10.2,-23.5],['E->B',0,-32.3,10.2,15.5]]) { + const cam = caminhoBloqueado(nodes,adj,W.nearestWaypoint(sx,sz),W.nearestWaypoint(fx,fz),bloq); + let L=0; const marcos=[]; + for(let i=1;i a.startsWith('--mutante=')) || '').split('=')[1] || null; +const MUTANTES = new Set([null, 'porta-ana', 'piso-gigante', 'puxadinho-alto', 'palafita-alta', 'escala2x', 'barracada']); +if (!MUTANTES.has(mutante)) throw new Error(`mutante desconhecido: ${mutante}`); const PORTA_MIN = 2.00, PORTA_MAX = 2.20; // altura de porta de casa (BUG-55) const PE_MIN = 2.40, PE_MAX = 2.80; // pé-direito de barraco 1 pavimento (BUG-55) @@ -164,6 +178,39 @@ console.log(`barracos de muro: ${puxadinhos.length} (ok ${puxOk.length}) · altu console.log(`palafitas: ${palafitas.length} (ok ${palOk.length}) · corpos: ${[...new Set(palafitas.map((c) => Math.round((c.maxY - c.minY) * 100) / 100))].map(fmt).join(' · ')} m`); console.log(`props: ${propEscala.length} colocados, ${propsOk.length} na faixa real${propEscala.length ? ' · ' + [...new Set(propEscala.map((p) => `${p.id}=${fmt(p.h)}m`))].join(' · ') : ''}`); +/* ---- ESC6: aglomeração de barraco no LAJES (outro mapa, mesmo conceito de escala) ---- */ +const jogoLajes = bootGame('lajes', { textures: initTextures(), ctf: true, seed: 26082026 }); +const casasLajes = jogoLajes.world.colliders.filter((c) => c.casa); +if (mutante === 'barracada') { + /* Repõe o defeito: mais duas casas coladas em cada casa existente, que é exatamente o + enfileiramento que esta rodada tirou. Mexe no MUNDO (a lista de colisores que a régua + lê), não no número medido. */ + for (const c of [...casasLajes]) for (const passo of [1, 2]) { + const largo = c.maxX - c.minX < c.maxZ - c.minZ; + const d = (largo ? c.maxX - c.minX : c.maxZ - c.minZ) + .14; + casasLajes.push({ ...c, + minX: c.minX + (largo ? d * passo : 0), maxX: c.maxX + (largo ? d * passo : 0), + minZ: c.minZ + (largo ? 0 : d * passo), maxZ: c.maxZ + (largo ? 0 : d * passo) }); + } +} +/* Célula de 6 m: é a face de um bloco de laje deste mapa (5,8 m) arredondada — a unidade em + que o olho conta "quantas casas tem ali". O TETO de 4 sai da geometria, não do gosto: uma + célula de 6 m cabe um bloco de laje, e um bloco tem QUATRO faces. Uma casa por face é o + desenho pretendido; a quinta casa da célula é necessariamente uma fila na mesma fachada, + que é o defeito que o dono nomeou. Medido: 7 no pior caso antes, 4 depois. */ +const CELULA = 6, CASAS_POR_CELULA = 4; +const porCelula = new Map(); +for (const c of casasLajes) { + const k = `${Math.round((c.minX + c.maxX) / 2 / CELULA)}:${Math.round((c.minZ + c.maxZ) / 2 / CELULA)}`; + porCelula.set(k, (porCelula.get(k) || 0) + 1); +} +const amontoadas = [...porCelula.values()].filter((n) => n > CASAS_POR_CELULA); +const piorCelula = porCelula.size ? Math.max(...porCelula.values()) : 0; +const peLajes = casasLajes.map((c) => c.casaH / Math.max(1, Math.round(c.casaH / 2.7))); +const peForaDaFaixa = peLajes.filter((h) => h < PE_MIN || h > PE_MAX).length; +console.log(`lajes: ${casasLajes.length} casas de kit · pior célula de ${CELULA} m: ${piorCelula} casas` + + ` · ${amontoadas.length} célula(s) acima de ${CASAS_POR_CELULA} · pé-direito fora da faixa: ${peForaDaFaixa}`); + const checks = [ ['ESC1 toda casa tem porta 2,00–2,20 m no térreo (base ≤ 0,15 m)', malhasVao.length > 0 && portas.length >= 15 && portasOk.length === portas.length, @@ -185,6 +232,10 @@ const checks = [ propEscala.length >= 15 && propsOk.length === propEscala.length, propEscala.length < 15 ? 'registro propEscala ausente/curto — régua sem alvo' : `${propsOk.length}/${propEscala.length} na faixa`], + [`ESC6 barraco do lajes: no máximo ${CASAS_POR_CELULA} casas por célula de ${CELULA} m e pé-direito 2,40–2,80 m`, + casasLajes.length >= 30 && amontoadas.length === 0 && peForaDaFaixa === 0, + casasLajes.length < 30 ? `${casasLajes.length} casas marcadas — filtro perdeu o alvo (falta \`casa\` no colisor?)` : + `pior célula ${piorCelula} · ${amontoadas.length} amontoada(s) · ${peForaDaFaixa} fora da faixa de pé-direito`], ]; let falhas = 0; diff --git a/tools/eval/lajes-bots-check.mjs b/tools/eval/lajes-bots-check.mjs new file mode 100644 index 00000000..fceeec34 --- /dev/null +++ b/tools/eval/lajes-bots-check.mjs @@ -0,0 +1,214 @@ +/* LAJES — BOTS: o mapa é jogado, ou só o telhado do spawn é? + + DEFEITO DE ORIGEM (dono, 26/08/2026): "os bots ficam so no respawn em cima e nao tentam + circular pelo mapa embaixo tambem". O portão estava inteiro verde: a LV1 já provava que + existe rota POR BAIXO entre spawn e bandeira, e a LV6 já provava que toda aresta de + TÉRREO é andável. Nenhuma das duas olha para o bot. Medido na sonda de 26/08 (harness + real, 3 sementes × 60 s × 7 bots): 21 de 21 bots com ymin = 5,20 m — nenhum pisou no + chão a partida inteira —, 0% de amostra no térreo e 0% em escada. + + As três causas, cada uma medida antes de ser consertada: + 1. TÁBUA COM CORRIMÃO ERA ARMADILHA. O guarda-corpo da tábua é um colisor GIRADO de + 7 cm; a grade de navegação testava só a AABB dele, que para a tábua diagonal CN-NE + mede 6,0 × 1,7 m. O bot saía do convés, encostava no corrimão e moía ali o resto da + partida (medido: preso em (−6,97 / −26,67) de t = 6 s a t = 34 s). + 2. NÓ MAIS PRÓXIMO EM PLANTA, NUM MAPA DE DUAS CAMADAS. `nearestWaypoint(x, z)` ignorava + y: a projeção de um bot na laje cai sobre um nó de BECO, então o A* recebia origem no + térreo e o bot "seguia" uma rota de chão andando pelo telhado. + 3. LAJE COM UM NÓ POR TELHADO. A camada de cima tinha o CENTRO de cada parte e nada + mais; sair da tábua para o centro era uma reta que raspava a platibanda na quina. + + O QUE ESTA RÉGUA COBRA (e o que ela deliberadamente NÃO cobra): + LB1 TODA aresta do grafo — em QUALQUER camada — é andável de ponta a ponta pelo corpo + do jogo. É a LV6 promovida para o mapa inteiro: a LV6 só olha aresta de térreo + (`nodes[a].y >= Y_TERREO` → continue) e por construção era cega para as 4 arestas + de laje que prendiam o bot. Mesmo instrumento da LV6 — `_collide` de produção com + o raio do jogador —, porque régua e jogo têm que rodar no mesmo mundo (lição 3). + LB2 ORIGEM DE ROTA NA CAMADA CERTA: para um ponto na laje, `nearestWaypoint` devolve nó + de laje; para um ponto no térreo, nó de térreo. Sem isso o A* responde a pergunta + errada e nenhuma rota do mapa vale. + CLÁUSULA QUE NÃO ENTROU, e por que está escrita aqui em vez de apagada. A primeira versão + tinha uma LB3 — "o bot simulado põe pé no térreo" —, que é literalmente o pedido do dono. + Ela foi MEDIDA no estado ANTERIOR a esta rodada e nasceu VERDE: com o combate suprimido, o + bot já descia antes (7,2% das amostras no térreo, 6 de 21 bots). Uma cláusula que já + passava antes do conserto não prova conserto nenhum, e cláusula que não morde é pior que + cláusula ausente — ela dá por resolvido o que continua aberto. Com o combate LIGADO, que é + como o dono joga, o número é 0,0% antes e 1,4% depois: melhora, mas o que manda ali é o + BUG-75 abaixo, não o grafo. Os dois números ficam IMPRESSOS em toda execução, sem + cláusula, até que alguém ataque a causa de verdade. + + O QUE ELA NÃO COBRA, e por que isso está escrito aqui e não escondido: + O raio de exploração do bot no lajes é 15,1 m contra 23,2 m (escadão), 23,0 m + (piscinão) e 38,5 m (ferro velho) — medido com o mesmo harness. A causa NÃO é o grafo, + que esta rodada consertou: com o combate desligado no mesmo mapa e no mesmo grafo o + raio vai a 41,8 m e a escada finalmente aparece (1,1% das amostras). A causa é que no + lajes 100% dos engajamentos acontecem acima de 25 m, com mediana de 49,6 m (escadão + 19,0 m, ferro velho 18,6 m): as duas lajes de spawn se enxergam por um corredor de ar + de 60 m sobre o miolo, e `_updateBot` não avança rota nenhuma enquanto `b.target` + existe (game.js, ramo `else` do roam). O bot não precisa andar para atirar, então não + anda. Consertar isso é redesenhar a visada do telhado ou mexer na IA de combate de + TODOS os mapas — nenhuma das duas cabe nesta frente. O número fica IMPRESSO abaixo em + toda execução, para não passar por resolvido. Ver KNOWN-BUGS (BUG-75). + + REPRODUZ: node tools/eval/lajes-bots-check.mjs + MUTAÇÕES (cada uma morde a sua cláusula): + --mutante=aresta-fantasma-laje liga dois nós de LAJE através da platibanda → LB1 + --mutante=planta-2d nearestWaypoint volta a ignorar y → LB2 + --mutante=porta-fechada guarda de patamar de volta atravessando a boca de + acesso da laje (o defeito original) → LB1 +*/ +import { THREE, bootGame, initTextures } from './harness.mjs'; + +const mutante = (process.argv.find((a) => a.startsWith('--mutante=')) || '').split('=')[1] || ''; +const conhecidos = new Set(['', 'aresta-fantasma-laje', 'planta-2d', 'porta-fechada']); +if (!conhecidos.has(mutante)) throw new Error(`mutante desconhecido: ${mutante}`); + +const ROOF_H = 5.2; +const Y_TERREO = 1.6; // mesma fronteira da LV1/LV6: a laje do lajes está a 5,2 m +const CORPO = .38; // raio do jogador no `_collide` (game.js) +const SEMENTES = [12345, 777, 4242]; +const SEGUNDOS = 60, DT = 1 / 60, AMOSTRA = 9; + +const textures = initTextures(); +const game = bootGame('lajes', { textures, bots: 0, seed: 1 }); +const W = game.world, nodes = W.waypoints.nodes, adj = W.waypoints.adj; + +/* ===================== LB1 — toda aresta é andável, em toda camada ===================== */ +const p = new THREE.Vector3(); +function andavel(n, x = n.x, z = n.z, y = n.y) { + p.set(x, y, z); game._collide(p, CORPO); + return Math.hypot(p.x - x, p.z - z) < 1e-3; +} +function vaoAndavel(A, B) { + const d = Math.hypot(B.x - A.x, B.z - A.z), y = Math.min(A.y, B.y); + const passos = Math.max(1, Math.ceil(d / .3)); // < a parede mais fina que colide (0,14 m) + for (let s = 1; s < passos; s++) { + const t = s / passos; + if (!andavel(A, A.x + (B.x - A.x) * t, A.z + (B.z - A.z) * t, y)) return false; + } + return true; +} + +/* Repõe o guarda de patamar que esta rodada abriu na boca de acesso das lajes: uma parede de + 0,62 m atravessando o corredor por onde se sai da tábua para o miolo do telhado. É o + defeito original, plantado de volta no MUNDO (colisor), não no grafo. */ +function fecharPorta(g) { + let postos = 0; + for (const [x0, x1, z] of [[7.4, 8.04, -26.64], [7.4, 8.04, -9.36], [7.4, 8.04, 22.64]]) { + g.world.colliders.push({ minX: x0, maxX: x1, minY: ROOF_H_MUT, maxY: ROOF_H_MUT + .62, minZ: z - .07, maxZ: z + .07 }); + postos++; + } + if (!postos) throw new Error('MUTANTE NÃO APLICOU: nenhuma porta de laje para fechar'); +} +const ROOF_H_MUT = 5.2; +if (mutante === 'porta-fechada') fecharPorta(game); +if (mutante === 'aresta-fantasma-laje') { + /* Liga dois nós de LAJE separados pela platibanda da borda (o defeito da classe que esta + rodada consertou, plantado de novo). Pontas em sólido não servem: a LB1 pula ponta em + sólido de propósito (isso é outra régua), e um mutante que cai nessa peneira parece + mutante que passou. */ + let ligou = 0; + for (let a = 0; a < nodes.length && !ligou; a++) { + if (nodes[a].y < Y_TERREO) continue; + for (let b = a + 1; b < nodes.length; b++) { + if (nodes[b].y < Y_TERREO || adj[a].includes(b)) continue; + if (Math.abs(nodes[a].y - nodes[b].y) > .1) continue; + const d = Math.hypot(nodes[b].x - nodes[a].x, nodes[b].z - nodes[a].z); + if (d < 1.5 || d > 5) continue; + if (!andavel(nodes[a]) || !andavel(nodes[b])) continue; + if (vaoAndavel(nodes[a], nodes[b])) continue; // já passava: não é fantasma + adj[a].push(b); adj[b].push(a); ligou = 1; break; + } + } + if (!ligou) throw new Error('MUTANTE NÃO APLICOU: não achei par de nós de laje separados por sólido'); +} + +const ruins = []; +let arestas = 0, arestasLaje = 0; +for (let a = 0; a < nodes.length; a++) for (const b of adj[a]) { + if (b <= a) continue; + arestas++; + if (nodes[a].y >= Y_TERREO && nodes[b].y >= Y_TERREO) arestasLaje++; + const A = nodes[a], B = nodes[b]; + if (!andavel(A) || !andavel(B)) continue; // ponta em sólido é outra régua (LC5) + if (!vaoAndavel(A, B)) ruins.push(`${A.x.toFixed(1)},${A.y.toFixed(1)},${A.z.toFixed(1)} → ${B.x.toFixed(1)},${B.y.toFixed(1)},${B.z.toFixed(1)}`); +} +const lb1 = ruins.length === 0; +console.log(`${lb1 ? '✓' : '✗'} LB1 aresta andável em toda camada: ${ruins.length} bloqueada(s) de ${arestas} (${arestasLaje} em laje)`); +for (const r of ruins.slice(0, 8)) console.log(` ${r}`); + +/* ===================== LB2 — origem de rota na camada certa ===================== */ +const nearest = mutante === 'planta-2d' + ? (x, z) => W.nearestWaypoint(x, z) // o comportamento antigo, em planta + : (x, z, y) => W.nearestWaypoint(x, z, y); +/* Amostra nos DOIS andares sobre o mesmo XZ: é exatamente onde a planta erra. Só conta + ponto que o mapa entrega como piso naquela camada (senão a pergunta não existe). */ +let consultas = 0, camadaCerta = 0; +for (let x = -13; x <= 13; x += 1.5) for (let z = -37; z <= 37; z += 2.5) { + for (const [y, alvoLaje] of [[0, false], [ROOF_H, true]]) { + if (Math.abs(W.groundHeightAt(x, z, alvoLaje ? 1e3 : 0) - y) > .12) continue; + if (!andavel({ x, y, z }, x, z, y)) continue; + consultas++; + if ((nodes[nearest(x, z, y)].y >= Y_TERREO) === alvoLaje) camadaCerta++; + } +} +const fracCamada = consultas ? camadaCerta / consultas : 0; +const lb2 = consultas > 100 && fracCamada >= .97; +console.log(`${lb2 ? '✓' : '✗'} LB2 origem de rota na camada certa: ${(100 * fracCamada).toFixed(1)}% de ${consultas} consultas (mín 97%)`); + +/* ============ MEDIDA SEM CLÁUSULA — o mapa é jogado ou só o telhado do spawn? ============ */ +const PRACA = { x0: -7.2, x1: 7.2, z0: -8.2, z1: 9.0 }; +function simular({ combate }) { + let amostras = 0, noTerreo = 0, emEscada = 0, botsTot = 0, desceram = 0, naPraca = 0, raio = 0; + const distAlvo = []; + for (const semente of SEMENTES) { + const g = bootGame('lajes', { textures, bots: 4, seed: semente }); + if (mutante === 'porta-fechada') fecharPorta(g); + if (!combate) { + /* Não é "desligar o bot": é tirar o ALVO do caminho. Todo o resto — roam, A*, rota, + colisão, escada — continua sendo o código de produção. */ + const original = g._updateBot.bind(g); + g._updateBot = (b, dt) => { b.target = null; return original(b, dt); }; + } + g.player.pos.set(0, -400, 0); g.player.hp = 1e9; g.player.alive = true; + const marca = new Map(g.bots.map((b) => [b, { x: b.pos.x, z: b.pos.z, max: 0, desceu: false, praca: false }])); + for (let i = 0; i < Math.round(SEGUNDOS / DT); i++) { + g.update(DT); + if (i % AMOSTRA) continue; + for (const b of g.bots) { + if (!b.alive) continue; + amostras++; + const s2 = marca.get(b); + if (b.pos.y < Y_TERREO) { + noTerreo++; s2.desceu = true; + if (b.pos.x > PRACA.x0 && b.pos.x < PRACA.x1 && b.pos.z > PRACA.z0 && b.pos.z < PRACA.z1) s2.praca = true; + } else if (b.pos.y < ROOF_H - .6) emEscada++; + if (b.target) distAlvo.push(Math.hypot(b.pos.x - b.target.pos.x, b.pos.z - b.target.pos.z)); + s2.max = Math.max(s2.max, Math.hypot(b.pos.x - s2.x, b.pos.z - s2.z)); + } + } + for (const [, s2] of marca) { botsTot++; raio += s2.max; if (s2.desceu) desceram++; if (s2.praca) naPraca++; } + } + distAlvo.sort((a, b) => a - b); + return { fracTerreo: noTerreo / amostras, fracEscada: emEscada / amostras, botsTot, desceram, naPraca, + raio: raio / botsTot, medianaAlvo: distAlvo.length ? distAlvo[distAlvo.length >> 1] : NaN }; +} + +/* Os DOIS lados do mesmo mapa, impressos lado a lado (BUG-75). Sem combate mede-se o que + esta frente constrói — grafo, rota, escada. Com combate mede-se o que o dono vê. A + distância entre os dois números É o defeito em aberto, e ele fica visível em toda + execução para não passar por resolvido. */ +const nav = simular({ combate: false }); +console.log(`· MEDIDA navegação (combate suprimido): térreo ${(100 * nav.fracTerreo).toFixed(1)}%` + + ` · escada ${(100 * nav.fracEscada).toFixed(2)}% · ${nav.desceram}/${nav.botsTot} bots no chão` + + ` · ${nav.naPraca}/${nav.botsTot} na praça · raio ${nav.raio.toFixed(1)} m`); +const real = simular({ combate: true }); +console.log(`· MEDIDA partida real (combate ligado): térreo ${(100 * real.fracTerreo).toFixed(1)}%` + + ` · escada ${(100 * real.fracEscada).toFixed(2)}% · ${real.desceram}/${real.botsTot} bots no chão` + + ` · raio ${real.raio.toFixed(1)} m (escadão 23,2 · piscinão 23,0 · ferro velho 38,5)` + + ` · engajamento mediano ${real.medianaAlvo.toFixed(1)} m (escadão 19,0) — BUG-75, SEM CLÁUSULA`); + +const falhas = [lb1, lb2].filter((ok) => !ok).length; +if (falhas) { console.error(`LAJES-BOTS FALHA: ${falhas}/2`); process.exitCode = 1; } +else if (mutante) { console.error(`MUTANTE ${mutante} sobreviveu`); process.exitCode = 1; } +else console.log('LAJES-BOTS OK'); diff --git a/tools/eval/lajes-evidence-capture.mjs b/tools/eval/lajes-evidence-capture.mjs index 201b27b0..6b4287a0 100644 --- a/tools/eval/lajes-evidence-capture.mjs +++ b/tools/eval/lajes-evidence-capture.mjs @@ -37,6 +37,14 @@ const POSES = [ ['empilhamento-do-chao', -14.2, 0, -12, -Math.PI / 2 + 0.5, 0.30], ['empilhamento-do-chao-2', 1.5, 0, 30.5, 0.35, 0.32], ['circuito-cachorro', -2, 0, 9.5, Math.PI, 0.06], + /* Rodada da PRAÇA (dono, 25/08/2026: "por baixo tinha que ter uma praça no meio, ver os + becos e jogar cima contra baixo"). As quatro primeiras são o antes×depois do pedido. */ + ['praca-do-chao-norte', 0, 0, 5.0, 0, 0.0], + ['praca-do-chao-sul', 0, 0, -6.0, Math.PI, 0.0], + ['praca-da-laje-oeste', -8.0, 5.2, 0.4, -Math.PI / 2, -0.30], + ['praca-da-laje-leste', 8.0, 5.2, 0.4, Math.PI / 2, -0.30], + ['descida-spawn-norte', 0, 5.2, -29.4, Math.PI, -0.22], + ['descida-spawn-sul', 0, 5.2, 29.4, 0, -0.22], ]; const gRoot = execSync('npm root -g').toString().trim(); @@ -56,6 +64,18 @@ for (let att = 0; att < 3; att++) { try { await page.goto(`${BASE}/?debug=1&auto=P,mst&map=lajes`, { waitUntil: 'domcontentloaded', timeout: 120000 }); break; } catch (e) { console.log('goto retry', att); if (att === 2) throw e; } } await page.waitForFunction(() => window.__game && window.__game.state === 'live', null, { timeout: 300000 }); +/* O mapa servido TEM que ser o lajes. Em 25/08/2026 esta captura rodou inteira contra um + servidor velho de outra sessão, que ainda registrava o id ANTIGO do lajes (o do rename de + 11/08, ver ALIAS_MAPA em maps.js): `?map=lajes` caiu no DEFAULT_MAP e as 26 fotos saíram + do mapa errado com "DONE" no fim. Evidência de mapa errado é pior que evidência nenhuma — + aqui ela custa erro (lição 5). O id antigo não é citado literalmente porque a M1 do + mapa-id-check varre `tools/` como código vivo. */ +const mapaServido = await page.evaluate(() => window.__game._mapId); +if (mapaServido !== 'lajes') { + await browser.close(); + throw new Error(`SERVIDOR ERRADO: ?map=lajes carregou "${mapaServido}". ` + + `Confira se ${BASE} é o SEU dev server (outra sessão pode estar segurando a porta).`); +} await page.waitForTimeout(800); await page.evaluate(() => { const g = window.__game; diff --git a/tools/eval/lajes-spatial-check.mjs b/tools/eval/lajes-spatial-check.mjs index 8a38d187..7e98fa99 100644 --- a/tools/eval/lajes-spatial-check.mjs +++ b/tools/eval/lajes-spatial-check.mjs @@ -149,10 +149,16 @@ const probeWall = (x, z, nx, nz, y, sign) => { duplo) a sonda perpendicular corre corredor adentro e lê 8-12 m de "largura" fantasma. A largura do contrato (FONTE.md) mede TRECHO entre curvas. Filtro de instrumento: nó de grau ≥ 3 no térreo é junção; a aresta perto dele não entra na amostra. Teto intacto. */ +/* A LS4 mede a ESPINHA AUTORADA (beco + ramais), não a malha de navegação do térreo. A malha + é auxílio de A* espalhado pelo chão livre: ela muda o grau dos nós e, sem este filtro, o + seletor "trecho reto de grau 2" passava a cair na praça e a medir 2,01 m de "beco" (p50 + estourando o teto de 1,90 m) — instrumento medindo outra coisa, não beco alargado. */ +const espinha = (i) => nodes[i] && nodes[i].y < 1 && !nodes[i].malha; +const adjE = (i) => (adj[i] || []).filter(espinha); const juncoes = new Set(); for (let i = 0; i < nodes.length; i++) { - if (nodes[i].y >= 1) continue; - const viz = (adj[i] || []).filter((n) => nodes[n]?.y < 1); + if (!espinha(i)) continue; + const viz = adjE(i); if (viz.length >= 3) { juncoes.add(i); continue; } if (viz.length === 2) { // cotovelo: trecho mede corredor reto, não a praça da curva const A = nodes[viz[0]], B = nodes[viz[1]], C = nodes[i]; @@ -161,17 +167,22 @@ for (let i = 0; i < nodes.length; i++) { if (dot > -0.85) juncoes.add(i); } } +/* A PRAÇA não é beco: o trecho da espinha que a atravessa é reto e sem parede lateral, e a + sonda perpendicular lê a sala inteira (11,16 m de "largura de beco" no p90). O retângulo vem + do MAPA (W.praca), não de número escrito à mão aqui. */ +const naPraca = (x, z) => W.praca && x > W.praca.x0 - 1 && x < W.praca.x1 + 1 + && z > W.praca.z0 - 1 && z < W.praca.z1 + 1; const pertoDeJuncao = (x, z) => { for (const j of juncoes) if (Math.hypot(nodes[j].x - x, nodes[j].z - z) < 2.0) return true; return false; }; for (let a = 0; a < nodes.length; a++) for (const b of adj[a] || []) { - if (b <= a || nodes[a].y >= 1 || nodes[b]?.y >= 1) continue; + if (b <= a || !espinha(a) || !espinha(b)) continue; const key = `${a}:${b}`; if (seen.has(key)) continue; seen.add(key); const A = nodes[a], B = nodes[b], dx = B.x - A.x, dz = B.z - A.z, len = Math.hypot(dx, dz); if (len < 0.5) continue; const straightAt = (center, other) => { - const neighbors = (adj[center] || []).filter((n) => n !== other && nodes[n]?.y < 1); + const neighbors = adjE(center).filter((n) => n !== other); if (neighbors.length !== 1) return false; const C = nodes[center], O = nodes[other], N = nodes[neighbors[0]]; const ux = O.x - C.x, uz = O.z - C.z, vx = N.x - C.x, vz = N.z - C.z; @@ -179,7 +190,7 @@ for (let a = 0; a < nodes.length; a++) for (const b of adj[a] || []) { }; if (!straightAt(a, b) || !straightAt(b, a)) continue; const x = (A.x + B.x) / 2, z = (A.z + B.z) / 2, nx = -dz / len, nz = dx / len; - if (pertoDeJuncao(x, z)) continue; + if (pertoDeJuncao(x, z) || naPraca(x, z)) continue; if (!livre(x, z, 0)) continue; const width = probeWall(x, z, nx, nz, 0, -1) + probeWall(x, z, nx, nz, 0, 1) + 0.76; edgeWidths.push({ width, x, z }); diff --git a/tools/eval/lajes-vertical-check.mjs b/tools/eval/lajes-vertical-check.mjs new file mode 100644 index 00000000..b90c57ed --- /dev/null +++ b/tools/eval/lajes-vertical-check.mjs @@ -0,0 +1,375 @@ +/* LAJES — VERTICAL: cima × baixo. Régua comprada pelo relato do dono (25/08/2026): + "a ideia era os times irem tanto por baixo quanto por cima, e agora só vai por cima. + Por baixo tinha que ter uma praça no meio, ver os becos e jogar cima contra baixo." + + A CTF2 do map-check já exige 2 rotas SEPARADAS por par spawn↔bandeira, e o lajes passava + com 2 a 4 rotas — todas pela laje. Medido pela sonda de 25/08 (scratchpad/sonda-lajes-vertical.mjs, + harness real): nos 8 pares spawn↔bandeira, 20 rotas achadas, TODAS com 0% do comprimento + no térreo. O grafo tinha 152 dos 363 nós no chão (42%) e nenhum deles era usado: os dois + spawns nascem em laje, as quatro bandeiras estão em laje, e não havia descida perto do + spawn. A CTF2 é cega para isso por construção — ela conta rotas, não mede a altura delas. + + Esta régua classifica as MESMAS rotas que a CTF2 enumera (limiar e enumerador + compartilhados em rotas-separadas.mjs — lição 2) e cobra o resto do pedido: + + LV1 ir POR BAIXO é opção viável, não castigo: para cada par spawn↔bandeira distante, a + melhor rota que passa PELA PRAÇA gasta ≥ 40% do caminho no térreo e não é mais de + 1,6× mais longa que a melhor rota do mapa; + LV2 ir POR CIMA continua sendo opção: a melhor rota do par corre ≥ 60% em laje; + LV3 existe PRAÇA no térreo, no meio do mapa: sala livre contígua de ≥ 90 m² com largura + útil ≥ 7 m nos dois eixos, centro a ≤ 9 m do meio do mapa; + LV4 a praça tem COVER e não é corredor morto: ≥ 6 peças de cobertura (0,4–2,2 m de + altura) dentro dela, espaçamento médio ≤ 7,0 m — o mesmo teto da QUAD_ESPAC do + map-check, pela mesma conta (√(100/densidade) = duas arestas do grafo); + LV6 toda aresta de térreo do grafo é ANDÁVEL de ponta a ponta (vão inteiro livre para o + corpo de 0,38 m), não só nas pontas; + LV5 BECOS VISÍVEIS DE CIMA: das bordas de laje que dão para o miolo, ≥ 55% das amostras + do térreo central têm linha de visada limpa. + + LIMITE CONHECIDO (lição 3): roda em node, onde NENHUM GLB carrega. A visada da LV5 é + medida contra a lista de COLLIDERS, não contra a malha — e os colisores das casas nascem + da tabela HOUSE_BOUNDS, idêntica nos dois mundos (map_lajes_authored.js:56). O que ela NÃO + vê é oclusão por peça puramente visual (varal, caixa d'água sem colisor, pipa). Confirme a + leitura na captura 3:2, não só neste número. + + Mutantes: + so-por-cima religa o pé de cada escada só nos próprios degraus (o defeito original) + → LV1 vermelha + praca-cheia enche a praça de colisores → LV3/LV4 vermelhas + laje-cega ergue platibanda cega de 2,4 m na borda das lajes do miolo → LV5 vermelha + aresta-fantasma liga dois nós de térreo através de um muro → LV6 vermelha +*/ +import { THREE, bootGame, initTextures } from './harness.mjs'; +import { rotasSeparadas, caminhoBloqueado, RAIO_PONTA } from './rotas-separadas.mjs'; +import { QUAD_ESPAC } from './limiares-mapa.mjs'; + +const mutante = process.argv.find((a) => a.startsWith('--mutante='))?.split('=')[1] || ''; +const conhecidos = new Set(['', 'so-por-cima', 'praca-cheia', 'laje-cega', 'aresta-fantasma']); +if (!conhecidos.has(mutante)) throw new Error(`mutante desconhecido: ${mutante}`); + +const game = bootGame('lajes', { textures: initTextures(), bots: 0, seed: 25082026 }); +const W = game.world; + +const Y_TERREO = 1.6; // abaixo disso o nó é térreo (a laje do lajes está a 5,2 m) +const FRAC_TERREA = 0.40; // rota TÉRREA: ≥ 40% do comprimento no chão +const FRAC_SUPERIOR = 0.60; // rota SUPERIOR: ≥ 60% do comprimento em laje +/* O QUE SE COMPARA, e por quê não é a rota de cima mais curta. A rota de cima mais curta é + quase a reta entre spawn e bandeira (53,5 m para 49 m de distância no par E→P): as lajes + formam um tabuleiro contínuo. Ir por baixo carrega dois custos que o projeto do mapa impõe + e que nenhum conserto tira: as duas escadas em U custam 22,6 m fixos de caminhada (medido + na geometria da addStaircase — 2 lances de 4,2 m + 2 patamares de 1,45 m, por escada) e a + espinha inferior é SINUOSA de propósito (LAJES_LOOPS.beco, "espinha sinuosa inferior"; + medido 62 m de beco para 46 m de reta entre os pés das escadas, 1,35×). Sobre a rota de + cima mais curta isso já dá ~1,87× antes de qualquer desperdício — cobrar 1,6× seria cobrar + que o térreo deixasse de ser o térreo deste mapa. + O que o dono pediu é que o time possa ir "tanto por baixo quanto por cima". O par honesto + disso é o FLANCO: a segunda rota separada que a CTF2 já conta como alternativa jogável por + cima (100,4 m no E→P, 1,88× a direta). Se atravessar por baixo custa o mesmo que flanquear + por cima, ir por baixo é escolha e não castigo — e é isso que a LV1 mede. + Só vale para par que ATRAVESSA o mapa (spawn e bandeira em lados opostos de z = 0). É o + "onde fizer sentido" do pedido: para esses a praça está NO CAMINHO, então descer não é + detour, é escolha. Cobrar rota de praça de par do mesmo lado (spawn E e bandeira a 13,5 m, + ambos ao norte) seria exigir descer 5 m e subir 5 m para andar 13 — castigo, não rota. */ +const FATOR_DETOUR = 1.5; // rota de baixo ≤ 1,5 × a rota de FLANCO por cima +void RAIO_PONTA; +/* 90 m²: a praça é a MAIOR sala do mapa por construção — a maior laje é a CN do spawn + (x −4,6..4,6 × z −36..−28,5 = 9,2 × 7,5 = 69 m², map_lajes_authored.js:38). Uma praça que + não passa da maior laje não é o "encontro por baixo" que o dono pediu, é mais um pátio. */ +const PRACA_AREA = 90; // m² mínimos da sala livre do meio +const PRACA_LARG = 7.0; // m de largura útil mínima nos dois eixos +/* Raio do disco que define "sala" e não "corredor". O beco mais largo do mapa tem 1,76 m + (addAlleySegment, width 1,76/1,62), meia-largura 0,88 — nenhuma célula de beco cabe num + disco de 1,20 m, com folga. Acima disso (1,9 m) a régua passava a reprovar praça MOBILIADA, + que é o que ela deveria premiar: dois bancos a 2,5 m um do outro quebravam a sala inteira. */ +const R_SALA = 1.20; +const PRACA_RAIO = 9.0; // m: distância máxima do centro da praça ao meio do mapa +const PRACA_COVER = 6; // peças de cobertura mínimas dentro da praça +const VISADA_MIN = 0.55; // fração mínima de amostras do miolo visíveis das bordas + +if (mutante === 'so-por-cima') { + /* Recria EXATAMENTE o defeito que esta rodada consertou: o pé de cada escada ligado só aos + próprios degraus, nunca ao grafo do térreo (map_lajes_authored.js linkava o nó mais + próximo com y < 1 e achava o primeiro degrau da própria escada, a 0,28 m). O chão vira um + componente separado do telhado e não existe travessia por baixo — o mapa que o dono + reprovou. Se a LV1 não ficar vermelha aqui, ela não mede o que diz medir. */ + /* Corta TODA aresta que sobe do chão puro (y ≈ 0) para qualquer nó elevado. Duas versões + anteriores sobreviveram por serem tímidas demais: cortar só o nó-pé poupava o ramal novo + do beco (a 0,4 m dele), e cortar só vizinho distante poupava os DEGRAUS baixos, em que a + malha de térreo encosta de lado. Mutante que não aplica parece mutante que passou. */ + let cortados = 0; + for (let a = 0; a < W.waypoints.nodes.length; a++) { + if (W.waypoints.nodes[a].y >= .06) continue; + for (const b of [...W.waypoints.adj[a]]) { + if (W.waypoints.nodes[b].y < .06) continue; + W.waypoints.adj[a] = W.waypoints.adj[a].filter((i) => i !== b); + W.waypoints.adj[b] = W.waypoints.adj[b].filter((i) => i !== a); + cortados++; + } + } + if (!cortados) throw new Error('MUTANTE NÃO APLICOU: o térreo já não sobe — o defeito já está posto'); +} +if (mutante === 'praca-cheia') { + for (let x = -7; x <= 7; x += 1.2) for (let z = -8; z <= 9; z += 1.2) + W.colliders.push({ minX: x - .55, maxX: x + .55, minY: 0, maxY: 3, minZ: z - .55, maxZ: z + .55 }); +} +if (mutante === 'laje-cega') { + /* Platibanda cega de 2,4 m na borda das lajes que olham o miolo (x = ∓7,4): é o "andar de + cima travado com parede cega" que o critério 3 proíbe. */ + const antes = W.colliders.length; + for (const side of [-1, 1]) + W.colliders.push({ minX: side * 7.3 - .15, maxX: side * 7.3 + .15, minY: 5.2, maxY: 7.6, + minZ: -16, maxZ: 14 }); + if (W.colliders.length <= antes) throw new Error('MUTANTE NÃO APLICOU'); +} + +if (mutante === 'aresta-fantasma') { + /* Liga dois nós de térreo separados por um muro de beco. É o defeito que o vaoLivre do + map_lajes_authored corrigiu: a aresta era aceita testando SÓ o ponto médio, então com nós + a 2,0 m e muro de 0,26 m o médio caía fora da parede e o grafo jurava passagem. */ + const N = W.waypoints.nodes; + let ligou = 0; + for (let a = 0; a < N.length && !ligou; a++) { + if (N[a].y >= 1.6) continue; + for (let b = 0; b < N.length; b++) { + if (b === a || N[b].y >= 1.6) continue; + const d = Math.hypot(N[b].x - N[a].x, N[b].z - N[a].z); + if (d < 1.5 || d > 3.5) continue; + if (W.waypoints.adj[a].includes(b)) continue; + /* As DUAS pontas têm que ser andáveis e o MEIO bloqueado — é a assinatura exata do + defeito. Primeira versão só exigia o meio bloqueado, pegava par com ponta dentro de + sólido, e a LV6 (que pula ponta em sólido, isso é a LC5) não mordia: o mutante + sobreviveu parecendo que a régua não servia. */ + const solido = (x, z) => { + const p = new THREE.Vector3(x, 0, z); game._collide(p, .38); + return Math.hypot(p.x - x, p.z - z) >= 1e-3; + }; + if (solido(N[a].x, N[a].z) || solido(N[b].x, N[b].z)) continue; + if (!solido((N[a].x + N[b].x) / 2, (N[a].z + N[b].z) / 2)) continue; + W.waypoints.adj[a].push(b); W.waypoints.adj[b].push(a); ligou = 1; break; + } + } + if (!ligou) throw new Error('MUTANTE NÃO APLICOU: não achei par de nós de térreo separados por sólido'); +} + +/* ===================== LV1 / LV2 — cima × baixo ===================== */ +const nodes = W.waypoints.nodes, adj = W.waypoints.adj; +const SEM_BLOQUEIO = new Uint8Array(nodes.length); +const comprimento = (cam) => { + let total = 0; + for (let i = 1; i < cam.length; i++) total += Math.hypot(nodes[cam[i]].x - nodes[cam[i - 1]].x, nodes[cam[i]].z - nodes[cam[i - 1]].z); + return total; +}; +const fracTerreo = (cam) => { + let total = 0, terreo = 0; + for (let i = 1; i < cam.length; i++) { + const A = nodes[cam[i - 1]], B = nodes[cam[i]]; + const seg = Math.hypot(B.x - A.x, B.z - A.z); + total += seg; + if ((A.y + B.y) / 2 < Y_TERREO) terreo += seg; + } + return total ? terreo / total : 0; +}; +/* ROTA POR BAIXO = a melhor rota que ATRAVESSA O MIOLO NO CHÃO. Bloqueia toda laje no terço + central do mapa (|z| ≤ 13 de 39): perto do spawn e perto da bandeira a laje continua + liberada — o que se cobra é que dê para CRUZAR por baixo, não que se rasteje o trajeto todo. + Primeira tentativa foi "melhor rota que encosta num nó da praça", e ela media outra coisa: + o caminho corria pela laje e só descia no último metro para tocar a praça (16% de chão num + trajeto dito "por baixo"). Tocar a praça não é ir por baixo. */ +const MIOLO_Z = 13; +const bloqLaje = new Uint8Array(nodes.length); +for (let i = 0; i < nodes.length; i++) + if (nodes[i].y >= Y_TERREO && Math.abs(nodes[i].z) <= MIOLO_Z) bloqLaje[i] = 1; +const pares = [], falhouTerrea = [], falhouSuperior = []; +for (const [time, ss] of Object.entries(W.spawns || {})) { + for (const p of W.ctfPoints || []) { + const from = W.nearestWaypoint(ss[0].x, ss[0].z), to = W.nearestWaypoint(p.x, p.z); + const rotulo = `${time}→${p.id}`; + const direto = Math.hypot(nodes[from].x - nodes[to].x, nodes[from].z - nodes[to].z); + const porCima = rotasSeparadas(nodes, adj, from, to); + if (!porCima.length) { falhouTerrea.push(`${rotulo}(sem rota)`); falhouSuperior.push(`${rotulo}(sem rota)`); continue; } + const L0 = comprimento(porCima[0]), fracCima = 1 - fracTerreo(porCima[0]); + const Lflanco = comprimento(porCima[1] || porCima[0]); + if (fracCima < FRAC_SUPERIOR) falhouSuperior.push(`${rotulo} ${(fracCima * 100).toFixed(0)}%laje`); + const atravessa = (ss[0].z < 0) !== (p.z < 0); + if (!atravessa) { pares.push(`${rotulo} mesmo lado(${direto.toFixed(0)}m) — só LV2`); continue; } + const porBaixo = caminhoBloqueado(nodes, adj, from, to, bloqLaje); + if (!porBaixo) { falhouTerrea.push(`${rotulo}(sem travessia por baixo)`); continue; } + const L1 = comprimento(porBaixo), frac = fracTerreo(porBaixo); + const fator = Lflanco ? L1 / Lflanco : Infinity; + const ok = frac >= FRAC_TERREA && fator <= FATOR_DETOUR; + if (!ok) falhouTerrea.push(`${rotulo} ${(frac * 100).toFixed(0)}%chão ${fator.toFixed(2)}×`); + pares.push(`${rotulo} direta ${L0.toFixed(0)}m · flanco ${Lflanco.toFixed(0)}m · baixo ${L1.toFixed(0)}m (${fator.toFixed(2)}× o flanco, ${(frac * 100).toFixed(0)}%chão)`); + } +} +const lv1 = falhouTerrea.length === 0; +const lv2 = falhouSuperior.length === 0; +void rotasSeparadas; + +/* ===================== LV3 / LV4 — a praça ===================== */ +const B = W.bounds, STEP = 0.30; +const nx = Math.ceil((B.maxX - B.minX) / STEP), nz = Math.ceil((B.maxZ - B.minZ) / STEP); +const p3 = new THREE.Vector3(); +const livreEm = (x, z) => { + if (W.groundHeightAt(x, z, 0) > 0.55) return false; + p3.set(x, 0, z); game._collide(p3, 0.38); + return Math.abs(p3.x - x) < 1e-3 && Math.abs(p3.z - z) < 1e-3; +}; +/* Sala do miolo: flood restrito à janela central do mapa e SEM tocar os becos estreitos — + uma praça é uma sala, e um corredor de 1,8 m que atravessa o mapa não é praça. O flood + só entra em célula cujo disco de 1,9 m de raio esteja livre (o "miolo largo"). */ +const JAN = { x0: -11, x1: 11, z0: -14, z1: 13 }; +const jx = Math.ceil((JAN.x1 - JAN.x0) / STEP), jz = Math.ceil((JAN.z1 - JAN.z0) / STEP); +const cel = (i, k) => [JAN.x0 + (i + .5) * STEP, JAN.z0 + (k + .5) * STEP]; +const livreCache = new Uint8Array(jx * jz); +for (let i = 0; i < jx; i++) for (let k = 0; k < jz; k++) { + const [x, z] = cel(i, k); + if (livreEm(x, z)) livreCache[i * jz + k] = 1; +} +/* Miolo LARGO: célula cujo disco de R_SALA está livre. É o que separa sala de corredor. */ +const largo = new Uint8Array(jx * jz); +for (let i = 0; i < jx; i++) for (let k = 0; k < jz; k++) { + if (!livreCache[i * jz + k]) continue; + const [x, z] = cel(i, k); + let ok = true; + for (let a = 0; a < 12 && ok; a++) { + const ang = a * Math.PI / 6; + if (!livreEm(x + Math.cos(ang) * R_SALA, z + Math.sin(ang) * R_SALA)) ok = false; + } + if (ok) largo[i * jz + k] = 1; +} +const comp = new Int32Array(jx * jz).fill(-1); +const salas = []; +for (let i = 0; i < jx; i++) for (let k = 0; k < jz; k++) { + if (!largo[i * jz + k] || comp[i * jz + k] >= 0) continue; + const cid = salas.length, fila = [i * jz + k]; comp[i * jz + k] = cid; + for (let h = 0; h < fila.length; h++) { + const c = fila[h], ci = (c / jz) | 0, ck = c % jz; + for (const [di, dk] of [[1, 0], [-1, 0], [0, 1], [0, -1]]) { + const j = ci + di, l = ck + dk; + if (j < 0 || j >= jx || l < 0 || l >= jz) continue; + const d = j * jz + l; + if (largo[d] && comp[d] < 0) { comp[d] = cid; fila.push(d); } + } + } + salas.push({ cid, cel: fila }); +} +/* A sala real = as células LIVRES a até R_SALA do miolo largo (dilatação exata). A célula do + flood é o CENTRO de um disco que cabe, então sem dilatar a praça mediria só o esqueleto. */ +salas.sort((a, b) => b.cel.length - a.cel.length); +const sala = salas[0] || null; +let praca = null; +if (sala) { + const raioCel = Math.ceil(R_SALA / STEP); + const dil = new Uint8Array(jx * jz); + for (const c of sala.cel) { + const ci = (c / jz) | 0, ck = c % jz; + for (let di = -raioCel; di <= raioCel; di++) for (let dk = -raioCel; dk <= raioCel; dk++) { + if (Math.hypot(di, dk) * STEP > R_SALA) continue; + const j = ci + di, l = ck + dk; + if (j < 0 || j >= jx || l < 0 || l >= jz) continue; + if (livreCache[j * jz + l]) dil[j * jz + l] = 1; + } + } + let n = 0, minI = jx, maxI = -1, minK = jz, maxK = -1; + for (let i = 0; i < jx; i++) for (let k = 0; k < jz; k++) { + if (!dil[i * jz + k]) continue; + n++; minI = Math.min(minI, i); maxI = Math.max(maxI, i); minK = Math.min(minK, k); maxK = Math.max(maxK, k); + } + praca = { area: n * STEP * STEP, + largX: (maxI - minI + 1) * STEP, largZ: (maxK - minK + 1) * STEP, + cx: JAN.x0 + (minI + maxI + 1) / 2 * STEP, cz: JAN.z0 + (minK + maxK + 1) / 2 * STEP }; +} +const lv3 = !!praca && praca.area >= PRACA_AREA && praca.largX >= PRACA_LARG && praca.largZ >= PRACA_LARG + && Math.hypot(praca.cx, praca.cz) <= PRACA_RAIO; + +/* Cover: colisor de peça (não parede, não laje) com o topo entre 0,4 e 2,2 m dentro da praça. */ +const dentroPraca = (x, z) => praca && Math.abs(x - praca.cx) <= praca.largX / 2 && Math.abs(z - praca.cz) <= praca.largZ / 2; +const covers = (W.colliders || []).filter((c) => { + const alt = c.maxY - c.minY; + if (c.minY > 0.3 || alt < 0.4 || alt > 2.2) return false; + const larg = Math.max(c.maxX - c.minX, c.maxZ - c.minZ); + if (larg > 4.5) return false; // parede corrida não é cover de praça + return dentroPraca((c.minX + c.maxX) / 2, (c.minZ + c.maxZ) / 2); +}); +const areaPraca = praca ? praca.largX * praca.largZ : 0; +const espacCover = covers.length ? Math.sqrt(areaPraca / covers.length) : Infinity; +const lv4 = covers.length >= PRACA_COVER && espacCover <= QUAD_ESPAC; + +/* ===================== LV5 — becos visíveis de cima ===================== */ +/* Ray-march contra os COLLIDERS (idênticos nos dois mundos — ver LIMITE CONHECIDO). */ +const cols = W.colliders || []; +const visivel = (ax, ay, az, bx, by, bz) => { + const dx = bx - ax, dy = by - ay, dz = bz - az, len = Math.hypot(dx, dy, dz); + const passos = Math.ceil(len / 0.25); + for (let s = 1; s < passos; s++) { + const t = s / passos, x = ax + dx * t, y = ay + dy * t, z = az + dz * t; + for (const c of cols) { + if (x > c.minX && x < c.maxX && y > c.minY && y < c.maxY && z > c.minZ && z < c.maxZ) return false; + } + } + return true; +}; +/* Olhos nas bordas de laje que dão para o miolo (altura do olho 1,6 m sobre a laje). */ +const OLHOS = [[-7.6, -12], [7.6, -12], [-7.6, -1], [7.6, -1], [-7.6, 5.5], [7.6, 5.5], [-7.6, 9], [7.6, 9]]; +const alvos = []; +for (let x = -6; x <= 6.01; x += 1.5) for (let z = -8; z <= 7.01; z += 1.5) if (livreEm(x, z)) alvos.push([x, z]); +let vistos = 0, testes = 0; +for (const [ox, oz] of OLHOS) { + const oy = W.groundHeightAt(ox, oz, 1e3) + 1.6; + for (const [tx, tz] of alvos) { testes++; if (visivel(ox, oy, oz, tx, 1.2, tz)) vistos++; } +} +const fracVisada = testes ? vistos / testes : 0; +const lv5 = fracVisada >= VISADA_MIN; + +/* ===================== LV6 — aresta atravessável ===================== */ +/* Usa o _collide de PRODUÇÃO com o raio do jogador (0,38), não a caixa do gerador: a régua e + o jogo têm que rodar no mesmo mundo (lição 3). Amostra a 0,3 m — menor que a parede mais + fina que colide no mapa (0,14 m de guarda-corpo / 0,18 m de poço de escada). */ +const pLV6 = new THREE.Vector3(); +const andavel = (x, z) => { + pLV6.set(x, 0, z); game._collide(pLV6, .38); + return Math.hypot(pLV6.x - x, pLV6.z - z) < 1e-3; +}; +const arestasRuins = []; +let arestasTerreo = 0; +for (let a = 0; a < nodes.length; a++) { + if (nodes[a].y >= Y_TERREO) continue; + for (const b of adj[a]) { + if (b <= a || nodes[b].y >= Y_TERREO) continue; + arestasTerreo++; + const A = nodes[a], B = nodes[b], d = Math.hypot(B.x - A.x, B.z - A.z); + if (!andavel(A.x, A.z) || !andavel(B.x, B.z)) continue; // ponta em sólido é outra régua (LC5) + const passos = Math.max(1, Math.ceil(d / .3)); + for (let s2 = 1; s2 < passos; s2++) { + const t = s2 / passos; + if (andavel(A.x + (B.x - A.x) * t, A.z + (B.z - A.z) * t)) continue; + arestasRuins.push(`(${A.x.toFixed(1)},${A.z.toFixed(1)})→(${B.x.toFixed(1)},${B.z.toFixed(1)})`); + break; + } + } +} +const lv6 = arestasRuins.length === 0; + +const checks = [ + ['LV1', 'atravessar por baixo custa o mesmo que flanquear por cima (≥40% chão, ≤1,5× o flanco)', lv1, + falhouTerrea.length ? `reprova: ${falhouTerrea.join(' · ')}` : pares.join(' · ')], + ['LV2', 'ir por cima continua sendo opção (≥60% em laje)', lv2, + falhouSuperior.length ? `reprova: ${falhouSuperior.join(', ')}` : `${pares.length} pares ok`], + ['LV3', 'praça no térreo, no meio do mapa', lv3, praca + ? `${praca.area.toFixed(0)} m² (min ${PRACA_AREA}) · ${praca.largX.toFixed(1)}×${praca.largZ.toFixed(1)} m (min ${PRACA_LARG}) · centro (${praca.cx.toFixed(1)},${praca.cz.toFixed(1)}) a ${Math.hypot(praca.cx, praca.cz).toFixed(1)} m do meio (max ${PRACA_RAIO})` + : 'nenhuma sala larga no miolo'], + ['LV4', 'a praça tem cover (não é corredor morto)', lv4, + `${covers.length} peças (min ${PRACA_COVER}) · espaçamento ${espacCover === Infinity ? '∞' : espacCover.toFixed(1)} m (max ${QUAD_ESPAC})`], + ['LV6', 'toda aresta de térreo é andável de ponta a ponta', lv6, + `${arestasTerreo} arestas de térreo · ${arestasRuins.length} atravessam sólido${arestasRuins.length ? `: ${arestasRuins.slice(0, 6).join(' · ')}` : ''}`], + ['LV5', 'os becos do miolo são visíveis das bordas de laje', lv5, + `${(fracVisada * 100).toFixed(1)}% de ${testes} visadas limpas (min ${(VISADA_MIN * 100).toFixed(0)}%)`], +]; +let falhas = 0; +for (const [id, desc, ok, ev] of checks) { + if (!ok) falhas++; + console.log(`${ok ? '✓' : '✗'} ${id} ${desc} — ${ev}`); +} +if (falhas) { console.error(`LAJES-VERTICAL FALHA: ${falhas}/${checks.length}`); process.exitCode = 1; } +else if (mutante) { console.error(`MUTANTE ${mutante} sobreviveu`); process.exitCode = 1; } +else console.log('LAJES-VERTICAL OK'); diff --git a/tools/eval/limiares-mapa.mjs b/tools/eval/limiares-mapa.mjs new file mode 100644 index 00000000..04ac79da --- /dev/null +++ b/tools/eval/limiares-mapa.mjs @@ -0,0 +1,15 @@ +/* Limiares de mapa compartilhados entre réguas que medem O MESMO conceito. + + Existe pela lição 2 de docs/LICOES.md: duas réguas com limiar próprio para a mesma coisa + são o instrumento discordando de si. O caso que criou este arquivo é recente e foi pego na + revisão antes do push: a LV4 do lajes-vertical nasceu com `const COVER_ESPAC = 7.0` e um + comentário dizendo "o mesmo teto da QUAD_ESPAC do map-check" — o comentário prometia + compartilhamento e o código copiava o número. Comentário não é mecanismo. */ + +/* Espaçamento médio máximo entre peças de cobertura de um quadrante, em metros. + DE ONDE VEM: com densidade d peças por 100 m², o espaçamento médio é √(100/d). 7,0 m são + DUAS ARESTAS do grafo de navegação do jogo (STEP = 3,4 m) — acima disso um bot atravessa o + quadrante inteiro percorrendo duas arestas sem ter uma peça de cobertura ao alcance, que é + em número o "o mapa fica vazio" do dono. Consumidores: MAP5 (map-check.mjs, todos os mapas) + e LV4 (lajes-vertical-check.mjs, cover da praça). */ +export const QUAD_ESPAC = 7.0; diff --git a/tools/eval/map-check.mjs b/tools/eval/map-check.mjs index 6db3d5eb..7d7c0cac 100644 --- a/tools/eval/map-check.mjs +++ b/tools/eval/map-check.mjs @@ -39,6 +39,8 @@ import path from 'node:path'; import { writeFileSync } from 'node:fs'; import { fileURLToPath } from 'node:url'; import { THREE, MAPS, initTextures, bootGame } from './harness.mjs'; +import { SEP_ROTA } from './rotas-separadas.mjs'; +import { QUAD_ESPAC } from './limiares-mapa.mjs'; const HERE = path.dirname(fileURLToPath(import.meta.url)); const ONLY = process.argv[2] || 'all'; @@ -137,8 +139,10 @@ const QUAD_MIN_AND = 40; // m² de chão andável pra um quadrante entrar acima disso um bot atravessa o quadrante percorrendo duas arestas inteiras sem ter uma peça de cobertura ao alcance — que é, em número, "o mapa fica vazio" do dono. */ const QUAD_FRAC = 0.35; // densidade mínima = 35% da mediana dos quadrantes do mapa -const QUAD_ESPAC = 7.0; // espaçamento médio máximo entre props do quadrante (m) -const SEP_ROTA = 6.0; // m de afastamento pra duas rotas contarem como rotas diferentes +/* QUAD_ESPAC vem de limiares-mapa.mjs: a LV4 do lajes mede o cover da praça contra o MESMO + teto, e número copiado entre réguas é o instrumento discordando de si (lição 2). */ +/* SEP_ROTA vem de rotas-separadas.mjs: a LV1/LV2 do lajes classifica as MESMAS rotas + por altura, e limiar duplicado é o instrumento discordando de si (lição 2). */ /* ---- MAP6: borda de andar alto não pode despejar o jogador sob a laje. Caso real (screenshot do dono, 09/08/2026): no mirante do escadao, a câmera apareceu diff --git a/tools/eval/map_check.json b/tools/eval/map_check.json index f5986f4b..155f72cc 100644 --- a/tools/eval/map_check.json +++ b/tools/eval/map_check.json @@ -1,5 +1,5 @@ { - "gerado": "2026-08-25T01:19:40.585Z", + "gerado": "2026-08-26T03:50:06.101Z", "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", @@ -13,10 +13,10 @@ }, "mapas": [ { - "map": "escadao", - "celulasAlcancadas": 31609, - "amostrasChao": 2003, - "observadores": 496, + "map": "praca_poderes", + "celulasAlcancadas": 215509, + "amostrasChao": 13416, + "observadores": 3317, "corpoDentroDeSolido": 0, "submersosAcimaDoPeito": 0, "piorPenetracao": 0, @@ -24,730 +24,577 @@ "dentroTodos": [], "spawns": [ { - "team": "E", - "x": -2.4, - "z": 26, + "team": "B", + "x": -9, + "z": -62, "chao": 0, - "penetracao": 0.01 + "penetracao": 0.028 }, { - "team": "E", - "x": -0.8, - "z": 26, + "team": "B", + "x": -3, + "z": -62, "chao": 0, - "penetracao": 0.01 + "penetracao": 0.03 }, { - "team": "E", - "x": 0.8, - "z": 26, + "team": "B", + "x": 3, + "z": -62, "chao": 0, - "penetracao": 0.01 + "penetracao": 0.03 }, { - "team": "E", - "x": 2.4, - "z": 26, + "team": "B", + "x": 9, + "z": -62, "chao": 0, - "penetracao": 0.01 + "penetracao": 0.028 }, { - "team": "B", - "x": -4.5, - "z": -34, - "chao": 6.12, - "penetracao": 0.02 + "team": "E", + "x": -9, + "z": 62, + "chao": 0, + "penetracao": 0.028 }, { - "team": "B", - "x": -1.5, - "z": -34, - "chao": 6.12, - "penetracao": 0.02 + "team": "E", + "x": -3, + "z": 62, + "chao": 0, + "penetracao": 0.03 }, { - "team": "B", - "x": 1.5, - "z": -34, - "chao": 6.12, - "penetracao": 0.02 + "team": "E", + "x": 3, + "z": 62, + "chao": 0, + "penetracao": 0.03 }, { - "team": "B", - "x": 4.5, - "z": -34, - "chao": 6.12, - "penetracao": 0.02 + "team": "E", + "x": 9, + "z": 62, + "chao": 0, + "penetracao": 0.028 } ], "exposicaoPorTime": [ { - "team": "E", + "team": "B", "chaoMin": 0, "chaoMax": 0, - "fracMedia": 0, - "maiorVisada": 0 + "fracMedia": 0.8206, + "maiorVisada": 153.6 }, { - "team": "B", - "chaoMin": 6.12, - "chaoMax": 6.12, - "fracMedia": 0.1611, - "maiorVisada": 74 + "team": "E", + "chaoMin": 0, + "chaoMax": 0, + "fracMedia": 0.7457, + "maiorVisada": 146.1 } ], "exposicaoPorSpawn": [ { - "team": "E", - "x": -2.4, - "z": 26, + "team": "B", + "x": -9, + "z": -62, "chao": 0, - "obsLonge": 274, - "obsVendo": 0, - "frac": 0, - "maiorVisada": 0 + "obsLonge": 2927, + "obsVendo": 2399, + "frac": 0.8196, + "maiorVisada": 153.6 }, { - "team": "E", - "x": -0.8, - "z": 26, + "team": "B", + "x": -3, + "z": -62, "chao": 0, - "obsLonge": 270, - "obsVendo": 0, - "frac": 0, - "maiorVisada": 0 + "obsLonge": 2931, + "obsVendo": 2446, + "frac": 0.8345, + "maiorVisada": 151 }, { - "team": "E", - "x": 0.8, - "z": 26, + "team": "B", + "x": 3, + "z": -62, "chao": 0, - "obsLonge": 269, - "obsVendo": 0, - "frac": 0, - "maiorVisada": 0 + "obsLonge": 2931, + "obsVendo": 2371, + "frac": 0.8089, + "maiorVisada": 150.7 }, { - "team": "E", - "x": 2.4, - "z": 26, + "team": "B", + "x": 9, + "z": -62, "chao": 0, - "obsLonge": 269, - "obsVendo": 0, - "frac": 0, - "maiorVisada": 0 + "obsLonge": 2926, + "obsVendo": 2397, + "frac": 0.8192, + "maiorVisada": 153.3 }, { - "team": "B", - "x": -4.5, - "z": -34, - "chao": 6.12, - "obsLonge": 314, - "obsVendo": 51, - "frac": 0.1624, - "maiorVisada": 45.6 + "team": "E", + "x": -9, + "z": 62, + "chao": 0, + "obsLonge": 2932, + "obsVendo": 2143, + "frac": 0.7309, + "maiorVisada": 146.1 }, { - "team": "B", - "x": -1.5, - "z": -34, - "chao": 6.12, - "obsLonge": 305, - "obsVendo": 52, - "frac": 0.1705, - "maiorVisada": 66 + "team": "E", + "x": -3, + "z": 62, + "chao": 0, + "obsLonge": 2963, + "obsVendo": 2161, + "frac": 0.7293, + "maiorVisada": 142.2 }, { - "team": "B", - "x": 1.5, - "z": -34, - "chao": 6.12, - "obsLonge": 308, - "obsVendo": 61, - "frac": 0.1981, - "maiorVisada": 74 + "team": "E", + "x": 3, + "z": 62, + "chao": 0, + "obsLonge": 2984, + "obsVendo": 2278, + "frac": 0.7634, + "maiorVisada": 143.1 }, { - "team": "B", - "x": 4.5, - "z": -34, - "chao": 6.12, - "obsLonge": 308, - "obsVendo": 35, - "frac": 0.1136, - "maiorVisada": 45.2 + "team": "E", + "x": 9, + "z": 62, + "chao": 0, + "obsLonge": 2983, + "obsVendo": 2265, + "frac": 0.7593, + "maiorVisada": 145.1 } ], "salaDoSpawn": [ { - "team": "E", - "x": -2.4, - "z": 26, - "folgaParede": 1.65, - "dirPior": 247, - "areaContigua": 65, + "team": "B", + "x": -9, + "z": -62, + "folgaParede": 2.95, + "dirPior": 84, + "areaContigua": 75.1, "okFolga": true, "okArea": true }, { - "team": "E", - "x": -0.8, - "z": 26, - "folgaParede": 2.7, - "dirPior": 214, - "areaContigua": 68.8, + "team": "B", + "x": -3, + "z": -62, + "folgaParede": 6.2, + "dirPior": 152, + "areaContigua": 78.6, "okFolga": true, "okArea": true }, { - "team": "E", - "x": 0.8, - "z": 26, - "folgaParede": 2.7, - "dirPior": 326, - "areaContigua": 68.8, + "team": "B", + "x": 3, + "z": -62, + "folgaParede": 11.8, + "dirPior": 163, + "areaContigua": 78.6, "okFolga": true, "okArea": true }, { - "team": "E", - "x": 2.4, - "z": 26, - "folgaParede": 1.65, - "dirPior": 293, - "areaContigua": 63.2, + "team": "B", + "x": 9, + "z": -62, + "folgaParede": 11.7, + "dirPior": 124, + "areaContigua": 78.6, "okFolga": true, "okArea": true }, { - "team": "B", - "x": -4.5, - "z": -34, - "folgaParede": 3.85, - "dirPior": 259, - "areaContigua": 74.4, + "team": "E", + "x": -9, + "z": 62, + "folgaParede": 2.65, + "dirPior": 174, + "areaContigua": 66.8, "okFolga": true, "okArea": true }, { - "team": "B", - "x": -1.5, - "z": -34, - "folgaParede": 5.35, + "team": "E", + "x": -3, + "z": 62, + "folgaParede": 8.25, "dirPior": 225, - "areaContigua": 78.4, + "areaContigua": 78.6, "okFolga": true, "okArea": true }, { - "team": "B", - "x": 1.5, - "z": -34, - "folgaParede": 5.35, + "team": "E", + "x": 3, + "z": 62, + "folgaParede": 8.25, "dirPior": 315, - "areaContigua": 78.4, + "areaContigua": 78.6, "okFolga": true, "okArea": true }, { - "team": "B", - "x": 4.5, - "z": -34, - "folgaParede": 3.85, - "dirPior": 281, - "areaContigua": 73.1, + "team": "E", + "x": 9, + "z": 62, + "folgaParede": 5.25, + "dirPior": 0, + "areaContigua": 78.4, "okFolga": true, "okArea": true } ], - "piorFolga": 1.65, - "piorArea": 63.2, - "escadas": [ + "piorFolga": 2.65, + "piorArea": 66.8, + "escadas": [], + "travessia": [], + "occluderSemMalha": [], + "occMedidos": 68, + "occPulados": 11, + "fracSemMalha": 0.004, + "quadrantes": [ { - "nome": "lance inferior", - "x0": -2.5, - "x1": 2.5, - "z0": 10.52, - "z1": 14.29, - "degraus": 12, - "espelhoMed": 0.1692, - "espelhoMin": 0.16, - "espelhoMax": 0.17, - "pisoMed": 0.2909, - "larguraMedida": 5, - "subida": 2.03, - "corrida": 3.22, - "inclinacaoGraus": 32.23, - "blondel": 0.629, - "desvioChaoDegrau": 0.01, - "okEspelho": true, - "okPiso": true, - "okBlondel": true, - "okLargura": true, - "okInclinacao": true, - "okDesvio": true - }, - { - "nome": "lance central", - "x0": 0, - "x1": 2.5, - "z0": 3.04, - "z1": 6.81, - "degraus": 12, - "espelhoMed": 0.1692, - "espelhoMin": 0.16, - "espelhoMax": 0.17, - "pisoMed": 0.2909, - "larguraMedida": 4.55, - "subida": 2.03, - "corrida": 3.22, - "inclinacaoGraus": 32.23, - "blondel": 0.629, - "desvioChaoDegrau": 0.01, - "okEspelho": true, - "okPiso": true, - "okBlondel": true, - "okLargura": true, - "okInclinacao": true, - "okDesvio": true - }, - { - "nome": "lance superior", - "x0": -2.5, - "x1": 2.5, - "z0": -5.4399999999999995, - "z1": -1.67, - "degraus": 12, - "espelhoMed": 0.1692, - "espelhoMin": 0.16, - "espelhoMax": 0.17, - "pisoMed": 0.2909, - "larguraMedida": 5, - "subida": 2.03, - "corrida": 3.22, - "inclinacaoGraus": 32.23, - "blondel": 0.629, - "desvioChaoDegrau": 0.01, - "okEspelho": true, - "okPiso": true, - "okBlondel": true, - "okLargura": true, - "okInclinacao": true, - "okDesvio": true - }, - { - "nome": "flanco oeste central", - "x0": -13.5, - "x1": -10.5, - "z0": 1.8400000000000007, - "z1": 5.61, - "degraus": 12, - "espelhoMed": 0.1692, - "espelhoMin": 0.16, - "espelhoMax": 0.17, - "pisoMed": 0.2909, - "larguraMedida": 3, - "subida": 2.03, - "corrida": 3.22, - "inclinacaoGraus": 32.23, - "blondel": 0.629, - "desvioChaoDegrau": 0.01, - "okEspelho": true, - "okPiso": true, - "okBlondel": true, - "okLargura": true, - "okInclinacao": true, - "okDesvio": true - }, - { - "nome": "flanco oeste superior", - "x0": -13.5, - "x1": -10.5, - "z0": -5.4399999999999995, - "z1": -1.67, - "degraus": 12, - "espelhoMed": 0.1692, - "espelhoMin": 0.16, - "espelhoMax": 0.17, - "pisoMed": 0.2909, - "larguraMedida": 3, - "subida": 2.03, - "corrida": 3.22, - "inclinacaoGraus": 32.23, - "blondel": 0.629, - "desvioChaoDegrau": 0.01, - "okEspelho": true, - "okPiso": true, - "okBlondel": true, - "okLargura": true, - "okInclinacao": true, - "okDesvio": true - } - ], - "travessia": [ - { - "nivel": "mirante", - "celulasAlcancadas": 13724, - "waypointsNoNivel": 126, - "aEstrelaChega": true - } - ], - "occluderSemMalha": [], - "occMedidos": 443, - "occPulados": 0, - "fracSemMalha": 0.0014, - "quadrantes": [ - { - "q": "0,0", - "x0": -17.5, - "z0": -39.5, - "areaAndavel": 112, - "props": 7, - "waypoints": 32, - "densProp": 6.26, - "densWp": 28.62, - "espacamento": 4, - "razaoProp": 1.56, - "razaoWp": 1.39 + "q": "0,0", + "x0": -45.5, + "z0": -76, + "areaAndavel": 879, + "props": 0, + "waypoints": 30, + "densProp": 0, + "densWp": 3.41, + "espacamento": 99, + "razaoProp": 0, + "razaoWp": 0.82 }, { "q": "0,1", - "x0": -17.5, - "z0": -19.8, - "areaAndavel": 132, - "props": 12, - "waypoints": 32, - "densProp": 9.07, - "densWp": 24.2, - "espacamento": 3.32, - "razaoProp": 2.26, - "razaoWp": 1.18 + "x0": -45.5, + "z0": -36, + "areaAndavel": 890, + "props": 0, + "waypoints": 45, + "densProp": 0, + "densWp": 5.06, + "espacamento": 99, + "razaoProp": 0, + "razaoWp": 1.22 }, { "q": "0,2", - "x0": -17.5, - "z0": 0, - "areaAndavel": 126, - "props": 13, - "waypoints": 35, - "densProp": 10.32, - "densWp": 27.78, - "espacamento": 3.11, - "razaoProp": 2.57, - "razaoWp": 1.35 + "x0": -45.5, + "z0": 4, + "areaAndavel": 890, + "props": 0, + "waypoints": 45, + "densProp": 0, + "densWp": 5.06, + "espacamento": 99, + "razaoProp": 0, + "razaoWp": 1.22 }, { "q": "0,3", - "x0": -17.5, - "z0": 19.8, - "areaAndavel": 113, - "props": 5, - "waypoints": 31, - "densProp": 4.43, - "densWp": 27.46, - "espacamento": 4.75, - "razaoProp": 1.1, - "razaoWp": 1.33 + "x0": -45.5, + "z0": 44, + "areaAndavel": 880, + "props": 1, + "waypoints": 20, + "densProp": 0.11, + "densWp": 2.27, + "espacamento": 29.66, + "razaoProp": 0.24, + "razaoWp": 0.55 }, { "q": "1,0", - "x0": -8.8, - "z0": -39.5, - "areaAndavel": 134, - "props": 5, - "waypoints": 17, - "densProp": 3.74, - "densWp": 12.71, - "espacamento": 5.17, - "razaoProp": 0.93, - "razaoWp": 0.62 + "x0": -22.8, + "z0": -76, + "areaAndavel": 871, + "props": 7, + "waypoints": 34, + "densProp": 0.8, + "densWp": 3.9, + "espacamento": 11.15, + "razaoProp": 1.76, + "razaoWp": 0.94 }, { "q": "1,1", - "x0": -8.8, - "z0": -19.8, - "areaAndavel": 131, - "props": 4, - "waypoints": 14, - "densProp": 3.05, - "densWp": 10.67, - "espacamento": 5.73, - "razaoProp": 0.76, - "razaoWp": 0.52 + "x0": -22.8, + "z0": -36, + "areaAndavel": 876, + "props": 9, + "waypoints": 46, + "densProp": 1.03, + "densWp": 5.25, + "espacamento": 9.87, + "razaoProp": 2.26, + "razaoWp": 1.26 }, { "q": "1,2", - "x0": -8.8, - "z0": 0, - "areaAndavel": 83, - "props": 14, - "waypoints": 21, - "densProp": 16.93, - "densWp": 25.4, - "espacamento": 2.43, - "razaoProp": 4.21, - "razaoWp": 1.23 + "x0": -22.8, + "z0": 4, + "areaAndavel": 841, + "props": 15, + "waypoints": 47, + "densProp": 1.78, + "densWp": 5.59, + "espacamento": 7.49, + "razaoProp": 3.91, + "razaoWp": 1.35 }, { "q": "1,3", - "x0": -8.8, - "z0": 19.8, - "areaAndavel": 127, - "props": 3, - "waypoints": 16, - "densProp": 2.36, - "densWp": 12.57, - "espacamento": 6.51, - "razaoProp": 0.59, - "razaoWp": 0.61 + "x0": -22.8, + "z0": 44, + "areaAndavel": 688, + "props": 7, + "waypoints": 23, + "densProp": 1.02, + "densWp": 3.34, + "espacamento": 9.91, + "razaoProp": 2.24, + "razaoWp": 0.8 }, { "q": "2,0", "x0": 0, - "z0": -39.5, - "areaAndavel": 135, - "props": 5, - "waypoints": 27, - "densProp": 3.7, - "densWp": 20, - "espacamento": 5.2, - "razaoProp": 0.92, - "razaoWp": 0.97 + "z0": -76, + "areaAndavel": 875, + "props": 7, + "waypoints": 28, + "densProp": 0.8, + "densWp": 3.2, + "espacamento": 11.18, + "razaoProp": 1.76, + "razaoWp": 0.77 }, { "q": "2,1", "x0": 0, - "z0": -19.8, - "areaAndavel": 142, - "props": 4, - "waypoints": 28, - "densProp": 2.81, - "densWp": 19.7, - "espacamento": 5.96, - "razaoProp": 0.7, - "razaoWp": 0.96 + "z0": -36, + "areaAndavel": 839, + "props": 15, + "waypoints": 37, + "densProp": 1.79, + "densWp": 4.41, + "espacamento": 7.48, + "razaoProp": 3.93, + "razaoWp": 1.06 }, { "q": "2,2", "x0": 0, - "z0": 0, - "areaAndavel": 110, - "props": 15, - "waypoints": 38, - "densProp": 13.62, - "densWp": 34.51, - "espacamento": 2.71, - "razaoProp": 3.39, - "razaoWp": 1.68 + "z0": 4, + "areaAndavel": 851, + "props": 13, + "waypoints": 39, + "densProp": 1.53, + "densWp": 4.59, + "espacamento": 8.09, + "razaoProp": 3.36, + "razaoWp": 1.1 }, { "q": "2,3", "x0": 0, - "z0": 19.8, - "areaAndavel": 128, - "props": 3, - "waypoints": 26, - "densProp": 2.34, - "densWp": 20.3, - "espacamento": 6.53, - "razaoProp": 0.58, - "razaoWp": 0.99 + "z0": 44, + "areaAndavel": 607, + "props": 7, + "waypoints": 20, + "densProp": 1.15, + "densWp": 3.3, + "espacamento": 9.31, + "razaoProp": 2.53, + "razaoWp": 0.79 }, { "q": "3,0", - "x0": 8.8, - "z0": -39.5, - "areaAndavel": 100, - "props": 8, - "waypoints": 24, - "densProp": 8.03, - "densWp": 24.09, - "espacamento": 3.53, - "razaoProp": 2, - "razaoWp": 1.17 + "x0": 22.8, + "z0": -76, + "areaAndavel": 889, + "props": 0, + "waypoints": 30, + "densProp": 0, + "densWp": 3.38, + "espacamento": 99, + "razaoProp": 0, + "razaoWp": 0.81 }, { "q": "3,1", - "x0": 8.8, - "z0": -19.8, - "areaAndavel": 148, - "props": 4, - "waypoints": 13, - "densProp": 2.7, - "densWp": 8.78, - "espacamento": 6.08, - "razaoProp": 0.67, - "razaoWp": 0.43 + "x0": 22.8, + "z0": -36, + "areaAndavel": 900, + "props": 0, + "waypoints": 45, + "densProp": 0, + "densWp": 5, + "espacamento": 99, + "razaoProp": 0, + "razaoWp": 1.2 }, { "q": "3,2", - "x0": 8.8, - "z0": 0, - "areaAndavel": 140, - "props": 6, - "waypoints": 20, - "densProp": 4.3, - "densWp": 14.32, - "espacamento": 4.83, - "razaoProp": 1.07, - "razaoWp": 0.7 + "x0": 22.8, + "z0": 4, + "areaAndavel": 900, + "props": 0, + "waypoints": 45, + "densProp": 0, + "densWp": 5, + "espacamento": 99, + "razaoProp": 0, + "razaoWp": 1.2 }, { "q": "3,3", - "x0": 8.8, - "z0": 19.8, - "areaAndavel": 115, - "props": 4, - "waypoints": 24, - "densProp": 3.48, - "densWp": 20.86, - "espacamento": 5.36, - "razaoProp": 0.87, - "razaoWp": 1.01 + "x0": 22.8, + "z0": 44, + "areaAndavel": 795, + "props": 0, + "waypoints": 20, + "densProp": 0, + "densWp": 2.52, + "espacamento": 99, + "razaoProp": 0, + "razaoWp": 0.61 } ], - "medianaProp": 4.02, - "medianaWp": 20.58, - "piorRazaoProp": 0.58, - "piorRazaoWp": 0.43, - "piorEspacamento": 6.53, + "medianaProp": 0.455, + "medianaWp": 4.155, + "piorRazaoProp": 0, + "piorRazaoWp": 0.55, + "piorEspacamento": 99, "bordasSemGuarda": [], "rotasSpawnBandeira": [ { - "time": "E", - "bandeira": "R", - "rotas": 2, - "comprimentos": [ - 53, - 67.3 - ] - }, - { - "time": "E", + "time": "B", "bandeira": "E", - "rotas": 3, - "comprimentos": [ - 35.5, - 38.5, - 64.5 - ] - }, - { - "time": "E", - "bandeira": "P", "rotas": 4, "comprimentos": [ - 24.5, - 35, - 35, - 35 + 99.7, + 103.3, + 117.3, + 118.4 ] }, { - "time": "E", - "bandeira": "B", + "time": "B", + "bandeira": "MID", "rotas": 4, "comprimentos": [ - 3.4, - 3.4, - 3.4, - 3.4 + 72.2, + 79.5, + 90.9, + 113.2 ] }, { "time": "B", - "bandeira": "R", + "bandeira": "B", "rotas": 4, "comprimentos": [ - 14.4, - 14.4, - 14.4, - 14.4 + 39.6, + 46.9, + 49.5, + 61.9 ] }, { - "time": "B", + "time": "E", "bandeira": "E", - "rotas": 3, + "rotas": 4, "comprimentos": [ - 44.1, - 53.6, - 85 + 32.6, + 45.1, + 47.6, + 66.3 ] }, { - "time": "B", - "bandeira": "P", - "rotas": 2, + "time": "E", + "bandeira": "MID", + "rotas": 4, "comprimentos": [ - 51, - 69.8 + 62.7, + 75.1, + 76.2, + 93.8 ] }, { - "time": "B", + "time": "E", "bandeira": "B", - "rotas": 2, + "rotas": 4, "comprimentos": [ - 66.7, - 73.2 + 92.7, + 102.6, + 110.3, + 120.2 ] } ], - "piorRotas": 2, + "piorRotas": 4, "bandeiras": [ - { - "id": "R", - "label": "MIRANTE", - "x": 7, - "z": -25, - "distSpawn": 9.34, - "timeSpawn": "B", - "maiorLinhaTiro": 0, - "chao": 6.12, - "penetracao": 0.02 - }, { "id": "E", - "label": "PATAMAR 2", - "x": -7, - "z": 1.5, - "distSpawn": 24.93, + "label": "CONGRESSO", + "x": -3.78, + "z": 26.04, + "distSpawn": 35.97, "timeSpawn": "E", - "maiorLinhaTiro": 32.9, + "maiorLinhaTiro": 107.6, "chao": 0, - "penetracao": 0 + "penetracao": 0.03 }, { - "id": "P", - "label": "PATAMAR 1", - "x": 7, - "z": 9, - "distSpawn": 17.61, + "id": "MID", + "label": "ÔNIBUS", + "x": 2.5, + "z": 2.5, + "distSpawn": 59.5, "timeSpawn": "E", - "maiorLinhaTiro": 33, - "chao": 2.04, - "penetracao": 0 + "maiorLinhaTiro": 89.3, + "chao": 0, + "penetracao": 0.03 }, { "id": "B", - "label": "RUA", - "x": -7, - "z": 28, - "distSpawn": 5.02, - "timeSpawn": "E", - "maiorLinhaTiro": 38.1, + "label": "CATEDRAL", + "x": -3.78, + "z": -26.04, + "distSpawn": 35.97, + "timeSpawn": "B", + "maiorLinhaTiro": 115.1, "chao": 0, - "penetracao": 0 + "penetracao": 0.05 } ], - "alturaTrianguloMin": 6.77 + "alturaTrianguloMin": 6.28 }, { - "map": "campomorro", - "celulasAlcancadas": 52528, - "amostrasChao": 3218, - "observadores": 805, + "map": "piscina_treta", + "celulasAlcancadas": 20863, + "amostrasChao": 1324, + "observadores": 331, "corpoDentroDeSolido": 0, "submersosAcimaDoPeito": 0, "piorPenetracao": 0, @@ -756,612 +603,568 @@ "spawns": [ { "team": "E", - "x": -4, - "z": -3, - "chao": -0.08, + "x": -9, + "z": -21, + "chao": 0, "penetracao": 0 }, { "team": "E", - "x": -1, - "z": -3, - "chao": -0.08, + "x": -3, + "z": -21, + "chao": 0, "penetracao": 0 }, { "team": "E", - "x": -4, - "z": 1, - "chao": -0.08, + "x": 3, + "z": -21, + "chao": 0, "penetracao": 0 }, { "team": "E", - "x": -1, - "z": 1, - "chao": -0.08, + "x": 9, + "z": -21, + "chao": 0, "penetracao": 0 }, { "team": "B", - "x": 29, - "z": -22, - "chao": 1, - "penetracao": 0.05 + "x": -9, + "z": 21, + "chao": 0, + "penetracao": 0 }, { "team": "B", - "x": 31, - "z": -22, - "chao": 1, - "penetracao": 0.05 + "x": -3, + "z": 21, + "chao": 0, + "penetracao": 0 }, { "team": "B", - "x": 29, - "z": -19, - "chao": 1, - "penetracao": 0.05 + "x": 3, + "z": 21, + "chao": 0, + "penetracao": 0 }, { "team": "B", - "x": 31, - "z": -19, - "chao": 1, - "penetracao": 0.05 + "x": 9, + "z": 21, + "chao": 0, + "penetracao": 0 } ], "exposicaoPorTime": [ { "team": "E", - "chaoMin": -0.08, - "chaoMax": -0.08, - "fracMedia": 0.6413, - "maiorVisada": 44.1 + "chaoMin": 0, + "chaoMax": 0, + "fracMedia": 0.1593, + "maiorVisada": 48.6 }, { "team": "B", - "chaoMin": 1, - "chaoMax": 1, - "fracMedia": 0.1497, - "maiorVisada": 73.8 + "chaoMin": 0, + "chaoMax": 0, + "fracMedia": 0.1569, + "maiorVisada": 47.7 } ], "exposicaoPorSpawn": [ { "team": "E", - "x": -4, - "z": -3, - "chao": -0.08, - "obsLonge": 377, - "obsVendo": 242, - "frac": 0.6419, - "maiorVisada": 44.1 + "x": -9, + "z": -21, + "chao": 0, + "obsLonge": 166, + "obsVendo": 52, + "frac": 0.3133, + "maiorVisada": 48.2 }, { "team": "E", - "x": -1, - "z": -3, - "chao": -0.08, - "obsLonge": 381, - "obsVendo": 235, - "frac": 0.6168, - "maiorVisada": 42.6 + "x": -3, + "z": -21, + "chao": 0, + "obsLonge": 151, + "obsVendo": 1, + "frac": 0.0066, + "maiorVisada": 27.1 }, { "team": "E", - "x": -4, - "z": 1, - "chao": -0.08, - "obsLonge": 379, - "obsVendo": 250, - "frac": 0.6596, - "maiorVisada": 42.3 + "x": 3, + "z": -21, + "chao": 0, + "obsLonge": 150, + "obsVendo": 0, + "frac": 0, + "maiorVisada": 0 }, { "team": "E", - "x": -1, - "z": 1, - "chao": -0.08, - "obsLonge": 385, - "obsVendo": 249, - "frac": 0.6468, - "maiorVisada": 40.1 + "x": 9, + "z": -21, + "chao": 0, + "obsLonge": 164, + "obsVendo": 52, + "frac": 0.3171, + "maiorVisada": 48.6 }, { "team": "B", - "x": 29, - "z": -22, - "chao": 1, - "obsLonge": 641, - "obsVendo": 56, - "frac": 0.0874, - "maiorVisada": 53.8 + "x": -9, + "z": 21, + "chao": 0, + "obsLonge": 170, + "obsVendo": 50, + "frac": 0.2941, + "maiorVisada": 47.3 }, { "team": "B", - "x": 31, - "z": -22, - "chao": 1, - "obsLonge": 655, - "obsVendo": 91, - "frac": 0.1389, - "maiorVisada": 62.3 + "x": -3, + "z": 21, + "chao": 0, + "obsLonge": 154, + "obsVendo": 2, + "frac": 0.013, + "maiorVisada": 28 }, { "team": "B", - "x": 29, - "z": -19, - "chao": 1, - "obsLonge": 622, - "obsVendo": 98, - "frac": 0.1576, - "maiorVisada": 58.7 + "x": 3, + "z": 21, + "chao": 0, + "obsLonge": 151, + "obsVendo": 2, + "frac": 0.0132, + "maiorVisada": 28.4 }, { "team": "B", - "x": 31, - "z": -19, - "chao": 1, - "obsLonge": 637, - "obsVendo": 137, - "frac": 0.2151, - "maiorVisada": 73.8 + "x": 9, + "z": 21, + "chao": 0, + "obsLonge": 166, + "obsVendo": 51, + "frac": 0.3072, + "maiorVisada": 47.7 } ], "salaDoSpawn": [ { "team": "E", - "x": -4, - "z": -3, - "folgaParede": 9.35, - "dirPior": 270, - "areaContigua": 78.6, + "x": -9, + "z": -21, + "folgaParede": 2.8, + "dirPior": 321, + "areaContigua": 62.4, "okFolga": true, "okArea": true }, { "team": "E", - "x": -1, - "z": -3, - "folgaParede": 9.55, - "dirPior": 259, - "areaContigua": 78.6, + "x": -3, + "z": -21, + "folgaParede": 2.1, + "dirPior": 39, + "areaContigua": 52.6, "okFolga": true, "okArea": true }, { "team": "E", - "x": -4, - "z": 1, - "folgaParede": 11.35, - "dirPior": 90, - "areaContigua": 78.6, + "x": 3, + "z": -21, + "folgaParede": 2.1, + "dirPior": 141, + "areaContigua": 52.6, "okFolga": true, "okArea": true }, { "team": "E", - "x": -1, - "z": 1, - "folgaParede": 11.55, - "dirPior": 101, - "areaContigua": 78.6, + "x": 9, + "z": -21, + "folgaParede": 2.8, + "dirPior": 219, + "areaContigua": 62.4, "okFolga": true, "okArea": true }, { "team": "B", - "x": 29, - "z": -22, - "folgaParede": 1.85, - "dirPior": 169, - "areaContigua": 51.2, + "x": -9, + "z": 21, + "folgaParede": 2.8, + "dirPior": 39, + "areaContigua": 62.4, "okFolga": true, "okArea": true }, { "team": "B", - "x": 31, - "z": -22, - "folgaParede": 2.85, - "dirPior": 0, - "areaContigua": 48, + "x": -3, + "z": 21, + "folgaParede": 2.1, + "dirPior": 321, + "areaContigua": 52.6, "okFolga": true, "okArea": true }, { "team": "B", - "x": 29, - "z": -19, - "folgaParede": 1.85, - "dirPior": 174, - "areaContigua": 56.4, + "x": 3, + "z": 21, + "folgaParede": 2.1, + "dirPior": 219, + "areaContigua": 52.6, "okFolga": true, "okArea": true }, { "team": "B", - "x": 31, - "z": -19, - "folgaParede": 2.85, - "dirPior": 0, - "areaContigua": 56.4, + "x": 9, + "z": 21, + "folgaParede": 2.8, + "dirPior": 141, + "areaContigua": 62.4, "okFolga": true, "okArea": true } ], - "piorFolga": 1.85, - "piorArea": 48, + "piorFolga": 2.1, + "piorArea": 52.6, "escadas": [], - "travessia": [ - { - "nivel": "galpao", - "celulasAlcancadas": 1231, - "waypointsNoNivel": 16, - "aEstrelaChega": true - } - ], + "travessia": [], "occluderSemMalha": [], - "occMedidos": 118, - "occPulados": 7, - "fracSemMalha": 0.005, + "occMedidos": 109, + "occPulados": 0, + "fracSemMalha": 0.0023, "quadrantes": [ { "q": "0,0", - "x0": -35.5, - "z0": -29.5, - "areaAndavel": 197, - "props": 5, - "waypoints": 30, - "densProp": 2.54, - "densWp": 15.24, - "espacamento": 6.27, - "razaoProp": 1, - "razaoWp": 0.89 + "x0": -16.5, + "z0": -24.5, + "areaAndavel": 76, + "props": 7, + "waypoints": 7, + "densProp": 9.17, + "densWp": 9.17, + "espacamento": 3.3, + "razaoProp": 1.21, + "razaoWp": 1.19 }, { "q": "0,1", - "x0": -35.5, - "z0": -14.8, - "areaAndavel": 187, - "props": 7, - "waypoints": 21, - "densProp": 3.74, - "densWp": 11.21, - "espacamento": 5.17, - "razaoProp": 1.47, - "razaoWp": 0.66 + "x0": -16.5, + "z0": -12.3, + "areaAndavel": 78, + "props": 5, + "waypoints": 4, + "densProp": 6.42, + "densWp": 5.14, + "espacamento": 3.95, + "razaoProp": 0.85, + "razaoWp": 0.67 }, { "q": "0,2", - "x0": -35.5, + "x0": -16.5, "z0": 0, - "areaAndavel": 195, - "props": 7, - "waypoints": 72, - "densProp": 3.59, - "densWp": 36.97, - "espacamento": 5.27, - "razaoProp": 1.41, - "razaoWp": 2.17 + "areaAndavel": 78, + "props": 6, + "waypoints": 6, + "densProp": 7.7, + "densWp": 7.7, + "espacamento": 3.6, + "razaoProp": 1.02, + "razaoWp": 1 }, { "q": "0,3", - "x0": -35.5, - "z0": 14.8, - "areaAndavel": 178, - "props": 4, - "waypoints": 37, - "densProp": 2.25, - "densWp": 20.78, - "espacamento": 6.67, - "razaoProp": 0.88, - "razaoWp": 1.22 + "x0": -16.5, + "z0": 12.3, + "areaAndavel": 78, + "props": 7, + "waypoints": 6, + "densProp": 8.95, + "densWp": 7.67, + "espacamento": 3.34, + "razaoProp": 1.18, + "razaoWp": 1 }, { "q": "1,0", - "x0": -17.8, - "z0": -29.5, - "areaAndavel": 202, - "props": 5, - "waypoints": 27, - "densProp": 2.48, - "densWp": 13.37, - "espacamento": 6.36, - "razaoProp": 0.97, - "razaoWp": 0.79 + "x0": -8.3, + "z0": -24.5, + "areaAndavel": 78, + "props": 6, + "waypoints": 8, + "densProp": 7.7, + "densWp": 10.26, + "espacamento": 3.6, + "razaoProp": 1.02, + "razaoWp": 1.34 }, { "q": "1,1", - "x0": -17.8, - "z0": -14.8, - "areaAndavel": 245, - "props": 6, - "waypoints": 30, - "densProp": 2.45, - "densWp": 12.26, - "espacamento": 6.39, - "razaoProp": 0.96, - "razaoWp": 0.72 + "x0": -8.3, + "z0": -12.3, + "areaAndavel": 89, + "props": 3, + "waypoints": 8, + "densProp": 3.37, + "densWp": 9, + "espacamento": 5.44, + "razaoProp": 0.45, + "razaoWp": 1.17 }, { "q": "1,2", - "x0": -17.8, + "x0": -8.3, "z0": 0, - "areaAndavel": 245, - "props": 6, - "waypoints": 46, - "densProp": 2.45, - "densWp": 18.8, - "espacamento": 6.39, - "razaoProp": 0.96, - "razaoWp": 1.1 + "areaAndavel": 89, + "props": 3, + "waypoints": 11, + "densProp": 3.37, + "densWp": 12.37, + "espacamento": 5.44, + "razaoProp": 0.45, + "razaoWp": 1.61 }, { "q": "1,3", - "x0": -17.8, - "z0": 14.8, - "areaAndavel": 167, - "props": 4, - "waypoints": 24, - "densProp": 2.39, - "densWp": 14.37, - "espacamento": 6.46, - "razaoProp": 0.94, - "razaoWp": 0.84 + "x0": -8.3, + "z0": 12.3, + "areaAndavel": 81, + "props": 6, + "waypoints": 8, + "densProp": 7.44, + "densWp": 9.92, + "espacamento": 3.67, + "razaoProp": 0.98, + "razaoWp": 1.29 }, { "q": "2,0", "x0": 0, - "z0": -29.5, - "areaAndavel": 199, - "props": 5, - "waypoints": 41, - "densProp": 2.52, - "densWp": 20.64, - "espacamento": 6.3, - "razaoProp": 0.99, - "razaoWp": 1.21 + "z0": -24.5, + "areaAndavel": 77, + "props": 7, + "waypoints": 6, + "densProp": 9.04, + "densWp": 7.75, + "espacamento": 3.33, + "razaoProp": 1.19, + "razaoWp": 1.01 }, { "q": "2,1", "x0": 0, - "z0": -14.8, - "areaAndavel": 241, - "props": 6, - "waypoints": 42, - "densProp": 2.49, - "densWp": 17.42, - "espacamento": 6.34, - "razaoProp": 0.98, - "razaoWp": 1.02 + "z0": -12.3, + "areaAndavel": 89, + "props": 3, + "waypoints": 4, + "densProp": 3.37, + "densWp": 4.5, + "espacamento": 5.44, + "razaoProp": 0.45, + "razaoWp": 0.59 }, { "q": "2,2", "x0": 0, "z0": 0, - "areaAndavel": 236, - "props": 7, - "waypoints": 64, - "densProp": 2.96, - "densWp": 27.1, - "espacamento": 5.81, - "razaoProp": 1.16, - "razaoWp": 1.59 + "areaAndavel": 89, + "props": 3, + "waypoints": 5, + "densProp": 3.37, + "densWp": 5.62, + "espacamento": 5.44, + "razaoProp": 0.45, + "razaoWp": 0.73 }, { "q": "2,3", "x0": 0, - "z0": 14.8, - "areaAndavel": 195, - "props": 5, - "waypoints": 34, - "densProp": 2.56, - "densWp": 17.44, - "espacamento": 6.24, - "razaoProp": 1, - "razaoWp": 1.02 + "z0": 12.3, + "areaAndavel": 80, + "props": 7, + "waypoints": 6, + "densProp": 8.74, + "densWp": 7.49, + "espacamento": 3.38, + "razaoProp": 1.15, + "razaoWp": 0.97 }, { "q": "3,0", - "x0": 17.8, - "z0": -29.5, - "areaAndavel": 181, - "props": 8, - "waypoints": 41, - "densProp": 4.42, - "densWp": 22.67, - "espacamento": 4.75, - "razaoProp": 1.73, - "razaoWp": 1.33 + "x0": 8.3, + "z0": -24.5, + "areaAndavel": 79, + "props": 7, + "waypoints": 7, + "densProp": 8.86, + "densWp": 8.86, + "espacamento": 3.36, + "razaoProp": 1.17, + "razaoWp": 1.15 }, { "q": "3,1", - "x0": 17.8, - "z0": -14.8, - "areaAndavel": 206, - "props": 7, - "waypoints": 27, - "densProp": 3.39, - "densWp": 13.08, - "espacamento": 5.43, - "razaoProp": 1.33, - "razaoWp": 0.77 + "x0": 8.3, + "z0": -12.3, + "areaAndavel": 81, + "props": 5, + "waypoints": 5, + "densProp": 6.18, + "densWp": 6.18, + "espacamento": 4.02, + "razaoProp": 0.82, + "razaoWp": 0.8 }, { "q": "3,2", - "x0": 17.8, + "x0": 8.3, "z0": 0, - "areaAndavel": 216, - "props": 8, - "waypoints": 36, - "densProp": 3.7, - "densWp": 16.64, - "espacamento": 5.2, - "razaoProp": 1.45, - "razaoWp": 0.98 + "areaAndavel": 81, + "props": 6, + "waypoints": 6, + "densProp": 7.41, + "densWp": 7.41, + "espacamento": 3.67, + "razaoProp": 0.98, + "razaoWp": 0.96 }, { "q": "3,3", - "x0": 17.8, - "z0": 14.8, - "areaAndavel": 193, - "props": 5, - "waypoints": 26, - "densProp": 2.59, - "densWp": 13.46, - "espacamento": 6.22, - "razaoProp": 1.02, - "razaoWp": 0.79 + "x0": 8.3, + "z0": 12.3, + "areaAndavel": 81, + "props": 7, + "waypoints": 6, + "densProp": 8.66, + "densWp": 7.42, + "espacamento": 3.4, + "razaoProp": 1.14, + "razaoWp": 0.97 } ], - "medianaProp": 2.55, - "medianaWp": 17.03, - "piorRazaoProp": 0.88, - "piorRazaoWp": 0.66, - "piorEspacamento": 6.67, + "medianaProp": 7.57, + "medianaWp": 7.6850000000000005, + "piorRazaoProp": 0.45, + "piorRazaoWp": 0.59, + "piorEspacamento": 5.44, "bordasSemGuarda": [], "rotasSpawnBandeira": [ { "time": "E", - "bandeira": "R", + "bandeira": "E", "rotas": 4, "comprimentos": [ - 11.1, - 11.1, - 11.1, - 11.1 - ] - }, - { - "time": "E", - "bandeira": "E", - "rotas": 4, - "comprimentos": [ - 15.6, - 15.6, - 15.6, - 15.6 + 11.6, + 11.6, + 11.6, + 11.6 ] }, { "time": "E", - "bandeira": "P", - "rotas": 4, + "bandeira": "MID", + "rotas": 2, "comprimentos": [ - 19.6, - 19.6, - 19.6, - 19.6 + 32.8, + 56.9 ] }, { "time": "E", "bandeira": "B", - "rotas": 4, - "comprimentos": [ - 15.8, - 15.8, - 15.8, - 15.8 - ] - }, - { - "time": "B", - "bandeira": "R", - "rotas": 3, + "rotas": 2, "comprimentos": [ - 48.7, - 57.6, - 58.2 + 39.6, + 51.2 ] }, { "time": "B", "bandeira": "E", - "rotas": 3, + "rotas": 2, "comprimentos": [ - 57.6, - 60, - 73.9 + 39.6, + 49.2 ] }, { "time": "B", - "bandeira": "P", - "rotas": 3, + "bandeira": "MID", + "rotas": 2, "comprimentos": [ - 37.1, - 44.9, - 71.5 + 32.8, + 45.3 ] }, { "time": "B", "bandeira": "B", - "rotas": 3, + "rotas": 4, "comprimentos": [ - 29.9, - 34.1, - 60.1 + 11.6, + 11.6, + 11.6, + 11.6 ] } ], - "piorRotas": 3, + "piorRotas": 2, "bandeiras": [ - { - "id": "R", - "label": "N", - "x": -12, - "z": -8, - "distSpawn": 9.43, - "timeSpawn": "E", - "maiorLinhaTiro": 53.5, - "chao": -0.08, - "penetracao": 0 - }, { "id": "E", - "label": "W", - "x": -15, - "z": 7, - "distSpawn": 12.53, + "label": "PARTIDA", + "x": 0, + "z": -13, + "distSpawn": 8.54, "timeSpawn": "E", - "maiorLinhaTiro": 54.4, - "chao": -0.08, + "maiorLinhaTiro": 37.7, + "chao": 0, "penetracao": 0 }, { - "id": "P", - "label": "SE", - "x": 13, - "z": 8, - "distSpawn": 15.65, + "id": "MID", + "label": "ARMÁRIOS", + "x": 12, + "z": 0, + "distSpawn": 21.21, "timeSpawn": "E", - "maiorLinhaTiro": 54, - "chao": -0.08, + "maiorLinhaTiro": 33.5, + "chao": 0, "penetracao": 0 }, { "id": "B", - "label": "S", - "x": 12, - "z": -7, - "distSpawn": 13.6, - "timeSpawn": "E", - "maiorLinhaTiro": 55.3, - "chao": -0.08, + "label": "TRAMPOLIM", + "x": 0, + "z": 14, + "distSpawn": 7.62, + "timeSpawn": "B", + "maiorLinhaTiro": 37.5, + "chao": 0, "penetracao": 0 } ], - "alturaTrianguloMin": 11.94 + "alturaTrianguloMin": 12 }, { - "map": "lajes", - "celulasAlcancadas": 8646, - "amostrasChao": 539, - "observadores": 134, + "map": "loja_h", + "celulasAlcancadas": 76347, + "amostrasChao": 4496, + "observadores": 1114, "corpoDentroDeSolido": 0, "submersosAcimaDoPeito": 0, "piorPenetracao": 0, @@ -1369,262 +1172,262 @@ "dentroTodos": [], "spawns": [ { - "team": "E", - "x": -1.9, - "z": -32.3, - "chao": 5.2, - "penetracao": 0 + "team": "B", + "x": 0, + "z": -39, + "chao": 3.4, + "penetracao": 0.02 }, { - "team": "E", - "x": -0.65, - "z": -32.3, - "chao": 5.2, - "penetracao": 0 + "team": "B", + "x": -6, + "z": -39, + "chao": 3.4, + "penetracao": 0.02 }, { - "team": "E", - "x": 0.65, - "z": -32.3, - "chao": 5.2, - "penetracao": 0 + "team": "B", + "x": 6, + "z": -39, + "chao": 3.4, + "penetracao": 0.02 }, { - "team": "E", - "x": 1.9, - "z": -32.3, - "chao": 5.2, - "penetracao": 0 + "team": "B", + "x": 3, + "z": -39, + "chao": 3.4, + "penetracao": 0.02 }, { - "team": "B", - "x": -1.9, - "z": 32.3, - "chao": 5.2, + "team": "E", + "x": -8, + "z": 55, + "chao": 0, "penetracao": 0 }, { - "team": "B", - "x": -0.65, - "z": 32.3, - "chao": 5.2, + "team": "E", + "x": -3, + "z": 55, + "chao": 0, "penetracao": 0 }, { - "team": "B", - "x": 0.65, - "z": 32.3, - "chao": 5.2, + "team": "E", + "x": 3, + "z": 55, + "chao": 0, "penetracao": 0 }, { - "team": "B", - "x": 1.9, - "z": 32.3, - "chao": 5.2, + "team": "E", + "x": 8, + "z": 55, + "chao": 0, "penetracao": 0 } ], "exposicaoPorTime": [ { - "team": "E", - "chaoMin": 5.2, - "chaoMax": 5.2, - "fracMedia": 1, - "maiorVisada": 67.4 + "team": "B", + "chaoMin": 3.4, + "chaoMax": 3.4, + "fracMedia": 0, + "maiorVisada": 0 }, { - "team": "B", - "chaoMin": 5.2, - "chaoMax": 5.2, - "fracMedia": 1, - "maiorVisada": 67.5 + "team": "E", + "chaoMin": 0, + "chaoMax": 0, + "fracMedia": 0.5338, + "maiorVisada": 89.7 } ], "exposicaoPorSpawn": [ { - "team": "E", - "x": -1.9, - "z": -32.3, - "chao": 5.2, - "obsLonge": 79, - "obsVendo": 79, - "frac": 1, - "maiorVisada": 67.4 + "team": "B", + "x": 0, + "z": -39, + "chao": 3.4, + "obsLonge": 917, + "obsVendo": 0, + "frac": 0, + "maiorVisada": 0 }, { - "team": "E", - "x": -0.65, - "z": -32.3, - "chao": 5.2, - "obsLonge": 79, - "obsVendo": 79, - "frac": 1, - "maiorVisada": 67.4 + "team": "B", + "x": -6, + "z": -39, + "chao": 3.4, + "obsLonge": 923, + "obsVendo": 0, + "frac": 0, + "maiorVisada": 0 }, { - "team": "E", - "x": 0.65, - "z": -32.3, - "chao": 5.2, - "obsLonge": 79, - "obsVendo": 79, - "frac": 1, - "maiorVisada": 67.3 + "team": "B", + "x": 6, + "z": -39, + "chao": 3.4, + "obsLonge": 924, + "obsVendo": 0, + "frac": 0, + "maiorVisada": 0 }, { - "team": "E", - "x": 1.9, - "z": -32.3, - "chao": 5.2, - "obsLonge": 78, - "obsVendo": 78, - "frac": 1, - "maiorVisada": 67.4 + "team": "B", + "x": 3, + "z": -39, + "chao": 3.4, + "obsLonge": 917, + "obsVendo": 0, + "frac": 0, + "maiorVisada": 0 }, { - "team": "B", - "x": -1.9, - "z": 32.3, - "chao": 5.2, - "obsLonge": 86, - "obsVendo": 86, - "frac": 1, - "maiorVisada": 67.4 + "team": "E", + "x": -8, + "z": 55, + "chao": 0, + "obsLonge": 934, + "obsVendo": 517, + "frac": 0.5535, + "maiorVisada": 89.7 }, { - "team": "B", - "x": -0.65, - "z": 32.3, - "chao": 5.2, - "obsLonge": 86, - "obsVendo": 86, - "frac": 1, - "maiorVisada": 67.4 + "team": "E", + "x": -3, + "z": 55, + "chao": 0, + "obsLonge": 930, + "obsVendo": 503, + "frac": 0.5409, + "maiorVisada": 88.6 }, { - "team": "B", - "x": 0.65, - "z": 32.3, - "chao": 5.2, - "obsLonge": 85, - "obsVendo": 85, - "frac": 1, - "maiorVisada": 67.4 + "team": "E", + "x": 3, + "z": 55, + "chao": 0, + "obsLonge": 929, + "obsVendo": 474, + "frac": 0.5102, + "maiorVisada": 88.5 }, { - "team": "B", - "x": 1.9, - "z": 32.3, - "chao": 5.2, - "obsLonge": 84, - "obsVendo": 84, - "frac": 1, - "maiorVisada": 67.5 + "team": "E", + "x": 8, + "z": 55, + "chao": 0, + "obsLonge": 931, + "obsVendo": 494, + "frac": 0.5306, + "maiorVisada": 89.5 } ], "salaDoSpawn": [ { - "team": "E", - "x": -1.9, - "z": -32.3, - "folgaParede": 2.65, - "dirPior": 174, - "areaContigua": 48.9, + "team": "B", + "x": 0, + "z": -39, + "folgaParede": 2.45, + "dirPior": 259, + "areaContigua": 46.4, "okFolga": true, "okArea": true }, { - "team": "E", - "x": -0.65, - "z": -32.3, - "folgaParede": 3.65, - "dirPior": 264, - "areaContigua": 55.3, + "team": "B", + "x": -6, + "z": -39, + "folgaParede": 2.45, + "dirPior": 259, + "areaContigua": 43.7, "okFolga": true, "okArea": true }, { - "team": "E", - "x": 0.65, - "z": -32.3, - "folgaParede": 3.15, - "dirPior": 326, - "areaContigua": 54.9, + "team": "B", + "x": 6, + "z": -39, + "folgaParede": 2.45, + "dirPior": 259, + "areaContigua": 43.7, "okFolga": true, "okArea": true }, { - "team": "E", - "x": 1.9, - "z": -32.3, - "folgaParede": 2.1, - "dirPior": 309, - "areaContigua": 47.1, + "team": "B", + "x": 3, + "z": -39, + "folgaParede": 2.45, + "dirPior": 259, + "areaContigua": 47.7, "okFolga": true, "okArea": true }, { - "team": "B", - "x": -1.9, - "z": 32.3, - "folgaParede": 2.4, - "dirPior": 124, - "areaContigua": 47, + "team": "E", + "x": -8, + "z": 55, + "folgaParede": 2.5, + "dirPior": 293, + "areaContigua": 51.5, "okFolga": true, "okArea": true }, { - "team": "B", - "x": -0.65, - "z": 32.3, - "folgaParede": 3.35, - "dirPior": 141, - "areaContigua": 53.4, + "team": "E", + "x": -3, + "z": 55, + "folgaParede": 3, + "dirPior": 231, + "areaContigua": 53.6, "okFolga": true, "okArea": true }, { - "team": "B", - "x": 0.65, - "z": 32.3, - "folgaParede": 3.25, - "dirPior": 39, - "areaContigua": 53.4, + "team": "E", + "x": 3, + "z": 55, + "folgaParede": 3, + "dirPior": 309, + "areaContigua": 53.6, "okFolga": true, "okArea": true }, { - "team": "B", - "x": 1.9, - "z": 32.3, - "folgaParede": 2.25, - "dirPior": 56, - "areaContigua": 46.3, + "team": "E", + "x": 8, + "z": 55, + "folgaParede": 2.5, + "dirPior": 247, + "areaContigua": 51.5, "okFolga": true, "okArea": true } ], - "piorFolga": 2.1, - "piorArea": 46.3, + "piorFolga": 2.45, + "piorArea": 43.7, "escadas": [ { - "nome": "ESCADARIA L1", - "x0": 3.9599999999999995, - "x1": 5.239999999999999, - "z0": -10, - "z1": -5.8, - "degraus": 13, - "espelhoMed": 0.1866, - "espelhoMin": 0.1733, - "espelhoMax": 0.3467, - "pisoMed": 0.2733, - "larguraMedida": 1.25, - "subida": 2.427, - "corrida": 3.3, - "inclinacaoGraus": 36.33, - "blondel": 0.646, - "desvioChaoDegrau": 0, + "nome": "escada L do mezanino", + "x0": 8.2, + "x1": 10.799999999999999, + "z0": -31, + "z1": -25.2, + "degraus": 19, + "espelhoMed": 0.17, + "espelhoMin": 0.17, + "espelhoMax": 0.17, + "pisoMed": 0.2911, + "larguraMedida": 2.35, + "subida": 3.23, + "corrida": 5.26, + "inclinacaoGraus": 31.55, + "blondel": 0.631, + "desvioChaoDegrau": 0.015, "okEspelho": true, "okPiso": true, "okBlondel": true, @@ -1633,397 +1436,8190 @@ "okDesvio": true }, { - "nome": "ESCADARIA L2", - "x0": 5.41, - "x1": 6.6899999999999995, - "z0": -10, - "z1": -5.8, - "degraus": 13, - "espelhoMed": 0.1866, - "espelhoMin": 0.1733, - "espelhoMax": 0.3467, - "pisoMed": 0.2733, - "larguraMedida": 1.25, - "subida": 2.427, - "corrida": 3.3, - "inclinacaoGraus": 36.33, - "blondel": 0.646, - "desvioChaoDegrau": 0, + "nome": "escada O do mezanino", + "x0": -11.4, + "x1": -8.8, + "z0": -31, + "z1": -25.2, + "degraus": 19, + "espelhoMed": 0.17, + "espelhoMin": 0.17, + "espelhoMax": 0.17, + "pisoMed": 0.2911, + "larguraMedida": 2.35, + "subida": 3.23, + "corrida": 5.26, + "inclinacaoGraus": 31.55, + "blondel": 0.631, + "desvioChaoDegrau": 0.015, "okEspelho": true, "okPiso": true, "okBlondel": true, "okLargura": true, "okInclinacao": true, "okDesvio": true + } + ], + "travessia": [ + { + "nivel": "mezanino", + "celulasAlcancadas": 3484, + "waypointsNoNivel": 89, + "aEstrelaChega": true + } + ], + "occluderSemMalha": [], + "occMedidos": 316, + "occPulados": 0, + "fracSemMalha": 0.0007, + "quadrantes": [ + { + "q": "0,0", + "x0": -37.5, + "z0": -57.5, + "areaAndavel": 90, + "props": 4, + "waypoints": 49, + "densProp": 4.43, + "densWp": 54.22, + "espacamento": 4.75, + "razaoProp": 1.11, + "razaoWp": 5.35 }, { - "nome": "BECO DO VARAL L1", - "x0": -5.239999999999999, - "x1": -3.9599999999999995, - "z0": 2, - "z1": 6.2, - "degraus": 13, - "espelhoMed": 0.1866, - "espelhoMin": 0.1733, - "espelhoMax": 0.3467, - "pisoMed": 0.2733, - "larguraMedida": 1.25, - "subida": 2.427, - "corrida": 3.3, - "inclinacaoGraus": 36.33, - "blondel": 0.646, - "desvioChaoDegrau": 0, - "okEspelho": true, - "okPiso": true, - "okBlondel": true, - "okLargura": true, - "okInclinacao": true, - "okDesvio": true + "q": "0,1", + "x0": -37.5, + "z0": -28.8, + "areaAndavel": 256, + "props": 11, + "waypoints": 38, + "densProp": 4.29, + "densWp": 14.84, + "espacamento": 4.83, + "razaoProp": 1.07, + "razaoWp": 1.46 }, { - "nome": "BECO DO VARAL L2", - "x0": -6.6899999999999995, - "x1": -5.41, - "z0": 2, - "z1": 6.2, - "degraus": 13, - "espelhoMed": 0.1866, - "espelhoMin": 0.1733, - "espelhoMax": 0.3467, - "pisoMed": 0.2733, - "larguraMedida": 1.25, - "subida": 2.427, - "corrida": 3.3, - "inclinacaoGraus": 36.33, - "blondel": 0.646, - "desvioChaoDegrau": 0, - "okEspelho": true, - "okPiso": true, - "okBlondel": true, - "okLargura": true, - "okInclinacao": true, - "okDesvio": true + "q": "0,2", + "x0": -37.5, + "z0": 0, + "areaAndavel": 363, + "props": 10, + "waypoints": 25, + "densProp": 2.76, + "densWp": 6.89, + "espacamento": 6.02, + "razaoProp": 0.69, + "razaoWp": 0.68 }, { - "nome": "ACESSO SUL L1", - "x0": 3.9599999999999995, - "x1": 5.239999999999999, - "z0": 17.8, - "z1": 22, - "degraus": 13, - "espelhoMed": 0.1866, - "espelhoMin": 0.1733, - "espelhoMax": 0.3467, - "pisoMed": 0.2733, - "larguraMedida": 1.25, - "subida": 2.427, - "corrida": 3.3, - "inclinacaoGraus": 36.33, - "blondel": 0.646, - "desvioChaoDegrau": 0, - "okEspelho": true, - "okPiso": true, - "okBlondel": true, - "okLargura": true, - "okInclinacao": true, - "okDesvio": true + "q": "0,3", + "x0": -37.5, + "z0": 28.8, + "areaAndavel": 328, + "props": 11, + "waypoints": 24, + "densProp": 3.35, + "densWp": 7.31, + "espacamento": 5.46, + "razaoProp": 0.84, + "razaoWp": 0.72 }, { - "nome": "ACESSO SUL L2", - "x0": 5.41, - "x1": 6.6899999999999995, - "z0": 17.8, - "z1": 22, - "degraus": 13, - "espelhoMed": 0.1866, - "espelhoMin": 0.1733, - "espelhoMax": 0.3467, - "pisoMed": 0.2733, - "larguraMedida": 1.25, - "subida": 2.427, - "corrida": 3.3, - "inclinacaoGraus": 36.33, - "blondel": 0.646, - "desvioChaoDegrau": 0, - "okEspelho": true, - "okPiso": true, - "okBlondel": true, - "okLargura": true, - "okInclinacao": true, - "okDesvio": true + "q": "1,0", + "x0": -18.8, + "z0": -57.5, + "areaAndavel": 178, + "props": 24, + "waypoints": 77, + "densProp": 13.52, + "densWp": 43.37, + "espacamento": 2.72, + "razaoProp": 3.38, + "razaoWp": 4.28 + }, + { + "q": "1,1", + "x0": -18.8, + "z0": -28.8, + "areaAndavel": 408, + "props": 46, + "waypoints": 45, + "densProp": 11.28, + "densWp": 11.04, + "espacamento": 2.98, + "razaoProp": 2.82, + "razaoWp": 1.09 + }, + { + "q": "1,2", + "x0": -18.8, + "z0": 0, + "areaAndavel": 366, + "props": 10, + "waypoints": 29, + "densProp": 2.74, + "densWp": 7.93, + "espacamento": 6.05, + "razaoProp": 0.68, + "razaoWp": 0.78 + }, + { + "q": "1,3", + "x0": -18.8, + "z0": 28.8, + "areaAndavel": 385, + "props": 12, + "waypoints": 34, + "densProp": 3.12, + "densWp": 8.84, + "espacamento": 5.66, + "razaoProp": 0.78, + "razaoWp": 0.87 + }, + { + "q": "2,0", + "x0": 0, + "z0": -57.5, + "areaAndavel": 185, + "props": 24, + "waypoints": 87, + "densProp": 12.97, + "densWp": 47.01, + "espacamento": 2.78, + "razaoProp": 3.24, + "razaoWp": 4.64 + }, + { + "q": "2,1", + "x0": 0, + "z0": -28.8, + "areaAndavel": 406, + "props": 52, + "waypoints": 52, + "densProp": 12.8, + "densWp": 12.8, + "espacamento": 2.8, + "razaoProp": 3.2, + "razaoWp": 1.26 + }, + { + "q": "2,2", + "x0": 0, + "z0": 0, + "areaAndavel": 387, + "props": 12, + "waypoints": 30, + "densProp": 3.1, + "densWp": 7.74, + "espacamento": 5.68, + "razaoProp": 0.77, + "razaoWp": 0.76 + }, + { + "q": "2,3", + "x0": 0, + "z0": 28.8, + "areaAndavel": 369, + "props": 14, + "waypoints": 34, + "densProp": 3.8, + "densWp": 9.23, + "espacamento": 5.13, + "razaoProp": 0.95, + "razaoWp": 0.91 + }, + { + "q": "3,0", + "x0": 18.8, + "z0": -57.5, + "areaAndavel": 93, + "props": 4, + "waypoints": 37, + "densProp": 4.3, + "densWp": 39.78, + "espacamento": 4.82, + "razaoProp": 1.07, + "razaoWp": 3.93 + }, + { + "q": "3,1", + "x0": 18.8, + "z0": -28.8, + "areaAndavel": 262, + "props": 11, + "waypoints": 29, + "densProp": 4.21, + "densWp": 11.09, + "espacamento": 4.88, + "razaoProp": 1.05, + "razaoWp": 1.09 + }, + { + "q": "3,2", + "x0": 18.8, + "z0": 0, + "areaAndavel": 365, + "props": 10, + "waypoints": 24, + "densProp": 2.74, + "densWp": 6.57, + "espacamento": 6.04, + "razaoProp": 0.68, + "razaoWp": 0.65 + }, + { + "q": "3,3", + "x0": 18.8, + "z0": 28.8, + "areaAndavel": 331, + "props": 11, + "waypoints": 22, + "densProp": 3.32, + "densWp": 6.64, + "espacamento": 5.49, + "razaoProp": 0.83, + "razaoWp": 0.66 + } + ], + "medianaProp": 4.005, + "medianaWp": 10.135, + "piorRazaoProp": 0.68, + "piorRazaoWp": 0.65, + "piorEspacamento": 6.05, + "bordasSemGuarda": [ + { + "x": -2.5, + "z": -31, + "queda": 3.4 + }, + { + "x": -2.25, + "z": -31, + "queda": 3.4 + }, + { + "x": -2, + "z": -31, + "queda": 3.4 + }, + { + "x": -1.75, + "z": -31, + "queda": 3.4 + }, + { + "x": -1.5, + "z": -31, + "queda": 3.4 + }, + { + "x": -1.25, + "z": -31, + "queda": 3.4 + }, + { + "x": -1, + "z": -31, + "queda": 3.4 + }, + { + "x": -0.75, + "z": -31, + "queda": 3.4 + }, + { + "x": -0.5, + "z": -31, + "queda": 3.4 + }, + { + "x": -0.25, + "z": -31, + "queda": 3.4 + }, + { + "x": 0, + "z": -31, + "queda": 3.4 + }, + { + "x": 0.25, + "z": -31, + "queda": 3.4 + }, + { + "x": 0.5, + "z": -31, + "queda": 3.4 + }, + { + "x": 0.75, + "z": -31, + "queda": 3.4 + }, + { + "x": 1, + "z": -31, + "queda": 3.4 + }, + { + "x": 1.25, + "z": -31, + "queda": 3.4 + }, + { + "x": 1.5, + "z": -31, + "queda": 3.4 + }, + { + "x": 1.75, + "z": -31, + "queda": 3.4 + }, + { + "x": 2, + "z": -31, + "queda": 3.4 + }, + { + "x": 2.25, + "z": -31, + "queda": 3.4 + }, + { + "x": 2.5, + "z": -31, + "queda": 3.4 + } + ], + "rotasSpawnBandeira": [ + { + "time": "B", + "bandeira": "PO", + "rotas": 2, + "comprimentos": [ + 98.4, + 103.4 + ] + }, + { + "time": "B", + "bandeira": "PL", + "rotas": 2, + "comprimentos": [ + 89.6, + 106.5 + ] + }, + { + "time": "B", + "bandeira": "BO", + "rotas": 2, + "comprimentos": [ + 34.4, + 61.8 + ] + }, + { + "time": "B", + "bandeira": "BL", + "rotas": 2, + "comprimentos": [ + 36.3, + 83.8 + ] + }, + { + "time": "E", + "bandeira": "PO", + "rotas": 3, + "comprimentos": [ + 26, + 95.7, + 153.2 + ] + }, + { + "time": "E", + "bandeira": "PL", + "rotas": 3, + "comprimentos": [ + 41, + 45, + 67.1 + ] + }, + { + "time": "E", + "bandeira": "BO", + "rotas": 3, + "comprimentos": [ + 90, + 106.5, + 149.7 + ] + }, + { + "time": "E", + "bandeira": "BL", + "rotas": 2, + "comprimentos": [ + 90.9, + 104.5 + ] + } + ], + "piorRotas": 2, + "bandeiras": [ + { + "id": "PO", + "label": "PÁTIO O", + "x": -21.5, + "z": 32, + "distSpawn": 26.67, + "timeSpawn": "E", + "maiorLinhaTiro": 77.4, + "chao": 0, + "penetracao": 0 + }, + { + "id": "PL", + "label": "PÁTIO L", + "x": 21.5, + "z": 32, + "distSpawn": 26.67, + "timeSpawn": "E", + "maiorLinhaTiro": 79.6, + "chao": 0, + "penetracao": 0 + }, + { + "id": "BO", + "label": "LOJA O", + "x": -20.5, + "z": -24, + "distSpawn": 20.86, + "timeSpawn": "B", + "maiorLinhaTiro": 81.5, + "chao": 0, + "penetracao": 0 + }, + { + "id": "BL", + "label": "LOJA L", + "x": 20.5, + "z": -24, + "distSpawn": 20.86, + "timeSpawn": "B", + "maiorLinhaTiro": 81.7, + "chao": 0, + "penetracao": 0 + } + ], + "alturaTrianguloMin": 32.8 + }, + { + "map": "ferro_velho", + "celulasAlcancadas": 54698, + "amostrasChao": 3401, + "observadores": 866, + "corpoDentroDeSolido": 0, + "submersosAcimaDoPeito": 0, + "piorPenetracao": 0, + "piores": [], + "dentroTodos": [], + "spawns": [ + { + "team": "E", + "x": -3.6, + "z": 33, + "chao": 0, + "penetracao": 0 + }, + { + "team": "E", + "x": -1.2, + "z": 33, + "chao": 0, + "penetracao": 0 + }, + { + "team": "E", + "x": 1.2, + "z": 33, + "chao": 0, + "penetracao": 0.012 + }, + { + "team": "E", + "x": 3.6, + "z": 33, + "chao": 0, + "penetracao": 0.012 + }, + { + "team": "B", + "x": -14, + "z": -25, + "chao": 0, + "penetracao": 0.018 + }, + { + "team": "B", + "x": -9, + "z": -25, + "chao": 0, + "penetracao": 0 + }, + { + "team": "B", + "x": -4, + "z": -25, + "chao": 0, + "penetracao": 0.012 + }, + { + "team": "B", + "x": 1, + "z": -25, + "chao": 0, + "penetracao": 0 + } + ], + "exposicaoPorTime": [ + { + "team": "E", + "chaoMin": 0, + "chaoMax": 0, + "fracMedia": 0.3358, + "maiorVisada": 71.7 + }, + { + "team": "B", + "chaoMin": 0, + "chaoMax": 0, + "fracMedia": 0.2307, + "maiorVisada": 61.5 + } + ], + "exposicaoPorSpawn": [ + { + "team": "E", + "x": -3.6, + "z": 33, + "chao": 0, + "obsLonge": 643, + "obsVendo": 212, + "frac": 0.3297, + "maiorVisada": 70.1 + }, + { + "team": "E", + "x": -1.2, + "z": 33, + "chao": 0, + "obsLonge": 641, + "obsVendo": 218, + "frac": 0.3401, + "maiorVisada": 68.8 + }, + { + "team": "E", + "x": 1.2, + "z": 33, + "chao": 0, + "obsLonge": 643, + "obsVendo": 218, + "frac": 0.339, + "maiorVisada": 70.8 + }, + { + "team": "E", + "x": 3.6, + "z": 33, + "chao": 0, + "obsLonge": 643, + "obsVendo": 215, + "frac": 0.3344, + "maiorVisada": 71.7 + }, + { + "team": "B", + "x": -14, + "z": -25, + "chao": 0, + "obsLonge": 622, + "obsVendo": 160, + "frac": 0.2572, + "maiorVisada": 59.6 + }, + { + "team": "B", + "x": -9, + "z": -25, + "chao": 0, + "obsLonge": 588, + "obsVendo": 108, + "frac": 0.1837, + "maiorVisada": 61 + }, + { + "team": "B", + "x": -4, + "z": -25, + "chao": 0, + "obsLonge": 566, + "obsVendo": 115, + "frac": 0.2032, + "maiorVisada": 59.1 + }, + { + "team": "B", + "x": 1, + "z": -25, + "chao": 0, + "obsLonge": 570, + "obsVendo": 159, + "frac": 0.2789, + "maiorVisada": 61.5 + } + ], + "salaDoSpawn": [ + { + "team": "E", + "x": -3.6, + "z": 33, + "folgaParede": 1.5, + "dirPior": 174, + "areaContigua": 55.6, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": -1.2, + "z": 33, + "folgaParede": 3.9, + "dirPior": 174, + "areaContigua": 55.8, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": 1.2, + "z": 33, + "folgaParede": 3.9, + "dirPior": 0, + "areaContigua": 55.3, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": 3.6, + "z": 33, + "folgaParede": 1.5, + "dirPior": 0, + "areaContigua": 51.2, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": -14, + "z": -25, + "folgaParede": 2.8, + "dirPior": 309, + "areaContigua": 66.2, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": -9, + "z": -25, + "folgaParede": 1.8, + "dirPior": 259, + "areaContigua": 53.3, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": -4, + "z": -25, + "folgaParede": 1.8, + "dirPior": 259, + "areaContigua": 52, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 1, + "z": -25, + "folgaParede": 1.8, + "dirPior": 259, + "areaContigua": 59.4, + "okFolga": true, + "okArea": true + } + ], + "piorFolga": 1.5, + "piorArea": 51.2, + "escadas": [], + "travessia": [], + "occluderSemMalha": [], + "occMedidos": 184, + "occPulados": 0, + "fracSemMalha": 0.0014, + "quadrantes": [ + { + "q": "0,0", + "x0": -31.5, + "z0": -35.5, + "areaAndavel": 217, + "props": 13, + "waypoints": 21, + "densProp": 5.99, + "densWp": 9.68, + "espacamento": 4.08, + "razaoProp": 1.41, + "razaoWp": 1.1 + }, + { + "q": "0,1", + "x0": -31.5, + "z0": -17.8, + "areaAndavel": 148, + "props": 21, + "waypoints": 19, + "densProp": 14.2, + "densWp": 12.84, + "espacamento": 2.65, + "razaoProp": 3.35, + "razaoWp": 1.46 + }, + { + "q": "0,2", + "x0": -31.5, + "z0": 0, + "areaAndavel": 148, + "props": 21, + "waypoints": 17, + "densProp": 14.2, + "densWp": 11.49, + "espacamento": 2.65, + "razaoProp": 3.35, + "razaoWp": 1.31 + }, + { + "q": "0,3", + "x0": -31.5, + "z0": 17.8, + "areaAndavel": 143, + "props": 31, + "waypoints": 13, + "densProp": 21.71, + "densWp": 9.1, + "espacamento": 2.15, + "razaoProp": 5.11, + "razaoWp": 1.04 + }, + { + "q": "1,0", + "x0": -15.8, + "z0": -35.5, + "areaAndavel": 213, + "props": 10, + "waypoints": 13, + "densProp": 4.7, + "densWp": 6.11, + "espacamento": 4.61, + "razaoProp": 1.11, + "razaoWp": 0.7 + }, + { + "q": "1,1", + "x0": -15.8, + "z0": -17.8, + "areaAndavel": 231, + "props": 6, + "waypoints": 21, + "densProp": 2.59, + "densWp": 9.07, + "espacamento": 6.21, + "razaoProp": 0.61, + "razaoWp": 1.03 + }, + { + "q": "1,2", + "x0": -15.8, + "z0": 0, + "areaAndavel": 232, + "props": 12, + "waypoints": 20, + "densProp": 5.18, + "densWp": 8.63, + "espacamento": 4.39, + "razaoProp": 1.22, + "razaoWp": 0.98 + }, + { + "q": "1,3", + "x0": -15.8, + "z0": 17.8, + "areaAndavel": 227, + "props": 9, + "waypoints": 17, + "densProp": 3.97, + "densWp": 7.49, + "espacamento": 5.02, + "razaoProp": 0.94, + "razaoWp": 0.85 + }, + { + "q": "2,0", + "x0": 0, + "z0": -35.5, + "areaAndavel": 224, + "props": 10, + "waypoints": 20, + "densProp": 4.46, + "densWp": 8.93, + "espacamento": 4.73, + "razaoProp": 1.05, + "razaoWp": 1.02 + }, + { + "q": "2,1", + "x0": 0, + "z0": -17.8, + "areaAndavel": 238, + "props": 7, + "waypoints": 24, + "densProp": 2.94, + "densWp": 10.07, + "espacamento": 5.83, + "razaoProp": 0.69, + "razaoWp": 1.15 + }, + { + "q": "2,2", + "x0": 0, + "z0": 0, + "areaAndavel": 239, + "props": 8, + "waypoints": 20, + "densProp": 3.35, + "densWp": 8.37, + "espacamento": 5.47, + "razaoProp": 0.79, + "razaoWp": 0.95 + }, + { + "q": "2,3", + "x0": 0, + "z0": 17.8, + "areaAndavel": 220, + "props": 12, + "waypoints": 21, + "densProp": 5.45, + "densWp": 9.53, + "espacamento": 4.28, + "razaoProp": 1.28, + "razaoWp": 1.09 + }, + { + "q": "3,0", + "x0": 15.8, + "z0": -35.5, + "areaAndavel": 243, + "props": 5, + "waypoints": 17, + "densProp": 2.06, + "densWp": 6.99, + "espacamento": 6.97, + "razaoProp": 0.49, + "razaoWp": 0.8 + }, + { + "q": "3,1", + "x0": 15.8, + "z0": -17.8, + "areaAndavel": 199, + "props": 8, + "waypoints": 17, + "densProp": 4.03, + "densWp": 8.55, + "espacamento": 4.98, + "razaoProp": 0.95, + "razaoWp": 0.97 + }, + { + "q": "3,2", + "x0": 15.8, + "z0": 0, + "areaAndavel": 256, + "props": 3, + "waypoints": 17, + "densProp": 1.17, + "densWp": 6.63, + "espacamento": 9.24, + "razaoProp": 0.28, + "razaoWp": 0.76 + }, + { + "q": "3,3", + "x0": 15.8, + "z0": 17.8, + "areaAndavel": 241, + "props": 7, + "waypoints": 18, + "densProp": 2.91, + "densWp": 7.47, + "espacamento": 5.87, + "razaoProp": 0.69, + "razaoWp": 0.85 + } + ], + "medianaProp": 4.245, + "medianaWp": 8.780000000000001, + "piorRazaoProp": 0.28, + "piorRazaoWp": 0.7, + "piorEspacamento": 9.24, + "bordasSemGuarda": [], + "rotasSpawnBandeira": [ + { + "time": "E", + "bandeira": "E", + "rotas": 3, + "comprimentos": [ + 32, + 34.8, + 48.4 + ] + }, + { + "time": "E", + "bandeira": "W", + "rotas": 3, + "comprimentos": [ + 43, + 56.6, + 103.9 + ] + }, + { + "time": "E", + "bandeira": "E", + "rotas": 2, + "comprimentos": [ + 62.3, + 89.5 + ] + }, + { + "time": "E", + "bandeira": "B", + "rotas": 3, + "comprimentos": [ + 53.2, + 76.4, + 78.4 + ] + }, + { + "time": "B", + "bandeira": "E", + "rotas": 4, + "comprimentos": [ + 32.8, + 41.6, + 49.2, + 88.1 + ] + }, + { + "time": "B", + "bandeira": "W", + "rotas": 3, + "comprimentos": [ + 31.4, + 38.2, + 103.9 + ] + }, + { + "time": "B", + "bandeira": "E", + "rotas": 2, + "comprimentos": [ + 51.8, + 55.5 + ] + }, + { + "time": "B", + "bandeira": "B", + "rotas": 4, + "comprimentos": [ + 11.6, + 11.6, + 11.6, + 11.6 + ] + } + ], + "piorRotas": 2, + "bandeiras": [ + { + "id": "E", + "label": "CENTRO", + "x": 0, + "z": 2, + "distSpawn": 27.02, + "timeSpawn": "B", + "maiorLinhaTiro": 44.6, + "chao": 0, + "penetracao": 0 + }, + { + "id": "W", + "label": "BECO OESTE", + "x": -23, + "z": 4, + "distSpawn": 30.36, + "timeSpawn": "B", + "maiorLinhaTiro": 53.8, + "chao": 0, + "penetracao": 0 + }, + { + "id": "E", + "label": "PÁTIO LESTE", + "x": 26, + "z": -16, + "distSpawn": 26.57, + "timeSpawn": "B", + "maiorLinhaTiro": 58.5, + "chao": 0, + "penetracao": 0 + }, + { + "id": "B", + "label": "GALPÃO", + "x": -8, + "z": -14, + "distSpawn": 11.05, + "timeSpawn": "B", + "maiorLinhaTiro": 52.7, + "chao": 0, + "penetracao": 0 + } + ], + "alturaTrianguloMin": 6.84 + }, + { + "map": "quebrada", + "celulasAlcancadas": 43385, + "amostrasChao": 2823, + "observadores": 723, + "corpoDentroDeSolido": 0, + "submersosAcimaDoPeito": 0, + "piorPenetracao": 0, + "piores": [], + "dentroTodos": [], + "spawns": [ + { + "team": "E", + "x": -22, + "z": -42.5, + "chao": 0, + "penetracao": 0 + }, + { + "team": "E", + "x": -19.5, + "z": -42.5, + "chao": 0, + "penetracao": 0 + }, + { + "team": "E", + "x": -17, + "z": -42.5, + "chao": 0, + "penetracao": 0 + }, + { + "team": "E", + "x": -14.5, + "z": -42.5, + "chao": 0, + "penetracao": 0 + }, + { + "team": "B", + "x": -4.5, + "z": 40.5, + "chao": 0, + "penetracao": 0 + }, + { + "team": "B", + "x": -1.5, + "z": 40.5, + "chao": 0, + "penetracao": 0 + }, + { + "team": "B", + "x": 1.5, + "z": 40.5, + "chao": 0, + "penetracao": 0 + }, + { + "team": "B", + "x": 4.5, + "z": 40.5, + "chao": 0, + "penetracao": 0 + } + ], + "exposicaoPorTime": [ + { + "team": "E", + "chaoMin": 0, + "chaoMax": 0, + "fracMedia": 0.088, + "maiorVisada": 70 + }, + { + "team": "B", + "chaoMin": 0, + "chaoMax": 0, + "fracMedia": 0.008, + "maiorVisada": 28.2 + } + ], + "exposicaoPorSpawn": [ + { + "team": "E", + "x": -22, + "z": -42.5, + "chao": 0, + "obsLonge": 629, + "obsVendo": 67, + "frac": 0.1065, + "maiorVisada": 70 + }, + { + "team": "E", + "x": -19.5, + "z": -42.5, + "chao": 0, + "obsLonge": 620, + "obsVendo": 33, + "frac": 0.0532, + "maiorVisada": 44.4 + }, + { + "team": "E", + "x": -17, + "z": -42.5, + "chao": 0, + "obsLonge": 607, + "obsVendo": 44, + "frac": 0.0725, + "maiorVisada": 41.9 + }, + { + "team": "E", + "x": -14.5, + "z": -42.5, + "chao": 0, + "obsLonge": 593, + "obsVendo": 71, + "frac": 0.1197, + "maiorVisada": 61.3 + }, + { + "team": "B", + "x": -4.5, + "z": 40.5, + "chao": 0, + "obsLonge": 505, + "obsVendo": 9, + "frac": 0.0178, + "maiorVisada": 27.5 + }, + { + "team": "B", + "x": -1.5, + "z": 40.5, + "chao": 0, + "obsLonge": 497, + "obsVendo": 0, + "frac": 0, + "maiorVisada": 0 + }, + { + "team": "B", + "x": 1.5, + "z": 40.5, + "chao": 0, + "obsLonge": 492, + "obsVendo": 1, + "frac": 0.002, + "maiorVisada": 25.5 + }, + { + "team": "B", + "x": 4.5, + "z": 40.5, + "chao": 0, + "obsLonge": 496, + "obsVendo": 6, + "frac": 0.0121, + "maiorVisada": 28.2 + } + ], + "salaDoSpawn": [ + { + "team": "E", + "x": -22, + "z": -42.5, + "folgaParede": 2.55, + "dirPior": 259, + "areaContigua": 42.9, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": -19.5, + "z": -42.5, + "folgaParede": 2.35, + "dirPior": 84, + "areaContigua": 49.9, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": -17, + "z": -42.5, + "folgaParede": 2.35, + "dirPior": 84, + "areaContigua": 48.3, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": -14.5, + "z": -42.5, + "folgaParede": 2.1, + "dirPior": 343, + "areaContigua": 45.8, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": -4.5, + "z": 40.5, + "folgaParede": 4, + "dirPior": 62, + "areaContigua": 75.3, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": -1.5, + "z": 40.5, + "folgaParede": 3.7, + "dirPior": 107, + "areaContigua": 77.8, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 1.5, + "z": 40.5, + "folgaParede": 3.7, + "dirPior": 73, + "areaContigua": 77.8, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 4.5, + "z": 40.5, + "folgaParede": 4, + "dirPior": 118, + "areaContigua": 76, + "okFolga": true, + "okArea": true + } + ], + "piorFolga": 2.1, + "piorArea": 42.9, + "escadas": [], + "travessia": [], + "occluderSemMalha": [], + "occMedidos": 433, + "occPulados": 0, + "fracSemMalha": 0.0037, + "quadrantes": [ + { + "q": "0,0", + "x0": -27.5, + "z0": -46.5, + "areaAndavel": 104, + "props": 17, + "waypoints": 24, + "densProp": 16.33, + "densWp": 23.05, + "espacamento": 2.47, + "razaoProp": 1.17, + "razaoWp": 2.12 + }, + { + "q": "0,1", + "x0": -27.5, + "z0": -23.3, + "areaAndavel": 82, + "props": 15, + "waypoints": 20, + "densProp": 18.26, + "densWp": 24.35, + "espacamento": 2.34, + "razaoProp": 1.31, + "razaoWp": 2.24 + }, + { + "q": "0,2", + "x0": -27.5, + "z0": 0, + "areaAndavel": 97, + "props": 19, + "waypoints": 26, + "densProp": 19.55, + "densWp": 26.75, + "espacamento": 2.26, + "razaoProp": 1.4, + "razaoWp": 2.46 + }, + { + "q": "0,3", + "x0": -27.5, + "z0": 23.3, + "areaAndavel": 118, + "props": 17, + "waypoints": 16, + "densProp": 14.41, + "densWp": 13.56, + "espacamento": 2.63, + "razaoProp": 1.03, + "razaoWp": 1.25 + }, + { + "q": "1,0", + "x0": -13.8, + "z0": -46.5, + "areaAndavel": 193, + "props": 47, + "waypoints": 16, + "densProp": 24.4, + "densWp": 8.31, + "espacamento": 2.02, + "razaoProp": 1.75, + "razaoWp": 0.76 + }, + { + "q": "1,1", + "x0": -13.8, + "z0": -23.3, + "areaAndavel": 206, + "props": 24, + "waypoints": 19, + "densProp": 11.64, + "densWp": 9.21, + "espacamento": 2.93, + "razaoProp": 0.83, + "razaoWp": 0.85 + }, + { + "q": "1,2", + "x0": -13.8, + "z0": 0, + "areaAndavel": 241, + "props": 22, + "waypoints": 20, + "densProp": 9.13, + "densWp": 8.3, + "espacamento": 3.31, + "razaoProp": 0.65, + "razaoWp": 0.76 + }, + { + "q": "1,3", + "x0": -13.8, + "z0": 23.3, + "areaAndavel": 264, + "props": 9, + "waypoints": 23, + "densProp": 3.41, + "densWp": 8.71, + "espacamento": 5.42, + "razaoProp": 0.24, + "razaoWp": 0.8 + }, + { + "q": "2,0", + "x0": 0, + "z0": -46.5, + "areaAndavel": 207, + "props": 28, + "waypoints": 20, + "densProp": 13.52, + "densWp": 9.66, + "espacamento": 2.72, + "razaoProp": 0.97, + "razaoWp": 0.89 + }, + { + "q": "2,1", + "x0": 0, + "z0": -23.3, + "areaAndavel": 269, + "props": 16, + "waypoints": 28, + "densProp": 5.95, + "densWp": 10.42, + "espacamento": 4.1, + "razaoProp": 0.43, + "razaoWp": 0.96 + }, + { + "q": "2,2", + "x0": 0, + "z0": 0, + "areaAndavel": 250, + "props": 21, + "waypoints": 25, + "densProp": 8.39, + "densWp": 9.99, + "espacamento": 3.45, + "razaoProp": 0.6, + "razaoWp": 0.92 + }, + { + "q": "2,3", + "x0": 0, + "z0": 23.3, + "areaAndavel": 267, + "props": 10, + "waypoints": 26, + "densProp": 3.75, + "densWp": 9.74, + "espacamento": 5.17, + "razaoProp": 0.27, + "razaoWp": 0.9 + }, + { + "q": "3,0", + "x0": 13.8, + "z0": -46.5, + "areaAndavel": 71, + "props": 19, + "waypoints": 19, + "densProp": 26.74, + "densWp": 26.74, + "espacamento": 1.93, + "razaoProp": 1.91, + "razaoWp": 2.46 + }, + { + "q": "3,1", + "x0": 13.8, + "z0": -23.3, + "areaAndavel": 90, + "props": 14, + "waypoints": 20, + "densProp": 15.53, + "densWp": 22.19, + "espacamento": 2.54, + "razaoProp": 1.11, + "razaoWp": 2.04 + }, + { + "q": "3,2", + "x0": 13.8, + "z0": 0, + "areaAndavel": 93, + "props": 23, + "waypoints": 23, + "densProp": 24.78, + "densWp": 24.78, + "espacamento": 2.01, + "razaoProp": 1.77, + "razaoWp": 2.28 + }, + { + "q": "3,3", + "x0": 13.8, + "z0": 23.3, + "areaAndavel": 159, + "props": 14, + "waypoints": 18, + "densProp": 8.8, + "densWp": 11.31, + "espacamento": 3.37, + "razaoProp": 0.63, + "razaoWp": 1.04 + } + ], + "medianaProp": 13.965, + "medianaWp": 10.865, + "piorRazaoProp": 0.24, + "piorRazaoWp": 0.76, + "piorEspacamento": 5.42, + "bordasSemGuarda": [], + "rotasSpawnBandeira": [ + { + "time": "E", + "bandeira": "R", + "rotas": 2, + "comprimentos": [ + 36.5, + 98.3 + ] + }, + { + "time": "E", + "bandeira": "E", + "rotas": 2, + "comprimentos": [ + 49.6, + 90.1 + ] + }, + { + "time": "E", + "bandeira": "B", + "rotas": 2, + "comprimentos": [ + 64.6, + 84.8 + ] + }, + { + "time": "E", + "bandeira": "C", + "rotas": 2, + "comprimentos": [ + 84.2, + 96.8 + ] + }, + { + "time": "B", + "bandeira": "R", + "rotas": 2, + "comprimentos": [ + 81.3, + 87.5 + ] + }, + { + "time": "B", + "bandeira": "E", + "rotas": 2, + "comprimentos": [ + 75.9, + 96.5 + ] + }, + { + "time": "B", + "bandeira": "B", + "rotas": 2, + "comprimentos": [ + 45.3, + 48.7 + ] + }, + { + "time": "B", + "bandeira": "C", + "rotas": 4, + "comprimentos": [ + 10.2, + 10.2, + 10.2, + 10.2 + ] + } + ], + "piorRotas": 2, + "bandeiras": [ + { + "id": "R", + "label": "BAILE", + "x": 5, + "z": -30.5, + "distSpawn": 22.9, + "timeSpawn": "E", + "maiorLinhaTiro": 78.2, + "chao": 0, + "penetracao": 0 + }, + { + "id": "E", + "label": "PONTO DE ÔNIBUS", + "x": -10, + "z": -6, + "distSpawn": 36.78, + "timeSpawn": "E", + "maiorLinhaTiro": 51.5, + "chao": 0, + "penetracao": 0.02 + }, + { + "id": "B", + "label": "BAR DA ESQUINA", + "x": 9.5, + "z": 6, + "distSpawn": 34.86, + "timeSpawn": "B", + "maiorLinhaTiro": 52.9, + "chao": 0, + "penetracao": 0.02 + }, + { + "id": "C", + "label": "CAMPINHO", + "x": -6, + "z": 30, + "distSpawn": 10.61, + "timeSpawn": "B", + "maiorLinhaTiro": 30.7, + "chao": 0, + "penetracao": 0 + } + ], + "alturaTrianguloMin": 10.38 + }, + { + "map": "escadao", + "celulasAlcancadas": 31609, + "amostrasChao": 2003, + "observadores": 496, + "corpoDentroDeSolido": 0, + "submersosAcimaDoPeito": 0, + "piorPenetracao": 0, + "piores": [], + "dentroTodos": [], + "spawns": [ + { + "team": "E", + "x": -2.4, + "z": 26, + "chao": 0, + "penetracao": 0.01 + }, + { + "team": "E", + "x": -0.8, + "z": 26, + "chao": 0, + "penetracao": 0.01 + }, + { + "team": "E", + "x": 0.8, + "z": 26, + "chao": 0, + "penetracao": 0.01 + }, + { + "team": "E", + "x": 2.4, + "z": 26, + "chao": 0, + "penetracao": 0.01 + }, + { + "team": "B", + "x": -4.5, + "z": -34, + "chao": 6.12, + "penetracao": 0.02 + }, + { + "team": "B", + "x": -1.5, + "z": -34, + "chao": 6.12, + "penetracao": 0.02 + }, + { + "team": "B", + "x": 1.5, + "z": -34, + "chao": 6.12, + "penetracao": 0.02 + }, + { + "team": "B", + "x": 4.5, + "z": -34, + "chao": 6.12, + "penetracao": 0.02 + } + ], + "exposicaoPorTime": [ + { + "team": "E", + "chaoMin": 0, + "chaoMax": 0, + "fracMedia": 0, + "maiorVisada": 0 + }, + { + "team": "B", + "chaoMin": 6.12, + "chaoMax": 6.12, + "fracMedia": 0.1611, + "maiorVisada": 74 + } + ], + "exposicaoPorSpawn": [ + { + "team": "E", + "x": -2.4, + "z": 26, + "chao": 0, + "obsLonge": 274, + "obsVendo": 0, + "frac": 0, + "maiorVisada": 0 + }, + { + "team": "E", + "x": -0.8, + "z": 26, + "chao": 0, + "obsLonge": 270, + "obsVendo": 0, + "frac": 0, + "maiorVisada": 0 + }, + { + "team": "E", + "x": 0.8, + "z": 26, + "chao": 0, + "obsLonge": 269, + "obsVendo": 0, + "frac": 0, + "maiorVisada": 0 + }, + { + "team": "E", + "x": 2.4, + "z": 26, + "chao": 0, + "obsLonge": 269, + "obsVendo": 0, + "frac": 0, + "maiorVisada": 0 + }, + { + "team": "B", + "x": -4.5, + "z": -34, + "chao": 6.12, + "obsLonge": 314, + "obsVendo": 51, + "frac": 0.1624, + "maiorVisada": 45.6 + }, + { + "team": "B", + "x": -1.5, + "z": -34, + "chao": 6.12, + "obsLonge": 305, + "obsVendo": 52, + "frac": 0.1705, + "maiorVisada": 66 + }, + { + "team": "B", + "x": 1.5, + "z": -34, + "chao": 6.12, + "obsLonge": 308, + "obsVendo": 61, + "frac": 0.1981, + "maiorVisada": 74 + }, + { + "team": "B", + "x": 4.5, + "z": -34, + "chao": 6.12, + "obsLonge": 308, + "obsVendo": 35, + "frac": 0.1136, + "maiorVisada": 45.2 + } + ], + "salaDoSpawn": [ + { + "team": "E", + "x": -2.4, + "z": 26, + "folgaParede": 1.65, + "dirPior": 247, + "areaContigua": 65, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": -0.8, + "z": 26, + "folgaParede": 2.7, + "dirPior": 214, + "areaContigua": 68.8, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": 0.8, + "z": 26, + "folgaParede": 2.7, + "dirPior": 326, + "areaContigua": 68.8, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": 2.4, + "z": 26, + "folgaParede": 1.65, + "dirPior": 293, + "areaContigua": 63.2, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": -4.5, + "z": -34, + "folgaParede": 3.85, + "dirPior": 259, + "areaContigua": 74.4, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": -1.5, + "z": -34, + "folgaParede": 5.35, + "dirPior": 225, + "areaContigua": 78.4, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 1.5, + "z": -34, + "folgaParede": 5.35, + "dirPior": 315, + "areaContigua": 78.4, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 4.5, + "z": -34, + "folgaParede": 3.85, + "dirPior": 281, + "areaContigua": 73.1, + "okFolga": true, + "okArea": true + } + ], + "piorFolga": 1.65, + "piorArea": 63.2, + "escadas": [ + { + "nome": "lance inferior", + "x0": -2.5, + "x1": 2.5, + "z0": 10.52, + "z1": 14.29, + "degraus": 12, + "espelhoMed": 0.1692, + "espelhoMin": 0.16, + "espelhoMax": 0.17, + "pisoMed": 0.2909, + "larguraMedida": 5, + "subida": 2.03, + "corrida": 3.22, + "inclinacaoGraus": 32.23, + "blondel": 0.629, + "desvioChaoDegrau": 0.01, + "okEspelho": true, + "okPiso": true, + "okBlondel": true, + "okLargura": true, + "okInclinacao": true, + "okDesvio": true + }, + { + "nome": "lance central", + "x0": 0, + "x1": 2.5, + "z0": 3.04, + "z1": 6.81, + "degraus": 12, + "espelhoMed": 0.1692, + "espelhoMin": 0.16, + "espelhoMax": 0.17, + "pisoMed": 0.2909, + "larguraMedida": 4.55, + "subida": 2.03, + "corrida": 3.22, + "inclinacaoGraus": 32.23, + "blondel": 0.629, + "desvioChaoDegrau": 0.01, + "okEspelho": true, + "okPiso": true, + "okBlondel": true, + "okLargura": true, + "okInclinacao": true, + "okDesvio": true + }, + { + "nome": "lance superior", + "x0": -2.5, + "x1": 2.5, + "z0": -5.4399999999999995, + "z1": -1.67, + "degraus": 12, + "espelhoMed": 0.1692, + "espelhoMin": 0.16, + "espelhoMax": 0.17, + "pisoMed": 0.2909, + "larguraMedida": 5, + "subida": 2.03, + "corrida": 3.22, + "inclinacaoGraus": 32.23, + "blondel": 0.629, + "desvioChaoDegrau": 0.01, + "okEspelho": true, + "okPiso": true, + "okBlondel": true, + "okLargura": true, + "okInclinacao": true, + "okDesvio": true + }, + { + "nome": "flanco oeste central", + "x0": -13.5, + "x1": -10.5, + "z0": 1.8400000000000007, + "z1": 5.61, + "degraus": 12, + "espelhoMed": 0.1692, + "espelhoMin": 0.16, + "espelhoMax": 0.17, + "pisoMed": 0.2909, + "larguraMedida": 3, + "subida": 2.03, + "corrida": 3.22, + "inclinacaoGraus": 32.23, + "blondel": 0.629, + "desvioChaoDegrau": 0.01, + "okEspelho": true, + "okPiso": true, + "okBlondel": true, + "okLargura": true, + "okInclinacao": true, + "okDesvio": true + }, + { + "nome": "flanco oeste superior", + "x0": -13.5, + "x1": -10.5, + "z0": -5.4399999999999995, + "z1": -1.67, + "degraus": 12, + "espelhoMed": 0.1692, + "espelhoMin": 0.16, + "espelhoMax": 0.17, + "pisoMed": 0.2909, + "larguraMedida": 3, + "subida": 2.03, + "corrida": 3.22, + "inclinacaoGraus": 32.23, + "blondel": 0.629, + "desvioChaoDegrau": 0.01, + "okEspelho": true, + "okPiso": true, + "okBlondel": true, + "okLargura": true, + "okInclinacao": true, + "okDesvio": true + } + ], + "travessia": [ + { + "nivel": "mirante", + "celulasAlcancadas": 13724, + "waypointsNoNivel": 126, + "aEstrelaChega": true + } + ], + "occluderSemMalha": [], + "occMedidos": 443, + "occPulados": 0, + "fracSemMalha": 0.0014, + "quadrantes": [ + { + "q": "0,0", + "x0": -17.5, + "z0": -39.5, + "areaAndavel": 112, + "props": 7, + "waypoints": 32, + "densProp": 6.26, + "densWp": 28.62, + "espacamento": 4, + "razaoProp": 1.56, + "razaoWp": 1.39 + }, + { + "q": "0,1", + "x0": -17.5, + "z0": -19.8, + "areaAndavel": 132, + "props": 12, + "waypoints": 32, + "densProp": 9.07, + "densWp": 24.2, + "espacamento": 3.32, + "razaoProp": 2.26, + "razaoWp": 1.18 + }, + { + "q": "0,2", + "x0": -17.5, + "z0": 0, + "areaAndavel": 126, + "props": 13, + "waypoints": 35, + "densProp": 10.32, + "densWp": 27.78, + "espacamento": 3.11, + "razaoProp": 2.57, + "razaoWp": 1.35 + }, + { + "q": "0,3", + "x0": -17.5, + "z0": 19.8, + "areaAndavel": 113, + "props": 5, + "waypoints": 31, + "densProp": 4.43, + "densWp": 27.46, + "espacamento": 4.75, + "razaoProp": 1.1, + "razaoWp": 1.33 + }, + { + "q": "1,0", + "x0": -8.8, + "z0": -39.5, + "areaAndavel": 134, + "props": 5, + "waypoints": 17, + "densProp": 3.74, + "densWp": 12.71, + "espacamento": 5.17, + "razaoProp": 0.93, + "razaoWp": 0.62 + }, + { + "q": "1,1", + "x0": -8.8, + "z0": -19.8, + "areaAndavel": 131, + "props": 4, + "waypoints": 14, + "densProp": 3.05, + "densWp": 10.67, + "espacamento": 5.73, + "razaoProp": 0.76, + "razaoWp": 0.52 + }, + { + "q": "1,2", + "x0": -8.8, + "z0": 0, + "areaAndavel": 83, + "props": 14, + "waypoints": 21, + "densProp": 16.93, + "densWp": 25.4, + "espacamento": 2.43, + "razaoProp": 4.21, + "razaoWp": 1.23 + }, + { + "q": "1,3", + "x0": -8.8, + "z0": 19.8, + "areaAndavel": 127, + "props": 3, + "waypoints": 16, + "densProp": 2.36, + "densWp": 12.57, + "espacamento": 6.51, + "razaoProp": 0.59, + "razaoWp": 0.61 + }, + { + "q": "2,0", + "x0": 0, + "z0": -39.5, + "areaAndavel": 135, + "props": 5, + "waypoints": 27, + "densProp": 3.7, + "densWp": 20, + "espacamento": 5.2, + "razaoProp": 0.92, + "razaoWp": 0.97 + }, + { + "q": "2,1", + "x0": 0, + "z0": -19.8, + "areaAndavel": 142, + "props": 4, + "waypoints": 28, + "densProp": 2.81, + "densWp": 19.7, + "espacamento": 5.96, + "razaoProp": 0.7, + "razaoWp": 0.96 + }, + { + "q": "2,2", + "x0": 0, + "z0": 0, + "areaAndavel": 110, + "props": 15, + "waypoints": 38, + "densProp": 13.62, + "densWp": 34.51, + "espacamento": 2.71, + "razaoProp": 3.39, + "razaoWp": 1.68 + }, + { + "q": "2,3", + "x0": 0, + "z0": 19.8, + "areaAndavel": 128, + "props": 3, + "waypoints": 26, + "densProp": 2.34, + "densWp": 20.3, + "espacamento": 6.53, + "razaoProp": 0.58, + "razaoWp": 0.99 + }, + { + "q": "3,0", + "x0": 8.8, + "z0": -39.5, + "areaAndavel": 100, + "props": 8, + "waypoints": 24, + "densProp": 8.03, + "densWp": 24.09, + "espacamento": 3.53, + "razaoProp": 2, + "razaoWp": 1.17 + }, + { + "q": "3,1", + "x0": 8.8, + "z0": -19.8, + "areaAndavel": 148, + "props": 4, + "waypoints": 13, + "densProp": 2.7, + "densWp": 8.78, + "espacamento": 6.08, + "razaoProp": 0.67, + "razaoWp": 0.43 + }, + { + "q": "3,2", + "x0": 8.8, + "z0": 0, + "areaAndavel": 140, + "props": 6, + "waypoints": 20, + "densProp": 4.3, + "densWp": 14.32, + "espacamento": 4.83, + "razaoProp": 1.07, + "razaoWp": 0.7 + }, + { + "q": "3,3", + "x0": 8.8, + "z0": 19.8, + "areaAndavel": 115, + "props": 4, + "waypoints": 24, + "densProp": 3.48, + "densWp": 20.86, + "espacamento": 5.36, + "razaoProp": 0.87, + "razaoWp": 1.01 + } + ], + "medianaProp": 4.02, + "medianaWp": 20.58, + "piorRazaoProp": 0.58, + "piorRazaoWp": 0.43, + "piorEspacamento": 6.53, + "bordasSemGuarda": [], + "rotasSpawnBandeira": [ + { + "time": "E", + "bandeira": "R", + "rotas": 2, + "comprimentos": [ + 53, + 67.3 + ] + }, + { + "time": "E", + "bandeira": "E", + "rotas": 3, + "comprimentos": [ + 35.5, + 38.5, + 64.5 + ] + }, + { + "time": "E", + "bandeira": "P", + "rotas": 4, + "comprimentos": [ + 24.5, + 35, + 35, + 35 + ] + }, + { + "time": "E", + "bandeira": "B", + "rotas": 4, + "comprimentos": [ + 3.4, + 3.4, + 3.4, + 3.4 + ] + }, + { + "time": "B", + "bandeira": "R", + "rotas": 4, + "comprimentos": [ + 14.4, + 14.4, + 14.4, + 14.4 + ] + }, + { + "time": "B", + "bandeira": "E", + "rotas": 3, + "comprimentos": [ + 44.1, + 53.6, + 85 + ] + }, + { + "time": "B", + "bandeira": "P", + "rotas": 2, + "comprimentos": [ + 51, + 69.8 + ] + }, + { + "time": "B", + "bandeira": "B", + "rotas": 2, + "comprimentos": [ + 66.7, + 73.2 + ] + } + ], + "piorRotas": 2, + "bandeiras": [ + { + "id": "R", + "label": "MIRANTE", + "x": 7, + "z": -25, + "distSpawn": 9.34, + "timeSpawn": "B", + "maiorLinhaTiro": 0, + "chao": 6.12, + "penetracao": 0.02 + }, + { + "id": "E", + "label": "PATAMAR 2", + "x": -7, + "z": 1.5, + "distSpawn": 24.93, + "timeSpawn": "E", + "maiorLinhaTiro": 32.9, + "chao": 0, + "penetracao": 0 + }, + { + "id": "P", + "label": "PATAMAR 1", + "x": 7, + "z": 9, + "distSpawn": 17.61, + "timeSpawn": "E", + "maiorLinhaTiro": 33, + "chao": 2.04, + "penetracao": 0 + }, + { + "id": "B", + "label": "RUA", + "x": -7, + "z": 28, + "distSpawn": 5.02, + "timeSpawn": "E", + "maiorLinhaTiro": 38.1, + "chao": 0, + "penetracao": 0 + } + ], + "alturaTrianguloMin": 6.77 + }, + { + "map": "campomorro", + "celulasAlcancadas": 52528, + "amostrasChao": 3218, + "observadores": 805, + "corpoDentroDeSolido": 0, + "submersosAcimaDoPeito": 0, + "piorPenetracao": 0, + "piores": [], + "dentroTodos": [], + "spawns": [ + { + "team": "E", + "x": -4, + "z": -3, + "chao": -0.08, + "penetracao": 0 + }, + { + "team": "E", + "x": -1, + "z": -3, + "chao": -0.08, + "penetracao": 0 + }, + { + "team": "E", + "x": -4, + "z": 1, + "chao": -0.08, + "penetracao": 0 + }, + { + "team": "E", + "x": -1, + "z": 1, + "chao": -0.08, + "penetracao": 0 + }, + { + "team": "B", + "x": 29, + "z": -22, + "chao": 1, + "penetracao": 0.05 + }, + { + "team": "B", + "x": 31, + "z": -22, + "chao": 1, + "penetracao": 0.05 + }, + { + "team": "B", + "x": 29, + "z": -19, + "chao": 1, + "penetracao": 0.05 + }, + { + "team": "B", + "x": 31, + "z": -19, + "chao": 1, + "penetracao": 0.05 + } + ], + "exposicaoPorTime": [ + { + "team": "E", + "chaoMin": -0.08, + "chaoMax": -0.08, + "fracMedia": 0.6413, + "maiorVisada": 44.1 + }, + { + "team": "B", + "chaoMin": 1, + "chaoMax": 1, + "fracMedia": 0.1497, + "maiorVisada": 73.8 + } + ], + "exposicaoPorSpawn": [ + { + "team": "E", + "x": -4, + "z": -3, + "chao": -0.08, + "obsLonge": 377, + "obsVendo": 242, + "frac": 0.6419, + "maiorVisada": 44.1 + }, + { + "team": "E", + "x": -1, + "z": -3, + "chao": -0.08, + "obsLonge": 381, + "obsVendo": 235, + "frac": 0.6168, + "maiorVisada": 42.6 + }, + { + "team": "E", + "x": -4, + "z": 1, + "chao": -0.08, + "obsLonge": 379, + "obsVendo": 250, + "frac": 0.6596, + "maiorVisada": 42.3 + }, + { + "team": "E", + "x": -1, + "z": 1, + "chao": -0.08, + "obsLonge": 385, + "obsVendo": 249, + "frac": 0.6468, + "maiorVisada": 40.1 + }, + { + "team": "B", + "x": 29, + "z": -22, + "chao": 1, + "obsLonge": 641, + "obsVendo": 56, + "frac": 0.0874, + "maiorVisada": 53.8 + }, + { + "team": "B", + "x": 31, + "z": -22, + "chao": 1, + "obsLonge": 655, + "obsVendo": 91, + "frac": 0.1389, + "maiorVisada": 62.3 + }, + { + "team": "B", + "x": 29, + "z": -19, + "chao": 1, + "obsLonge": 622, + "obsVendo": 98, + "frac": 0.1576, + "maiorVisada": 58.7 + }, + { + "team": "B", + "x": 31, + "z": -19, + "chao": 1, + "obsLonge": 637, + "obsVendo": 137, + "frac": 0.2151, + "maiorVisada": 73.8 + } + ], + "salaDoSpawn": [ + { + "team": "E", + "x": -4, + "z": -3, + "folgaParede": 9.35, + "dirPior": 270, + "areaContigua": 78.6, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": -1, + "z": -3, + "folgaParede": 9.55, + "dirPior": 259, + "areaContigua": 78.6, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": -4, + "z": 1, + "folgaParede": 11.35, + "dirPior": 90, + "areaContigua": 78.6, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": -1, + "z": 1, + "folgaParede": 11.55, + "dirPior": 101, + "areaContigua": 78.6, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 29, + "z": -22, + "folgaParede": 1.85, + "dirPior": 169, + "areaContigua": 51.2, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 31, + "z": -22, + "folgaParede": 2.85, + "dirPior": 0, + "areaContigua": 48, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 29, + "z": -19, + "folgaParede": 1.85, + "dirPior": 174, + "areaContigua": 56.4, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 31, + "z": -19, + "folgaParede": 2.85, + "dirPior": 0, + "areaContigua": 56.4, + "okFolga": true, + "okArea": true + } + ], + "piorFolga": 1.85, + "piorArea": 48, + "escadas": [], + "travessia": [ + { + "nivel": "galpao", + "celulasAlcancadas": 1231, + "waypointsNoNivel": 16, + "aEstrelaChega": true + } + ], + "occluderSemMalha": [], + "occMedidos": 118, + "occPulados": 7, + "fracSemMalha": 0.005, + "quadrantes": [ + { + "q": "0,0", + "x0": -35.5, + "z0": -29.5, + "areaAndavel": 197, + "props": 5, + "waypoints": 30, + "densProp": 2.54, + "densWp": 15.24, + "espacamento": 6.27, + "razaoProp": 1, + "razaoWp": 0.89 + }, + { + "q": "0,1", + "x0": -35.5, + "z0": -14.8, + "areaAndavel": 187, + "props": 7, + "waypoints": 21, + "densProp": 3.74, + "densWp": 11.21, + "espacamento": 5.17, + "razaoProp": 1.47, + "razaoWp": 0.66 + }, + { + "q": "0,2", + "x0": -35.5, + "z0": 0, + "areaAndavel": 195, + "props": 7, + "waypoints": 72, + "densProp": 3.59, + "densWp": 36.97, + "espacamento": 5.27, + "razaoProp": 1.41, + "razaoWp": 2.17 + }, + { + "q": "0,3", + "x0": -35.5, + "z0": 14.8, + "areaAndavel": 178, + "props": 4, + "waypoints": 37, + "densProp": 2.25, + "densWp": 20.78, + "espacamento": 6.67, + "razaoProp": 0.88, + "razaoWp": 1.22 + }, + { + "q": "1,0", + "x0": -17.8, + "z0": -29.5, + "areaAndavel": 202, + "props": 5, + "waypoints": 27, + "densProp": 2.48, + "densWp": 13.37, + "espacamento": 6.36, + "razaoProp": 0.97, + "razaoWp": 0.79 + }, + { + "q": "1,1", + "x0": -17.8, + "z0": -14.8, + "areaAndavel": 245, + "props": 6, + "waypoints": 30, + "densProp": 2.45, + "densWp": 12.26, + "espacamento": 6.39, + "razaoProp": 0.96, + "razaoWp": 0.72 + }, + { + "q": "1,2", + "x0": -17.8, + "z0": 0, + "areaAndavel": 245, + "props": 6, + "waypoints": 46, + "densProp": 2.45, + "densWp": 18.8, + "espacamento": 6.39, + "razaoProp": 0.96, + "razaoWp": 1.1 + }, + { + "q": "1,3", + "x0": -17.8, + "z0": 14.8, + "areaAndavel": 167, + "props": 4, + "waypoints": 24, + "densProp": 2.39, + "densWp": 14.37, + "espacamento": 6.46, + "razaoProp": 0.94, + "razaoWp": 0.84 + }, + { + "q": "2,0", + "x0": 0, + "z0": -29.5, + "areaAndavel": 199, + "props": 5, + "waypoints": 41, + "densProp": 2.52, + "densWp": 20.64, + "espacamento": 6.3, + "razaoProp": 0.99, + "razaoWp": 1.21 + }, + { + "q": "2,1", + "x0": 0, + "z0": -14.8, + "areaAndavel": 241, + "props": 6, + "waypoints": 42, + "densProp": 2.49, + "densWp": 17.42, + "espacamento": 6.34, + "razaoProp": 0.98, + "razaoWp": 1.02 + }, + { + "q": "2,2", + "x0": 0, + "z0": 0, + "areaAndavel": 236, + "props": 7, + "waypoints": 64, + "densProp": 2.96, + "densWp": 27.1, + "espacamento": 5.81, + "razaoProp": 1.16, + "razaoWp": 1.59 + }, + { + "q": "2,3", + "x0": 0, + "z0": 14.8, + "areaAndavel": 195, + "props": 5, + "waypoints": 34, + "densProp": 2.56, + "densWp": 17.44, + "espacamento": 6.24, + "razaoProp": 1, + "razaoWp": 1.02 + }, + { + "q": "3,0", + "x0": 17.8, + "z0": -29.5, + "areaAndavel": 181, + "props": 8, + "waypoints": 41, + "densProp": 4.42, + "densWp": 22.67, + "espacamento": 4.75, + "razaoProp": 1.73, + "razaoWp": 1.33 + }, + { + "q": "3,1", + "x0": 17.8, + "z0": -14.8, + "areaAndavel": 206, + "props": 7, + "waypoints": 27, + "densProp": 3.39, + "densWp": 13.08, + "espacamento": 5.43, + "razaoProp": 1.33, + "razaoWp": 0.77 + }, + { + "q": "3,2", + "x0": 17.8, + "z0": 0, + "areaAndavel": 216, + "props": 8, + "waypoints": 36, + "densProp": 3.7, + "densWp": 16.64, + "espacamento": 5.2, + "razaoProp": 1.45, + "razaoWp": 0.98 + }, + { + "q": "3,3", + "x0": 17.8, + "z0": 14.8, + "areaAndavel": 193, + "props": 5, + "waypoints": 26, + "densProp": 2.59, + "densWp": 13.46, + "espacamento": 6.22, + "razaoProp": 1.02, + "razaoWp": 0.79 + } + ], + "medianaProp": 2.55, + "medianaWp": 17.03, + "piorRazaoProp": 0.88, + "piorRazaoWp": 0.66, + "piorEspacamento": 6.67, + "bordasSemGuarda": [], + "rotasSpawnBandeira": [ + { + "time": "E", + "bandeira": "R", + "rotas": 4, + "comprimentos": [ + 11.1, + 11.1, + 11.1, + 11.1 + ] + }, + { + "time": "E", + "bandeira": "E", + "rotas": 4, + "comprimentos": [ + 15.6, + 15.6, + 15.6, + 15.6 + ] + }, + { + "time": "E", + "bandeira": "P", + "rotas": 4, + "comprimentos": [ + 19.6, + 19.6, + 19.6, + 19.6 + ] + }, + { + "time": "E", + "bandeira": "B", + "rotas": 4, + "comprimentos": [ + 15.8, + 15.8, + 15.8, + 15.8 + ] + }, + { + "time": "B", + "bandeira": "R", + "rotas": 3, + "comprimentos": [ + 48.7, + 57.6, + 58.2 + ] + }, + { + "time": "B", + "bandeira": "E", + "rotas": 3, + "comprimentos": [ + 57.6, + 60, + 73.9 + ] + }, + { + "time": "B", + "bandeira": "P", + "rotas": 3, + "comprimentos": [ + 37.1, + 44.9, + 71.5 + ] + }, + { + "time": "B", + "bandeira": "B", + "rotas": 3, + "comprimentos": [ + 29.9, + 34.1, + 60.1 + ] + } + ], + "piorRotas": 3, + "bandeiras": [ + { + "id": "R", + "label": "N", + "x": -12, + "z": -8, + "distSpawn": 9.43, + "timeSpawn": "E", + "maiorLinhaTiro": 53.5, + "chao": -0.08, + "penetracao": 0 + }, + { + "id": "E", + "label": "W", + "x": -15, + "z": 7, + "distSpawn": 12.53, + "timeSpawn": "E", + "maiorLinhaTiro": 54.4, + "chao": -0.08, + "penetracao": 0 + }, + { + "id": "P", + "label": "SE", + "x": 13, + "z": 8, + "distSpawn": 15.65, + "timeSpawn": "E", + "maiorLinhaTiro": 54, + "chao": -0.08, + "penetracao": 0 + }, + { + "id": "B", + "label": "S", + "x": 12, + "z": -7, + "distSpawn": 13.6, + "timeSpawn": "E", + "maiorLinhaTiro": 55.3, + "chao": -0.08, + "penetracao": 0 + } + ], + "alturaTrianguloMin": 11.94 + }, + { + "map": "lajes", + "celulasAlcancadas": 8654, + "amostrasChao": 539, + "observadores": 131, + "corpoDentroDeSolido": 0, + "submersosAcimaDoPeito": 0, + "piorPenetracao": 0, + "piores": [], + "dentroTodos": [], + "spawns": [ + { + "team": "E", + "x": -1.9, + "z": -32.3, + "chao": 5.2, + "penetracao": 0 + }, + { + "team": "E", + "x": -0.65, + "z": -32.3, + "chao": 5.2, + "penetracao": 0 + }, + { + "team": "E", + "x": 0.65, + "z": -32.3, + "chao": 5.2, + "penetracao": 0 + }, + { + "team": "E", + "x": 1.9, + "z": -32.3, + "chao": 5.2, + "penetracao": 0 + }, + { + "team": "B", + "x": -1.9, + "z": 32.3, + "chao": 5.2, + "penetracao": 0 + }, + { + "team": "B", + "x": -0.65, + "z": 32.3, + "chao": 5.2, + "penetracao": 0 + }, + { + "team": "B", + "x": 0.65, + "z": 32.3, + "chao": 5.2, + "penetracao": 0 + }, + { + "team": "B", + "x": 1.9, + "z": 32.3, + "chao": 5.2, + "penetracao": 0 + } + ], + "exposicaoPorTime": [ + { + "team": "E", + "chaoMin": 5.2, + "chaoMax": 5.2, + "fracMedia": 1, + "maiorVisada": 67.4 + }, + { + "team": "B", + "chaoMin": 5.2, + "chaoMax": 5.2, + "fracMedia": 1, + "maiorVisada": 67.5 + } + ], + "exposicaoPorSpawn": [ + { + "team": "E", + "x": -1.9, + "z": -32.3, + "chao": 5.2, + "obsLonge": 79, + "obsVendo": 79, + "frac": 1, + "maiorVisada": 67.4 + }, + { + "team": "E", + "x": -0.65, + "z": -32.3, + "chao": 5.2, + "obsLonge": 79, + "obsVendo": 79, + "frac": 1, + "maiorVisada": 67.4 + }, + { + "team": "E", + "x": 0.65, + "z": -32.3, + "chao": 5.2, + "obsLonge": 79, + "obsVendo": 79, + "frac": 1, + "maiorVisada": 67.3 + }, + { + "team": "E", + "x": 1.9, + "z": -32.3, + "chao": 5.2, + "obsLonge": 78, + "obsVendo": 78, + "frac": 1, + "maiorVisada": 67.4 + }, + { + "team": "B", + "x": -1.9, + "z": 32.3, + "chao": 5.2, + "obsLonge": 83, + "obsVendo": 83, + "frac": 1, + "maiorVisada": 67.4 + }, + { + "team": "B", + "x": -0.65, + "z": 32.3, + "chao": 5.2, + "obsLonge": 83, + "obsVendo": 83, + "frac": 1, + "maiorVisada": 67.4 + }, + { + "team": "B", + "x": 0.65, + "z": 32.3, + "chao": 5.2, + "obsLonge": 82, + "obsVendo": 82, + "frac": 1, + "maiorVisada": 67.4 + }, + { + "team": "B", + "x": 1.9, + "z": 32.3, + "chao": 5.2, + "obsLonge": 81, + "obsVendo": 81, + "frac": 1, + "maiorVisada": 67.5 + } + ], + "salaDoSpawn": [ + { + "team": "E", + "x": -1.9, + "z": -32.3, + "folgaParede": 2.65, + "dirPior": 174, + "areaContigua": 48.9, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": -0.65, + "z": -32.3, + "folgaParede": 3.65, + "dirPior": 264, + "areaContigua": 55.3, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": 0.65, + "z": -32.3, + "folgaParede": 3.15, + "dirPior": 326, + "areaContigua": 54.9, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": 1.9, + "z": -32.3, + "folgaParede": 2.1, + "dirPior": 309, + "areaContigua": 47.1, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": -1.9, + "z": 32.3, + "folgaParede": 2.4, + "dirPior": 124, + "areaContigua": 47, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": -0.65, + "z": 32.3, + "folgaParede": 3.35, + "dirPior": 141, + "areaContigua": 53.4, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 0.65, + "z": 32.3, + "folgaParede": 3.25, + "dirPior": 39, + "areaContigua": 53.4, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 1.9, + "z": 32.3, + "folgaParede": 2.25, + "dirPior": 56, + "areaContigua": 46.3, + "okFolga": true, + "okArea": true + } + ], + "piorFolga": 2.1, + "piorArea": 46.3, + "escadas": [ + { + "nome": "ESCADARIA L1", + "x0": 3.9599999999999995, + "x1": 5.239999999999999, + "z0": -10, + "z1": -5.8, + "degraus": 13, + "espelhoMed": 0.1866, + "espelhoMin": 0.1733, + "espelhoMax": 0.3467, + "pisoMed": 0.2733, + "larguraMedida": 1.25, + "subida": 2.427, + "corrida": 3.3, + "inclinacaoGraus": 36.33, + "blondel": 0.646, + "desvioChaoDegrau": 0, + "okEspelho": true, + "okPiso": true, + "okBlondel": true, + "okLargura": true, + "okInclinacao": true, + "okDesvio": true + }, + { + "nome": "ESCADARIA L2", + "x0": 5.41, + "x1": 6.6899999999999995, + "z0": -10, + "z1": -5.8, + "degraus": 13, + "espelhoMed": 0.1866, + "espelhoMin": 0.1733, + "espelhoMax": 0.3467, + "pisoMed": 0.2733, + "larguraMedida": 1.25, + "subida": 2.427, + "corrida": 3.3, + "inclinacaoGraus": 36.33, + "blondel": 0.646, + "desvioChaoDegrau": 0, + "okEspelho": true, + "okPiso": true, + "okBlondel": true, + "okLargura": true, + "okInclinacao": true, + "okDesvio": true + }, + { + "nome": "BECO DO VARAL L1", + "x0": -5.239999999999999, + "x1": -3.9599999999999995, + "z0": 2, + "z1": 6.2, + "degraus": 13, + "espelhoMed": 0.1866, + "espelhoMin": 0.1733, + "espelhoMax": 0.3467, + "pisoMed": 0.2733, + "larguraMedida": 1.25, + "subida": 2.427, + "corrida": 3.3, + "inclinacaoGraus": 36.33, + "blondel": 0.646, + "desvioChaoDegrau": 0, + "okEspelho": true, + "okPiso": true, + "okBlondel": true, + "okLargura": true, + "okInclinacao": true, + "okDesvio": true + }, + { + "nome": "BECO DO VARAL L2", + "x0": -6.6899999999999995, + "x1": -5.41, + "z0": 2, + "z1": 6.2, + "degraus": 13, + "espelhoMed": 0.1866, + "espelhoMin": 0.1733, + "espelhoMax": 0.3467, + "pisoMed": 0.2733, + "larguraMedida": 1.25, + "subida": 2.427, + "corrida": 3.3, + "inclinacaoGraus": 36.33, + "blondel": 0.646, + "desvioChaoDegrau": 0, + "okEspelho": true, + "okPiso": true, + "okBlondel": true, + "okLargura": true, + "okInclinacao": true, + "okDesvio": true + }, + { + "nome": "ACESSO SUL L1", + "x0": 3.9599999999999995, + "x1": 5.239999999999999, + "z0": 17.8, + "z1": 22, + "degraus": 13, + "espelhoMed": 0.1866, + "espelhoMin": 0.1733, + "espelhoMax": 0.3467, + "pisoMed": 0.2733, + "larguraMedida": 1.25, + "subida": 2.427, + "corrida": 3.3, + "inclinacaoGraus": 36.33, + "blondel": 0.646, + "desvioChaoDegrau": 0, + "okEspelho": true, + "okPiso": true, + "okBlondel": true, + "okLargura": true, + "okInclinacao": true, + "okDesvio": true + }, + { + "nome": "ACESSO SUL L2", + "x0": 5.41, + "x1": 6.6899999999999995, + "z0": 17.8, + "z1": 22, + "degraus": 13, + "espelhoMed": 0.1866, + "espelhoMin": 0.1733, + "espelhoMax": 0.3467, + "pisoMed": 0.2733, + "larguraMedida": 1.25, + "subida": 2.427, + "corrida": 3.3, + "inclinacaoGraus": 36.33, + "blondel": 0.646, + "desvioChaoDegrau": 0, + "okEspelho": true, + "okPiso": true, + "okBlondel": true, + "okLargura": true, + "okInclinacao": true, + "okDesvio": true + }, + { + "nome": "DESCIDA NORTE L1", + "x0": 3.9599999999999995, + "x1": 5.239999999999999, + "z0": -26, + "z1": -21.8, + "degraus": 13, + "espelhoMed": 0.1866, + "espelhoMin": 0.1733, + "espelhoMax": 0.3467, + "pisoMed": 0.2733, + "larguraMedida": 1.25, + "subida": 2.427, + "corrida": 3.3, + "inclinacaoGraus": 36.33, + "blondel": 0.646, + "desvioChaoDegrau": 0, + "okEspelho": true, + "okPiso": true, + "okBlondel": true, + "okLargura": true, + "okInclinacao": true, + "okDesvio": true + }, + { + "nome": "DESCIDA NORTE L2", + "x0": 5.41, + "x1": 6.6899999999999995, + "z0": -26, + "z1": -21.8, + "degraus": 13, + "espelhoMed": 0.1866, + "espelhoMin": 0.1733, + "espelhoMax": 0.3467, + "pisoMed": 0.2733, + "larguraMedida": 1.25, + "subida": 2.427, + "corrida": 3.3, + "inclinacaoGraus": 36.33, + "blondel": 0.646, + "desvioChaoDegrau": 0, + "okEspelho": true, + "okPiso": true, + "okBlondel": true, + "okLargura": true, + "okInclinacao": true, + "okDesvio": true + }, + { + "nome": "DESCIDA SUL L1", + "x0": -5.239999999999999, + "x1": -3.9599999999999995, + "z0": 18, + "z1": 22.2, + "degraus": 13, + "espelhoMed": 0.1866, + "espelhoMin": 0.1733, + "espelhoMax": 0.3467, + "pisoMed": 0.2733, + "larguraMedida": 1.25, + "subida": 2.427, + "corrida": 3.3, + "inclinacaoGraus": 36.33, + "blondel": 0.646, + "desvioChaoDegrau": 0, + "okEspelho": true, + "okPiso": true, + "okBlondel": true, + "okLargura": true, + "okInclinacao": true, + "okDesvio": true + }, + { + "nome": "DESCIDA SUL L2", + "x0": -6.6899999999999995, + "x1": -5.41, + "z0": 18, + "z1": 22.2, + "degraus": 13, + "espelhoMed": 0.1866, + "espelhoMin": 0.1733, + "espelhoMax": 0.3467, + "pisoMed": 0.2733, + "larguraMedida": 1.25, + "subida": 2.427, + "corrida": 3.3, + "inclinacaoGraus": 36.33, + "blondel": 0.646, + "desvioChaoDegrau": 0, + "okEspelho": true, + "okPiso": true, + "okBlondel": true, + "okLargura": true, + "okInclinacao": true, + "okDesvio": true + } + ], + "travessia": [ + { + "nivel": "LAJE NORTE", + "celulasAlcancadas": 751, + "waypointsNoNivel": 1, + "aEstrelaChega": true + }, + { + "nivel": "LAJE DA CAIXA", + "celulasAlcancadas": 579, + "waypointsNoNivel": 6, + "aEstrelaChega": true + }, + { + "nivel": "LAJE DO VARAL", + "celulasAlcancadas": 574, + "waypointsNoNivel": 6, + "aEstrelaChega": true + }, + { + "nivel": "LAJE OESTE NORTE", + "celulasAlcancadas": 535, + "waypointsNoNivel": 6, + "aEstrelaChega": true + }, + { + "nivel": "LAJE LESTE NORTE", + "celulasAlcancadas": 533, + "waypointsNoNivel": 6, + "aEstrelaChega": true + }, + { + "nivel": "LAJE OESTE MEIO", + "celulasAlcancadas": 376, + "waypointsNoNivel": 6, + "aEstrelaChega": true + }, + { + "nivel": "LAJE LESTE MEIO", + "celulasAlcancadas": 544, + "waypointsNoNivel": 6, + "aEstrelaChega": true + }, + { + "nivel": "LAJE DO CHURRASCO", + "celulasAlcancadas": 1031, + "waypointsNoNivel": 11, + "aEstrelaChega": true + }, + { + "nivel": "LAJE DA PISCINA", + "celulasAlcancadas": 1003, + "waypointsNoNivel": 11, + "aEstrelaChega": true + }, + { + "nivel": "LAJE SUL", + "celulasAlcancadas": 731, + "waypointsNoNivel": 1, + "aEstrelaChega": true + } + ], + "occluderSemMalha": [], + "occMedidos": 1216, + "occPulados": 0, + "fracSemMalha": 0.0037, + "quadrantes": [ + { + "q": "0,1", + "x0": -15.5, + "z0": -19.5, + "areaAndavel": 68, + "props": 75, + "waypoints": 15, + "densProp": 111.01, + "densWp": 22.2, + "espacamento": 0.95, + "razaoProp": 0.99, + "razaoWp": 0.9 + }, + { + "q": "0,2", + "x0": -15.5, + "z0": 0, + "areaAndavel": 51, + "props": 76, + "waypoints": 15, + "densProp": 148.29, + "densWp": 29.27, + "espacamento": 0.82, + "razaoProp": 1.32, + "razaoWp": 1.19 + }, + { + "q": "2,3", + "x0": 0, + "z0": 19.5, + "areaAndavel": 49, + "props": 47, + "waypoints": 72, + "densProp": 96.41, + "densWp": 147.69, + "espacamento": 1.02, + "razaoProp": 0.86, + "razaoWp": 5.99 + }, + { + "q": "3,1", + "x0": 7.8, + "z0": -19.5, + "areaAndavel": 68, + "props": 76, + "waypoints": 15, + "densProp": 112.49, + "densWp": 22.2, + "espacamento": 0.94, + "razaoProp": 1, + "razaoWp": 0.9 + }, + { + "q": "3,2", + "x0": 7.8, + "z0": 0, + "areaAndavel": 61, + "props": 73, + "waypoints": 15, + "densProp": 119.92, + "densWp": 24.64, + "espacamento": 0.91, + "razaoProp": 1.07, + "razaoWp": 1 + } + ], + "medianaProp": 112.49, + "medianaWp": 24.64, + "piorRazaoProp": 0.86, + "piorRazaoWp": 0.9, + "piorEspacamento": 1.02, + "bordasSemGuarda": [], + "rotasSpawnBandeira": [ + { + "time": "E", + "bandeira": "R", + "rotas": 4, + "comprimentos": [ + 15.4, + 15.4, + 15.4, + 15.4 + ] + }, + { + "time": "E", + "bandeira": "E", + "rotas": 4, + "comprimentos": [ + 15.4, + 15.4, + 15.4, + 15.4 + ] + }, + { + "time": "E", + "bandeira": "P", + "rotas": 2, + "comprimentos": [ + 53.5, + 100.4 + ] + }, + { + "time": "E", + "bandeira": "B", + "rotas": 2, + "comprimentos": [ + 53.5, + 100.4 + ] + }, + { + "time": "B", + "bandeira": "R", + "rotas": 2, + "comprimentos": [ + 61.5, + 92.3 + ] + }, + { + "time": "B", + "bandeira": "E", + "rotas": 2, + "comprimentos": [ + 61.5, + 92.3 + ] + }, + { + "time": "B", + "bandeira": "P", + "rotas": 2, + "comprimentos": [ + 23.4, + 89 + ] + }, + { + "time": "B", + "bandeira": "B", + "rotas": 2, + "comprimentos": [ + 23.4, + 105.3 + ] + } + ], + "piorRotas": 2, + "bandeiras": [ + { + "id": "R", + "label": "LAJE DA CAIXA", + "x": -10.2, + "z": -23.5, + "distSpawn": 12.1, + "timeSpawn": "E", + "maiorLinhaTiro": 59.9, + "chao": 5.2, + "penetracao": 0 + }, + { + "id": "E", + "label": "LAJE DO VARAL", + "x": 10.2, + "z": -23.5, + "distSpawn": 12.1, + "timeSpawn": "E", + "maiorLinhaTiro": 59.7, + "chao": 5.2, + "penetracao": 0 + }, + { + "id": "P", + "label": "LAJE DO CHURRASCO", + "x": -10.2, + "z": 15.5, + "distSpawn": 18.74, + "timeSpawn": "B", + "maiorLinhaTiro": 52.1, + "chao": 5.2, + "penetracao": 0 + }, + { + "id": "B", + "label": "LAJE DA PISCINA", + "x": 10.2, + "z": 15.5, + "distSpawn": 18.74, + "timeSpawn": "B", + "maiorLinhaTiro": 52.3, + "chao": 5.2, + "penetracao": 0 + } + ], + "alturaTrianguloMin": 18.08 + }, + { + "map": "corrego", + "celulasAlcancadas": 44907, + "amostrasChao": 2769, + "observadores": 698, + "corpoDentroDeSolido": 0, + "submersosAcimaDoPeito": 0, + "piorPenetracao": 0, + "piores": [], + "dentroTodos": [], + "spawns": [ + { + "team": "E", + "x": 21, + "z": -25, + "chao": 0, + "penetracao": 0.01 + }, + { + "team": "E", + "x": 21, + "z": -5, + "chao": 0, + "penetracao": 0.01 + }, + { + "team": "E", + "x": 21, + "z": 15, + "chao": 0, + "penetracao": 0 + }, + { + "team": "E", + "x": 21, + "z": 35, + "chao": 0, + "penetracao": 0 + }, + { + "team": "B", + "x": -21, + "z": -25, + "chao": 0, + "penetracao": 0.01 + }, + { + "team": "B", + "x": -21, + "z": -5, + "chao": 0, + "penetracao": 0.01 + }, + { + "team": "B", + "x": -21, + "z": 15, + "chao": 0, + "penetracao": 0 + }, + { + "team": "B", + "x": -21, + "z": 35, + "chao": 0, + "penetracao": 0 + } + ], + "exposicaoPorTime": [ + { + "team": "E", + "chaoMin": 0, + "chaoMax": 0, + "fracMedia": 0.2916, + "maiorVisada": 76.4 + }, + { + "team": "B", + "chaoMin": 0, + "chaoMax": 0, + "fracMedia": 0.2732, + "maiorVisada": 77 + } + ], + "exposicaoPorSpawn": [ + { + "team": "E", + "x": 21, + "z": -25, + "chao": 0, + "obsLonge": 534, + "obsVendo": 153, + "frac": 0.2865, + "maiorVisada": 76.4 + }, + { + "team": "E", + "x": 21, + "z": -5, + "chao": 0, + "obsLonge": 476, + "obsVendo": 151, + "frac": 0.3172, + "maiorVisada": 56.8 + }, + { + "team": "E", + "x": 21, + "z": 15, + "chao": 0, + "obsLonge": 480, + "obsVendo": 178, + "frac": 0.3708, + "maiorVisada": 53.2 + }, + { + "team": "E", + "x": 21, + "z": 35, + "chao": 0, + "obsLonge": 552, + "obsVendo": 106, + "frac": 0.192, + "maiorVisada": 75.6 + }, + { + "team": "B", + "x": -21, + "z": -25, + "chao": 0, + "obsLonge": 538, + "obsVendo": 156, + "frac": 0.29, + "maiorVisada": 77 + }, + { + "team": "B", + "x": -21, + "z": -5, + "chao": 0, + "obsLonge": 494, + "obsVendo": 120, + "frac": 0.2429, + "maiorVisada": 49.9 + }, + { + "team": "B", + "x": -21, + "z": 15, + "chao": 0, + "obsLonge": 480, + "obsVendo": 107, + "frac": 0.2229, + "maiorVisada": 52.5 + }, + { + "team": "B", + "x": -21, + "z": 35, + "chao": 0, + "obsLonge": 546, + "obsVendo": 184, + "frac": 0.337, + "maiorVisada": 76.7 + } + ], + "salaDoSpawn": [ + { + "team": "E", + "x": 21, + "z": -25, + "folgaParede": 2.8, + "dirPior": 0, + "areaContigua": 55.7, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": 21, + "z": -5, + "folgaParede": 2.8, + "dirPior": 0, + "areaContigua": 54.5, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": 21, + "z": 15, + "folgaParede": 2.35, + "dirPior": 264, + "areaContigua": 51.4, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": 21, + "z": 35, + "folgaParede": 2.8, + "dirPior": 0, + "areaContigua": 49.9, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": -21, + "z": -25, + "folgaParede": 2.7, + "dirPior": 315, + "areaContigua": 50.4, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": -21, + "z": -5, + "folgaParede": 2.8, + "dirPior": 174, + "areaContigua": 57.7, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": -21, + "z": 15, + "folgaParede": 2.8, + "dirPior": 174, + "areaContigua": 56.7, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": -21, + "z": 35, + "folgaParede": 2.8, + "dirPior": 174, + "areaContigua": 50.3, + "okFolga": true, + "okArea": true + } + ], + "piorFolga": 2.35, + "piorArea": 49.9, + "escadas": [], + "travessia": [], + "occluderSemMalha": [], + "occMedidos": 108, + "occPulados": 62, + "fracSemMalha": 0.0037, + "quadrantes": [ + { + "q": "0,0", + "x0": -23.5, + "z0": -39.5, + "areaAndavel": 147, + "props": 13, + "waypoints": 28, + "densProp": 8.87, + "densWp": 19.1, + "espacamento": 3.36, + "razaoProp": 1.48, + "razaoWp": 0.96 + }, + { + "q": "0,1", + "x0": -23.5, + "z0": -19.8, + "areaAndavel": 192, + "props": 6, + "waypoints": 47, + "densProp": 3.12, + "densWp": 24.46, + "espacamento": 5.66, + "razaoProp": 0.52, + "razaoWp": 1.24 + }, + { + "q": "0,2", + "x0": -23.5, + "z0": 0, + "areaAndavel": 150, + "props": 15, + "waypoints": 32, + "densProp": 10.02, + "densWp": 21.37, + "espacamento": 3.16, + "razaoProp": 1.67, + "razaoWp": 1.08 + }, + { + "q": "0,3", + "x0": -23.5, + "z0": 19.8, + "areaAndavel": 191, + "props": 7, + "waypoints": 38, + "densProp": 3.66, + "densWp": 19.88, + "espacamento": 5.23, + "razaoProp": 0.61, + "razaoWp": 1 + }, + { + "q": "1,0", + "x0": -11.8, + "z0": -39.5, + "areaAndavel": 131, + "props": 19, + "waypoints": 34, + "densProp": 14.52, + "densWp": 25.98, + "espacamento": 2.62, + "razaoProp": 2.42, + "razaoWp": 1.31 + }, + { + "q": "1,1", + "x0": -11.8, + "z0": -19.8, + "areaAndavel": 207, + "props": 6, + "waypoints": 36, + "densProp": 2.9, + "densWp": 17.38, + "espacamento": 5.88, + "razaoProp": 0.48, + "razaoWp": 0.88 + }, + { + "q": "1,2", + "x0": -11.8, + "z0": 0, + "areaAndavel": 158, + "props": 24, + "waypoints": 38, + "densProp": 15.23, + "densWp": 24.11, + "espacamento": 2.56, + "razaoProp": 2.54, + "razaoWp": 1.22 + }, + { + "q": "1,3", + "x0": -11.8, + "z0": 19.8, + "areaAndavel": 218, + "props": 5, + "waypoints": 35, + "densProp": 2.29, + "densWp": 16.04, + "espacamento": 6.61, + "razaoProp": 0.38, + "razaoWp": 0.81 + }, + { + "q": "2,0", + "x0": 0, + "z0": -39.5, + "areaAndavel": 133, + "props": 20, + "waypoints": 36, + "densProp": 15.04, + "densWp": 27.07, + "espacamento": 2.58, + "razaoProp": 2.5, + "razaoWp": 1.37 + }, + { + "q": "2,1", + "x0": 0, + "z0": -19.8, + "areaAndavel": 188, + "props": 12, + "waypoints": 40, + "densProp": 6.39, + "densWp": 21.3, + "espacamento": 3.96, + "razaoProp": 1.06, + "razaoWp": 1.08 + }, + { + "q": "2,2", + "x0": 0, + "z0": 0, + "areaAndavel": 184, + "props": 11, + "waypoints": 35, + "densProp": 5.98, + "densWp": 19.02, + "espacamento": 4.09, + "razaoProp": 1, + "razaoWp": 0.96 + }, + { + "q": "2,3", + "x0": 0, + "z0": 19.8, + "areaAndavel": 191, + "props": 15, + "waypoints": 51, + "densProp": 7.84, + "densWp": 26.67, + "espacamento": 3.57, + "razaoProp": 1.31, + "razaoWp": 1.35 + }, + { + "q": "3,0", + "x0": 11.8, + "z0": -39.5, + "areaAndavel": 166, + "props": 10, + "waypoints": 30, + "densProp": 6.03, + "densWp": 18.1, + "espacamento": 4.07, + "razaoProp": 1, + "razaoWp": 0.91 + }, + { + "q": "3,1", + "x0": 11.8, + "z0": -19.8, + "areaAndavel": 185, + "props": 9, + "waypoints": 35, + "densProp": 4.86, + "densWp": 18.92, + "espacamento": 4.53, + "razaoProp": 0.81, + "razaoWp": 0.96 + }, + { + "q": "3,2", + "x0": 11.8, + "z0": 0, + "areaAndavel": 177, + "props": 10, + "waypoints": 35, + "densProp": 5.64, + "densWp": 19.73, + "espacamento": 4.21, + "razaoProp": 0.94, + "razaoWp": 1 + }, + { + "q": "3,3", + "x0": 11.8, + "z0": 19.8, + "areaAndavel": 189, + "props": 9, + "waypoints": 34, + "densProp": 4.77, + "densWp": 18, + "espacamento": 4.58, + "razaoProp": 0.79, + "razaoWp": 0.91 + } + ], + "medianaProp": 6.005000000000001, + "medianaWp": 19.805, + "piorRazaoProp": 0.38, + "piorRazaoWp": 0.81, + "piorEspacamento": 6.61, + "bordasSemGuarda": [], + "rotasSpawnBandeira": [ + { + "time": "E", + "bandeira": "R", + "rotas": 2, + "comprimentos": [ + 37.3, + 55.2 + ] + }, + { + "time": "E", + "bandeira": "C", + "rotas": 2, + "comprimentos": [ + 84.4, + 87.2 + ] + }, + { + "time": "E", + "bandeira": "P", + "rotas": 3, + "comprimentos": [ + 44.2, + 52.8, + 111.9 + ] + }, + { + "time": "E", + "bandeira": "B", + "rotas": 4, + "comprimentos": [ + 19.3, + 19.3, + 19.3, + 19.3 + ] + }, + { + "time": "B", + "bandeira": "R", + "rotas": 4, + "comprimentos": [ + 15.3, + 15.3, + 15.3, + 15.3 + ] + }, + { + "time": "B", + "bandeira": "C", + "rotas": 2, + "comprimentos": [ + 56.3, + 96.5 + ] + }, + { + "time": "B", + "bandeira": "P", + "rotas": 2, + "comprimentos": [ + 56.2, + 71.9 + ] + }, + { + "time": "B", + "bandeira": "B", + "rotas": 2, + "comprimentos": [ + 29.2, + 65.4 + ] + } + ], + "piorRotas": 2, + "bandeiras": [ + { + "id": "R", + "label": "OESTE", + "x": -13.65, + "z": -15, + "distSpawn": 12.41, + "timeSpawn": "B", + "maiorLinhaTiro": 64.6, + "chao": 0, + "penetracao": 0.01 + }, + { + "id": "C", + "label": "PONTE C", + "x": -4, + "z": 8, + "distSpawn": 18.38, + "timeSpawn": "B", + "maiorLinhaTiro": 48.2, + "chao": 0, + "penetracao": 0 + }, + { + "id": "P", + "label": "LESTE", + "x": 13.65, + "z": 15, + "distSpawn": 7.35, + "timeSpawn": "E", + "maiorLinhaTiro": 53.6, + "chao": 0, + "penetracao": 0 + }, + { + "id": "B", + "label": "PONTE N", + "x": 4, + "z": -22, + "distSpawn": 17.26, + "timeSpawn": "E", + "maiorLinhaTiro": 61.2, + "chao": 0.15, + "penetracao": 0.067 + } + ], + "alturaTrianguloMin": 8.34 + }, + { + "map": "mansao", + "celulasAlcancadas": 40304, + "amostrasChao": 2407, + "observadores": 598, + "corpoDentroDeSolido": 0, + "submersosAcimaDoPeito": 0, + "piorPenetracao": 0, + "piores": [], + "dentroTodos": [], + "spawns": [ + { + "team": "E", + "x": -4.5, + "z": 32, + "chao": 0, + "penetracao": 0 + }, + { + "team": "E", + "x": -1.5, + "z": 32, + "chao": 0, + "penetracao": 0 + }, + { + "team": "E", + "x": 1.5, + "z": 32, + "chao": 0, + "penetracao": 0 + }, + { + "team": "E", + "x": 4.5, + "z": 32, + "chao": 0, + "penetracao": 0 + }, + { + "team": "B", + "x": -4.5, + "z": -22, + "chao": 0, + "penetracao": 0.03 + }, + { + "team": "B", + "x": -1.5, + "z": -22, + "chao": 0, + "penetracao": 0.03 + }, + { + "team": "B", + "x": 1.5, + "z": -22, + "chao": 0, + "penetracao": 0.03 + }, + { + "team": "B", + "x": 4.5, + "z": -22, + "chao": 0, + "penetracao": 0.03 + } + ], + "exposicaoPorTime": [ + { + "team": "E", + "chaoMin": 0, + "chaoMax": 0, + "fracMedia": 0.112, + "maiorVisada": 66.6 + }, + { + "team": "B", + "chaoMin": 0, + "chaoMax": 0, + "fracMedia": 0.1093, + "maiorVisada": 58.2 + } + ], + "exposicaoPorSpawn": [ + { + "team": "E", + "x": -4.5, + "z": 32, + "chao": 0, + "obsLonge": 391, + "obsVendo": 83, + "frac": 0.2123, + "maiorVisada": 66.1 + }, + { + "team": "E", + "x": -1.5, + "z": 32, + "chao": 0, + "obsLonge": 381, + "obsVendo": 6, + "frac": 0.0157, + "maiorVisada": 29.6 + }, + { + "team": "E", + "x": 1.5, + "z": 32, + "chao": 0, + "obsLonge": 379, + "obsVendo": 42, + "frac": 0.1108, + "maiorVisada": 43 + }, + { + "team": "E", + "x": 4.5, + "z": 32, + "chao": 0, + "obsLonge": 385, + "obsVendo": 42, + "frac": 0.1091, + "maiorVisada": 66.6 + }, + { + "team": "B", + "x": -4.5, + "z": -22, + "chao": 0, + "obsLonge": 324, + "obsVendo": 49, + "frac": 0.1512, + "maiorVisada": 57.6 + }, + { + "team": "B", + "x": -1.5, + "z": -22, + "chao": 0, + "obsLonge": 307, + "obsVendo": 46, + "frac": 0.1498, + "maiorVisada": 56.6 + }, + { + "team": "B", + "x": 1.5, + "z": -22, + "chao": 0, + "obsLonge": 308, + "obsVendo": 28, + "frac": 0.0909, + "maiorVisada": 56.5 + }, + { + "team": "B", + "x": 4.5, + "z": -22, + "chao": 0, + "obsLonge": 308, + "obsVendo": 14, + "frac": 0.0455, + "maiorVisada": 58.2 + } + ], + "salaDoSpawn": [ + { + "team": "E", + "x": -4.5, + "z": 32, + "folgaParede": 1.8, + "dirPior": 79, + "areaContigua": 44.8, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": -1.5, + "z": 32, + "folgaParede": 1.9, + "dirPior": 79, + "areaContigua": 48.8, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": 1.5, + "z": 32, + "folgaParede": 0.8, + "dirPior": 34, + "areaContigua": 45.6, + "okFolga": false, + "okArea": true + }, + { + "team": "E", + "x": 4.5, + "z": 32, + "folgaParede": 1.75, + "dirPior": 309, + "areaContigua": 46.4, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": -4.5, + "z": -22, + "folgaParede": 3.95, + "dirPior": 23, + "areaContigua": 76.1, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": -1.5, + "z": -22, + "folgaParede": 1.65, + "dirPior": 68, + "areaContigua": 73.8, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 1.5, + "z": -22, + "folgaParede": 1.65, + "dirPior": 113, + "areaContigua": 73.8, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 4.5, + "z": -22, + "folgaParede": 3.95, + "dirPior": 158, + "areaContigua": 76.1, + "okFolga": true, + "okArea": true + } + ], + "piorFolga": 0.8, + "piorArea": 44.8, + "escadas": [ + { + "nome": "escada do mezanino", + "x0": -4.25, + "x1": -1.75, + "z0": -14.91, + "z1": -7.34, + "degraus": 25, + "espelhoMed": 0.1792, + "espelhoMin": 0.16, + "espelhoMax": 0.18, + "pisoMed": 0.29, + "larguraMedida": 2.45, + "subida": 4.48, + "corrida": 6.98, + "inclinacaoGraus": 32.69, + "blondel": 0.648, + "desvioChaoDegrau": 0.02, + "okEspelho": true, + "okPiso": true, + "okBlondel": true, + "okLargura": true, + "okInclinacao": true, + "okDesvio": true + }, + { + "nome": "escada de serviço", + "x0": 12.25, + "x1": 14.75, + "z0": -14.91, + "z1": -7.34, + "degraus": 25, + "espelhoMed": 0.1792, + "espelhoMin": 0.16, + "espelhoMax": 0.18, + "pisoMed": 0.29, + "larguraMedida": 2.5, + "subida": 4.48, + "corrida": 6.98, + "inclinacaoGraus": 32.69, + "blondel": 0.648, + "desvioChaoDegrau": 0.02, + "okEspelho": true, + "okPiso": true, + "okBlondel": true, + "okLargura": true, + "okInclinacao": true, + "okDesvio": true + } + ], + "travessia": [], + "occluderSemMalha": [], + "occMedidos": 323, + "occPulados": 0, + "fracSemMalha": 0.0012, + "quadrantes": [ + { + "q": "0,0", + "x0": -21.5, + "z0": -35.5, + "areaAndavel": 154, + "props": 6, + "waypoints": 24, + "densProp": 3.89, + "densWp": 15.55, + "espacamento": 5.07, + "razaoProp": 0.89, + "razaoWp": 1 + }, + { + "q": "0,1", + "x0": -21.5, + "z0": -17.8, + "areaAndavel": 147, + "props": 6, + "waypoints": 24, + "densProp": 4.08, + "densWp": 16.31, + "espacamento": 4.95, + "razaoProp": 0.93, + "razaoWp": 1.05 + }, + { + "q": "0,2", + "x0": -21.5, + "z0": 0, + "areaAndavel": 165, + "props": 4, + "waypoints": 19, + "densProp": 2.42, + "densWp": 11.49, + "espacamento": 6.43, + "razaoProp": 0.55, + "razaoWp": 0.74 + }, + { + "q": "0,3", + "x0": -21.5, + "z0": 17.8, + "areaAndavel": 155, + "props": 6, + "waypoints": 24, + "densProp": 3.88, + "densWp": 15.5, + "espacamento": 5.08, + "razaoProp": 0.89, + "razaoWp": 1 + }, + { + "q": "1,0", + "x0": -10.8, + "z0": -35.5, + "areaAndavel": 172, + "props": 5, + "waypoints": 23, + "densProp": 2.91, + "densWp": 13.4, + "espacamento": 5.86, + "razaoProp": 0.66, + "razaoWp": 0.86 + }, + { + "q": "1,1", + "x0": -10.8, + "z0": -17.8, + "areaAndavel": 161, + "props": 25, + "waypoints": 38, + "densProp": 15.57, + "densWp": 23.67, + "espacamento": 2.53, + "razaoProp": 3.55, + "razaoWp": 1.52 + }, + { + "q": "1,2", + "x0": -10.8, + "z0": 0, + "areaAndavel": 147, + "props": 9, + "waypoints": 19, + "densProp": 6.14, + "densWp": 12.95, + "espacamento": 4.04, + "razaoProp": 1.4, + "razaoWp": 0.83 + }, + { + "q": "1,3", + "x0": -10.8, + "z0": 17.8, + "areaAndavel": 138, + "props": 8, + "waypoints": 24, + "densProp": 5.79, + "densWp": 17.38, + "espacamento": 4.15, + "razaoProp": 1.32, + "razaoWp": 1.12 + }, + { + "q": "2,0", + "x0": 0, + "z0": -35.5, + "areaAndavel": 171, + "props": 8, + "waypoints": 43, + "densProp": 4.68, + "densWp": 25.14, + "espacamento": 4.62, + "razaoProp": 1.07, + "razaoWp": 1.62 + }, + { + "q": "2,1", + "x0": 0, + "z0": -17.8, + "areaAndavel": 167, + "props": 8, + "waypoints": 33, + "densProp": 4.8, + "densWp": 19.78, + "espacamento": 4.57, + "razaoProp": 1.1, + "razaoWp": 1.27 + }, + { + "q": "2,2", + "x0": 0, + "z0": 0, + "areaAndavel": 138, + "props": 8, + "waypoints": 20, + "densProp": 5.79, + "densWp": 14.47, + "espacamento": 4.16, + "razaoProp": 1.32, + "razaoWp": 0.93 + }, + { + "q": "2,3", + "x0": 0, + "z0": 17.8, + "areaAndavel": 162, + "props": 10, + "waypoints": 30, + "densProp": 6.18, + "densWp": 18.55, + "espacamento": 4.02, + "razaoProp": 1.41, + "razaoWp": 1.19 + }, + { + "q": "3,0", + "x0": 10.8, + "z0": -35.5, + "areaAndavel": 164, + "props": 5, + "waypoints": 19, + "densProp": 3.06, + "densWp": 11.61, + "espacamento": 5.72, + "razaoProp": 0.7, + "razaoWp": 0.75 + }, + { + "q": "3,1", + "x0": 10.8, + "z0": -17.8, + "areaAndavel": 147, + "props": 23, + "waypoints": 36, + "densProp": 15.68, + "densWp": 24.54, + "espacamento": 2.53, + "razaoProp": 3.58, + "razaoWp": 1.58 + }, + { + "q": "3,2", + "x0": 10.8, + "z0": 0, + "areaAndavel": 164, + "props": 5, + "waypoints": 14, + "densProp": 3.04, + "densWp": 8.52, + "espacamento": 5.73, + "razaoProp": 0.69, + "razaoWp": 0.55 + }, + { + "q": "3,3", + "x0": 10.8, + "z0": 17.8, + "areaAndavel": 168, + "props": 5, + "waypoints": 21, + "densProp": 2.97, + "densWp": 12.49, + "espacamento": 5.8, + "razaoProp": 0.68, + "razaoWp": 0.8 + } + ], + "medianaProp": 4.38, + "medianaWp": 15.525, + "piorRazaoProp": 0.55, + "piorRazaoWp": 0.55, + "piorEspacamento": 6.43, + "bordasSemGuarda": [], + "rotasSpawnBandeira": [ + { + "time": "E", + "bandeira": "R", + "rotas": 4, + "comprimentos": [ + 16.2, + 16.2, + 16.2, + 16.2 + ] + }, + { + "time": "E", + "bandeira": "E", + "rotas": 3, + "comprimentos": [ + 39.2, + 50.9, + 56.6 + ] + }, + { + "time": "E", + "bandeira": "P", + "rotas": 3, + "comprimentos": [ + 66.4, + 77.9, + 116.6 + ] + }, + { + "time": "E", + "bandeira": "B", + "rotas": 2, + "comprimentos": [ + 66.1, + 70.7 + ] + }, + { + "time": "B", + "bandeira": "R", + "rotas": 2, + "comprimentos": [ + 56.1, + 71.6 + ] + }, + { + "time": "B", + "bandeira": "E", + "rotas": 2, + "comprimentos": [ + 27.9, + 39.3 + ] + }, + { + "time": "B", + "bandeira": "P", + "rotas": 4, + "comprimentos": [ + 39.4, + 39.4, + 39.4, + 39.4 + ] + }, + { + "time": "B", + "bandeira": "B", + "rotas": 4, + "comprimentos": [ + 7.7, + 7.7, + 7.7, + 7.7 + ] + } + ], + "piorRotas": 2, + "bandeiras": [ + { + "id": "R", + "label": "JARDIM", + "x": 10, + "z": 28, + "distSpawn": 6.8, + "timeSpawn": "E", + "maiorLinhaTiro": 43.2, + "chao": 0, + "penetracao": 0 + }, + { + "id": "E", + "label": "SALA", + "x": -10, + "z": 2, + "distSpawn": 24.62, + "timeSpawn": "B", + "maiorLinhaTiro": 44.6, + "chao": 0, + "penetracao": 0.02 + }, + { + "id": "P", + "label": "MEZZO", + "x": 8, + "z": -11, + "distSpawn": 11.54, + "timeSpawn": "B", + "maiorLinhaTiro": 19.7, + "chao": 4.5, + "penetracao": 0.12 + }, + { + "id": "B", + "label": "PISCINA", + "x": -10, + "z": -25, + "distSpawn": 6.26, + "timeSpawn": "B", + "maiorLinhaTiro": 52.2, + "chao": 0, + "penetracao": 1.238 + } + ], + "alturaTrianguloMin": 9.53 + }, + { + "map": "posto_treta", + "celulasAlcancadas": 48362, + "amostrasChao": 3092, + "observadores": 779, + "corpoDentroDeSolido": 0, + "submersosAcimaDoPeito": 0, + "piorPenetracao": 0, + "piores": [], + "dentroTodos": [], + "spawns": [ + { + "team": "E", + "x": -8, + "z": -30, + "chao": 0, + "penetracao": 0.01 + }, + { + "team": "E", + "x": -2, + "z": -30, + "chao": 0, + "penetracao": 0.01 + }, + { + "team": "E", + "x": 4, + "z": -30, + "chao": 0, + "penetracao": 0.01 + }, + { + "team": "E", + "x": 10, + "z": -30, + "chao": 0, + "penetracao": 0.01 + }, + { + "team": "B", + "x": -8, + "z": 30, + "chao": 0, + "penetracao": 0 + }, + { + "team": "B", + "x": -2, + "z": 30, + "chao": 0, + "penetracao": 0 + }, + { + "team": "B", + "x": 4, + "z": 30, + "chao": 0, + "penetracao": 0 + }, + { + "team": "B", + "x": 10, + "z": 30, + "chao": 0, + "penetracao": 0 + } + ], + "exposicaoPorTime": [ + { + "team": "E", + "chaoMin": 0, + "chaoMax": 0, + "fracMedia": 0.7205, + "maiorVisada": 73.6 + }, + { + "team": "B", + "chaoMin": 0, + "chaoMax": 0, + "fracMedia": 0.7321, + "maiorVisada": 72.3 + } + ], + "exposicaoPorSpawn": [ + { + "team": "E", + "x": -8, + "z": -30, + "chao": 0, + "obsLonge": 543, + "obsVendo": 378, + "frac": 0.6961, + "maiorVisada": 73.1 + }, + { + "team": "E", + "x": -2, + "z": -30, + "chao": 0, + "obsLonge": 520, + "obsVendo": 371, + "frac": 0.7135, + "maiorVisada": 70.5 + }, + { + "team": "E", + "x": 4, + "z": -30, + "chao": 0, + "obsLonge": 528, + "obsVendo": 391, + "frac": 0.7405, + "maiorVisada": 70.9 + }, + { + "team": "E", + "x": 10, + "z": -30, + "chao": 0, + "obsLonge": 556, + "obsVendo": 407, + "frac": 0.732, + "maiorVisada": 73.6 + }, + { + "team": "B", + "x": -8, + "z": 30, + "chao": 0, + "obsLonge": 532, + "obsVendo": 372, + "frac": 0.6992, + "maiorVisada": 72.3 + }, + { + "team": "B", + "x": -2, + "z": 30, + "chao": 0, + "obsLonge": 508, + "obsVendo": 371, + "frac": 0.7303, + "maiorVisada": 69.6 + }, + { + "team": "B", + "x": 4, + "z": 30, + "chao": 0, + "obsLonge": 516, + "obsVendo": 392, + "frac": 0.7597, + "maiorVisada": 70 + }, + { + "team": "B", + "x": 10, + "z": 30, + "chao": 0, + "obsLonge": 541, + "obsVendo": 400, + "frac": 0.7394, + "maiorVisada": 71.8 + } + ], + "salaDoSpawn": [ + { + "team": "E", + "x": -8, + "z": -30, + "folgaParede": 3.45, + "dirPior": 298, + "areaContigua": 71.9, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": -2, + "z": -30, + "folgaParede": 2.55, + "dirPior": 90, + "areaContigua": 60, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": 4, + "z": -30, + "folgaParede": 4.6, + "dirPior": 34, + "areaContigua": 76.6, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": 10, + "z": -30, + "folgaParede": 2.55, + "dirPior": 90, + "areaContigua": 70.4, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": -8, + "z": 30, + "folgaParede": 3.45, + "dirPior": 62, + "areaContigua": 71.9, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": -2, + "z": 30, + "folgaParede": 2.55, + "dirPior": 259, + "areaContigua": 60, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 4, + "z": 30, + "folgaParede": 4.6, + "dirPior": 326, + "areaContigua": 76.6, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 10, + "z": 30, + "folgaParede": 2.55, + "dirPior": 259, + "areaContigua": 70.4, + "okFolga": true, + "okArea": true + } + ], + "piorFolga": 2.55, + "piorArea": 60, + "escadas": [], + "travessia": [], + "occluderSemMalha": [], + "occMedidos": 26, + "occPulados": 0, + "fracSemMalha": 0.0077, + "quadrantes": [ + { + "q": "0,0", + "x0": -27.5, + "z0": -35.5, + "areaAndavel": 218, + "props": 2, + "waypoints": 20, + "densProp": 0.92, + "densWp": 9.17, + "espacamento": 10.44, + "razaoProp": 0.38, + "razaoWp": 1.01 + }, + { + "q": "0,1", + "x0": -27.5, + "z0": -17.8, + "areaAndavel": 112, + "props": 5, + "waypoints": 15, + "densProp": 4.47, + "densWp": 13.42, + "espacamento": 4.73, + "razaoProp": 1.84, + "razaoWp": 1.48 + }, + { + "q": "0,2", + "x0": -27.5, + "z0": 0, + "areaAndavel": 112, + "props": 6, + "waypoints": 11, + "densProp": 5.37, + "densWp": 9.84, + "espacamento": 4.32, + "razaoProp": 2.21, + "razaoWp": 1.09 + }, + { + "q": "0,3", + "x0": -27.5, + "z0": 17.8, + "areaAndavel": 221, + "props": 2, + "waypoints": 20, + "densProp": 0.9, + "densWp": 9.04, + "espacamento": 10.52, + "razaoProp": 0.37, + "razaoWp": 1 + }, + { + "q": "1,0", + "x0": -13.8, + "z0": -35.5, + "areaAndavel": 196, + "props": 5, + "waypoints": 17, + "densProp": 2.55, + "densWp": 8.67, + "espacamento": 6.26, + "razaoProp": 1.05, + "razaoWp": 0.96 + }, + { + "q": "1,1", + "x0": -13.8, + "z0": -17.8, + "areaAndavel": 221, + "props": 4, + "waypoints": 20, + "densProp": 1.81, + "densWp": 9.04, + "espacamento": 7.44, + "razaoProp": 0.74, + "razaoWp": 1 + }, + { + "q": "1,2", + "x0": -13.8, + "z0": 0, + "areaAndavel": 222, + "props": 4, + "waypoints": 17, + "densProp": 1.81, + "densWp": 7.67, + "espacamento": 7.44, + "razaoProp": 0.74, + "razaoWp": 0.85 + }, + { + "q": "1,3", + "x0": -13.8, + "z0": 17.8, + "areaAndavel": 200, + "props": 5, + "waypoints": 17, + "densProp": 2.5, + "densWp": 8.52, + "espacamento": 6.32, + "razaoProp": 1.03, + "razaoWp": 0.94 + }, + { + "q": "2,0", + "x0": 0, + "z0": -35.5, + "areaAndavel": 211, + "props": 5, + "waypoints": 19, + "densProp": 2.37, + "densWp": 9.02, + "espacamento": 6.49, + "razaoProp": 0.97, + "razaoWp": 1 + }, + { + "q": "2,1", + "x0": 0, + "z0": -17.8, + "areaAndavel": 224, + "props": 5, + "waypoints": 22, + "densProp": 2.23, + "densWp": 9.82, + "espacamento": 6.7, + "razaoProp": 0.92, + "razaoWp": 1.08 + }, + { + "q": "2,2", + "x0": 0, + "z0": 0, + "areaAndavel": 221, + "props": 8, + "waypoints": 20, + "densProp": 3.61, + "densWp": 9.04, + "espacamento": 5.26, + "razaoProp": 1.48, + "razaoWp": 1 + }, + { + "q": "2,3", + "x0": 0, + "z0": 17.8, + "areaAndavel": 214, + "props": 4, + "waypoints": 19, + "densProp": 1.87, + "densWp": 8.88, + "espacamento": 7.32, + "razaoProp": 0.77, + "razaoWp": 0.98 + }, + { + "q": "3,0", + "x0": 13.8, + "z0": -35.5, + "areaAndavel": 142, + "props": 5, + "waypoints": 13, + "densProp": 3.53, + "densWp": 9.18, + "espacamento": 5.32, + "razaoProp": 1.45, + "razaoWp": 1.01 + }, + { + "q": "3,1", + "x0": 13.8, + "z0": -17.8, + "areaAndavel": 183, + "props": 4, + "waypoints": 20, + "densProp": 2.19, + "densWp": 10.94, + "espacamento": 6.76, + "razaoProp": 0.9, + "razaoWp": 1.21 + }, + { + "q": "3,2", + "x0": 13.8, + "z0": 0, + "areaAndavel": 184, + "props": 6, + "waypoints": 17, + "densProp": 3.27, + "densWp": 9.26, + "espacamento": 5.53, + "razaoProp": 1.34, + "razaoWp": 1.02 + }, + { + "q": "3,3", + "x0": 13.8, + "z0": 17.8, + "areaAndavel": 143, + "props": 5, + "waypoints": 13, + "densProp": 3.5, + "densWp": 9.09, + "espacamento": 5.35, + "razaoProp": 1.44, + "razaoWp": 1 + } + ], + "medianaProp": 2.435, + "medianaWp": 9.065, + "piorRazaoProp": 0.37, + "piorRazaoWp": 0.85, + "piorEspacamento": 10.52, + "bordasSemGuarda": [], + "rotasSpawnBandeira": [ + { + "time": "E", + "bandeira": "E", + "rotas": 4, + "comprimentos": [ + 17, + 17, + 17, + 17 + ] + }, + { + "time": "E", + "bandeira": "MID", + "rotas": 4, + "comprimentos": [ + 34.8, + 40.5, + 67.7, + 74.5 + ] + }, + { + "time": "E", + "bandeira": "B", + "rotas": 4, + "comprimentos": [ + 47, + 54.6, + 69.1, + 84.7 + ] + }, + { + "time": "B", + "bandeira": "E", + "rotas": 4, + "comprimentos": [ + 47, + 54.6, + 69.1, + 84.7 + ] + }, + { + "time": "B", + "bandeira": "MID", + "rotas": 4, + "comprimentos": [ + 34.8, + 34.8, + 51.2, + 67.7 + ] + }, + { + "time": "B", + "bandeira": "B", + "rotas": 4, + "comprimentos": [ + 17, + 17, + 17, + 17 + ] + } + ], + "piorRotas": 4, + "bandeiras": [ + { + "id": "E", + "label": "PÁTIO SUL", + "x": -10, + "z": -12, + "distSpawn": 18.11, + "timeSpawn": "E", + "maiorLinhaTiro": 59.1, + "chao": 0, + "penetracao": 0.03 + }, + { + "id": "MID", + "label": "MARQUISE", + "x": 4, + "z": 0, + "distSpawn": 30, + "timeSpawn": "E", + "maiorLinhaTiro": 44.1, + "chao": 0, + "penetracao": 0.22 + }, + { + "id": "B", + "label": "PÁTIO NORTE", + "x": -10, + "z": 12, + "distSpawn": 18.11, + "timeSpawn": "B", + "maiorLinhaTiro": 58.3, + "chao": 0, + "penetracao": 0.03 + } + ], + "alturaTrianguloMin": 14 + }, + { + "map": "upa_24h", + "celulasAlcancadas": 54212, + "amostrasChao": 3371, + "observadores": 862, + "corpoDentroDeSolido": 0, + "submersosAcimaDoPeito": 0, + "piorPenetracao": 0, + "piores": [], + "dentroTodos": [], + "spawns": [ + { + "team": "E", + "x": -25, + "z": -31, + "chao": 0, + "penetracao": 0 + }, + { + "team": "E", + "x": -20, + "z": -31, + "chao": 0, + "penetracao": 0 + }, + { + "team": "E", + "x": -15, + "z": -31, + "chao": 0, + "penetracao": 0 + }, + { + "team": "E", + "x": -10, + "z": -31, + "chao": 0, + "penetracao": 0 + }, + { + "team": "B", + "x": 10, + "z": 31, + "chao": 0, + "penetracao": 0 + }, + { + "team": "B", + "x": 15, + "z": 31, + "chao": 0, + "penetracao": 0 + }, + { + "team": "B", + "x": 20, + "z": 31, + "chao": 0, + "penetracao": 0 + }, + { + "team": "B", + "x": 25, + "z": 31, + "chao": 0, + "penetracao": 0 + } + ], + "exposicaoPorTime": [ + { + "team": "E", + "chaoMin": 0, + "chaoMax": 0, + "fracMedia": 0.1557, + "maiorVisada": 64.3 + }, + { + "team": "B", + "chaoMin": 0, + "chaoMax": 0, + "fracMedia": 0.0271, + "maiorVisada": 64.3 + } + ], + "exposicaoPorSpawn": [ + { + "team": "E", + "x": -25, + "z": -31, + "chao": 0, + "obsLonge": 713, + "obsVendo": 134, + "frac": 0.1879, + "maiorVisada": 64.3 + }, + { + "team": "E", + "x": -20, + "z": -31, + "chao": 0, + "obsLonge": 686, + "obsVendo": 122, + "frac": 0.1778, + "maiorVisada": 64.2 + }, + { + "team": "E", + "x": -15, + "z": -31, + "chao": 0, + "obsLonge": 656, + "obsVendo": 88, + "frac": 0.1341, + "maiorVisada": 44.9 + }, + { + "team": "E", + "x": -10, + "z": -31, + "chao": 0, + "obsLonge": 633, + "obsVendo": 78, + "frac": 0.1232, + "maiorVisada": 40.3 + }, + { + "team": "B", + "x": 10, + "z": 31, + "chao": 0, + "obsLonge": 643, + "obsVendo": 3, + "frac": 0.0047, + "maiorVisada": 29.4 + }, + { + "team": "B", + "x": 15, + "z": 31, + "chao": 0, + "obsLonge": 668, + "obsVendo": 16, + "frac": 0.024, + "maiorVisada": 44.9 + }, + { + "team": "B", + "x": 20, + "z": 31, + "chao": 0, + "obsLonge": 696, + "obsVendo": 35, + "frac": 0.0503, + "maiorVisada": 64.2 + }, + { + "team": "B", + "x": 25, + "z": 31, + "chao": 0, + "obsLonge": 719, + "obsVendo": 21, + "frac": 0.0292, + "maiorVisada": 64.3 + } + ], + "salaDoSpawn": [ + { + "team": "E", + "x": -25, + "z": -31, + "folgaParede": 3.35, + "dirPior": 214, + "areaContigua": 64, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": -20, + "z": -31, + "folgaParede": 4.5, + "dirPior": 264, + "areaContigua": 72.1, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": -15, + "z": -31, + "folgaParede": 4.5, + "dirPior": 264, + "areaContigua": 72.1, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": -10, + "z": -31, + "folgaParede": 4.3, + "dirPior": 332, + "areaContigua": 69.8, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 10, + "z": 31, + "folgaParede": 4.2, + "dirPior": 242, + "areaContigua": 69.2, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 15, + "z": 31, + "folgaParede": 4.5, + "dirPior": 84, + "areaContigua": 72.1, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 20, + "z": 31, + "folgaParede": 4.5, + "dirPior": 84, + "areaContigua": 71.8, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 25, + "z": 31, + "folgaParede": 3.35, + "dirPior": 34, + "areaContigua": 64, + "okFolga": true, + "okArea": true + } + ], + "piorFolga": 3.35, + "piorArea": 64, + "escadas": [], + "travessia": [], + "occluderSemMalha": [], + "occMedidos": 122, + "occPulados": 0, + "fracSemMalha": 0.0041, + "quadrantes": [ + { + "q": "0,0", + "x0": -29, + "z0": -35, + "areaAndavel": 215, + "props": 5, + "waypoints": 25, + "densProp": 2.33, + "densWp": 11.63, + "espacamento": 6.56, + "razaoProp": 0.73, + "razaoWp": 0.98 + }, + { + "q": "0,1", + "x0": -29, + "z0": -17.5, + "areaAndavel": 203, + "props": 10, + "waypoints": 24, + "densProp": 4.92, + "densWp": 11.8, + "espacamento": 4.51, + "razaoProp": 1.55, + "razaoWp": 0.99 + }, + { + "q": "0,2", + "x0": -29, + "z0": 0, + "areaAndavel": 211, + "props": 8, + "waypoints": 24, + "densProp": 3.79, + "densWp": 11.38, + "espacamento": 5.13, + "razaoProp": 1.19, + "razaoWp": 0.96 + }, + { + "q": "0,3", + "x0": -29, + "z0": 17.5, + "areaAndavel": 214, + "props": 12, + "waypoints": 25, + "densProp": 5.62, + "densWp": 11.71, + "espacamento": 4.22, + "razaoProp": 1.77, + "razaoWp": 0.98 + }, + { + "q": "1,0", + "x0": -14.5, + "z0": -35, + "areaAndavel": 224, + "props": 3, + "waypoints": 28, + "densProp": 1.34, + "densWp": 12.51, + "espacamento": 8.64, + "razaoProp": 0.42, + "razaoWp": 1.05 + }, + { + "q": "1,1", + "x0": -14.5, + "z0": -17.5, + "areaAndavel": 205, + "props": 6, + "waypoints": 25, + "densProp": 2.93, + "densWp": 12.21, + "espacamento": 5.84, + "razaoProp": 0.92, + "razaoWp": 1.03 + }, + { + "q": "1,2", + "x0": -14.5, + "z0": 0, + "areaAndavel": 204, + "props": 7, + "waypoints": 25, + "densProp": 3.43, + "densWp": 12.26, + "espacamento": 5.4, + "razaoProp": 1.08, + "razaoWp": 1.03 + }, + { + "q": "1,3", + "x0": -14.5, + "z0": 17.5, + "areaAndavel": 208, + "props": 12, + "waypoints": 25, + "densProp": 5.76, + "densWp": 12, + "espacamento": 4.17, + "razaoProp": 1.81, + "razaoWp": 1.01 + }, + { + "q": "2,0", + "x0": 0, + "z0": -35, + "areaAndavel": 218, + "props": 4, + "waypoints": 33, + "densProp": 1.84, + "densWp": 15.15, + "espacamento": 7.38, + "razaoProp": 0.58, + "razaoWp": 1.27 + }, + { + "q": "2,1", + "x0": 0, + "z0": -17.5, + "areaAndavel": 198, + "props": 8, + "waypoints": 29, + "densProp": 4.03, + "densWp": 14.62, + "espacamento": 4.98, + "razaoProp": 1.27, + "razaoWp": 1.23 + }, + { + "q": "2,2", + "x0": 0, + "z0": 0, + "areaAndavel": 206, + "props": 5, + "waypoints": 28, + "densProp": 2.42, + "densWp": 13.58, + "espacamento": 6.42, + "razaoProp": 0.76, + "razaoWp": 1.14 + }, + { + "q": "2,3", + "x0": 0, + "z0": 17.5, + "areaAndavel": 212, + "props": 12, + "waypoints": 30, + "densProp": 5.66, + "densWp": 14.14, + "espacamento": 4.21, + "razaoProp": 1.78, + "razaoWp": 1.19 + }, + { + "q": "3,0", + "x0": 14.5, + "z0": -35, + "areaAndavel": 220, + "props": 5, + "waypoints": 21, + "densProp": 2.27, + "densWp": 9.53, + "espacamento": 6.64, + "razaoProp": 0.71, + "razaoWp": 0.8 + }, + { + "q": "3,1", + "x0": 14.5, + "z0": -17.5, + "areaAndavel": 216, + "props": 6, + "waypoints": 21, + "densProp": 2.77, + "densWp": 9.71, + "espacamento": 6, + "razaoProp": 0.87, + "razaoWp": 0.82 + }, + { + "q": "3,2", + "x0": 14.5, + "z0": 0, + "areaAndavel": 208, + "props": 6, + "waypoints": 18, + "densProp": 2.89, + "densWp": 8.67, + "espacamento": 5.88, + "razaoProp": 0.91, + "razaoWp": 0.73 + }, + { + "q": "3,3", + "x0": 14.5, + "z0": 17.5, + "areaAndavel": 226, + "props": 9, + "waypoints": 23, + "densProp": 3.99, + "densWp": 10.19, + "espacamento": 5.01, + "razaoProp": 1.25, + "razaoWp": 0.86 + } + ], + "medianaProp": 3.18, + "medianaWp": 11.9, + "piorRazaoProp": 0.42, + "piorRazaoWp": 0.73, + "piorEspacamento": 8.64, + "bordasSemGuarda": [], + "rotasSpawnBandeira": [ + { + "time": "E", + "bandeira": "E", + "rotas": 4, + "comprimentos": [ + 9.6, + 9.6, + 9.6, + 9.6 + ] + }, + { + "time": "E", + "bandeira": "MID", + "rotas": 2, + "comprimentos": [ + 41, + 55.2 + ] + }, + { + "time": "E", + "bandeira": "B", + "rotas": 2, + "comprimentos": [ + 90.7, + 98.9 + ] + }, + { + "time": "B", + "bandeira": "E", + "rotas": 2, + "comprimentos": [ + 77, + 99.1 + ] + }, + { + "time": "B", + "bandeira": "MID", + "rotas": 2, + "comprimentos": [ + 45.5, + 66.9 + ] + }, + { + "time": "B", + "bandeira": "B", + "rotas": 4, + "comprimentos": [ + 6.8, + 6.8, + 6.8, + 6.8 + ] + } + ], + "piorRotas": 2, + "bandeiras": [ + { + "id": "E", + "label": "RECEPÇÃO", + "x": -18, + "z": -28, + "distSpawn": 3.61, + "timeSpawn": "E", + "maiorLinhaTiro": 45.9, + "chao": 0, + "penetracao": 0 + }, + { + "id": "MID", + "label": "CORREDOR", + "x": 0, + "z": -8, + "distSpawn": 25.08, + "timeSpawn": "E", + "maiorLinhaTiro": 41, + "chao": 0, + "penetracao": 0 + }, + { + "id": "B", + "label": "EMERGÊNCIA", + "x": 18, + "z": 28, + "distSpawn": 3.61, + "timeSpawn": "B", + "maiorLinhaTiro": 41.6, + "chao": 0, + "penetracao": 0 + } + ], + "alturaTrianguloMin": 4.33 + }, + { + "map": "obras_prefeitura", + "celulasAlcancadas": 54416, + "amostrasChao": 3384, + "observadores": 846, + "corpoDentroDeSolido": 8, + "submersosAcimaDoPeito": 0, + "piorPenetracao": 1.31, + "piores": [ + { + "tipo": "chao", + "x": 9.5, + "z": 0.5, + "pen": 1.31 + }, + { + "tipo": "chao", + "x": 8.5, + "z": 2.5, + "pen": 1.253 + }, + { + "tipo": "chao", + "x": 8.5, + "z": 4.5, + "pen": 1.205 + }, + { + "tipo": "chao", + "x": 8.5, + "z": 3.5, + "pen": 1.198 + }, + { + "tipo": "chao", + "x": 9.5, + "z": 1.5, + "pen": 1.033 + }, + { + "tipo": "chao", + "x": 9.5, + "z": 2.5, + "pen": 0.796 + }, + { + "tipo": "chao", + "x": 9.5, + "z": 3.5, + "pen": 0.661 + }, + { + "tipo": "chao", + "x": 9.5, + "z": 4.5, + "pen": 0.651 + } + ], + "dentroTodos": [ + { + "tipo": "chao", + "x": 9.5, + "z": 0.5, + "pen": 1.31 + }, + { + "tipo": "chao", + "x": 8.5, + "z": 2.5, + "pen": 1.253 + }, + { + "tipo": "chao", + "x": 8.5, + "z": 4.5, + "pen": 1.205 + }, + { + "tipo": "chao", + "x": 8.5, + "z": 3.5, + "pen": 1.198 + }, + { + "tipo": "chao", + "x": 9.5, + "z": 1.5, + "pen": 1.033 + }, + { + "tipo": "chao", + "x": 9.5, + "z": 2.5, + "pen": 0.796 + }, + { + "tipo": "chao", + "x": 9.5, + "z": 3.5, + "pen": 0.661 + }, + { + "tipo": "chao", + "x": 9.5, + "z": 4.5, + "pen": 0.651 + } + ], + "spawns": [ + { + "team": "E", + "x": 4, + "z": -31, + "chao": 0.02, + "penetracao": 0 + }, + { + "team": "E", + "x": -2, + "z": -31, + "chao": -0.01, + "penetracao": 0 + }, + { + "team": "E", + "x": 10, + "z": -31, + "chao": 0.03, + "penetracao": 0 + }, + { + "team": "E", + "x": -8, + "z": -31, + "chao": -0.02, + "penetracao": 0 + }, + { + "team": "B", + "x": 4, + "z": 31, + "chao": 0.01, + "penetracao": 0 + }, + { + "team": "B", + "x": -2, + "z": 31, + "chao": -0.02, + "penetracao": 0 + }, + { + "team": "B", + "x": 10, + "z": 31, + "chao": 0.02, + "penetracao": 0 + }, + { + "team": "B", + "x": -8, + "z": 31, + "chao": -0.03, + "penetracao": 0 + } + ], + "exposicaoPorTime": [ + { + "team": "E", + "chaoMin": -0.02, + "chaoMax": 0.03, + "fracMedia": 0.8852, + "maiorVisada": 73.6 + }, + { + "team": "B", + "chaoMin": -0.03, + "chaoMax": 0.02, + "fracMedia": 0.8905, + "maiorVisada": 72.7 + } + ], + "exposicaoPorSpawn": [ + { + "team": "E", + "x": 4, + "z": -31, + "chao": 0.02, + "obsLonge": 599, + "obsVendo": 515, + "frac": 0.8598, + "maiorVisada": 70.9 + }, + { + "team": "E", + "x": -2, + "z": -31, + "chao": -0.01, + "obsLonge": 593, + "obsVendo": 527, + "frac": 0.8887, + "maiorVisada": 69 + }, + { + "team": "E", + "x": 10, + "z": -31, + "chao": 0.03, + "obsLonge": 622, + "obsVendo": 561, + "frac": 0.9019, + "maiorVisada": 73.6 + }, + { + "team": "E", + "x": -8, + "z": -31, + "chao": -0.02, + "obsLonge": 603, + "obsVendo": 537, + "frac": 0.8905, + "maiorVisada": 73.1 + }, + { + "team": "B", + "x": 4, + "z": 31, + "chao": 0.01, + "obsLonge": 585, + "obsVendo": 524, + "frac": 0.8957, + "maiorVisada": 69.2 + }, + { + "team": "B", + "x": -2, + "z": 31, + "chao": -0.02, + "obsLonge": 582, + "obsVendo": 503, + "frac": 0.8643, + "maiorVisada": 68.1 + }, + { + "team": "B", + "x": 10, + "z": 31, + "chao": 0.02, + "obsLonge": 606, + "obsVendo": 542, + "frac": 0.8944, + "maiorVisada": 72.7 + }, + { + "team": "B", + "x": -8, + "z": 31, + "chao": -0.03, + "obsLonge": 596, + "obsVendo": 541, + "frac": 0.9077, + "maiorVisada": 72.3 + } + ], + "salaDoSpawn": [ + { + "team": "E", + "x": 4, + "z": -31, + "folgaParede": 3.45, + "dirPior": 264, + "areaContigua": 68.3, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": -2, + "z": -31, + "folgaParede": 3.45, + "dirPior": 264, + "areaContigua": 68.3, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": 10, + "z": -31, + "folgaParede": 3.45, + "dirPior": 264, + "areaContigua": 68.3, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": -8, + "z": -31, + "folgaParede": 3.45, + "dirPior": 264, + "areaContigua": 68.3, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 4, + "z": 31, + "folgaParede": 3.45, + "dirPior": 84, + "areaContigua": 68.3, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": -2, + "z": 31, + "folgaParede": 3.45, + "dirPior": 84, + "areaContigua": 68.3, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 10, + "z": 31, + "folgaParede": 3.45, + "dirPior": 84, + "areaContigua": 68.3, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": -8, + "z": 31, + "folgaParede": 3.45, + "dirPior": 84, + "areaContigua": 68.3, + "okFolga": true, + "okArea": true + } + ], + "piorFolga": 3.45, + "piorArea": 68.3, + "escadas": [], + "travessia": [], + "occluderSemMalha": [], + "occMedidos": 32, + "occPulados": 0, + "fracSemMalha": 0, + "quadrantes": [ + { + "q": "0,0", + "x0": -27.5, + "z0": -34.5, + "areaAndavel": 222, + "props": 0, + "waypoints": 20, + "densProp": 0, + "densWp": 9.01, + "espacamento": 99, + "razaoProp": 0, + "razaoWp": 1 + }, + { + "q": "0,1", + "x0": -27.5, + "z0": -17.3, + "areaAndavel": 212, + "props": 7, + "waypoints": 23, + "densProp": 3.3, + "densWp": 10.84, + "espacamento": 5.51, + "razaoProp": 2.4, + "razaoWp": 1.2 + }, + { + "q": "0,2", + "x0": -27.5, + "z0": 0, + "areaAndavel": 215, + "props": 8, + "waypoints": 20, + "densProp": 3.72, + "densWp": 9.29, + "espacamento": 5.19, + "razaoProp": 2.71, + "razaoWp": 1.03 + }, + { + "q": "0,3", + "x0": -27.5, + "z0": 17.3, + "areaAndavel": 202, + "props": 2, + "waypoints": 19, + "densProp": 0.99, + "densWp": 9.39, + "espacamento": 10.06, + "razaoProp": 0.72, + "razaoWp": 1.04 + }, + { + "q": "1,0", + "x0": -13.8, + "z0": -34.5, + "areaAndavel": 225, + "props": 1, + "waypoints": 25, + "densProp": 0.44, + "densWp": 11.12, + "espacamento": 15, + "razaoProp": 0.32, + "razaoWp": 1.23 + }, + { + "q": "1,1", + "x0": -13.8, + "z0": -17.3, + "areaAndavel": 208, + "props": 3, + "waypoints": 22, + "densProp": 1.45, + "densWp": 10.6, + "espacamento": 8.32, + "razaoProp": 1.05, + "razaoWp": 1.18 + }, + { + "q": "1,2", + "x0": -13.8, + "z0": 0, + "areaAndavel": 208, + "props": 3, + "waypoints": 18, + "densProp": 1.45, + "densWp": 8.67, + "espacamento": 8.32, + "razaoProp": 1.05, + "razaoWp": 0.96 + }, + { + "q": "1,3", + "x0": -13.8, + "z0": 17.3, + "areaAndavel": 228, + "props": 2, + "waypoints": 24, + "densProp": 0.88, + "densWp": 10.55, + "espacamento": 10.67, + "razaoProp": 0.64, + "razaoWp": 1.17 + }, + { + "q": "2,0", + "x0": 0, + "z0": -34.5, + "areaAndavel": 225, + "props": 3, + "waypoints": 20, + "densProp": 1.33, + "densWp": 8.89, + "espacamento": 8.66, + "razaoProp": 0.97, + "razaoWp": 0.99 + }, + { + "q": "2,1", + "x0": 0, + "z0": -17.3, + "areaAndavel": 211, + "props": 3, + "waypoints": 19, + "densProp": 1.42, + "densWp": 9.02, + "espacamento": 8.38, + "razaoProp": 1.03, + "razaoWp": 1 + }, + { + "q": "2,2", + "x0": 0, + "z0": 0, + "areaAndavel": 212, + "props": 3, + "waypoints": 16, + "densProp": 1.42, + "densWp": 7.56, + "espacamento": 8.4, + "razaoProp": 1.03, + "razaoWp": 0.84 + }, + { + "q": "2,3", + "x0": 0, + "z0": 17.3, + "areaAndavel": 228, + "props": 1, + "waypoints": 17, + "densProp": 0.44, + "densWp": 7.45, + "espacamento": 15.1, + "razaoProp": 0.32, + "razaoWp": 0.83 + }, + { + "q": "3,0", + "x0": 13.8, + "z0": -34.5, + "areaAndavel": 192, + "props": 2, + "waypoints": 17, + "densProp": 1.04, + "densWp": 8.85, + "espacamento": 9.8, + "razaoProp": 0.76, + "razaoWp": 0.98 + }, + { + "q": "3,1", + "x0": 13.8, + "z0": -17.3, + "areaAndavel": 204, + "props": 4, + "waypoints": 20, + "densProp": 1.96, + "densWp": 9.8, + "espacamento": 7.14, + "razaoProp": 1.43, + "razaoWp": 1.09 + }, + { + "q": "3,2", + "x0": 13.8, + "z0": 0, + "areaAndavel": 201, + "props": 9, + "waypoints": 17, + "densProp": 4.47, + "densWp": 8.44, + "espacamento": 4.73, + "razaoProp": 3.25, + "razaoWp": 0.94 + }, + { + "q": "3,3", + "x0": 13.8, + "z0": 17.3, + "areaAndavel": 209, + "props": 2, + "waypoints": 17, + "densProp": 0.96, + "densWp": 8.15, + "espacamento": 10.21, + "razaoProp": 0.7, + "razaoWp": 0.9 + } + ], + "medianaProp": 1.375, + "medianaWp": 9.015, + "piorRazaoProp": 0, + "piorRazaoWp": 0.83, + "piorEspacamento": 99, + "bordasSemGuarda": [], + "rotasSpawnBandeira": [ + { + "time": "E", + "bandeira": "E", + "rotas": 4, + "comprimentos": [ + 28.3, + 33.6, + 41.8, + 46.4 + ] + }, + { + "time": "E", + "bandeira": "MID", + "rotas": 4, + "comprimentos": [ + 31.5, + 41.3, + 56.7, + 64.2 + ] + }, + { + "time": "E", + "bandeira": "B", + "rotas": 4, + "comprimentos": [ + 48.8, + 57.8, + 58.6, + 73.3 + ] + }, + { + "time": "B", + "bandeira": "E", + "rotas": 4, + "comprimentos": [ + 46.9, + 49.6, + 58.6, + 65.8 + ] + }, + { + "time": "B", + "bandeira": "MID", + "rotas": 4, + "comprimentos": [ + 34.7, + 41.8, + 44.5, + 61.8 + ] + }, + { + "time": "B", + "bandeira": "B", + "rotas": 4, + "comprimentos": [ + 20, + 20, + 20, + 20 + ] + } + ], + "piorRotas": 4, + "bandeiras": [ + { + "id": "E", + "label": "CANTEIRO SUL", + "x": -10, + "z": -14, + "distSpawn": 17.12, + "timeSpawn": "E", + "maiorLinhaTiro": 59.9, + "chao": -1.58, + "penetracao": 1.017 + }, + { + "id": "MID", + "label": "A OBRA", + "x": 9, + "z": 0, + "distSpawn": 31.02, + "timeSpawn": "E", + "maiorLinhaTiro": 48.1, + "chao": 0.1, + "penetracao": 0 + }, + { + "id": "B", + "label": "CANTEIRO NORTE", + "x": -10, + "z": 14, + "distSpawn": 17.12, + "timeSpawn": "B", + "maiorLinhaTiro": 59.1, + "chao": -0.79, + "penetracao": 0 + } + ], + "alturaTrianguloMin": 19 + }, + { + "map": "atacadao_treta", + "celulasAlcancadas": 46509, + "amostrasChao": 3028, + "observadores": 767, + "corpoDentroDeSolido": 0, + "submersosAcimaDoPeito": 0, + "piorPenetracao": 0, + "piores": [], + "dentroTodos": [], + "spawns": [ + { + "team": "E", + "x": 6, + "z": -37, + "chao": 0, + "penetracao": 0.01 + }, + { + "team": "E", + "x": 14, + "z": -37, + "chao": 0, + "penetracao": 0.01 + }, + { + "team": "E", + "x": -6, + "z": -37, + "chao": 0, + "penetracao": 0.01 + }, + { + "team": "E", + "x": -14, + "z": -37, + "chao": 0, + "penetracao": 0.01 + }, + { + "team": "B", + "x": -8, + "z": 29, + "chao": 0, + "penetracao": 0 + }, + { + "team": "B", + "x": -2, + "z": 29, + "chao": 0, + "penetracao": 0 + }, + { + "team": "B", + "x": 4, + "z": 29, + "chao": 0, + "penetracao": 0 + }, + { + "team": "B", + "x": 10, + "z": 29, + "chao": 0, + "penetracao": 0 + } + ], + "exposicaoPorTime": [ + { + "team": "E", + "chaoMin": 0, + "chaoMax": 0, + "fracMedia": 0.4588, + "maiorVisada": 70.5 + }, + { + "team": "B", + "chaoMin": 0, + "chaoMax": 0, + "fracMedia": 0.078, + "maiorVisada": 68.5 + } + ], + "exposicaoPorSpawn": [ + { + "team": "E", + "x": 6, + "z": -37, + "chao": 0, + "obsLonge": 560, + "obsVendo": 253, + "frac": 0.4518, + "maiorVisada": 70.5 + }, + { + "team": "E", + "x": 14, + "z": -37, + "chao": 0, + "obsLonge": 594, + "obsVendo": 269, + "frac": 0.4529, + "maiorVisada": 68.2 + }, + { + "team": "E", + "x": -6, + "z": -37, + "chao": 0, + "obsLonge": 565, + "obsVendo": 263, + "frac": 0.4655, + "maiorVisada": 70.2 + }, + { + "team": "E", + "x": -14, + "z": -37, + "chao": 0, + "obsLonge": 600, + "obsVendo": 279, + "frac": 0.465, + "maiorVisada": 68.1 + }, + { + "team": "B", + "x": -8, + "z": 29, + "chao": 0, + "obsLonge": 547, + "obsVendo": 9, + "frac": 0.0165, + "maiorVisada": 32.6 + }, + { + "team": "B", + "x": -2, + "z": 29, + "chao": 0, + "obsLonge": 526, + "obsVendo": 64, + "frac": 0.1217, + "maiorVisada": 68.5 + }, + { + "team": "B", + "x": 4, + "z": 29, + "chao": 0, + "obsLonge": 528, + "obsVendo": 11, + "frac": 0.0208, + "maiorVisada": 31.8 + }, + { + "team": "B", + "x": 10, + "z": 29, + "chao": 0, + "obsLonge": 556, + "obsVendo": 85, + "frac": 0.1529, + "maiorVisada": 68.5 + } + ], + "salaDoSpawn": [ + { + "team": "E", + "x": 6, + "z": -37, + "folgaParede": 4.45, + "dirPior": 174, + "areaContigua": 68.1, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": 14, + "z": -37, + "folgaParede": 4.75, + "dirPior": 276, + "areaContigua": 71.9, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": -6, + "z": -37, + "folgaParede": 4.45, + "dirPior": 0, + "areaContigua": 68.6, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": -14, + "z": -37, + "folgaParede": 4.75, + "dirPior": 264, + "areaContigua": 71.3, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": -8, + "z": 29, + "folgaParede": 1.5, + "dirPior": 259, + "areaContigua": 54.7, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": -2, + "z": 29, + "folgaParede": 1.5, + "dirPior": 259, + "areaContigua": 53.9, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 4, + "z": 29, + "folgaParede": 1.5, + "dirPior": 259, + "areaContigua": 52.1, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 10, + "z": 29, + "folgaParede": 2.2, + "dirPior": 225, + "areaContigua": 56.1, + "okFolga": true, + "okArea": true + } + ], + "piorFolga": 1.5, + "piorArea": 52.1, + "escadas": [], + "travessia": [], + "occluderSemMalha": [], + "occMedidos": 65, + "occPulados": 0, + "fracSemMalha": 0.0025, + "quadrantes": [ + { + "q": "0,0", + "x0": -25.5, + "z0": -41, + "areaAndavel": 179, + "props": 3, + "waypoints": 20, + "densProp": 1.68, + "densWp": 11.2, + "espacamento": 7.72, + "razaoProp": 0.44, + "razaoWp": 1.12 + }, + { + "q": "0,1", + "x0": -25.5, + "z0": -22.8, + "areaAndavel": 162, + "props": 5, + "waypoints": 20, + "densProp": 3.09, + "densWp": 12.35, + "espacamento": 5.69, + "razaoProp": 0.8, + "razaoWp": 1.23 + }, + { + "q": "0,2", + "x0": -25.5, + "z0": -4.5, + "areaAndavel": 198, + "props": 7, + "waypoints": 17, + "densProp": 3.54, + "densWp": 8.61, + "espacamento": 5.31, + "razaoProp": 0.92, + "razaoWp": 0.86 + }, + { + "q": "0,3", + "x0": -25.5, + "z0": 13.8, + "areaAndavel": 176, + "props": 12, + "waypoints": 19, + "densProp": 6.82, + "densWp": 10.79, + "espacamento": 3.83, + "razaoProp": 1.77, + "razaoWp": 1.08 + }, + { + "q": "1,0", + "x0": -12.8, + "z0": -41, + "areaAndavel": 178, + "props": 2, + "waypoints": 17, + "densProp": 1.12, + "densWp": 9.53, + "espacamento": 9.44, + "razaoProp": 0.29, + "razaoWp": 0.95 + }, + { + "q": "1,1", + "x0": -12.8, + "z0": -22.8, + "areaAndavel": 180, + "props": 5, + "waypoints": 19, + "densProp": 2.77, + "densWp": 10.54, + "espacamento": 6, + "razaoProp": 0.72, + "razaoWp": 1.05 + }, + { + "q": "1,2", + "x0": -12.8, + "z0": -4.5, + "areaAndavel": 190, + "props": 15, + "waypoints": 15, + "densProp": 7.88, + "densWp": 7.88, + "espacamento": 3.56, + "razaoProp": 2.05, + "razaoWp": 0.79 + }, + { + "q": "1,3", + "x0": -12.8, + "z0": 13.8, + "areaAndavel": 191, + "props": 18, + "waypoints": 15, + "densProp": 9.4, + "densWp": 7.84, + "espacamento": 3.26, + "razaoProp": 2.44, + "razaoWp": 0.78 + }, + { + "q": "2,0", + "x0": 0, + "z0": -41, + "areaAndavel": 162, + "props": 4, + "waypoints": 15, + "densProp": 2.47, + "densWp": 9.27, + "espacamento": 6.36, + "razaoProp": 0.64, + "razaoWp": 0.92 + }, + { + "q": "2,1", + "x0": 0, + "z0": -22.8, + "areaAndavel": 161, + "props": 7, + "waypoints": 18, + "densProp": 4.35, + "densWp": 11.18, + "espacamento": 4.79, + "razaoProp": 1.13, + "razaoWp": 1.11 + }, + { + "q": "2,2", + "x0": 0, + "z0": -4.5, + "areaAndavel": 189, + "props": 16, + "waypoints": 15, + "densProp": 8.46, + "densWp": 7.93, + "espacamento": 3.44, + "razaoProp": 2.2, + "razaoWp": 0.79 + }, + { + "q": "2,3", + "x0": 0, + "z0": 13.8, + "areaAndavel": 191, + "props": 18, + "waypoints": 15, + "densProp": 9.4, + "densWp": 7.84, + "espacamento": 3.26, + "razaoProp": 2.44, + "razaoWp": 0.78 + }, + { + "q": "3,0", + "x0": 12.8, + "z0": -41, + "areaAndavel": 197, + "props": 1, + "waypoints": 22, + "densProp": 0.51, + "densWp": 11.15, + "espacamento": 14.05, + "razaoProp": 0.13, + "razaoWp": 1.11 + }, + { + "q": "3,1", + "x0": 12.8, + "z0": -22.8, + "areaAndavel": 185, + "props": 3, + "waypoints": 22, + "densProp": 1.62, + "densWp": 11.91, + "espacamento": 7.85, + "razaoProp": 0.42, + "razaoWp": 1.19 + }, + { + "q": "3,2", + "x0": 12.8, + "z0": -4.5, + "areaAndavel": 193, + "props": 8, + "waypoints": 15, + "densProp": 4.15, + "densWp": 7.79, + "espacamento": 4.91, + "razaoProp": 1.08, + "razaoWp": 0.78 + }, + { + "q": "3,3", + "x0": 12.8, + "z0": 13.8, + "areaAndavel": 174, + "props": 13, + "waypoints": 19, + "densProp": 7.46, + "densWp": 10.9, + "espacamento": 3.66, + "razaoProp": 1.94, + "razaoWp": 1.09 + } + ], + "medianaProp": 3.845, + "medianaWp": 10.035, + "piorRazaoProp": 0.13, + "piorRazaoWp": 0.78, + "piorEspacamento": 14.05, + "bordasSemGuarda": [], + "rotasSpawnBandeira": [ + { + "time": "E", + "bandeira": "E", + "rotas": 2, + "comprimentos": [ + 22.4, + 53.3 + ] + }, + { + "time": "E", + "bandeira": "MID", + "rotas": 2, + "comprimentos": [ + 33.3, + 37.9 + ] + }, + { + "time": "E", + "bandeira": "B", + "rotas": 2, + "comprimentos": [ + 70.6, + 87.2 + ] + }, + { + "time": "B", + "bandeira": "E", + "rotas": 2, + "comprimentos": [ + 60.3, + 86.6 + ] + }, + { + "time": "B", + "bandeira": "MID", + "rotas": 3, + "comprimentos": [ + 55.7, + 56.5, + 90.1 + ] + }, + { + "time": "B", + "bandeira": "B", + "rotas": 4, + "comprimentos": [ + 9.1, + 9.1, + 9.1, + 9.1 + ] + } + ], + "piorRotas": 2, + "bandeiras": [ + { + "id": "E", + "label": "ESTACIONAMENTO", + "x": -8, + "z": -30, + "distSpawn": 7.28, + "timeSpawn": "E", + "maiorLinhaTiro": 62.9, + "chao": 0, + "penetracao": 0.01 + }, + { + "id": "MID", + "label": "PORTA", + "x": 10, + "z": -8, + "distSpawn": 29.27, + "timeSpawn": "E", + "maiorLinhaTiro": 45.6, + "chao": 0, + "penetracao": 0 + }, + { + "id": "B", + "label": "DOCA", + "x": -8, + "z": 24, + "distSpawn": 5, + "timeSpawn": "B", + "maiorLinhaTiro": 64.4, + "chao": 0, + "penetracao": 0 + } + ], + "alturaTrianguloMin": 18 + }, + { + "map": "parque_treta", + "celulasAlcancadas": 71572, + "amostrasChao": 4496, + "observadores": 1113, + "corpoDentroDeSolido": 20, + "submersosAcimaDoPeito": 0, + "piorPenetracao": 1.06, + "piores": [ + { + "tipo": "chao", + "x": -20.2, + "z": -31.2, + "pen": 1.06 + }, + { + "tipo": "chao", + "x": -20.2, + "z": 30.8, + "pen": 1.06 + }, + { + "tipo": "chao", + "x": -23.2, + "z": -31.2, + "pen": 0.7 + }, + { + "tipo": "chao", + "x": -23.2, + "z": 30.8, + "pen": 0.7 + }, + { + "tipo": "chao", + "x": -16.2, + "z": -12.2, + "pen": 0.45 + }, + { + "tipo": "chao", + "x": -16.2, + "z": -11.2, + "pen": 0.45 + }, + { + "tipo": "chao", + "x": -16.2, + "z": 11.8, + "pen": 0.45 + }, + { + "tipo": "chao", + "x": -16.2, + "z": 12.8, + "pen": 0.45 + } + ], + "dentroTodos": [ + { + "tipo": "chao", + "x": -20.2, + "z": -31.2, + "pen": 1.06 + }, + { + "tipo": "chao", + "x": -20.2, + "z": 30.8, + "pen": 1.06 + }, + { + "tipo": "chao", + "x": -23.2, + "z": -31.2, + "pen": 0.7 + }, + { + "tipo": "chao", + "x": -23.2, + "z": 30.8, + "pen": 0.7 + }, + { + "tipo": "chao", + "x": -16.2, + "z": -12.2, + "pen": 0.45 + }, + { + "tipo": "chao", + "x": -16.2, + "z": -11.2, + "pen": 0.45 + }, + { + "tipo": "chao", + "x": -16.2, + "z": 11.8, + "pen": 0.45 + }, + { + "tipo": "chao", + "x": -16.2, + "z": 12.8, + "pen": 0.45 + }, + { + "tipo": "chao", + "x": -15.2, + "z": -12.2, + "pen": 0.45 + }, + { + "tipo": "chao", + "x": -15.2, + "z": -11.2, + "pen": 0.45 + }, + { + "tipo": "chao", + "x": -15.2, + "z": 11.8, + "pen": 0.45 + }, + { + "tipo": "chao", + "x": -15.2, + "z": 12.8, + "pen": 0.45 + }, + { + "tipo": "chao", + "x": 15.8, + "z": -12.2, + "pen": 0.45 + }, + { + "tipo": "chao", + "x": 15.8, + "z": -11.2, + "pen": 0.45 + }, + { + "tipo": "chao", + "x": 15.8, + "z": 11.8, + "pen": 0.45 + }, + { + "tipo": "chao", + "x": 15.8, + "z": 12.8, + "pen": 0.45 + }, + { + "tipo": "chao", + "x": 16.8, + "z": -12.2, + "pen": 0.45 + }, + { + "tipo": "chao", + "x": 16.8, + "z": -11.2, + "pen": 0.45 + }, + { + "tipo": "chao", + "x": 16.8, + "z": 11.8, + "pen": 0.45 + }, + { + "tipo": "chao", + "x": 16.8, + "z": 12.8, + "pen": 0.45 + } + ], + "spawns": [ + { + "team": "E", + "x": -9, + "z": -38.5, + "chao": 0, + "penetracao": 0.01 + }, + { + "team": "E", + "x": -3, + "z": -38.5, + "chao": 0, + "penetracao": 0.025 + }, + { + "team": "E", + "x": 3, + "z": -38.5, + "chao": 0, + "penetracao": 0.025 + }, + { + "team": "E", + "x": 9, + "z": -38.5, + "chao": 0, + "penetracao": 0.01 + }, + { + "team": "B", + "x": -9, + "z": 38.5, + "chao": 0, + "penetracao": 0 + }, + { + "team": "B", + "x": -3, + "z": 38.5, + "chao": 0, + "penetracao": 0.025 + }, + { + "team": "B", + "x": 3, + "z": 38.5, + "chao": 0, + "penetracao": 0.025 + }, + { + "team": "B", + "x": 9, + "z": 38.5, + "chao": 0, + "penetracao": 0 } ], - "travessia": [ + "exposicaoPorTime": [ { - "nivel": "LAJE NORTE", - "celulasAlcancadas": 751, - "waypointsNoNivel": 1, - "aEstrelaChega": true + "team": "E", + "chaoMin": 0, + "chaoMax": 0, + "fracMedia": 0.519, + "maiorVisada": 86.2 }, { - "nivel": "LAJE DA CAIXA", - "celulasAlcancadas": 579, - "waypointsNoNivel": 6, - "aEstrelaChega": true + "team": "B", + "chaoMin": 0, + "chaoMax": 0, + "fracMedia": 0.5222, + "maiorVisada": 84.1 + } + ], + "exposicaoPorSpawn": [ + { + "team": "E", + "x": -9, + "z": -38.5, + "chao": 0, + "obsLonge": 881, + "obsVendo": 367, + "frac": 0.4166, + "maiorVisada": 83.4 }, { - "nivel": "LAJE DO VARAL", - "celulasAlcancadas": 581, - "waypointsNoNivel": 6, - "aEstrelaChega": true + "team": "E", + "x": -3, + "z": -38.5, + "chao": 0, + "obsLonge": 876, + "obsVendo": 549, + "frac": 0.6267, + "maiorVisada": 86.2 }, { - "nivel": "LAJE OESTE NORTE", - "celulasAlcancadas": 538, - "waypointsNoNivel": 6, - "aEstrelaChega": true + "team": "E", + "x": 3, + "z": -38.5, + "chao": 0, + "obsLonge": 874, + "obsVendo": 560, + "frac": 0.6407, + "maiorVisada": 85.6 }, { - "nivel": "LAJE LESTE NORTE", - "celulasAlcancadas": 526, - "waypointsNoNivel": 6, - "aEstrelaChega": true + "team": "E", + "x": 9, + "z": -38.5, + "chao": 0, + "obsLonge": 875, + "obsVendo": 343, + "frac": 0.392, + "maiorVisada": 82.9 }, { - "nivel": "LAJE OESTE MEIO", - "celulasAlcancadas": 376, - "waypointsNoNivel": 6, - "aEstrelaChega": true + "team": "B", + "x": -9, + "z": 38.5, + "chao": 0, + "obsLonge": 862, + "obsVendo": 360, + "frac": 0.4176, + "maiorVisada": 81.3 }, { - "nivel": "LAJE LESTE MEIO", - "celulasAlcancadas": 544, - "waypointsNoNivel": 6, - "aEstrelaChega": true + "team": "B", + "x": -3, + "z": 38.5, + "chao": 0, + "obsLonge": 855, + "obsVendo": 537, + "frac": 0.6281, + "maiorVisada": 84 }, { - "nivel": "LAJE DO CHURRASCO", - "celulasAlcancadas": 1038, - "waypointsNoNivel": 11, - "aEstrelaChega": true + "team": "B", + "x": 3, + "z": 38.5, + "chao": 0, + "obsLonge": 855, + "obsVendo": 550, + "frac": 0.6433, + "maiorVisada": 84.1 }, { - "nivel": "LAJE DA PISCINA", - "celulasAlcancadas": 996, - "waypointsNoNivel": 11, - "aEstrelaChega": true + "team": "B", + "x": 9, + "z": 38.5, + "chao": 0, + "obsLonge": 855, + "obsVendo": 342, + "frac": 0.4, + "maiorVisada": 81.4 + } + ], + "salaDoSpawn": [ + { + "team": "E", + "x": -9, + "z": -38.5, + "folgaParede": 2.75, + "dirPior": 264, + "areaContigua": 58.7, + "okFolga": true, + "okArea": true }, { - "nivel": "LAJE SUL", - "celulasAlcancadas": 731, - "waypointsNoNivel": 1, - "aEstrelaChega": true + "team": "E", + "x": -3, + "z": -38.5, + "folgaParede": 2.75, + "dirPior": 264, + "areaContigua": 60.8, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": 3, + "z": -38.5, + "folgaParede": 2.75, + "dirPior": 264, + "areaContigua": 61.1, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": 9, + "z": -38.5, + "folgaParede": 2.75, + "dirPior": 264, + "areaContigua": 58.7, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": -9, + "z": 38.5, + "folgaParede": 2.75, + "dirPior": 84, + "areaContigua": 59.8, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": -3, + "z": 38.5, + "folgaParede": 2.75, + "dirPior": 84, + "areaContigua": 61.8, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 3, + "z": 38.5, + "folgaParede": 2.75, + "dirPior": 84, + "areaContigua": 61.9, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 9, + "z": 38.5, + "folgaParede": 2.75, + "dirPior": 84, + "areaContigua": 59.7, + "okFolga": true, + "okArea": true } ], + "piorFolga": 2.75, + "piorArea": 58.7, + "escadas": [], + "travessia": [], "occluderSemMalha": [], - "occMedidos": 971, + "occMedidos": 48, "occPulados": 0, - "fracSemMalha": 0.0044, + "fracSemMalha": 0.0037, "quadrantes": [ + { + "q": "0,0", + "x0": -31.2, + "z0": -41.2, + "areaAndavel": 301, + "props": 1, + "waypoints": 33, + "densProp": 0.33, + "densWp": 10.97, + "espacamento": 17.34, + "razaoProp": 0.33, + "razaoWp": 1.19 + }, { "q": "0,1", - "x0": -15.5, - "z0": -19.5, - "areaAndavel": 68, - "props": 68, - "waypoints": 15, - "densProp": 100.37, - "densWp": 22.14, - "espacamento": 1, - "razaoProp": 0.96, - "razaoWp": 0.9 + "x0": -31.2, + "z0": -20.6, + "areaAndavel": 286, + "props": 2, + "waypoints": 26, + "densProp": 0.7, + "densWp": 9.09, + "espacamento": 11.96, + "razaoProp": 0.69, + "razaoWp": 0.99 }, { "q": "0,2", - "x0": -15.5, + "x0": -31.2, "z0": 0, - "areaAndavel": 52, - "props": 72, - "waypoints": 15, - "densProp": 139.3, - "densWp": 29.02, - "espacamento": 0.85, - "razaoProp": 1.33, + "areaAndavel": 290, + "props": 3, + "waypoints": 26, + "densProp": 1.04, + "densWp": 8.97, + "espacamento": 9.83, + "razaoProp": 1.03, + "razaoWp": 0.97 + }, + { + "q": "0,3", + "x0": -31.2, + "z0": 20.6, + "areaAndavel": 301, + "props": 1, + "waypoints": 28, + "densProp": 0.33, + "densWp": 9.31, + "espacamento": 17.34, + "razaoProp": 0.33, + "razaoWp": 1.01 + }, + { + "q": "1,0", + "x0": -15.6, + "z0": -41.2, + "areaAndavel": 297, + "props": 3, + "waypoints": 33, + "densProp": 1.01, + "densWp": 11.11, + "espacamento": 9.95, + "razaoProp": 1, + "razaoWp": 1.2 + }, + { + "q": "1,1", + "x0": -15.6, + "z0": -20.6, + "areaAndavel": 245, + "props": 3, + "waypoints": 23, + "densProp": 1.23, + "densWp": 9.4, + "espacamento": 9.03, + "razaoProp": 1.22, + "razaoWp": 1.02 + }, + { + "q": "1,2", + "x0": -15.6, + "z0": 0, + "areaAndavel": 247, + "props": 3, + "waypoints": 23, + "densProp": 1.21, + "densWp": 9.31, + "espacamento": 9.08, + "razaoProp": 1.2, + "razaoWp": 1.01 + }, + { + "q": "1,3", + "x0": -15.6, + "z0": 20.6, + "areaAndavel": 298, + "props": 3, + "waypoints": 28, + "densProp": 1.01, + "densWp": 9.39, + "espacamento": 9.97, + "razaoProp": 1, + "razaoWp": 1.02 + }, + { + "q": "2,0", + "x0": 0, + "z0": -41.2, + "areaAndavel": 302, + "props": 3, + "waypoints": 33, + "densProp": 0.99, + "densWp": 10.93, + "espacamento": 10.03, + "razaoProp": 0.98, "razaoWp": 1.18 }, + { + "q": "2,1", + "x0": 0, + "z0": -20.6, + "areaAndavel": 249, + "props": 3, + "waypoints": 23, + "densProp": 1.2, + "densWp": 9.22, + "espacamento": 9.12, + "razaoProp": 1.19, + "razaoWp": 1 + }, + { + "q": "2,2", + "x0": 0, + "z0": 0, + "areaAndavel": 252, + "props": 4, + "waypoints": 23, + "densProp": 1.59, + "densWp": 9.13, + "espacamento": 7.94, + "razaoProp": 1.57, + "razaoWp": 0.99 + }, { "q": "2,3", "x0": 0, - "z0": 19.5, - "areaAndavel": 49, - "props": 43, - "waypoints": 58, - "densProp": 88.21, - "densWp": 118.97, - "espacamento": 1.06, - "razaoProp": 0.84, - "razaoWp": 4.83 + "z0": 20.6, + "areaAndavel": 303, + "props": 3, + "waypoints": 28, + "densProp": 0.99, + "densWp": 9.23, + "espacamento": 10.06, + "razaoProp": 0.98, + "razaoWp": 1 + }, + { + "q": "3,0", + "x0": 15.6, + "z0": -41.2, + "areaAndavel": 301, + "props": 1, + "waypoints": 27, + "densProp": 0.33, + "densWp": 8.98, + "espacamento": 17.34, + "razaoProp": 0.33, + "razaoWp": 0.97 }, { "q": "3,1", - "x0": 7.8, - "z0": -19.5, - "areaAndavel": 67, - "props": 70, - "waypoints": 15, - "densProp": 104.48, - "densWp": 22.39, - "espacamento": 0.98, - "razaoProp": 1, - "razaoWp": 0.91 + "x0": 15.6, + "z0": -20.6, + "areaAndavel": 250, + "props": 4, + "waypoints": 17, + "densProp": 1.6, + "densWp": 6.81, + "espacamento": 7.9, + "razaoProp": 1.58, + "razaoWp": 0.74 }, { "q": "3,2", - "x0": 7.8, + "x0": 15.6, "z0": 0, - "areaAndavel": 61, - "props": 69, - "waypoints": 15, - "densProp": 113.35, - "densWp": 24.64, - "espacamento": 0.94, - "razaoProp": 1.08, - "razaoWp": 1 + "areaAndavel": 251, + "props": 4, + "waypoints": 16, + "densProp": 1.59, + "densWp": 6.37, + "espacamento": 7.92, + "razaoProp": 1.57, + "razaoWp": 0.69 + }, + { + "q": "3,3", + "x0": 15.6, + "z0": 20.6, + "areaAndavel": 301, + "props": 1, + "waypoints": 23, + "densProp": 0.33, + "densWp": 7.64, + "espacamento": 17.35, + "razaoProp": 0.33, + "razaoWp": 0.83 } ], - "medianaProp": 104.48, - "medianaWp": 24.64, - "piorRazaoProp": 0.84, - "piorRazaoWp": 0.9, - "piorEspacamento": 1.06, + "medianaProp": 1.01, + "medianaWp": 9.225000000000001, + "piorRazaoProp": 0.33, + "piorRazaoWp": 0.69, + "piorEspacamento": 17.35, "bordasSemGuarda": [], "rotasSpawnBandeira": [ - { - "time": "E", - "bandeira": "R", - "rotas": 4, - "comprimentos": [ - 15.4, - 15.4, - 15.4, - 15.4 - ] - }, { "time": "E", "bandeira": "E", "rotas": 4, "comprimentos": [ - 15.4, - 15.4, - 15.4, - 15.4 - ] - }, - { - "time": "E", - "bandeira": "P", - "rotas": 2, - "comprimentos": [ - 53.5, - 100.4 + 28.3, + 30.9, + 41.8, + 74.6 ] }, { "time": "E", - "bandeira": "B", - "rotas": 2, + "bandeira": "MID", + "rotas": 4, "comprimentos": [ - 53.5, - 100.4 + 56.5, + 63.7, + 67.4, + 89.3 ] }, { - "time": "B", - "bandeira": "R", - "rotas": 2, + "time": "E", + "bandeira": "B", + "rotas": 4, "comprimentos": [ - 61.5, - 92.3 + 80.2, + 85.5, + 90.8, + 122.1 ] }, { "time": "B", "bandeira": "E", - "rotas": 2, + "rotas": 3, "comprimentos": [ - 61.5, - 92.3 + 82.9, + 89, + 108.2 ] }, { "time": "B", - "bandeira": "P", - "rotas": 2, + "bandeira": "MID", + "rotas": 4, "comprimentos": [ - 23.4, - 130.4 + 30.1, + 32.8, + 41.8, + 46.4 ] }, { "time": "B", "bandeira": "B", - "rotas": 2, + "rotas": 4, "comprimentos": [ - 23.4, - 130.4 + 10.9, + 10.9, + 10.9, + 10.9 ] } ], - "piorRotas": 2, + "piorRotas": 3, "bandeiras": [ - { - "id": "R", - "label": "LAJE DA CAIXA", - "x": -10.2, - "z": -23.5, - "distSpawn": 12.1, - "timeSpawn": "E", - "maiorLinhaTiro": 59.9, - "chao": 5.2, - "penetracao": 0 - }, { "id": "E", - "label": "LAJE DO VARAL", - "x": 10.2, - "z": -23.5, - "distSpawn": 12.1, + "label": "PORTAL ROSA", + "x": 18, + "z": -33, + "distSpawn": 10.55, "timeSpawn": "E", - "maiorLinhaTiro": 59.7, - "chao": 5.2, - "penetracao": 0 + "maiorLinhaTiro": 84.3, + "chao": 0, + "penetracao": 0.025 }, { - "id": "P", - "label": "LAJE DO CHURRASCO", - "x": -10.2, - "z": 15.5, - "distSpawn": 18.74, + "id": "MID", + "label": "CARROSSEL", + "x": 0, + "z": 10, + "distSpawn": 28.66, "timeSpawn": "B", - "maiorLinhaTiro": 52.1, - "chao": 5.2, - "penetracao": 0 + "maiorLinhaTiro": 58, + "chao": 0, + "penetracao": 0.04 }, { "id": "B", - "label": "LAJE DA PISCINA", - "x": 10.2, - "z": 15.5, - "distSpawn": 18.74, + "label": "PORTAL AZUL", + "x": -18, + "z": 33, + "distSpawn": 10.55, "timeSpawn": "B", - "maiorLinhaTiro": 52.3, - "chao": 5.2, - "penetracao": 0 + "maiorLinhaTiro": 87.1, + "chao": 0, + "penetracao": 0.045 } ], - "alturaTrianguloMin": 18.08 + "alturaTrianguloMin": 4.79 }, { - "map": "corrego", - "celulasAlcancadas": 44907, - "amostrasChao": 2769, - "observadores": 698, + "map": "velho_oeste", + "celulasAlcancadas": 71310, + "amostrasChao": 4460, + "observadores": 1107, "corpoDentroDeSolido": 0, "submersosAcimaDoPeito": 0, "piorPenetracao": 0, @@ -2032,57 +9628,57 @@ "spawns": [ { "team": "E", - "x": 21, - "z": -25, + "x": -12, + "z": -41, "chao": 0, - "penetracao": 0.01 + "penetracao": 0 }, { "team": "E", - "x": 21, - "z": -5, + "x": -4, + "z": -41, "chao": 0, - "penetracao": 0.01 + "penetracao": 0 }, { "team": "E", - "x": 21, - "z": 15, + "x": 4, + "z": -41, "chao": 0, "penetracao": 0 }, { "team": "E", - "x": 21, - "z": 35, + "x": 12, + "z": -41, "chao": 0, "penetracao": 0 }, { "team": "B", - "x": -21, - "z": -25, + "x": 12, + "z": 41, "chao": 0, - "penetracao": 0.01 + "penetracao": 0 }, { "team": "B", - "x": -21, - "z": -5, + "x": 4, + "z": 41, "chao": 0, - "penetracao": 0.01 + "penetracao": 0 }, { "team": "B", - "x": -21, - "z": 15, + "x": -4, + "z": 41, "chao": 0, "penetracao": 0 }, { "team": "B", - "x": -21, - "z": 35, + "x": -12, + "z": 41, "chao": 0, "penetracao": 0 } @@ -2092,599 +9688,708 @@ "team": "E", "chaoMin": 0, "chaoMax": 0, - "fracMedia": 0.2916, - "maiorVisada": 76.4 + "fracMedia": 0.6337, + "maiorVisada": 92 }, { "team": "B", "chaoMin": 0, "chaoMax": 0, - "fracMedia": 0.2732, - "maiorVisada": 77 + "fracMedia": 0.666, + "maiorVisada": 89.8 } ], "exposicaoPorSpawn": [ { "team": "E", - "x": 21, - "z": -25, + "x": -12, + "z": -41, "chao": 0, - "obsLonge": 534, - "obsVendo": 153, - "frac": 0.2865, - "maiorVisada": 76.4 + "obsLonge": 902, + "obsVendo": 555, + "frac": 0.6153, + "maiorVisada": 91.2 }, { "team": "E", - "x": 21, - "z": -5, + "x": -4, + "z": -41, "chao": 0, - "obsLonge": 476, - "obsVendo": 151, - "frac": 0.3172, - "maiorVisada": 56.8 + "obsLonge": 868, + "obsVendo": 572, + "frac": 0.659, + "maiorVisada": 91.9 }, { "team": "E", - "x": 21, - "z": 15, + "x": 4, + "z": -41, "chao": 0, - "obsLonge": 480, - "obsVendo": 178, - "frac": 0.3708, - "maiorVisada": 53.2 + "obsLonge": 862, + "obsVendo": 564, + "frac": 0.6543, + "maiorVisada": 92 }, { "team": "E", - "x": 21, - "z": 35, + "x": 12, + "z": -41, "chao": 0, - "obsLonge": 552, - "obsVendo": 106, - "frac": 0.192, - "maiorVisada": 75.6 + "obsLonge": 886, + "obsVendo": 537, + "frac": 0.6061, + "maiorVisada": 91.3 }, { "team": "B", - "x": -21, - "z": -25, + "x": 12, + "z": 41, "chao": 0, - "obsLonge": 538, - "obsVendo": 156, - "frac": 0.29, - "maiorVisada": 77 + "obsLonge": 861, + "obsVendo": 550, + "frac": 0.6388, + "maiorVisada": 89.8 }, { "team": "B", - "x": -21, - "z": -5, + "x": 4, + "z": 41, "chao": 0, - "obsLonge": 494, - "obsVendo": 120, - "frac": 0.2429, - "maiorVisada": 49.9 + "obsLonge": 835, + "obsVendo": 579, + "frac": 0.6934, + "maiorVisada": 87.9 }, { "team": "B", - "x": -21, - "z": 15, + "x": -4, + "z": 41, "chao": 0, - "obsLonge": 480, - "obsVendo": 107, - "frac": 0.2229, - "maiorVisada": 52.5 + "obsLonge": 835, + "obsVendo": 572, + "frac": 0.685, + "maiorVisada": 87.3 }, { "team": "B", - "x": -21, - "z": 35, + "x": -12, + "z": 41, "chao": 0, - "obsLonge": 546, - "obsVendo": 184, - "frac": 0.337, - "maiorVisada": 76.7 + "obsLonge": 869, + "obsVendo": 562, + "frac": 0.6467, + "maiorVisada": 89.7 } ], "salaDoSpawn": [ { "team": "E", - "x": 21, - "z": -25, - "folgaParede": 2.8, - "dirPior": 0, - "areaContigua": 55.7, + "x": -12, + "z": -41, + "folgaParede": 4.9, + "dirPior": 270, + "areaContigua": 73.4, "okFolga": true, "okArea": true }, { "team": "E", - "x": 21, - "z": -5, - "folgaParede": 2.8, - "dirPior": 0, - "areaContigua": 54.5, + "x": -4, + "z": -41, + "folgaParede": 5.25, + "dirPior": 247, + "areaContigua": 73.4, "okFolga": true, "okArea": true }, { "team": "E", - "x": 21, - "z": 15, - "folgaParede": 2.35, - "dirPior": 264, - "areaContigua": 51.4, + "x": 4, + "z": -41, + "folgaParede": 5.25, + "dirPior": 293, + "areaContigua": 73.4, "okFolga": true, "okArea": true }, { "team": "E", - "x": 21, - "z": 35, - "folgaParede": 2.8, - "dirPior": 0, - "areaContigua": 49.9, + "x": 12, + "z": -41, + "folgaParede": 4.9, + "dirPior": 270, + "areaContigua": 73.4, "okFolga": true, "okArea": true }, { "team": "B", - "x": -21, - "z": -25, - "folgaParede": 2.7, - "dirPior": 315, - "areaContigua": 50.4, + "x": 12, + "z": 41, + "folgaParede": 4.9, + "dirPior": 90, + "areaContigua": 74.3, "okFolga": true, "okArea": true }, { "team": "B", - "x": -21, - "z": -5, - "folgaParede": 2.8, - "dirPior": 174, - "areaContigua": 57.7, + "x": 4, + "z": 41, + "folgaParede": 5.25, + "dirPior": 68, + "areaContigua": 74.3, "okFolga": true, "okArea": true }, { "team": "B", - "x": -21, - "z": 15, - "folgaParede": 2.8, - "dirPior": 174, - "areaContigua": 56.7, + "x": -4, + "z": 41, + "folgaParede": 5.25, + "dirPior": 113, + "areaContigua": 74.3, "okFolga": true, "okArea": true }, { "team": "B", - "x": -21, - "z": 35, - "folgaParede": 2.8, - "dirPior": 174, - "areaContigua": 50.3, + "x": -12, + "z": 41, + "folgaParede": 4.4, + "dirPior": 264, + "areaContigua": 71.3, "okFolga": true, "okArea": true } ], - "piorFolga": 2.35, - "piorArea": 49.9, + "piorFolga": 4.4, + "piorArea": 71.3, "escadas": [], "travessia": [], "occluderSemMalha": [], - "occMedidos": 108, - "occPulados": 62, - "fracSemMalha": 0.0037, + "occMedidos": 56, + "occPulados": 11, + "fracSemMalha": 0.0032, "quadrantes": [ { "q": "0,0", - "x0": -23.5, - "z0": -39.5, - "areaAndavel": 147, - "props": 13, - "waypoints": 28, - "densProp": 8.87, - "densWp": 19.1, - "espacamento": 3.36, - "razaoProp": 1.48, - "razaoWp": 0.96 + "x0": -33.2, + "z0": -45.2, + "areaAndavel": 239, + "props": 1, + "waypoints": 23, + "densProp": 0.42, + "densWp": 9.63, + "espacamento": 15.46, + "razaoProp": 0.64, + "razaoWp": 1.11 }, { "q": "0,1", - "x0": -23.5, - "z0": -19.8, - "areaAndavel": 192, - "props": 6, - "waypoints": 47, - "densProp": 3.12, - "densWp": 24.46, - "espacamento": 5.66, - "razaoProp": 0.52, - "razaoWp": 1.24 + "x0": -33.2, + "z0": -22.6, + "areaAndavel": 257, + "props": 2, + "waypoints": 28, + "densProp": 0.78, + "densWp": 10.91, + "espacamento": 11.33, + "razaoProp": 1.19, + "razaoWp": 1.26 }, { "q": "0,2", - "x0": -23.5, + "x0": -33.2, "z0": 0, - "areaAndavel": 150, - "props": 15, - "waypoints": 32, - "densProp": 10.02, - "densWp": 21.37, - "espacamento": 3.16, - "razaoProp": 1.67, - "razaoWp": 1.08 + "areaAndavel": 239, + "props": 1, + "waypoints": 18, + "densProp": 0.42, + "densWp": 7.55, + "espacamento": 15.45, + "razaoProp": 0.64, + "razaoWp": 0.87 }, { "q": "0,3", - "x0": -23.5, - "z0": 19.8, - "areaAndavel": 191, - "props": 7, - "waypoints": 38, - "densProp": 3.66, - "densWp": 19.88, - "espacamento": 5.23, + "x0": -33.2, + "z0": 22.6, + "areaAndavel": 253, + "props": 1, + "waypoints": 27, + "densProp": 0.4, + "densWp": 10.68, + "espacamento": 15.9, "razaoProp": 0.61, - "razaoWp": 1 + "razaoWp": 1.23 }, { "q": "1,0", - "x0": -11.8, - "z0": -39.5, - "areaAndavel": 131, - "props": 19, - "waypoints": 34, - "densProp": 14.52, - "densWp": 25.98, - "espacamento": 2.62, - "razaoProp": 2.42, - "razaoWp": 1.31 + "x0": -16.6, + "z0": -45.2, + "areaAndavel": 347, + "props": 1, + "waypoints": 30, + "densProp": 0.29, + "densWp": 8.65, + "espacamento": 18.62, + "razaoProp": 0.44, + "razaoWp": 1 }, { "q": "1,1", - "x0": -11.8, - "z0": -19.8, - "areaAndavel": 207, - "props": 6, - "waypoints": 36, - "densProp": 2.9, - "densWp": 17.38, - "espacamento": 5.88, - "razaoProp": 0.48, - "razaoWp": 0.88 + "x0": -16.6, + "z0": -22.6, + "areaAndavel": 252, + "props": 7, + "waypoints": 22, + "densProp": 2.77, + "densWp": 8.72, + "espacamento": 6.01, + "razaoProp": 4.23, + "razaoWp": 1 }, { "q": "1,2", - "x0": -11.8, + "x0": -16.6, "z0": 0, - "areaAndavel": 158, - "props": 24, - "waypoints": 38, - "densProp": 15.23, - "densWp": 24.11, - "espacamento": 2.56, - "razaoProp": 2.54, - "razaoWp": 1.22 + "areaAndavel": 293, + "props": 5, + "waypoints": 24, + "densProp": 1.71, + "densWp": 8.2, + "espacamento": 7.65, + "razaoProp": 2.61, + "razaoWp": 0.94 }, { "q": "1,3", - "x0": -11.8, - "z0": 19.8, - "areaAndavel": 218, - "props": 5, - "waypoints": 35, - "densProp": 2.29, - "densWp": 16.04, - "espacamento": 6.61, - "razaoProp": 0.38, - "razaoWp": 0.81 + "x0": -16.6, + "z0": 22.6, + "areaAndavel": 309, + "props": 4, + "waypoints": 27, + "densProp": 1.3, + "densWp": 8.75, + "espacamento": 8.78, + "razaoProp": 1.98, + "razaoWp": 1.01 }, { "q": "2,0", "x0": 0, - "z0": -39.5, - "areaAndavel": 133, - "props": 20, - "waypoints": 36, - "densProp": 15.04, - "densWp": 27.07, - "espacamento": 2.58, - "razaoProp": 2.5, - "razaoWp": 1.37 + "z0": -45.2, + "areaAndavel": 355, + "props": 3, + "waypoints": 32, + "densProp": 0.84, + "densWp": 9.01, + "espacamento": 10.88, + "razaoProp": 1.28, + "razaoWp": 1.04 }, { "q": "2,1", "x0": 0, - "z0": -19.8, - "areaAndavel": 188, - "props": 12, - "waypoints": 40, - "densProp": 6.39, - "densWp": 21.3, - "espacamento": 3.96, - "razaoProp": 1.06, - "razaoWp": 1.08 + "z0": -22.6, + "areaAndavel": 286, + "props": 4, + "waypoints": 27, + "densProp": 1.4, + "densWp": 9.46, + "espacamento": 8.45, + "razaoProp": 2.14, + "razaoWp": 1.09 }, { "q": "2,2", "x0": 0, "z0": 0, - "areaAndavel": 184, - "props": 11, - "waypoints": 35, - "densProp": 5.98, - "densWp": 19.02, - "espacamento": 4.09, - "razaoProp": 1, - "razaoWp": 0.96 + "areaAndavel": 276, + "props": 7, + "waypoints": 22, + "densProp": 2.53, + "densWp": 7.96, + "espacamento": 6.28, + "razaoProp": 3.86, + "razaoWp": 0.92 }, { "q": "2,3", "x0": 0, - "z0": 19.8, - "areaAndavel": 191, - "props": 15, - "waypoints": 51, - "densProp": 7.84, - "densWp": 26.67, - "espacamento": 3.57, - "razaoProp": 1.31, - "razaoWp": 1.35 + "z0": 22.6, + "areaAndavel": 357, + "props": 2, + "waypoints": 32, + "densProp": 0.56, + "densWp": 8.96, + "espacamento": 13.36, + "razaoProp": 0.85, + "razaoWp": 1.03 }, { "q": "3,0", - "x0": 11.8, - "z0": -39.5, - "areaAndavel": 166, - "props": 10, - "waypoints": 30, - "densProp": 6.03, - "densWp": 18.1, - "espacamento": 4.07, - "razaoProp": 1, - "razaoWp": 0.91 + "x0": 16.6, + "z0": -45.2, + "areaAndavel": 249, + "props": 1, + "waypoints": 19, + "densProp": 0.4, + "densWp": 7.64, + "espacamento": 15.77, + "razaoProp": 0.61, + "razaoWp": 0.88 }, { "q": "3,1", - "x0": 11.8, - "z0": -19.8, - "areaAndavel": 185, - "props": 9, - "waypoints": 35, - "densProp": 4.86, - "densWp": 18.92, - "espacamento": 4.53, - "razaoProp": 0.81, + "x0": 16.6, + "z0": -22.6, + "areaAndavel": 241, + "props": 0, + "waypoints": 20, + "densProp": 0, + "densWp": 8.31, + "espacamento": 99, + "razaoProp": 0, "razaoWp": 0.96 }, { "q": "3,2", - "x0": 11.8, + "x0": 16.6, "z0": 0, - "areaAndavel": 177, - "props": 10, - "waypoints": 35, - "densProp": 5.64, - "densWp": 19.73, - "espacamento": 4.21, - "razaoProp": 0.94, - "razaoWp": 1 + "areaAndavel": 239, + "props": 1, + "waypoints": 16, + "densProp": 0.42, + "densWp": 6.7, + "espacamento": 15.46, + "razaoProp": 0.64, + "razaoWp": 0.77 }, { "q": "3,3", - "x0": 11.8, - "z0": 19.8, - "areaAndavel": 189, - "props": 9, - "waypoints": 34, - "densProp": 4.77, - "densWp": 18, - "espacamento": 4.58, - "razaoProp": 0.79, - "razaoWp": 0.91 + "x0": 16.6, + "z0": 22.6, + "areaAndavel": 268, + "props": 2, + "waypoints": 21, + "densProp": 0.75, + "densWp": 7.85, + "espacamento": 11.57, + "razaoProp": 1.15, + "razaoWp": 0.9 } ], - "medianaProp": 6.005000000000001, - "medianaWp": 19.805, - "piorRazaoProp": 0.38, - "piorRazaoWp": 0.81, - "piorEspacamento": 6.61, + "medianaProp": 0.655, + "medianaWp": 8.685, + "piorRazaoProp": 0, + "piorRazaoWp": 0.77, + "piorEspacamento": 99, "bordasSemGuarda": [], "rotasSpawnBandeira": [ { "time": "E", - "bandeira": "R", - "rotas": 2, - "comprimentos": [ - 37.3, - 55.2 - ] - }, - { - "time": "E", - "bandeira": "C", - "rotas": 2, + "bandeira": "E", + "rotas": 4, "comprimentos": [ - 84.4, - 87.2 + 8.2, + 8.2, + 8.2, + 8.2 ] }, { "time": "E", - "bandeira": "P", - "rotas": 3, + "bandeira": "MID", + "rotas": 4, "comprimentos": [ - 44.2, - 52.8, - 111.9 + 49.8, + 52.6, + 71.9, + 108.7 ] }, { "time": "E", "bandeira": "B", - "rotas": 4, - "comprimentos": [ - 19.3, - 19.3, - 19.3, - 19.3 - ] - }, - { - "time": "B", - "bandeira": "R", - "rotas": 4, + "rotas": 3, "comprimentos": [ - 15.3, - 15.3, - 15.3, - 15.3 + 90, + 95.7, + 103.6 ] }, { "time": "B", - "bandeira": "C", + "bandeira": "E", "rotas": 2, "comprimentos": [ - 56.3, - 96.5 + 88.9, + 95.7 ] }, { "time": "B", - "bandeira": "P", - "rotas": 2, + "bandeira": "MID", + "rotas": 4, "comprimentos": [ - 56.2, - 71.9 + 46.4, + 54.1, + 71.6, + 80.1 ] }, { "time": "B", "bandeira": "B", - "rotas": 2, + "rotas": 4, "comprimentos": [ - 29.2, - 65.4 + 3.4, + 3.4, + 3.4, + 3.4 ] } ], "piorRotas": 2, "bandeiras": [ { - "id": "R", - "label": "OESTE", - "x": -13.65, - "z": -15, - "distSpawn": 12.41, + "id": "E", + "label": "SALOON", + "x": -12, + "z": -34, + "distSpawn": 7, + "timeSpawn": "E", + "maiorLinhaTiro": 85.4, + "chao": 0, + "penetracao": 0 + }, + { + "id": "MID", + "label": "RUA PRINCIPAL", + "x": 0, + "z": 0, + "distSpawn": 41.19, + "timeSpawn": "E", + "maiorLinhaTiro": 49.4, + "chao": 0, + "penetracao": 0 + }, + { + "id": "B", + "label": "ESTÁBULO", + "x": 12, + "z": 34, + "distSpawn": 7, "timeSpawn": "B", - "maiorLinhaTiro": 64.6, + "maiorLinhaTiro": 83.3, "chao": 0, - "penetracao": 0.01 + "penetracao": 1.08 + } + ], + "alturaTrianguloMin": 0 + }, + { + "map": "penitenciaria", + "celulasAlcancadas": 99250, + "amostrasChao": 6079, + "observadores": 1530, + "corpoDentroDeSolido": 14, + "submersosAcimaDoPeito": 0, + "piorPenetracao": 1.02, + "piores": [ + { + "tipo": "chao", + "x": -15.1, + "z": -2.1, + "pen": 1.02 + }, + { + "tipo": "chao", + "x": -14.1, + "z": -2.1, + "pen": 1.02 + }, + { + "tipo": "chao", + "x": -13.1, + "z": -2.1, + "pen": 1.02 + }, + { + "tipo": "chao", + "x": -13.1, + "z": -1.1, + "pen": 1.02 + }, + { + "tipo": "chao", + "x": -4.1, + "z": -13.1, + "pen": 1.02 + }, + { + "tipo": "chao", + "x": -3.1, + "z": -13.1, + "pen": 1.02 + }, + { + "tipo": "chao", + "x": -2.1, + "z": -13.1, + "pen": 1.02 + }, + { + "tipo": "chao", + "x": 2.9, + "z": -7.1, + "pen": 1.02 + } + ], + "dentroTodos": [ + { + "tipo": "chao", + "x": -15.1, + "z": -2.1, + "pen": 1.02 + }, + { + "tipo": "chao", + "x": -14.1, + "z": -2.1, + "pen": 1.02 + }, + { + "tipo": "chao", + "x": -13.1, + "z": -2.1, + "pen": 1.02 + }, + { + "tipo": "chao", + "x": -13.1, + "z": -1.1, + "pen": 1.02 + }, + { + "tipo": "chao", + "x": -4.1, + "z": -13.1, + "pen": 1.02 + }, + { + "tipo": "chao", + "x": -3.1, + "z": -13.1, + "pen": 1.02 + }, + { + "tipo": "chao", + "x": -2.1, + "z": -13.1, + "pen": 1.02 + }, + { + "tipo": "chao", + "x": 2.9, + "z": -7.1, + "pen": 1.02 }, { - "id": "C", - "label": "PONTE C", - "x": -4, - "z": 8, - "distSpawn": 18.38, - "timeSpawn": "B", - "maiorLinhaTiro": 48.2, - "chao": 0, - "penetracao": 0 + "tipo": "chao", + "x": 2.9, + "z": -6.1, + "pen": 1.02 }, { - "id": "P", - "label": "LESTE", - "x": 13.65, - "z": 15, - "distSpawn": 7.35, - "timeSpawn": "E", - "maiorLinhaTiro": 53.6, - "chao": 0, - "penetracao": 0 + "tipo": "chao", + "x": 2.9, + "z": -5.1, + "pen": 1.02 }, { - "id": "B", - "label": "PONTE N", - "x": 4, - "z": -22, - "distSpawn": 17.26, - "timeSpawn": "E", - "maiorLinhaTiro": 61.2, - "chao": 0.15, - "penetracao": 0.067 + "tipo": "chao", + "x": -19.1, + "z": -16.1, + "pen": 0.575 + }, + { + "tipo": "chao", + "x": 3.9, + "z": 22.9, + "pen": 0.575 + }, + { + "tipo": "chao", + "x": -7.1, + "z": -2.1, + "pen": 0.32 + }, + { + "tipo": "chao", + "x": -1.1, + "z": -2.1, + "pen": 0.32 } ], - "alturaTrianguloMin": 8.34 - }, - { - "map": "mansao", - "celulasAlcancadas": 40304, - "amostrasChao": 2407, - "observadores": 598, - "corpoDentroDeSolido": 0, - "submersosAcimaDoPeito": 0, - "piorPenetracao": 0, - "piores": [], - "dentroTodos": [], "spawns": [ { "team": "E", - "x": -4.5, - "z": 32, + "x": -15, + "z": -42, "chao": 0, "penetracao": 0 }, { "team": "E", - "x": -1.5, - "z": 32, + "x": -5, + "z": -42, "chao": 0, "penetracao": 0 }, { "team": "E", - "x": 1.5, - "z": 32, + "x": 5, + "z": -42, "chao": 0, "penetracao": 0 }, { "team": "E", - "x": 4.5, - "z": 32, + "x": 15, + "z": -42, "chao": 0, "penetracao": 0 }, { "team": "B", - "x": -4.5, - "z": -22, + "x": 15, + "z": 42, "chao": 0, - "penetracao": 0.03 + "penetracao": 0 }, { "team": "B", - "x": -1.5, - "z": -22, + "x": 5, + "z": 42, "chao": 0, - "penetracao": 0.03 + "penetracao": 0 }, { "team": "B", - "x": 1.5, - "z": -22, + "x": -5, + "z": 42, "chao": 0, - "penetracao": 0.03 + "penetracao": 0 }, { "team": "B", - "x": 4.5, - "z": -22, + "x": -15, + "z": 42, "chao": 0, - "penetracao": 0.03 + "penetracao": 0 } ], "exposicaoPorTime": [ @@ -2692,522 +10397,459 @@ "team": "E", "chaoMin": 0, "chaoMax": 0, - "fracMedia": 0.112, - "maiorVisada": 66.6 + "fracMedia": 0.7932, + "maiorVisada": 97.4 }, { "team": "B", "chaoMin": 0, "chaoMax": 0, - "fracMedia": 0.1093, - "maiorVisada": 58.2 + "fracMedia": 0.7614, + "maiorVisada": 98.5 } ], "exposicaoPorSpawn": [ { "team": "E", - "x": -4.5, - "z": 32, + "x": -15, + "z": -42, "chao": 0, - "obsLonge": 391, - "obsVendo": 83, - "frac": 0.2123, - "maiorVisada": 66.1 + "obsLonge": 1259, + "obsVendo": 1005, + "frac": 0.7983, + "maiorVisada": 97.4 }, { "team": "E", - "x": -1.5, - "z": 32, + "x": -5, + "z": -42, "chao": 0, - "obsLonge": 381, - "obsVendo": 6, - "frac": 0.0157, - "maiorVisada": 29.6 + "obsLonge": 1237, + "obsVendo": 977, + "frac": 0.7898, + "maiorVisada": 93.3 }, { "team": "E", - "x": 1.5, - "z": 32, + "x": 5, + "z": -42, "chao": 0, - "obsLonge": 379, - "obsVendo": 42, - "frac": 0.1108, - "maiorVisada": 43 + "obsLonge": 1243, + "obsVendo": 978, + "frac": 0.7868, + "maiorVisada": 93.4 }, { "team": "E", - "x": 4.5, - "z": 32, + "x": 15, + "z": -42, "chao": 0, - "obsLonge": 385, - "obsVendo": 42, - "frac": 0.1091, - "maiorVisada": 66.6 + "obsLonge": 1267, + "obsVendo": 1011, + "frac": 0.7979, + "maiorVisada": 97.4 }, { "team": "B", - "x": -4.5, - "z": -22, + "x": 15, + "z": 42, "chao": 0, - "obsLonge": 324, - "obsVendo": 49, - "frac": 0.1512, - "maiorVisada": 57.6 + "obsLonge": 1258, + "obsVendo": 984, + "frac": 0.7822, + "maiorVisada": 97.6 }, { "team": "B", - "x": -1.5, - "z": -22, + "x": 5, + "z": 42, "chao": 0, - "obsLonge": 307, - "obsVendo": 46, - "frac": 0.1498, - "maiorVisada": 56.6 + "obsLonge": 1239, + "obsVendo": 951, + "frac": 0.7676, + "maiorVisada": 93.5 }, { "team": "B", - "x": 1.5, - "z": -22, + "x": -5, + "z": 42, "chao": 0, - "obsLonge": 308, - "obsVendo": 28, - "frac": 0.0909, - "maiorVisada": 56.5 + "obsLonge": 1238, + "obsVendo": 956, + "frac": 0.7722, + "maiorVisada": 93.5 }, { "team": "B", - "x": 4.5, - "z": -22, + "x": -15, + "z": 42, "chao": 0, - "obsLonge": 308, - "obsVendo": 14, - "frac": 0.0455, - "maiorVisada": 58.2 + "obsLonge": 1259, + "obsVendo": 911, + "frac": 0.7236, + "maiorVisada": 98.5 } ], "salaDoSpawn": [ { "team": "E", - "x": -4.5, - "z": 32, - "folgaParede": 1.8, - "dirPior": 79, - "areaContigua": 44.8, + "x": -15, + "z": -42, + "folgaParede": 5.55, + "dirPior": 264, + "areaContigua": 78.3, "okFolga": true, "okArea": true }, { "team": "E", - "x": -1.5, - "z": 32, - "folgaParede": 1.9, - "dirPior": 79, - "areaContigua": 48.8, + "x": -5, + "z": -42, + "folgaParede": 5.55, + "dirPior": 264, + "areaContigua": 78.3, "okFolga": true, "okArea": true }, { "team": "E", - "x": 1.5, - "z": 32, - "folgaParede": 0.8, - "dirPior": 34, - "areaContigua": 45.6, - "okFolga": false, + "x": 5, + "z": -42, + "folgaParede": 5.55, + "dirPior": 264, + "areaContigua": 78.3, + "okFolga": true, "okArea": true }, { "team": "E", - "x": 4.5, - "z": 32, - "folgaParede": 1.75, - "dirPior": 309, - "areaContigua": 46.4, + "x": 15, + "z": -42, + "folgaParede": 5.55, + "dirPior": 264, + "areaContigua": 78.3, "okFolga": true, "okArea": true }, { "team": "B", - "x": -4.5, - "z": -22, - "folgaParede": 3.95, - "dirPior": 23, - "areaContigua": 76.1, + "x": 15, + "z": 42, + "folgaParede": 5.55, + "dirPior": 84, + "areaContigua": 78.4, "okFolga": true, "okArea": true }, { "team": "B", - "x": -1.5, - "z": -22, - "folgaParede": 1.65, - "dirPior": 68, - "areaContigua": 73.8, + "x": 5, + "z": 42, + "folgaParede": 5.55, + "dirPior": 84, + "areaContigua": 78.4, "okFolga": true, "okArea": true }, { "team": "B", - "x": 1.5, - "z": -22, - "folgaParede": 1.65, - "dirPior": 113, - "areaContigua": 73.8, + "x": -5, + "z": 42, + "folgaParede": 5.55, + "dirPior": 84, + "areaContigua": 78.4, "okFolga": true, "okArea": true }, { "team": "B", - "x": 4.5, - "z": -22, + "x": -15, + "z": 42, "folgaParede": 3.95, - "dirPior": 158, - "areaContigua": 76.1, + "dirPior": 276, + "areaContigua": 73, "okFolga": true, "okArea": true } ], - "piorFolga": 0.8, - "piorArea": 44.8, - "escadas": [ - { - "nome": "escada do mezanino", - "x0": -4.25, - "x1": -1.75, - "z0": -14.91, - "z1": -7.34, - "degraus": 25, - "espelhoMed": 0.1792, - "espelhoMin": 0.16, - "espelhoMax": 0.18, - "pisoMed": 0.29, - "larguraMedida": 2.45, - "subida": 4.48, - "corrida": 6.98, - "inclinacaoGraus": 32.69, - "blondel": 0.648, - "desvioChaoDegrau": 0.02, - "okEspelho": true, - "okPiso": true, - "okBlondel": true, - "okLargura": true, - "okInclinacao": true, - "okDesvio": true - }, - { - "nome": "escada de serviço", - "x0": 12.25, - "x1": 14.75, - "z0": -14.91, - "z1": -7.34, - "degraus": 25, - "espelhoMed": 0.1792, - "espelhoMin": 0.16, - "espelhoMax": 0.18, - "pisoMed": 0.29, - "larguraMedida": 2.5, - "subida": 4.48, - "corrida": 6.98, - "inclinacaoGraus": 32.69, - "blondel": 0.648, - "desvioChaoDegrau": 0.02, - "okEspelho": true, - "okPiso": true, - "okBlondel": true, - "okLargura": true, - "okInclinacao": true, - "okDesvio": true - } - ], + "piorFolga": 3.95, + "piorArea": 73, + "escadas": [], "travessia": [], "occluderSemMalha": [], - "occMedidos": 323, - "occPulados": 0, - "fracSemMalha": 0.0012, + "occMedidos": 77, + "occPulados": 1, + "fracSemMalha": 0.0014, "quadrantes": [ { "q": "0,0", - "x0": -21.5, - "z0": -35.5, - "areaAndavel": 154, - "props": 6, - "waypoints": 24, - "densProp": 3.89, - "densWp": 15.55, - "espacamento": 5.07, - "razaoProp": 0.89, - "razaoWp": 1 + "x0": -37.1, + "z0": -47.1, + "areaAndavel": 372, + "props": 12, + "waypoints": 38, + "densProp": 3.23, + "densWp": 10.22, + "espacamento": 5.57, + "razaoProp": 1.67, + "razaoWp": 1.06 }, { "q": "0,1", - "x0": -21.5, - "z0": -17.8, - "areaAndavel": 147, - "props": 6, - "waypoints": 24, - "densProp": 4.08, - "densWp": 16.31, - "espacamento": 4.95, - "razaoProp": 0.93, - "razaoWp": 1.05 + "x0": -37.1, + "z0": -23.6, + "areaAndavel": 363, + "props": 7, + "waypoints": 39, + "densProp": 1.93, + "densWp": 10.73, + "espacamento": 7.2, + "razaoProp": 1, + "razaoWp": 1.12 }, { "q": "0,2", - "x0": -21.5, + "x0": -37.1, "z0": 0, - "areaAndavel": 165, - "props": 4, - "waypoints": 19, - "densProp": 2.42, - "densWp": 11.49, - "espacamento": 6.43, - "razaoProp": 0.55, - "razaoWp": 0.74 + "areaAndavel": 362, + "props": 7, + "waypoints": 42, + "densProp": 1.93, + "densWp": 11.59, + "espacamento": 7.19, + "razaoProp": 1, + "razaoWp": 1.2 }, { "q": "0,3", - "x0": -21.5, - "z0": 17.8, - "areaAndavel": 155, - "props": 6, - "waypoints": 24, - "densProp": 3.88, - "densWp": 15.5, - "espacamento": 5.08, - "razaoProp": 0.89, - "razaoWp": 1 + "x0": -37.1, + "z0": 23.6, + "areaAndavel": 371, + "props": 13, + "waypoints": 38, + "densProp": 3.5, + "densWp": 10.23, + "espacamento": 5.34, + "razaoProp": 1.81, + "razaoWp": 1.06 }, { "q": "1,0", - "x0": -10.8, - "z0": -35.5, - "areaAndavel": 172, - "props": 5, - "waypoints": 23, - "densProp": 2.91, - "densWp": 13.4, - "espacamento": 5.86, - "razaoProp": 0.66, - "razaoWp": 0.86 + "x0": -18.6, + "z0": -47.1, + "areaAndavel": 424, + "props": 1, + "waypoints": 47, + "densProp": 0.24, + "densWp": 11.08, + "espacamento": 20.6, + "razaoProp": 0.12, + "razaoWp": 1.15 }, { "q": "1,1", - "x0": -10.8, - "z0": -17.8, - "areaAndavel": 161, - "props": 25, - "waypoints": 38, - "densProp": 15.57, - "densWp": 23.67, - "espacamento": 2.53, - "razaoProp": 3.55, - "razaoWp": 1.52 + "x0": -18.6, + "z0": -23.6, + "areaAndavel": 412, + "props": 2, + "waypoints": 36, + "densProp": 0.49, + "densWp": 8.74, + "espacamento": 14.35, + "razaoProp": 0.25, + "razaoWp": 0.91 }, { "q": "1,2", - "x0": -10.8, + "x0": -18.6, "z0": 0, - "areaAndavel": 147, - "props": 9, - "waypoints": 19, - "densProp": 6.14, - "densWp": 12.95, - "espacamento": 4.04, - "razaoProp": 1.4, - "razaoWp": 0.83 + "areaAndavel": 400, + "props": 4, + "waypoints": 40, + "densProp": 1, + "densWp": 10, + "espacamento": 10, + "razaoProp": 0.52, + "razaoWp": 1.04 }, { "q": "1,3", - "x0": -10.8, - "z0": 17.8, - "areaAndavel": 138, - "props": 8, - "waypoints": 24, - "densProp": 5.79, - "densWp": 17.38, - "espacamento": 4.15, - "razaoProp": 1.32, - "razaoWp": 1.12 + "x0": -18.6, + "z0": 23.6, + "areaAndavel": 418, + "props": 6, + "waypoints": 40, + "densProp": 1.44, + "densWp": 9.57, + "espacamento": 8.35, + "razaoProp": 0.75, + "razaoWp": 0.99 }, { "q": "2,0", "x0": 0, - "z0": -35.5, - "areaAndavel": 171, - "props": 8, - "waypoints": 43, - "densProp": 4.68, - "densWp": 25.14, - "espacamento": 4.62, - "razaoProp": 1.07, - "razaoWp": 1.62 + "z0": -47.1, + "areaAndavel": 409, + "props": 1, + "waypoints": 44, + "densProp": 0.24, + "densWp": 10.76, + "espacamento": 20.22, + "razaoProp": 0.12, + "razaoWp": 1.12 }, { "q": "2,1", "x0": 0, - "z0": -17.8, - "areaAndavel": 167, - "props": 8, - "waypoints": 33, - "densProp": 4.8, - "densWp": 19.78, - "espacamento": 4.57, - "razaoProp": 1.1, - "razaoWp": 1.27 + "z0": -23.6, + "areaAndavel": 398, + "props": 5, + "waypoints": 37, + "densProp": 1.26, + "densWp": 9.3, + "espacamento": 8.92, + "razaoProp": 0.65, + "razaoWp": 0.97 }, { "q": "2,2", "x0": 0, "z0": 0, - "areaAndavel": 138, - "props": 8, - "waypoints": 20, - "densProp": 5.79, - "densWp": 14.47, - "espacamento": 4.16, - "razaoProp": 1.32, + "areaAndavel": 390, + "props": 9, + "waypoints": 35, + "densProp": 2.31, + "densWp": 8.98, + "espacamento": 6.58, + "razaoProp": 1.2, "razaoWp": 0.93 }, { "q": "2,3", "x0": 0, - "z0": 17.8, - "areaAndavel": 162, - "props": 10, - "waypoints": 30, - "densProp": 6.18, - "densWp": 18.55, - "espacamento": 4.02, - "razaoProp": 1.41, - "razaoWp": 1.19 + "z0": 23.6, + "areaAndavel": 424, + "props": 1, + "waypoints": 41, + "densProp": 0.24, + "densWp": 9.67, + "espacamento": 20.6, + "razaoProp": 0.12, + "razaoWp": 1.01 }, { "q": "3,0", - "x0": 10.8, - "z0": -35.5, - "areaAndavel": 164, - "props": 5, - "waypoints": 19, - "densProp": 3.06, - "densWp": 11.61, - "espacamento": 5.72, - "razaoProp": 0.7, - "razaoWp": 0.75 + "x0": 18.6, + "z0": -47.1, + "areaAndavel": 369, + "props": 11, + "waypoints": 26, + "densProp": 2.98, + "densWp": 7.05, + "espacamento": 5.79, + "razaoProp": 1.54, + "razaoWp": 0.73 }, { "q": "3,1", - "x0": 10.8, - "z0": -17.8, - "areaAndavel": 147, - "props": 23, - "waypoints": 36, - "densProp": 15.68, - "densWp": 24.54, - "espacamento": 2.53, - "razaoProp": 3.58, - "razaoWp": 1.58 + "x0": 18.6, + "z0": -23.6, + "areaAndavel": 356, + "props": 8, + "waypoints": 25, + "densProp": 2.25, + "densWp": 7.02, + "espacamento": 6.67, + "razaoProp": 1.17, + "razaoWp": 0.73 }, { "q": "3,2", - "x0": 10.8, + "x0": 18.6, "z0": 0, - "areaAndavel": 164, - "props": 5, - "waypoints": 14, - "densProp": 3.04, - "densWp": 8.52, - "espacamento": 5.73, - "razaoProp": 0.69, - "razaoWp": 0.55 + "areaAndavel": 363, + "props": 7, + "waypoints": 28, + "densProp": 1.93, + "densWp": 7.72, + "espacamento": 7.2, + "razaoProp": 1, + "razaoWp": 0.8 }, { "q": "3,3", - "x0": 10.8, - "z0": 17.8, - "areaAndavel": 168, - "props": 5, - "waypoints": 21, - "densProp": 2.97, - "densWp": 12.49, - "espacamento": 5.8, - "razaoProp": 0.68, - "razaoWp": 0.8 + "x0": 18.6, + "z0": 23.6, + "areaAndavel": 371, + "props": 12, + "waypoints": 28, + "densProp": 3.23, + "densWp": 7.54, + "espacamento": 5.56, + "razaoProp": 1.67, + "razaoWp": 0.78 } ], - "medianaProp": 4.38, - "medianaWp": 15.525, - "piorRazaoProp": 0.55, - "piorRazaoWp": 0.55, - "piorEspacamento": 6.43, + "medianaProp": 1.93, + "medianaWp": 9.620000000000001, + "piorRazaoProp": 0.12, + "piorRazaoWp": 0.73, + "piorEspacamento": 20.6, "bordasSemGuarda": [], "rotasSpawnBandeira": [ - { - "time": "E", - "bandeira": "R", - "rotas": 4, - "comprimentos": [ - 16.2, - 16.2, - 16.2, - 16.2 - ] - }, { "time": "E", "bandeira": "E", - "rotas": 3, + "rotas": 4, "comprimentos": [ - 39.2, - 50.9, - 56.6 + 14.1, + 14.1, + 14.1, + 14.1 ] }, { "time": "E", - "bandeira": "P", - "rotas": 3, + "bandeira": "MID", + "rotas": 4, "comprimentos": [ - 66.4, - 77.9, - 116.6 + 46.9, + 49.6, + 58.6, + 60.5 ] }, { "time": "E", "bandeira": "B", - "rotas": 2, - "comprimentos": [ - 66.1, - 70.7 - ] - }, - { - "time": "B", - "bandeira": "R", - "rotas": 2, + "rotas": 4, "comprimentos": [ - 56.1, - 71.6 + 88.5, + 96.5, + 96.5, + 113.8 ] }, { "time": "B", "bandeira": "E", - "rotas": 2, + "rotas": 4, "comprimentos": [ - 27.9, - 39.3 + 89.8, + 95.1, + 95.1, + 112.5 ] }, { "time": "B", - "bandeira": "P", + "bandeira": "MID", "rotas": 4, "comprimentos": [ - 39.4, - 39.4, - 39.4, - 39.4 + 51.4, + 54.1, + 65, + 70.6 ] }, { @@ -3215,61 +10857,50 @@ "bandeira": "B", "rotas": 4, "comprimentos": [ - 7.7, - 7.7, - 7.7, - 7.7 + 17.3, + 17.3, + 17.3, + 17.3 ] } ], - "piorRotas": 2, + "piorRotas": 4, "bandeiras": [ { - "id": "R", - "label": "JARDIM", - "x": 10, - "z": 28, - "distSpawn": 6.8, + "id": "E", + "label": "ALA SUL", + "x": 0, + "z": -39, + "distSpawn": 5.83, "timeSpawn": "E", - "maiorLinhaTiro": 43.2, + "maiorLinhaTiro": 88.2, "chao": 0, "penetracao": 0 }, { - "id": "E", - "label": "SALA", - "x": -10, - "z": 2, - "distSpawn": 24.62, - "timeSpawn": "B", - "maiorLinhaTiro": 44.6, + "id": "MID", + "label": "PÁTIO", + "x": 0, + "z": 0, + "distSpawn": 42.3, + "timeSpawn": "E", + "maiorLinhaTiro": 55.9, "chao": 0, - "penetracao": 0.02 - }, - { - "id": "P", - "label": "MEZZO", - "x": 8, - "z": -11, - "distSpawn": 11.54, - "timeSpawn": "B", - "maiorLinhaTiro": 19.7, - "chao": 4.5, - "penetracao": 0.12 + "penetracao": 0.018 }, { "id": "B", - "label": "PISCINA", - "x": -10, - "z": -25, - "distSpawn": 6.26, + "label": "ALA NORTE", + "x": 0, + "z": 39, + "distSpawn": 5.83, "timeSpawn": "B", - "maiorLinhaTiro": 52.2, + "maiorLinhaTiro": 88.4, "chao": 0, - "penetracao": 1.238 + "penetracao": 0 } ], - "alturaTrianguloMin": 9.53 + "alturaTrianguloMin": 0 } ] } \ No newline at end of file diff --git a/tools/eval/rotas-separadas.mjs b/tools/eval/rotas-separadas.mjs new file mode 100644 index 00000000..77503923 --- /dev/null +++ b/tools/eval/rotas-separadas.mjs @@ -0,0 +1,61 @@ +/* Limiar e enumerador de ROTAS SEPARADAS, compartilhados entre a CTF2 (map-check.mjs, todos + os mapas) e a LV1/LV2 (lajes-vertical-check.mjs, só o lajes). + + Existe por causa da lição 2 de docs/LICOES.md: duas réguas que medem o mesmo conceito com + limiar próprio viram o instrumento discordando de si. A CTF2 conta QUANTAS rotas separadas + existem; a LV1/LV2 pergunta COMO ELAS CORREM (térreo × laje). Se cada uma apagasse a faixa + da rota com um raio diferente, elas contariam conjuntos de rotas diferentes e a segunda + poderia jurar "tem rota térrea" sobre uma rota que a primeira nem enxerga. */ + +export const SEP_ROTA = 6.0; // m de afastamento pra duas rotas contarem como rotas diferentes +/* Um passo do grafo de navegação (3,4 m) além da faixa: as últimas dezenas de metros até a + bandeira e os primeiros saindo do respawn são obrigatoriamente COMPARTILHADOS. Ver o + comentário longo da CTF2 em map-check.mjs. */ +export const RAIO_PONTA = SEP_ROTA + 3.4; +export const MAX_ROTAS = 4; + +/* Dijkstra com nós PROIBIDOS (o findPath do mapa não aceita bloqueio). */ +export function caminhoBloqueado(nodes, adj, from, to, bloq) { + const n = nodes.length; + if (bloq[from] || bloq[to]) return null; + const dist = new Float64Array(n).fill(Infinity), prev = new Int32Array(n).fill(-1); + const vis = new Uint8Array(n); + dist[from] = 0; + for (;;) { + let cur = -1, best = Infinity; + for (let i = 0; i < n; i++) if (!vis[i] && dist[i] < best) { best = dist[i]; cur = i; } + if (cur === -1 || cur === to) break; + vis[cur] = 1; + for (const m of adj[cur]) { + if (bloq[m]) continue; + const d = dist[cur] + Math.hypot(nodes[cur].x - nodes[m].x, nodes[cur].z - nodes[m].z); + if (d < dist[m]) { dist[m] = d; prev[m] = cur; } + } + } + if (!Number.isFinite(dist[to])) return null; + const path = [to]; + for (let c = prev[to]; c !== -1; c = prev[c]) path.unshift(c); + return path; +} + +/* Enumera até MAX_ROTAS rotas separadas entre dois nós, apagando a faixa de cada rota achada + (poupando as vizinhanças das duas pontas). Devolve os caminhos como listas de índices. */ +export function rotasSeparadas(nodes, adj, from, to) { + const bloq = new Uint8Array(nodes.length); + const achadas = []; + for (let k = 0; k < MAX_ROTAS; k++) { + const cam = caminhoBloqueado(nodes, adj, from, to, bloq); + if (!cam) break; + achadas.push(cam); + const pA = nodes[from], pB = nodes[to]; + for (let i = 0; i < nodes.length; i++) { + if (i === from || i === to || bloq[i]) continue; + if (Math.hypot(nodes[i].x - pA.x, nodes[i].z - pA.z) <= RAIO_PONTA) continue; + if (Math.hypot(nodes[i].x - pB.x, nodes[i].z - pB.z) <= RAIO_PONTA) continue; + for (const c of cam) { + if (Math.hypot(nodes[i].x - nodes[c].x, nodes[i].z - nodes[c].z) <= SEP_ROTA) { bloq[i] = 1; break; } + } + } + } + return achadas; +} diff --git a/tools/eval/vm_mint_audit.json b/tools/eval/vm_mint_audit.json index 8a69e222..5eddc448 100644 --- a/tools/eval/vm_mint_audit.json +++ b/tools/eval/vm_mint_audit.json @@ -1,5 +1,5 @@ { - "gerado": "2026-08-17T12:02:21.062Z", + "gerado": "2026-08-26T02:56:31.797Z", "lente": { "V0deg": 42, "halfTanH": 0.6824,