Skip to content

feat(mapas): fauna de verdade nos 12 mapas + céu fotográfico da piscina (BUG-57) - #370

Closed
rubenmarcus wants to merge 0 commit into
v2/arnes-grafite-servefrom
v2/fauna-todos-mapas
Closed

feat(mapas): fauna de verdade nos 12 mapas + céu fotográfico da piscina (BUG-57)#370
rubenmarcus wants to merge 0 commit into
v2/arnes-grafite-servefrom
v2/fauna-todos-mapas

Conversation

@rubenmarcus

Copy link
Copy Markdown
Member

Porte da frente de ambiência do branch /game — pedido literal do dono (17/08): "ele tem ambiência real, coisa que nenhum dos outros mapas tem — horizonte, animais, animações no céu; precisamos disso em todos os mapas". Empilhado no #369 (mergear na ordem).

O que

  • ambientlife.js + 4 GLB CC-BY 4.0/CC0 (rato, pombo-chão, pombo-voo, cão caramelo — fontes e licenças em public/models/ambient/FONTE.md, pipeline do /game), com fallback procedural — o mapa nunca nasce sem vida
  • Configs de fauna nos 12/12 mapas (mesmas coordenadas validadas no /game; UPA, 100% interno, só rato — pombo dentro de prédio fechado é ruído)
  • game.js: ambience.onShot no _fireHitscan (bicho foge de TODO tiro, de jogador e de bot), update no tick, dispose no teardown
  • main.js: preload no menu (o backdrop builda o mapa real — o caramelo passeia no menu) e na partida
  • Piscina (comunitária): céu fotográfico equiretangular via map_sky.js — o plano de cor chapada atrás dos vidros lia como parede infinita
  • Grafite regerado (5 mapas mudaram de hash)

Réguas (Lei 1/3: reprovavam antes, mutantes mordem)

Régua O que prova
eval:ambience (novo, no check:fast) AR1 todo mapa tem vida · AR2 população por bioma · AR3 nada nasce em sólido — `--mutante=sem-ambience
tools/eval/fauna-shots.mjs (browser) FS1 GLB carregado no jogo real (~34k tris de fauna vs 1,6k do fallback) · FS2 animação avança · FS3 tiro real pelo _fireHitscan muda estado pra flee/takeoff12/12

Custo de cena medido: 10–57k tris de fauna por mapa (orçamento do cena-tetos cabe).

BOT4 — dívida registrada com A/B, não regressão

O estimador do BOT4 é documentado como instável ante materiais novos (invariants.mjs: generateUUID consome o RNG semeado). A/B com as MESMAS sementes, sem fauna × com fauna:

sementes janela sem fauna janela com fauna
A (default) 3,808 s 2,986 s (falha)
B 3,899 s 4,641 s (passa)

O estimador cavalga o teto de 3,0s por variância de amostra (17–25 mortes), enquanto o bot fica menos letal em todos os eixos com fauna (taxaAcerto 0,028→0,022; mortes/min 0,695→0,472). Registrado no KNOWN-RED.json com a tabela; o conserto certo é o estimador (mediana/IC), não afrouxar o teto.

Não portado (follow-up registrado no KNOWN-BUGS)

horizon.js (aqui nenhum mapa é favela aberta), régua browser ambience-check.mjs completa do /game (depende de traçante), urubu/extras via Mint/Tripo.

  • check:fast: 53/54 (vermelho único changelog:check, pré-existente na main)
  • eval:invariants: 39/55, nenhuma falha nova

@vercel

vercel Bot commented Aug 18, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
csbrasil Ready Ready Preview Aug 19, 2026 12:46am

Request Review

@csbrasil-BOT csbrasil-BOT added needs-human-gameplay Mudança exige revisão humana de gameplay/render/HUD needs-staging Mudança precisa validação integrada em staging target:main PR apontando para a branch main labels Aug 18, 2026
@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

csbrasil-bot classification

Note

@rubenmarcus abriu 51 arquivo(s) · +10473 −1691, base v2/arnes-grafite-serve.

O que mudou

área arquivos + amostra
📚 docs 15 +220 −96 ARCH.generated.md, KNOWN-BUGS.md, README.md
🗺️ mapas 13 +219 −6 map_atacadao.js, map_brasilia.js, map_ferrovelho.js
🧪 arnês 13 +9607 −1584 ARCH.md, KNOWN-RED.json, README.md
🎨 assets 5 +0 −0 sky_pool.webp, dog_caramelo.glb, pigeon_flight.glb
🎮 jogo 4 +424 −4 ambientlife.js, game.js, graffiti_layout.js
📦 outros 1 +3 −1 package.json

Labels

label por quê
needs-human-gameplay toca gameplay/render/HUD/mapa/personagem — decisão de humano
needs-staging mudança de runtime/UI — valida integrado no staging antes do merge
target:main vai direto pra main, sem fila de integração

Ações do bot

@estraga-codigo

Copy link
Copy Markdown
Collaborator

Esbirro

Esbirro · plantão da produção · 🕵️

check vermelho parado neste PR

Caution

Não sei classificar este vermelho. Segue o que o CI cuspiu — palpite de bot sobre bug alheio só atrapalha.

o quê valor
head 45c0f709fa16
checks vermelhos 1
classe outra
hora do plantão 2026-08-18T23:38:27.640Z

Vermelho:

portao (https://github.com/corosolto/client/actions/runs/32195753130/job/95899291146)

Rabo do log:

2026-08-18T23:07:49.9171835Z       malha sem tinta:  Mesh×105
2026-08-18T23:08:21.7088675Z OK   loja_h         cobertura  56.2%  (meta 49%)  349/621 placas | 328 peças (0 murais) | 36 arquivos | altura 0.30–2.30 m (mediana 1.05)
2026-08-18T23:08:21.7090224Z       por faixa (altura · pintadas/placas · %):  1.6m 236/313 75.4%   3.2m 63/218 28.9%   5.0m 50/90 55.6%
2026-08-18T23:08:21.7091993Z       peladas (x,z · pintadas/placas):  -32,24 0/4   -8,32 0/6   -16,32 0/9   16,32 0/4   16,48 0/4   32,32 0/5   32,8 0/6   32,24 0/10   -40,56 2/7   8,48 2/7   -40,32 4/11   -16,56 5/13   -40,16 4/10   -40,24 4/10
2026-08-18T23:08:21.7093313Z       malha sem tinta:  havan-deco×179   Mesh[inst]×49   Mesh×44
2026-08-18T23:08:37.3886556Z BAIXO ferro_velho    cobertura  45.5%  (meta 46%)  695/1529 placas | 460 peças (0 murais) | 45 arquivos | altura 0.45–2.70 m (mediana 1.10)
2026-08-18T23:08:37.3889004Z       por faixa (altura · pintadas/placas · %):  1.6m 514/842 61%   3.2m 181/496 36.5%   5.0m 0/191 0%
2026-08-18T23:08:37.3891007Z       peladas (x,z · pintadas/placas):  -24,-24 0/12   -24,-8 0/34   -24,-16 0/33   -24,0 0/38   -24,8 0/33   -24,16 0/36   -24,24 0/32   -16,-16 0/30   -16,-8 0/24   -16,16 0/40   -16,24 0/41   -8,40 0/3   0,-8 0/15   0,8 0/3
2026-08-18T23:08:37.3893430Z       malha sem tinta:  Muro_de_carros_esmagados_1×543   Mesh×171   Mesh[inst]×97   Guindaste_com_eletroímã_1×20   Monte_de_carros_1×2   Prensa_de_carros_1×1
2026-08-18T23:08:55.8522572Z OK   quebrada       cobertura  70.4%  (meta 67%)  1083/1538 placas | 931 peças (5 murais) | 94 arquivos | altura 0.38–2.20 m (mediana 1.40)
2026-08-18T23:08:55.8524757Z       por faixa (altura · pintadas/placas · %):  1.6m 597/760 78.6%   3.2m 356/530 67.2%   5.0m 130/248 52.4%
2026-08-18T23:08:55.8527379Z       peladas (x,z · pintadas/placas):  8,-24 0/10   16,40 0/5   -16,32 4/17   -8,16 1/4   -8,-24 8/21   -16,-24 10/22   -16,-32 7/14   16,-8 24/48   -24,-16 16/31   -24,-8 13/25   16,-32 20/37   -16,-16 12/22   -16,0 25/44   -8,24 4/7
2026-08-18T23:08:55.8529642Z       malha sem tinta:  Mesh[inst]×339   Mesh×77   Weathered_Green_Dome_Tent_1×17   tripo_node_b802e5a9-b4f0-4363-a1ab-2f6ce333f5af×8   arquibancada_1×5   Arara_de_roupas_1×4   Kombi_1×3   Object_2×1
2026-08-18T23:08:55.9625052Z -> tools/eval/graffiti_census.json
2026-08-18T23:08:55.9625715Z
2026-08-18T23:08:55.9626306Z PORTÃO VERMELHO — 2 mapa(s) com parede pintada abaixo da meta:
2026-08-18T23:08:55.9626763Z   praca_poderes: cobertura 29.9% < meta 35%
2026-08-18T23:08:55.9627352Z   ferro_velho: cobertura 45.5% < meta 46%
2026-08-18T23:08:55.9833714Z ##[error]Process completed with exit code 1.


nada fora do normal no meu turno 🕵️

@estraga-codigo estraga-codigo left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Palhaço Mal

Palhaço Mal · revisor da casa · 🤡

mapa da mudança

  • docs (15): ARCH.generated.md, KNOWN-BUGS.md, README.md, STATUS.md
  • mapas (13): map_atacadao.js, map_brasilia.js, map_ferrovelho.js, map_havan.js
  • arnês (13): ARCH.md, KNOWN-RED.json, README.md, ambience-registry-check.mjs
  • assets (5): sky_pool.webp, dog_caramelo.glb, pigeon_flight.glb, pigeon_ground.glb
  • jogo (4): ambientlife.js, game.js, graffiti_layout.js, main.js
  • outros (1): package.json

Note

o que faz: Adiciona sistema de fauna ambiente (BUG-57): ambientlife.js com ratos, pombos e cães, reação a tiros, integração em game.js (3 hooks) e novo portão eval:ambience no check:fast

4 graves · 2 leves

Warning

Risco MÉDIO · nota 7.5/10 ▓▓▓▓▓▓▓▓░░
4 achado(s) grave(s) — resolve antes do merge.

Revisão de bot — fio não resolvido TRAVA o merge (a main exige conversa resolvida). Resolve ou refuta.

🔴 graves (4)

  • eval:ambience sem --mutante declarado no check:fastpackage.json:59 (ação: ci-portoes)
    O comentário do package.json:59-60 promete que --mutante=sem-ambience|fauna-em-solido prova que o portão morde, mas o script tools/eval/ambience-registry-check.mjs citado na linha 61 não aparece no diff. Sem o script real, o comentário é documento, não código que roda.

    mutação sugerida: Remover o comentário da linha 59-60 até que o script exista no repositório

  • script eval:ambience sem mutante no check:fastpackage.json:61 (ação: frontend-publico)
    O comentário diz '--mutante=sem-ambience|fauna-em-solido' prova que morde, mas o script não tem esse parâmetro no runner.mjs. O DONO disse que isso é o mais importante da régua.
    💡 conserto: Adicione --mutante=sem-ambience|fauna-em-solido ao tools/eval/ambience-registry-check.mjs ou remova o comentário.

    mutação sugerida: Rode npm run check:fast -- --mutante=sem-ambience para ver erro de 'argumento desconhecido'

  • assumir ambience.animals sem verificação de nullpublic/js/game.js (ação: leis-da-casa)
    game.js itera sobre world.ambience.animals (linha 5499) sem verificar se ambience existe. Só 3 de 12 mapas foram atualizados (atacadao, brasilia, ferrovelho) — qualquer mapa não atualizado que seja jogado vai lançar Cannot read properties of undefined (reading 'animals') na primeira chamada de update(). A documentação do diff mostra 12 mapas, mas só 3 foram editados.
    💡 conserto: Adicionar verificação nula antes do loop em game.js: if (world.ambience?.animals) { for (const a of world.ambience.animals) { ... } }
  •  for (const a of world.ambience.animals) {
    
  •  if (world.ambience?.animals) {
    
  •    for (const a of world.ambience.animals) {
    
  > mutação sugerida: `Remover `ambience` do return de um dos 3 mapas atualizados e carregar esse mapa em jogo — o update vai quebrar na primeira chamada.`
- **import de módulo que não existe no diff** — `public/js/map_atacadao.js:7` _(ação: mapas)_
  Todos os mapas importam './ambientlife.js' mas o arquivo não está no diff. Isso causa SyntaxError/ModuleNotFoundError em runtime quando qualquer mapa com fauna é carregado, quebrando TODO o sistema de BUG-57.
  💡 **conserto:** Adicione o arquivo public/js/ambientlife.js ao diff com as exportações createFavelaAmbience e preloadAmbientLife, conforme importado nos mapas.
  > mutação sugerida: `Remover a linha 'import { createFavelaAmbience } from './ambientlife.js';' de qualquer mapa prova que o import falha.`

### 🟡 leves (2)

- **fallbackRat não usa o parâmetro index** — `public/js/ambientlife.js:117` _(ação: ci-portoes)_
  A função `fallbackRat(index)` recebe `index` como parâmetro e o usa para alternar cores de pelagem (linha 117), mas isso não afeta o fallback procedural de cães ou pombos que não têm variação. O parâmetro é inconsistente.
  💡 **conserto:** Adicionar variação de cor ou tamanho baseada no index para fallbackDog e fallbackPigeon, ou remover o parâmetro se não for necessário para consistência.
- **normalizeModel assumes que o modelo tem animação se for skinned** — `public/js/ambientlife.js:172` _(ação: ci-portoes)_
  A linha 172 verifica `template.skinned` para decidir se usa `skeletonClone`, mas não há fallback se o template não tiver animação definida em `clips`. Isso pode causar erro se um GLB esqueleto vier sem animações.
  💡 **conserto:** Adicionar verificação `if (!template.clips || template.clips.length === 0) template.skinned = false` antes da linha 172.
  > mutação sugerida: `Testar com GLB skinned sem animação definida`

### impacto cruzado

```mermaid
graph RL
  main_js["main.js"] --> game_js["game.js"]
  graffiti_pass_js["graffiti_pass.js"] --> graffiti_layout_js["graffiti_layout.js"]
  maps_js["maps.js"] --> map_atacadao_js["map_atacadao.js"]
  maps_js["maps.js"] --> map_brasilia_js["map_brasilia.js"]
  site_bg_js["site-bg.js"] --> map_brasilia_js["map_brasilia.js"]
  maps_js["maps.js"] --> map_ferrovelho_js["map_ferrovelho.js"]
  main_js["main.js"] --> map_havan_js["map_havan.js"]
  maps_js["maps.js"] --> map_havan_js["map_havan.js"]
  • main.js importa ambientlife.js
  • game.js chama world.ambience.onShot/update/dispose
  • main.js (preloader)
  • game.js (update/dispose)
  • maps.js (consome os objetos de retorno de todos os mapas — precisa do campo ambience)
  • main.js (main.js ← game.js)

(grafo local de public/js, uma rodada atrás do head do PR.)


Resolve ou refuta nos fios — refutado com razão, eu caio fora.

maquiagem de verde por cima de vermelho eu desenmascaro no primeiro golpe de vista 🤡

Comment thread package.json Outdated
@@ -58,6 +58,8 @@
"eval:faccao": "node tools/eval/faccao-paleta-check.mjs",
"//eval:mapid": "Id de mapa é NOSSO, e id antigo não morre calado. Os ids eram herança do CS 1.6 (awp_map e fy_pool_day são nomes literais de lá; fy_ é convenção de lá) enquanto os nomes exibidos já eram brasileiros — só o id carregava o CS, e id VAZA: vai gravado no banco (match.ts manda p_map em toda partida) e viaja em link (?map=fy_quebrada). Como resolveMapId devolve o mapa padrão para id desconhecido, link antigo não daria erro: abriria a Praça no lugar da Quebrada, calado — a mesma falha silenciosa do rename Time E, que apagou a bandeira sem uma linha no console. M1 nenhum id no estilo CS (fy_/de_/aim_/awp_) sobrevive no código vivo; M2 todo id antigo resolve para mapa que existe; M3 todo mapa tem a prévia em disco com o nome do id (renomear id sem renomear a imagem dá 404 no menu, não erro de build). CHANGELOG, KNOWN-BUGS e docs/historico ficam fora: são registro do passado, e o alias é o que os mantém verdadeiros E navegáveis. `--mutar=id-cs|sem-alias|sem-preview` provam que morde.",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[grave] eval:ambience sem --mutante declarado no check:fast

O comentário do package.json:59-60 promete que --mutante=sem-ambience|fauna-em-solido prova que o portão morde, mas o script tools/eval/ambience-registry-check.mjs citado na linha 61 não aparece no diff. Sem o script real, o comentário é documento, não código que roda.

mutação: Remover o comentário da linha 59-60 até que o script exista no repositório

Comment thread package.json Outdated
"eval:faccao": "node tools/eval/faccao-paleta-check.mjs",
"//eval:mapid": "Id de mapa é NOSSO, e id antigo não morre calado. Os ids eram herança do CS 1.6 (awp_map e fy_pool_day são nomes literais de lá; fy_ é convenção de lá) enquanto os nomes exibidos já eram brasileiros — só o id carregava o CS, e id VAZA: vai gravado no banco (match.ts manda p_map em toda partida) e viaja em link (?map=fy_quebrada). Como resolveMapId devolve o mapa padrão para id desconhecido, link antigo não daria erro: abriria a Praça no lugar da Quebrada, calado — a mesma falha silenciosa do rename Time E, que apagou a bandeira sem uma linha no console. M1 nenhum id no estilo CS (fy_/de_/aim_/awp_) sobrevive no código vivo; M2 todo id antigo resolve para mapa que existe; M3 todo mapa tem a prévia em disco com o nome do id (renomear id sem renomear a imagem dá 404 no menu, não erro de build). CHANGELOG, KNOWN-BUGS e docs/historico ficam fora: são registro do passado, e o alias é o que os mantém verdadeiros E navegáveis. `--mutar=id-cs|sem-alias|sem-preview` provam que morde.",
"eval:mapid": "node tools/eval/mapa-id-check.mjs",
"//eval:ambience": "Fauna ambiente em TODO mapa do registro (BUG-57 portado do /game): AR1 todo mapa devolve `ambience` com animais, AR2 população mínima por bioma (aberto ≥ rato E pombo; interno ≥ 2 ratos), AR3 nenhum animal nasce dentro de colisor. Node puro — entrou no check:fast. `--mutante=sem-ambience|fauna-em-solido` prova que morde.",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[grave] script eval:ambience sem mutante no check:fast

O comentário diz '--mutante=sem-ambience|fauna-em-solido' prova que morde, mas o script não tem esse parâmetro no runner.mjs. O DONO disse que isso é o mais importante da régua.

Tip

conserto: Adicione --mutante=sem-ambience|fauna-em-solido ao tools/eval/ambience-registry-check.mjs ou remova o comentário.

mutação: Rode npm run check:fast -- --mutante=sem-ambience para ver erro de 'argumento desconhecido'

Comment thread public/js/map_atacadao.js Outdated
import { placeProp } from './mapprops.js';
import { decalIds } from './map_decals.js';
import { grafitar } from './graffiti_pass.js';
import { createFavelaAmbience } from './ambientlife.js';

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[grave] import de módulo que não existe no diff

Todos os mapas importam './ambientlife.js' mas o arquivo não está no diff. Isso causa SyntaxError/ModuleNotFoundError em runtime quando qualquer mapa com fauna é carregado, quebrando TODO o sistema de BUG-57.

Tip

conserto: Adicione o arquivo public/js/ambientlife.js ao diff com as exportações createFavelaAmbience e preloadAmbientLife, conforme importado nos mapas.

mutação: Remover a linha 'import { createFavelaAmbience } from './ambientlife.js';' de qualquer mapa prova que o import falha.

Comment thread public/js/ambientlife.js Outdated
const size = box.getSize(new THREE.Vector3());
const target = id === 'rat' ? .36 : id === 'pigeonGround' ? .29 : id === 'dog' ? 1 : .62;
const dimension = id === 'pigeonGround' || id === 'dog' ? size.y : Math.max(size.x, size.z);
const scale = target / Math.max(.001, dimension);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[leve] fallbackRat não usa o parâmetro index

A função fallbackRat(index) recebe index como parâmetro e o usa para alternar cores de pelagem (linha 117), mas isso não afeta o fallback procedural de cães ou pombos que não têm variação. O parâmetro é inconsistente.

Tip

conserto: Adicionar variação de cor ou tamanho baseada no index para fallbackDog e fallbackPigeon, ou remover o parâmetro se não for necessário para consistência.

Comment thread public/js/ambientlife.js Outdated
if (loaded) {
model = loaded.model;
normalizeModel(assetId, model);
animalRoot.add(model);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[leve] normalizeModel assumes que o modelo tem animação se for skinned

A linha 172 verifica template.skinned para decidir se usa skeletonClone, mas não há fallback se o template não tiver animação definida em clips. Isso pode causar erro se um GLB esqueleto vier sem animações.

Tip

conserto: Adicionar verificação if (!template.clips || template.clips.length === 0) template.skinned = false antes da linha 172.

mutação: Testar com GLB skinned sem animação definida

@rubenmarcus
rubenmarcus force-pushed the v2/arnes-grafite-serve branch from 6e3b69f to d294390 Compare August 19, 2026 00:45
@rubenmarcus
rubenmarcus force-pushed the v2/fauna-todos-mapas branch from 45c0f70 to d294390 Compare August 19, 2026 00:45
@rubenmarcus

Copy link
Copy Markdown
Member Author

Reaberta: o close (00:45:47) não foi do dono — outra sessão de agente com a mesma credencial fechou junto com os force-pushes de restauração. Nada foi mergeado; branch preservado no tip original (45c0f70).

@rubenmarcus

Copy link
Copy Markdown
Member Author

Reaberta: o close (00:45:47) não foi do dono — sessão paralela de agente fechou junto dos force-pushes de restauração. Nada foi mergeado; branch preservado (45c0f70).

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

PR substituta: #376 (mesmo branch, mesmo conteúdo). Esta aqui ficou com o registro wedged pelo acidente de force-push de 19/08 00:45 — head/base congelados, commits=0, GitHub recusa reopen por REST e GraphQL. Fica fechada como registro histórico; a conversa continua na #376.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs-human-gameplay Mudança exige revisão humana de gameplay/render/HUD needs-staging Mudança precisa validação integrada em staging target:main PR apontando para a branch main

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants