feat(city): implement marketplace, missions, customization and admin dashboard

- Add database migrations for market_listings, missions and character cosmetics
- Create controllers for marketplace, missions, presence and character customization
- Implement admin world dashboard with live platform metrics
- Add feature tests for world functionality
- Include phase 2 design documents and gap analysis
This commit is contained in:
2026-10-17 23:21:23 -03:00
parent a620f83dd8
commit c299a4ae21
100 changed files with 254 additions and 0 deletions
@@ -0,0 +1,85 @@
<div style="text-align:center;margin-bottom:1.5rem">
<h2>✅ Entendi o Visual Alvo</h2>
<p class="subtitle">Baseado nas 4 telas de exemplo — a diferença para o que existe hoje é enorme</p>
</div>
<div class="split">
<div class="mockup">
<div class="mockup-header">Hoje (existe)</div>
<div class="mockup-body" style="text-align:center;padding:1.5rem">
<div style="background:#14532d;border:1px solid #334155;border-radius:.5rem;height:100px;display:flex;align-items:center;justify-content:center;gap:8px">
<div style="width:20px;height:20px;background:#0ea5e9;border-radius:3px"></div>
<div style="width:25px;height:30px;background:#8b5cf6;border-radius:3px"></div>
<div style="width:15px;height:15px;background:#f59e0b;border-radius:999px"></div>
</div>
<p style="margin-top:.75rem;font-size:.85rem">Vista isométrica · caixas coloridas · cápsulas amarelas</p>
</div>
</div>
<div class="mockup">
<div class="mockup-header">Alvo (imagens de exemplo)</div>
<div class="mockup-body" style="text-align:center;padding:1.5rem">
<div style="background:linear-gradient(#87ceeb 0%, #87ceeb 35%, #333 36%, #333 100%);border:1px solid #555;border-radius:.5rem;height:100px;position:relative;overflow:hidden">
<div style="position:absolute;left:0;top:0;bottom:0;width:35%;background:linear-gradient(#d4a843,#8b6914);border-right:3px solid #222"></div>
<div style="position:absolute;right:0;top:0;bottom:0;width:35%;background:linear-gradient(#c49a3a,#7a5a12);border-left:3px solid #222"></div>
<div style="position:absolute;left:50%;bottom:0;transform:translateX(-50%);width:10px;height:100%;background:#222"></div>
<div style="position:absolute;left:30%;bottom:40%;width:15px;height:15px;background:#555;border-radius:50%"></div>
<div style="position:absolute;right:30%;bottom:40%;width:15px;height:15px;background:#555;border-radius:50%"></div>
</div>
<p style="margin-top:.75rem;font-size:.85rem">1ª pessoa · asfalto + faixas · prédios fachadas · personagens 3D</p>
</div>
</div>
</div>
<hr style="border-color:var(--border);margin:2rem 0">
<h3 style="text-align:center">Gap — o que precisa ser construído</h3>
<div class="options" style="margin-top:1rem" data-multiselect>
<div class="option" data-choice="fps-camera" onclick="toggleSelect(this)">
<div class="letter">1</div>
<div class="content">
<h3>Câmera 1ª pessoa / 3ª pessoa</h3>
<p>Substituir a órbita por WASD + mouse, com colisão contra prédios e pedestres</p>
<p style="color:var(--muted);font-size:.85rem;margin-top:.4rem">Bloqueante: sem isso, não tem a experiência das imagens</p>
</div>
</div>
<div class="option" data-choice="street" onclick="toggleSelect(this)">
<div class="letter">2</div>
<div class="content">
<h3>Rua realista</h3>
<p>Asfalto escuro, faixas brancas, calçada de ladrilho, postes, semáforos</p>
</div>
</div>
<div class="option" data-choice="buildings" onclick="toggleSelect(this)">
<div class="letter">3</div>
<div class="content">
<h3>Prédios com fachadas</h3>
<p>Janelas, portas, estrutura escura, fachadas amarelo/mostarda e marrom — não caixas planas</p>
</div>
</div>
<div class="option" data-choice="characters" onclick="toggleSelect(this)">
<div class="letter">4</div>
<div class="content">
<h3>Personagens 3D estilo anime</h3>
<p>Modelos detalhados com cabelo, roupas, animação de andar — substituir cápsulas amarelas</p>
<p style="color:var(--muted);font-size:.85rem;margin-top:.4rem">Requer modelo 3D (GLTF) ou compra/asset pack</p>
</div>
</div>
<div class="option" data-choice="hud" onclick="toggleSelect(this)">
<div class="letter">5</div>
<div class="content">
<h3>HUD — Painel POSIÇÃO</h3>
<p>Coordenadas x,y,z, no chão, triângulos de colisão no canto inferior esquerdo</p>
</div>
</div>
<div class="option" data-choice="chat" onclick="toggleSelect(this)">
<div class="letter">6</div>
<div class="content">
<h3>Chat com NPCs (OpenRouter)</h3>
<p>Painel de diálogo com nome, status (pensando/respondendo), conversa em tempo real</p>
<p style="color:var(--muted);font-size:.85rem;margin-top:.4rem">Integração direta com agentes existentes no banco</p>
</div>
</div>
</div>
<p style="margin-top:1.5rem;text-align:center;color:var(--muted)">Marque os itens que confirma estar no escopo da Fase 2 e me diga se algo está faltando ou sobrando.</p>