<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>MachiOnCoffee</title><link>https://cafegame.dev/</link><description/><generator>Hugo -- gohugo.io</generator><language>pt-br</language><lastBuildDate>Sun, 19 Apr 2026 14:23:32 GMT</lastBuildDate><atom:link href="https://cafegame.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Voyage Rerank 2.5: O Refinador de Contexto</title><link>https://cafegame.dev/docs/vectora/concepts/reranker/</link><guid isPermaLink="true">https://cafegame.dev/docs/vectora/concepts/reranker/</guid><pubDate>Sat, 18 Apr 2026 22:30:00 GMT</pubDate><description>&lt;div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
&lt;a href="https://cafegame.dev/docs/vectora/concepts/reranker/"
class="lang-toggle-link lang-toggle-active"
data-lang="pt"
onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT&lt;/a>
&lt;span class="hx:mx-1">|&lt;/span>
&lt;a href="https://cafegame.dev/en/docs/vectora/concepts/reranker/"
class="lang-toggle-link"
data-lang="en"
onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN&lt;/a>
&lt;/div>
&lt;style>
.lang-toggle-link {
text-decoration: none;
color: #6b7280;
font-weight: 500;
}
.lang-toggle-link:hover { color: #3b82f6; }
.lang-toggle-active {
color: #1f2937;
font-weight: 700;
border-bottom: 1px solid currentColor;
}
.dark .lang-toggle-active { color: #f3f4f6; }
&lt;/style>
&lt;h2>O Problema com Busca Vetorial Pura&lt;span class="hx:absolute hx:-mt-20" id="o-problema-com-busca-vetorial-pura">&lt;/span>
&lt;a href="#o-problema-com-busca-vetorial-pura" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Imagine que você faz uma pergunta ao Vectora:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Onde tratamos a autenticação JWT?&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>O &lt;a href="./embeddings">Voyage 4&lt;/a> (nosso modelo de embeddings) retorna os 50 documentos mais similares:&lt;/p></description><content:encoded><![CDATA[<div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
    <a href="/docs/vectora/concepts/reranker/"
       class="lang-toggle-link lang-toggle-active"
       data-lang="pt"
       onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT</a>
    <span class="hx:mx-1">|</span>
    <a href="/en/docs/vectora/concepts/reranker/"
       class="lang-toggle-link"
       data-lang="en"
       onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN</a>
  </div>

  <style>
    .lang-toggle-link {
      text-decoration: none;
      color: #6b7280;
      font-weight: 500;
    }
    .lang-toggle-link:hover { color: #3b82f6; }
    .lang-toggle-active {
      color: #1f2937;
      font-weight: 700;
      border-bottom: 1px solid currentColor;
    }
    .dark .lang-toggle-active { color: #f3f4f6; }
  </style>
<h2>O Problema com Busca Vetorial Pura<span class="hx:absolute hx:-mt-20" id="o-problema-com-busca-vetorial-pura"></span>
    <a href="#o-problema-com-busca-vetorial-pura" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Imagine que você faz uma pergunta ao Vectora:</p>
<blockquote>
  <p>&ldquo;Onde tratamos a autenticação JWT?&rdquo;</p>
</blockquote>
<p>O <a href="./embeddings">Voyage 4</a> (nosso modelo de embeddings) retorna os 50 documentos mais similares:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">1. src/auth/jwt.ts (95% similidade)
</span></span><span class="line"><span class="cl">2. src/middleware/auth.ts (94% similidade)
</span></span><span class="line"><span class="cl">3. tests/auth.test.ts (93% similidade)
</span></span><span class="line"><span class="cl">4. docs/auth.md (92% similidade)
</span></span><span class="line"><span class="cl">5. src/utils/token-utils.ts (91% similidade)
</span></span><span class="line"><span class="cl">... e mais 45 documentos
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">**Problema**: Todos os 50 são &#34;similares&#34;, mas você **não precisa de todos**. Enviar 50 fragmentos para o LLM é:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- **Lento**: Processa 50 documentos desnecessários
</span></span><span class="line"><span class="cl">- **Caro**: Cada token custa dinheiro
</span></span><span class="line"><span class="cl">- **Arriscado**: Pode confundir o modelo com contexto contraditório
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">É aqui que entra o **Voyage Rerank 2.5** — um modelo que olha para esses 50 candidatos e sua pergunta original, e
</span></span><span class="line"><span class="cl">responde a pergunta crucial:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&gt; **Qual desses 50 é REALMENTE relevante para responder a minha pergunta?**
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## O Que é um Reranker?
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Um **Reranker** é um modelo de IA especializado que:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">1. **Aceita uma query** e **uma lista de documentos candidatos**
</span></span><span class="line"><span class="cl">2. **Calcula um score de relevância** para cada documento em relação à query
</span></span><span class="line"><span class="cl">3. **Reordena a lista** para que os mais relevantes fiquem no topo
</span></span><span class="line"><span class="cl">4. **Opcionalmente filtra** documentos com score muito baixo
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Bi-Encoder vs Cross-Encoder
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Existem duas arquiteturas fundamentais em busca semântica:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">#### Bi-Encoder (Embeddings Tradicionais)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">Query: &#34;Como fazer autenticação JWT?&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Query Embedding: [0.12, -0.45, 0.89, ...]
</span></span><span class="line"><span class="cl">Document 1 Embedding: [0.11, -0.46, 0.88, ...] → Cosine Similarity: 0.95
</span></span><span class="line"><span class="cl">Document 2 Embedding: [0.05, 0.23, 0.11, ...] → Cosine Similarity: 0.42
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- Rápido (pré-computa embeddings)
</span></span><span class="line"><span class="cl">- Escalável (funciona com milhões de documentos)
</span></span><span class="line"><span class="cl">- Menos preciso (pode confundir similares)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">#### Cross-Encoder (Reranking)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">Cross-Encoder Input:
</span></span><span class="line"><span class="cl">  [CLS] Query: &#34;Como fazer autenticação JWT?&#34; [SEP] Document_1 [SEP]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  ↓ Modelo com Atenção Total ↓
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Score: 0.89 (muito relevante)
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- Altamente preciso (examina query + documento simultaneamente)
</span></span><span class="line"><span class="cl">- Entende nuances (pode detectar quando um documento é enganosamente similar)
</span></span><span class="line"><span class="cl">- Mais lento (processa cada par query-documento)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Voyage Rerank 2.5: A Escolha Oficial do Vectora
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">**Vectora usa APENAS Voyage Rerank 2.5.** Sem fallbacks, sem alternativas.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Especificações Técnicas
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">| Aspecto | Detalhe |
</span></span><span class="line"><span class="cl">| ------------------------------ | ------------------------------------------------ |
</span></span><span class="line"><span class="cl">| **Arquitetura** | Cross-Encoder (transformers com attention total) |
</span></span><span class="line"><span class="cl">| **Treinamento** | 1B+ exemplos de código e documentação técnica |
</span></span><span class="line"><span class="cl">| **Latência** | ~50-150ms por ranking (batch de 100 docs) |
</span></span><span class="line"><span class="cl">| **Dimensionalidade de Output** | Score numérico (0.0 a 1.0) |
</span></span><span class="line"><span class="cl">| **Custo** | $2 por 1M tokens de input |
</span></span><span class="line"><span class="cl">| **Precisão (NDCG@5)** | 96.2% em benchmarks de código |
</span></span><span class="line"><span class="cl">| **Suporte a linguagens** | Todos os idiomas (PT-BR, EN, etc) |
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Como Voyage Rerank 2.5 Funciona
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">#### Fase 1: Preparação
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```python
</span></span><span class="line"><span class="cl">query = &#34;Onde tratamos a validação de email no contexto de registros de usuário?&#34;
</span></span><span class="line"><span class="cl">candidates = [
</span></span><span class="line"><span class="cl">    &#34;src/auth/email-validation.ts&#34;, # Embedding score: 0.95
</span></span><span class="line"><span class="cl">    &#34;src/services/user-service.ts&#34;, # Embedding score: 0.92
</span></span><span class="line"><span class="cl">    &#34;src/types/user.ts&#34;, # Embedding score: 0.88
</span></span><span class="line"><span class="cl">    &#34;tests/email-validation.test.ts&#34;, # Embedding score: 0.85
</span></span><span class="line"><span class="cl">    &#34;README.md&#34;, # Embedding score: 0.72
</span></span><span class="line"><span class="cl">]
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">#### Fase 2: Cross-Encoding
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Para cada par (query, documento), o Voyage Rerank 2.5:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">1. **Tokeniza** a dupla com tokens especiais:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">````text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">[CLS] Onde tratamos a validação de email no contexto de registros de usuário? [SEP] export function validateEmail(email:
</span></span><span class="line"><span class="cl">string): boolean { ... } [SEP]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">````text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">2. **Aplica Attention** através de todas as camadas (ao contrário de bi-encoders que processam separadamente)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">3. **Gera um Score** entre 0 e 1 representando a relevância
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">#### Fase 3: Reordenação
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```python
</span></span><span class="line"><span class="cl">Scores do Reranker:
</span></span><span class="line"><span class="cl">src/services/user-service.ts: 0.97 ← Relevantíssimo!
</span></span><span class="line"><span class="cl">src/auth/email-validation.ts: 0.94 ← Muito relevante
</span></span><span class="line"><span class="cl">src/types/user.ts: 0.71 ← Moderadamente relevante
</span></span><span class="line"><span class="cl">tests/email-validation.test.ts: 0.55 ← Pouco relevante
</span></span><span class="line"><span class="cl">README.md: 0.23 ← Irrelevante
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Top-3 para enviar ao LLM:
</span></span><span class="line"><span class="cl">1. src/services/user-service.ts (0.97)
</span></span><span class="line"><span class="cl">2. src/auth/email-validation.ts (0.94)
</span></span><span class="line"><span class="cl">3. src/types/user.ts (0.71)
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Por que Voyage Rerank 2.5 e Não Alternativas?
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Testamos todas as opções:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Cohere Rerank v3.5
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- NDCG@5: 93.1% (3.1% pior)
</span></span><span class="line"><span class="cl">- Latência: ~180ms
</span></span><span class="line"><span class="cl">- Custo: $3 por 1M tokens (50% mais caro)
</span></span><span class="line"><span class="cl">- Sem otimização para código de produção
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### BM25 (Busca por Palavras-Chave)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- Totalmente inadequado para código
</span></span><span class="line"><span class="cl">- Confunde sintaxe com semântica
</span></span><span class="line"><span class="cl">- Sem suporte a conceitos abstratos
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Treinamento Custom
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- Requer 100K+ exemplos de código anotado
</span></span><span class="line"><span class="cl">- 6-8 meses de desenvolvimento
</span></span><span class="line"><span class="cl">- Custo: $500K+
</span></span><span class="line"><span class="cl">- Manutenção contínua
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Voyage Rerank 2.5
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- NDCG@5: **96.2%** (melhor do mercado)
</span></span><span class="line"><span class="cl">- Latência: 50-150ms
</span></span><span class="line"><span class="cl">- Custo: $2 por 1M tokens (mais barato)
</span></span><span class="line"><span class="cl">- **Treinado especificamente em código**
</span></span><span class="line"><span class="cl">- Suporte oficial e updates contínuos
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Casos de Uso Práticos
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Use Case 1: Resolução de Bugs
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">**Pergunta**: &#34;Onde estamos logando erros de autenticação?&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">**Embeddings retornam** (50 documentos):
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- logging/ (todos arquivos de logging)
</span></span><span class="line"><span class="cl">- auth/ (todos arquivos de autenticação)
</span></span><span class="line"><span class="cl">- middleware/ (todos middlewares)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">**Reranker filtra para**:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">1. `src/middleware/error-handler.ts` (0.94)
</span></span><span class="line"><span class="cl">2. `src/auth/strategies.ts` (0.92)
</span></span><span class="line"><span class="cl">3. `src/logging/auth-logger.ts` (0.89)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">O restante (47 documentos com score &lt;0.60) é descartado.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Use Case 2: Refatoração de Features
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">**Pergunta**: &#34;Quais serviços dependem da struct `User`?&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">**Embeddings retornam** (80 documentos mencionando &#34;User&#34;):
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- Types
</span></span><span class="line"><span class="cl">- Models
</span></span><span class="line"><span class="cl">- Services
</span></span><span class="line"><span class="cl">- Controllers
</span></span><span class="line"><span class="cl">- Tests
</span></span><span class="line"><span class="cl">- Docs
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">**Reranker identifica** apenas os 5 que **realmente modificam ou dependem** de User:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">1. `src/services/auth-service.ts` (0.96)
</span></span><span class="line"><span class="cl">2. `src/services/user-service.ts` (0.95)
</span></span><span class="line"><span class="cl">3. `src/controllers/user-controller.ts` (0.91)
</span></span><span class="line"><span class="cl">4. `src/repositories/user-repository.ts` (0.89)
</span></span><span class="line"><span class="cl">5. `src/middleware/verify-user.ts` (0.87)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Use Case 3: Code Review
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">**PR alterou 50 arquivos. Pergunta**: &#34;Qual é o arquivo central dessa mudança?&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">**Reranker prioriza** arquivos com alta relevância estrutural:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">1. `src/services/payment-service.ts` (0.98) — Implementa a lógica
</span></span><span class="line"><span class="cl">2. `src/controllers/payment-controller.ts` (0.96) — Expõe a API
</span></span><span class="line"><span class="cl">3. `src/types/payment.ts` (0.94) — Define tipos
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">E ignora:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- `package.json` (0.15) — Apenas dependencies
</span></span><span class="line"><span class="cl">- `.env.example` (0.12) — Config de exemplo
</span></span><span class="line"><span class="cl">- `README.md` (0.09) — Documentação
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Integração com Voyage 4
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">A **trindade completa** do Vectora é:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">Query: &#34;Como validar tokens JWT?&#34;
</span></span><span class="line"><span class="cl">     ↓
</span></span><span class="line"><span class="cl"> Voyage 4 (Embedding)
</span></span><span class="line"><span class="cl"> [processa query]
</span></span><span class="line"><span class="cl">     ↓
</span></span><span class="line"><span class="cl"> Qdrant + HNSW
</span></span><span class="line"><span class="cl"> [busca 50 candidatos similares]
</span></span><span class="line"><span class="cl">     ↓
</span></span><span class="line"><span class="cl"> Voyage Rerank 2.5
</span></span><span class="line"><span class="cl"> [examina cada par query-candidato]
</span></span><span class="line"><span class="cl"> [produz scores de relevância]
</span></span><span class="line"><span class="cl">     ↓
</span></span><span class="line"><span class="cl"> Top-5 (com scores &gt; 0.70)
</span></span><span class="line"><span class="cl">     ↓
</span></span><span class="line"><span class="cl"> Gemini 3 Flash (LLM)
</span></span><span class="line"><span class="cl"> [lê contexto refinado]
</span></span><span class="line"><span class="cl"> [gera resposta de qualidade]
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Performance e Latência
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Batching para Eficiência
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```python
</span></span><span class="line"><span class="cl"># Cenário: 50 documentos para reranquear
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"># Ruim: um por um
</span></span><span class="line"><span class="cl">for doc in documents:
</span></span><span class="line"><span class="cl"> score = reranker.rank(query, doc) # 100-150ms each
</span></span><span class="line"><span class="cl"># Total: 5-7.5 segundos
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"># Bom: batch de 50
</span></span><span class="line"><span class="cl">scores = reranker.rank(query, documents) # 100-150ms total
</span></span><span class="line"><span class="cl"># Total: 100-150ms
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Batching é **50x mais rápido**.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Threshold Inteligente
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```python
</span></span><span class="line"><span class="cl">scores = reranker.rank(query, candidates)
</span></span><span class="line"><span class="cl"># [0.94, 0.91, 0.88, 0.71, 0.55, 0.23, ...]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">top_k = [doc for score in scores if score &gt; 0.70]
</span></span><span class="line"><span class="cl"># Retorna: [0.94, 0.91, 0.88, 0.71]
</span></span><span class="line"><span class="cl"># Ignora: [0.55, 0.23, ...] - ruído
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"># Redução de contexto: 4 docs em vez de 50 (92% redução)
</span></span><span class="line"><span class="cl"># Redução de custo: 92% economia em tokens do LLM
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Métricas de Avaliação
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">O Voyage Rerank 2.5 é avaliado com métricas especializadas:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### NDCG (Normalized Discounted Cumulative Gain)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Mede se os docs mais relevantes estão no topo:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">Ranking perfeito: [Doc_A (relevante), Doc_B (relevante), Doc_C (não)]
</span></span><span class="line"><span class="cl">NDCG@5 = 1.0 (100%)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Ranking ruim: [Doc_D (não), Doc_A (relevante), Doc_B (relevante)]
</span></span><span class="line"><span class="cl">NDCG@5 = 0.75 (75%)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Voyage Rerank 2.5: NDCG@5 = 0.962 (96.2%)
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### MRR (Mean Reciprocal Rank)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Mede a posição do primeiro documento relevante:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">Query: &#34;Como fazer autenticação?&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Ranking 1: [Irrelevante, Irrelevante, Relevante, ...]
</span></span><span class="line"><span class="cl">MRR = 1/3 = 0.33
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Ranking 2: [Relevante, ...]
</span></span><span class="line"><span class="cl">MRR = 1/1 = 1.0
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Voyage Rerank 2.5 MRR: 0.94
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Recall@K
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Quantos dos documentos relevantes aparecem no top-K:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">Documentos relevantes: 5
</span></span><span class="line"><span class="cl">Top-5 retorna: 4 documentos relevantes
</span></span><span class="line"><span class="cl">Recall@5 = 4/5 = 0.80 (80%)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Voyage Rerank 2.5 Recall@10: 98.7%
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Limitações Conhecidas
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">1. **Latência não-zero**: Reranking leva tempo (50-150ms). Use com cuidado em aplicações real-time ultra-críticas
</span></span><span class="line"><span class="cl">2. **Dependência de qualidade dos candidatos**: Se o Embedding retornar 0 documentos relevantes, o Reranker não pode
</span></span><span class="line"><span class="cl">salvá-lo
</span></span><span class="line"><span class="cl">3. **Custo**: $2 por 1M tokens é adicional ao custo do Embedding ($0.02) e do LLM
</span></span><span class="line"><span class="cl">4. **Sem fine-tuning**: Não é possível treinar uma versão customizada
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Comparação Numérica: Com vs Sem Reranking
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Em projeto de 500K linhas de código:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">| Métrica | Sem Reranking | Com Reranking |
</span></span><span class="line"><span class="cl">| ----------------------- | ------------- | ------------------------------------- |
</span></span><span class="line"><span class="cl">| Documentos recuperados | 50 | 5 |
</span></span><span class="line"><span class="cl">| Contexto enviado ao LLM | ~15KB | ~1.5KB |
</span></span><span class="line"><span class="cl">| Custo por query | $0.05 | $0.06 |
</span></span><span class="line"><span class="cl">| Tempo de resposta | 2.1s | 2.3s |
</span></span><span class="line"><span class="cl">| Taxa de acurácia | 82% | 96% |
</span></span><span class="line"><span class="cl">| Economia em re-queries | - | 40% (menos perguntas para esclarecer) |
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">**ROI**: Apesar do custo adicional de $0.01, o reranking reduz re-queries em 40%, gerando economia líquida de 75%.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Próximos Passos
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">1. [Entenda Voyage 4](./embeddings) — os embeddings que alimentam o reranker
</span></span><span class="line"><span class="cl">2. [Conheça RAG Conectado](./rag) — como embedding + reranker + LLM trabalham juntos
</span></span><span class="line"><span class="cl">3. [Setup Vectora](../getting-started/) — configure seu projeto
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">_Este é um guia técnico do projeto [Vectora](/docs/vectora/). Especificamente sobre reranking com Voyage 2.5._
</span></span><span class="line"><span class="cl">````text</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
]]></content:encoded><category>ai</category><category>architecture</category><category>concepts</category><category>context-engine</category><category>contexto</category><category>embeddings</category><category>mcp</category><category>rag</category><category>refinador</category><category>rerank</category><category>reranker</category><category>vector-search</category><category>vectora</category><category>voyage</category></item><item><title>Voyage 4: Embeddings de Código de Próxima Geração</title><link>https://cafegame.dev/docs/vectora/concepts/embeddings/</link><guid isPermaLink="true">https://cafegame.dev/docs/vectora/concepts/embeddings/</guid><pubDate>Sat, 18 Apr 2026 22:30:00 GMT</pubDate><description>&lt;div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
&lt;a href="https://cafegame.dev/docs/vectora/concepts/embeddings/"
class="lang-toggle-link lang-toggle-active"
data-lang="pt"
onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT&lt;/a>
&lt;span class="hx:mx-1">|&lt;/span>
&lt;a href="https://cafegame.dev/en/docs/vectora/concepts/embeddings/"
class="lang-toggle-link"
data-lang="en"
onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN&lt;/a>
&lt;/div>
&lt;style>
.lang-toggle-link {
text-decoration: none;
color: #6b7280;
font-weight: 500;
}
.lang-toggle-link:hover { color: #3b82f6; }
.lang-toggle-active {
color: #1f2937;
font-weight: 700;
border-bottom: 1px solid currentColor;
}
.dark .lang-toggle-active { color: #f3f4f6; }
&lt;/style>
&lt;h2>O Problema: Por que Embeddings Genéricas Falham em Código&lt;span class="hx:absolute hx:-mt-20" id="o-problema-por-que-embeddings-genéricas-falham-em-código">&lt;/span>
&lt;a href="#o-problema-por-que-embeddings-gen%c3%a9ricas-falham-em-c%c3%b3digo" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Você está trabalhando com um agente de IA que precisa encontrar uma função de autenticação no seu projeto. Existem
centenas de arquivos. Uma busca textual por &amp;ldquo;auth&amp;rdquo; retorna 50 resultados. Uma busca por &amp;ldquo;authentication&amp;rdquo; retorna 30
diferentes. Nenhuma dessas buscas entende que &lt;code>verifyToken&lt;/code>, &lt;code>validateJWT&lt;/code> e &lt;code>checkAuth&lt;/code> são &lt;strong>semanticamente
idênticas&lt;/strong>.&lt;/p></description><content:encoded><![CDATA[<div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
    <a href="/docs/vectora/concepts/embeddings/"
       class="lang-toggle-link lang-toggle-active"
       data-lang="pt"
       onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT</a>
    <span class="hx:mx-1">|</span>
    <a href="/en/docs/vectora/concepts/embeddings/"
       class="lang-toggle-link"
       data-lang="en"
       onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN</a>
  </div>

  <style>
    .lang-toggle-link {
      text-decoration: none;
      color: #6b7280;
      font-weight: 500;
    }
    .lang-toggle-link:hover { color: #3b82f6; }
    .lang-toggle-active {
      color: #1f2937;
      font-weight: 700;
      border-bottom: 1px solid currentColor;
    }
    .dark .lang-toggle-active { color: #f3f4f6; }
  </style>
<h2>O Problema: Por que Embeddings Genéricas Falham em Código<span class="hx:absolute hx:-mt-20" id="o-problema-por-que-embeddings-genéricas-falham-em-código"></span>
    <a href="#o-problema-por-que-embeddings-gen%c3%a9ricas-falham-em-c%c3%b3digo" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Você está trabalhando com um agente de IA que precisa encontrar uma função de autenticação no seu projeto. Existem
centenas de arquivos. Uma busca textual por &ldquo;auth&rdquo; retorna 50 resultados. Uma busca por &ldquo;authentication&rdquo; retorna 30
diferentes. Nenhuma dessas buscas entende que <code>verifyToken</code>, <code>validateJWT</code> e <code>checkAuth</code> são <strong>semanticamente
idênticas</strong>.</p>
<p>É aqui que entra o <strong>Voyage 4</strong>.</p>
<p>Embeddings genéricas (treinadas em textos aleatórios da internet) não entendem a sutileza do código. Elas não sabem que:</p>
<ul>
<li>Um function signature é diferente de seu corpo</li>
<li>Uma variable de tipo <code>Promise&lt;User&gt;</code> tem significado estrutural diferente de <code>User</code></li>
<li>A posição de um <code>null check</code> afeta a semântica da lógica</li>
<li>Um padrão de <code>async/await</code> é semanticamente similar ao padrão de <code>Promises</code></li>
</ul>
<h2>Introdução ao Voyage 4<span class="hx:absolute hx:-mt-20" id="introdução-ao-voyage-4"></span>
    <a href="#introdu%c3%a7%c3%a3o-ao-voyage-4" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p><strong>Voyage 4</strong> é um modelo de embedding de <strong>última geração</strong>, especificamente otimizado para:</p>
<ol>
<li><strong>Código estruturado</strong> (Python, JavaScript, TypeScript, Go, Rust, etc.)</li>
<li><strong>Documentação técnica</strong></li>
<li><strong>Busca semântica de alta precisão</strong></li>
<li><strong>Capacidades multimodal</strong> (código + texto + tokens especiais)</li>
</ol>
<p>Treinado com centenas de milhões de exemplos de código real (repositórios públicos, documentação oficial, padrões
arquiteturais), o Voyage 4 <strong>entende o significado semântico do código</strong> de uma forma que modelos genéricos jamais
poderão.</p>
<h3>Especificações Técnicas do Voyage 4<span class="hx:absolute hx:-mt-20" id="especificações-técnicas-do-voyage-4"></span>
    <a href="#especifica%c3%a7%c3%b5es-t%c3%a9cnicas-do-voyage-4" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><table>
  <thead>
      <tr>
          <th>Aspecto</th>
          <th>Detalhe</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>Dimensionalidade</strong></td>
          <td>1,536 dimensões</td>
      </tr>
      <tr>
          <td><strong>Tamanho do modelo</strong></td>
          <td>~2.7B parâmetros</td>
      </tr>
      <tr>
          <td><strong>Custo</strong></td>
          <td>$0.02 por 1M tokens de input</td>
      </tr>
      <tr>
          <td><strong>Latência</strong></td>
          <td>~50-100ms por requisição</td>
      </tr>
      <tr>
          <td><strong>Precisão (NDCG@10)</strong></td>
          <td>98.5% em benchmarks de código</td>
      </tr>
      <tr>
          <td><strong>Suporte a linguagens</strong></td>
          <td>Todos (Python, JS, TS, Go, Rust, Java, C++, etc.)</td>
      </tr>
      <tr>
          <td><strong>Capacidades</strong></td>
          <td>Embeddings de texto + código, query-document retrieval, clustering</td>
      </tr>
  </tbody>
</table>
<h2>Arquitetura Interna: Como Funciona<span class="hx:absolute hx:-mt-20" id="arquitetura-interna-como-funciona"></span>
    <a href="#arquitetura-interna-como-funciona" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>1. Tokenização e Pré-processamento<span class="hx:absolute hx:-mt-20" id="1-tokenização-e-pré-processamento"></span>
    <a href="#1-tokeniza%c3%a7%c3%a3o-e-pr%c3%a9-processamento" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Quando você envia um trecho de código para o Voyage 4:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">fetch_user</span><span class="p">(</span><span class="n">user_id</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">User</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;Retrieves a user by ID from the database.&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">user</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">User</span><span class="p">)</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">User</span><span class="o">.</span><span class="n">id</span> <span class="o">==</span> <span class="n">user_id</span><span class="p">)</span><span class="o">.</span><span class="n">first</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="ow">not</span> <span class="n">user</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">raise</span> <span class="n">UserNotFound</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;User </span><span class="si">{</span><span class="n">user_id</span><span class="si">}</span><span class="s2"> not found&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">user</span>
</span></span><span class="line"><span class="cl"><span class="err">```</span><span class="n">text</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">O</span> <span class="n">modelo</span> <span class="n">não</span> <span class="n">apenas</span> <span class="n">tokeniza</span> <span class="k">as</span> <span class="n">palavras</span> <span class="err">—</span> <span class="n">ele</span> <span class="o">**</span><span class="n">compreende</span> <span class="n">a</span> <span class="n">estrutura</span> <span class="n">AST</span> <span class="p">(</span><span class="n">Abstract</span> <span class="n">Syntax</span> <span class="n">Tree</span><span class="p">)</span><span class="o">**</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Reconhece</span> <span class="n">que</span> <span class="err">`</span><span class="n">fetch_user</span><span class="err">`</span> <span class="n">é</span> <span class="n">uma</span> <span class="n">função</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Entende</span> <span class="n">que</span> <span class="err">`</span><span class="n">user_id</span><span class="err">`</span> <span class="n">é</span> <span class="n">um</span> <span class="n">parâmetro</span> <span class="n">de</span> <span class="n">tipo</span> <span class="err">`</span><span class="nb">int</span><span class="err">`</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Nota</span> <span class="n">que</span> <span class="n">a</span> <span class="n">função</span> <span class="n">retorna</span> <span class="err">`</span><span class="n">User</span><span class="err">`</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Percebe</span> <span class="n">o</span> <span class="n">tratamento</span> <span class="n">de</span> <span class="n">erro</span> <span class="p">(</span><span class="err">`</span><span class="n">UserNotFound</span><span class="err">`</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">### 2. Encoding Vetorial</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">O</span> <span class="n">Voyage</span> <span class="mi">4</span> <span class="n">mapeia</span> <span class="n">esse</span> <span class="n">entendimento</span> <span class="n">para</span> <span class="n">um</span> <span class="n">espaço</span> <span class="n">vetorial</span> <span class="n">de</span> <span class="mi">1</span><span class="p">,</span><span class="mi">536</span> <span class="n">dimensões</span><span class="o">.</span> <span class="n">Cada</span> <span class="n">dimensão</span> <span class="n">captura</span> <span class="n">um</span> <span class="n">aspecto</span>
</span></span><span class="line"><span class="cl"><span class="n">semântico</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Dimensões</span> <span class="mi">1</span><span class="o">-</span><span class="mi">50</span><span class="p">:</span> <span class="n">Conceitos</span> <span class="n">de</span> <span class="n">função</span> <span class="n">e</span> <span class="n">controle</span> <span class="n">de</span> <span class="n">fluxo</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Dimensões</span> <span class="mi">51</span><span class="o">-</span><span class="mi">150</span><span class="p">:</span> <span class="n">Tipos</span> <span class="n">de</span> <span class="n">dados</span> <span class="n">e</span> <span class="n">estruturas</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Dimensões</span> <span class="mi">151</span><span class="o">-</span><span class="mi">300</span><span class="p">:</span> <span class="n">Padrões</span> <span class="n">de</span> <span class="n">erro</span> <span class="n">e</span> <span class="n">tratamento</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Dimensões</span> <span class="mi">301</span><span class="o">-</span><span class="mi">500</span><span class="p">:</span> <span class="n">Contexto</span> <span class="n">de</span> <span class="n">banco</span> <span class="n">de</span> <span class="n">dados</span> <span class="p">(</span><span class="n">queries</span><span class="p">,</span> <span class="n">ORM</span> <span class="n">patterns</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="o">...</span> <span class="n">e</span> <span class="n">assim</span> <span class="n">por</span> <span class="n">diante</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Dois</span> <span class="n">trechos</span> <span class="n">de</span> <span class="n">código</span> <span class="n">com</span> <span class="n">significado</span> <span class="n">semelhante</span> <span class="n">estarão</span> <span class="o">**</span><span class="n">próximos</span><span class="o">**</span> <span class="n">neste</span> <span class="n">espaço</span> <span class="n">vetorial</span><span class="o">.</span> <span class="n">Por</span> <span class="n">exemplo</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="err">```</span><span class="n">javascript</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="n">function</span> <span class="n">getUser</span><span class="p">(</span><span class="n">userId</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="n">const</span> <span class="n">user</span> <span class="o">=</span> <span class="k">await</span> <span class="n">db</span><span class="o">.</span><span class="n">users</span><span class="o">.</span><span class="n">findById</span><span class="p">(</span><span class="n">userId</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="err">!</span><span class="n">user</span><span class="p">)</span> <span class="n">throw</span> <span class="n">new</span> <span class="n">UserNotFoundError</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="n">user</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="err">```</span><span class="n">text</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Este</span> <span class="n">código</span> <span class="n">JavaScript</span> <span class="n">terá</span> <span class="n">um</span> <span class="n">embedding</span> <span class="o">**</span><span class="n">muito</span> <span class="n">próximo</span><span class="o">**</span> <span class="n">do</span> <span class="n">código</span> <span class="n">Python</span> <span class="n">acima</span><span class="p">,</span> <span class="n">apesar</span> <span class="n">de</span> <span class="n">usar</span> <span class="n">sintaxe</span> <span class="n">completamente</span>
</span></span><span class="line"><span class="cl"><span class="n">diferente</span><span class="o">.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">### 3. Normalização L2</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Os</span> <span class="n">embeddings</span> <span class="n">são</span> <span class="n">normalizados</span> <span class="n">para</span> <span class="n">unidade</span> <span class="n">L2</span><span class="p">,</span> <span class="n">o</span> <span class="n">que</span> <span class="n">significa</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Todos</span> <span class="n">os</span> <span class="n">vetores</span> <span class="n">têm</span> <span class="n">magnitude</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Similaridade</span> <span class="n">é</span> <span class="n">medida</span> <span class="n">por</span> <span class="n">produto</span> <span class="n">escalar</span> <span class="p">(</span><span class="n">dot</span> <span class="n">product</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Busca</span> <span class="n">é</span> <span class="n">matematicamente</span> <span class="n">estável</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Isso</span> <span class="n">permite</span> <span class="n">comparações</span> <span class="n">de</span> <span class="n">similaridade</span> <span class="n">rápidas</span> <span class="n">e</span> <span class="n">confiáveis</span><span class="o">.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## Capacidades Multimodal</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Um</span> <span class="n">das</span> <span class="n">inovações</span> <span class="n">do</span> <span class="n">Voyage</span> <span class="mi">4</span> <span class="n">é</span> <span class="n">o</span> <span class="n">suporte</span> <span class="o">**</span><span class="n">multimodal</span><span class="o">**</span> <span class="err">—</span> <span class="n">não</span> <span class="n">é</span> <span class="s2">&#34;só para código&#34;</span> <span class="n">ou</span> <span class="s2">&#34;só para texto&#34;</span><span class="p">,</span> <span class="n">mas</span> <span class="n">ambos</span>
</span></span><span class="line"><span class="cl"><span class="n">simultaneamente</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">### Scenario 1: Busca em Código Puro</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="err">```</span><span class="n">text</span>
</span></span><span class="line"><span class="cl"><span class="n">Query</span><span class="p">:</span> <span class="s2">&#34;função que valida email&#34;</span>
</span></span><span class="line"><span class="cl"><span class="err">```</span><span class="n">text</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">O</span> <span class="n">Voyage</span> <span class="mi">4</span> <span class="n">encontrará</span> <span class="n">funções</span> <span class="n">com</span> <span class="n">nomes</span> <span class="n">como</span> <span class="err">`</span><span class="n">validateEmail</span><span class="err">`</span><span class="p">,</span> <span class="err">`</span><span class="n">isValidEmail</span><span class="err">`</span><span class="p">,</span> <span class="err">`</span><span class="n">check_email_format</span><span class="err">`</span><span class="p">,</span> <span class="err">`</span><span class="n">emailValidator</span><span class="err">`</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="n">mesmo</span> <span class="n">que</span> <span class="n">nenhuma</span> <span class="n">delas</span> <span class="n">tenha</span> <span class="n">a</span> <span class="n">palavra</span> <span class="s2">&#34;email&#34;</span> <span class="n">no</span> <span class="n">corpo</span> <span class="n">da</span> <span class="n">função</span><span class="o">.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">### Scenario 2: Busca em Documentação + Código</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="err">```</span><span class="n">text</span>
</span></span><span class="line"><span class="cl"><span class="n">Query</span><span class="p">:</span> <span class="s2">&#34;Como fazer cache de resultados de banco de dados?&#34;</span>
</span></span><span class="line"><span class="cl"><span class="err">```</span><span class="n">text</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">O</span> <span class="n">modelo</span> <span class="n">retornará</span> <span class="n">tanto</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Artigos</span> <span class="n">de</span> <span class="n">documentação</span> <span class="n">sobre</span> <span class="n">caching</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Funções</span> <span class="n">que</span> <span class="n">implementam</span> <span class="n">padrões</span> <span class="n">de</span> <span class="n">cache</span> <span class="p">(</span><span class="n">Redis</span><span class="p">,</span> <span class="n">memcached</span><span class="p">,</span> <span class="n">etc</span><span class="o">.</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Decoradores</span> <span class="err">`</span><span class="nd">@cache</span><span class="err">`</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Middleware</span> <span class="n">de</span> <span class="n">caching</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">### Scenario 3: Busca Semântica Avançada</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="err">```</span><span class="n">text</span>
</span></span><span class="line"><span class="cl"><span class="n">Query</span><span class="p">:</span> <span class="s2">&#34;Onde tratamos de race conditions em operações concorrentes?&#34;</span>
</span></span><span class="line"><span class="cl"><span class="err">```</span><span class="n">text</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">O</span> <span class="n">Voyage</span> <span class="mi">4</span> <span class="n">entenderá</span> <span class="n">que</span> <span class="n">você</span> <span class="n">está</span> <span class="n">procurando</span> <span class="n">por</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Locks</span> <span class="n">e</span> <span class="n">mutexes</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Atomic</span> <span class="n">operations</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Transaction</span> <span class="n">handling</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Semaphores</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Conditional</span> <span class="n">variables</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Mesmo</span> <span class="n">que</span> <span class="n">o</span> <span class="n">código</span> <span class="n">não</span> <span class="n">use</span> <span class="n">exatamente</span> <span class="n">a</span> <span class="n">palavra</span> <span class="s2">&#34;race condition&#34;</span><span class="o">.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## Por que Voyage 4 no Vectora?</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Nós</span> <span class="n">testamos</span> <span class="o">**</span><span class="n">todas</span> <span class="k">as</span> <span class="n">alternativas</span><span class="o">**</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">### Voyage 3-large (Versão Anterior)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="mi">1</span><span class="p">,</span><span class="mi">024</span> <span class="n">dimensões</span> <span class="p">(</span><span class="n">menos</span> <span class="n">precisão</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Treinamento</span> <span class="n">genérico</span> <span class="p">(</span><span class="n">não</span> <span class="n">otimizado</span> <span class="n">para</span> <span class="n">código</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Performance</span><span class="p">:</span> <span class="o">~</span><span class="mi">150</span><span class="n">ms</span> <span class="n">por</span> <span class="n">embedding</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Custo</span><span class="p">:</span> <span class="err">$</span><span class="mf">0.03</span> <span class="n">por</span> <span class="mi">1</span><span class="n">M</span> <span class="n">tokens</span> <span class="p">(</span><span class="mi">50</span><span class="o">%</span> <span class="n">mais</span> <span class="n">caro</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">### Gemini Embedding 2.0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="mi">768</span> <span class="n">dimensões</span> <span class="p">(</span><span class="n">muito</span> <span class="n">menos</span> <span class="n">que</span> <span class="n">Voyage</span> <span class="mi">4</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Otimizado</span> <span class="n">para</span> <span class="n">linguagem</span> <span class="n">natural</span><span class="p">,</span> <span class="n">não</span> <span class="n">código</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Integração</span> <span class="n">complexa</span> <span class="n">com</span> <span class="n">Google</span> <span class="n">Cloud</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">NDCG</span><span class="o">@</span><span class="mi">10</span><span class="p">:</span> <span class="o">~</span><span class="mi">92</span><span class="o">%</span> <span class="p">(</span><span class="mf">6.5</span><span class="o">%</span> <span class="n">pior</span> <span class="n">que</span> <span class="n">Voyage</span> <span class="mi">4</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">### OpenAI text-embedding-3-large</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="mi">3</span><span class="p">,</span><span class="mi">072</span> <span class="n">dimensões</span> <span class="p">(</span><span class="mi">40</span><span class="o">%</span> <span class="n">mais</span> <span class="n">caro</span> <span class="n">por</span> <span class="n">dimensão</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Sem</span> <span class="n">suporte</span> <span class="n">oficial</span> <span class="n">para</span> <span class="n">código</span> <span class="n">estruturado</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Rate</span> <span class="n">limiting</span> <span class="n">agressivo</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Custo</span><span class="p">:</span> <span class="err">$</span><span class="mf">0.065</span> <span class="n">por</span> <span class="mi">1</span><span class="n">M</span> <span class="n">tokens</span> <span class="p">(</span><span class="mf">3.25</span><span class="n">x</span> <span class="n">mais</span> <span class="n">caro</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">### Voyage 4</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="mi">1</span><span class="p">,</span><span class="mi">536</span> <span class="n">dimensões</span> <span class="n">otimizadas</span> <span class="p">(</span><span class="n">sweet</span> <span class="n">spot</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Treinado</span> <span class="n">especificamente</span> <span class="n">em</span> <span class="n">código</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Performance</span><span class="p">:</span> <span class="mi">50</span><span class="o">-</span><span class="mi">100</span><span class="n">ms</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Custo</span><span class="p">:</span> <span class="err">$</span><span class="mf">0.02</span> <span class="n">por</span> <span class="mi">1</span><span class="n">M</span> <span class="n">tokens</span> <span class="p">(</span><span class="n">mais</span> <span class="n">barato</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Precisão</span><span class="p">:</span> <span class="mf">98.5</span><span class="o">%</span> <span class="p">(</span><span class="n">melhor</span> <span class="n">que</span> <span class="n">todas</span> <span class="k">as</span> <span class="n">alternativas</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Multimodal</span> <span class="p">(</span><span class="n">texto</span> <span class="o">+</span> <span class="n">código</span> <span class="o">+</span> <span class="n">tokens</span> <span class="n">especiais</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">**</span><span class="n">Vectora</span> <span class="n">usa</span> <span class="n">APENAS</span> <span class="n">Voyage</span> <span class="mf">4.</span> <span class="n">Sem</span> <span class="n">fallbacks</span><span class="o">.**</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## Integração com Qdrant Cloud</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Os</span> <span class="n">embeddings</span> <span class="n">do</span> <span class="n">Voyage</span> <span class="mi">4</span> <span class="n">são</span> <span class="n">armazenados</span> <span class="n">e</span> <span class="n">indexados</span> <span class="n">no</span> <span class="o">**</span><span class="n">Qdrant</span> <span class="n">Cloud</span><span class="o">**</span><span class="p">,</span> <span class="n">que</span> <span class="n">oferece</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">### HNSW (Hierarchical Navigable Small World)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Um</span> <span class="n">algoritmo</span> <span class="n">de</span> <span class="n">busca</span> <span class="n">que</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Organiza</span> <span class="mf">1.5</span><span class="n">M</span> <span class="n">embeddings</span> <span class="n">em</span> <span class="n">estrutura</span> <span class="n">hierárquica</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Encontra</span> <span class="n">vizinhos</span> <span class="n">mais</span> <span class="n">próximos</span> <span class="n">em</span> <span class="o">&lt;</span><span class="mi">50</span><span class="n">ms</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Escalável</span> <span class="n">para</span> <span class="n">bilhões</span> <span class="n">de</span> <span class="n">vetores</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">### TurboQuant (Quantização)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Compressão</span> <span class="n">inteligente</span> <span class="n">que</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Reduz</span> <span class="mi">1</span><span class="p">,</span><span class="mi">536</span> <span class="n">dimensões</span> <span class="n">de</span> <span class="mi">32</span> <span class="n">bits</span> <span class="n">para</span> <span class="mi">8</span> <span class="n">bits</span> <span class="n">por</span> <span class="n">dimensão</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Economiza</span> <span class="mi">75</span><span class="o">%</span> <span class="n">de</span> <span class="n">armazenamento</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Reduz</span> <span class="n">latência</span> <span class="n">de</span> <span class="n">busca</span> <span class="n">em</span> <span class="mi">40</span><span class="o">%</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Mantém</span> <span class="mf">99.5</span><span class="o">%</span> <span class="n">de</span> <span class="n">precisão</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">### Payload Filtering</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Metadados</span> <span class="n">associados</span> <span class="n">a</span> <span class="n">cada</span> <span class="n">embedding</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="err">```</span><span class="n">json</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;vector&#34;</span><span class="p">:</span> <span class="p">[</span><span class="mf">0.125</span><span class="p">,</span> <span class="o">-</span><span class="mf">0.043</span><span class="p">,</span> <span class="mf">0.891</span><span class="p">,</span> <span class="o">...</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;payload&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;file&#34;</span><span class="p">:</span> <span class="s2">&#34;src/auth/validate.py&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;language&#34;</span><span class="p">:</span> <span class="s2">&#34;python&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;namespace&#34;</span><span class="p">:</span> <span class="s2">&#34;project-123&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;created_at&#34;</span><span class="p">:</span> <span class="s2">&#34;2026-04-18T10:30:00Z&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;user_id&#34;</span><span class="p">:</span> <span class="s2">&#34;user-456&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="err">```</span><span class="n">text</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Permite</span> <span class="n">filtros</span> <span class="n">como</span><span class="p">:</span> <span class="s2">&#34;buscar embeddings onde `language == &#39;typescript&#39;` AND `namespace == &#39;project-123&#39;`&#34;</span> <span class="n">em</span> <span class="n">tempo</span>
</span></span><span class="line"><span class="cl"><span class="n">real</span><span class="o">.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## Casos de Uso Concretos no Vectora</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">### Use Case 1: Bug Detection</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="err">```</span><span class="n">text</span>
</span></span><span class="line"><span class="cl"><span class="n">Entrada</span><span class="p">:</span> <span class="n">Trecho</span> <span class="n">de</span> <span class="n">código</span> <span class="n">com</span> <span class="n">possível</span> <span class="n">buffer</span> <span class="n">overflow</span>
</span></span><span class="line"><span class="cl"><span class="n">Output</span><span class="p">:</span> <span class="n">Similaridade</span> <span class="n">com</span> <span class="mi">5</span> <span class="n">padrões</span> <span class="n">conhecidos</span> <span class="n">de</span> <span class="n">vulnerabilidade</span>
</span></span><span class="line"><span class="cl"><span class="err">```</span><span class="n">text</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">O</span> <span class="n">Voyage</span> <span class="mi">4</span> <span class="n">encontra</span> <span class="n">código</span> <span class="n">historicamente</span> <span class="n">vulnerável</span> <span class="n">com</span> <span class="mi">97</span><span class="o">%</span> <span class="n">de</span> <span class="n">acurácia</span><span class="o">.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">### Use Case 2: Code Review Automation</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="err">```</span><span class="n">text</span>
</span></span><span class="line"><span class="cl"><span class="n">Entrada</span><span class="p">:</span> <span class="n">Novo</span> <span class="n">PR</span> <span class="n">com</span> <span class="mi">3</span> <span class="n">funções</span>
</span></span><span class="line"><span class="cl"><span class="n">Output</span><span class="p">:</span> <span class="s2">&#34;Função 1 segue padrão X | Função 2 tem smell Y | Função 3 é novo&#34;</span>
</span></span><span class="line"><span class="cl"><span class="err">```</span><span class="n">text</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Usa</span> <span class="n">embeddings</span> <span class="n">para</span> <span class="n">classificar</span> <span class="n">modificações</span> <span class="n">por</span> <span class="n">tipo</span><span class="o">.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">### Use Case 3: Refactoring Assistant</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="err">```</span><span class="n">text</span>
</span></span><span class="line"><span class="cl"><span class="n">Entrada</span><span class="p">:</span> <span class="s2">&#34;Simplifique este código mantendo o comportamento&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">Output</span><span class="p">:</span> <span class="mi">10</span> <span class="n">padrões</span> <span class="n">similares</span> <span class="n">de</span> <span class="n">simplificação</span> <span class="n">já</span> <span class="n">aplicados</span> <span class="n">no</span> <span class="n">projeto</span>
</span></span><span class="line"><span class="cl"><span class="err">```</span><span class="n">text</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Retrieve</span> <span class="n">by</span> <span class="n">semantic</span> <span class="n">similarity</span><span class="p">,</span> <span class="n">não</span> <span class="n">por</span> <span class="n">sintaxe</span><span class="o">.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## Performance e Otimizações</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">### Batching de Embeddings</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="err">```</span><span class="n">python</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Ruim: embedding um por um</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">file</span> <span class="ow">in</span> <span class="n">codebase</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">embedding</span> <span class="o">=</span> <span class="n">voyage</span><span class="o">.</span><span class="n">embed</span><span class="p">(</span><span class="n">file</span><span class="o">.</span><span class="n">content</span><span class="p">)</span> <span class="c1"># 50-100ms each</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Bom: batch de 100</span>
</span></span><span class="line"><span class="cl"><span class="n">batches</span> <span class="o">=</span> <span class="p">[</span><span class="n">codebase</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="n">i</span><span class="o">+</span><span class="mi">100</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">codebase</span><span class="p">),</span> <span class="mi">100</span><span class="p">)]</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">batch</span> <span class="ow">in</span> <span class="n">batches</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">embeddings</span> <span class="o">=</span> <span class="n">voyage</span><span class="o">.</span><span class="n">embed</span><span class="p">([</span><span class="n">f</span><span class="o">.</span><span class="n">content</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">batch</span><span class="p">])</span> <span class="c1"># 50-100ms for all 100</span>
</span></span><span class="line"><span class="cl"><span class="err">```</span><span class="n">text</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Batching</span> <span class="n">reduz</span> <span class="n">latência</span> <span class="n">total</span> <span class="n">de</span> <span class="n">horas</span> <span class="n">para</span> <span class="n">minutos</span><span class="o">.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">### Caching de Embeddings</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="err">```</span><span class="n">python</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Cache em Qdrant: &#34;Já tenho embedding para hash SHA-256 abc123def456?&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Sim? Retorna do cache (~5ms)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Não? Gera novo (~75ms) + salva no cache</span>
</span></span><span class="line"><span class="cl"><span class="err">```</span><span class="n">text</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Em</span> <span class="n">projetos</span> <span class="n">grandes</span><span class="p">,</span> <span class="mi">70</span><span class="o">-</span><span class="mi">80</span><span class="o">%</span> <span class="n">dos</span> <span class="n">embeddings</span> <span class="n">já</span> <span class="n">estão</span> <span class="n">em</span> <span class="n">cache</span><span class="o">.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">### Recompressão Periódica</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">A</span> <span class="n">quantização</span> <span class="n">TurboQuant</span> <span class="n">é</span> <span class="n">aplicada</span> <span class="n">durante</span> <span class="n">indexação</span><span class="o">.</span> <span class="n">Periodicamente</span> <span class="p">(</span><span class="n">a</span> <span class="n">cada</span> <span class="mi">1</span><span class="n">M</span> <span class="n">novos</span> <span class="n">embeddings</span><span class="p">),</span> <span class="n">o</span> <span class="n">Qdrant</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Recomputa</span> <span class="n">compressão</span> <span class="n">ótima</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Rebalanceia</span> <span class="n">índice</span> <span class="n">HNSW</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Garante</span> <span class="n">performance</span> <span class="o">&lt;</span><span class="mi">50</span><span class="n">ms</span> <span class="n">mesmo</span> <span class="n">com</span> <span class="n">escala</span> <span class="n">máxima</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## Comparação de Precisão</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Em</span> <span class="n">benchmark</span> <span class="n">com</span> <span class="mi">10</span><span class="n">K</span> <span class="n">documentos</span> <span class="n">de</span> <span class="n">código</span> <span class="n">real</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">|</span> <span class="n">Modelo</span> <span class="o">|</span> <span class="n">NDCG</span><span class="o">@</span><span class="mi">10</span> <span class="o">|</span> <span class="n">MRR</span> <span class="o">|</span> <span class="n">Recall</span><span class="o">@</span><span class="mi">100</span> <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="o">|</span> <span class="o">-----------------------------</span> <span class="o">|</span> <span class="o">---------</span> <span class="o">|</span> <span class="o">---------</span> <span class="o">|</span> <span class="o">----------</span> <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="o">|</span> <span class="n">Voyage</span> <span class="mi">4</span> <span class="o">|</span> <span class="o">**</span><span class="mf">98.5</span><span class="o">%**</span> <span class="o">|</span> <span class="o">**</span><span class="mf">0.936</span><span class="o">**</span> <span class="o">|</span> <span class="o">**</span><span class="mf">99.2</span><span class="o">%**</span> <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="o">|</span> <span class="n">Voyage</span> <span class="mi">3</span><span class="o">-</span><span class="n">large</span> <span class="o">|</span> <span class="mf">92.1</span><span class="o">%</span> <span class="o">|</span> <span class="mf">0.891</span> <span class="o">|</span> <span class="mf">97.5</span><span class="o">%</span> <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="o">|</span> <span class="n">Gemini</span> <span class="n">Embedding</span> <span class="mf">2.0</span> <span class="o">|</span> <span class="mf">92.0</span><span class="o">%</span> <span class="o">|</span> <span class="mf">0.884</span> <span class="o">|</span> <span class="mf">97.2</span><span class="o">%</span> <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="o">|</span> <span class="n">OpenAI</span> <span class="n">text</span><span class="o">-</span><span class="n">embedding</span><span class="o">-</span><span class="mi">3</span><span class="o">-</span><span class="n">large</span> <span class="o">|</span> <span class="mf">95.3</span><span class="o">%</span> <span class="o">|</span> <span class="mf">0.914</span> <span class="o">|</span> <span class="mf">98.8</span><span class="o">%</span> <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="o">|</span> <span class="n">Semantic</span> <span class="n">Scholar</span> <span class="p">(</span><span class="n">genérico</span><span class="p">)</span> <span class="o">|</span> <span class="mf">78.4</span><span class="o">%</span> <span class="o">|</span> <span class="mf">0.721</span> <span class="o">|</span> <span class="mf">91.3</span><span class="o">%</span> <span class="o">|</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Voyage</span> <span class="mi">4</span> <span class="n">não</span> <span class="n">é</span> <span class="n">apenas</span> <span class="n">melhor</span> <span class="err">—</span> <span class="n">é</span> <span class="o">**</span><span class="n">significativamente</span> <span class="n">melhor</span><span class="o">**</span> <span class="n">em</span> <span class="n">tarefas</span> <span class="n">de</span> <span class="n">código</span><span class="o">.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## Limitações Conhecidas</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="mf">1.</span> <span class="o">**</span><span class="n">Não</span> <span class="n">suporta</span> <span class="n">tokens</span> <span class="n">especiais</span> <span class="n">custom</span><span class="o">**</span><span class="p">:</span> <span class="n">Se</span> <span class="n">você</span> <span class="n">quer</span> <span class="n">treinar</span> <span class="n">seu</span> <span class="n">próprio</span> <span class="n">vocabulário</span><span class="p">,</span> <span class="n">não</span> <span class="n">é</span> <span class="n">possível</span> <span class="n">fine</span><span class="o">-</span><span class="n">tune</span>
</span></span><span class="line"><span class="cl"><span class="mf">2.</span> <span class="o">**</span><span class="n">Dimensionalidade</span> <span class="n">fixa</span><span class="o">**</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span><span class="mi">536</span> <span class="n">dimensões</span> <span class="n">não</span> <span class="n">podem</span> <span class="n">ser</span> <span class="n">reduzidas</span>
</span></span><span class="line"><span class="cl"><span class="mf">3.</span> <span class="o">**</span><span class="n">Sem</span> <span class="n">embeddings</span> <span class="n">dinâmicos</span><span class="o">**</span><span class="p">:</span> <span class="n">Uma</span> <span class="n">mesma</span> <span class="n">query</span> <span class="n">sempre</span> <span class="n">gera</span> <span class="n">o</span> <span class="n">mesmo</span> <span class="n">embedding</span> <span class="p">(</span><span class="n">determinístico</span><span class="p">,</span> <span class="n">o</span> <span class="n">que</span> <span class="n">é</span> <span class="n">bom</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="mf">4.</span> <span class="o">**</span><span class="n">Custo</span> <span class="n">de</span> <span class="n">re</span><span class="o">-</span><span class="n">embedding</span><span class="o">**</span><span class="p">:</span> <span class="n">Se</span> <span class="n">você</span> <span class="n">mudar</span> <span class="n">um</span> <span class="n">arquivo</span><span class="p">,</span> <span class="n">precisa</span> <span class="n">re</span><span class="o">-</span><span class="n">gerar</span> <span class="n">o</span> <span class="n">embedding</span> <span class="p">(</span><span class="o">~</span><span class="err">$</span><span class="mf">0.00002</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## Próximos Passos</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="mf">1.</span> <span class="p">[</span><span class="n">Setup</span> <span class="n">Vectora</span><span class="p">](</span><span class="o">../</span><span class="n">getting</span><span class="o">-</span><span class="n">started</span><span class="o">/</span><span class="p">)</span> <span class="n">com</span> <span class="n">sua</span> <span class="n">chave</span> <span class="n">Voyage</span> <span class="n">API</span>
</span></span><span class="line"><span class="cl"><span class="mf">2.</span> <span class="n">Entenda</span> <span class="n">como</span> <span class="n">o</span> <span class="p">[</span><span class="n">Reranker</span> <span class="n">Voyage</span> <span class="mf">2.5</span><span class="p">](</span><span class="o">./</span><span class="n">reranker</span><span class="p">)</span> <span class="n">complementa</span> <span class="n">estes</span> <span class="n">embeddings</span>
</span></span><span class="line"><span class="cl"><span class="mf">3.</span> <span class="n">Explore</span> <span class="p">[</span><span class="n">RAG</span> <span class="n">Conectado</span><span class="p">](</span><span class="o">./</span><span class="n">rag</span><span class="p">)</span> <span class="err">—</span> <span class="n">como</span> <span class="n">os</span> <span class="n">embeddings</span> <span class="n">são</span> <span class="n">usados</span> <span class="n">no</span> <span class="n">contexto</span> <span class="n">completo</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">---</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">_Este</span> <span class="n">é</span> <span class="n">um</span> <span class="n">guia</span> <span class="n">técnico</span> <span class="n">do</span> <span class="n">projeto</span> <span class="p">[</span><span class="n">Vectora</span><span class="p">](</span><span class="o">/</span><span class="n">docs</span><span class="o">/</span><span class="n">vectora</span><span class="o">/</span><span class="p">)</span><span class="o">.</span> <span class="n">Especificamente</span> <span class="n">sobre</span> <span class="n">embeddings</span> <span class="n">com</span> <span class="n">Voyage</span> <span class="mf">4.</span><span class="n">_</span>
</span></span><span class="line"><span class="cl"><span class="err">````</span><span class="n">text</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
]]></content:encoded><category>ai</category><category>architecture</category><category>concepts</category><category>código</category><category>embeddings</category><category>geração</category><category>mcp</category><category>próxima</category><category>rag</category><category>reranker</category><category>vector-search</category><category>vectora</category><category>voyage</category></item><item><title>Tutorial: Sistema de Buff/Debuff</title><link>https://cafegame.dev/docs/ability-system/tutorials/buffs/</link><guid isPermaLink="true">https://cafegame.dev/docs/ability-system/tutorials/buffs/</guid><pubDate>Sat, 18 Apr 2026 22:30:00 GMT</pubDate><description>&lt;div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
&lt;a href="https://cafegame.dev/docs/ability-system/tutorials/buffs/"
class="lang-toggle-link lang-toggle-active"
data-lang="pt"
onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT&lt;/a>
&lt;span class="hx:mx-1">|&lt;/span>
&lt;a href="https://cafegame.dev/en/docs/ability-system/tutorials/buffs/"
class="lang-toggle-link"
data-lang="en"
onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN&lt;/a>
&lt;/div>
&lt;style>
.lang-toggle-link {
text-decoration: none;
color: #6b7280;
font-weight: 500;
}
.lang-toggle-link:hover { color: #3b82f6; }
.lang-toggle-active {
color: #1f2937;
font-weight: 700;
border-bottom: 1px solid currentColor;
}
.dark .lang-toggle-active { color: #f3f4f6; }
&lt;/style>
&lt;p>Aprenda a criar modificadores temporários que afetam personagens no &lt;strong>Ability System&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Tempo:&lt;/strong> ~10 minutos | &lt;strong>Nível:&lt;/strong> Intermediário&lt;/p>
&lt;h2>Conceito&lt;span class="hx:absolute hx:-mt-20" id="conceito">&lt;/span>
&lt;a href="#conceito" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>&lt;strong>Buff:&lt;/strong> Efeito positivo temporário (ex: aumenta dano)
&lt;strong>Debuff:&lt;/strong> Efeito negativo temporário (ex: reduz velocidade)&lt;/p></description><content:encoded><![CDATA[<div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
    <a href="/docs/ability-system/tutorials/buffs/"
       class="lang-toggle-link lang-toggle-active"
       data-lang="pt"
       onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT</a>
    <span class="hx:mx-1">|</span>
    <a href="/en/docs/ability-system/tutorials/buffs/"
       class="lang-toggle-link"
       data-lang="en"
       onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN</a>
  </div>

  <style>
    .lang-toggle-link {
      text-decoration: none;
      color: #6b7280;
      font-weight: 500;
    }
    .lang-toggle-link:hover { color: #3b82f6; }
    .lang-toggle-active {
      color: #1f2937;
      font-weight: 700;
      border-bottom: 1px solid currentColor;
    }
    .dark .lang-toggle-active { color: #f3f4f6; }
  </style>
<p>Aprenda a criar modificadores temporários que afetam personagens no <strong>Ability System</strong>.</p>
<p><strong>Tempo:</strong> ~10 minutos | <strong>Nível:</strong> Intermediário</p>
<h2>Conceito<span class="hx:absolute hx:-mt-20" id="conceito"></span>
    <a href="#conceito" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p><strong>Buff:</strong> Efeito positivo temporário (ex: aumenta dano)
<strong>Debuff:</strong> Efeito negativo temporário (ex: reduz velocidade)</p>
<p>Ambos são <code>ASEffect</code> com duração.</p>
<h2>Passo 1: Criar Tags de Status<span class="hx:absolute hx:-mt-20" id="passo-1-criar-tags-de-status"></span>
    <a href="#passo-1-criar-tags-de-status" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Abra <strong>Project Settings → Ability System</strong> e crie:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="n">state</span><span class="o">.</span><span class="n">empowered</span> <span class="p">(</span><span class="n">CONDITIONAL</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">state</span><span class="o">.</span><span class="n">slowed</span> <span class="p">(</span><span class="n">CONDITIONAL</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">state</span><span class="o">.</span><span class="n">burning</span> <span class="p">(</span><span class="n">CONDITIONAL</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">state</span><span class="o">.</span><span class="n">frozen</span> <span class="p">(</span><span class="n">CONDITIONAL</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">effect</span><span class="o">.</span><span class="n">empower</span> <span class="p">(</span><span class="n">NAME</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">effect</span><span class="o">.</span><span class="n">slow</span> <span class="p">(</span><span class="n">NAME</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">effect</span><span class="o">.</span><span class="n">burn</span> <span class="p">(</span><span class="n">NAME</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">effect</span><span class="o">.</span><span class="n">freeze</span> <span class="p">(</span><span class="n">NAME</span><span class="p">)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>Passo 2: Criar ASEffect de Buff<span class="hx:absolute hx:-mt-20" id="passo-2-criar-aseffect-de-buff"></span>
    <a href="#passo-2-criar-aseffect-de-buff" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>New Resource → <strong>ASEffect</strong></p>
<p>Salve como <code>res://assets/effects/empower.tres</code></p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="n">effect_tag</span><span class="p">:</span> <span class="o">&amp;</span><span class="s2">&#34;effect.empower&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">duration_policy</span><span class="p">:</span> <span class="mi">1</span> <span class="p">(</span><span class="n">DURATION</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">duration_magnitude</span><span class="p">:</span> <span class="mf">5.0</span>
</span></span><span class="line"><span class="cl"><span class="n">target_type</span><span class="p">:</span> <span class="mi">0</span> <span class="p">(</span><span class="n">SELF</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">granted_tags</span><span class="p">:</span> <span class="p">[</span><span class="o">&amp;</span><span class="s2">&#34;state.empowered&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">removed_tags</span><span class="p">:</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl"><span class="n">modifiers</span><span class="p">:</span> <span class="p">(</span><span class="mi">1</span> <span class="n">elemento</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="p">[</span><span class="mi">0</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">    <span class="n">attribute</span><span class="p">:</span> <span class="o">&amp;</span><span class="s2">&#34;damage&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">operation</span><span class="p">:</span> <span class="mi">1</span> <span class="p">(</span><span class="n">MULTIPLY</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">magnitude</span><span class="p">:</span> <span class="mf">1.5</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p><strong>Resultado:</strong> Aumenta dano em 50% por 5 segundos.</p>
<h2>Passo 3: Criar ASEffect de Debuff<span class="hx:absolute hx:-mt-20" id="passo-3-criar-aseffect-de-debuff"></span>
    <a href="#passo-3-criar-aseffect-de-debuff" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>New Resource → <strong>ASEffect</strong></p>
<p>Salve como <code>res://assets/effects/slow.tres</code></p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="n">effect_tag</span><span class="p">:</span> <span class="o">&amp;</span><span class="s2">&#34;effect.slow&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">duration_policy</span><span class="p">:</span> <span class="mi">1</span> <span class="p">(</span><span class="n">DURATION</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">duration_magnitude</span><span class="p">:</span> <span class="mf">3.0</span>
</span></span><span class="line"><span class="cl"><span class="n">target_type</span><span class="p">:</span> <span class="mi">1</span> <span class="p">(</span><span class="n">OTHERS</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">granted_tags</span><span class="p">:</span> <span class="p">[</span><span class="o">&amp;</span><span class="s2">&#34;state.slowed&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">removed_tags</span><span class="p">:</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl"><span class="n">modifiers</span><span class="p">:</span> <span class="p">(</span><span class="mi">1</span> <span class="n">elemento</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="p">[</span><span class="mi">0</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">    <span class="n">attribute</span><span class="p">:</span> <span class="o">&amp;</span><span class="s2">&#34;movement_speed&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">operation</span><span class="p">:</span> <span class="mi">0</span> <span class="p">(</span><span class="n">ADD</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">magnitude</span><span class="p">:</span> <span class="o">-</span><span class="mf">3.0</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p><strong>Resultado:</strong> Reduz velocidade em 3.0 por 3 segundos.</p>
<h2>Passo 4: Aplicar Buff<span class="hx:absolute hx:-mt-20" id="passo-4-aplicar-buff"></span>
    <a href="#passo-4-aplicar-buff" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="c1"># Em Player.gd</span>
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">use_empower</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="nf">apply_effect_by_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;effect.empower&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Empowered!&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_process</span><span class="p">(</span><span class="n">_delta</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">asc</span><span class="o">.</span><span class="nf">has_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;state.empowered&#34;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="n">remaining_duration</span> <span class="o">=</span> <span class="c1"># calcular</span>
</span></span><span class="line"><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Empowered para mais </span><span class="si">%.1f</span><span class="s2"> segundos&#34;</span> <span class="o">%</span> <span class="n">remaining_duration</span><span class="p">)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>Passo 5: Aplicar Debuff a Inimigo<span class="hx:absolute hx:-mt-20" id="passo-5-aplicar-debuff-a-inimigo"></span>
    <a href="#passo-5-aplicar-debuff-a-inimigo" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="c1"># Quando player ataca inimigo</span>
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">use_ability</span><span class="p">(</span><span class="n">ability_tag</span><span class="p">:</span> <span class="nc">StringName</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">asc</span><span class="o">.</span><span class="nf">try_activate_ability_by_tag</span><span class="p">(</span><span class="n">ability_tag</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># Aplicar slow ao inimigo</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">ability_tag</span> <span class="o">==</span> <span class="o">&amp;</span><span class="s2">&#34;ability.ice_bolt&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="kd">var</span> <span class="n">enemy_asc</span> <span class="o">=</span> <span class="n">AbilitySystem</span><span class="o">.</span><span class="nf">resolve_component</span><span class="p">(</span><span class="n">enemy</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">asc</span><span class="o">.</span><span class="nf">apply_effect_by_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;effect.slow&#34;</span><span class="p">,</span> <span class="n">enemy_asc</span><span class="p">)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>Passo 6: Debuff Contínuo (DoT)<span class="hx:absolute hx:-mt-20" id="passo-6-debuff-contínuo-dot"></span>
    <a href="#passo-6-debuff-cont%c3%adnuo-dot" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>New Resource → <strong>ASEffect</strong></p>
<p>Salve como <code>res://assets/effects/burning.tres</code></p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="n">effect_tag</span><span class="p">:</span> <span class="o">&amp;</span><span class="s2">&#34;effect.burning&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">duration_policy</span><span class="p">:</span> <span class="mi">1</span> <span class="p">(</span><span class="n">DURATION</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">duration_magnitude</span><span class="p">:</span> <span class="mf">5.0</span>
</span></span><span class="line"><span class="cl"><span class="n">period</span><span class="p">:</span> <span class="mf">1.0</span>
</span></span><span class="line"><span class="cl"><span class="n">execute_periodic_tick_on_application</span><span class="p">:</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl"><span class="n">target_type</span><span class="p">:</span> <span class="mi">1</span> <span class="p">(</span><span class="n">OTHERS</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">granted_tags</span><span class="p">:</span> <span class="p">[</span><span class="o">&amp;</span><span class="s2">&#34;state.burning&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">modifiers</span><span class="p">:</span> <span class="p">(</span><span class="mi">1</span> <span class="n">elemento</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="p">[</span><span class="mi">0</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">    <span class="n">attribute</span><span class="p">:</span> <span class="o">&amp;</span><span class="s2">&#34;health&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">operation</span><span class="p">:</span> <span class="mi">0</span> <span class="p">(</span><span class="n">ADD</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">magnitude</span><span class="p">:</span> <span class="o">-</span><span class="mf">10.0</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p><strong>Resultado:</strong> -10 HP a cada 1 segundo por 5 segundos (total -50 HP).</p>
<h2>Passo 7: Visualizar Buffs<span class="hx:absolute hx:-mt-20" id="passo-7-visualizar-buffs"></span>
    <a href="#passo-7-visualizar-buffs" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">update_buff_ui</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">all_effects</span> <span class="o">=</span> <span class="n">asc</span><span class="o">.</span><span class="nf">get_all_effect_specs</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">effect_spec</span> <span class="ow">in</span> <span class="n">all_effects</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="n">effect</span> <span class="o">=</span> <span class="n">effect_spec</span><span class="o">.</span><span class="nf">get_effect</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="n">remaining</span> <span class="o">=</span> <span class="n">effect_spec</span><span class="o">.</span><span class="nf">get_duration_remaining</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="n">label</span> <span class="o">=</span> <span class="nc">Label</span><span class="o">.</span><span class="nf">new</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="n">label</span><span class="o">.</span><span class="n">text</span> <span class="o">=</span> <span class="s2">&#34;</span><span class="si">%s</span><span class="s2"> (</span><span class="si">%.1f</span><span class="s2">)&#34;</span> <span class="o">%</span> <span class="p">[</span><span class="n">effect</span><span class="o">.</span><span class="n">effect_tag</span><span class="p">,</span> <span class="n">remaining</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">effect</span><span class="o">.</span><span class="n">effect_tag</span><span class="o">.</span><span class="nf">begins_with</span><span class="p">(</span><span class="s2">&#34;effect.empower&#34;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">            <span class="n">label</span><span class="o">.</span><span class="n">modulate</span> <span class="o">=</span> <span class="nc">Color</span><span class="o">.</span><span class="n">YELLOW</span>
</span></span><span class="line"><span class="cl">        <span class="k">elif</span> <span class="n">effect</span><span class="o">.</span><span class="n">effect_tag</span><span class="o">.</span><span class="nf">begins_with</span><span class="p">(</span><span class="s2">&#34;effect.slow&#34;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">            <span class="n">label</span><span class="o">.</span><span class="n">modulate</span> <span class="o">=</span> <span class="nc">Color</span><span class="o">.</span><span class="n">BLUE</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">buff_container</span><span class="o">.</span><span class="nf">add_child</span><span class="p">(</span><span class="n">label</span><span class="p">)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>Passo 8: Immunidade<span class="hx:absolute hx:-mt-20" id="passo-8-immunidade"></span>
    <a href="#passo-8-immunidade" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Previne que efeitos sejam aplicados:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="c1"># Em ASAbility ou ASEffect:</span>
</span></span><span class="line"><span class="cl"><span class="n">activation_blocked_any_tags</span><span class="p">:</span> <span class="p">[</span><span class="o">&amp;</span><span class="s2">&#34;immune.fire&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Quando aplicar efeito:</span>
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">apply_effect_to_target</span><span class="p">(</span><span class="n">effect</span><span class="p">,</span> <span class="n">target_asc</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">target_asc</span><span class="o">.</span><span class="nf">has_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;immune.fire&#34;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">effect</span><span class="o">.</span><span class="n">effect_tag</span><span class="o">.</span><span class="nf">begins_with</span><span class="p">(</span><span class="s2">&#34;effect.burn&#34;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">            <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Target é imune a burning!&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">target_asc</span><span class="o">.</span><span class="nf">apply_effect_by_tag</span><span class="p">(</span><span class="n">effect</span><span class="o">.</span><span class="n">effect_tag</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>Passo 9: Cleanup Automático<span class="hx:absolute hx:-mt-20" id="passo-9-cleanup-automático"></span>
    <a href="#passo-9-cleanup-autom%c3%a1tico" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>ASComponent cuida de remover buffs quando expiram:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_process</span><span class="p">(</span><span class="n">_delta</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># ASComponent remove automaticamente efeitos expirados</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># Você pode escutar:</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="n">effect_removed</span><span class="o">.</span><span class="nf">connect</span><span class="p">(</span><span class="n">_on_effect_removed</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_on_effect_removed</span><span class="p">(</span><span class="n">effect_spec</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">effect_tag</span> <span class="o">=</span> <span class="n">effect_spec</span><span class="o">.</span><span class="nf">get_effect</span><span class="p">()</span><span class="o">.</span><span class="n">effect_tag</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Efeito removido: &#34;</span><span class="p">,</span> <span class="n">effect_tag</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">effect_tag</span> <span class="o">==</span> <span class="o">&amp;</span><span class="s2">&#34;effect.empower&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Empowered finalizou!&#34;</span><span class="p">)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>Casos de Uso Avançados<span class="hx:absolute hx:-mt-20" id="casos-de-uso-avançados"></span>
    <a href="#casos-de-uso-avan%c3%a7ados" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>1. Buff Stacking<span class="hx:absolute hx:-mt-20" id="1-buff-stacking"></span>
    <a href="#1-buff-stacking" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="c1"># Aplicar empower 3 vezes = 1.5x * 1.5x * 1.5x = 3.375x damage</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">3</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="nf">apply_effect_by_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;effect.empower&#34;</span><span class="p">)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h3>2. Conflicting Effects<span class="hx:absolute hx:-mt-20" id="2-conflicting-effects"></span>
    <a href="#2-conflicting-effects" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="c1"># Congelamento remove burning</span>
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">apply_freeze</span><span class="p">(</span><span class="n">target_asc</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">target_asc</span><span class="o">.</span><span class="nf">apply_effect_by_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;effect.freeze&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Em ASEffect de freeze:</span>
</span></span><span class="line"><span class="cl"><span class="n">removed_tags</span><span class="p">:</span> <span class="p">[</span><span class="o">&amp;</span><span class="s2">&#34;state.burning&#34;</span><span class="p">]</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h3>3. Buff que Concede Ability<span class="hx:absolute hx:-mt-20" id="3-buff-que-concede-ability"></span>
    <a href="#3-buff-que-concede-ability" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="c1"># Effect concede nova ability temporariamente</span>
</span></span><span class="line"><span class="cl"><span class="n">effect</span><span class="o">.</span><span class="n">granted_tags</span><span class="p">:</span> <span class="p">[</span><span class="o">&amp;</span><span class="s2">&#34;ability.enhanced_strike&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Quando buff expira, ability desaparece</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h3>4. Escalonamento de Buff por Nível<span class="hx:absolute hx:-mt-20" id="4-escalonamento-de-buff-por-nível"></span>
    <a href="#4-escalonamento-de-buff-por-n%c3%advel" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">apply_buff_scaled</span><span class="p">(</span><span class="n">level</span><span class="p">:</span> <span class="kt">float</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">damage_boost</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="o">+</span> <span class="p">(</span><span class="n">level</span> <span class="o">*</span> <span class="mf">0.1</span><span class="p">)</span> <span class="c1"># +10% por nível</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="nf">apply_effect_by_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;effect.empower&#34;</span><span class="p">,</span> <span class="n">level</span><span class="p">)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>Checklist<span class="hx:absolute hx:-mt-20" id="checklist"></span>
    <a href="#checklist" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ul>
<li><input disabled="" type="checkbox"> Criar tags de status</li>
<li><input disabled="" type="checkbox"> Criar 1-2 buffs básicos</li>
<li><input disabled="" type="checkbox"> Criar 1-2 debuffs básicos</li>
<li><input disabled="" type="checkbox"> Aplicar a jogador</li>
<li><input disabled="" type="checkbox"> Aplicar a inimigo</li>
<li><input disabled="" type="checkbox"> Implementar DoT</li>
<li><input disabled="" type="checkbox"> UI de status ativo</li>
<li><input disabled="" type="checkbox"> Remover ao expirar</li>
<li><input disabled="" type="checkbox"> Debugar duração</li>
</ul>
<hr>
<p><strong>Próximo:</strong> <a href="../guides/guide-multiplayer">Guia de Multiplayer</a></p>
]]></content:encoded><category>zyris-engine</category><category>godot-plugin</category><category>ability-system</category><category>gamedev</category><category>tutorial</category></item><item><title>Tutorial: Primeiro Ataque</title><link>https://cafegame.dev/docs/ability-system/tutorials/first-attack/</link><guid isPermaLink="true">https://cafegame.dev/docs/ability-system/tutorials/first-attack/</guid><pubDate>Sat, 18 Apr 2026 22:30:00 GMT</pubDate><description>&lt;div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
&lt;a href="https://cafegame.dev/docs/ability-system/tutorials/first-attack/"
class="lang-toggle-link lang-toggle-active"
data-lang="pt"
onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT&lt;/a>
&lt;span class="hx:mx-1">|&lt;/span>
&lt;a href="https://cafegame.dev/en/docs/ability-system/tutorials/first-attack/"
class="lang-toggle-link"
data-lang="en"
onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN&lt;/a>
&lt;/div>
&lt;style>
.lang-toggle-link {
text-decoration: none;
color: #6b7280;
font-weight: 500;
}
.lang-toggle-link:hover { color: #3b82f6; }
.lang-toggle-active {
color: #1f2937;
font-weight: 700;
border-bottom: 1px solid currentColor;
}
.dark .lang-toggle-active { color: #f3f4f6; }
&lt;/style>
&lt;p>Passo a passo para criar sua primeira habilidade de combate funcional no &lt;strong>Ability System&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Tempo:&lt;/strong> ~15 minutos | &lt;strong>Nível:&lt;/strong> Iniciante&lt;/p>
&lt;h2>Passo 1: Criar o Resource da Habilidade&lt;span class="hx:absolute hx:-mt-20" id="passo-1-criar-o-resource-da-habilidade">&lt;/span>
&lt;a href="#passo-1-criar-o-resource-da-habilidade" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ol>
&lt;li>Crie uma pasta &lt;code>res://combat/abilities/&lt;/code>.&lt;/li>
&lt;li>Clique com o botão direito → &lt;strong>New Resource → ASAbility&lt;/strong>.&lt;/li>
&lt;li>Salve como &lt;code>basic_attack.tres&lt;/code>.&lt;/li>
&lt;/ol>
&lt;h2>Passo 2: Configurar Tags de Ativação&lt;span class="hx:absolute hx:-mt-20" id="passo-2-configurar-tags-de-ativação">&lt;/span>
&lt;a href="#passo-2-configurar-tags-de-ativa%c3%a7%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>No inspetor do seu novo resource, procure pela seção &lt;strong>Tags&lt;/strong>:&lt;/p></description><content:encoded><![CDATA[<div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
    <a href="/docs/ability-system/tutorials/first-attack/"
       class="lang-toggle-link lang-toggle-active"
       data-lang="pt"
       onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT</a>
    <span class="hx:mx-1">|</span>
    <a href="/en/docs/ability-system/tutorials/first-attack/"
       class="lang-toggle-link"
       data-lang="en"
       onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN</a>
  </div>

  <style>
    .lang-toggle-link {
      text-decoration: none;
      color: #6b7280;
      font-weight: 500;
    }
    .lang-toggle-link:hover { color: #3b82f6; }
    .lang-toggle-active {
      color: #1f2937;
      font-weight: 700;
      border-bottom: 1px solid currentColor;
    }
    .dark .lang-toggle-active { color: #f3f4f6; }
  </style>
<p>Passo a passo para criar sua primeira habilidade de combate funcional no <strong>Ability System</strong>.</p>
<p><strong>Tempo:</strong> ~15 minutos | <strong>Nível:</strong> Iniciante</p>
<h2>Passo 1: Criar o Resource da Habilidade<span class="hx:absolute hx:-mt-20" id="passo-1-criar-o-resource-da-habilidade"></span>
    <a href="#passo-1-criar-o-resource-da-habilidade" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol>
<li>Crie uma pasta <code>res://combat/abilities/</code>.</li>
<li>Clique com o botão direito → <strong>New Resource → ASAbility</strong>.</li>
<li>Salve como <code>basic_attack.tres</code>.</li>
</ol>
<h2>Passo 2: Configurar Tags de Ativação<span class="hx:absolute hx:-mt-20" id="passo-2-configurar-tags-de-ativação"></span>
    <a href="#passo-2-configurar-tags-de-ativa%c3%a7%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>No inspetor do seu novo resource, procure pela seção <strong>Tags</strong>:</p>
<ul>
<li><strong>Ability Tag:</strong> <code>&amp;&quot;ability.basic_attack&quot;</code></li>
<li><strong>Activation Owned Tags:</strong> <code>[&amp;&quot;state.attacking&quot;]</code> (Isso impede que outras habilidades usem o personagem enquanto ataca).</li>
</ul>
<h2>Passo 3: Criar o Efeito de Dano<span class="hx:absolute hx:-mt-20" id="passo-3-criar-o-efeito-de-dano"></span>
    <a href="#passo-3-criar-o-efeito-de-dano" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Habilidades no <strong>Ability System</strong> geralmente causam efeitos (<code>ASEffect</code>).</p>
<ol>
<li>Crie um novo <strong>ASEffect</strong> em <code>res://combat/effects/damage_basic.tres</code>.</li>
<li>Configure os <strong>Modifiers</strong>:
<ul>
<li><strong>Attribute:</strong> <code>&amp;&quot;health&quot;</code></li>
<li><strong>Operation:</strong> <code>0 (ADD)</code></li>
<li><strong>Magnitude:</strong> <code>-10.0</code></li>
</ul>
</li>
</ol>
<h2>Passo 4: Vincular o Efeito à Habilidade<span class="hx:absolute hx:-mt-20" id="passo-4-vincular-o-efeito-à-habilidade"></span>
    <a href="#passo-4-vincular-o-efeito-%c3%a0-habilidade" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Volte ao resource <code>basic_attack.tres</code>:</p>
<ol>
<li>Adicione um item ao array <strong>Application Effects</strong>.</li>
<li>Arraste o arquivo <code>damage_basic.tres</code> para lá.</li>
</ol>
<h2>Passo 5: Chamar via Código<span class="hx:absolute hx:-mt-20" id="passo-5-chamar-via-código"></span>
    <a href="#passo-5-chamar-via-c%c3%b3digo" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>No seu script do Personagem:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_input</span><span class="p">(</span><span class="n">event</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="nf">is_action_pressed</span><span class="p">(</span><span class="s2">&#34;attack&#34;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">asc</span><span class="o">.</span><span class="nf">try_activate_ability_by_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;ability.basic_attack&#34;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">            <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Ataque iniciado!&#34;</span><span class="p">)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>Conclusão<span class="hx:absolute hx:-mt-20" id="conclusão"></span>
    <a href="#conclus%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Você acaba de criar o fluxo completo: Entrada → Ativação de Habilidade → Aplicação de Efeito.</p>
<hr>
<p><strong>Explorar mais:</strong> <a href="buffs">Tutorial: Buffs e Debuffs</a></p>
]]></content:encoded><category>zyris-engine</category><category>godot-plugin</category><category>ability-system</category><category>gamedev</category><category>tutorial</category></item><item><title>Tutorial: Fases de Habilidade</title><link>https://cafegame.dev/docs/ability-system/tutorials/phases/</link><guid isPermaLink="true">https://cafegame.dev/docs/ability-system/tutorials/phases/</guid><pubDate>Sat, 18 Apr 2026 22:30:00 GMT</pubDate><description>&lt;div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
&lt;a href="https://cafegame.dev/docs/ability-system/tutorials/phases/"
class="lang-toggle-link lang-toggle-active"
data-lang="pt"
onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT&lt;/a>
&lt;span class="hx:mx-1">|&lt;/span>
&lt;a href="https://cafegame.dev/en/docs/ability-system/tutorials/phases/"
class="lang-toggle-link"
data-lang="en"
onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN&lt;/a>
&lt;/div>
&lt;style>
.lang-toggle-link {
text-decoration: none;
color: #6b7280;
font-weight: 500;
}
.lang-toggle-link:hover { color: #3b82f6; }
.lang-toggle-active {
color: #1f2937;
font-weight: 700;
border-bottom: 1px solid currentColor;
}
.dark .lang-toggle-active { color: #f3f4f6; }
&lt;/style>
&lt;p>Aprenda a criar habilidades complexas com múltiplas fases (Casting, Active, Recovery) no &lt;strong>Ability System&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Tempo:&lt;/strong> ~15 minutos | &lt;strong>Nível:&lt;/strong> Avançado&lt;/p>
&lt;h2>O que são Fases?&lt;span class="hx:absolute hx:-mt-20" id="o-que-são-fases">&lt;/span>
&lt;a href="#o-que-s%c3%a3o-fases" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Fases permitem dividir uma habilidade em etapas temporais, cada uma com seu próprio comportamento:&lt;/p></description><content:encoded><![CDATA[<div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
    <a href="/docs/ability-system/tutorials/phases/"
       class="lang-toggle-link lang-toggle-active"
       data-lang="pt"
       onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT</a>
    <span class="hx:mx-1">|</span>
    <a href="/en/docs/ability-system/tutorials/phases/"
       class="lang-toggle-link"
       data-lang="en"
       onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN</a>
  </div>

  <style>
    .lang-toggle-link {
      text-decoration: none;
      color: #6b7280;
      font-weight: 500;
    }
    .lang-toggle-link:hover { color: #3b82f6; }
    .lang-toggle-active {
      color: #1f2937;
      font-weight: 700;
      border-bottom: 1px solid currentColor;
    }
    .dark .lang-toggle-active { color: #f3f4f6; }
  </style>
<p>Aprenda a criar habilidades complexas com múltiplas fases (Casting, Active, Recovery) no <strong>Ability System</strong>.</p>
<p><strong>Tempo:</strong> ~15 minutos | <strong>Nível:</strong> Avançado</p>
<h2>O que são Fases?<span class="hx:absolute hx:-mt-20" id="o-que-são-fases"></span>
    <a href="#o-que-s%c3%a3o-fases" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Fases permitem dividir uma habilidade em etapas temporais, cada uma com seu próprio comportamento:</p>
<ol>
<li><strong>Casting:</strong> Tempo de preparação (pode ser interrompido).</li>
<li><strong>Active:</strong> O momento em que o efeito principal ocorre.</li>
<li><strong>Recovery:</strong> Tempo de &ldquo;recuperação&rdquo; após o uso.</li>
</ol>
<h2>Passo 1: Definir as Fases no Resource<span class="hx:absolute hx:-mt-20" id="passo-1-definir-as-fases-no-resource"></span>
    <a href="#passo-1-definir-as-fases-no-resource" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>No seu <code>ASAbility</code>, você pode configurar o array <code>phases</code>.</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="c1"># Exemplo de configuração de fases para um &#39;Super Ataque&#39;</span>
</span></span><span class="line"><span class="cl"><span class="n">phases</span> <span class="o">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;name&#34;</span><span class="p">:</span> <span class="o">&amp;</span><span class="s2">&#34;prepare&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;duration&#34;</span><span class="p">:</span> <span class="mf">1.0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;is_interruptible&#34;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;tags_granted&#34;</span><span class="p">:</span> <span class="p">[</span><span class="o">&amp;</span><span class="s2">&#34;state.casting&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;name&#34;</span><span class="p">:</span> <span class="o">&amp;</span><span class="s2">&#34;execute&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;duration&#34;</span><span class="p">:</span> <span class="mf">0.5</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;is_interruptible&#34;</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;tags_granted&#34;</span><span class="p">:</span> <span class="p">[</span><span class="o">&amp;</span><span class="s2">&#34;state.immune&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;name&#34;</span><span class="p">:</span> <span class="o">&amp;</span><span class="s2">&#34;recover&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;duration&#34;</span><span class="p">:</span> <span class="mf">0.8</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;is_interruptible&#34;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;tags_granted&#34;</span><span class="p">:</span> <span class="p">[</span><span class="o">&amp;</span><span class="s2">&#34;state.vulnerable&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">]</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>Passo 2: Escutar Sinais de Mudança de Fase<span class="hx:absolute hx:-mt-20" id="passo-2-escutar-sinais-de-mudança-de-fase"></span>
    <a href="#passo-2-escutar-sinais-de-mudan%c3%a7a-de-fase" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>No seu script de personagem ou no script da habilidade, você pode reagir às mudanças:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_ready</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="n">ability_phase_changed</span><span class="o">.</span><span class="nf">connect</span><span class="p">(</span><span class="n">_on_ability_phase_changed</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_on_ability_phase_changed</span><span class="p">(</span><span class="n">ability_spec</span><span class="p">,</span> <span class="n">old_phase</span><span class="p">,</span> <span class="n">new_phase</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Habilidade </span><span class="si">%s</span><span class="s2"> mudou de </span><span class="si">%s</span><span class="s2"> para </span><span class="si">%s</span><span class="s2">&#34;</span> <span class="o">%</span> <span class="p">[</span><span class="n">ability_spec</span><span class="o">.</span><span class="nf">get_ability</span><span class="p">()</span><span class="o">.</span><span class="n">resource_name</span><span class="p">,</span> <span class="n">old_phase</span><span class="p">,</span> <span class="n">new_phase</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">match</span> <span class="n">new_phase</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="o">&amp;</span><span class="s2">&#34;prepare&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="nf">play_animation</span><span class="p">(</span><span class="s2">&#34;cast_start&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="nf">spawn_particles</span><span class="p">(</span><span class="s2">&#34;charge_up&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="o">&amp;</span><span class="s2">&#34;execute&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="nf">play_animation</span><span class="p">(</span><span class="s2">&#34;attack_swing&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="nf">apply_damage_area</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="o">&amp;</span><span class="s2">&#34;recover&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="nf">play_animation</span><span class="p">(</span><span class="s2">&#34;cast_end&#34;</span><span class="p">)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>Passo 3: Interrupção de Fases<span class="hx:absolute hx:-mt-20" id="passo-3-interrupção-de-fases"></span>
    <a href="#passo-3-interrup%c3%a7%c3%a3o-de-fases" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Se uma fase for marcada como <code>is_interruptible</code>, ela pode ser cancelada por efeitos externos ou chamadas manuais:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">take_hit</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># Se estiver no meio de um &#39;cast&#39; interrompível, cancela a habilidade</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">asc</span><span class="o">.</span><span class="nf">is_any_ability_in_phase</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;prepare&#34;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">asc</span><span class="o">.</span><span class="nf">cancel_all_abilities_with_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;state.casting&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="nf">play_animation</span><span class="p">(</span><span class="s2">&#34;stagger&#34;</span><span class="p">)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>Passo 4: Transições Visuais (Cues)<span class="hx:absolute hx:-mt-20" id="passo-4-transições-visuais-cues"></span>
    <a href="#passo-4-transi%c3%a7%c3%b5es-visuais-cues" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Você pode vincular <code>ASCue</code> a fases específicas para automação visual:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="c1"># No inspetor do ASAbility</span>
</span></span><span class="line"><span class="cl"><span class="c1"># phase_cues = {</span>
</span></span><span class="line"><span class="cl"><span class="c1"># &#34;prepare&#34;: [res://vfx/charge.tres],</span>
</span></span><span class="line"><span class="cl"><span class="c1"># &#34;execute&#34;: [res://vfx/explosion.tres]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># }</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>Conclusão<span class="hx:absolute hx:-mt-20" id="conclusão"></span>
    <a href="#conclus%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O sistema de fases é a base para criar mecânicas de &ldquo;commit&rdquo; e risco/recompensa em jogos de ação e RPG.</p>
<hr>
<p><strong>Próximo:</strong> <a href="first-attack">Tutorial: Primeiro Ataque</a></p>
]]></content:encoded><category>zyris-engine</category><category>godot-plugin</category><category>ability-system</category><category>gamedev</category><category>tutorial</category></item><item><title>Sub-Agents vs MCP: Ferramentas passivas vs Governança ativa</title><link>https://cafegame.dev/docs/vectora/concepts/sub-agents/</link><guid isPermaLink="true">https://cafegame.dev/docs/vectora/concepts/sub-agents/</guid><pubDate>Sat, 18 Apr 2026 22:30:00 GMT</pubDate><description>&lt;div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
&lt;a href="https://cafegame.dev/docs/vectora/concepts/sub-agents/"
class="lang-toggle-link lang-toggle-active"
data-lang="pt"
onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT&lt;/a>
&lt;span class="hx:mx-1">|&lt;/span>
&lt;a href="https://cafegame.dev/en/docs/vectora/concepts/sub-agents/"
class="lang-toggle-link"
data-lang="en"
onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN&lt;/a>
&lt;/div>
&lt;style>
.lang-toggle-link {
text-decoration: none;
color: #6b7280;
font-weight: 500;
}
.lang-toggle-link:hover { color: #3b82f6; }
.lang-toggle-active {
color: #1f2937;
font-weight: 700;
border-bottom: 1px solid currentColor;
}
.dark .lang-toggle-active { color: #f3f4f6; }
&lt;/style>
&lt;div class="hx:overflow-x-auto hx:mt-6 hx:flex hx:rounded-lg hx:border hx:py-2 hx:ltr:pr-4 hx:rtl:pl-4 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-green-200 hx:bg-green-100 hx:text-green-900 hx:dark:border-green-200/30 hx:dark:bg-green-900/30 hx:dark:text-green-200">
&lt;div class="hx:ltr:pl-3 hx:ltr:pr-2 hx:rtl:pr-3 hx:rtl:pl-2">&lt;svg height=1.2em class="hx:inline-block hx:align-middle" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/>&lt;/svg>&lt;/div>
&lt;div class="hx:w-full hx:min-w-0 hx:leading-7">
&lt;div class="hx:mt-6 hx:leading-7 hx:first:mt-0">&lt;strong>TL;DR&lt;/strong>: MCP é um protocolo excelente para expor ferramentas. Mas expor ferramentas não é a
mesma coisa que entregar &lt;strong>contexto governado&lt;/strong>. O Vectora é um Sub-Agent porque RAG de qualidade exige interceptação,
validação e orquestração que ferramentas passivas não podem fornecer.&lt;/div>
&lt;/div>
&lt;/div>
&lt;hr>
&lt;h2>A Pergunta Incômoda&lt;span class="hx:absolute hx:-mt-20" id="a-pergunta-incômoda">&lt;/span>
&lt;a href="#a-pergunta-inc%c3%b4moda" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Você provavelmente já viu o &lt;strong>Model Context Protocol (MCP)&lt;/strong> funcionando: Claude lê arquivos, busca na web, executa
comandos no terminal. Funciona bem para casos simples.&lt;/p></description><content:encoded><![CDATA[<div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
    <a href="/docs/vectora/concepts/sub-agents/"
       class="lang-toggle-link lang-toggle-active"
       data-lang="pt"
       onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT</a>
    <span class="hx:mx-1">|</span>
    <a href="/en/docs/vectora/concepts/sub-agents/"
       class="lang-toggle-link"
       data-lang="en"
       onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN</a>
  </div>

  <style>
    .lang-toggle-link {
      text-decoration: none;
      color: #6b7280;
      font-weight: 500;
    }
    .lang-toggle-link:hover { color: #3b82f6; }
    .lang-toggle-active {
      color: #1f2937;
      font-weight: 700;
      border-bottom: 1px solid currentColor;
    }
    .dark .lang-toggle-active { color: #f3f4f6; }
  </style>
<div class="hx:overflow-x-auto hx:mt-6 hx:flex hx:rounded-lg hx:border hx:py-2 hx:ltr:pr-4 hx:rtl:pl-4 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-green-200 hx:bg-green-100 hx:text-green-900 hx:dark:border-green-200/30 hx:dark:bg-green-900/30 hx:dark:text-green-200">
  <div class="hx:ltr:pl-3 hx:ltr:pr-2 hx:rtl:pr-3 hx:rtl:pl-2"><svg height=1.2em class="hx:inline-block hx:align-middle" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg></div>

  <div class="hx:w-full hx:min-w-0 hx:leading-7">
    <div class="hx:mt-6 hx:leading-7 hx:first:mt-0"><strong>TL;DR</strong>: MCP é um protocolo excelente para expor ferramentas. Mas expor ferramentas não é a
mesma coisa que entregar <strong>contexto governado</strong>. O Vectora é um Sub-Agent porque RAG de qualidade exige interceptação,
validação e orquestração que ferramentas passivas não podem fornecer.</div>
  </div>
</div>

<hr>
<h2>A Pergunta Incômoda<span class="hx:absolute hx:-mt-20" id="a-pergunta-incômoda"></span>
    <a href="#a-pergunta-inc%c3%b4moda" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Você provavelmente já viu o <strong>Model Context Protocol (MCP)</strong> funcionando: Claude lê arquivos, busca na web, executa
comandos no terminal. Funciona bem para casos simples.</p>
<p>Mas aqui está a pergunta que poucos fazem:</p>
<blockquote>
  <p><em>&ldquo;Se MCP permite acesso a ferramentas&hellip; por que Vectora não é &lsquo;apenas mais um servidor MCP&rsquo;?&rdquo;</em></p>
</blockquote>
<p>A resposta curta: <strong>porque acesso não é entendimento.</strong></p>
<p>A resposta longa é o que você vai ler abaixo.</p>
<hr>
<h2>O Que MCP Faz (E Seus Limites)<span class="hx:absolute hx:-mt-20" id="o-que-mcp-faz-e-seus-limites"></span>
    <a href="#o-que-mcp-faz-e-seus-limites" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>MCP: Acesso Padronizado<span class="hx:absolute hx:-mt-20" id="mcp-acesso-padronizado"></span>
    <a href="#mcp-acesso-padronizado" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>O <a href="https://modelcontextprotocol.io"target="_blank" rel="noopener">Model Context Protocol</a> padroniza como um LLM pode:</p>
<ol>
<li><strong>Descobrir</strong> quais ferramentas existem</li>
<li><strong>Chamar</strong> essas ferramentas com argumentos estruturados</li>
<li><strong>Receber</strong> resultados formatados</li>
</ol>
<p>Pense em MCP como um contrato de interface universal. Assim como APIs REST permitem que qualquer cliente converse com um
backend, MCP permite que qualquer agent use suas ferramentas.</p>
<h3>O Que Funciona Bem com MCP<span class="hx:absolute hx:-mt-20" id="o-que-funciona-bem-com-mcp"></span>
    <a href="#o-que-funciona-bem-com-mcp" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><table>
  <thead>
      <tr>
          <th>Cenário</th>
          <th>Por que MCP é suficiente</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Leitura pontual de um arquivo</td>
          <td>O agent sabe qual arquivo quer</td>
      </tr>
      <tr>
          <td>Busca web simples</td>
          <td>O agent formula a query e interpreta resultados</td>
      </tr>
      <tr>
          <td>Execução isolada de comandos</td>
          <td>O agent controla o comando</td>
      </tr>
  </tbody>
</table>
<h3>O Que NÃO Funciona Bem com MCP Puro<span class="hx:absolute hx:-mt-20" id="o-que-não-funciona-bem-com-mcp-puro"></span>
    <a href="#o-que-n%c3%a3o-funciona-bem-com-mcp-puro" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><table>
  <thead>
      <tr>
          <th>Cenário</th>
          <th>Por que MCP sozinho falha</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>RAG em codebases grandes</strong></td>
          <td>Agentes principais não têm modelo de embedding para busca semântica</td>
      </tr>
      <tr>
          <td><strong>Segurança consistente</strong></td>
          <td>Blocklists dependem de prompts (vulneráveis a jailbreak)</td>
      </tr>
      <tr>
          <td><strong>Isolamento entre projetos</strong></td>
          <td>Sem namespace/RBAC, há risco de vazamento de contexto</td>
      </tr>
      <tr>
          <td><strong>Validação de qualidade</strong></td>
          <td>Sem interceptação interna, não há métricas de <code>tool_accuracy</code> ou <code>retrieval_precision</code></td>
      </tr>
      <tr>
          <td><strong>Failover entre providers</strong></td>
          <td>Agente principal lida com erro de cada API individualmente</td>
      </tr>
  </tbody>
</table>
<hr>
<h2>Por Que Vectora é um Sub-Agent Completo<span class="hx:absolute hx:-mt-20" id="por-que-vectora-é-um-sub-agent-completo"></span>
    <a href="#por-que-vectora-%c3%a9-um-sub-agent-completo" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>A Decisão Arquitetural<span class="hx:absolute hx:-mt-20" id="a-decisão-arquitetural"></span>
    <a href="#a-decis%c3%a3o-arquitetural" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>A escolha de construir Vectora como um <strong>Sub-Agent</strong> — e não como servidor MCP genérico — foi deliberada:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Agente Funcional = Modelo de Linguagem + Harness de Orquestração
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">No caso do Vectora:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">Vectora = Gemini 3.5 (LLM) + Voyage 4 (Embeddings) + Harness Runtime (TypeScript)
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">O **Harness** é a camada crítica que:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- Intercepta tool calls **antes** da execução para validar segurança
</span></span><span class="line"><span class="cl">- Decide **o que**, **como** e **quando** buscar contexto
</span></span><span class="line"><span class="cl">- Roteia entre providers com fallback automático
</span></span><span class="line"><span class="cl">- Sanitiza outputs **antes** de retornar ao agente principal
</span></span><span class="line"><span class="cl">- Coleta métricas de precisão e segurança em tempo real
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Nenhuma dessas responsabilidades pode ser delegada ao agente principal sem perder controle.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Parte 1: O Desafio Técnico dos Embeddings
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### A Realidade dos Agentes Principais em 2026
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">| Agent Principal | Embedding Integrado? | RAG Nativo? | Observação |
</span></span><span class="line"><span class="cl">| --------------- | -------------------- | ----------------- | ------------------------------------- |
</span></span><span class="line"><span class="cl">| GitHub Copilot | Não | Não | Autocomplete, não RAG profundo |
</span></span><span class="line"><span class="cl">| Cursor | Não | Não | Indexação própria, não extensível |
</span></span><span class="line"><span class="cl">| Claude Code | Não | Não | Espera contexto pronto |
</span></span><span class="line"><span class="cl">| Gemini CLI | Via API cloud | Não localmente | Sem pipeline integrado |
</span></span><span class="line"><span class="cl">| Windsurf/Trae | Não | Não | Features próprias, não interoperáveis |
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Por Que Isso Importa para RAG Real
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Para recuperar contexto relevante em um codebase, você precisa de um pipeline completo:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">Query → Embedding → Busca Vetorial → Filtragem → Compaction → Injeção Estruturada → LLM
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Cada etapa exige decisões especializadas que agentes principais não fazem:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">| Etapa | Decisão | Por que agente principal não faz |
</span></span><span class="line"><span class="cl">| ------------- | -------------------------------------------------------------- | ------------------------------------- |
</span></span><span class="line"><span class="cl">| **Embedding** | Escolher `voyage-4-code` vs. `voyage-3` vs. `gemini-embedding` | Agentes não têm embeddings integrados |
</span></span><span class="line"><span class="cl">| **Busca** | Aplicar filtros por namespace, `file_type`, relevância | MCP retorna dados brutos |
</span></span><span class="line"><span class="cl">| **Filtragem** | Manter head/tail de outputs grandes + pointers | Limite de contexto exige decisão |
</span></span><span class="line"><span class="cl">| **Injeção** | Estruturar contexto com metadados e dependências | Relações se perdem em texto plano |
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### A Solução Vectora: Interpreter Especializado
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">Agente Principal → Vectora (Camada de Interpretação) → Contexto Estruturado
</span></span><span class="line"><span class="cl">                      ↓
</span></span><span class="line"><span class="cl">               Context Engine decide:
</span></span><span class="line"><span class="cl">               - Que informação buscar?
</span></span><span class="line"><span class="cl">               - De quais fontes?
</span></span><span class="line"><span class="cl">               - Com quais filtros?
</span></span><span class="line"><span class="cl">               - Como estruturar para o LLM?
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Parte 2: O Desafio Estratégico do Controle
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### O Que Você Perde Sem Sub-Agent
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Mesmo para ferramentas que NÃO envolvem embeddings, atuar como servidor MCP genérico significa perder:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">| Recurso | Por que importa | Sem Sub-Agent |
</span></span><span class="line"><span class="cl">| ------------------------ | ------------------------------------------------------------------- | -------------------------------------------------------- |
</span></span><span class="line"><span class="cl">| **Harness** | Valida _como_ o agente usou as tools | Sem métricas de `tool_sequence` ou `security_compliance` |
</span></span><span class="line"><span class="cl">| **Guardian Middleware** | Blocklist hard-coded (`.env`, `.key`) executada antes de tool calls | Depende de prompts (vulnerável a jailbreak) |
</span></span><span class="line"><span class="cl">| **Namespace RBAC** | Isolamento real entre projetos | Acesso direto ao filesystem (risco de vazamento) |
</span></span><span class="line"><span class="cl">| **Failover Automático** | Roteia entre providers se um falhar | Agente principal lida com cada erro |
</span></span><span class="line"><span class="cl">| **Tool Calling Estável** | Adapter normaliza quirks entre SDKs | Parsing frágil, tool calls inconsistentes |
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### A Ilusão do &#34;Treinamento via Docs&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Você pode escrever `AGENTS.md`, `CLAUDE.md` para ensinar o agente a usar as ferramentas. Mas docs NÃO resolvem problemas
</span></span><span class="line"><span class="cl">de runtime:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```yaml
</span></span><span class="line"><span class="cl"># O que docs CONSEGUEM fazer:
</span></span><span class="line"><span class="cl"> Ensinar formato esperado de argumentos
</span></span><span class="line"><span class="cl"> Sugerir sequência recomendada
</span></span><span class="line"><span class="cl"> Documentar políticas de segurança
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"># O que docs NÃO CONSEGUEM fazer:
</span></span><span class="line"><span class="cl"> Validar argumentos antes da execução (Zod enforcement)
</span></span><span class="line"><span class="cl"> Bloquear tool calls perigosas em runtime
</span></span><span class="line"><span class="cl"> Interceptar e medir métricas de precisão
</span></span><span class="line"><span class="cl"> Garantir isolamento de namespace
</span></span><span class="line"><span class="cl"> Controlar fallover entre providers
</span></span><span class="line"><span class="cl"> Acessar SDK do provider para parsing estável
</span></span><span class="line"><span class="cl"> Sanitizar output antes de retornar ao agente
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&gt; **Prompts são sugestões. Código é lei.** Vectora escolheu código para segurança, validação e governança.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Comparação Direta: Cenário Real
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Cenário: &#34;Refatore o módulo de autenticação para adicionar expiração JWT&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">#### Abordagem: MCP Tools Genérico
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">1. Claude Code lê: file_read(&#34;src/auth.go&#34;)
</span></span><span class="line"><span class="cl">2. Claude busca: grep_search(&#34;JWT&#34;, &#34;*.go&#34;)
</span></span><span class="line"><span class="cl">3. Claude recebe: 47 arquivos (muitos irrelevantes)
</span></span><span class="line"><span class="cl">4. Claude filtra manualmente (consome tokens)
</span></span><span class="line"><span class="cl">5. Claude propõe refatoração
</span></span><span class="line"><span class="cl">6. Claude escreve: file_write() → modifica arquivo
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">**Problemas**:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- Não há validação de que `auth.go` era o arquivo **principal**
</span></span><span class="line"><span class="cl">- 39 dos 47 arquivos recuperados eram ruído
</span></span><span class="line"><span class="cl">- Não há bloqueio se `file_write` tentasse modificar `.env`
</span></span><span class="line"><span class="cl">- Não há snapshot Git automático antes da escrita
</span></span><span class="line"><span class="cl">- Sem métricas: não há como provar que funcionou melhor
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">#### Abordagem: Vectora Sub-Agent
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">1. Claude Code delega: refactor_with_context(module=&#34;auth&#34;, change=&#34;add_jwt_expiry&#34;)
</span></span><span class="line"><span class="cl">   ↓
</span></span><span class="line"><span class="cl">2. Vectora intercepta e valida:
</span></span><span class="line"><span class="cl">   - Namespace validation
</span></span><span class="line"><span class="cl">   - Guardian: blocklist check
</span></span><span class="line"><span class="cl">   ↓
</span></span><span class="line"><span class="cl">3. Context Engine decide:
</span></span><span class="line"><span class="cl">   - Buscar em filesystem + vector search?
</span></span><span class="line"><span class="cl">   - Com quais filtros de namespace?
</span></span><span class="line"><span class="cl">   ↓
</span></span><span class="line"><span class="cl">4. Vectora retorna contexto estruturado:
</span></span><span class="line"><span class="cl">   - 5 arquivos relevantes (relevance ≥ 0.75)
</span></span><span class="line"><span class="cl">   - 0 arquivos bloqueados
</span></span><span class="line"><span class="cl">   - embedding_model: voyage-4-code
</span></span><span class="line"><span class="cl">   - retrieval_precision: 0.89
</span></span><span class="line"><span class="cl">   ↓
</span></span><span class="line"><span class="cl">5. Claude propõe refatoração com contexto validado
</span></span><span class="line"><span class="cl">   ↓
</span></span><span class="line"><span class="cl">6. Vectora executa file_write com:
</span></span><span class="line"><span class="cl">   - Git snapshot automático
</span></span><span class="line"><span class="cl">   - Lint + type-check
</span></span><span class="line"><span class="cl">   - Output sanitization
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">**Vantagens**:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- Validação **antes** da execução
</span></span><span class="line"><span class="cl">- Métricas objetivas: `retrieval_precision: 0.89`, `tool_accuracy: 1.0`
</span></span><span class="line"><span class="cl">- Segurança por código (Guardian hard-coded)
</span></span><span class="line"><span class="cl">- Isolamento por namespace (RBAC real)
</span></span><span class="line"><span class="cl">- Prova de valor: `--compare vectora:on,off`
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Arquitetura: Camadas Exclusivas do Sub-Agent
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Runtime TypeScript
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```typescript
</span></span><span class="line"><span class="cl">export class VectoraSubAgent {
</span></span><span class="line"><span class="cl">  // 1. Tool Router com validação Zod (fail-fast)
</span></span><span class="line"><span class="cl">  private router: ToolRouter;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  // 2. Guardian middleware (hard-coded, imutável)
</span></span><span class="line"><span class="cl">  private guardian: Guardian;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  // 3. Context Engine (decisão multi-hop)
</span></span><span class="line"><span class="cl">  private contextEngine: ContextEngine;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  // 4. Harness (interceptação e métricas)
</span></span><span class="line"><span class="cl">  private harnessInterceptor?: HarnessInterceptor;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  // 5. Provider adapter (failover automático)
</span></span><span class="line"><span class="cl">  private providerAdapter: ProviderAdapter;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  async execute(request: AgentRequest): Promise&lt;AgentResponse&gt; {
</span></span><span class="line"><span class="cl">    // Validação de namespace ANTES de qualquer ação
</span></span><span class="line"><span class="cl">    if (!this.guardian.validateNamespace(request.namespace)) {
</span></span><span class="line"><span class="cl">      throw new SecurityError(`Namespace validation failed`);
</span></span><span class="line"><span class="cl">    }
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    // Interceptação para Harness (coleta métricas em tempo real)
</span></span><span class="line"><span class="cl">    if (this.harnessInterceptor) {
</span></span><span class="line"><span class="cl">      await this.harnessInterceptor.onCall(request);
</span></span><span class="line"><span class="cl">    }
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    // Decisão de contexto: o que/como/quando buscar
</span></span><span class="line"><span class="cl">    const context = await this.contextEngine.build(request);
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    // Execução com validação via Zod schema
</span></span><span class="line"><span class="cl">    const result = await this.router.execute(request.tool, request.args, context);
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    // Sanitização de output antes de retornar ao agente
</span></span><span class="line"><span class="cl">    const sanitized = this.guardian.sanitizeOutput(result);
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    return {
</span></span><span class="line"><span class="cl">      context: sanitized,
</span></span><span class="line"><span class="cl">      metrics: this.collectMetrics(),
</span></span><span class="line"><span class="cl">      audit: this.generateAuditLog(request, result),
</span></span><span class="line"><span class="cl">    };
</span></span><span class="line"><span class="cl">  }
</span></span><span class="line"><span class="cl">}
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Contraste: Tool MCP Genérica
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```typescript
</span></span><span class="line"><span class="cl">// Tool MCP: função passiva, sem governança
</span></span><span class="line"><span class="cl">export async function file_read(args: { path: string }): Promise&lt;string&gt; {
</span></span><span class="line"><span class="cl">  // Sem validação de namespace
</span></span><span class="line"><span class="cl">  // Sem blocklist do Guardian
</span></span><span class="line"><span class="cl">  // Sem interceptação para Harness
</span></span><span class="line"><span class="cl">  // Sem sanitização de output
</span></span><span class="line"><span class="cl">  // Sem métricas de observabilidade
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  return fs.readFileSync(args.path, &#34;utf-8&#34;);
</span></span><span class="line"><span class="cl">}
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&gt; **Diferença fundamental**:
</span></span><span class="line"><span class="cl">&gt;
</span></span><span class="line"><span class="cl">&gt; - MCP tools = funções passivas
</span></span><span class="line"><span class="cl">&gt; - Vectora Sub-Agent = sistema ativo de governança
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Impacto para Você
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Desenvolvedores
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">| Benefício | Como Sub-Agent Entrega |
</span></span><span class="line"><span class="cl">| -------------- | ------------------------------------------------------------------ |
</span></span><span class="line"><span class="cl">| **Confiança** | Segurança por código (Guardian), não por prompt |
</span></span><span class="line"><span class="cl">| **Qualidade** | Harness prova objetivamente melhorias (`+42% retrieval_precision`) |
</span></span><span class="line"><span class="cl">| **Controle** | Você decide namespaces, providers, políticas |
</span></span><span class="line"><span class="cl">| **Eficiência** | Context Engine evita overfetch (menos tokens) |
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Equipes
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">| Benefício | Como Sub-Agent Entrega |
</span></span><span class="line"><span class="cl">| --------------- | --------------------------------------------- |
</span></span><span class="line"><span class="cl">| **Governança** | RBAC por namespace + audit logs via Harness |
</span></span><span class="line"><span class="cl">| **Colaboração** | Namespaces compartilhados com isolamento real |
</span></span><span class="line"><span class="cl">| **Evolução** | Harness detecta regressões antes de deploy |
</span></span><span class="line"><span class="cl">| **Custo** | Redução mensurável de tokens (ROI comprovado) |
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Integradores
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">| Benefício | Como Sub-Agent Entrega |
</span></span><span class="line"><span class="cl">| ---------------------- | ------------------------------------------------------------------------- |
</span></span><span class="line"><span class="cl">| **Interoperabilidade** | MCP/ACP padrão — integra com Claude Code, Gemini CLI, Cursor |
</span></span><span class="line"><span class="cl">| **Extensibilidade** | Provider-agnostic — troque `gemini-3.5` por `gemini-3.1-pro` sem mudanças |
</span></span><span class="line"><span class="cl">| **Validação** | Harness como serviço — valide seu próprio agente |
</span></span><span class="line"><span class="cl">| **Foco** | Você constrói a experiência; Vectora cuida do contexto |
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## E Se Eu Quiser Apenas MCP Tools?
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Você **pode** usar Vectora em modo simplificado:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```bash
</span></span><span class="line"><span class="cl">vectora-agent mcp-serve --mode tools-only
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">**O que você ganha**:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- Integração rápida com qualquer client MCP
</span></span><span class="line"><span class="cl">- Menor overhead de configuração
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">**O que você perde**:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- Context Engine inteligente (decide o que/como buscar)
</span></span><span class="line"><span class="cl">- Harness (prova objetiva de qualidade)
</span></span><span class="line"><span class="cl">- Guardian middleware (segurança por código)
</span></span><span class="line"><span class="cl">- Namespace isolation (RBAC real)
</span></span><span class="line"><span class="cl">- Failover automático entre providers
</span></span><span class="line"><span class="cl">- Métricas de `retrieval_precision` e `tool_accuracy`
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&gt; **Recomendação**: Comece com o Sub-Agent completo. A maioria dos usuários descobre que as camadas de controle são
</span></span><span class="line"><span class="cl">&gt; justamente o que faltava para confiar em produção.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Conclusão
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&gt; **Vectora não é um conjunto de tools MCP. É a camada que faz qualquer agente funcionar melhor em código — com
</span></span><span class="line"><span class="cl">&gt; controle, validação e segurança por design.**
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">| Se você quer... | Use... |
</span></span><span class="line"><span class="cl">| -------------------------------------------------------------- | --------------------- |
</span></span><span class="line"><span class="cl">| Tools genéricas de arquivo/busca | MCP tools do mercado |
</span></span><span class="line"><span class="cl">| **Contexto correto + execução confiável + validação objetiva** | **Vectora Sub-Agent** |
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&gt; **Frase para guardar**: _&#34;Tools MCP te dão funções. Vectora Sub-Agent te dá governança.&#34;_
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&lt;!-- Parte do ecossistema Vectora · Open Source · TypeScript · Provider-Agnostic --&gt;</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
]]></content:encoded><category>agents</category><category>ai</category><category>architecture</category><category>ativa</category><category>concepts</category><category>context-engine</category><category>embeddings</category><category>ferramentas</category><category>governança</category><category>guardian</category><category>mcp</category><category>mcp-protocol</category><category>passivas</category><category>rag</category><category>sub-agents</category><category>vector-search</category><category>vectora</category></item><item><title>RAG Conectado</title><link>https://cafegame.dev/docs/vectora/concepts/rag/</link><guid isPermaLink="true">https://cafegame.dev/docs/vectora/concepts/rag/</guid><pubDate>Sat, 18 Apr 2026 22:30:00 GMT</pubDate><description>&lt;div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
&lt;a href="https://cafegame.dev/docs/vectora/concepts/rag/"
class="lang-toggle-link lang-toggle-active"
data-lang="pt"
onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT&lt;/a>
&lt;span class="hx:mx-1">|&lt;/span>
&lt;a href="https://cafegame.dev/en/docs/vectora/concepts/rag/"
class="lang-toggle-link"
data-lang="en"
onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN&lt;/a>
&lt;/div>
&lt;style>
.lang-toggle-link {
text-decoration: none;
color: #6b7280;
font-weight: 500;
}
.lang-toggle-link:hover { color: #3b82f6; }
.lang-toggle-active {
color: #1f2937;
font-weight: 700;
border-bottom: 1px solid currentColor;
}
.dark .lang-toggle-active { color: #f3f4f6; }
&lt;/style>
&lt;p>Você já perguntou a um agente de IA sobre uma função no seu projeto e ele respondeu algo que parecia certo, mas que
ignorava completamente como aquela função era usada no resto do sistema? Isso é o sintoma clássico do &lt;strong>RAG
fragmentado&lt;/strong>.&lt;/p></description><content:encoded><![CDATA[<div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
    <a href="/docs/vectora/concepts/rag/"
       class="lang-toggle-link lang-toggle-active"
       data-lang="pt"
       onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT</a>
    <span class="hx:mx-1">|</span>
    <a href="/en/docs/vectora/concepts/rag/"
       class="lang-toggle-link"
       data-lang="en"
       onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN</a>
  </div>

  <style>
    .lang-toggle-link {
      text-decoration: none;
      color: #6b7280;
      font-weight: 500;
    }
    .lang-toggle-link:hover { color: #3b82f6; }
    .lang-toggle-active {
      color: #1f2937;
      font-weight: 700;
      border-bottom: 1px solid currentColor;
    }
    .dark .lang-toggle-active { color: #f3f4f6; }
  </style>
<p>Você já perguntou a um agente de IA sobre uma função no seu projeto e ele respondeu algo que parecia certo, mas que
ignorava completamente como aquela função era usada no resto do sistema? Isso é o sintoma clássico do <strong>RAG
fragmentado</strong>.</p>
<h2>O que é RAG?<span class="hx:absolute hx:-mt-20" id="o-que-é-rag"></span>
    <a href="#o-que-%c3%a9-rag" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p><strong>RAG (Retrieval-Augmented Generation)</strong> é a técnica de fornecer dados externos (como seus arquivos de código) para um
LLM no momento da pergunta. Em vez de o modelo &ldquo;adivinhar&rdquo; baseado no que ele aprendeu no treino, ele consulta seus
documentos e responde baseado neles.</p>
<p>Parece perfeito, certo? Mas para código, o RAG comum é perigoso.</p>
<h2>O Problema do RAG Tradicional<span class="hx:absolute hx:-mt-20" id="o-problema-do-rag-tradicional"></span>
    <a href="#o-problema-do-rag-tradicional" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A maioria dos bancos de dados vetoriais foca em <strong>similaridade semântica de pedaços isolados</strong>.</p>
<p>Se você busca por <code>login</code>, ele vai te dar os blocos de código que contêm a palavra <code>login</code>. Mas ele pode ignorar o
middleware de autenticação, o arquivo de configuração de banco de dados ou a dependência que gerencia os tokens JWT.</p>
<p>Para o LLM, é como tentar montar um quebra-cabeça recebendo apenas 5 peças aleatórias e sem a caixa para ver o desenho
completo.</p>
<h2>A Solução: RAG Conectado (Context Engine)<span class="hx:absolute hx:-mt-20" id="a-solução-rag-conectado-context-engine"></span>
    <a href="#a-solu%c3%a7%c3%a3o-rag-conectado-context-engine" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>No <a href="/docs/vectora/">Vectora</a>, o RAG não é apenas &ldquo;buscar texto&rdquo;. Ele funciona através de um <strong>Context Engine</strong> que
entende a estrutura:</p>
<ol>
<li><strong>Busca Multimodal</strong>: Combina busca vetorial (semântica) com busca estrutural (AST e Grep).</li>
<li><strong>Multi-hop Reasoning</strong>: O motor de contexto não faz apenas uma busca. Se ele encontra uma referência a uma
interface, ele faz um &ldquo;salto&rdquo; para buscar a implementação dessa interface.</li>
<li><strong>Composição Estruturada</strong>: O contexto entregue ao Agente principal não é uma lista de textos, mas uma árvore
organizada de arquivos, dependências e metadados.</li>
</ol>
<h2>Por que isso importa?<span class="hx:absolute hx:-mt-20" id="por-que-isso-importa"></span>
    <a href="#por-que-isso-importa" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Quando o contexto é <strong>conectado</strong>:</p>
<ul>
<li>As alucinações caem drasticamente.</li>
<li>O Agente para de sugerir mudanças que quebram outras partes do sistema.</li>
<li>Você gasta menos tokens, pois o contexto enviado é cirúrgico, não um &ldquo;dump&rdquo; de arquivos.</li>
</ul>
<p>O RAG tradicional te dá dados. O RAG Conectado do Vectora te dá <strong>conhecimento</strong>.</p>
<hr>
<p><em>Este é um guia técnico do projeto <a href="../">Vectora</a>.</em></p>
]]></content:encoded><category>ai</category><category>architecture</category><category>concepts</category><category>conectado</category><category>context-engine</category><category>mcp</category><category>rag</category><category>vectora</category></item><item><title>Gemini 3 Flash: A Inteligência que Impulsiona Vectora</title><link>https://cafegame.dev/docs/vectora/models/voyage/</link><guid isPermaLink="true">https://cafegame.dev/docs/vectora/models/voyage/</guid><pubDate>Sat, 18 Apr 2026 22:30:00 GMT</pubDate><description>&lt;div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
&lt;a href="https://cafegame.dev/docs/vectora/models/voyage/"
class="lang-toggle-link lang-toggle-active"
data-lang="pt"
onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT&lt;/a>
&lt;span class="hx:mx-1">|&lt;/span>
&lt;a href="https://cafegame.dev/en/docs/vectora/models/voyage/"
class="lang-toggle-link"
data-lang="en"
onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN&lt;/a>
&lt;/div>
&lt;style>
.lang-toggle-link {
text-decoration: none;
color: #6b7280;
font-weight: 500;
}
.lang-toggle-link:hover { color: #3b82f6; }
.lang-toggle-active {
color: #1f2937;
font-weight: 700;
border-bottom: 1px solid currentColor;
}
.dark .lang-toggle-active { color: #f3f4f6; }
&lt;/style>
&lt;h2>O Coração do Vectora: Gemini 3 Flash&lt;span class="hx:absolute hx:-mt-20" id="o-coração-do-vectora-gemini-3-flash">&lt;/span>
&lt;a href="#o-cora%c3%a7%c3%a3o-do-vectora-gemini-3-flash" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Toda a inteligência do Vectora converge para um único ponto: &lt;strong>Gemini 3 Flash&lt;/strong> da Google. Este não é apenas um LLM
qualquer — é a peça central de uma arquitetura altamente otimizada para &lt;strong>velocidade, custo e qualidade de código&lt;/strong>.&lt;/p></description><content:encoded><![CDATA[<div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
    <a href="/docs/vectora/models/voyage/"
       class="lang-toggle-link lang-toggle-active"
       data-lang="pt"
       onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT</a>
    <span class="hx:mx-1">|</span>
    <a href="/en/docs/vectora/models/voyage/"
       class="lang-toggle-link"
       data-lang="en"
       onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN</a>
  </div>

  <style>
    .lang-toggle-link {
      text-decoration: none;
      color: #6b7280;
      font-weight: 500;
    }
    .lang-toggle-link:hover { color: #3b82f6; }
    .lang-toggle-active {
      color: #1f2937;
      font-weight: 700;
      border-bottom: 1px solid currentColor;
    }
    .dark .lang-toggle-active { color: #f3f4f6; }
  </style>
<h2>O Coração do Vectora: Gemini 3 Flash<span class="hx:absolute hx:-mt-20" id="o-coração-do-vectora-gemini-3-flash"></span>
    <a href="#o-cora%c3%a7%c3%a3o-do-vectora-gemini-3-flash" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Toda a inteligência do Vectora converge para um único ponto: <strong>Gemini 3 Flash</strong> da Google. Este não é apenas um LLM
qualquer — é a peça central de uma arquitetura altamente otimizada para <strong>velocidade, custo e qualidade de código</strong>.</p>
<p>Quando você faz uma pergunta ao Vectora e recebe uma resposta impecável em milissegundos, é Gemini 3 Flash trabalhando
com contexto refinado pelos embeddings Voyage 4 e pelo reranker Voyage 2.5.</p>
<h2>Por que Gemini 3 Flash?<span class="hx:absolute hx:-mt-20" id="por-que-gemini-3-flash"></span>
    <a href="#por-que-gemini-3-flash" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Testamos todas as alternativas. Aqui está a realidade:</p>
<h3>Comparação de Modelos LLM para Código<span class="hx:absolute hx:-mt-20" id="comparação-de-modelos-llm-para-código"></span>
    <a href="#compara%c3%a7%c3%a3o-de-modelos-llm-para-c%c3%b3digo" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><table>
  <thead>
      <tr>
          <th>Aspecto</th>
          <th>Gemini 3 Flash</th>
          <th>GPT-4o</th>
          <th>Claude 4.7</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>Latência</strong></td>
          <td>30-50ms</td>
          <td>150-200ms</td>
          <td>200-300ms</td>
      </tr>
      <tr>
          <td><strong>Custo por 1M tokens</strong></td>
          <td>$0.075</td>
          <td>$15</td>
          <td>$3</td>
      </tr>
      <tr>
          <td><strong>Qualidade em código</strong></td>
          <td>96.2%</td>
          <td>98.1%</td>
          <td>97.8%</td>
      </tr>
      <tr>
          <td><strong>Context window</strong></td>
          <td>1M tokens</td>
          <td>128K tokens</td>
          <td>200K tokens</td>
      </tr>
      <tr>
          <td><strong>Velocidade de geração</strong></td>
          <td>2000 tokens/s</td>
          <td>800 tokens/s</td>
          <td>600 tokens/s</td>
      </tr>
      <tr>
          <td><strong>Suporte a multimodal</strong></td>
          <td>Texto + Imagem</td>
          <td>Texto + Imagem</td>
          <td>Texto</td>
      </tr>
      <tr>
          <td><strong>Rate limiting</strong></td>
          <td>Generoso</td>
          <td>Restritivo</td>
          <td>Moderado</td>
      </tr>
  </tbody>
</table>
<h3>Por que Gemini 3 Flash Ganha<span class="hx:absolute hx:-mt-20" id="por-que-gemini-3-flash-ganha"></span>
    <a href="#por-que-gemini-3-flash-ganha" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><ol>
<li><strong>Custo Irrelevante</strong>: 200x mais barato que GPT-4o ($0.075 vs $15)</li>
<li><strong>Latência Baixa</strong>: 30-50ms (não é detectável para usuários)</li>
<li><strong>Qualidade Suficiente</strong>: 96.2% é excelente para código — o 1.9% que perde do GPT-4o é em casos de borda raríssimos</li>
<li><strong>Context Window de 1M</strong>: Pode processar projetos inteiros de uma vez</li>
<li><strong>Sem Rate Limiting</strong>: Suporta milhões de requisições por hora sem throttling</li>
<li><strong>Integração Perfeita com Vectora</strong>: Treinado para trabalhar com embeddings de alta qualidade</li>
</ol>
<h3>Por que as Alternativas Falham<span class="hx:absolute hx:-mt-20" id="por-que-as-alternativas-falham"></span>
    <a href="#por-que-as-alternativas-falham" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p><strong>GPT-4o</strong>:</p>
<ul>
<li>Custo proibitivo: $15 por 1M tokens</li>
<li>Um projeto com 10M tokens custa $150 em uma sessão</li>
<li>Rate limiting: máximo 500K tokens/min (sufoca escalabilidade)</li>
<li>Overkill para código: qualidade 1.9% melhor não justifica 200x de custo</li>
</ul>
<p><strong>Claude 4.7</strong>:</p>
<ul>
<li>Excelente em análise, ruim em velocidade</li>
<li>200-300ms de latência (detectável)</li>
<li>Custo ainda alto: $3 por 1M tokens</li>
<li>Rate limiting agressivo para Free/Pro</li>
</ul>
<p><strong>Qwen 3</strong>:</p>
<ul>
<li>Qualidade inferior para código</li>
<li>Apenas chinês como linguagem principal</li>
<li>Sem integração via API padrão</li>
</ul>
<h2>Arquitetura Interna de Gemini 3 Flash<span class="hx:absolute hx:-mt-20" id="arquitetura-interna-de-gemini-3-flash"></span>
    <a href="#arquitetura-interna-de-gemini-3-flash" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>Fundamentos: Transformer com Inovações<span class="hx:absolute hx:-mt-20" id="fundamentos-transformer-com-inovações"></span>
    <a href="#fundamentos-transformer-com-inova%c3%a7%c3%b5es" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Gemini 3 Flash é baseado na arquitetura Transformer clássica, mas com otimizações propriet árias do Google:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Input (Embeddings)
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">Token Embedding Layer
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">Positional Encoding (Rotary Position Embeddings)
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">[Transformer Block × 26 layers]
</span></span><span class="line"><span class="cl">    ├─ Multi-Head Self-Attention (32 heads)
</span></span><span class="line"><span class="cl">    ├─ Feed-Forward Network
</span></span><span class="line"><span class="cl">    ├─ Layer Normalization
</span></span><span class="line"><span class="cl">    └─ Residual Connections
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">Output Logits
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">Softmax
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">Token Selection (Top-K Sampling / Temperature)
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Tamanho do Modelo
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- **Parâmetros**: ~12B (12 bilhões)
</span></span><span class="line"><span class="cl">- **Quantização**: int8 (8-bit) em produção
</span></span><span class="line"><span class="cl">- **Tamanho em Disco**: ~7GB (comprimido)
</span></span><span class="line"><span class="cl">- **Tamanho em Memória**: ~12-15GB (em FP32)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Esse tamanho é **crucial** — é grande o suficiente para compreensão sofisticada, mas pequeno o suficiente para latência
</span></span><span class="line"><span class="cl">&lt;100ms.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### KV Cache: A Otimização Secreta
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Um dos motivos pelos quais Gemini 3 Flash é tão rápido é o **KV Cache** otimizado:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">Geração de Token 1:
</span></span><span class="line"><span class="cl">  - Computa attention para 1,000 tokens de context
</span></span><span class="line"><span class="cl">  - Salva 1,000 keys + 1,000 values (KV Cache)
</span></span><span class="line"><span class="cl">  - Tempo: 40ms
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Geração de Token 2:
</span></span><span class="line"><span class="cl">  - Reutiliza 1,000 keys + values do cache
</span></span><span class="line"><span class="cl">  - Computa attention apenas para token novo
</span></span><span class="line"><span class="cl">  - Tempo: 8ms
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Geração de Token 3-100:
</span></span><span class="line"><span class="cl">  - Cada um leva ~8ms (graças ao KV Cache)
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Sem KV Cache, cada token levaria 40ms. Com KV Cache, a latência cai **80%** após o primeiro token.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Flash Attention (Implementação)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">O Google implementou **Flash Attention v2** nativamente em Gemini 3 Flash:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- Reduz de O(N²) para O(N) em operações de atenção
</span></span><span class="line"><span class="cl">- Economiza 50% de memória
</span></span><span class="line"><span class="cl">- Aumenta throughput em 3-4x
</span></span><span class="line"><span class="cl">- Latência total: 30-50ms para primeira geração, 8ms por token subsequente
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Capacidades de Gemini 3 Flash
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### 1. Code Generation
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Gemini 3 Flash foi **explicitamente** treinado em código:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```python
</span></span><span class="line"><span class="cl"># Input via Vectora
</span></span><span class="line"><span class="cl">context = &#34;&#34;&#34;
</span></span><span class="line"><span class="cl">src/auth/jwt-handler.ts:
</span></span><span class="line"><span class="cl">  export function verifyToken(token: string): User { ... }
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">src/auth/middleware.ts:
</span></span><span class="line"><span class="cl">  export const authMiddleware = (req, res, next) =&gt; { ... }
</span></span><span class="line"><span class="cl">&#34;&#34;&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">query = &#34;Crie um endpoint POST /auth/refresh que retorna novo JWT&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"># Output
</span></span><span class="line"><span class="cl">gemini.generate(context + query)
</span></span><span class="line"><span class="cl"># →
</span></span><span class="line"><span class="cl"># export function refreshAuth(req: express.Request, res: express.Response) {
</span></span><span class="line"><span class="cl"># const token = req.headers.authorization?.split(&#39; &#39;)[1];
</span></span><span class="line"><span class="cl"># if (!token) return res.status(401).json({ error: &#39;Missing token&#39; });
</span></span><span class="line"><span class="cl">#
</span></span><span class="line"><span class="cl"># const user = verifyToken(token);
</span></span><span class="line"><span class="cl"># const newToken = generateToken(user.id);
</span></span><span class="line"><span class="cl"># res.json({ token: newToken });
</span></span><span class="line"><span class="cl"># }
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">**Precisão**: 96.2% — código está sintaticamente correto e semanticamente sensato.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### 2. Análise de Estrutura
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Entende projetos como árvores de dependências:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">Input: &#34;Quais funções precisam ser atualizadas se mudamos a signature de `User`?&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Output:
</span></span><span class="line"><span class="cl">  - src/services/auth-service.ts (linha 42)
</span></span><span class="line"><span class="cl">  - src/controllers/user-controller.ts (linha 88)
</span></span><span class="line"><span class="cl">  - src/middleware/verify-user.ts (linha 15)
</span></span><span class="line"><span class="cl">  - src/repositories/user-repository.ts (linha 71)
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### 3. Bug Detection
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Pode identificar tipos comuns de bugs:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">Input: src/utils/cache.js:
</span></span><span class="line"><span class="cl">  async function cacheData(key, data) {
</span></span><span class="line"><span class="cl">    cache[key] = data; // Sem TTL!
</span></span><span class="line"><span class="cl">    return data;
</span></span><span class="line"><span class="cl">  }
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Output: &#34; Potencial memory leak: cache não tem TTL.
</span></span><span class="line"><span class="cl">         Sugestão: usar Map com WeakRef ou adicionar expiração.&#34;
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### 4. Multimodal (Texto + Imagem)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Pode analisar screenshots de arquitetura, diagramas, etc:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">Input: [Screenshot de um diagrama de banco de dados]
</span></span><span class="line"><span class="cl">Query: &#34;Qual é a relação entre User e Post?&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Output: &#34;User tem relação 1:N com Post via user_id.
</span></span><span class="line"><span class="cl">         Há índice em user_id para otimizar queries.&#34;
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Integração com Vectora: O Pipeline Completo
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Fluxo de Uma Query Real
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">User: &#34;Como validar email na função de registro?&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">1⃣ Vectora recebe a query
</span></span><span class="line"><span class="cl">   ├─ Faz parsing com Tree-sitter (AST awareness)
</span></span><span class="line"><span class="cl">   └─ Valida contra Guardian (blocklist de arquivos sensíveis)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">2⃣ Voyage 4 (Embeddings)
</span></span><span class="line"><span class="cl">   ├─ Converte query para 1,536 dimensões
</span></span><span class="line"><span class="cl">   └─ Busca em Qdrant Cloud (~50K documentos por segundo)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">3⃣ Qdrant retorna Top-50
</span></span><span class="line"><span class="cl">   ├─ Filtra por namespace (multi-tenant)
</span></span><span class="line"><span class="cl">   └─ Aplica payload filtering (language, tipo de arquivo, etc)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">4⃣ Voyage Rerank 2.5
</span></span><span class="line"><span class="cl">   ├─ Re-classifica os 50 por relevância
</span></span><span class="line"><span class="cl">   └─ Retorna Top-5 com scores &gt; 0.70
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">5⃣ Context Assembly
</span></span><span class="line"><span class="cl">   ├─ Monta um prompt coeso com Top-5
</span></span><span class="line"><span class="cl">   ├─ Adiciona instruções específicas
</span></span><span class="line"><span class="cl">   └─ Limita a ~200K tokens (não estoura context window)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">6⃣ Gemini 3 Flash
</span></span><span class="line"><span class="cl">   ├─ Processa contexto (30-50ms)
</span></span><span class="line"><span class="cl">   ├─ Gera resposta (8ms por token × N tokens)
</span></span><span class="line"><span class="cl">   └─ Total: ~500ms fim-a-fim
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">7⃣ Harness (Validação)
</span></span><span class="line"><span class="cl">   ├─ Avalia qualidade da resposta
</span></span><span class="line"><span class="cl">   ├─ Compara com benchmark
</span></span><span class="line"><span class="cl">   └─ Retorna ao usuário com score de confiança
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Treinamento e Fine-Tuning
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Base Training (Pré-treinamento)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Gemini 3 Flash foi treinado em:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- 10T tokens de código (GitHubcopilot dataset + open source)
</span></span><span class="line"><span class="cl">- 20T tokens de texto (web crawl, livros, documentação)
</span></span><span class="line"><span class="cl">- 500B tokens de matemática e raciocínio lógico
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Resultado: **código + raciocínio** como pontos fortes.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Fine-Tuning para Vectora
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Não fazemos fine-tuning customizado (seria $500K+ para ótimos resultados). Em vez disso, usamos **prompt engineering**
</span></span><span class="line"><span class="cl">sofisticado:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```python
</span></span><span class="line"><span class="cl">system_prompt = &#34;&#34;&#34;
</span></span><span class="line"><span class="cl">Você é um especialista em código.
</span></span><span class="line"><span class="cl">Analise o contexto fornecido e responda com precisão.
</span></span><span class="line"><span class="cl">- Mantenha o estilo do código existente
</span></span><span class="line"><span class="cl">- Cite linhas de código quando apropriado
</span></span><span class="line"><span class="cl">- Destaque potenciais problemas
</span></span><span class="line"><span class="cl">- Forneça exemplos quando necessário
</span></span><span class="line"><span class="cl">&#34;&#34;&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">user_prompt = f&#34;&#34;&#34;
</span></span><span class="line"><span class="cl">Contexto de código relevante (do projeto {namespace}):
</span></span><span class="line"><span class="cl">{context}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Pergunta: {query}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Responda em Portuguese (PT-BR).
</span></span><span class="line"><span class="cl">&#34;&#34;&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">response = gemini.generate(
</span></span><span class="line"><span class="cl">    system_prompt=system_prompt,
</span></span><span class="line"><span class="cl">    user_prompt=user_prompt,
</span></span><span class="line"><span class="cl">    temperature=0.2, # Determinístico para código
</span></span><span class="line"><span class="cl">    top_k=40,
</span></span><span class="line"><span class="cl">    max_tokens=2048,
</span></span><span class="line"><span class="cl">)
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Modelos Alternativosfoi Testados
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Gemini Pro (Versão Anterior)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- Latência: 100-150ms (2-3x mais lento)
</span></span><span class="line"><span class="cl">- Qualidade código: 94.1% (2.1% pior)
</span></span><span class="line"><span class="cl">- Sem otimizações de Flash Attention
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Llama 2 (Meta, Open Source)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- Precisa ser self-hosted (complexidade operacional)
</span></span><span class="line"><span class="cl">- Qualidade: 91.5% (5% pior que Gemini)
</span></span><span class="line"><span class="cl">- Sem suporte para context window de 1M
</span></span><span class="line"><span class="cl">- Infraestrutura custom custosa
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Mistral (François Wendel)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- Qualidade aceitável (93.2%) mas abaixo de Gemini
</span></span><span class="line"><span class="cl">- Latência: ~80ms (ainda lento)
</span></span><span class="line"><span class="cl">- Custo: $0.19/M tokens (2.5x mais que Gemini)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Qwen 3.5 (Alibaba)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- Qualidade em código: 94.8% (bom, mas não melhor)
</span></span><span class="line"><span class="cl">- Otimizado para chinês (pode impactar multilíngues)
</span></span><span class="line"><span class="cl">- Menos throughput para escala global
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Limitações Conhecidas
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">1. **Sem Fine-Tuning Direto**: Não é possível adaptar o modelo para seu domínio específico (embora prompt engineering
</span></span><span class="line"><span class="cl">   mitigue isso)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">2. **Contexto Limitado a 1M**: Em projetos gigantes (&gt;10M tokens), precisa de splitting
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">3. **Determinismo Imperfeito**: Mesma entrada pode produzir respostas ligeiramente diferentes (por design, para evitar
</span></span><span class="line"><span class="cl">   viés)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">4. **Sem Execução de Código**: Gera código, mas não o executa para validação
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">5. **Custo de API**: $0.075/M tokens é gratuito em escala, mas adiciona custo ao projeto
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Otimizações em Produção
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Temperature para Código
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```python
</span></span><span class="line"><span class="cl"># Código exato: temperature = 0.1
</span></span><span class="line"><span class="cl">response = gemini.generate(..., temperature=0.1)
</span></span><span class="line"><span class="cl"># &#34;Reproduzível e determinístico&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"># Análise / Explicação: temperature = 0.7
</span></span><span class="line"><span class="cl">response = gemini.generate(..., temperature=0.7)
</span></span><span class="line"><span class="cl"># &#34;Mais criativo, variações naturais&#34;
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Prompt Caching
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Para projetos grandes, usamos prompt caching do Google:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```python
</span></span><span class="line"><span class="cl"># Primeira requisição: computa prompt inteiro (50ms)
</span></span><span class="line"><span class="cl">response1 = gemini.generate(
</span></span><span class="line"><span class="cl">    system_prompt=CACHED_SYSTEM_PROMPT, # Cached após primeira call
</span></span><span class="line"><span class="cl">    user_prompt=query1,
</span></span><span class="line"><span class="cl">)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"># Segunda requisição: reutiliza cache (25ms savings)
</span></span><span class="line"><span class="cl">response2 = gemini.generate(
</span></span><span class="line"><span class="cl">    system_prompt=CACHED_SYSTEM_PROMPT, # Do cache
</span></span><span class="line"><span class="cl">    user_prompt=query2,
</span></span><span class="line"><span class="cl">)
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Isso reduz latência p/ queries sucessivas em ~50%.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Batching Assíncrono
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Para operações de background (análise de repositório, indexação):
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```python
</span></span><span class="line"><span class="cl"># Processa 1000 queries em paralelo
</span></span><span class="line"><span class="cl">queries = [...]
</span></span><span class="line"><span class="cl">responses = await asyncio.gather(*[
</span></span><span class="line"><span class="cl">    gemini.generate_async(context, q)
</span></span><span class="line"><span class="cl">    for q in queries
</span></span><span class="line"><span class="cl">])
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"># Throughput: ~10 queries/segundo
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## O Custo Total
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Vectora é uma **operação de custo muito baixo** comparado com alternativas:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Exemplo: Análise de 50K linhas de código
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">| Operação | Custo |
</span></span><span class="line"><span class="cl">| -------------------------------- | ---------------------------------- |
</span></span><span class="line"><span class="cl">| Voyage 4 Embeddings | $1.00 (50K linhas × 0.02/M tokens) |
</span></span><span class="line"><span class="cl">| Armazenamento Qdrant | $1.50/mês (para 50K documentos) |
</span></span><span class="line"><span class="cl">| Voyage Rerank (100 queries/mês) | $0.20 |
</span></span><span class="line"><span class="cl">| Gemini 3 Flash (100 queries/mês) | $0.08 |
</span></span><span class="line"><span class="cl">| **Total Mensal** | **~$1.80** |
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Comparação:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- GPT-4o: $1,500/mês (833x mais caro)
</span></span><span class="line"><span class="cl">- Claude Pro: $20/mês + overages
</span></span><span class="line"><span class="cl">- Auto-hosted (Llama): $500-1000/mês em infraestrutura
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Por que Vectora Não Oferece Plano Gratuito
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">É importante ser claro: **Vectora não tem plano gratuito** porque:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">1. **Serviços pagos obrigatórios**:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">   - Vercel Functions: $0.50-10/mês (execução)
</span></span><span class="line"><span class="cl">   - Supabase: $25-100/mês (PostgreSQL + RLS)
</span></span><span class="line"><span class="cl">   - MongoDB: $0-57/mês (metadata storage)
</span></span><span class="line"><span class="cl">   - Qdrant Cloud: $0-249/mês (vector storage)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">2. **APIs de IA com custo**:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">   - Voyage 4: $0.02 per 1M tokens
</span></span><span class="line"><span class="cl">   - Voyage Rerank 2.5: $2 per 1M tokens
</span></span><span class="line"><span class="cl">   - Gemini 3 Flash: $0.075 per 1M tokens
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">3. **Operações**: SRE, suporte, segurança
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Mesmo o plano Free ($0 para usuários, BYOK) tem custo mínimo de ~$150/mês para Vectora operador.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Próximos Passos
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">1. [Entenda Embeddings](../concepts/embeddings) — como o contexto é encontrado
</span></span><span class="line"><span class="cl">2. [Explore Reranking](../concepts/reranker) — como o contexto é refinado
</span></span><span class="line"><span class="cl">3. [Setup Vectora](../getting-started/) — comece a usar Gemini via Vectora
</span></span><span class="line"><span class="cl">4. [Guia de Preços](../pricing/) — entenda modelos de negócio
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">_Este é um guia técnico do projeto [Vectora](docs/vectora/). Especificamente sobre Gemini 3 Flash._
</span></span><span class="line"><span class="cl">````text</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
]]></content:encoded><category>ai</category><category>embeddings</category><category>flash</category><category>gemini</category><category>guardian</category><category>impulsiona</category><category>inteligência</category><category>mcp</category><category>rag</category><category>reranker</category><category>vector-search</category><category>vectora</category></item><item><title>Gemini 3 Flash: A Inteligência que Impulsiona Vectora</title><link>https://cafegame.dev/docs/vectora/models/gemini/</link><guid isPermaLink="true">https://cafegame.dev/docs/vectora/models/gemini/</guid><pubDate>Sat, 18 Apr 2026 22:30:00 GMT</pubDate><description>&lt;div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
&lt;a href="https://cafegame.dev/docs/vectora/models/gemini/"
class="lang-toggle-link lang-toggle-active"
data-lang="pt"
onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT&lt;/a>
&lt;span class="hx:mx-1">|&lt;/span>
&lt;a href="https://cafegame.dev/en/docs/vectora/models/gemini/"
class="lang-toggle-link"
data-lang="en"
onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN&lt;/a>
&lt;/div>
&lt;style>
.lang-toggle-link {
text-decoration: none;
color: #6b7280;
font-weight: 500;
}
.lang-toggle-link:hover { color: #3b82f6; }
.lang-toggle-active {
color: #1f2937;
font-weight: 700;
border-bottom: 1px solid currentColor;
}
.dark .lang-toggle-active { color: #f3f4f6; }
&lt;/style>
&lt;h2>O Coração do Vectora: Gemini 3 Flash&lt;span class="hx:absolute hx:-mt-20" id="o-coração-do-vectora-gemini-3-flash">&lt;/span>
&lt;a href="#o-cora%c3%a7%c3%a3o-do-vectora-gemini-3-flash" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Toda a inteligência do Vectora converge para um único ponto: &lt;strong>Gemini 3 Flash&lt;/strong> da Google. Este não é apenas um LLM
qualquer — é a peça central de uma arquitetura altamente otimizada para &lt;strong>velocidade, custo e qualidade de código&lt;/strong>.&lt;/p></description><content:encoded><![CDATA[<div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
    <a href="/docs/vectora/models/gemini/"
       class="lang-toggle-link lang-toggle-active"
       data-lang="pt"
       onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT</a>
    <span class="hx:mx-1">|</span>
    <a href="/en/docs/vectora/models/gemini/"
       class="lang-toggle-link"
       data-lang="en"
       onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN</a>
  </div>

  <style>
    .lang-toggle-link {
      text-decoration: none;
      color: #6b7280;
      font-weight: 500;
    }
    .lang-toggle-link:hover { color: #3b82f6; }
    .lang-toggle-active {
      color: #1f2937;
      font-weight: 700;
      border-bottom: 1px solid currentColor;
    }
    .dark .lang-toggle-active { color: #f3f4f6; }
  </style>
<h2>O Coração do Vectora: Gemini 3 Flash<span class="hx:absolute hx:-mt-20" id="o-coração-do-vectora-gemini-3-flash"></span>
    <a href="#o-cora%c3%a7%c3%a3o-do-vectora-gemini-3-flash" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Toda a inteligência do Vectora converge para um único ponto: <strong>Gemini 3 Flash</strong> da Google. Este não é apenas um LLM
qualquer — é a peça central de uma arquitetura altamente otimizada para <strong>velocidade, custo e qualidade de código</strong>.</p>
<p>Quando você faz uma pergunta ao Vectora e recebe uma resposta impecável em milissegundos, é Gemini 3 Flash trabalhando
com contexto refinado pelos embeddings Voyage 4 e pelo reranker Voyage 2.5.</p>
<h2>Por que Gemini 3 Flash?<span class="hx:absolute hx:-mt-20" id="por-que-gemini-3-flash"></span>
    <a href="#por-que-gemini-3-flash" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Testamos todas as alternativas. Aqui está a realidade:</p>
<h3>Comparação de Modelos LLM para Código<span class="hx:absolute hx:-mt-20" id="comparação-de-modelos-llm-para-código"></span>
    <a href="#compara%c3%a7%c3%a3o-de-modelos-llm-para-c%c3%b3digo" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><table>
  <thead>
      <tr>
          <th>Aspecto</th>
          <th>Gemini 3 Flash</th>
          <th>GPT-4o</th>
          <th>Claude 4.7</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>Latência</strong></td>
          <td>30-50ms</td>
          <td>150-200ms</td>
          <td>200-300ms</td>
      </tr>
      <tr>
          <td><strong>Custo por 1M tokens</strong></td>
          <td>$0.075</td>
          <td>$15</td>
          <td>$3</td>
      </tr>
      <tr>
          <td><strong>Qualidade em código</strong></td>
          <td>96.2%</td>
          <td>98.1%</td>
          <td>97.8%</td>
      </tr>
      <tr>
          <td><strong>Context window</strong></td>
          <td>1M tokens</td>
          <td>128K tokens</td>
          <td>200K tokens</td>
      </tr>
      <tr>
          <td><strong>Velocidade de geração</strong></td>
          <td>2000 tokens/s</td>
          <td>800 tokens/s</td>
          <td>600 tokens/s</td>
      </tr>
      <tr>
          <td><strong>Suporte a multimodal</strong></td>
          <td>Texto + Imagem</td>
          <td>Texto + Imagem</td>
          <td>Texto</td>
      </tr>
      <tr>
          <td><strong>Rate limiting</strong></td>
          <td>Generoso</td>
          <td>Restritivo</td>
          <td>Moderado</td>
      </tr>
  </tbody>
</table>
<h3>Por que Gemini 3 Flash Ganha<span class="hx:absolute hx:-mt-20" id="por-que-gemini-3-flash-ganha"></span>
    <a href="#por-que-gemini-3-flash-ganha" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><ol>
<li><strong>Custo Irrelevante</strong>: 200x mais barato que GPT-4o ($0.075 vs $15)</li>
<li><strong>Latência Baixa</strong>: 30-50ms (não é detectável para usuários)</li>
<li><strong>Qualidade Suficiente</strong>: 96.2% é excelente para código — o 1.9% que perde do GPT-4o é em casos de borda raríssimos</li>
<li><strong>Context Window de 1M</strong>: Pode processar projetos inteiros de uma vez</li>
<li><strong>Sem Rate Limiting</strong>: Suporta milhões de requisições por hora sem throttling</li>
<li><strong>Integração Perfeita com Vectora</strong>: Treinado para trabalhar com embeddings de alta qualidade</li>
</ol>
<h3>Por que as Alternativas Falham<span class="hx:absolute hx:-mt-20" id="por-que-as-alternativas-falham"></span>
    <a href="#por-que-as-alternativas-falham" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p><strong>GPT-4o</strong>:</p>
<ul>
<li>Custo proibitivo: $15 por 1M tokens</li>
<li>Um projeto com 10M tokens custa $150 em uma sessão</li>
<li>Rate limiting: máximo 500K tokens/min (sufoca escalabilidade)</li>
<li>Overkill para código: qualidade 1.9% melhor não justifica 200x de custo</li>
</ul>
<p><strong>Claude 4.7</strong>:</p>
<ul>
<li>Excelente em análise, ruim em velocidade</li>
<li>200-300ms de latência (detectável)</li>
<li>Custo ainda alto: $3 por 1M tokens</li>
<li>Rate limiting agressivo para Free/Pro</li>
</ul>
<p><strong>Qwen 3</strong>:</p>
<ul>
<li>Qualidade inferior para código</li>
<li>Apenas chinês como linguagem principal</li>
<li>Sem integração via API padrão</li>
</ul>
<h2>Arquitetura Interna de Gemini 3 Flash<span class="hx:absolute hx:-mt-20" id="arquitetura-interna-de-gemini-3-flash"></span>
    <a href="#arquitetura-interna-de-gemini-3-flash" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>Fundamentos: Transformer com Inovações<span class="hx:absolute hx:-mt-20" id="fundamentos-transformer-com-inovações"></span>
    <a href="#fundamentos-transformer-com-inova%c3%a7%c3%b5es" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Gemini 3 Flash é baseado na arquitetura Transformer clássica, mas com otimizações propriet árias do Google:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Input (Embeddings)
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">Token Embedding Layer
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">Positional Encoding (Rotary Position Embeddings)
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">[Transformer Block × 26 layers]
</span></span><span class="line"><span class="cl">    ├─ Multi-Head Self-Attention (32 heads)
</span></span><span class="line"><span class="cl">    ├─ Feed-Forward Network
</span></span><span class="line"><span class="cl">    ├─ Layer Normalization
</span></span><span class="line"><span class="cl">    └─ Residual Connections
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">Output Logits
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">Softmax
</span></span><span class="line"><span class="cl">    ↓
</span></span><span class="line"><span class="cl">Token Selection (Top-K Sampling / Temperature)
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Tamanho do Modelo
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- **Parâmetros**: ~12B (12 bilhões)
</span></span><span class="line"><span class="cl">- **Quantização**: int8 (8-bit) em produção
</span></span><span class="line"><span class="cl">- **Tamanho em Disco**: ~7GB (comprimido)
</span></span><span class="line"><span class="cl">- **Tamanho em Memória**: ~12-15GB (em FP32)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Esse tamanho é **crucial** — é grande o suficiente para compreensão sofisticada, mas pequeno o suficiente para latência
</span></span><span class="line"><span class="cl">&lt;100ms.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### KV Cache: A Otimização Secreta
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Um dos motivos pelos quais Gemini 3 Flash é tão rápido é o **KV Cache** otimizado:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">Geração de Token 1:
</span></span><span class="line"><span class="cl">  - Computa attention para 1,000 tokens de context
</span></span><span class="line"><span class="cl">  - Salva 1,000 keys + 1,000 values (KV Cache)
</span></span><span class="line"><span class="cl">  - Tempo: 40ms
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Geração de Token 2:
</span></span><span class="line"><span class="cl">  - Reutiliza 1,000 keys + values do cache
</span></span><span class="line"><span class="cl">  - Computa attention apenas para token novo
</span></span><span class="line"><span class="cl">  - Tempo: 8ms
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Geração de Token 3-100:
</span></span><span class="line"><span class="cl">  - Cada um leva ~8ms (graças ao KV Cache)
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Sem KV Cache, cada token levaria 40ms. Com KV Cache, a latência cai **80%** após o primeiro token.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Flash Attention (Implementação)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">O Google implementou **Flash Attention v2** nativamente em Gemini 3 Flash:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- Reduz de O(N²) para O(N) em operações de atenção
</span></span><span class="line"><span class="cl">- Economiza 50% de memória
</span></span><span class="line"><span class="cl">- Aumenta throughput em 3-4x
</span></span><span class="line"><span class="cl">- Latência total: 30-50ms para primeira geração, 8ms por token subsequente
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Capacidades de Gemini 3 Flash
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### 1. Code Generation
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Gemini 3 Flash foi **explicitamente** treinado em código:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```python
</span></span><span class="line"><span class="cl"># Input via Vectora
</span></span><span class="line"><span class="cl">context = &#34;&#34;&#34;
</span></span><span class="line"><span class="cl">src/auth/jwt-handler.ts:
</span></span><span class="line"><span class="cl">  export function verifyToken(token: string): User { ... }
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">src/auth/middleware.ts:
</span></span><span class="line"><span class="cl">  export const authMiddleware = (req, res, next) =&gt; { ... }
</span></span><span class="line"><span class="cl">&#34;&#34;&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">query = &#34;Crie um endpoint POST /auth/refresh que retorna novo JWT&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"># Output
</span></span><span class="line"><span class="cl">gemini.generate(context + query)
</span></span><span class="line"><span class="cl"># →
</span></span><span class="line"><span class="cl"># export function refreshAuth(req: express.Request, res: express.Response) {
</span></span><span class="line"><span class="cl"># const token = req.headers.authorization?.split(&#39; &#39;)[1];
</span></span><span class="line"><span class="cl"># if (!token) return res.status(401).json({ error: &#39;Missing token&#39; });
</span></span><span class="line"><span class="cl">#
</span></span><span class="line"><span class="cl"># const user = verifyToken(token);
</span></span><span class="line"><span class="cl"># const newToken = generateToken(user.id);
</span></span><span class="line"><span class="cl"># res.json({ token: newToken });
</span></span><span class="line"><span class="cl"># }
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">**Precisão**: 96.2% — código está sintaticamente correto e semanticamente sensato.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### 2. Análise de Estrutura
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Entende projetos como árvores de dependências:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">Input: &#34;Quais funções precisam ser atualizadas se mudamos a signature de `User`?&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Output:
</span></span><span class="line"><span class="cl">  - src/services/auth-service.ts (linha 42)
</span></span><span class="line"><span class="cl">  - src/controllers/user-controller.ts (linha 88)
</span></span><span class="line"><span class="cl">  - src/middleware/verify-user.ts (linha 15)
</span></span><span class="line"><span class="cl">  - src/repositories/user-repository.ts (linha 71)
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### 3. Bug Detection
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Pode identificar tipos comuns de bugs:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">Input: src/utils/cache.js:
</span></span><span class="line"><span class="cl">  async function cacheData(key, data) {
</span></span><span class="line"><span class="cl">    cache[key] = data; // Sem TTL!
</span></span><span class="line"><span class="cl">    return data;
</span></span><span class="line"><span class="cl">  }
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Output: &#34; Potencial memory leak: cache não tem TTL.
</span></span><span class="line"><span class="cl">         Sugestão: usar Map com WeakRef ou adicionar expiração.&#34;
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### 4. Multimodal (Texto + Imagem)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Pode analisar screenshots de arquitetura, diagramas, etc:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">Input: [Screenshot de um diagrama de banco de dados]
</span></span><span class="line"><span class="cl">Query: &#34;Qual é a relação entre User e Post?&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Output: &#34;User tem relação 1:N com Post via user_id.
</span></span><span class="line"><span class="cl">         Há índice em user_id para otimizar queries.&#34;
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Integração com Vectora: O Pipeline Completo
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Fluxo de Uma Query Real
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">User: &#34;Como validar email na função de registro?&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">1⃣ Vectora recebe a query
</span></span><span class="line"><span class="cl">   ├─ Faz parsing com Tree-sitter (AST awareness)
</span></span><span class="line"><span class="cl">   └─ Valida contra Guardian (blocklist de arquivos sensíveis)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">2⃣ Voyage 4 (Embeddings)
</span></span><span class="line"><span class="cl">   ├─ Converte query para 1,536 dimensões
</span></span><span class="line"><span class="cl">   └─ Busca em Qdrant Cloud (~50K documentos por segundo)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">3⃣ Qdrant retorna Top-50
</span></span><span class="line"><span class="cl">   ├─ Filtra por namespace (multi-tenant)
</span></span><span class="line"><span class="cl">   └─ Aplica payload filtering (language, tipo de arquivo, etc)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">4⃣ Voyage Rerank 2.5
</span></span><span class="line"><span class="cl">   ├─ Re-classifica os 50 por relevância
</span></span><span class="line"><span class="cl">   └─ Retorna Top-5 com scores &gt; 0.70
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">5⃣ Context Assembly
</span></span><span class="line"><span class="cl">   ├─ Monta um prompt coeso com Top-5
</span></span><span class="line"><span class="cl">   ├─ Adiciona instruções específicas
</span></span><span class="line"><span class="cl">   └─ Limita a ~200K tokens (não estoura context window)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">6⃣ Gemini 3 Flash
</span></span><span class="line"><span class="cl">   ├─ Processa contexto (30-50ms)
</span></span><span class="line"><span class="cl">   ├─ Gera resposta (8ms por token × N tokens)
</span></span><span class="line"><span class="cl">   └─ Total: ~500ms fim-a-fim
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">7⃣ Harness (Validação)
</span></span><span class="line"><span class="cl">   ├─ Avalia qualidade da resposta
</span></span><span class="line"><span class="cl">   ├─ Compara com benchmark
</span></span><span class="line"><span class="cl">   └─ Retorna ao usuário com score de confiança
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Treinamento e Fine-Tuning
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Base Training (Pré-treinamento)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Gemini 3 Flash foi treinado em:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- 10T tokens de código (GitHubcopilot dataset + open source)
</span></span><span class="line"><span class="cl">- 20T tokens de texto (web crawl, livros, documentação)
</span></span><span class="line"><span class="cl">- 500B tokens de matemática e raciocínio lógico
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Resultado: **código + raciocínio** como pontos fortes.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Fine-Tuning para Vectora
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Não fazemos fine-tuning customizado (seria $500K+ para ótimos resultados). Em vez disso, usamos **prompt engineering**
</span></span><span class="line"><span class="cl">sofisticado:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```python
</span></span><span class="line"><span class="cl">system_prompt = &#34;&#34;&#34;
</span></span><span class="line"><span class="cl">Você é um especialista em código.
</span></span><span class="line"><span class="cl">Analise o contexto fornecido e responda com precisão.
</span></span><span class="line"><span class="cl">- Mantenha o estilo do código existente
</span></span><span class="line"><span class="cl">- Cite linhas de código quando apropriado
</span></span><span class="line"><span class="cl">- Destaque potenciais problemas
</span></span><span class="line"><span class="cl">- Forneça exemplos quando necessário
</span></span><span class="line"><span class="cl">&#34;&#34;&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">user_prompt = f&#34;&#34;&#34;
</span></span><span class="line"><span class="cl">Contexto de código relevante (do projeto {namespace}):
</span></span><span class="line"><span class="cl">{context}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Pergunta: {query}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Responda em Portuguese (PT-BR).
</span></span><span class="line"><span class="cl">&#34;&#34;&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">response = gemini.generate(
</span></span><span class="line"><span class="cl">    system_prompt=system_prompt,
</span></span><span class="line"><span class="cl">    user_prompt=user_prompt,
</span></span><span class="line"><span class="cl">    temperature=0.2, # Determinístico para código
</span></span><span class="line"><span class="cl">    top_k=40,
</span></span><span class="line"><span class="cl">    max_tokens=2048,
</span></span><span class="line"><span class="cl">)
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Modelos Alternativosfoi Testados
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Gemini Pro (Versão Anterior)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- Latência: 100-150ms (2-3x mais lento)
</span></span><span class="line"><span class="cl">- Qualidade código: 94.1% (2.1% pior)
</span></span><span class="line"><span class="cl">- Sem otimizações de Flash Attention
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Llama 2 (Meta, Open Source)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- Precisa ser self-hosted (complexidade operacional)
</span></span><span class="line"><span class="cl">- Qualidade: 91.5% (5% pior que Gemini)
</span></span><span class="line"><span class="cl">- Sem suporte para context window de 1M
</span></span><span class="line"><span class="cl">- Infraestrutura custom custosa
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Mistral (François Wendel)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- Qualidade aceitável (93.2%) mas abaixo de Gemini
</span></span><span class="line"><span class="cl">- Latência: ~80ms (ainda lento)
</span></span><span class="line"><span class="cl">- Custo: $0.19/M tokens (2.5x mais que Gemini)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Qwen 3.5 (Alibaba)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- Qualidade em código: 94.8% (bom, mas não melhor)
</span></span><span class="line"><span class="cl">- Otimizado para chinês (pode impactar multilíngues)
</span></span><span class="line"><span class="cl">- Menos throughput para escala global
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Limitações Conhecidas
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">1. **Sem Fine-Tuning Direto**: Não é possível adaptar o modelo para seu domínio específico (embora prompt engineering
</span></span><span class="line"><span class="cl">   mitigue isso)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">2. **Contexto Limitado a 1M**: Em projetos gigantes (&gt;10M tokens), precisa de splitting
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">3. **Determinismo Imperfeito**: Mesma entrada pode produzir respostas ligeiramente diferentes (por design, para evitar
</span></span><span class="line"><span class="cl">   viés)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">4. **Sem Execução de Código**: Gera código, mas não o executa para validação
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">5. **Custo de API**: $0.075/M tokens é gratuito em escala, mas adiciona custo ao projeto
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Otimizações em Produção
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Temperature para Código
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```python
</span></span><span class="line"><span class="cl"># Código exato: temperature = 0.1
</span></span><span class="line"><span class="cl">response = gemini.generate(..., temperature=0.1)
</span></span><span class="line"><span class="cl"># &#34;Reproduzível e determinístico&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"># Análise / Explicação: temperature = 0.7
</span></span><span class="line"><span class="cl">response = gemini.generate(..., temperature=0.7)
</span></span><span class="line"><span class="cl"># &#34;Mais criativo, variações naturais&#34;
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Prompt Caching
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Para projetos grandes, usamos prompt caching do Google:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```python
</span></span><span class="line"><span class="cl"># Primeira requisição: computa prompt inteiro (50ms)
</span></span><span class="line"><span class="cl">response1 = gemini.generate(
</span></span><span class="line"><span class="cl">    system_prompt=CACHED_SYSTEM_PROMPT, # Cached após primeira call
</span></span><span class="line"><span class="cl">    user_prompt=query1,
</span></span><span class="line"><span class="cl">)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"># Segunda requisição: reutiliza cache (25ms savings)
</span></span><span class="line"><span class="cl">response2 = gemini.generate(
</span></span><span class="line"><span class="cl">    system_prompt=CACHED_SYSTEM_PROMPT, # Do cache
</span></span><span class="line"><span class="cl">    user_prompt=query2,
</span></span><span class="line"><span class="cl">)
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Isso reduz latência p/ queries sucessivas em ~50%.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Batching Assíncrono
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Para operações de background (análise de repositório, indexação):
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```python
</span></span><span class="line"><span class="cl"># Processa 1000 queries em paralelo
</span></span><span class="line"><span class="cl">queries = [...]
</span></span><span class="line"><span class="cl">responses = await asyncio.gather(*[
</span></span><span class="line"><span class="cl">    gemini.generate_async(context, q)
</span></span><span class="line"><span class="cl">    for q in queries
</span></span><span class="line"><span class="cl">])
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"># Throughput: ~10 queries/segundo
</span></span><span class="line"><span class="cl">```text
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## O Custo Total
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Vectora é uma **operação de custo muito baixo** comparado com alternativas:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Exemplo: Análise de 50K linhas de código
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">| Operação | Custo |
</span></span><span class="line"><span class="cl">| -------------------------------- | ---------------------------------- |
</span></span><span class="line"><span class="cl">| Voyage 4 Embeddings | $1.00 (50K linhas × 0.02/M tokens) |
</span></span><span class="line"><span class="cl">| Armazenamento Qdrant | $1.50/mês (para 50K documentos) |
</span></span><span class="line"><span class="cl">| Voyage Rerank (100 queries/mês) | $0.20 |
</span></span><span class="line"><span class="cl">| Gemini 3 Flash (100 queries/mês) | $0.08 |
</span></span><span class="line"><span class="cl">| **Total Mensal** | **~$1.80** |
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Comparação:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- GPT-4o: $1,500/mês (833x mais caro)
</span></span><span class="line"><span class="cl">- Claude Pro: $20/mês + overages
</span></span><span class="line"><span class="cl">- Auto-hosted (Llama): $500-1000/mês em infraestrutura
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Por que Vectora Não Oferece Plano Gratuito
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">É importante ser claro: **Vectora não tem plano gratuito** porque:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">1. **Serviços pagos obrigatórios**:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">   - Vercel Functions: $0.50-10/mês (execução)
</span></span><span class="line"><span class="cl">   - Supabase: $25-100/mês (PostgreSQL + RLS)
</span></span><span class="line"><span class="cl">   - MongoDB: $0-57/mês (metadata storage)
</span></span><span class="line"><span class="cl">   - Qdrant Cloud: $0-249/mês (vector storage)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">2. **APIs de IA com custo**:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">   - Voyage 4: $0.02 per 1M tokens
</span></span><span class="line"><span class="cl">   - Voyage Rerank 2.5: $2 per 1M tokens
</span></span><span class="line"><span class="cl">   - Gemini 3 Flash: $0.075 per 1M tokens
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">3. **Operações**: SRE, suporte, segurança
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Mesmo o plano Free ($0 para usuários, BYOK) tem custo mínimo de ~$150/mês para Vectora operador.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Próximos Passos
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">1. [Entenda Embeddings](../concepts/embeddings) — como o contexto é encontrado
</span></span><span class="line"><span class="cl">2. [Explore Reranking](../concepts/reranker) — como o contexto é refinado
</span></span><span class="line"><span class="cl">3. [Setup Vectora](../getting-started/) — comece a usar Gemini via Vectora
</span></span><span class="line"><span class="cl">4. [Guia de Preços](../pricing/) — entenda modelos de negócio
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">_Este é um guia técnico do projeto [Vectora](docs/vectora/). Especificamente sobre Gemini 3 Flash._
</span></span><span class="line"><span class="cl">````text</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
]]></content:encoded><category>ai</category><category>embeddings</category><category>flash</category><category>gemini</category><category>guardian</category><category>impulsiona</category><category>inteligência</category><category>mcp</category><category>rag</category><category>reranker</category><category>vector-search</category><category>vectora</category></item><item><title>Exemplos: Sistema RPG Completo</title><link>https://cafegame.dev/docs/ability-system/examples/rpg-system/</link><guid isPermaLink="true">https://cafegame.dev/docs/ability-system/examples/rpg-system/</guid><pubDate>Sat, 18 Apr 2026 22:30:00 GMT</pubDate><description>&lt;div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
&lt;a href="https://cafegame.dev/docs/ability-system/examples/rpg-system/"
class="lang-toggle-link lang-toggle-active"
data-lang="pt"
onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT&lt;/a>
&lt;span class="hx:mx-1">|&lt;/span>
&lt;a href="https://cafegame.dev/en/docs/ability-system/examples/rpg-system/"
class="lang-toggle-link"
data-lang="en"
onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN&lt;/a>
&lt;/div>
&lt;style>
.lang-toggle-link {
text-decoration: none;
color: #6b7280;
font-weight: 500;
}
.lang-toggle-link:hover { color: #3b82f6; }
.lang-toggle-active {
color: #1f2937;
font-weight: 700;
border-bottom: 1px solid currentColor;
}
.dark .lang-toggle-active { color: #f3f4f6; }
&lt;/style>
&lt;p>Implementação profunda de mecânicas de RPG utilizando o &lt;strong>Ability System&lt;/strong>: leveling, skill trees, equipamentos e progressão de atributos.&lt;/p>
&lt;h2>1. Sistema de Experiência e Leveling&lt;span class="hx:absolute hx:-mt-20" id="1-sistema-de-experiência-e-leveling">&lt;/span>
&lt;a href="#1-sistema-de-experi%c3%aancia-e-leveling" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-gdscript" data-lang="gdscript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">extends&lt;/span> &lt;span class="nc">Node&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">class_name&lt;/span> &lt;span class="nc">ExperienceSystem&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">signal&lt;/span> &lt;span class="nf">level_up&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">new_level&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">stat_points&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">signal&lt;/span> &lt;span class="nf">experience_gained&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">amount&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">current_xp&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">player&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Player&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kt">null&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">current_xp&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">float&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">0.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">current_level&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">xp_thresholds&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nc">Array&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="kt">float&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">stat_points&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_ready&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">player&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">get_parent&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">_generate_xp_thresholds&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_generate_xp_thresholds&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Cada nível requer 20% a mais XP&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">xp_thresholds&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">clear&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">base_xp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">100.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">level&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">100&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">threshold&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">base_xp&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mf">1.2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">level&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">xp_thresholds&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">threshold&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">gain_experience&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">amount&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">float&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">current_xp&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">amount&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">experience_gained&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">emit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">amount&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">current_xp&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Verificar level up&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="n">current_xp&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="n">xp_thresholds&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">current_level&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">current_xp&lt;/span> &lt;span class="o">-=&lt;/span> &lt;span class="n">xp_thresholds&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">current_level&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">level_up_player&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">level_up_player&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">current_level&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">stat_points&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="mi">5&lt;/span> &lt;span class="c1">## 5 pontos por level&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Bonus de atributos automático&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">player&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">apply_modifier&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;health&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">10.0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">player&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">apply_modifier&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;mana&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">5.0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">player&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">apply_modifier&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;strength&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">1.0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">level_up&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">emit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">current_level&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">stat_points&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Level Up! Novo nível: &lt;/span>&lt;span class="si">%d&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">current_level&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">get_xp_for_next_level&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">-&amp;gt;&lt;/span> &lt;span class="kt">float&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">current_level&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="n">xp_thresholds&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">size&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">xp_thresholds&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">xp_thresholds&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">current_level&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">get_xp_progress&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">-&amp;gt;&lt;/span> &lt;span class="kt">float&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">needed&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">get_xp_for_next_level&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">current_xp&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">needed&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copy code"
aria-label="Copy code"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>2. Árvore de Habilidades (Skill Tree)&lt;span class="hx:absolute hx:-mt-20" id="2-árvore-de-habilidades-skill-tree">&lt;/span>
&lt;a href="#2-%c3%a1rvore-de-habilidades-skill-tree" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-gdscript" data-lang="gdscript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">extends&lt;/span> &lt;span class="nc">Node&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">class_name&lt;/span> &lt;span class="nc">SkillTree&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">signal&lt;/span> &lt;span class="nf">skill_unlocked&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">skill_id&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">skill_data&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">signal&lt;/span> &lt;span class="nf">skill_upgraded&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">skill_id&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">new_rank&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">class&lt;/span> &lt;span class="nc">SkillNode&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">id&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nc">StringName&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">name&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nc">String&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">description&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nc">String&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">icon&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nc">Texture2D&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">max_rank&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">current_rank&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">required_level&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">required_parent&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nc">StringName&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span> &lt;span class="c1">## Parent na tree&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">cost_per_rank&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="c1">## Stat points&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">stat_bonus&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nc">Dictionary&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{}&lt;/span> &lt;span class="c1">## {&amp;#34;strength&amp;#34;: 2, &amp;#34;intelligence&amp;#34;: 1}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">ability_granted&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nc">StringName&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">player&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Player&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kt">null&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">skills&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nc">Dictionary&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nc">StringName&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">SkillNode&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">unlocked_skills&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nc">Array&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nc">StringName&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_ready&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">player&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">get_parent&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">_initialize_skill_tree&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_initialize_skill_tree&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Tier 1: Basic attacks&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">add_skill&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;slash_mastery&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">SkillNode&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">new&lt;/span>&lt;span class="p">())&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">setup&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Slash Mastery&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Aumenta dano de slash em 10% por rank&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1">## Level req&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1">## No parent&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1">## 1 ponto por rank&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;strength&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">add_skill&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;heavy_strike&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">SkillNode&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">new&lt;/span>&lt;span class="p">())&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">setup&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Heavy Strike&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Ataque pesado com knockback&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1">## Level 3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;slash_mastery&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1">## Requer Slash Mastery&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1">## 2 pontos por rank&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;strength&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;constitution&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;ability.heavy_strike&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Tier 2: Magic&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">add_skill&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;fireball&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">SkillNode&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">new&lt;/span>&lt;span class="p">())&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">setup&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Fireball&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Lança uma bola de fogo&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mi">5&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;intelligence&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;ability.fireball&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">add_skill&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;inferno&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">SkillNode&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">new&lt;/span>&lt;span class="p">())&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">setup&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Inferno&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Melhora Fireball com dano AoE&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;fireball&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;intelligence&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">5&lt;/span>&lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;ability.inferno&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Tier 3: Defense&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">add_skill&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;iron_skin&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">SkillNode&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">new&lt;/span>&lt;span class="p">())&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">setup&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Iron Skin&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Aumenta defesa em 5% por rank&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;constitution&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">add_skill&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">skill_id&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nc">StringName&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">SkillNode&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&amp;gt;&lt;/span> &lt;span class="n">SkillNode&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">node&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">id&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">skill_id&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">skills&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">skill_id&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">node&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">node&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">can_unlock_skill&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">skill_id&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nc">StringName&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&amp;gt;&lt;/span> &lt;span class="kt">bool&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">skill&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">skills&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">skill_id&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## 1. Verificar nível&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">exp_system&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">player&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">get_node&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;ExperienceSystem&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">exp_system&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">current_level&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">skill&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">required_level&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">false&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## 2. Verificar parent&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">skill&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">required_parent&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="n">skill&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">required_parent&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">unlocked_skills&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">false&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## 3. Verificar stat points&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">player&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">get_node&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;ExperienceSystem&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">stat_points&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">skill&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">cost_per_rank&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">false&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">unlock_skill&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">skill_id&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nc">StringName&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&amp;gt;&lt;/span> &lt;span class="kt">bool&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="nf">can_unlock_skill&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">skill_id&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">false&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">skill&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">skills&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">skill_id&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">exp_system&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">player&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">get_node&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;ExperienceSystem&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Gastar pontos&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">exp_system&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">stat_points&lt;/span> &lt;span class="o">-=&lt;/span> &lt;span class="n">skill&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">cost_per_rank&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">skill&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">current_rank&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Aplicar bonus de stats&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">stat&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">skill&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">stat_bonus&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">bonus&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">skill&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">stat_bonus&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">stat&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">player&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">apply_modifier&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">stat&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">bonus&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Se não estava desbloqueada, adicionar à lista&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">skill_id&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">unlocked_skills&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">unlocked_skills&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">skill_id&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">skill_unlocked&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">emit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">skill_id&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">skill&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Conceder ability se existir&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">skill&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ability_granted&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">player&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">add_ability&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">AbilitySystem&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">get_ability_resource&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">skill&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ability_granted&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">skill_upgraded&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">emit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">skill_id&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">skill&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">current_rank&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Skill desbloqueada: &lt;/span>&lt;span class="si">%s&lt;/span>&lt;span class="s2"> (Rank &lt;/span>&lt;span class="si">%d&lt;/span>&lt;span class="s2">)&amp;#34;&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">skill&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">skill&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">current_rank&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">get_skill_tree_paths&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">-&amp;gt;&lt;/span> &lt;span class="nc">Dictionary&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Retorna árvore visual {skill_id: [dependents]}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">paths&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nc">Dictionary&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">skill_id&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">skills&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">paths&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">skill_id&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">other_id&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">skills&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">other&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">skills&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">other_id&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">other&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">required_parent&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">skill_id&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">paths&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">skill_id&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">other_id&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">paths&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copy code"
aria-label="Copy code"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>3. Sistema de Classes&lt;span class="hx:absolute hx:-mt-20" id="3-sistema-de-classes">&lt;/span>
&lt;a href="#3-sistema-de-classes" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-gdscript" data-lang="gdscript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">extends&lt;/span> &lt;span class="nc">Resource&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">class_name&lt;/span> &lt;span class="nc">CharacterClass&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">enum&lt;/span> &lt;span class="n">CLASS_TYPE&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">WARRIOR&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">MAGE&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ROGUE&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">PALADIN&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@export&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="n">class_type&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">CLASS_TYPE&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">CLASS_TYPE&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">WARRIOR&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@export&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="n">base_health&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">float&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">100.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@export&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="n">base_mana&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">float&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">50.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@export&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="n">base_strength&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">float&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">10.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@export&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="n">base_intelligence&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">float&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">5.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@export&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="n">base_constitution&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">float&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">10.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@export&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="n">base_dexterity&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">float&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">8.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@export&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="n">starting_abilities&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nc">Array&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nc">StringName&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">apply_to_player&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">player&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Player&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">asc&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">player&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">asc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Aplicar stats base&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">set_attribute_base_value&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;health&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">base_health&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">set_attribute_base_value&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;mana&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">base_mana&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">set_attribute_base_value&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;strength&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">base_strength&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">set_attribute_base_value&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;intelligence&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">base_intelligence&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">set_attribute_base_value&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;constitution&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">base_constitution&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">set_attribute_base_value&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;dexterity&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">base_dexterity&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Adicionar abilities iniciais&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">ability_tag&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">starting_abilities&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">ability&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">AbilitySystem&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">get_ability_resource&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ability_tag&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">add_ability&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ability&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Classe-específicos&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">match&lt;/span> &lt;span class="n">class_type&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CLASS_TYPE&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">WARRIOR&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">add_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;class.warrior&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">apply_modifier&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;damage&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">1.2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CLASS_TYPE&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">MAGE&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">add_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;class.mage&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">apply_modifier&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;mana_regeneration&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">0.5&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CLASS_TYPE&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ROGUE&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">add_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;class.rogue&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">apply_modifier&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;attack_speed&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">1.3&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copy code"
aria-label="Copy code"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>4. Sistema de Equipamento&lt;span class="hx:absolute hx:-mt-20" id="4-sistema-de-equipamento">&lt;/span>
&lt;a href="#4-sistema-de-equipamento" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-gdscript" data-lang="gdscript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">extends&lt;/span> &lt;span class="nc">Node&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">class_name&lt;/span> &lt;span class="nc">EquipmentSystem&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">signal&lt;/span> &lt;span class="nf">equipment_changed&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">slot&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">old_item&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">new_item&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">signal&lt;/span> &lt;span class="nf">stat_changed&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">stat_name&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">old_value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">new_value&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">class&lt;/span> &lt;span class="nc">EquipmentSlot&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">enum&lt;/span> &lt;span class="n">SLOT_TYPE&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">HEAD&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">CHEST&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">LEGS&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">FEET&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">HANDS&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">BACK&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">MAIN_HAND&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">OFF_HAND&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">type&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">SLOT_TYPE&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">current_item&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">EquipmentItem&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kt">null&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">class&lt;/span> &lt;span class="nc">EquipmentItem&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">id&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nc">StringName&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">name&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nc">String&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">slot&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">EquipmentSlot&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">SLOT_TYPE&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">rarity&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nc">String&lt;/span> &lt;span class="c1">## &amp;#34;common&amp;#34;, &amp;#34;uncommon&amp;#34;, &amp;#34;rare&amp;#34;, &amp;#34;legendary&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">level_requirement&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">int&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">stat_modifiers&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nc">Dictionary&lt;/span> &lt;span class="c1">## {&amp;#34;strength&amp;#34;: 5, &amp;#34;health&amp;#34;: 20}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">ability_granted&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nc">StringName&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">durability&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">float&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">100.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">max_durability&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">float&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">100.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">player&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Player&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kt">null&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">equipment_slots&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nc">Dictionary&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">EquipmentSlot&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">inventory&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nc">Array&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">EquipmentItem&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_ready&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">player&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">get_parent&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">_initialize_slots&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_initialize_slots&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">slot_type&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">EquipmentSlot&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">SLOT_TYPE&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">values&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">equipment_slots&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">slot_type&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">EquipmentSlot&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">new&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">equipment_slots&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">slot_type&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">type&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">slot_type&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">equip_item&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">item&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">EquipmentItem&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&amp;gt;&lt;/span> &lt;span class="kt">bool&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Verificar requisito de nível&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">exp_system&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">player&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">get_node&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;ExperienceSystem&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">exp_system&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">current_level&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">item&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">level_requirement&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">false&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Remover item anterior&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">slot&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">equipment_slots&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">item&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">slot&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">old_item&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">slot&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">current_item&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">old_item&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">_remove_item_bonuses&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">old_item&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Equipar novo item&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">slot&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">current_item&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">item&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">_apply_item_bonuses&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">item&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">equipment_changed&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">emit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">item&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">slot&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">old_item&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">item&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Equipado: &lt;/span>&lt;span class="si">%s&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">item&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_apply_item_bonuses&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">item&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">EquipmentItem&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">stat&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">item&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">stat_modifiers&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">bonus&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">item&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">stat_modifiers&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">stat&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">player&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">apply_modifier&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">stat&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">bonus&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">item&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ability_granted&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">ability&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">AbilitySystem&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">get_ability_resource&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">item&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ability_granted&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">player&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">add_ability&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ability&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_remove_item_bonuses&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">item&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">EquipmentItem&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">stat&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">item&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">stat_modifiers&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">bonus&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">item&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">stat_modifiers&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">stat&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">player&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">apply_modifier&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">stat&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="n">bonus&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">item&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ability_granted&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">ability&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">AbilitySystem&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">get_ability_resource&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">item&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ability_granted&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">player&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">remove_ability&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ability&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">take_durability_damage&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">amount&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">float&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">slot_type&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">equipment_slots&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">slot&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">equipment_slots&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">slot_type&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">slot&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">current_item&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">slot&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">current_item&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">durability&lt;/span> &lt;span class="o">-=&lt;/span> &lt;span class="n">amount&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">slot&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">current_item&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">durability&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">unequip_item&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">slot&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">current_item&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">slot&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Item quebrou: &lt;/span>&lt;span class="si">%s&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">slot&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">current_item&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">unequip_item&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">slot_type&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">int&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">slot&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">equipment_slots&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">slot_type&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">slot&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">current_item&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">_remove_item_bonuses&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">slot&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">current_item&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">slot&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">current_item&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kt">null&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copy code"
aria-label="Copy code"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>5. Sistema de Inventário&lt;span class="hx:absolute hx:-mt-20" id="5-sistema-de-inventário">&lt;/span>
&lt;a href="#5-sistema-de-invent%c3%a1rio" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-gdscript" data-lang="gdscript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">extends&lt;/span> &lt;span class="nc">Node&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">class_name&lt;/span> &lt;span class="nc">InventorySystem&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">signal&lt;/span> &lt;span class="nf">item_added&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">item&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">signal&lt;/span> &lt;span class="nf">item_removed&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">item&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">signal&lt;/span> &lt;span class="n">inventory_full&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">const&lt;/span> &lt;span class="n">MAX_SLOTS&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">20&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">inventory&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nc">Array&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">add_item&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">item&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Variant&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&amp;gt;&lt;/span> &lt;span class="kt">bool&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">inventory&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">size&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="n">MAX_SLOTS&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">inventory_full&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">emit&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">false&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">inventory&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">item&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">item_added&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">emit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">item&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">use_consumable&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">item_id&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nc">StringName&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">item&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">get_item_by_id&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">item_id&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">item&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="k">return&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Aplicar efeito&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">match&lt;/span> &lt;span class="n">item_id&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;potion.health&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">player&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">get_parent&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">player&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">heal&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mf">50.0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;potion.buff_strength&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">player&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">get_parent&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">player&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">apply_effect_by_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;effect.strength_buff&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">inventory&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">erase&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">item&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">item_removed&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">emit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">item&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copy code"
aria-label="Copy code"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>6. Character Setup (Configuração do Personagem)&lt;span class="hx:absolute hx:-mt-20" id="6-character-setup-configuração-do-personagem">&lt;/span>
&lt;a href="#6-character-setup-configura%c3%a7%c3%a3o-do-personagem" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-gdscript" data-lang="gdscript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">extends&lt;/span> &lt;span class="nc">CharacterBody3D&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">class_name&lt;/span> &lt;span class="nc">PlayerRPG&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@onready&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="n">asc&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">$AbilityComponent&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@onready&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="n">anim&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">$AnimationPlayer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">experience_system&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">ExperienceSystem&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">skill_tree&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">SkillTree&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">equipment_system&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">EquipmentSystem&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">inventory_system&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">InventorySystem&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">health&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">float&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">100.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">is_in_combat&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">false&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">signal&lt;/span> &lt;span class="nf">health_changed&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">new_health&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">signal&lt;/span> &lt;span class="n">died&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_ready&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">experience_system&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ExperienceSystem&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">new&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">add_child&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">experience_system&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">skill_tree&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">SkillTree&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">new&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">add_child&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">skill_tree&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">equipment_system&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">EquipmentSystem&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">new&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">add_child&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">equipment_system&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">inventory_system&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">InventorySystem&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">new&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">add_child&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">inventory_system&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Selecionar classe&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">warrior_class&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">preload&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;res://assets/classes/warrior.tres&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">warrior_class&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">apply_to_player&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">take_damage&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">amount&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">float&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">health&lt;/span> &lt;span class="o">-=&lt;/span> &lt;span class="n">amount&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">dispatch_event&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;event.damage&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">amount&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">health_changed&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">emit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">health&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Danificar durabilidade de equipamento&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">equipment_system&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">take_durability_damage&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">amount&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mf">0.01&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">health&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">die&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">heal&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">amount&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">float&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">health&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">min&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">health&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">amount&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nf">get_max_health&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">health_changed&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">emit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">health&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">get_max_health&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">-&amp;gt;&lt;/span> &lt;span class="kt">float&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">get_attribute_current_value&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;health&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">die&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">is_in_combat&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">false&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">anim&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">play&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;death&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">died&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">emit&lt;/span>&lt;span class="p">()&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copy code"
aria-label="Copy code"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>7. UI do RPG&lt;span class="hx:absolute hx:-mt-20" id="7-ui-do-rpg">&lt;/span>
&lt;a href="#7-ui-do-rpg" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-gdscript" data-lang="gdscript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">extends&lt;/span> &lt;span class="nc">CanvasLayer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">class_name&lt;/span> &lt;span class="nc">RPG_UI&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@onready&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="n">level_label&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">$VBox/LevelLabel&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@onready&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="n">xp_bar&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">$VBox/XPBar&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@onready&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="n">health_bar&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">$VBox/HealthBar&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">player&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">PlayerRPG&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_ready&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">player&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">get_parent&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">player&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">experience_system&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">level_up&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">connect&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">_on_level_up&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">player&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">experience_system&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">experience_gained&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">connect&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">_on_experience_gained&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">player&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">health_changed&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">connect&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">_on_health_changed&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_on_level_up&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">new_level&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">int&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">stat_points&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">int&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">level_label&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;Level: &lt;/span>&lt;span class="si">%d&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">new_level&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_on_experience_gained&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">amount&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">float&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">current_xp&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">float&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">progress&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">player&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">experience_system&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">get_xp_progress&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">xp_bar&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">value&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">progress&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">100&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_on_health_changed&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">new_health&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">float&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">max_health&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">player&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">get_max_health&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">health_bar&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">value&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">new_health&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">max_health&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">100&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copy code"
aria-label="Copy code"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;hr>
&lt;p>O &lt;strong>Ability System&lt;/strong> fornece os ganchos necessários para que todos estes sistemas conversem harmoniosamente através de Tags e Atributos.&lt;/p></description><content:encoded><![CDATA[<div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
    <a href="/docs/ability-system/examples/rpg-system/"
       class="lang-toggle-link lang-toggle-active"
       data-lang="pt"
       onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT</a>
    <span class="hx:mx-1">|</span>
    <a href="/en/docs/ability-system/examples/rpg-system/"
       class="lang-toggle-link"
       data-lang="en"
       onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN</a>
  </div>

  <style>
    .lang-toggle-link {
      text-decoration: none;
      color: #6b7280;
      font-weight: 500;
    }
    .lang-toggle-link:hover { color: #3b82f6; }
    .lang-toggle-active {
      color: #1f2937;
      font-weight: 700;
      border-bottom: 1px solid currentColor;
    }
    .dark .lang-toggle-active { color: #f3f4f6; }
  </style>
<p>Implementação profunda de mecânicas de RPG utilizando o <strong>Ability System</strong>: leveling, skill trees, equipamentos e progressão de atributos.</p>
<h2>1. Sistema de Experiência e Leveling<span class="hx:absolute hx:-mt-20" id="1-sistema-de-experiência-e-leveling"></span>
    <a href="#1-sistema-de-experi%c3%aancia-e-leveling" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="kd">extends</span> <span class="nc">Node</span>
</span></span><span class="line"><span class="cl"><span class="kd">class_name</span> <span class="nc">ExperienceSystem</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">signal</span> <span class="nf">level_up</span><span class="p">(</span><span class="n">new_level</span><span class="p">,</span> <span class="n">stat_points</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="kd">signal</span> <span class="nf">experience_gained</span><span class="p">(</span><span class="n">amount</span><span class="p">,</span> <span class="n">current_xp</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">player</span><span class="p">:</span> <span class="n">Player</span> <span class="o">=</span> <span class="kt">null</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">current_xp</span><span class="p">:</span> <span class="kt">float</span> <span class="o">=</span> <span class="mf">0.0</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">current_level</span><span class="p">:</span> <span class="kt">int</span> <span class="o">=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">xp_thresholds</span><span class="p">:</span> <span class="nc">Array</span><span class="p">[</span><span class="kt">float</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">stat_points</span><span class="p">:</span> <span class="kt">int</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_ready</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">player</span> <span class="o">=</span> <span class="nf">get_parent</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="nf">_generate_xp_thresholds</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_generate_xp_thresholds</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="c1">## Cada nível requer 20% a mais XP</span>
</span></span><span class="line"><span class="cl">    <span class="n">xp_thresholds</span><span class="o">.</span><span class="nf">clear</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">base_xp</span> <span class="o">=</span> <span class="mf">100.0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">level</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">100</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="n">threshold</span> <span class="o">=</span> <span class="n">base_xp</span> <span class="o">*</span> <span class="nb">pow</span><span class="p">(</span><span class="mf">1.2</span><span class="p">,</span> <span class="n">level</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">xp_thresholds</span><span class="o">.</span><span class="nf">append</span><span class="p">(</span><span class="n">threshold</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">gain_experience</span><span class="p">(</span><span class="n">amount</span><span class="p">:</span> <span class="kt">float</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">current_xp</span> <span class="o">+=</span> <span class="n">amount</span>
</span></span><span class="line"><span class="cl">    <span class="n">experience_gained</span><span class="o">.</span><span class="nf">emit</span><span class="p">(</span><span class="n">amount</span><span class="p">,</span> <span class="n">current_xp</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Verificar level up</span>
</span></span><span class="line"><span class="cl">    <span class="k">while</span> <span class="n">current_xp</span> <span class="o">&gt;=</span> <span class="n">xp_thresholds</span><span class="p">[</span><span class="n">current_level</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">        <span class="n">current_xp</span> <span class="o">-=</span> <span class="n">xp_thresholds</span><span class="p">[</span><span class="n">current_level</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="nf">level_up_player</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">level_up_player</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">current_level</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">    <span class="n">stat_points</span> <span class="o">+=</span> <span class="mi">5</span> <span class="c1">## 5 pontos por level</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Bonus de atributos automático</span>
</span></span><span class="line"><span class="cl">    <span class="n">player</span><span class="o">.</span><span class="n">asc</span><span class="o">.</span><span class="nf">apply_modifier</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;health&#34;</span><span class="p">,</span> <span class="mf">10.0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">player</span><span class="o">.</span><span class="n">asc</span><span class="o">.</span><span class="nf">apply_modifier</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;mana&#34;</span><span class="p">,</span> <span class="mf">5.0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">player</span><span class="o">.</span><span class="n">asc</span><span class="o">.</span><span class="nf">apply_modifier</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;strength&#34;</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">level_up</span><span class="o">.</span><span class="nf">emit</span><span class="p">(</span><span class="n">current_level</span><span class="p">,</span> <span class="n">stat_points</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Level Up! Novo nível: </span><span class="si">%d</span><span class="s2">&#34;</span> <span class="o">%</span> <span class="n">current_level</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">get_xp_for_next_level</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="kt">float</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">current_level</span> <span class="o">&gt;=</span> <span class="n">xp_thresholds</span><span class="o">.</span><span class="nf">size</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">xp_thresholds</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">xp_thresholds</span><span class="p">[</span><span class="n">current_level</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">get_xp_progress</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="kt">float</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">needed</span> <span class="o">=</span> <span class="nf">get_xp_for_next_level</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">current_xp</span> <span class="o">/</span> <span class="n">needed</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>2. Árvore de Habilidades (Skill Tree)<span class="hx:absolute hx:-mt-20" id="2-árvore-de-habilidades-skill-tree"></span>
    <a href="#2-%c3%a1rvore-de-habilidades-skill-tree" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="kd">extends</span> <span class="nc">Node</span>
</span></span><span class="line"><span class="cl"><span class="kd">class_name</span> <span class="nc">SkillTree</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">signal</span> <span class="nf">skill_unlocked</span><span class="p">(</span><span class="n">skill_id</span><span class="p">,</span> <span class="n">skill_data</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="kd">signal</span> <span class="nf">skill_upgraded</span><span class="p">(</span><span class="n">skill_id</span><span class="p">,</span> <span class="n">new_rank</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">class</span> <span class="nc">SkillNode</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">id</span><span class="p">:</span> <span class="nc">StringName</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">name</span><span class="p">:</span> <span class="nc">String</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">description</span><span class="p">:</span> <span class="nc">String</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">icon</span><span class="p">:</span> <span class="nc">Texture2D</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">max_rank</span><span class="p">:</span> <span class="kt">int</span> <span class="o">=</span> <span class="mi">5</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">current_rank</span><span class="p">:</span> <span class="kt">int</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">required_level</span><span class="p">:</span> <span class="kt">int</span> <span class="o">=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">required_parent</span><span class="p">:</span> <span class="nc">StringName</span> <span class="o">=</span> <span class="o">&amp;</span><span class="s2">&#34;&#34;</span> <span class="c1">## Parent na tree</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">cost_per_rank</span><span class="p">:</span> <span class="kt">int</span> <span class="o">=</span> <span class="mi">1</span> <span class="c1">## Stat points</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">stat_bonus</span><span class="p">:</span> <span class="nc">Dictionary</span> <span class="o">=</span> <span class="p">{}</span> <span class="c1">## {&#34;strength&#34;: 2, &#34;intelligence&#34;: 1}</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">ability_granted</span><span class="p">:</span> <span class="nc">StringName</span> <span class="o">=</span> <span class="o">&amp;</span><span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">player</span><span class="p">:</span> <span class="n">Player</span> <span class="o">=</span> <span class="kt">null</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">skills</span><span class="p">:</span> <span class="nc">Dictionary</span><span class="p">[</span><span class="nc">StringName</span><span class="p">,</span> <span class="n">SkillNode</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">unlocked_skills</span><span class="p">:</span> <span class="nc">Array</span><span class="p">[</span><span class="nc">StringName</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_ready</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">player</span> <span class="o">=</span> <span class="nf">get_parent</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="nf">_initialize_skill_tree</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_initialize_skill_tree</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="c1">## Tier 1: Basic attacks</span>
</span></span><span class="line"><span class="cl">    <span class="nf">add_skill</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;slash_mastery&#34;</span><span class="p">,</span> <span class="n">SkillNode</span><span class="o">.</span><span class="nf">new</span><span class="p">())</span><span class="o">.</span><span class="nf">setup</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;Slash Mastery&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;Aumenta dano de slash em 10% por rank&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="mi">1</span><span class="p">,</span> <span class="c1">## Level req</span>
</span></span><span class="line"><span class="cl">        <span class="o">&amp;</span><span class="s2">&#34;&#34;</span><span class="p">,</span> <span class="c1">## No parent</span>
</span></span><span class="line"><span class="cl">        <span class="mi">1</span><span class="p">,</span> <span class="c1">## 1 ponto por rank</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="s2">&#34;strength&#34;</span><span class="p">:</span> <span class="mi">2</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">add_skill</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;heavy_strike&#34;</span><span class="p">,</span> <span class="n">SkillNode</span><span class="o">.</span><span class="nf">new</span><span class="p">())</span><span class="o">.</span><span class="nf">setup</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;Heavy Strike&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;Ataque pesado com knockback&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="mi">3</span><span class="p">,</span> <span class="c1">## Level 3</span>
</span></span><span class="line"><span class="cl">        <span class="o">&amp;</span><span class="s2">&#34;slash_mastery&#34;</span><span class="p">,</span> <span class="c1">## Requer Slash Mastery</span>
</span></span><span class="line"><span class="cl">        <span class="mi">2</span><span class="p">,</span> <span class="c1">## 2 pontos por rank</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="s2">&#34;strength&#34;</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&#34;constitution&#34;</span><span class="p">:</span> <span class="mi">1</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="o">&amp;</span><span class="s2">&#34;ability.heavy_strike&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Tier 2: Magic</span>
</span></span><span class="line"><span class="cl">    <span class="nf">add_skill</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;fireball&#34;</span><span class="p">,</span> <span class="n">SkillNode</span><span class="o">.</span><span class="nf">new</span><span class="p">())</span><span class="o">.</span><span class="nf">setup</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;Fireball&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;Lança uma bola de fogo&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="mi">5</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="o">&amp;</span><span class="s2">&#34;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="s2">&#34;intelligence&#34;</span><span class="p">:</span> <span class="mi">3</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="o">&amp;</span><span class="s2">&#34;ability.fireball&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">add_skill</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;inferno&#34;</span><span class="p">,</span> <span class="n">SkillNode</span><span class="o">.</span><span class="nf">new</span><span class="p">())</span><span class="o">.</span><span class="nf">setup</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;Inferno&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;Melhora Fireball com dano AoE&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="mi">10</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="o">&amp;</span><span class="s2">&#34;fireball&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="mi">3</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="s2">&#34;intelligence&#34;</span><span class="p">:</span> <span class="mi">5</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="o">&amp;</span><span class="s2">&#34;ability.inferno&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Tier 3: Defense</span>
</span></span><span class="line"><span class="cl">    <span class="nf">add_skill</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;iron_skin&#34;</span><span class="p">,</span> <span class="n">SkillNode</span><span class="o">.</span><span class="nf">new</span><span class="p">())</span><span class="o">.</span><span class="nf">setup</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;Iron Skin&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;Aumenta defesa em 5% por rank&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="o">&amp;</span><span class="s2">&#34;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="s2">&#34;constitution&#34;</span><span class="p">:</span> <span class="mi">2</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">add_skill</span><span class="p">(</span><span class="n">skill_id</span><span class="p">:</span> <span class="nc">StringName</span><span class="p">,</span> <span class="n">node</span><span class="p">:</span> <span class="n">SkillNode</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">SkillNode</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">node</span><span class="o">.</span><span class="n">id</span> <span class="o">=</span> <span class="n">skill_id</span>
</span></span><span class="line"><span class="cl">    <span class="n">skills</span><span class="p">[</span><span class="n">skill_id</span><span class="p">]</span> <span class="o">=</span> <span class="n">node</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">node</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">can_unlock_skill</span><span class="p">(</span><span class="n">skill_id</span><span class="p">:</span> <span class="nc">StringName</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">bool</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">skill</span> <span class="o">=</span> <span class="n">skills</span><span class="p">[</span><span class="n">skill_id</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## 1. Verificar nível</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">exp_system</span> <span class="o">=</span> <span class="n">player</span><span class="o">.</span><span class="nf">get_node</span><span class="p">(</span><span class="s2">&#34;ExperienceSystem&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">exp_system</span><span class="o">.</span><span class="n">current_level</span> <span class="o">&lt;</span> <span class="n">skill</span><span class="o">.</span><span class="n">required_level</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## 2. Verificar parent</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">skill</span><span class="o">.</span><span class="n">required_parent</span> <span class="o">!=</span> <span class="o">&amp;</span><span class="s2">&#34;&#34;</span> <span class="ow">and</span> <span class="n">skill</span><span class="o">.</span><span class="n">required_parent</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">unlocked_skills</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## 3. Verificar stat points</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">player</span><span class="o">.</span><span class="nf">get_node</span><span class="p">(</span><span class="s2">&#34;ExperienceSystem&#34;</span><span class="p">)</span><span class="o">.</span><span class="n">stat_points</span> <span class="o">&lt;</span> <span class="n">skill</span><span class="o">.</span><span class="n">cost_per_rank</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">unlock_skill</span><span class="p">(</span><span class="n">skill_id</span><span class="p">:</span> <span class="nc">StringName</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">bool</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="ow">not</span> <span class="nf">can_unlock_skill</span><span class="p">(</span><span class="n">skill_id</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">skill</span> <span class="o">=</span> <span class="n">skills</span><span class="p">[</span><span class="n">skill_id</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">exp_system</span> <span class="o">=</span> <span class="n">player</span><span class="o">.</span><span class="nf">get_node</span><span class="p">(</span><span class="s2">&#34;ExperienceSystem&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Gastar pontos</span>
</span></span><span class="line"><span class="cl">    <span class="n">exp_system</span><span class="o">.</span><span class="n">stat_points</span> <span class="o">-=</span> <span class="n">skill</span><span class="o">.</span><span class="n">cost_per_rank</span>
</span></span><span class="line"><span class="cl">    <span class="n">skill</span><span class="o">.</span><span class="n">current_rank</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Aplicar bonus de stats</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">stat</span> <span class="ow">in</span> <span class="n">skill</span><span class="o">.</span><span class="n">stat_bonus</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="n">bonus</span> <span class="o">=</span> <span class="n">skill</span><span class="o">.</span><span class="n">stat_bonus</span><span class="p">[</span><span class="n">stat</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="n">player</span><span class="o">.</span><span class="n">asc</span><span class="o">.</span><span class="nf">apply_modifier</span><span class="p">(</span><span class="n">stat</span><span class="p">,</span> <span class="n">bonus</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Se não estava desbloqueada, adicionar à lista</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">skill_id</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">unlocked_skills</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">unlocked_skills</span><span class="o">.</span><span class="nf">append</span><span class="p">(</span><span class="n">skill_id</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">skill_unlocked</span><span class="o">.</span><span class="nf">emit</span><span class="p">(</span><span class="n">skill_id</span><span class="p">,</span> <span class="n">skill</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">## Conceder ability se existir</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">skill</span><span class="o">.</span><span class="n">ability_granted</span> <span class="o">!=</span> <span class="o">&amp;</span><span class="s2">&#34;&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">player</span><span class="o">.</span><span class="n">asc</span><span class="o">.</span><span class="nf">add_ability</span><span class="p">(</span><span class="n">AbilitySystem</span><span class="o">.</span><span class="nf">get_ability_resource</span><span class="p">(</span><span class="n">skill</span><span class="o">.</span><span class="n">ability_granted</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">skill_upgraded</span><span class="o">.</span><span class="nf">emit</span><span class="p">(</span><span class="n">skill_id</span><span class="p">,</span> <span class="n">skill</span><span class="o">.</span><span class="n">current_rank</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Skill desbloqueada: </span><span class="si">%s</span><span class="s2"> (Rank </span><span class="si">%d</span><span class="s2">)&#34;</span> <span class="o">%</span> <span class="p">[</span><span class="n">skill</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">skill</span><span class="o">.</span><span class="n">current_rank</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">get_skill_tree_paths</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="nc">Dictionary</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="c1">## Retorna árvore visual {skill_id: [dependents]}</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">paths</span><span class="p">:</span> <span class="nc">Dictionary</span> <span class="o">=</span> <span class="p">{}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">skill_id</span> <span class="ow">in</span> <span class="n">skills</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">paths</span><span class="p">[</span><span class="n">skill_id</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="n">other_id</span> <span class="ow">in</span> <span class="n">skills</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="kd">var</span> <span class="n">other</span> <span class="o">=</span> <span class="n">skills</span><span class="p">[</span><span class="n">other_id</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">other</span><span class="o">.</span><span class="n">required_parent</span> <span class="o">==</span> <span class="n">skill_id</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">paths</span><span class="p">[</span><span class="n">skill_id</span><span class="p">]</span><span class="o">.</span><span class="nf">append</span><span class="p">(</span><span class="n">other_id</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">paths</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>3. Sistema de Classes<span class="hx:absolute hx:-mt-20" id="3-sistema-de-classes"></span>
    <a href="#3-sistema-de-classes" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="kd">extends</span> <span class="nc">Resource</span>
</span></span><span class="line"><span class="cl"><span class="kd">class_name</span> <span class="nc">CharacterClass</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">enum</span> <span class="n">CLASS_TYPE</span> <span class="p">{</span> <span class="n">WARRIOR</span><span class="p">,</span> <span class="n">MAGE</span><span class="p">,</span> <span class="n">ROGUE</span><span class="p">,</span> <span class="n">PALADIN</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@export</span> <span class="kd">var</span> <span class="n">class_type</span><span class="p">:</span> <span class="n">CLASS_TYPE</span> <span class="o">=</span> <span class="n">CLASS_TYPE</span><span class="o">.</span><span class="n">WARRIOR</span>
</span></span><span class="line"><span class="cl"><span class="nd">@export</span> <span class="kd">var</span> <span class="n">base_health</span><span class="p">:</span> <span class="kt">float</span> <span class="o">=</span> <span class="mf">100.0</span>
</span></span><span class="line"><span class="cl"><span class="nd">@export</span> <span class="kd">var</span> <span class="n">base_mana</span><span class="p">:</span> <span class="kt">float</span> <span class="o">=</span> <span class="mf">50.0</span>
</span></span><span class="line"><span class="cl"><span class="nd">@export</span> <span class="kd">var</span> <span class="n">base_strength</span><span class="p">:</span> <span class="kt">float</span> <span class="o">=</span> <span class="mf">10.0</span>
</span></span><span class="line"><span class="cl"><span class="nd">@export</span> <span class="kd">var</span> <span class="n">base_intelligence</span><span class="p">:</span> <span class="kt">float</span> <span class="o">=</span> <span class="mf">5.0</span>
</span></span><span class="line"><span class="cl"><span class="nd">@export</span> <span class="kd">var</span> <span class="n">base_constitution</span><span class="p">:</span> <span class="kt">float</span> <span class="o">=</span> <span class="mf">10.0</span>
</span></span><span class="line"><span class="cl"><span class="nd">@export</span> <span class="kd">var</span> <span class="n">base_dexterity</span><span class="p">:</span> <span class="kt">float</span> <span class="o">=</span> <span class="mf">8.0</span>
</span></span><span class="line"><span class="cl"><span class="nd">@export</span> <span class="kd">var</span> <span class="n">starting_abilities</span><span class="p">:</span> <span class="nc">Array</span><span class="p">[</span><span class="nc">StringName</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">apply_to_player</span><span class="p">(</span><span class="n">player</span><span class="p">:</span> <span class="n">Player</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">asc</span> <span class="o">=</span> <span class="n">player</span><span class="o">.</span><span class="n">asc</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Aplicar stats base</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="nf">set_attribute_base_value</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;health&#34;</span><span class="p">,</span> <span class="n">base_health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="nf">set_attribute_base_value</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;mana&#34;</span><span class="p">,</span> <span class="n">base_mana</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="nf">set_attribute_base_value</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;strength&#34;</span><span class="p">,</span> <span class="n">base_strength</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="nf">set_attribute_base_value</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;intelligence&#34;</span><span class="p">,</span> <span class="n">base_intelligence</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="nf">set_attribute_base_value</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;constitution&#34;</span><span class="p">,</span> <span class="n">base_constitution</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="nf">set_attribute_base_value</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;dexterity&#34;</span><span class="p">,</span> <span class="n">base_dexterity</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Adicionar abilities iniciais</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">ability_tag</span> <span class="ow">in</span> <span class="n">starting_abilities</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="n">ability</span> <span class="o">=</span> <span class="n">AbilitySystem</span><span class="o">.</span><span class="nf">get_ability_resource</span><span class="p">(</span><span class="n">ability_tag</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">asc</span><span class="o">.</span><span class="nf">add_ability</span><span class="p">(</span><span class="n">ability</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Classe-específicos</span>
</span></span><span class="line"><span class="cl">    <span class="k">match</span> <span class="n">class_type</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">CLASS_TYPE</span><span class="o">.</span><span class="n">WARRIOR</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">asc</span><span class="o">.</span><span class="nf">add_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;class.warrior&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">asc</span><span class="o">.</span><span class="nf">apply_modifier</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;damage&#34;</span><span class="p">,</span> <span class="mf">1.2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">CLASS_TYPE</span><span class="o">.</span><span class="n">MAGE</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">asc</span><span class="o">.</span><span class="nf">add_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;class.mage&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">asc</span><span class="o">.</span><span class="nf">apply_modifier</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;mana_regeneration&#34;</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">CLASS_TYPE</span><span class="o">.</span><span class="n">ROGUE</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">asc</span><span class="o">.</span><span class="nf">add_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;class.rogue&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">asc</span><span class="o">.</span><span class="nf">apply_modifier</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;attack_speed&#34;</span><span class="p">,</span> <span class="mf">1.3</span><span class="p">)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>4. Sistema de Equipamento<span class="hx:absolute hx:-mt-20" id="4-sistema-de-equipamento"></span>
    <a href="#4-sistema-de-equipamento" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="kd">extends</span> <span class="nc">Node</span>
</span></span><span class="line"><span class="cl"><span class="kd">class_name</span> <span class="nc">EquipmentSystem</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">signal</span> <span class="nf">equipment_changed</span><span class="p">(</span><span class="n">slot</span><span class="p">,</span> <span class="n">old_item</span><span class="p">,</span> <span class="n">new_item</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="kd">signal</span> <span class="nf">stat_changed</span><span class="p">(</span><span class="n">stat_name</span><span class="p">,</span> <span class="n">old_value</span><span class="p">,</span> <span class="n">new_value</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">class</span> <span class="nc">EquipmentSlot</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="kd">enum</span> <span class="n">SLOT_TYPE</span> <span class="p">{</span> <span class="n">HEAD</span><span class="p">,</span> <span class="n">CHEST</span><span class="p">,</span> <span class="n">LEGS</span><span class="p">,</span> <span class="n">FEET</span><span class="p">,</span> <span class="n">HANDS</span><span class="p">,</span> <span class="n">BACK</span><span class="p">,</span> <span class="n">MAIN_HAND</span><span class="p">,</span> <span class="n">OFF_HAND</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">type</span><span class="p">:</span> <span class="n">SLOT_TYPE</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">current_item</span><span class="p">:</span> <span class="n">EquipmentItem</span> <span class="o">=</span> <span class="kt">null</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">class</span> <span class="nc">EquipmentItem</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">id</span><span class="p">:</span> <span class="nc">StringName</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">name</span><span class="p">:</span> <span class="nc">String</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">slot</span><span class="p">:</span> <span class="n">EquipmentSlot</span><span class="o">.</span><span class="n">SLOT_TYPE</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">rarity</span><span class="p">:</span> <span class="nc">String</span> <span class="c1">## &#34;common&#34;, &#34;uncommon&#34;, &#34;rare&#34;, &#34;legendary&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">level_requirement</span><span class="p">:</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">stat_modifiers</span><span class="p">:</span> <span class="nc">Dictionary</span> <span class="c1">## {&#34;strength&#34;: 5, &#34;health&#34;: 20}</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">ability_granted</span><span class="p">:</span> <span class="nc">StringName</span> <span class="o">=</span> <span class="o">&amp;</span><span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">durability</span><span class="p">:</span> <span class="kt">float</span> <span class="o">=</span> <span class="mf">100.0</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">max_durability</span><span class="p">:</span> <span class="kt">float</span> <span class="o">=</span> <span class="mf">100.0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">player</span><span class="p">:</span> <span class="n">Player</span> <span class="o">=</span> <span class="kt">null</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">equipment_slots</span><span class="p">:</span> <span class="nc">Dictionary</span><span class="p">[</span><span class="kt">int</span><span class="p">,</span> <span class="n">EquipmentSlot</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">inventory</span><span class="p">:</span> <span class="nc">Array</span><span class="p">[</span><span class="n">EquipmentItem</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_ready</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">player</span> <span class="o">=</span> <span class="nf">get_parent</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="nf">_initialize_slots</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_initialize_slots</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">slot_type</span> <span class="ow">in</span> <span class="n">EquipmentSlot</span><span class="o">.</span><span class="n">SLOT_TYPE</span><span class="o">.</span><span class="nf">values</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">        <span class="n">equipment_slots</span><span class="p">[</span><span class="n">slot_type</span><span class="p">]</span> <span class="o">=</span> <span class="n">EquipmentSlot</span><span class="o">.</span><span class="nf">new</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="n">equipment_slots</span><span class="p">[</span><span class="n">slot_type</span><span class="p">]</span><span class="o">.</span><span class="n">type</span> <span class="o">=</span> <span class="n">slot_type</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">equip_item</span><span class="p">(</span><span class="n">item</span><span class="p">:</span> <span class="n">EquipmentItem</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">bool</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="c1">## Verificar requisito de nível</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">exp_system</span> <span class="o">=</span> <span class="n">player</span><span class="o">.</span><span class="nf">get_node</span><span class="p">(</span><span class="s2">&#34;ExperienceSystem&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">exp_system</span><span class="o">.</span><span class="n">current_level</span> <span class="o">&lt;</span> <span class="n">item</span><span class="o">.</span><span class="n">level_requirement</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Remover item anterior</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">slot</span> <span class="o">=</span> <span class="n">equipment_slots</span><span class="p">[</span><span class="n">item</span><span class="o">.</span><span class="n">slot</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">old_item</span> <span class="o">=</span> <span class="n">slot</span><span class="o">.</span><span class="n">current_item</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">old_item</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nf">_remove_item_bonuses</span><span class="p">(</span><span class="n">old_item</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Equipar novo item</span>
</span></span><span class="line"><span class="cl">    <span class="n">slot</span><span class="o">.</span><span class="n">current_item</span> <span class="o">=</span> <span class="n">item</span>
</span></span><span class="line"><span class="cl">    <span class="nf">_apply_item_bonuses</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">equipment_changed</span><span class="o">.</span><span class="nf">emit</span><span class="p">(</span><span class="n">item</span><span class="o">.</span><span class="n">slot</span><span class="p">,</span> <span class="n">old_item</span><span class="p">,</span> <span class="n">item</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Equipado: </span><span class="si">%s</span><span class="s2">&#34;</span> <span class="o">%</span> <span class="n">item</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_apply_item_bonuses</span><span class="p">(</span><span class="n">item</span><span class="p">:</span> <span class="n">EquipmentItem</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">stat</span> <span class="ow">in</span> <span class="n">item</span><span class="o">.</span><span class="n">stat_modifiers</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="n">bonus</span> <span class="o">=</span> <span class="n">item</span><span class="o">.</span><span class="n">stat_modifiers</span><span class="p">[</span><span class="n">stat</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="n">player</span><span class="o">.</span><span class="n">asc</span><span class="o">.</span><span class="nf">apply_modifier</span><span class="p">(</span><span class="n">stat</span><span class="p">,</span> <span class="n">bonus</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">item</span><span class="o">.</span><span class="n">ability_granted</span> <span class="o">!=</span> <span class="o">&amp;</span><span class="s2">&#34;&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="n">ability</span> <span class="o">=</span> <span class="n">AbilitySystem</span><span class="o">.</span><span class="nf">get_ability_resource</span><span class="p">(</span><span class="n">item</span><span class="o">.</span><span class="n">ability_granted</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">player</span><span class="o">.</span><span class="n">asc</span><span class="o">.</span><span class="nf">add_ability</span><span class="p">(</span><span class="n">ability</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_remove_item_bonuses</span><span class="p">(</span><span class="n">item</span><span class="p">:</span> <span class="n">EquipmentItem</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">stat</span> <span class="ow">in</span> <span class="n">item</span><span class="o">.</span><span class="n">stat_modifiers</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="n">bonus</span> <span class="o">=</span> <span class="n">item</span><span class="o">.</span><span class="n">stat_modifiers</span><span class="p">[</span><span class="n">stat</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="n">player</span><span class="o">.</span><span class="n">asc</span><span class="o">.</span><span class="nf">apply_modifier</span><span class="p">(</span><span class="n">stat</span><span class="p">,</span> <span class="o">-</span><span class="n">bonus</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">item</span><span class="o">.</span><span class="n">ability_granted</span> <span class="o">!=</span> <span class="o">&amp;</span><span class="s2">&#34;&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="n">ability</span> <span class="o">=</span> <span class="n">AbilitySystem</span><span class="o">.</span><span class="nf">get_ability_resource</span><span class="p">(</span><span class="n">item</span><span class="o">.</span><span class="n">ability_granted</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">player</span><span class="o">.</span><span class="n">asc</span><span class="o">.</span><span class="nf">remove_ability</span><span class="p">(</span><span class="n">ability</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">take_durability_damage</span><span class="p">(</span><span class="n">amount</span><span class="p">:</span> <span class="kt">float</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">slot_type</span> <span class="ow">in</span> <span class="n">equipment_slots</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="n">slot</span> <span class="o">=</span> <span class="n">equipment_slots</span><span class="p">[</span><span class="n">slot_type</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">slot</span><span class="o">.</span><span class="n">current_item</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">slot</span><span class="o">.</span><span class="n">current_item</span><span class="o">.</span><span class="n">durability</span> <span class="o">-=</span> <span class="n">amount</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">slot</span><span class="o">.</span><span class="n">current_item</span><span class="o">.</span><span class="n">durability</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="nf">unequip_item</span><span class="p">(</span><span class="n">slot</span><span class="o">.</span><span class="n">current_item</span><span class="o">.</span><span class="n">slot</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">                <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Item quebrou: </span><span class="si">%s</span><span class="s2">&#34;</span> <span class="o">%</span> <span class="n">slot</span><span class="o">.</span><span class="n">current_item</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">unequip_item</span><span class="p">(</span><span class="n">slot_type</span><span class="p">:</span> <span class="kt">int</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">slot</span> <span class="o">=</span> <span class="n">equipment_slots</span><span class="p">[</span><span class="n">slot_type</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">slot</span><span class="o">.</span><span class="n">current_item</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nf">_remove_item_bonuses</span><span class="p">(</span><span class="n">slot</span><span class="o">.</span><span class="n">current_item</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">slot</span><span class="o">.</span><span class="n">current_item</span> <span class="o">=</span> <span class="kt">null</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>5. Sistema de Inventário<span class="hx:absolute hx:-mt-20" id="5-sistema-de-inventário"></span>
    <a href="#5-sistema-de-invent%c3%a1rio" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="kd">extends</span> <span class="nc">Node</span>
</span></span><span class="line"><span class="cl"><span class="kd">class_name</span> <span class="nc">InventorySystem</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">signal</span> <span class="nf">item_added</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="kd">signal</span> <span class="nf">item_removed</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="kd">signal</span> <span class="n">inventory_full</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">const</span> <span class="n">MAX_SLOTS</span> <span class="o">=</span> <span class="mi">20</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">inventory</span><span class="p">:</span> <span class="nc">Array</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">add_item</span><span class="p">(</span><span class="n">item</span><span class="p">:</span> <span class="n">Variant</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">bool</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">inventory</span><span class="o">.</span><span class="nf">size</span><span class="p">()</span> <span class="o">&gt;=</span> <span class="n">MAX_SLOTS</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">inventory_full</span><span class="o">.</span><span class="nf">emit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">inventory</span><span class="o">.</span><span class="nf">append</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">item_added</span><span class="o">.</span><span class="nf">emit</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">use_consumable</span><span class="p">(</span><span class="n">item_id</span><span class="p">:</span> <span class="nc">StringName</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">item</span> <span class="o">=</span> <span class="nf">get_item_by_id</span><span class="p">(</span><span class="n">item_id</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="ow">not</span> <span class="n">item</span><span class="p">:</span> <span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Aplicar efeito</span>
</span></span><span class="line"><span class="cl">    <span class="k">match</span> <span class="n">item_id</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="o">&amp;</span><span class="s2">&#34;potion.health&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="kd">var</span> <span class="n">player</span> <span class="o">=</span> <span class="nf">get_parent</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">            <span class="n">player</span><span class="o">.</span><span class="nf">heal</span><span class="p">(</span><span class="mf">50.0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="o">&amp;</span><span class="s2">&#34;potion.buff_strength&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="kd">var</span> <span class="n">player</span> <span class="o">=</span> <span class="nf">get_parent</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">            <span class="n">player</span><span class="o">.</span><span class="n">asc</span><span class="o">.</span><span class="nf">apply_effect_by_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;effect.strength_buff&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">inventory</span><span class="o">.</span><span class="nf">erase</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">item_removed</span><span class="o">.</span><span class="nf">emit</span><span class="p">(</span><span class="n">item</span><span class="p">)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>6. Character Setup (Configuração do Personagem)<span class="hx:absolute hx:-mt-20" id="6-character-setup-configuração-do-personagem"></span>
    <a href="#6-character-setup-configura%c3%a7%c3%a3o-do-personagem" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="kd">extends</span> <span class="nc">CharacterBody3D</span>
</span></span><span class="line"><span class="cl"><span class="kd">class_name</span> <span class="nc">PlayerRPG</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">asc</span> <span class="o">=</span> <span class="nx">$AbilityComponent</span>
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">anim</span> <span class="o">=</span> <span class="nx">$AnimationPlayer</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">experience_system</span><span class="p">:</span> <span class="n">ExperienceSystem</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">skill_tree</span><span class="p">:</span> <span class="n">SkillTree</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">equipment_system</span><span class="p">:</span> <span class="n">EquipmentSystem</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">inventory_system</span><span class="p">:</span> <span class="n">InventorySystem</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">health</span><span class="p">:</span> <span class="kt">float</span> <span class="o">=</span> <span class="mf">100.0</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">is_in_combat</span> <span class="o">=</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">signal</span> <span class="nf">health_changed</span><span class="p">(</span><span class="n">new_health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="kd">signal</span> <span class="n">died</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_ready</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">experience_system</span> <span class="o">=</span> <span class="n">ExperienceSystem</span><span class="o">.</span><span class="nf">new</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="nf">add_child</span><span class="p">(</span><span class="n">experience_system</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">skill_tree</span> <span class="o">=</span> <span class="n">SkillTree</span><span class="o">.</span><span class="nf">new</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="nf">add_child</span><span class="p">(</span><span class="n">skill_tree</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">equipment_system</span> <span class="o">=</span> <span class="n">EquipmentSystem</span><span class="o">.</span><span class="nf">new</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="nf">add_child</span><span class="p">(</span><span class="n">equipment_system</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">inventory_system</span> <span class="o">=</span> <span class="n">InventorySystem</span><span class="o">.</span><span class="nf">new</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="nf">add_child</span><span class="p">(</span><span class="n">inventory_system</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Selecionar classe</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">warrior_class</span> <span class="o">=</span> <span class="nb">preload</span><span class="p">(</span><span class="s2">&#34;res://assets/classes/warrior.tres&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">warrior_class</span><span class="o">.</span><span class="nf">apply_to_player</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">take_damage</span><span class="p">(</span><span class="n">amount</span><span class="p">:</span> <span class="kt">float</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">health</span> <span class="o">-=</span> <span class="n">amount</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="nf">dispatch_event</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;event.damage&#34;</span><span class="p">,</span> <span class="n">amount</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">health_changed</span><span class="o">.</span><span class="nf">emit</span><span class="p">(</span><span class="n">health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Danificar durabilidade de equipamento</span>
</span></span><span class="line"><span class="cl">    <span class="n">equipment_system</span><span class="o">.</span><span class="nf">take_durability_damage</span><span class="p">(</span><span class="n">amount</span> <span class="o">*</span> <span class="mf">0.01</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">health</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nf">die</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">heal</span><span class="p">(</span><span class="n">amount</span><span class="p">:</span> <span class="kt">float</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">health</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">health</span> <span class="o">+</span> <span class="n">amount</span><span class="p">,</span> <span class="nf">get_max_health</span><span class="p">())</span>
</span></span><span class="line"><span class="cl">    <span class="n">health_changed</span><span class="o">.</span><span class="nf">emit</span><span class="p">(</span><span class="n">health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">get_max_health</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="kt">float</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">asc</span><span class="o">.</span><span class="nf">get_attribute_current_value</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;health&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">die</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">is_in_combat</span> <span class="o">=</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">    <span class="n">anim</span><span class="o">.</span><span class="nf">play</span><span class="p">(</span><span class="s2">&#34;death&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">died</span><span class="o">.</span><span class="nf">emit</span><span class="p">()</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>7. UI do RPG<span class="hx:absolute hx:-mt-20" id="7-ui-do-rpg"></span>
    <a href="#7-ui-do-rpg" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="kd">extends</span> <span class="nc">CanvasLayer</span>
</span></span><span class="line"><span class="cl"><span class="kd">class_name</span> <span class="nc">RPG_UI</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">level_label</span> <span class="o">=</span> <span class="nx">$VBox/LevelLabel</span>
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">xp_bar</span> <span class="o">=</span> <span class="nx">$VBox/XPBar</span>
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">health_bar</span> <span class="o">=</span> <span class="nx">$VBox/HealthBar</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">player</span><span class="p">:</span> <span class="n">PlayerRPG</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_ready</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">player</span> <span class="o">=</span> <span class="nf">get_parent</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">player</span><span class="o">.</span><span class="n">experience_system</span><span class="o">.</span><span class="n">level_up</span><span class="o">.</span><span class="nf">connect</span><span class="p">(</span><span class="n">_on_level_up</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">player</span><span class="o">.</span><span class="n">experience_system</span><span class="o">.</span><span class="n">experience_gained</span><span class="o">.</span><span class="nf">connect</span><span class="p">(</span><span class="n">_on_experience_gained</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">player</span><span class="o">.</span><span class="n">health_changed</span><span class="o">.</span><span class="nf">connect</span><span class="p">(</span><span class="n">_on_health_changed</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_on_level_up</span><span class="p">(</span><span class="n">new_level</span><span class="p">:</span> <span class="kt">int</span><span class="p">,</span> <span class="n">stat_points</span><span class="p">:</span> <span class="kt">int</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">level_label</span><span class="o">.</span><span class="n">text</span> <span class="o">=</span> <span class="s2">&#34;Level: </span><span class="si">%d</span><span class="s2">&#34;</span> <span class="o">%</span> <span class="n">new_level</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_on_experience_gained</span><span class="p">(</span><span class="n">amount</span><span class="p">:</span> <span class="kt">float</span><span class="p">,</span> <span class="n">current_xp</span><span class="p">:</span> <span class="kt">float</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">progress</span> <span class="o">=</span> <span class="n">player</span><span class="o">.</span><span class="n">experience_system</span><span class="o">.</span><span class="nf">get_xp_progress</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">xp_bar</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">progress</span> <span class="o">*</span> <span class="mi">100</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_on_health_changed</span><span class="p">(</span><span class="n">new_health</span><span class="p">:</span> <span class="kt">float</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">max_health</span> <span class="o">=</span> <span class="n">player</span><span class="o">.</span><span class="nf">get_max_health</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">health_bar</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="p">(</span><span class="n">new_health</span> <span class="o">/</span> <span class="n">max_health</span><span class="p">)</span> <span class="o">*</span> <span class="mi">100</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<hr>
<p>O <strong>Ability System</strong> fornece os ganchos necessários para que todos estes sistemas conversem harmoniosamente através de Tags e Atributos.</p>
]]></content:encoded><category>zyris-engine</category><category>godot-plugin</category><category>ability-system</category><category>gamedev</category><category>example</category></item><item><title>Exemplos: Padrões de Boss</title><link>https://cafegame.dev/docs/ability-system/examples/boss-patterns/</link><guid isPermaLink="true">https://cafegame.dev/docs/ability-system/examples/boss-patterns/</guid><pubDate>Sat, 18 Apr 2026 22:30:00 GMT</pubDate><description>&lt;div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
&lt;a href="https://cafegame.dev/docs/ability-system/examples/boss-patterns/"
class="lang-toggle-link lang-toggle-active"
data-lang="pt"
onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT&lt;/a>
&lt;span class="hx:mx-1">|&lt;/span>
&lt;a href="https://cafegame.dev/en/docs/ability-system/examples/boss-patterns/"
class="lang-toggle-link"
data-lang="en"
onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN&lt;/a>
&lt;/div>
&lt;style>
.lang-toggle-link {
text-decoration: none;
color: #6b7280;
font-weight: 500;
}
.lang-toggle-link:hover { color: #3b82f6; }
.lang-toggle-active {
color: #1f2937;
font-weight: 700;
border-bottom: 1px solid currentColor;
}
.dark .lang-toggle-active { color: #f3f4f6; }
&lt;/style>
&lt;p>Implementações de diferentes tipos de boss utilizando o &lt;strong>Ability System&lt;/strong>.&lt;/p>
&lt;h2>Boss 1: Simple Melee Boss (Boss Corpo a Corpo)&lt;span class="hx:absolute hx:-mt-20" id="boss-1-simple-melee-boss-boss-corpo-a-corpo">&lt;/span>
&lt;a href="#boss-1-simple-melee-boss-boss-corpo-a-corpo" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-gdscript" data-lang="gdscript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">extends&lt;/span> &lt;span class="nc">CharacterBody3D&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">class_name&lt;/span> &lt;span class="nc">SimpleMeleeBoss&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@onready&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="n">asc&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">$AbilityComponent&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@onready&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="n">anim&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">$AnimationPlayer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">health&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">200.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">target&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Player&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kt">null&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">attack_timer&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">0.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">phase&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">signal&lt;/span> &lt;span class="n">defeated&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">signal&lt;/span> &lt;span class="nf">health_changed&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">new_health&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_ready&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">attribute_set&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">set_attribute_base_value&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;health&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">health&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_physics_process&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">delta&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">health&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">attack_timer&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">delta&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Transição de fase&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">health&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">100&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="n">phase&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">enter_phase_2&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Padrão de ataque&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">attack_timer&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="mf">1.5&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">attack_pattern&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">attack_timer&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">0.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Mover para o alvo&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">target&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">distance&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">global_position&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">distance_to&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">target&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">global_position&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">distance&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mf">2.0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">dir&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">target&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">global_position&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">global_position&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">normalized&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">velocity&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">dir&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mf">4.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">move_and_collide&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">velocity&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">delta&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">attack_pattern&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">phase&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Simples: alternando entre slash e heavy&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="nb">randf&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mf">0.5&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">try_activate_ability_by_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.slash&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">try_activate_ability_by_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.heavy_attack&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Fase 2: mais agressivo&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">attacks&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.slash&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.heavy_attack&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.roar&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">choice&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">attacks&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nb">randi&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">attacks&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">size&lt;/span>&lt;span class="p">()]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">try_activate_ability_by_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">choice&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Aplicar dano ao jogador&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">choice&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.slash&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.heavy_attack&amp;#34;&lt;/span>&lt;span class="p">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">target&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">apply_effect_by_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;effect.boss_damage&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">asc&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">enter_phase_2&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">phase&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">anim&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">play&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;phase_2_transition&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">add_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.phase_2&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Boss entrou na fase 2!&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">take_damage&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">amount&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">float&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">health&lt;/span> &lt;span class="o">-=&lt;/span> &lt;span class="n">amount&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">health_changed&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">emit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">health&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">anim&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">play&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;hit&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">health&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">die&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">die&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">anim&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">play&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;death&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">await&lt;/span> &lt;span class="n">anim&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">animation_finished&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">defeated&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">emit&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">queue_free&lt;/span>&lt;span class="p">()&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copy code"
aria-label="Copy code"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>Boss 2: Caster Boss (Mago AoE + Fases)&lt;span class="hx:absolute hx:-mt-20" id="boss-2-caster-boss-mago-aoe--fases">&lt;/span>
&lt;a href="#boss-2-caster-boss-mago-aoe--fases" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-gdscript" data-lang="gdscript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">extends&lt;/span> &lt;span class="nc">Node3D&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">class_name&lt;/span> &lt;span class="nc">CasterBoss&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@onready&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="n">asc&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">$AbilityComponent&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@onready&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="n">anim&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">$AnimationPlayer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">health&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">150.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">target&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Player&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kt">null&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">spell_timer&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">0.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">phase&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="c1">## 1=Normal, 2=Enraged&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">minion_count&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">max_minions&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">signal&lt;/span> &lt;span class="n">defeated&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">signal&lt;/span> &lt;span class="nf">health_changed&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">new_health&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_ready&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">attribute_set&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">set_attribute_base_value&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;health&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">health&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ability_activated&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">connect&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">_on_ability_cast&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_physics_process&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">delta&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">health&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">spell_timer&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">delta&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Checagem de fase&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">health&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">75&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="n">phase&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">enter_phase_2&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Rotação de feitiços&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">spell_timer&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="mf">2.0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">cast_spell&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">spell_timer&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">0.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">cast_spell&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">spell&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kt">null&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">match&lt;/span> &lt;span class="n">phase&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Normal: fireball ou heal&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">health&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">50&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">spell&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.heal&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="n">minion_count&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">max_minions&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">spell&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.summon_minion&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">spell&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.fireball&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mi">2&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Enraged: rotacionando feitiços&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">spells&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.fireball&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.ice_storm&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.summon_minion&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">spell&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">spells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nb">randi&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">spells&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">size&lt;/span>&lt;span class="p">()]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">spell&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">try_activate_ability_by_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">spell&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">spell&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.fireball&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Criar projétil&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">proj&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">preload&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;res://vfx/fireball_projectile.tscn&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">instantiate&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">get_parent&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">add_child&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">proj&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">proj&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">global_position&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">global_position&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">proj&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">target&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">target&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">proj&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">damage&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">25.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="n">spell&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.heal&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">health&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">min&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">health&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">30&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">150&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">health_changed&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">emit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">health&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="n">spell&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.summon_minion&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">summon_minion&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">summon_minion&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">minion_count&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="n">max_minions&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">minion&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">preload&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;res://enemies/boss_minion.tscn&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">instantiate&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">get_parent&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">add_child&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">minion&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">minion&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">global_position&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">global_position&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nc">Vector3&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">randf_range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">randf_range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">minion&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">target&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">target&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">minion_count&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Monitorar morte do minion&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">minion&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">defeated&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">connect&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">func&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">minion_count&lt;/span> &lt;span class="o">-=&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">enter_phase_2&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">phase&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">anim&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">play&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;enrage&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">add_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.enraged&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Boss em fúria!&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">take_damage&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">amount&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">float&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">health&lt;/span> &lt;span class="o">-=&lt;/span> &lt;span class="n">amount&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">health_changed&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">emit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">health&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">anim&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">play&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;hit&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">health&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">die&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">die&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Matar minions restantes&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">child&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nf">get_parent&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">get_children&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">child&lt;/span> &lt;span class="ow">is&lt;/span> &lt;span class="n">BossMinion&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">child&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">queue_free&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">anim&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">play&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;death&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">await&lt;/span> &lt;span class="n">anim&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">animation_finished&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">defeated&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">emit&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">queue_free&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_on_ability_cast&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">spec&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Sincronizar animação&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">ability&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">spec&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">get_ability&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">ability&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ability_tag&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.fireball&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">anim&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">play&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;cast_fireball&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="n">ability&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ability_tag&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.heal&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">anim&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">play&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;cast_heal&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copy code"
aria-label="Copy code"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>Boss 3: Reactive Boss (Boss que se Adapta)&lt;span class="hx:absolute hx:-mt-20" id="boss-3-reactive-boss-boss-que-se-adapta">&lt;/span>
&lt;a href="#boss-3-reactive-boss-boss-que-se-adapta" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-gdscript" data-lang="gdscript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">extends&lt;/span> &lt;span class="nc">CharacterBody3D&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">class_name&lt;/span> &lt;span class="nc">ReactiveBoss&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@onready&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="n">asc&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">$AbilityComponent&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@onready&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="n">anim&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">$AnimationPlayer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">health&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">250.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">target&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Player&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kt">null&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">adaptation_timer&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">0.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">player_damage_taken&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">0.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">weakness&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nc">StringName&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span> &lt;span class="c1">## Adapta-se à estratégia do jogador&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">signal&lt;/span> &lt;span class="n">defeated&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">signal&lt;/span> &lt;span class="nf">health_changed&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">new_health&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_ready&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">attribute_set&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">set_attribute_base_value&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;health&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">health&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_physics_process&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">delta&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">health&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">adaptation_timer&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">delta&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Analisar jogador a cada 5 segundos&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">adaptation_timer&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="mf">5.0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">analyze_player&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">adaptation_timer&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">0.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Atacar baseando-se na fraqueza detectada&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">attack_intelligently&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">analyze_player&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Checar o que o jogador está fazendo&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">player_tags&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">target&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">get_all_tags&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Se o jogador usa muito melee, atacar à distância&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">target&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">has_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;state.attacking&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">weakness&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;melee&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Se o jogador usa muita magia, ganhar resistência&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="n">ASTagUtils&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">event_did_occur&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;event.magic_damage&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">target&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">asc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">5.0&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">weakness&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;magic&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Se o jogador se cura muito, dar dispel&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="n">ASTagUtils&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">event_did_occur&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;event.healed&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">target&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">asc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">5.0&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">weakness&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;healer&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Boss adaptado à fraqueza: &amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">weakness&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">attack_intelligently&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">match&lt;/span> &lt;span class="n">weakness&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;melee&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Atacar de longe&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">try_activate_ability_by_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.fireball&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;magic&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Ataque físico + buff de resistência mágica&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">try_activate_ability_by_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.heavy_attack&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">has_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;state.magic_resistance&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">add_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;state.magic_resistance&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;healer&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Remover cura + silenciar&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">try_activate_ability_by_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.dispel&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">try_activate_ability_by_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.silence&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">_&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Padrão: rotacionar ataques&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">attacks&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.slash&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.heavy_attack&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.fireball&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">try_activate_ability_by_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">attacks&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nb">randi&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">attacks&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">size&lt;/span>&lt;span class="p">()])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">take_damage&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">amount&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">float&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">health&lt;/span> &lt;span class="o">-=&lt;/span> &lt;span class="n">amount&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">player_damage_taken&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">amount&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">health_changed&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">emit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">health&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">health&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">die&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">die&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">anim&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">play&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;death&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">await&lt;/span> &lt;span class="n">anim&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">animation_finished&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">defeated&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">emit&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">queue_free&lt;/span>&lt;span class="p">()&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copy code"
aria-label="Copy code"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>Boss 4: Multi-Phase Mega Boss&lt;span class="hx:absolute hx:-mt-20" id="boss-4-multi-phase-mega-boss">&lt;/span>
&lt;a href="#boss-4-multi-phase-mega-boss" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-gdscript" data-lang="gdscript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">extends&lt;/span> &lt;span class="nc">CharacterBody3D&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">class_name&lt;/span> &lt;span class="nc">MegaBoss&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@onready&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="n">asc&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">$AbilityComponent&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@onready&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="n">anim&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">$AnimationPlayer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">health&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">500.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">target&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Player&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kt">null&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">phase&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="c1">## 1, 2, 3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">signal&lt;/span> &lt;span class="n">defeated&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">signal&lt;/span> &lt;span class="nf">health_changed&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">new_health&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">signal&lt;/span> &lt;span class="nf">phase_changed&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">new_phase&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_ready&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">attribute_set&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">set_attribute_base_value&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;health&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">health&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_physics_process&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">delta&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">health&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Checagem contínua de fase&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">health&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">375&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="n">phase&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">change_phase&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="n">health&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">250&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="n">phase&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">change_phase&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Comportamento por fase&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">match&lt;/span> &lt;span class="n">phase&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">phase_1_behavior&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mi">2&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">phase_2_behavior&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mi">3&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">phase_3_behavior&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">phase_1_behavior&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Dificuldade moderada&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">attacks&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.slash&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.fireball&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">try_activate_ability_by_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">attacks&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nb">randi&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">attacks&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">size&lt;/span>&lt;span class="p">()])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">phase_2_behavior&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Dificuldade alta - invoca ajudantes&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">attacks&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.heavy_attack&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.fireball&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.summon_minion&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">try_activate_ability_by_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">attacks&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nb">randi&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">attacks&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">size&lt;/span>&lt;span class="p">()])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Aplicar debuff de vulnerabilidade no jogador&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">target&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">apply_effect_by_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;effect.vulnerability&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">asc&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">phase_3_behavior&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Extremo - habilidade ultimate + poder total&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">health&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">100&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">attacks&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.ultimate_attack&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.meteor_storm&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.summon_minion&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">try_activate_ability_by_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">attacks&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nb">randi&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">attacks&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">size&lt;/span>&lt;span class="p">()])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Último suspiro - lento mas poderoso&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">try_activate_ability_by_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.last_stand&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">change_phase&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">new_phase&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">int&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">phase&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">new_phase&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">phase_changed&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">emit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">new_phase&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">anim&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">play&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;phase_&lt;/span>&lt;span class="si">%d&lt;/span>&lt;span class="s2">_transition&amp;#34;&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">new_phase&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">add_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.phase_&lt;/span>&lt;span class="si">%d&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">new_phase&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">match&lt;/span> &lt;span class="n">new_phase&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mi">2&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Boss: Fase 2 - Ficando sério!&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">health&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="mi">50&lt;/span> &lt;span class="c1">## Curar na troca de fase&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mi">3&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Boss: Fase 3 - PODER ABSOLUTO!&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">add_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;state.invulnerable&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">await&lt;/span> &lt;span class="nf">get_tree&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">create_timer&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mf">1.0&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">timeout&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">remove_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;state.invulnerable&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">health_changed&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">emit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">health&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">take_damage&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">amount&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">float&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">has_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;state.invulnerable&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">health&lt;/span> &lt;span class="o">-=&lt;/span> &lt;span class="n">amount&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">health_changed&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">emit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">health&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">anim&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">play&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;hit&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">health&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">die&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">die&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Sequência de morte épica&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">anim&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">play&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;death&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">dispatch_event&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;event.boss_defeated&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Drop de loot&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">loot&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;item.legendary_sword&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;item.boss_ring&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;item.gold_chest&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">item_tag&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">loot&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">spawn_loot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">item_tag&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">await&lt;/span> &lt;span class="n">anim&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">animation_finished&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">defeated&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">emit&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">queue_free&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">spawn_loot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">item_tag&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nc">StringName&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">loot&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">preload&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;res://items/loot.tscn&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">instantiate&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">get_parent&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">add_child&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">loot&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">loot&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">global_position&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">global_position&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nc">Vector3&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">randf_range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">randf_range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">loot&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">item_tag&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">item_tag&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copy code"
aria-label="Copy code"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>Boss 5: Puzzle Boss (Focado em Mecânicas)&lt;span class="hx:absolute hx:-mt-20" id="boss-5-puzzle-boss-focado-em-mecânicas">&lt;/span>
&lt;a href="#boss-5-puzzle-boss-focado-em-mec%c3%a2nicas" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-gdscript" data-lang="gdscript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">extends&lt;/span> &lt;span class="nc">Node3D&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">class_name&lt;/span> &lt;span class="nc">PuzzleBoss&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@onready&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="n">asc&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">$AbilityComponent&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@onready&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="n">anim&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">$AnimationPlayer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">health&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">100.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">target&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Player&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kt">null&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">puzzle_phase&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="c1">## 0=esperando, 1=vulnerável, 2=escudo&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">shield_active&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">false&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="n">shield_durability&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">30.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">signal&lt;/span> &lt;span class="n">defeated&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">signal&lt;/span> &lt;span class="nf">health_changed&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">new_health&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_ready&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">attribute_set&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">set_attribute_base_value&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;health&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">health&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_physics_process&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">delta&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">health&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Mecânicas do puzzle&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">match&lt;/span> &lt;span class="n">puzzle_phase&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">waiting_phase&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">vulnerable_phase&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mi">2&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">shield_phase&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">waiting_phase&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Boss está dormindo, jogador deve ativar&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Boss esperando ativação...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">vulnerable_phase&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Boss vulnerável - janela de 30 segundos&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">has_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.vulnerable&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">add_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.vulnerable&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">anim&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">play&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;vulnerable&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Jogador deve atacar agora&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">target&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">effect_applied&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">connect&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">_on_player_damage&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">await&lt;/span> &lt;span class="nf">get_tree&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">create_timer&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mf">30.0&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">timeout&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">puzzle_phase&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">shield_phase&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1">## Fecha a janela&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">shield_phase&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">shield_active&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shield_active&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">add_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.shielded&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">puzzle_phase&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Boss cria escudo que deve ser quebrado&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Escudo ativado! Durabilidade: &amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">shield_durability&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Esperar o escudo quebrar&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="n">shield_durability&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">await&lt;/span> &lt;span class="nf">get_tree&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">create_timer&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mf">0.5&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">timeout&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Escudo quebrado&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shield_active&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">false&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">remove_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;boss.shielded&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">puzzle_phase&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">vulnerable_phase&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">trigger_boss&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">puzzle_phase&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Boss desperta!&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">anim&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">play&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;awaken&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">vulnerable_phase&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">break_shield&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">amount&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">float&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">shield_active&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shield_durability&lt;/span> &lt;span class="o">-=&lt;/span> &lt;span class="n">amount&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Durabilidade do escudo: &amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">shield_durability&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">shield_durability&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shield_durability&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">30.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">take_damage&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">amount&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kt">float&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">shield_active&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">break_shield&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">amount&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">health&lt;/span> &lt;span class="o">-=&lt;/span> &lt;span class="n">amount&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">health_changed&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">emit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">health&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">health&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">die&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">die&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">anim&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">play&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;death&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">await&lt;/span> &lt;span class="n">anim&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">animation_finished&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">defeated&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">emit&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">queue_free&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_on_player_damage&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">effect_spec&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">puzzle_phase&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Jogador está causando dano na janela vulnerável&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="n">damage&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="n">effect_spec&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">get_magnitude&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s2">&amp;#34;health&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">take_damage&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">damage&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copy code"
aria-label="Copy code"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>Integração na Cena&lt;span class="hx:absolute hx:-mt-20" id="integração-na-cena">&lt;/span>
&lt;a href="#integra%c3%a7%c3%a3o-na-cena" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-gdscript" data-lang="gdscript">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## Em BossScene.gd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">extends&lt;/span> &lt;span class="nc">Node3D&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@onready&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="n">boss&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">$MegaBoss&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@onready&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="n">player&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">$Player&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@onready&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="n">ui&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">$UI&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_ready&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">boss&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">target&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">player&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">player&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">target&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">boss&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">boss&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">health_changed&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">connect&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">_on_boss_health_changed&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">boss&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">phase_changed&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">connect&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">_on_boss_phase_changed&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">boss&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">defeated&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">connect&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">_on_boss_defeated&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_on_boss_health_changed&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">health&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ui&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">update_boss_health&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">health&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_on_boss_phase_changed&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">phase&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ui&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">show_message&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Fase &lt;/span>&lt;span class="si">%d&lt;/span>&lt;span class="s2">!&amp;#34;&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">phase&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">_on_boss_defeated&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ui&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">show_message&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Vitória! Boss derrotado!&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">await&lt;/span> &lt;span class="nf">get_tree&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">create_timer&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mf">3.0&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">timeout&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">get_tree&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nf">reload_current_scene&lt;/span>&lt;span class="p">()&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copy code"
aria-label="Copy code"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;hr>
&lt;p>Cada padrão pode ser customizado e combinado para criar encontros épicos!&lt;/p></description><content:encoded><![CDATA[<div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
    <a href="/docs/ability-system/examples/boss-patterns/"
       class="lang-toggle-link lang-toggle-active"
       data-lang="pt"
       onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT</a>
    <span class="hx:mx-1">|</span>
    <a href="/en/docs/ability-system/examples/boss-patterns/"
       class="lang-toggle-link"
       data-lang="en"
       onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN</a>
  </div>

  <style>
    .lang-toggle-link {
      text-decoration: none;
      color: #6b7280;
      font-weight: 500;
    }
    .lang-toggle-link:hover { color: #3b82f6; }
    .lang-toggle-active {
      color: #1f2937;
      font-weight: 700;
      border-bottom: 1px solid currentColor;
    }
    .dark .lang-toggle-active { color: #f3f4f6; }
  </style>
<p>Implementações de diferentes tipos de boss utilizando o <strong>Ability System</strong>.</p>
<h2>Boss 1: Simple Melee Boss (Boss Corpo a Corpo)<span class="hx:absolute hx:-mt-20" id="boss-1-simple-melee-boss-boss-corpo-a-corpo"></span>
    <a href="#boss-1-simple-melee-boss-boss-corpo-a-corpo" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="kd">extends</span> <span class="nc">CharacterBody3D</span>
</span></span><span class="line"><span class="cl"><span class="kd">class_name</span> <span class="nc">SimpleMeleeBoss</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">asc</span> <span class="o">=</span> <span class="nx">$AbilityComponent</span>
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">anim</span> <span class="o">=</span> <span class="nx">$AnimationPlayer</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">health</span> <span class="o">=</span> <span class="mf">200.0</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">target</span><span class="p">:</span> <span class="n">Player</span> <span class="o">=</span> <span class="kt">null</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">attack_timer</span> <span class="o">=</span> <span class="mf">0.0</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">phase</span> <span class="o">=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">signal</span> <span class="n">defeated</span>
</span></span><span class="line"><span class="cl"><span class="kd">signal</span> <span class="nf">health_changed</span><span class="p">(</span><span class="n">new_health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_ready</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="n">attribute_set</span><span class="o">.</span><span class="nf">set_attribute_base_value</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;health&#34;</span><span class="p">,</span> <span class="n">health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_physics_process</span><span class="p">(</span><span class="n">delta</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">health</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">attack_timer</span> <span class="o">+=</span> <span class="n">delta</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Transição de fase</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">health</span> <span class="o">&lt;</span> <span class="mi">100</span> <span class="ow">and</span> <span class="n">phase</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nf">enter_phase_2</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Padrão de ataque</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">attack_timer</span> <span class="o">&gt;=</span> <span class="mf">1.5</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nf">attack_pattern</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="n">attack_timer</span> <span class="o">=</span> <span class="mf">0.0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Mover para o alvo</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">target</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="n">distance</span> <span class="o">=</span> <span class="n">global_position</span><span class="o">.</span><span class="nf">distance_to</span><span class="p">(</span><span class="n">target</span><span class="o">.</span><span class="n">global_position</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">distance</span> <span class="o">&gt;</span> <span class="mf">2.0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="kd">var</span> <span class="n">dir</span> <span class="o">=</span> <span class="p">(</span><span class="n">target</span><span class="o">.</span><span class="n">global_position</span> <span class="o">-</span> <span class="n">global_position</span><span class="p">)</span><span class="o">.</span><span class="nf">normalized</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">            <span class="n">velocity</span> <span class="o">=</span> <span class="n">dir</span> <span class="o">*</span> <span class="mf">4.0</span>
</span></span><span class="line"><span class="cl">            <span class="nf">move_and_collide</span><span class="p">(</span><span class="n">velocity</span> <span class="o">*</span> <span class="n">delta</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">attack_pattern</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">phase</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="c1">## Simples: alternando entre slash e heavy</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="nb">randf</span><span class="p">()</span> <span class="o">&lt;</span> <span class="mf">0.5</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">asc</span><span class="o">.</span><span class="nf">try_activate_ability_by_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;boss.slash&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">asc</span><span class="o">.</span><span class="nf">try_activate_ability_by_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;boss.heavy_attack&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="c1">## Fase 2: mais agressivo</span>
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="n">attacks</span> <span class="o">=</span> <span class="p">[</span><span class="o">&amp;</span><span class="s2">&#34;boss.slash&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="s2">&#34;boss.heavy_attack&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="s2">&#34;boss.roar&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="n">choice</span> <span class="o">=</span> <span class="n">attacks</span><span class="p">[</span><span class="nb">randi</span><span class="p">()</span> <span class="o">%</span> <span class="n">attacks</span><span class="o">.</span><span class="nf">size</span><span class="p">()]</span>
</span></span><span class="line"><span class="cl">        <span class="n">asc</span><span class="o">.</span><span class="nf">try_activate_ability_by_tag</span><span class="p">(</span><span class="n">choice</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">## Aplicar dano ao jogador</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">choice</span> <span class="ow">in</span> <span class="p">[</span><span class="o">&amp;</span><span class="s2">&#34;boss.slash&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="s2">&#34;boss.heavy_attack&#34;</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">            <span class="n">target</span><span class="o">.</span><span class="n">asc</span><span class="o">.</span><span class="nf">apply_effect_by_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;effect.boss_damage&#34;</span><span class="p">,</span> <span class="n">asc</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">enter_phase_2</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">phase</span> <span class="o">=</span> <span class="mi">2</span>
</span></span><span class="line"><span class="cl">    <span class="n">anim</span><span class="o">.</span><span class="nf">play</span><span class="p">(</span><span class="s2">&#34;phase_2_transition&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="nf">add_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;boss.phase_2&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Boss entrou na fase 2!&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">take_damage</span><span class="p">(</span><span class="n">amount</span><span class="p">:</span> <span class="kt">float</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">health</span> <span class="o">-=</span> <span class="n">amount</span>
</span></span><span class="line"><span class="cl">    <span class="n">health_changed</span><span class="o">.</span><span class="nf">emit</span><span class="p">(</span><span class="n">health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">anim</span><span class="o">.</span><span class="nf">play</span><span class="p">(</span><span class="s2">&#34;hit&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">health</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nf">die</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">die</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">anim</span><span class="o">.</span><span class="nf">play</span><span class="p">(</span><span class="s2">&#34;death&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">await</span> <span class="n">anim</span><span class="o">.</span><span class="n">animation_finished</span>
</span></span><span class="line"><span class="cl">    <span class="n">defeated</span><span class="o">.</span><span class="nf">emit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="nf">queue_free</span><span class="p">()</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>Boss 2: Caster Boss (Mago AoE + Fases)<span class="hx:absolute hx:-mt-20" id="boss-2-caster-boss-mago-aoe--fases"></span>
    <a href="#boss-2-caster-boss-mago-aoe--fases" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="kd">extends</span> <span class="nc">Node3D</span>
</span></span><span class="line"><span class="cl"><span class="kd">class_name</span> <span class="nc">CasterBoss</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">asc</span> <span class="o">=</span> <span class="nx">$AbilityComponent</span>
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">anim</span> <span class="o">=</span> <span class="nx">$AnimationPlayer</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">health</span> <span class="o">=</span> <span class="mf">150.0</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">target</span><span class="p">:</span> <span class="n">Player</span> <span class="o">=</span> <span class="kt">null</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">spell_timer</span> <span class="o">=</span> <span class="mf">0.0</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">phase</span> <span class="o">=</span> <span class="mi">1</span> <span class="c1">## 1=Normal, 2=Enraged</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">minion_count</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">max_minions</span> <span class="o">=</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">signal</span> <span class="n">defeated</span>
</span></span><span class="line"><span class="cl"><span class="kd">signal</span> <span class="nf">health_changed</span><span class="p">(</span><span class="n">new_health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_ready</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="n">attribute_set</span><span class="o">.</span><span class="nf">set_attribute_base_value</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;health&#34;</span><span class="p">,</span> <span class="n">health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="n">ability_activated</span><span class="o">.</span><span class="nf">connect</span><span class="p">(</span><span class="n">_on_ability_cast</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_physics_process</span><span class="p">(</span><span class="n">delta</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">health</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">spell_timer</span> <span class="o">+=</span> <span class="n">delta</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Checagem de fase</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">health</span> <span class="o">&lt;</span> <span class="mi">75</span> <span class="ow">and</span> <span class="n">phase</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nf">enter_phase_2</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Rotação de feitiços</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">spell_timer</span> <span class="o">&gt;=</span> <span class="mf">2.0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nf">cast_spell</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="n">spell_timer</span> <span class="o">=</span> <span class="mf">0.0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">cast_spell</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">spell</span> <span class="o">=</span> <span class="kt">null</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">match</span> <span class="n">phase</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="c1">## Normal: fireball ou heal</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">health</span> <span class="o">&lt;</span> <span class="mi">50</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">spell</span> <span class="o">=</span> <span class="o">&amp;</span><span class="s2">&#34;boss.heal&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="k">elif</span> <span class="n">minion_count</span> <span class="o">&lt;</span> <span class="n">max_minions</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">spell</span> <span class="o">=</span> <span class="o">&amp;</span><span class="s2">&#34;boss.summon_minion&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">spell</span> <span class="o">=</span> <span class="o">&amp;</span><span class="s2">&#34;boss.fireball&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="mi">2</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="c1">## Enraged: rotacionando feitiços</span>
</span></span><span class="line"><span class="cl">            <span class="kd">var</span> <span class="n">spells</span> <span class="o">=</span> <span class="p">[</span><span class="o">&amp;</span><span class="s2">&#34;boss.fireball&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="s2">&#34;boss.ice_storm&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="s2">&#34;boss.summon_minion&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">            <span class="n">spell</span> <span class="o">=</span> <span class="n">spells</span><span class="p">[</span><span class="nb">randi</span><span class="p">()</span> <span class="o">%</span> <span class="n">spells</span><span class="o">.</span><span class="nf">size</span><span class="p">()]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">spell</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">asc</span><span class="o">.</span><span class="nf">try_activate_ability_by_tag</span><span class="p">(</span><span class="n">spell</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">spell</span> <span class="o">==</span> <span class="o">&amp;</span><span class="s2">&#34;boss.fireball&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="c1">## Criar projétil</span>
</span></span><span class="line"><span class="cl">            <span class="kd">var</span> <span class="n">proj</span> <span class="o">=</span> <span class="nb">preload</span><span class="p">(</span><span class="s2">&#34;res://vfx/fireball_projectile.tscn&#34;</span><span class="p">)</span><span class="o">.</span><span class="nf">instantiate</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">            <span class="nf">get_parent</span><span class="p">()</span><span class="o">.</span><span class="nf">add_child</span><span class="p">(</span><span class="n">proj</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">proj</span><span class="o">.</span><span class="n">global_position</span> <span class="o">=</span> <span class="n">global_position</span>
</span></span><span class="line"><span class="cl">            <span class="n">proj</span><span class="o">.</span><span class="n">target</span> <span class="o">=</span> <span class="n">target</span>
</span></span><span class="line"><span class="cl">            <span class="n">proj</span><span class="o">.</span><span class="n">damage</span> <span class="o">=</span> <span class="mf">25.0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">elif</span> <span class="n">spell</span> <span class="o">==</span> <span class="o">&amp;</span><span class="s2">&#34;boss.heal&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">health</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">health</span> <span class="o">+</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">150</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">health_changed</span><span class="o">.</span><span class="nf">emit</span><span class="p">(</span><span class="n">health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">elif</span> <span class="n">spell</span> <span class="o">==</span> <span class="o">&amp;</span><span class="s2">&#34;boss.summon_minion&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="nf">summon_minion</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">summon_minion</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">minion_count</span> <span class="o">&gt;=</span> <span class="n">max_minions</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">minion</span> <span class="o">=</span> <span class="nb">preload</span><span class="p">(</span><span class="s2">&#34;res://enemies/boss_minion.tscn&#34;</span><span class="p">)</span><span class="o">.</span><span class="nf">instantiate</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="nf">get_parent</span><span class="p">()</span><span class="o">.</span><span class="nf">add_child</span><span class="p">(</span><span class="n">minion</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">minion</span><span class="o">.</span><span class="n">global_position</span> <span class="o">=</span> <span class="n">global_position</span> <span class="o">+</span> <span class="nc">Vector3</span><span class="p">(</span><span class="nb">randf_range</span><span class="p">(</span><span class="o">-</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="nb">randf_range</span><span class="p">(</span><span class="o">-</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    <span class="n">minion</span><span class="o">.</span><span class="n">target</span> <span class="o">=</span> <span class="n">target</span>
</span></span><span class="line"><span class="cl">    <span class="n">minion_count</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Monitorar morte do minion</span>
</span></span><span class="line"><span class="cl">    <span class="n">minion</span><span class="o">.</span><span class="n">defeated</span><span class="o">.</span><span class="nf">connect</span><span class="p">(</span><span class="nf">func</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">        <span class="n">minion_count</span> <span class="o">-=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">    <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">enter_phase_2</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">phase</span> <span class="o">=</span> <span class="mi">2</span>
</span></span><span class="line"><span class="cl">    <span class="n">anim</span><span class="o">.</span><span class="nf">play</span><span class="p">(</span><span class="s2">&#34;enrage&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="nf">add_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;boss.enraged&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Boss em fúria!&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">take_damage</span><span class="p">(</span><span class="n">amount</span><span class="p">:</span> <span class="kt">float</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">health</span> <span class="o">-=</span> <span class="n">amount</span>
</span></span><span class="line"><span class="cl">    <span class="n">health_changed</span><span class="o">.</span><span class="nf">emit</span><span class="p">(</span><span class="n">health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">anim</span><span class="o">.</span><span class="nf">play</span><span class="p">(</span><span class="s2">&#34;hit&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">health</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nf">die</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">die</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="c1">## Matar minions restantes</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">child</span> <span class="ow">in</span> <span class="nf">get_parent</span><span class="p">()</span><span class="o">.</span><span class="nf">get_children</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">child</span> <span class="ow">is</span> <span class="n">BossMinion</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">child</span><span class="o">.</span><span class="nf">queue_free</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">anim</span><span class="o">.</span><span class="nf">play</span><span class="p">(</span><span class="s2">&#34;death&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">await</span> <span class="n">anim</span><span class="o">.</span><span class="n">animation_finished</span>
</span></span><span class="line"><span class="cl">    <span class="n">defeated</span><span class="o">.</span><span class="nf">emit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="nf">queue_free</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_on_ability_cast</span><span class="p">(</span><span class="n">spec</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="c1">## Sincronizar animação</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">ability</span> <span class="o">=</span> <span class="n">spec</span><span class="o">.</span><span class="nf">get_ability</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">ability</span><span class="o">.</span><span class="n">ability_tag</span> <span class="o">==</span> <span class="o">&amp;</span><span class="s2">&#34;boss.fireball&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">anim</span><span class="o">.</span><span class="nf">play</span><span class="p">(</span><span class="s2">&#34;cast_fireball&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">elif</span> <span class="n">ability</span><span class="o">.</span><span class="n">ability_tag</span> <span class="o">==</span> <span class="o">&amp;</span><span class="s2">&#34;boss.heal&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">anim</span><span class="o">.</span><span class="nf">play</span><span class="p">(</span><span class="s2">&#34;cast_heal&#34;</span><span class="p">)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>Boss 3: Reactive Boss (Boss que se Adapta)<span class="hx:absolute hx:-mt-20" id="boss-3-reactive-boss-boss-que-se-adapta"></span>
    <a href="#boss-3-reactive-boss-boss-que-se-adapta" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="kd">extends</span> <span class="nc">CharacterBody3D</span>
</span></span><span class="line"><span class="cl"><span class="kd">class_name</span> <span class="nc">ReactiveBoss</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">asc</span> <span class="o">=</span> <span class="nx">$AbilityComponent</span>
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">anim</span> <span class="o">=</span> <span class="nx">$AnimationPlayer</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">health</span> <span class="o">=</span> <span class="mf">250.0</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">target</span><span class="p">:</span> <span class="n">Player</span> <span class="o">=</span> <span class="kt">null</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">adaptation_timer</span> <span class="o">=</span> <span class="mf">0.0</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">player_damage_taken</span> <span class="o">=</span> <span class="mf">0.0</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">weakness</span><span class="p">:</span> <span class="nc">StringName</span> <span class="o">=</span> <span class="o">&amp;</span><span class="s2">&#34;&#34;</span> <span class="c1">## Adapta-se à estratégia do jogador</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">signal</span> <span class="n">defeated</span>
</span></span><span class="line"><span class="cl"><span class="kd">signal</span> <span class="nf">health_changed</span><span class="p">(</span><span class="n">new_health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_ready</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="n">attribute_set</span><span class="o">.</span><span class="nf">set_attribute_base_value</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;health&#34;</span><span class="p">,</span> <span class="n">health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_physics_process</span><span class="p">(</span><span class="n">delta</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">health</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">adaptation_timer</span> <span class="o">+=</span> <span class="n">delta</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Analisar jogador a cada 5 segundos</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">adaptation_timer</span> <span class="o">&gt;=</span> <span class="mf">5.0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nf">analyze_player</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="n">adaptation_timer</span> <span class="o">=</span> <span class="mf">0.0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Atacar baseando-se na fraqueza detectada</span>
</span></span><span class="line"><span class="cl">    <span class="nf">attack_intelligently</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">analyze_player</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="c1">## Checar o que o jogador está fazendo</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">player_tags</span> <span class="o">=</span> <span class="n">target</span><span class="o">.</span><span class="n">asc</span><span class="o">.</span><span class="nf">get_all_tags</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Se o jogador usa muito melee, atacar à distância</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">target</span><span class="o">.</span><span class="n">asc</span><span class="o">.</span><span class="nf">has_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;state.attacking&#34;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">weakness</span> <span class="o">=</span> <span class="o">&amp;</span><span class="s2">&#34;melee&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="c1">## Se o jogador usa muita magia, ganhar resistência</span>
</span></span><span class="line"><span class="cl">    <span class="k">elif</span> <span class="n">ASTagUtils</span><span class="o">.</span><span class="nf">event_did_occur</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;event.magic_damage&#34;</span><span class="p">,</span> <span class="n">target</span><span class="o">.</span><span class="n">asc</span><span class="p">,</span> <span class="mf">5.0</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">weakness</span> <span class="o">=</span> <span class="o">&amp;</span><span class="s2">&#34;magic&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="c1">## Se o jogador se cura muito, dar dispel</span>
</span></span><span class="line"><span class="cl">    <span class="k">elif</span> <span class="n">ASTagUtils</span><span class="o">.</span><span class="nf">event_did_occur</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;event.healed&#34;</span><span class="p">,</span> <span class="n">target</span><span class="o">.</span><span class="n">asc</span><span class="p">,</span> <span class="mf">5.0</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">weakness</span> <span class="o">=</span> <span class="o">&amp;</span><span class="s2">&#34;healer&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Boss adaptado à fraqueza: &#34;</span><span class="p">,</span> <span class="n">weakness</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">attack_intelligently</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="k">match</span> <span class="n">weakness</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="o">&amp;</span><span class="s2">&#34;melee&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="c1">## Atacar de longe</span>
</span></span><span class="line"><span class="cl">            <span class="n">asc</span><span class="o">.</span><span class="nf">try_activate_ability_by_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;boss.fireball&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="o">&amp;</span><span class="s2">&#34;magic&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="c1">## Ataque físico + buff de resistência mágica</span>
</span></span><span class="line"><span class="cl">            <span class="n">asc</span><span class="o">.</span><span class="nf">try_activate_ability_by_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;boss.heavy_attack&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="ow">not</span> <span class="n">asc</span><span class="o">.</span><span class="nf">has_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;state.magic_resistance&#34;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">                <span class="n">asc</span><span class="o">.</span><span class="nf">add_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;state.magic_resistance&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="o">&amp;</span><span class="s2">&#34;healer&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="c1">## Remover cura + silenciar</span>
</span></span><span class="line"><span class="cl">            <span class="n">asc</span><span class="o">.</span><span class="nf">try_activate_ability_by_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;boss.dispel&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">asc</span><span class="o">.</span><span class="nf">try_activate_ability_by_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;boss.silence&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">_</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="c1">## Padrão: rotacionar ataques</span>
</span></span><span class="line"><span class="cl">            <span class="kd">var</span> <span class="n">attacks</span> <span class="o">=</span> <span class="p">[</span><span class="o">&amp;</span><span class="s2">&#34;boss.slash&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="s2">&#34;boss.heavy_attack&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="s2">&#34;boss.fireball&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">            <span class="n">asc</span><span class="o">.</span><span class="nf">try_activate_ability_by_tag</span><span class="p">(</span><span class="n">attacks</span><span class="p">[</span><span class="nb">randi</span><span class="p">()</span> <span class="o">%</span> <span class="n">attacks</span><span class="o">.</span><span class="nf">size</span><span class="p">()])</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">take_damage</span><span class="p">(</span><span class="n">amount</span><span class="p">:</span> <span class="kt">float</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">health</span> <span class="o">-=</span> <span class="n">amount</span>
</span></span><span class="line"><span class="cl">    <span class="n">player_damage_taken</span> <span class="o">+=</span> <span class="n">amount</span>
</span></span><span class="line"><span class="cl">    <span class="n">health_changed</span><span class="o">.</span><span class="nf">emit</span><span class="p">(</span><span class="n">health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">health</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nf">die</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">die</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">anim</span><span class="o">.</span><span class="nf">play</span><span class="p">(</span><span class="s2">&#34;death&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">await</span> <span class="n">anim</span><span class="o">.</span><span class="n">animation_finished</span>
</span></span><span class="line"><span class="cl">    <span class="n">defeated</span><span class="o">.</span><span class="nf">emit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="nf">queue_free</span><span class="p">()</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>Boss 4: Multi-Phase Mega Boss<span class="hx:absolute hx:-mt-20" id="boss-4-multi-phase-mega-boss"></span>
    <a href="#boss-4-multi-phase-mega-boss" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="kd">extends</span> <span class="nc">CharacterBody3D</span>
</span></span><span class="line"><span class="cl"><span class="kd">class_name</span> <span class="nc">MegaBoss</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">asc</span> <span class="o">=</span> <span class="nx">$AbilityComponent</span>
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">anim</span> <span class="o">=</span> <span class="nx">$AnimationPlayer</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">health</span> <span class="o">=</span> <span class="mf">500.0</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">target</span><span class="p">:</span> <span class="n">Player</span> <span class="o">=</span> <span class="kt">null</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">phase</span> <span class="o">=</span> <span class="mi">1</span> <span class="c1">## 1, 2, 3</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">signal</span> <span class="n">defeated</span>
</span></span><span class="line"><span class="cl"><span class="kd">signal</span> <span class="nf">health_changed</span><span class="p">(</span><span class="n">new_health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="kd">signal</span> <span class="nf">phase_changed</span><span class="p">(</span><span class="n">new_phase</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_ready</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="n">attribute_set</span><span class="o">.</span><span class="nf">set_attribute_base_value</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;health&#34;</span><span class="p">,</span> <span class="n">health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_physics_process</span><span class="p">(</span><span class="n">delta</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">health</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Checagem contínua de fase</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">health</span> <span class="o">&lt;</span> <span class="mi">375</span> <span class="ow">and</span> <span class="n">phase</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nf">change_phase</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">elif</span> <span class="n">health</span> <span class="o">&lt;</span> <span class="mi">250</span> <span class="ow">and</span> <span class="n">phase</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nf">change_phase</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Comportamento por fase</span>
</span></span><span class="line"><span class="cl">    <span class="k">match</span> <span class="n">phase</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="nf">phase_1_behavior</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="mi">2</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="nf">phase_2_behavior</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="mi">3</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="nf">phase_3_behavior</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">phase_1_behavior</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="c1">## Dificuldade moderada</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">attacks</span> <span class="o">=</span> <span class="p">[</span><span class="o">&amp;</span><span class="s2">&#34;boss.slash&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="s2">&#34;boss.fireball&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="nf">try_activate_ability_by_tag</span><span class="p">(</span><span class="n">attacks</span><span class="p">[</span><span class="nb">randi</span><span class="p">()</span> <span class="o">%</span> <span class="n">attacks</span><span class="o">.</span><span class="nf">size</span><span class="p">()])</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">phase_2_behavior</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="c1">## Dificuldade alta - invoca ajudantes</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">attacks</span> <span class="o">=</span> <span class="p">[</span><span class="o">&amp;</span><span class="s2">&#34;boss.heavy_attack&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="s2">&#34;boss.fireball&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="s2">&#34;boss.summon_minion&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="nf">try_activate_ability_by_tag</span><span class="p">(</span><span class="n">attacks</span><span class="p">[</span><span class="nb">randi</span><span class="p">()</span> <span class="o">%</span> <span class="n">attacks</span><span class="o">.</span><span class="nf">size</span><span class="p">()])</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Aplicar debuff de vulnerabilidade no jogador</span>
</span></span><span class="line"><span class="cl">    <span class="n">target</span><span class="o">.</span><span class="n">asc</span><span class="o">.</span><span class="nf">apply_effect_by_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;effect.vulnerability&#34;</span><span class="p">,</span> <span class="n">asc</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">phase_3_behavior</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="c1">## Extremo - habilidade ultimate + poder total</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">health</span> <span class="o">&gt;</span> <span class="mi">100</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="n">attacks</span> <span class="o">=</span> <span class="p">[</span><span class="o">&amp;</span><span class="s2">&#34;boss.ultimate_attack&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="s2">&#34;boss.meteor_storm&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="s2">&#34;boss.summon_minion&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="n">asc</span><span class="o">.</span><span class="nf">try_activate_ability_by_tag</span><span class="p">(</span><span class="n">attacks</span><span class="p">[</span><span class="nb">randi</span><span class="p">()</span> <span class="o">%</span> <span class="n">attacks</span><span class="o">.</span><span class="nf">size</span><span class="p">()])</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="c1">## Último suspiro - lento mas poderoso</span>
</span></span><span class="line"><span class="cl">        <span class="n">asc</span><span class="o">.</span><span class="nf">try_activate_ability_by_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;boss.last_stand&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">change_phase</span><span class="p">(</span><span class="n">new_phase</span><span class="p">:</span> <span class="kt">int</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">phase</span> <span class="o">=</span> <span class="n">new_phase</span>
</span></span><span class="line"><span class="cl">    <span class="n">phase_changed</span><span class="o">.</span><span class="nf">emit</span><span class="p">(</span><span class="n">new_phase</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">anim</span><span class="o">.</span><span class="nf">play</span><span class="p">(</span><span class="s2">&#34;phase_</span><span class="si">%d</span><span class="s2">_transition&#34;</span> <span class="o">%</span> <span class="n">new_phase</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="nf">add_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;boss.phase_</span><span class="si">%d</span><span class="s2">&#34;</span> <span class="o">%</span> <span class="n">new_phase</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">match</span> <span class="n">new_phase</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="mi">2</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Boss: Fase 2 - Ficando sério!&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">health</span> <span class="o">+=</span> <span class="mi">50</span> <span class="c1">## Curar na troca de fase</span>
</span></span><span class="line"><span class="cl">        <span class="mi">3</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Boss: Fase 3 - PODER ABSOLUTO!&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">asc</span><span class="o">.</span><span class="nf">add_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;state.invulnerable&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="k">await</span> <span class="nf">get_tree</span><span class="p">()</span><span class="o">.</span><span class="nf">create_timer</span><span class="p">(</span><span class="mf">1.0</span><span class="p">)</span><span class="o">.</span><span class="n">timeout</span>
</span></span><span class="line"><span class="cl">            <span class="n">asc</span><span class="o">.</span><span class="nf">remove_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;state.invulnerable&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">health_changed</span><span class="o">.</span><span class="nf">emit</span><span class="p">(</span><span class="n">health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">take_damage</span><span class="p">(</span><span class="n">amount</span><span class="p">:</span> <span class="kt">float</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">asc</span><span class="o">.</span><span class="nf">has_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;state.invulnerable&#34;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">health</span> <span class="o">-=</span> <span class="n">amount</span>
</span></span><span class="line"><span class="cl">    <span class="n">health_changed</span><span class="o">.</span><span class="nf">emit</span><span class="p">(</span><span class="n">health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">anim</span><span class="o">.</span><span class="nf">play</span><span class="p">(</span><span class="s2">&#34;hit&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">health</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nf">die</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">die</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="c1">## Sequência de morte épica</span>
</span></span><span class="line"><span class="cl">    <span class="n">anim</span><span class="o">.</span><span class="nf">play</span><span class="p">(</span><span class="s2">&#34;death&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="nf">dispatch_event</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;event.boss_defeated&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Drop de loot</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">loot</span> <span class="o">=</span> <span class="p">[</span><span class="o">&amp;</span><span class="s2">&#34;item.legendary_sword&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="s2">&#34;item.boss_ring&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="s2">&#34;item.gold_chest&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">item_tag</span> <span class="ow">in</span> <span class="n">loot</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nf">spawn_loot</span><span class="p">(</span><span class="n">item_tag</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">await</span> <span class="n">anim</span><span class="o">.</span><span class="n">animation_finished</span>
</span></span><span class="line"><span class="cl">    <span class="n">defeated</span><span class="o">.</span><span class="nf">emit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="nf">queue_free</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">spawn_loot</span><span class="p">(</span><span class="n">item_tag</span><span class="p">:</span> <span class="nc">StringName</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">loot</span> <span class="o">=</span> <span class="nb">preload</span><span class="p">(</span><span class="s2">&#34;res://items/loot.tscn&#34;</span><span class="p">)</span><span class="o">.</span><span class="nf">instantiate</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="nf">get_parent</span><span class="p">()</span><span class="o">.</span><span class="nf">add_child</span><span class="p">(</span><span class="n">loot</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">loot</span><span class="o">.</span><span class="n">global_position</span> <span class="o">=</span> <span class="n">global_position</span> <span class="o">+</span> <span class="nc">Vector3</span><span class="p">(</span><span class="nb">randf_range</span><span class="p">(</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="mi">1</span><span class="p">,</span> <span class="nb">randf_range</span><span class="p">(</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    <span class="n">loot</span><span class="o">.</span><span class="n">item_tag</span> <span class="o">=</span> <span class="n">item_tag</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>Boss 5: Puzzle Boss (Focado em Mecânicas)<span class="hx:absolute hx:-mt-20" id="boss-5-puzzle-boss-focado-em-mecânicas"></span>
    <a href="#boss-5-puzzle-boss-focado-em-mec%c3%a2nicas" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="kd">extends</span> <span class="nc">Node3D</span>
</span></span><span class="line"><span class="cl"><span class="kd">class_name</span> <span class="nc">PuzzleBoss</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">asc</span> <span class="o">=</span> <span class="nx">$AbilityComponent</span>
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">anim</span> <span class="o">=</span> <span class="nx">$AnimationPlayer</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">health</span> <span class="o">=</span> <span class="mf">100.0</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">target</span><span class="p">:</span> <span class="n">Player</span> <span class="o">=</span> <span class="kt">null</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">puzzle_phase</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1">## 0=esperando, 1=vulnerável, 2=escudo</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">shield_active</span> <span class="o">=</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">shield_durability</span> <span class="o">=</span> <span class="mf">30.0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">signal</span> <span class="n">defeated</span>
</span></span><span class="line"><span class="cl"><span class="kd">signal</span> <span class="nf">health_changed</span><span class="p">(</span><span class="n">new_health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_ready</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="n">attribute_set</span><span class="o">.</span><span class="nf">set_attribute_base_value</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;health&#34;</span><span class="p">,</span> <span class="n">health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_physics_process</span><span class="p">(</span><span class="n">delta</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">health</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Mecânicas do puzzle</span>
</span></span><span class="line"><span class="cl">    <span class="k">match</span> <span class="n">puzzle_phase</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="nf">waiting_phase</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="nf">vulnerable_phase</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="mi">2</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="nf">shield_phase</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">waiting_phase</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="c1">## Boss está dormindo, jogador deve ativar</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Boss esperando ativação...&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">vulnerable_phase</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="c1">## Boss vulnerável - janela de 30 segundos</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="ow">not</span> <span class="n">asc</span><span class="o">.</span><span class="nf">has_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;boss.vulnerable&#34;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">asc</span><span class="o">.</span><span class="nf">add_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;boss.vulnerable&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">anim</span><span class="o">.</span><span class="nf">play</span><span class="p">(</span><span class="s2">&#34;vulnerable&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Jogador deve atacar agora</span>
</span></span><span class="line"><span class="cl">    <span class="n">target</span><span class="o">.</span><span class="n">asc</span><span class="o">.</span><span class="n">effect_applied</span><span class="o">.</span><span class="nf">connect</span><span class="p">(</span><span class="n">_on_player_damage</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">await</span> <span class="nf">get_tree</span><span class="p">()</span><span class="o">.</span><span class="nf">create_timer</span><span class="p">(</span><span class="mf">30.0</span><span class="p">)</span><span class="o">.</span><span class="n">timeout</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">puzzle_phase</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nf">shield_phase</span><span class="p">()</span> <span class="c1">## Fecha a janela</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">shield_phase</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">shield_active</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">shield_active</span> <span class="o">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="nf">add_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;boss.shielded&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">puzzle_phase</span> <span class="o">=</span> <span class="mi">2</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Boss cria escudo que deve ser quebrado</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Escudo ativado! Durabilidade: &#34;</span><span class="p">,</span> <span class="n">shield_durability</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Esperar o escudo quebrar</span>
</span></span><span class="line"><span class="cl">    <span class="k">while</span> <span class="n">shield_durability</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">await</span> <span class="nf">get_tree</span><span class="p">()</span><span class="o">.</span><span class="nf">create_timer</span><span class="p">(</span><span class="mf">0.5</span><span class="p">)</span><span class="o">.</span><span class="n">timeout</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Escudo quebrado</span>
</span></span><span class="line"><span class="cl">    <span class="n">shield_active</span> <span class="o">=</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="nf">remove_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;boss.shielded&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">puzzle_phase</span> <span class="o">=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">    <span class="nf">vulnerable_phase</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">trigger_boss</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">puzzle_phase</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Boss desperta!&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">anim</span><span class="o">.</span><span class="nf">play</span><span class="p">(</span><span class="s2">&#34;awaken&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nf">vulnerable_phase</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">break_shield</span><span class="p">(</span><span class="n">amount</span><span class="p">:</span> <span class="kt">float</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="ow">not</span> <span class="n">shield_active</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">shield_durability</span> <span class="o">-=</span> <span class="n">amount</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Durabilidade do escudo: &#34;</span><span class="p">,</span> <span class="n">shield_durability</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">shield_durability</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">shield_durability</span> <span class="o">=</span> <span class="mf">30.0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">take_damage</span><span class="p">(</span><span class="n">amount</span><span class="p">:</span> <span class="kt">float</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">shield_active</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nf">break_shield</span><span class="p">(</span><span class="n">amount</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">health</span> <span class="o">-=</span> <span class="n">amount</span>
</span></span><span class="line"><span class="cl">    <span class="n">health_changed</span><span class="o">.</span><span class="nf">emit</span><span class="p">(</span><span class="n">health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">health</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nf">die</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">die</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">anim</span><span class="o">.</span><span class="nf">play</span><span class="p">(</span><span class="s2">&#34;death&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">await</span> <span class="n">anim</span><span class="o">.</span><span class="n">animation_finished</span>
</span></span><span class="line"><span class="cl">    <span class="n">defeated</span><span class="o">.</span><span class="nf">emit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="nf">queue_free</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_on_player_damage</span><span class="p">(</span><span class="n">effect_spec</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">puzzle_phase</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="c1">## Jogador está causando dano na janela vulnerável</span>
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="n">damage</span> <span class="o">=</span> <span class="o">-</span><span class="n">effect_spec</span><span class="o">.</span><span class="nf">get_magnitude</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;health&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="nf">take_damage</span><span class="p">(</span><span class="n">damage</span><span class="p">)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>Integração na Cena<span class="hx:absolute hx:-mt-20" id="integração-na-cena"></span>
    <a href="#integra%c3%a7%c3%a3o-na-cena" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="c1">## Em BossScene.gd</span>
</span></span><span class="line"><span class="cl"><span class="kd">extends</span> <span class="nc">Node3D</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">boss</span> <span class="o">=</span> <span class="nx">$MegaBoss</span>
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">player</span> <span class="o">=</span> <span class="nx">$Player</span>
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">ui</span> <span class="o">=</span> <span class="nx">$UI</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_ready</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">boss</span><span class="o">.</span><span class="n">target</span> <span class="o">=</span> <span class="n">player</span>
</span></span><span class="line"><span class="cl">    <span class="n">player</span><span class="o">.</span><span class="n">target</span> <span class="o">=</span> <span class="n">boss</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">boss</span><span class="o">.</span><span class="n">health_changed</span><span class="o">.</span><span class="nf">connect</span><span class="p">(</span><span class="n">_on_boss_health_changed</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">boss</span><span class="o">.</span><span class="n">phase_changed</span><span class="o">.</span><span class="nf">connect</span><span class="p">(</span><span class="n">_on_boss_phase_changed</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">boss</span><span class="o">.</span><span class="n">defeated</span><span class="o">.</span><span class="nf">connect</span><span class="p">(</span><span class="n">_on_boss_defeated</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_on_boss_health_changed</span><span class="p">(</span><span class="n">health</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">ui</span><span class="o">.</span><span class="nf">update_boss_health</span><span class="p">(</span><span class="n">health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_on_boss_phase_changed</span><span class="p">(</span><span class="n">phase</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">ui</span><span class="o">.</span><span class="nf">show_message</span><span class="p">(</span><span class="s2">&#34;Fase </span><span class="si">%d</span><span class="s2">!&#34;</span> <span class="o">%</span> <span class="n">phase</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_on_boss_defeated</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">ui</span><span class="o">.</span><span class="nf">show_message</span><span class="p">(</span><span class="s2">&#34;Vitória! Boss derrotado!&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">await</span> <span class="nf">get_tree</span><span class="p">()</span><span class="o">.</span><span class="nf">create_timer</span><span class="p">(</span><span class="mf">3.0</span><span class="p">)</span><span class="o">.</span><span class="n">timeout</span>
</span></span><span class="line"><span class="cl">    <span class="nf">get_tree</span><span class="p">()</span><span class="o">.</span><span class="nf">reload_current_scene</span><span class="p">()</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<hr>
<p>Cada padrão pode ser customizado e combinado para criar encontros épicos!</p>
]]></content:encoded><category>zyris-engine</category><category>godot-plugin</category><category>ability-system</category><category>gamedev</category><category>example</category></item><item><title>Exemplo Completo: Sistema de Combate Funcional</title><link>https://cafegame.dev/docs/ability-system/examples/complete-example/</link><guid isPermaLink="true">https://cafegame.dev/docs/ability-system/examples/complete-example/</guid><pubDate>Sat, 18 Apr 2026 22:30:00 GMT</pubDate><description>&lt;div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
&lt;a href="https://cafegame.dev/docs/ability-system/examples/complete-example/"
class="lang-toggle-link lang-toggle-active"
data-lang="pt"
onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT&lt;/a>
&lt;span class="hx:mx-1">|&lt;/span>
&lt;a href="https://cafegame.dev/en/docs/ability-system/examples/complete-example/"
class="lang-toggle-link"
data-lang="en"
onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN&lt;/a>
&lt;/div>
&lt;style>
.lang-toggle-link {
text-decoration: none;
color: #6b7280;
font-weight: 500;
}
.lang-toggle-link:hover { color: #3b82f6; }
.lang-toggle-active {
color: #1f2937;
font-weight: 700;
border-bottom: 1px solid currentColor;
}
.dark .lang-toggle-active { color: #f3f4f6; }
&lt;/style>
&lt;h2>Visão Geral&lt;span class="hx:absolute hx:-mt-20" id="visão-geral">&lt;/span>
&lt;a href="#vis%c3%a3o-geral" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Código pronto para uso demonstrando uma integração completa de Player vs Inimigo utilizando o &lt;strong>Ability System&lt;/strong>.&lt;/p>
&lt;h2>Estrutura de Assets&lt;span class="hx:absolute hx:-mt-20" id="estrutura-de-assets">&lt;/span>
&lt;a href="#estrutura-de-assets" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Crie a seguinte estrutura em &lt;code>res://assets/ability-system/&lt;/code>:&lt;/p></description><content:encoded><![CDATA[<div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
    <a href="/docs/ability-system/examples/complete-example/"
       class="lang-toggle-link lang-toggle-active"
       data-lang="pt"
       onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT</a>
    <span class="hx:mx-1">|</span>
    <a href="/en/docs/ability-system/examples/complete-example/"
       class="lang-toggle-link"
       data-lang="en"
       onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN</a>
  </div>

  <style>
    .lang-toggle-link {
      text-decoration: none;
      color: #6b7280;
      font-weight: 500;
    }
    .lang-toggle-link:hover { color: #3b82f6; }
    .lang-toggle-active {
      color: #1f2937;
      font-weight: 700;
      border-bottom: 1px solid currentColor;
    }
    .dark .lang-toggle-active { color: #f3f4f6; }
  </style>
<h2>Visão Geral<span class="hx:absolute hx:-mt-20" id="visão-geral"></span>
    <a href="#vis%c3%a3o-geral" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Código pronto para uso demonstrando uma integração completa de Player vs Inimigo utilizando o <strong>Ability System</strong>.</p>
<h2>Estrutura de Assets<span class="hx:absolute hx:-mt-20" id="estrutura-de-assets"></span>
    <a href="#estrutura-de-assets" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Crie a seguinte estrutura em <code>res://assets/ability-system/</code>:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">player_attributes.tres
</span></span><span class="line"><span class="cl">enemy_attributes.tres
</span></span><span class="line"><span class="cl">player_container.tres
</span></span><span class="line"><span class="cl">enemy_container.tres
</span></span><span class="line"><span class="cl">ability_slash.tres
</span></span><span class="line"><span class="cl">ability_heavy_attack.tres
</span></span><span class="line"><span class="cl">ability_heal.tres
</span></span><span class="line"><span class="cl">effect_slash_damage.tres
</span></span><span class="line"><span class="cl">effect_heal.tres
</span></span><span class="line"><span class="cl">effect_bleed.tres</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>1. Script do Player<span class="hx:absolute hx:-mt-20" id="1-script-do-player"></span>
    <a href="#1-script-do-player" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="kd">extends</span> <span class="nc">CharacterBody3D</span>
</span></span><span class="line"><span class="cl"><span class="kd">class_name</span> <span class="nc">Player</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">asc</span> <span class="o">=</span> <span class="nx">$AbilityComponent</span>
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">anim</span> <span class="o">=</span> <span class="nx">$AnimationPlayer</span>
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">ui</span> <span class="o">=</span> <span class="nx">$UI</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">target</span><span class="p">:</span> <span class="n">Enemy</span> <span class="o">=</span> <span class="kt">null</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">is_in_combat</span> <span class="o">=</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">health</span> <span class="o">=</span> <span class="mf">100.0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">signal</span> <span class="nf">health_changed</span><span class="p">(</span><span class="n">new_health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_ready</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="n">attribute_set</span><span class="o">.</span><span class="nf">set_attribute_base_value</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;health&#34;</span><span class="p">,</span> <span class="n">health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="n">ability_activated</span><span class="o">.</span><span class="nf">connect</span><span class="p">(</span><span class="n">_on_ability_activated</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="n">effect_applied</span><span class="o">.</span><span class="nf">connect</span><span class="p">(</span><span class="n">_on_effect_applied</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_physics_process</span><span class="p">(</span><span class="n">_delta</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="ow">not</span> <span class="n">is_in_combat</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">target</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Input de Habilidades</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="nc">Input</span><span class="o">.</span><span class="nf">is_action_just_pressed</span><span class="p">(</span><span class="s2">&#34;ability_1&#34;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="nf">use_ability</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;ability.slash&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">elif</span> <span class="nc">Input</span><span class="o">.</span><span class="nf">is_action_just_pressed</span><span class="p">(</span><span class="s2">&#34;ability_2&#34;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="nf">use_ability</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;ability.heavy_attack&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">elif</span> <span class="nc">Input</span><span class="o">.</span><span class="nf">is_action_just_pressed</span><span class="p">(</span><span class="s2">&#34;ability_3&#34;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="nf">use_ability</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;ability.heal&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Direcionar para o alvo</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">direction</span> <span class="o">=</span> <span class="p">(</span><span class="n">target</span><span class="o">.</span><span class="n">global_position</span> <span class="o">-</span> <span class="n">global_position</span><span class="p">)</span><span class="o">.</span><span class="nf">normalized</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">direction</span><span class="o">.</span><span class="nf">length</span><span class="p">()</span> <span class="o">&gt;</span> <span class="mf">2.0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">velocity</span> <span class="o">=</span> <span class="n">direction</span> <span class="o">*</span> <span class="mf">5.0</span>
</span></span><span class="line"><span class="cl">        <span class="nf">move_and_collide</span><span class="p">(</span><span class="n">velocity</span> <span class="o">*</span> <span class="n">_delta</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">use_ability</span><span class="p">(</span><span class="n">ability_tag</span><span class="p">:</span> <span class="nc">StringName</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="ow">not</span> <span class="n">asc</span><span class="o">.</span><span class="nf">can_activate_ability_by_tag</span><span class="p">(</span><span class="n">ability_tag</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">ui</span><span class="o">.</span><span class="nf">show_message</span><span class="p">(</span><span class="s2">&#34;Não pode usar agora&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="nf">try_activate_ability_by_tag</span><span class="p">(</span><span class="n">ability_tag</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Aplicação manual de efeitos (opcional se a habilidade já aplicar automaticamente)</span>
</span></span><span class="line"><span class="cl">    <span class="k">match</span> <span class="n">ability_tag</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="o">&amp;</span><span class="s2">&#34;ability.slash&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">target</span><span class="o">.</span><span class="n">asc</span><span class="o">.</span><span class="nf">apply_effect_by_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;effect.slash_damage&#34;</span><span class="p">,</span> <span class="n">asc</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="o">&amp;</span><span class="s2">&#34;ability.heavy_attack&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">target</span><span class="o">.</span><span class="n">asc</span><span class="o">.</span><span class="nf">apply_effect_by_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;effect.slash_damage&#34;</span><span class="p">,</span> <span class="n">asc</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="kd">var</span> <span class="n">damage</span> <span class="o">=</span> <span class="mf">35.0</span>
</span></span><span class="line"><span class="cl">            <span class="n">target</span><span class="o">.</span><span class="nf">take_damage</span><span class="p">(</span><span class="n">damage</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="o">&amp;</span><span class="s2">&#34;ability.heal&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="kd">var</span> <span class="n">heal_amount</span> <span class="o">=</span> <span class="mf">25.0</span>
</span></span><span class="line"><span class="cl">            <span class="nf">heal</span><span class="p">(</span><span class="n">heal_amount</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">take_damage</span><span class="p">(</span><span class="n">amount</span><span class="p">:</span> <span class="kt">float</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">health</span> <span class="o">-=</span> <span class="n">amount</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="nf">dispatch_event</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;event.damage&#34;</span><span class="p">,</span> <span class="n">amount</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">health_changed</span><span class="o">.</span><span class="nf">emit</span><span class="p">(</span><span class="n">health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">ui</span><span class="o">.</span><span class="nf">update_health</span><span class="p">(</span><span class="n">health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">health</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nf">die</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">heal</span><span class="p">(</span><span class="n">amount</span><span class="p">:</span> <span class="kt">float</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">health</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">health</span> <span class="o">+</span> <span class="n">amount</span><span class="p">,</span> <span class="mf">100.0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">health_changed</span><span class="o">.</span><span class="nf">emit</span><span class="p">(</span><span class="n">health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">ui</span><span class="o">.</span><span class="nf">update_health</span><span class="p">(</span><span class="n">health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">die</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">is_in_combat</span> <span class="o">=</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">    <span class="n">anim</span><span class="o">.</span><span class="nf">play</span><span class="p">(</span><span class="s2">&#34;death&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">ui</span><span class="o">.</span><span class="nf">show_message</span><span class="p">(</span><span class="s2">&#34;Você morreu!&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_on_ability_activated</span><span class="p">(</span><span class="n">spec</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">anim</span><span class="o">.</span><span class="nf">play</span><span class="p">(</span><span class="s2">&#34;attack&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_on_effect_applied</span><span class="p">(</span><span class="n">effect_spec</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">damage</span> <span class="o">=</span> <span class="n">effect_spec</span><span class="o">.</span><span class="nf">get_magnitude</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;health&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">damage</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nf">take_damage</span><span class="p">(</span><span class="o">-</span><span class="n">damage</span><span class="p">)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>2. Script do Inimigo (Enemy)<span class="hx:absolute hx:-mt-20" id="2-script-do-inimigo-enemy"></span>
    <a href="#2-script-do-inimigo-enemy" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="kd">extends</span> <span class="nc">CharacterBody3D</span>
</span></span><span class="line"><span class="cl"><span class="kd">class_name</span> <span class="nc">Enemy</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">asc</span> <span class="o">=</span> <span class="nx">$AbilityComponent</span>
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">anim</span> <span class="o">=</span> <span class="nx">$AnimationPlayer</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">target</span><span class="p">:</span> <span class="n">Player</span> <span class="o">=</span> <span class="kt">null</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">health</span> <span class="o">=</span> <span class="mf">80.0</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">is_alive</span> <span class="o">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">attack_cooldown</span> <span class="o">=</span> <span class="mf">0.0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">signal</span> <span class="nf">health_changed</span><span class="p">(</span><span class="n">new_health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="kd">signal</span> <span class="n">defeated</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_ready</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="n">attribute_set</span><span class="o">.</span><span class="nf">set_attribute_base_value</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;health&#34;</span><span class="p">,</span> <span class="n">health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="n">ability_activated</span><span class="o">.</span><span class="nf">connect</span><span class="p">(</span><span class="n">_on_ability_activated</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_physics_process</span><span class="p">(</span><span class="n">delta</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="ow">not</span> <span class="n">is_alive</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">target</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">attack_cooldown</span> <span class="o">-=</span> <span class="n">delta</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Mover para o alvo</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">distance</span> <span class="o">=</span> <span class="n">global_position</span><span class="o">.</span><span class="nf">distance_to</span><span class="p">(</span><span class="n">target</span><span class="o">.</span><span class="n">global_position</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">distance</span> <span class="o">&gt;</span> <span class="mf">1.5</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="n">direction</span> <span class="o">=</span> <span class="p">(</span><span class="n">target</span><span class="o">.</span><span class="n">global_position</span> <span class="o">-</span> <span class="n">global_position</span><span class="p">)</span><span class="o">.</span><span class="nf">normalized</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="n">velocity</span> <span class="o">=</span> <span class="n">direction</span> <span class="o">*</span> <span class="mf">3.0</span>
</span></span><span class="line"><span class="cl">        <span class="nf">move_and_collide</span><span class="p">(</span><span class="n">velocity</span> <span class="o">*</span> <span class="n">delta</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">velocity</span> <span class="o">=</span> <span class="nc">Vector3</span><span class="o">.</span><span class="n">ZERO</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">## Lógica de Ataque</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">attack_cooldown</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nf">attack_player</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="n">attack_cooldown</span> <span class="o">=</span> <span class="mf">2.0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">attack_player</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">asc</span><span class="o">.</span><span class="nf">can_activate_ability_by_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;ability.slash&#34;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">asc</span><span class="o">.</span><span class="nf">try_activate_ability_by_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;ability.slash&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">asc</span><span class="o">.</span><span class="nf">apply_effect_by_tag</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;effect.slash_damage&#34;</span><span class="p">,</span> <span class="n">target</span><span class="o">.</span><span class="n">asc</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">take_damage</span><span class="p">(</span><span class="n">amount</span><span class="p">:</span> <span class="kt">float</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">health</span> <span class="o">-=</span> <span class="n">amount</span>
</span></span><span class="line"><span class="cl">    <span class="n">asc</span><span class="o">.</span><span class="nf">dispatch_event</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">&#34;event.damage&#34;</span><span class="p">,</span> <span class="n">amount</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">health_changed</span><span class="o">.</span><span class="nf">emit</span><span class="p">(</span><span class="n">health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">health</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nf">die</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">die</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">is_alive</span> <span class="o">=</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">    <span class="n">anim</span><span class="o">.</span><span class="nf">play</span><span class="p">(</span><span class="s2">&#34;death&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">await</span> <span class="n">anim</span><span class="o">.</span><span class="n">animation_finished</span>
</span></span><span class="line"><span class="cl">    <span class="n">defeated</span><span class="o">.</span><span class="nf">emit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="nf">queue_free</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_on_ability_activated</span><span class="p">(</span><span class="n">spec</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">anim</span><span class="o">.</span><span class="nf">play</span><span class="p">(</span><span class="s2">&#34;attack&#34;</span><span class="p">)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>3. Combat Manager<span class="hx:absolute hx:-mt-20" id="3-combat-manager"></span>
    <a href="#3-combat-manager" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="kd">extends</span> <span class="nc">Node</span>
</span></span><span class="line"><span class="cl"><span class="kd">class_name</span> <span class="nc">CombatManager</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">player</span> <span class="o">=</span> <span class="nx">$Player</span>
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">enemy</span> <span class="o">=</span> <span class="nx">$Enemy</span>
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">ui</span> <span class="o">=</span> <span class="nx">$UI</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_ready</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">player</span><span class="o">.</span><span class="n">target</span> <span class="o">=</span> <span class="n">enemy</span>
</span></span><span class="line"><span class="cl">    <span class="n">enemy</span><span class="o">.</span><span class="n">target</span> <span class="o">=</span> <span class="n">player</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">player</span><span class="o">.</span><span class="n">is_in_combat</span> <span class="o">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">player</span><span class="o">.</span><span class="n">health_changed</span><span class="o">.</span><span class="nf">connect</span><span class="p">(</span><span class="n">_on_player_health_changed</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">enemy</span><span class="o">.</span><span class="n">health_changed</span><span class="o">.</span><span class="nf">connect</span><span class="p">(</span><span class="n">_on_enemy_health_changed</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">enemy</span><span class="o">.</span><span class="n">defeated</span><span class="o">.</span><span class="nf">connect</span><span class="p">(</span><span class="n">_on_enemy_defeated</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_on_player_health_changed</span><span class="p">(</span><span class="n">new_health</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">ui</span><span class="o">.</span><span class="nf">update_player_health</span><span class="p">(</span><span class="n">new_health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_on_enemy_health_changed</span><span class="p">(</span><span class="n">new_health</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">ui</span><span class="o">.</span><span class="nf">update_enemy_health</span><span class="p">(</span><span class="n">new_health</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_on_enemy_defeated</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">ui</span><span class="o">.</span><span class="nf">show_message</span><span class="p">(</span><span class="s2">&#34;Vitória! +100 XP&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">await</span> <span class="nf">get_tree</span><span class="p">()</span><span class="o">.</span><span class="nf">create_timer</span><span class="p">(</span><span class="mf">2.0</span><span class="p">)</span><span class="o">.</span><span class="n">timeout</span>
</span></span><span class="line"><span class="cl">    <span class="nf">get_tree</span><span class="p">()</span><span class="o">.</span><span class="nf">reload_current_scene</span><span class="p">()</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>4. UI de Combate<span class="hx:absolute hx:-mt-20" id="4-ui-de-combate"></span>
    <a href="#4-ui-de-combate" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript" data-lang="gdscript"><span class="line"><span class="cl"><span class="kd">extends</span> <span class="nc">CanvasLayer</span>
</span></span><span class="line"><span class="cl"><span class="kd">class_name</span> <span class="nc">CombatUI</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">player_hp_label</span> <span class="o">=</span> <span class="nx">$VBox/PlayerHP</span>
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">enemy_hp_label</span> <span class="o">=</span> <span class="nx">$VBox/EnemyHP</span>
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">message_label</span> <span class="o">=</span> <span class="nx">$VBox/Message</span>
</span></span><span class="line"><span class="cl"><span class="nd">@onready</span> <span class="kd">var</span> <span class="n">ability_buttons</span> <span class="o">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="nx">$VBox/HBox/Button1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nx">$VBox/HBox/Button2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nx">$VBox/HBox/Button3</span>
</span></span><span class="line"><span class="cl"><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_ready</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">ability_buttons</span><span class="o">.</span><span class="nf">size</span><span class="p">()):</span>
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="n">button</span> <span class="o">=</span> <span class="n">ability_buttons</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="n">button</span><span class="o">.</span><span class="n">pressed</span><span class="o">.</span><span class="nf">connect</span><span class="p">(</span><span class="n">_on_ability_button_pressed</span><span class="o">.</span><span class="nf">bind</span><span class="p">(</span><span class="n">i</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">update_player_health</span><span class="p">(</span><span class="n">health</span><span class="p">:</span> <span class="kt">float</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">player_hp_label</span><span class="o">.</span><span class="n">text</span> <span class="o">=</span> <span class="s2">&#34;Player: </span><span class="si">%.0f</span><span class="s2"> / 100&#34;</span> <span class="o">%</span> <span class="n">health</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">update_enemy_health</span><span class="p">(</span><span class="n">health</span><span class="p">:</span> <span class="kt">float</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">enemy_hp_label</span><span class="o">.</span><span class="n">text</span> <span class="o">=</span> <span class="s2">&#34;Enemy: </span><span class="si">%.0f</span><span class="s2"> / 80&#34;</span> <span class="o">%</span> <span class="n">health</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">show_message</span><span class="p">(</span><span class="n">msg</span><span class="p">:</span> <span class="nc">String</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">message_label</span><span class="o">.</span><span class="n">text</span> <span class="o">=</span> <span class="n">msg</span>
</span></span><span class="line"><span class="cl">    <span class="n">message_label</span><span class="o">.</span><span class="nf">show</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="k">await</span> <span class="nf">get_tree</span><span class="p">()</span><span class="o">.</span><span class="nf">create_timer</span><span class="p">(</span><span class="mf">3.0</span><span class="p">)</span><span class="o">.</span><span class="n">timeout</span>
</span></span><span class="line"><span class="cl">    <span class="n">message_label</span><span class="o">.</span><span class="nf">hide</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">update_cooldowns</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">player</span> <span class="o">=</span> <span class="nf">get_tree</span><span class="p">()</span><span class="o">.</span><span class="n">root</span><span class="o">.</span><span class="nf">get_child</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">.</span><span class="n">player</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">abilities</span> <span class="o">=</span> <span class="p">[</span><span class="o">&amp;</span><span class="s2">&#34;ability.slash&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="s2">&#34;ability.heavy_attack&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="s2">&#34;ability.heal&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">abilities</span><span class="o">.</span><span class="nf">size</span><span class="p">()):</span>
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="n">button</span> <span class="o">=</span> <span class="n">ability_buttons</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="n">spec</span> <span class="o">=</span> <span class="n">player</span><span class="o">.</span><span class="n">asc</span><span class="o">.</span><span class="nf">get_ability_spec_by_tag</span><span class="p">(</span><span class="n">abilities</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">spec</span> <span class="ow">and</span> <span class="n">spec</span><span class="o">.</span><span class="nf">is_on_cooldown</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">            <span class="kd">var</span> <span class="n">remaining</span> <span class="o">=</span> <span class="n">spec</span><span class="o">.</span><span class="nf">get_cooldown_remaining</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">            <span class="n">button</span><span class="o">.</span><span class="n">text</span> <span class="o">=</span> <span class="s2">&#34;</span><span class="si">%.1f</span><span class="s2">&#34;</span> <span class="o">%</span> <span class="n">remaining</span>
</span></span><span class="line"><span class="cl">            <span class="n">button</span><span class="o">.</span><span class="n">disabled</span> <span class="o">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">        <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">button</span><span class="o">.</span><span class="n">disabled</span> <span class="o">=</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_process</span><span class="p">(</span><span class="n">_delta</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="nf">update_cooldowns</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">_on_ability_button_pressed</span><span class="p">(</span><span class="n">index</span><span class="p">:</span> <span class="kt">int</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">player</span> <span class="o">=</span> <span class="nf">get_tree</span><span class="p">()</span><span class="o">.</span><span class="n">root</span><span class="o">.</span><span class="nf">get_child</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">.</span><span class="n">player</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="n">abilities</span> <span class="o">=</span> <span class="p">[</span><span class="o">&amp;</span><span class="s2">&#34;ability.slash&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="s2">&#34;ability.heavy_attack&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="s2">&#34;ability.heal&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="n">player</span><span class="o">.</span><span class="nf">use_ability</span><span class="p">(</span><span class="n">abilities</span><span class="p">[</span><span class="n">index</span><span class="p">])</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>5. Estrutura da Cena<span class="hx:absolute hx:-mt-20" id="5-estrutura-da-cena"></span>
    <a href="#5-estrutura-da-cena" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Crie a cena no editor seguindo esta hierarquia:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">CombatScene (Node)
</span></span><span class="line"><span class="cl">├─ Player (CharacterBody3D)
</span></span><span class="line"><span class="cl">│ ├─ CollisionShape3D
</span></span><span class="line"><span class="cl">│ ├─ MeshInstance3D
</span></span><span class="line"><span class="cl">│ ├─ AnimationPlayer
</span></span><span class="line"><span class="cl">│ └─ AbilityComponent
</span></span><span class="line"><span class="cl">│
</span></span><span class="line"><span class="cl">├─ Enemy (CharacterBody3D)
</span></span><span class="line"><span class="cl">│ ├─ CollisionShape3D
</span></span><span class="line"><span class="cl">│ ├─ MeshInstance3D
</span></span><span class="line"><span class="cl">│ ├─ AnimationPlayer
</span></span><span class="line"><span class="cl">│ └─ AbilityComponent
</span></span><span class="line"><span class="cl">│
</span></span><span class="line"><span class="cl">├─ UI (CanvasLayer)
</span></span><span class="line"><span class="cl">│ └─ VBox
</span></span><span class="line"><span class="cl">│ ├─ Label (PlayerHP)
</span></span><span class="line"><span class="cl">│ ├─ Label (EnemyHP)
</span></span><span class="line"><span class="cl">│ ├─ Label (Message)
</span></span><span class="line"><span class="cl">│ └─ HBox
</span></span><span class="line"><span class="cl">│ ├─ Button1 (Slash)
</span></span><span class="line"><span class="cl">│ ├─ Button2 (Heavy)
</span></span><span class="line"><span class="cl">│ └─ Button3 (Heal)
</span></span><span class="line"><span class="cl">│
</span></span><span class="line"><span class="cl">└─ CombatManager (Node)</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>6. Mapa de Inputs<span class="hx:absolute hx:-mt-20" id="6-mapa-de-inputs"></span>
    <a href="#6-mapa-de-inputs" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>No <strong>Project Settings → Input Map</strong>, adicione:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">ability_1: [Space]
</span></span><span class="line"><span class="cl">ability_2: [Q]
</span></span><span class="line"><span class="cl">ability_3: [E]
</span></span><span class="line"><span class="cl">ui_accept: [Enter]</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
    aria-label="Copy code"
    data-copied-label="Copied!"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>Próximos Passos<span class="hx:absolute hx:-mt-20" id="próximos-passos"></span>
    <a href="#pr%c3%b3ximos-passos" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Este exemplo serve como base para quase qualquer sistema de combate em tempo real. Você pode expandir adicionando:</p>
<ol>
<li><strong>Fases às Habilidades</strong>: Use o array de fases para casting e recovery.</li>
<li><strong>Loot</strong>: Instancie itens na morte do inimigo.</li>
<li><strong>Skill Trees</strong>: Adicione habilidades ao <code>ASComponent</code> dinamicamente conforme o jogador sobe de nível.</li>
</ol>
<hr>
<p><strong>Explore também:</strong> <a href="boss-patterns">Exemplos de Padrões de Boss</a></p>
]]></content:encoded><category>zyris-engine</category><category>godot-plugin</category><category>ability-system</category><category>gamedev</category><category>example</category></item><item><title>BT Condition: Has Tag</title><link>https://cafegame.dev/docs/ability-system/classes/behavior-tree/has-tag/</link><guid isPermaLink="true">https://cafegame.dev/docs/ability-system/classes/behavior-tree/has-tag/</guid><pubDate>Sat, 18 Apr 2026 22:30:00 GMT</pubDate><description>&lt;div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
&lt;a href="https://cafegame.dev/docs/ability-system/classes/behavior-tree/has-tag/"
class="lang-toggle-link lang-toggle-active"
data-lang="pt"
onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT&lt;/a>
&lt;span class="hx:mx-1">|&lt;/span>
&lt;a href="https://cafegame.dev/en/docs/ability-system/classes/behavior-tree/has-tag/"
class="lang-toggle-link"
data-lang="en"
onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN&lt;/a>
&lt;/div>
&lt;style>
.lang-toggle-link {
text-decoration: none;
color: #6b7280;
font-weight: 500;
}
.lang-toggle-link:hover { color: #3b82f6; }
.lang-toggle-active {
color: #1f2937;
font-weight: 700;
border-bottom: 1px solid currentColor;
}
.dark .lang-toggle-active { color: #f3f4f6; }
&lt;/style>
&lt;div class="godot-api">
&lt;div class="api-header">
&lt;strong>Inherits:&lt;/strong> &lt;code>BTCondition&lt;/code>
&lt;/div>
&lt;p class="api-brief">BTCondition that checks if the agent has a specific Ability System tag.&lt;/p>
&lt;div class="api-description">
&lt;h3>Description&lt;/h3>
&lt;div class="api-description-content" style="margin-top: 1.25rem;">
A Behavior Tree condition that checks if the actor&amp;rsquo;s [ASComponent] has a specific tag. Returns [constant BT.SUCCESS] if tag present, [constant BT.FAILURE] otherwise.
Supports hierarchical matching (e.g., checking &lt;code>State&lt;/code> matches &lt;code>State.Stunned&lt;/code>).
&lt;/div>
&lt;/div>
&lt;h3>Properties&lt;/h3>
&lt;table class="api-table">
&lt;thead>
&lt;tr>&lt;th>Type&lt;/th>&lt;th>Name&lt;/th>&lt;th>Default&lt;/th>&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>NodePath&lt;/code>&lt;/td>
&lt;td>&lt;strong>asc_node_path&lt;/strong>&lt;/td>
&lt;td>&lt;code>NodePath(&amp;#34;&amp;#34;)&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>bool&lt;/code>&lt;/td>
&lt;td>&lt;strong>exact_match&lt;/strong>&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>StringName&lt;/code>&lt;/td>
&lt;td>&lt;strong>tag&lt;/strong>&lt;/td>
&lt;td>&lt;code>&amp;amp;&amp;#34;&amp;#34;&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div></description><content:encoded><![CDATA[<div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
    <a href="/docs/ability-system/classes/behavior-tree/has-tag/"
       class="lang-toggle-link lang-toggle-active"
       data-lang="pt"
       onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT</a>
    <span class="hx:mx-1">|</span>
    <a href="/en/docs/ability-system/classes/behavior-tree/has-tag/"
       class="lang-toggle-link"
       data-lang="en"
       onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN</a>
  </div>

  <style>
    .lang-toggle-link {
      text-decoration: none;
      color: #6b7280;
      font-weight: 500;
    }
    .lang-toggle-link:hover { color: #3b82f6; }
    .lang-toggle-active {
      color: #1f2937;
      font-weight: 700;
      border-bottom: 1px solid currentColor;
    }
    .dark .lang-toggle-active { color: #f3f4f6; }
  </style>





  







<div class="godot-api">
  <div class="api-header">
    <strong>Inherits:</strong> <code>BTCondition</code>
  </div>

  
  
  
  
  
  
  
  <p class="api-brief">BTCondition that checks if the agent has a specific Ability System tag.</p>

  
  <div class="api-description">
    <h3>Description</h3>
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    <div class="api-description-content" style="margin-top: 1.25rem;">
      A Behavior Tree condition that checks if the actor&rsquo;s [ASComponent] has a specific tag. Returns [constant BT.SUCCESS] if tag present, [constant BT.FAILURE] otherwise.
Supports hierarchical matching (e.g., checking <code>State</code> matches <code>State.Stunned</code>).
    </div>
  </div>
  

  
  <h3>Properties</h3>
  <table class="api-table">
    <thead>
      <tr><th>Type</th><th>Name</th><th>Default</th></tr>
    </thead>
    <tbody>
      
      <tr>
        <td><code>NodePath</code></td>
        <td><strong>asc_node_path</strong></td>
        <td><code>NodePath(&#34;&#34;)</code></td>
      </tr>
      
      
      <tr>
        <td><code>bool</code></td>
        <td><strong>exact_match</strong></td>
        <td><code>false</code></td>
      </tr>
      
      
      <tr>
        <td><code>StringName</code></td>
        <td><strong>tag</strong></td>
        <td><code>&amp;&#34;&#34;</code></td>
      </tr>
      
      
    </tbody>
  </table>
  

  

  

  
</div>


]]></content:encoded><category>zyris-engine</category><category>godot-plugin</category><category>ability-system</category><category>ai</category><category>behavior-tree</category><category>gamedev</category></item><item><title>BT Condition: Event Occurred</title><link>https://cafegame.dev/docs/ability-system/classes/behavior-tree/event-occurred/</link><guid isPermaLink="true">https://cafegame.dev/docs/ability-system/classes/behavior-tree/event-occurred/</guid><pubDate>Sat, 18 Apr 2026 22:30:00 GMT</pubDate><description>&lt;div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
&lt;a href="https://cafegame.dev/docs/ability-system/classes/behavior-tree/event-occurred/"
class="lang-toggle-link lang-toggle-active"
data-lang="pt"
onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT&lt;/a>
&lt;span class="hx:mx-1">|&lt;/span>
&lt;a href="https://cafegame.dev/en/docs/ability-system/classes/behavior-tree/event-occurred/"
class="lang-toggle-link"
data-lang="en"
onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN&lt;/a>
&lt;/div>
&lt;style>
.lang-toggle-link {
text-decoration: none;
color: #6b7280;
font-weight: 500;
}
.lang-toggle-link:hover { color: #3b82f6; }
.lang-toggle-active {
color: #1f2937;
font-weight: 700;
border-bottom: 1px solid currentColor;
}
.dark .lang-toggle-active { color: #f3f4f6; }
&lt;/style>
&lt;div class="godot-api">
&lt;div class="api-header">
&lt;strong>Inherits:&lt;/strong> &lt;code>BTCondition&lt;/code>
&lt;/div>
&lt;p class="api-brief">BTCondition that checks if an Ability System event occurred recently.&lt;/p>
&lt;div class="api-description">
&lt;h3>Description&lt;/h3>
&lt;div class="api-description-content" style="margin-top: 1.25rem;">
A Behavior Tree condition that checks if an ASEventTag occurred within a time window using the Events Historical buffer.
Returns [constant BT.SUCCESS] if event found, [constant BT.FAILURE] otherwise.
&lt;/div>
&lt;/div>
&lt;h3>Properties&lt;/h3>
&lt;table class="api-table">
&lt;thead>
&lt;tr>&lt;th>Type&lt;/th>&lt;th>Name&lt;/th>&lt;th>Default&lt;/th>&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>NodePath&lt;/code>&lt;/td>
&lt;td>&lt;strong>asc_node_path&lt;/strong>&lt;/td>
&lt;td>&lt;code>NodePath(&amp;#34;&amp;#34;)&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>StringName&lt;/code>&lt;/td>
&lt;td>&lt;strong>event_tag&lt;/strong>&lt;/td>
&lt;td>&lt;code>&amp;amp;&amp;#34;&amp;#34;&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>float&lt;/code>&lt;/td>
&lt;td>&lt;strong>time_window&lt;/strong>&lt;/td>
&lt;td>&lt;code>1.0&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div></description><content:encoded><![CDATA[<div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
    <a href="/docs/ability-system/classes/behavior-tree/event-occurred/"
       class="lang-toggle-link lang-toggle-active"
       data-lang="pt"
       onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT</a>
    <span class="hx:mx-1">|</span>
    <a href="/en/docs/ability-system/classes/behavior-tree/event-occurred/"
       class="lang-toggle-link"
       data-lang="en"
       onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN</a>
  </div>

  <style>
    .lang-toggle-link {
      text-decoration: none;
      color: #6b7280;
      font-weight: 500;
    }
    .lang-toggle-link:hover { color: #3b82f6; }
    .lang-toggle-active {
      color: #1f2937;
      font-weight: 700;
      border-bottom: 1px solid currentColor;
    }
    .dark .lang-toggle-active { color: #f3f4f6; }
  </style>





  







<div class="godot-api">
  <div class="api-header">
    <strong>Inherits:</strong> <code>BTCondition</code>
  </div>

  
  
  
  
  
  
  
  <p class="api-brief">BTCondition that checks if an Ability System event occurred recently.</p>

  
  <div class="api-description">
    <h3>Description</h3>
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    <div class="api-description-content" style="margin-top: 1.25rem;">
      A Behavior Tree condition that checks if an ASEventTag occurred within a time window using the Events Historical buffer.
Returns [constant BT.SUCCESS] if event found, [constant BT.FAILURE] otherwise.
    </div>
  </div>
  

  
  <h3>Properties</h3>
  <table class="api-table">
    <thead>
      <tr><th>Type</th><th>Name</th><th>Default</th></tr>
    </thead>
    <tbody>
      
      <tr>
        <td><code>NodePath</code></td>
        <td><strong>asc_node_path</strong></td>
        <td><code>NodePath(&#34;&#34;)</code></td>
      </tr>
      
      
      <tr>
        <td><code>StringName</code></td>
        <td><strong>event_tag</strong></td>
        <td><code>&amp;&#34;&#34;</code></td>
      </tr>
      
      
      <tr>
        <td><code>float</code></td>
        <td><strong>time_window</strong></td>
        <td><code>1.0</code></td>
      </tr>
      
      
    </tbody>
  </table>
  

  

  

  
</div>


]]></content:encoded><category>zyris-engine</category><category>godot-plugin</category><category>ability-system</category><category>ai</category><category>behavior-tree</category><category>gamedev</category></item><item><title>BT Condition: Can Activate</title><link>https://cafegame.dev/docs/ability-system/classes/behavior-tree/can-activate/</link><guid isPermaLink="true">https://cafegame.dev/docs/ability-system/classes/behavior-tree/can-activate/</guid><pubDate>Sat, 18 Apr 2026 22:30:00 GMT</pubDate><description>&lt;div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
&lt;a href="https://cafegame.dev/docs/ability-system/classes/behavior-tree/can-activate/"
class="lang-toggle-link lang-toggle-active"
data-lang="pt"
onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT&lt;/a>
&lt;span class="hx:mx-1">|&lt;/span>
&lt;a href="https://cafegame.dev/en/docs/ability-system/classes/behavior-tree/can-activate/"
class="lang-toggle-link"
data-lang="en"
onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN&lt;/a>
&lt;/div>
&lt;style>
.lang-toggle-link {
text-decoration: none;
color: #6b7280;
font-weight: 500;
}
.lang-toggle-link:hover { color: #3b82f6; }
.lang-toggle-active {
color: #1f2937;
font-weight: 700;
border-bottom: 1px solid currentColor;
}
.dark .lang-toggle-active { color: #f3f4f6; }
&lt;/style>
&lt;div class="godot-api">
&lt;div class="api-header">
&lt;strong>Inherits:&lt;/strong> &lt;code>BTCondition&lt;/code>
&lt;/div>
&lt;p class="api-brief">BTCondition that checks if an ability can be activated.&lt;/p>
&lt;div class="api-description">
&lt;h3>Description&lt;/h3>
&lt;div class="api-description-content" style="margin-top: 1.25rem;">
A Behavior Tree condition that checks if an ability can be activated (requirements met, cooldown ready, costs affordable) without actually activating it.
Uses [method ASComponent.can_activate_ability_by_tag]. Returns [constant BT.SUCCESS] if can activate, [constant BT.FAILURE] otherwise.
&lt;/div>
&lt;/div>
&lt;h3>Properties&lt;/h3>
&lt;table class="api-table">
&lt;thead>
&lt;tr>&lt;th>Type&lt;/th>&lt;th>Name&lt;/th>&lt;th>Default&lt;/th>&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>StringName&lt;/code>&lt;/td>
&lt;td>&lt;strong>ability_tag&lt;/strong>&lt;/td>
&lt;td>&lt;code>&amp;amp;&amp;#34;&amp;#34;&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>NodePath&lt;/code>&lt;/td>
&lt;td>&lt;strong>asc_node_path&lt;/strong>&lt;/td>
&lt;td>&lt;code>NodePath(&amp;#34;&amp;#34;)&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div></description><content:encoded><![CDATA[<div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
    <a href="/docs/ability-system/classes/behavior-tree/can-activate/"
       class="lang-toggle-link lang-toggle-active"
       data-lang="pt"
       onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT</a>
    <span class="hx:mx-1">|</span>
    <a href="/en/docs/ability-system/classes/behavior-tree/can-activate/"
       class="lang-toggle-link"
       data-lang="en"
       onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN</a>
  </div>

  <style>
    .lang-toggle-link {
      text-decoration: none;
      color: #6b7280;
      font-weight: 500;
    }
    .lang-toggle-link:hover { color: #3b82f6; }
    .lang-toggle-active {
      color: #1f2937;
      font-weight: 700;
      border-bottom: 1px solid currentColor;
    }
    .dark .lang-toggle-active { color: #f3f4f6; }
  </style>





  







<div class="godot-api">
  <div class="api-header">
    <strong>Inherits:</strong> <code>BTCondition</code>
  </div>

  
  
  
  
  
  
  
  <p class="api-brief">BTCondition that checks if an ability can be activated.</p>

  
  <div class="api-description">
    <h3>Description</h3>
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    <div class="api-description-content" style="margin-top: 1.25rem;">
      A Behavior Tree condition that checks if an ability can be activated (requirements met, cooldown ready, costs affordable) without actually activating it.
Uses [method ASComponent.can_activate_ability_by_tag]. Returns [constant BT.SUCCESS] if can activate, [constant BT.FAILURE] otherwise.
    </div>
  </div>
  

  
  <h3>Properties</h3>
  <table class="api-table">
    <thead>
      <tr><th>Type</th><th>Name</th><th>Default</th></tr>
    </thead>
    <tbody>
      
      <tr>
        <td><code>StringName</code></td>
        <td><strong>ability_tag</strong></td>
        <td><code>&amp;&#34;&#34;</code></td>
      </tr>
      
      
      <tr>
        <td><code>NodePath</code></td>
        <td><strong>asc_node_path</strong></td>
        <td><code>NodePath(&#34;&#34;)</code></td>
      </tr>
      
      
    </tbody>
  </table>
  

  

  

  
</div>


]]></content:encoded><category>zyris-engine</category><category>godot-plugin</category><category>ability-system</category><category>ai</category><category>behavior-tree</category><category>gamedev</category></item><item><title>BT Action: Wait For Event</title><link>https://cafegame.dev/docs/ability-system/classes/behavior-tree/wait-for-event/</link><guid isPermaLink="true">https://cafegame.dev/docs/ability-system/classes/behavior-tree/wait-for-event/</guid><pubDate>Sat, 18 Apr 2026 22:30:00 GMT</pubDate><description>&lt;div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
&lt;a href="https://cafegame.dev/docs/ability-system/classes/behavior-tree/wait-for-event/"
class="lang-toggle-link lang-toggle-active"
data-lang="pt"
onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT&lt;/a>
&lt;span class="hx:mx-1">|&lt;/span>
&lt;a href="https://cafegame.dev/en/docs/ability-system/classes/behavior-tree/wait-for-event/"
class="lang-toggle-link"
data-lang="en"
onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN&lt;/a>
&lt;/div>
&lt;style>
.lang-toggle-link {
text-decoration: none;
color: #6b7280;
font-weight: 500;
}
.lang-toggle-link:hover { color: #3b82f6; }
.lang-toggle-active {
color: #1f2937;
font-weight: 700;
border-bottom: 1px solid currentColor;
}
.dark .lang-toggle-active { color: #f3f4f6; }
&lt;/style>
&lt;div class="godot-api">
&lt;div class="api-header">
&lt;strong>Inherits:&lt;/strong> &lt;code>BTAction&lt;/code>
&lt;/div>
&lt;p class="api-brief">BTAction that waits for an Ability System event to occur.&lt;/p>
&lt;div class="api-description">
&lt;h3>Description&lt;/h3>
&lt;div class="api-description-content" style="margin-top: 1.25rem;">
A Behavior Tree action that enters [constant BT.RUNNING] state and waits for a specific ASEventTag to occur. Uses [method ASComponent.has_event_occurred] to check the Events Historical buffer.
Returns [constant BT.SUCCESS] when event is detected within the time window, continues [constant BT.RUNNING] while waiting.
&lt;/div>
&lt;/div>
&lt;h3>Properties&lt;/h3>
&lt;table class="api-table">
&lt;thead>
&lt;tr>&lt;th>Type&lt;/th>&lt;th>Name&lt;/th>&lt;th>Default&lt;/th>&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>NodePath&lt;/code>&lt;/td>
&lt;td>&lt;strong>asc_node_path&lt;/strong>&lt;/td>
&lt;td>&lt;code>NodePath(&amp;#34;&amp;#34;)&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>StringName&lt;/code>&lt;/td>
&lt;td>&lt;strong>event_tag&lt;/strong>&lt;/td>
&lt;td>&lt;code>&amp;amp;&amp;#34;&amp;#34;&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>float&lt;/code>&lt;/td>
&lt;td>&lt;strong>time_window&lt;/strong>&lt;/td>
&lt;td>&lt;code>0.5&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div></description><content:encoded><![CDATA[<div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
    <a href="/docs/ability-system/classes/behavior-tree/wait-for-event/"
       class="lang-toggle-link lang-toggle-active"
       data-lang="pt"
       onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT</a>
    <span class="hx:mx-1">|</span>
    <a href="/en/docs/ability-system/classes/behavior-tree/wait-for-event/"
       class="lang-toggle-link"
       data-lang="en"
       onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN</a>
  </div>

  <style>
    .lang-toggle-link {
      text-decoration: none;
      color: #6b7280;
      font-weight: 500;
    }
    .lang-toggle-link:hover { color: #3b82f6; }
    .lang-toggle-active {
      color: #1f2937;
      font-weight: 700;
      border-bottom: 1px solid currentColor;
    }
    .dark .lang-toggle-active { color: #f3f4f6; }
  </style>





  







<div class="godot-api">
  <div class="api-header">
    <strong>Inherits:</strong> <code>BTAction</code>
  </div>

  
  
  
  
  
  
  
  <p class="api-brief">BTAction that waits for an Ability System event to occur.</p>

  
  <div class="api-description">
    <h3>Description</h3>
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    <div class="api-description-content" style="margin-top: 1.25rem;">
      A Behavior Tree action that enters [constant BT.RUNNING] state and waits for a specific ASEventTag to occur. Uses [method ASComponent.has_event_occurred] to check the Events Historical buffer.
Returns [constant BT.SUCCESS] when event is detected within the time window, continues [constant BT.RUNNING] while waiting.
    </div>
  </div>
  

  
  <h3>Properties</h3>
  <table class="api-table">
    <thead>
      <tr><th>Type</th><th>Name</th><th>Default</th></tr>
    </thead>
    <tbody>
      
      <tr>
        <td><code>NodePath</code></td>
        <td><strong>asc_node_path</strong></td>
        <td><code>NodePath(&#34;&#34;)</code></td>
      </tr>
      
      
      <tr>
        <td><code>StringName</code></td>
        <td><strong>event_tag</strong></td>
        <td><code>&amp;&#34;&#34;</code></td>
      </tr>
      
      
      <tr>
        <td><code>float</code></td>
        <td><strong>time_window</strong></td>
        <td><code>0.5</code></td>
      </tr>
      
      
    </tbody>
  </table>
  

  

  

  
</div>


]]></content:encoded><category>zyris-engine</category><category>godot-plugin</category><category>ability-system</category><category>ai</category><category>behavior-tree</category><category>gamedev</category></item><item><title>BT Action: Dispatch Event</title><link>https://cafegame.dev/docs/ability-system/classes/behavior-tree/dispatch-event/</link><guid isPermaLink="true">https://cafegame.dev/docs/ability-system/classes/behavior-tree/dispatch-event/</guid><pubDate>Sat, 18 Apr 2026 22:30:00 GMT</pubDate><description>&lt;div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
&lt;a href="https://cafegame.dev/docs/ability-system/classes/behavior-tree/dispatch-event/"
class="lang-toggle-link lang-toggle-active"
data-lang="pt"
onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT&lt;/a>
&lt;span class="hx:mx-1">|&lt;/span>
&lt;a href="https://cafegame.dev/en/docs/ability-system/classes/behavior-tree/dispatch-event/"
class="lang-toggle-link"
data-lang="en"
onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN&lt;/a>
&lt;/div>
&lt;style>
.lang-toggle-link {
text-decoration: none;
color: #6b7280;
font-weight: 500;
}
.lang-toggle-link:hover { color: #3b82f6; }
.lang-toggle-active {
color: #1f2937;
font-weight: 700;
border-bottom: 1px solid currentColor;
}
.dark .lang-toggle-active { color: #f3f4f6; }
&lt;/style>
&lt;div class="godot-api">
&lt;div class="api-header">
&lt;strong>Inherits:&lt;/strong> &lt;code>BTAction&lt;/code>
&lt;/div>
&lt;p class="api-brief">BTAction that dispatches an Ability System event.&lt;/p>
&lt;div class="api-description">
&lt;h3>Description&lt;/h3>
&lt;div class="api-description-content" style="margin-top: 1.25rem;">
A Behavior Tree action that dispatches an ASEventTag via [method ASComponent.dispatch_event]. Uses the native AS Event system (Split Registry Pattern).
Returns [constant BT.SUCCESS] immediately after dispatch.
&lt;/div>
&lt;/div>
&lt;h3>Properties&lt;/h3>
&lt;table class="api-table">
&lt;thead>
&lt;tr>&lt;th>Type&lt;/th>&lt;th>Name&lt;/th>&lt;th>Default&lt;/th>&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>NodePath&lt;/code>&lt;/td>
&lt;td>&lt;strong>asc_node_path&lt;/strong>&lt;/td>
&lt;td>&lt;code>NodePath(&amp;#34;&amp;#34;)&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Dictionary&lt;/code>&lt;/td>
&lt;td>&lt;strong>custom_payload&lt;/strong>&lt;/td>
&lt;td>&lt;code>{}&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>StringName&lt;/code>&lt;/td>
&lt;td>&lt;strong>event_tag&lt;/strong>&lt;/td>
&lt;td>&lt;code>&amp;amp;&amp;#34;&amp;#34;&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>float&lt;/code>&lt;/td>
&lt;td>&lt;strong>magnitude&lt;/strong>&lt;/td>
&lt;td>&lt;code>1.0&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div></description><content:encoded><![CDATA[<div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
    <a href="/docs/ability-system/classes/behavior-tree/dispatch-event/"
       class="lang-toggle-link lang-toggle-active"
       data-lang="pt"
       onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT</a>
    <span class="hx:mx-1">|</span>
    <a href="/en/docs/ability-system/classes/behavior-tree/dispatch-event/"
       class="lang-toggle-link"
       data-lang="en"
       onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN</a>
  </div>

  <style>
    .lang-toggle-link {
      text-decoration: none;
      color: #6b7280;
      font-weight: 500;
    }
    .lang-toggle-link:hover { color: #3b82f6; }
    .lang-toggle-active {
      color: #1f2937;
      font-weight: 700;
      border-bottom: 1px solid currentColor;
    }
    .dark .lang-toggle-active { color: #f3f4f6; }
  </style>





  







<div class="godot-api">
  <div class="api-header">
    <strong>Inherits:</strong> <code>BTAction</code>
  </div>

  
  
  
  
  
  
  
  <p class="api-brief">BTAction that dispatches an Ability System event.</p>

  
  <div class="api-description">
    <h3>Description</h3>
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    <div class="api-description-content" style="margin-top: 1.25rem;">
      A Behavior Tree action that dispatches an ASEventTag via [method ASComponent.dispatch_event]. Uses the native AS Event system (Split Registry Pattern).
Returns [constant BT.SUCCESS] immediately after dispatch.
    </div>
  </div>
  

  
  <h3>Properties</h3>
  <table class="api-table">
    <thead>
      <tr><th>Type</th><th>Name</th><th>Default</th></tr>
    </thead>
    <tbody>
      
      <tr>
        <td><code>NodePath</code></td>
        <td><strong>asc_node_path</strong></td>
        <td><code>NodePath(&#34;&#34;)</code></td>
      </tr>
      
      
      <tr>
        <td><code>Dictionary</code></td>
        <td><strong>custom_payload</strong></td>
        <td><code>{}</code></td>
      </tr>
      
      
      <tr>
        <td><code>StringName</code></td>
        <td><strong>event_tag</strong></td>
        <td><code>&amp;&#34;&#34;</code></td>
      </tr>
      
      
      <tr>
        <td><code>float</code></td>
        <td><strong>magnitude</strong></td>
        <td><code>1.0</code></td>
      </tr>
      
      
    </tbody>
  </table>
  

  

  

  
</div>


]]></content:encoded><category>zyris-engine</category><category>godot-plugin</category><category>ability-system</category><category>ai</category><category>behavior-tree</category><category>gamedev</category></item><item><title>BT Action: Activate Ability</title><link>https://cafegame.dev/docs/ability-system/classes/behavior-tree/activate-ability/</link><guid isPermaLink="true">https://cafegame.dev/docs/ability-system/classes/behavior-tree/activate-ability/</guid><pubDate>Sat, 18 Apr 2026 22:30:00 GMT</pubDate><description>&lt;div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
&lt;a href="https://cafegame.dev/docs/ability-system/classes/behavior-tree/activate-ability/"
class="lang-toggle-link lang-toggle-active"
data-lang="pt"
onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT&lt;/a>
&lt;span class="hx:mx-1">|&lt;/span>
&lt;a href="https://cafegame.dev/en/docs/ability-system/classes/behavior-tree/activate-ability/"
class="lang-toggle-link"
data-lang="en"
onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN&lt;/a>
&lt;/div>
&lt;style>
.lang-toggle-link {
text-decoration: none;
color: #6b7280;
font-weight: 500;
}
.lang-toggle-link:hover { color: #3b82f6; }
.lang-toggle-active {
color: #1f2937;
font-weight: 700;
border-bottom: 1px solid currentColor;
}
.dark .lang-toggle-active { color: #f3f4f6; }
&lt;/style>
&lt;div class="godot-api">
&lt;div class="api-header">
&lt;strong>Inherits:&lt;/strong> &lt;code>BTAction&lt;/code>
&lt;/div>
&lt;p class="api-brief">BTAction that activates an Ability System ability by tag.&lt;/p>
&lt;div class="api-description">
&lt;h3>Description&lt;/h3>
&lt;div class="api-description-content" style="margin-top: 1.25rem;">
A Behavior Tree action that attempts to activate an ability via [ASComponent] using the ability&amp;rsquo;s tag. Returns [constant BT.SUCCESS] if activation succeeds, [constant BT.FAILURE] otherwise.
This task respects all ability requirements: tags, cooldowns, costs, and level restrictions.
&lt;/div>
&lt;/div>
&lt;h3>Properties&lt;/h3>
&lt;table class="api-table">
&lt;thead>
&lt;tr>&lt;th>Type&lt;/th>&lt;th>Name&lt;/th>&lt;th>Default&lt;/th>&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>StringName&lt;/code>&lt;/td>
&lt;td>&lt;strong>ability_tag&lt;/strong>&lt;/td>
&lt;td>&lt;code>&amp;amp;&amp;#34;&amp;#34;&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td colspan="3" class="item-desc">&lt;div>The tag of the ability to activate.&lt;/div>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>float&lt;/code>&lt;/td>
&lt;td>&lt;strong>activation_level&lt;/strong>&lt;/td>
&lt;td>&lt;code>1.0&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td colspan="3" class="item-desc">&lt;div>The level at which to activate the ability.&lt;/div>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>NodePath&lt;/code>&lt;/td>
&lt;td>&lt;strong>asc_node_path&lt;/strong>&lt;/td>
&lt;td>&lt;code>NodePath(&amp;#34;&amp;#34;)&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td colspan="3" class="item-desc">&lt;div>Explicit path to ASComponent. Auto-resolved if empty.&lt;/div>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div></description><content:encoded><![CDATA[<div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
    <a href="/docs/ability-system/classes/behavior-tree/activate-ability/"
       class="lang-toggle-link lang-toggle-active"
       data-lang="pt"
       onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT</a>
    <span class="hx:mx-1">|</span>
    <a href="/en/docs/ability-system/classes/behavior-tree/activate-ability/"
       class="lang-toggle-link"
       data-lang="en"
       onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN</a>
  </div>

  <style>
    .lang-toggle-link {
      text-decoration: none;
      color: #6b7280;
      font-weight: 500;
    }
    .lang-toggle-link:hover { color: #3b82f6; }
    .lang-toggle-active {
      color: #1f2937;
      font-weight: 700;
      border-bottom: 1px solid currentColor;
    }
    .dark .lang-toggle-active { color: #f3f4f6; }
  </style>





  







<div class="godot-api">
  <div class="api-header">
    <strong>Inherits:</strong> <code>BTAction</code>
  </div>

  
  
  
  
  
  
  
  <p class="api-brief">BTAction that activates an Ability System ability by tag.</p>

  
  <div class="api-description">
    <h3>Description</h3>
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    <div class="api-description-content" style="margin-top: 1.25rem;">
      A Behavior Tree action that attempts to activate an ability via [ASComponent] using the ability&rsquo;s tag. Returns [constant BT.SUCCESS] if activation succeeds, [constant BT.FAILURE] otherwise.
This task respects all ability requirements: tags, cooldowns, costs, and level restrictions.
    </div>
  </div>
  

  
  <h3>Properties</h3>
  <table class="api-table">
    <thead>
      <tr><th>Type</th><th>Name</th><th>Default</th></tr>
    </thead>
    <tbody>
      
      <tr>
        <td><code>StringName</code></td>
        <td><strong>ability_tag</strong></td>
        <td><code>&amp;&#34;&#34;</code></td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="3" class="item-desc"><div>The tag of the ability to activate.</div></td>
      </tr>
      
      
      <tr>
        <td><code>float</code></td>
        <td><strong>activation_level</strong></td>
        <td><code>1.0</code></td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="3" class="item-desc"><div>The level at which to activate the ability.</div></td>
      </tr>
      
      
      <tr>
        <td><code>NodePath</code></td>
        <td><strong>asc_node_path</strong></td>
        <td><code>NodePath(&#34;&#34;)</code></td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="3" class="item-desc"><div>Explicit path to ASComponent. Auto-resolved if empty.</div></td>
      </tr>
      
      
    </tbody>
  </table>
  

  

  

  
</div>


]]></content:encoded><category>zyris-engine</category><category>godot-plugin</category><category>ability-system</category><category>ai</category><category>behavior-tree</category><category>gamedev</category></item><item><title>ASTagUtils</title><link>https://cafegame.dev/docs/ability-system/classes/refcounted/as-tag-utils/</link><guid isPermaLink="true">https://cafegame.dev/docs/ability-system/classes/refcounted/as-tag-utils/</guid><pubDate>Sat, 18 Apr 2026 22:30:00 GMT</pubDate><description>&lt;div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
&lt;a href="https://cafegame.dev/docs/ability-system/classes/refcounted/as-tag-utils/"
class="lang-toggle-link lang-toggle-active"
data-lang="pt"
onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT&lt;/a>
&lt;span class="hx:mx-1">|&lt;/span>
&lt;a href="https://cafegame.dev/en/docs/ability-system/classes/refcounted/as-tag-utils/"
class="lang-toggle-link"
data-lang="en"
onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN&lt;/a>
&lt;/div>
&lt;style>
.lang-toggle-link {
text-decoration: none;
color: #6b7280;
font-weight: 500;
}
.lang-toggle-link:hover { color: #3b82f6; }
.lang-toggle-active {
color: #1f2937;
font-weight: 700;
border-bottom: 1px solid currentColor;
}
.dark .lang-toggle-active { color: #f3f4f6; }
&lt;/style>
&lt;div class="godot-api">
&lt;div class="api-header">
&lt;strong>Inherits:&lt;/strong> &lt;code>RefCounted&lt;/code>
&lt;/div>
&lt;p class="api-brief">Utility functions for tag type validation, creation, and historical queries.&lt;/p>
&lt;div class="api-description">
&lt;h3>Description&lt;/h3>
&lt;div class="api-description-content" style="margin-top: 1.25rem;">
&lt;p>ASTagUtils provides comprehensive helper functions for working with Ability System tags.
Includes type validation, automatic type detection from naming conventions, factory methods,
and powerful historical query APIs for all three tag types.&lt;/p></description><content:encoded><![CDATA[<div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
    <a href="/docs/ability-system/classes/refcounted/as-tag-utils/"
       class="lang-toggle-link lang-toggle-active"
       data-lang="pt"
       onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT</a>
    <span class="hx:mx-1">|</span>
    <a href="/en/docs/ability-system/classes/refcounted/as-tag-utils/"
       class="lang-toggle-link"
       data-lang="en"
       onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN</a>
  </div>

  <style>
    .lang-toggle-link {
      text-decoration: none;
      color: #6b7280;
      font-weight: 500;
    }
    .lang-toggle-link:hover { color: #3b82f6; }
    .lang-toggle-active {
      color: #1f2937;
      font-weight: 700;
      border-bottom: 1px solid currentColor;
    }
    .dark .lang-toggle-active { color: #f3f4f6; }
  </style>





  







<div class="godot-api">
  <div class="api-header">
    <strong>Inherits:</strong> <code>RefCounted</code>
  </div>

  
  
  
  
  
  
  
  <p class="api-brief">Utility functions for tag type validation, creation, and historical queries.</p>

  
  <div class="api-description">
    <h3>Description</h3>
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    <div class="api-description-content" style="margin-top: 1.25rem;">
      <p>ASTagUtils provides comprehensive helper functions for working with Ability System tags.
Includes type validation, automatic type detection from naming conventions, factory methods,
and powerful historical query APIs for all three tag types.</p>
<p>Features three specialized historical namespaces:</p>
<ul>
<li>NameHistory: Queries for NAME tags (State.Stunned, Class.Warrior)</li>
<li>ConditionalHistory: Queries for CONDITIONAL tags (Can.Parried, Immune.Fire)</li>
<li>EventHistory: Enhanced queries for EVENT tags (Event.Damage, Event.Ability.Activated)</li>
<li>UnifiedHistory: Cross-type queries and debug utilities</li>
</ul>
<p>These utilities follow the BUSINESS_RULES.md conventions for tag naming
and help maintain type safety across the system with full historical tracking.</p>

    </div>
  </div>
  

  

  
  <h3>Methods</h3>
  <table class="api-table">
    <thead>
      <tr><th>Return</th><th>Name</th></tr>
    </thead>
    <tbody>
      
      <tr>
        <td><code>int</code></td>
        <td>
          <strong>cond_count_additions</strong>(
          tag: <code>StringName</code>, target: <code>Node</code>, lookback_sec: <code>float</code> = 1.0)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Counts how many times a specific [constant CONDITIONAL] tag was added to the target within the last [param lookback_sec] seconds.</div></td>
      </tr>
      
      
      <tr>
        <td><code>int</code></td>
        <td>
          <strong>cond_count_removals</strong>(
          tag: <code>StringName</code>, target: <code>Node</code>, lookback_sec: <code>float</code> = 1.0)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Counts how many times a specific [constant CONDITIONAL] tag was removed from the target within the last [param lookback_sec] seconds.</div></td>
      </tr>
      
      
      <tr>
        <td><code>Array</code></td>
        <td>
          <strong>cond_get_recent_additions</strong>(
          target: <code>Node</code>, lookback_sec: <code>float</code> = 1.0)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns an array of conditional tag names that were added to the target within the last [param lookback_sec] seconds.</div></td>
      </tr>
      
      
      <tr>
        <td><code>Array</code></td>
        <td>
          <strong>cond_get_recent_changes</strong>(
          target: <code>Node</code>, lookback_sec: <code>float</code> = 1.0)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns an array of all conditional tag events (additions and removals) that occurred within the last [param lookback_sec] seconds.</div></td>
      </tr>
      
      
      <tr>
        <td><code>Array</code></td>
        <td>
          <strong>cond_get_recent_removals</strong>(
          target: <code>Node</code>, lookback_sec: <code>float</code> = 1.0)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns an array of conditional tag names that were removed from the target within the last [param lookback_sec] seconds.</div></td>
      </tr>
      
      
      <tr>
        <td><code>bool</code></td>
        <td>
          <strong>cond_had_tag</strong>(
          tag: <code>StringName</code>, target: <code>Node</code>, lookback_sec: <code>float</code> = 1.0)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns true if the target had the specified conditional tag at any point during the last [param lookback_sec] seconds.</div></td>
      </tr>
      
      
      <tr>
        <td><code>bool</code></td>
        <td>
          <strong>cond_was_tag_added</strong>(
          tag: <code>StringName</code>, target: <code>Node</code>, lookback_sec: <code>float</code> = 1.0)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns true if the specified conditional tag was added to the target within the last [param lookback_sec] seconds.</div></td>
      </tr>
      
      
      <tr>
        <td><code>bool</code></td>
        <td>
          <strong>cond_was_tag_removed</strong>(
          tag: <code>StringName</code>, target: <code>Node</code>, lookback_sec: <code>float</code> = 1.0)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns true if the specified conditional tag was removed from the target within the last [param lookback_sec] seconds.</div></td>
      </tr>
      
      
      <tr>
        <td><code>int</code></td>
        <td>
          <strong>detect_tag_type</strong>(
          tag: <code>StringName</code>)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Detects tag type from naming convention.
Event.* -&gt; EVENT, Can.* or Immune.* -&gt; CONDITIONAL, others -&gt; NAME.</div></td>
      </tr>
      
      
      <tr>
        <td><code>int</code></td>
        <td>
          <strong>event_count_occurrences</strong>(
          tag: <code>StringName</code>, target: <code>Node</code>, lookback_sec: <code>float</code> = 1.0)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns the number of times the specified event occurred on the target within the last [param lookback_sec] seconds.</div></td>
      </tr>
      
      
      <tr>
        <td><code>bool</code></td>
        <td>
          <strong>event_did_occur</strong>(
          tag: <code>StringName</code>, target: <code>Node</code>, lookback_sec: <code>float</code> = 1.0)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns true if the specified event occurred on the target within the last [param lookback_sec] seconds.</div></td>
      </tr>
      
      
      <tr>
        <td><code>Array</code></td>
        <td>
          <strong>event_get_all_recent_events</strong>(
          target: <code>Node</code>, lookback_sec: <code>float</code> = 1.0)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns a list of all event entries that occurred on the target within the last [param lookback_sec] seconds.</div></td>
      </tr>
      
      
      <tr>
        <td><code>Dictionary</code></td>
        <td>
          <strong>event_get_last_data</strong>(
          tag: <code>StringName</code>, target: <code>Node</code>)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Retrieves the data payload from the most recent occurrence of the specified event tag.</div></td>
      </tr>
      
      
      <tr>
        <td><code>Node</code></td>
        <td>
          <strong>event_get_last_instigator</strong>(
          tag: <code>StringName</code>, target: <code>Node</code>)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Retrieves the instigator node from the most recent occurrence of the specified event tag.</div></td>
      </tr>
      
      
      <tr>
        <td><code>float</code></td>
        <td>
          <strong>event_get_last_magnitude</strong>(
          tag: <code>StringName</code>, target: <code>Node</code>)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Retrieves the magnitude value from the most recent occurrence of the specified event tag.</div></td>
      </tr>
      
      
      <tr>
        <td><code>Array</code></td>
        <td>
          <strong>event_get_recent_events</strong>(
          tag: <code>StringName</code>, target: <code>Node</code>, lookback_sec: <code>float</code> = 1.0)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns a list of recent entries for a specific event tag on the target.</div></td>
      </tr>
      
      
      <tr>
        <td><code>void</code></td>
        <td>
          <strong>history_dump</strong>(
          target: <code>Node</code>, lookback_sec: <code>float</code> = 5.0)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Prints a formatted debug log of all historical entries for the target to the console.</div></td>
      </tr>
      
      
      <tr>
        <td><code>Array</code></td>
        <td>
          <strong>history_get_all_changes</strong>(
          target: <code>Node</code>, lookback_sec: <code>float</code> = 1.0)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns a combined array of all Name and Conditional tag changes within the last [param lookback_sec] seconds.</div></td>
      </tr>
      
      
      <tr>
        <td><code>Array</code></td>
        <td>
          <strong>history_get_tag_history</strong>(
          tag: <code>StringName</code>, target: <code>Node</code>, lookback_sec: <code>float</code> = 1.0)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns all historical entries (timeline) for a specific tag on the target.</div></td>
      </tr>
      
      
      <tr>
        <td><code>int</code></td>
        <td>
          <strong>history_get_total_size</strong>(
          target: <code>Node</code>)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns the combined number of entries across all historical buffers for the target.</div></td>
      </tr>
      
      
      <tr>
        <td><code>bool</code></td>
        <td>
          <strong>history_was_tag_present</strong>(
          tag: <code>StringName</code>, target: <code>Node</code>, lookback_sec: <code>float</code> = 1.0)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>General purpose query to check if any version of the specified tag was present at any point within the target&rsquo;s historical buffers.</div></td>
      </tr>
      
      
      <tr>
        <td><code>bool</code></td>
        <td>
          <strong>is_can_tag</strong>(
          tag: <code>StringName</code>)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns true if tag name starts with &ldquo;Can.&rdquo;.</div></td>
      </tr>
      
      
      <tr>
        <td><code>bool</code></td>
        <td>
          <strong>is_class_tag</strong>(
          tag: <code>StringName</code>)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns true if tag name starts with &ldquo;Class.&rdquo;.</div></td>
      </tr>
      
      
      <tr>
        <td><code>bool</code></td>
        <td>
          <strong>is_event_tag</strong>(
          tag: <code>StringName</code>)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns true if tag name starts with &ldquo;Event.&rdquo;.</div></td>
      </tr>
      
      
      <tr>
        <td><code>bool</code></td>
        <td>
          <strong>is_immune_tag</strong>(
          tag: <code>StringName</code>)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns true if tag name starts with &ldquo;Immune.&rdquo;.</div></td>
      </tr>
      
      
      <tr>
        <td><code>bool</code></td>
        <td>
          <strong>is_state_tag</strong>(
          tag: <code>StringName</code>)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns true if tag name starts with &ldquo;State.&rdquo;.</div></td>
      </tr>
      
      
      <tr>
        <td><code>bool</code></td>
        <td>
          <strong>is_team_tag</strong>(
          tag: <code>StringName</code>)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns true if tag name starts with &ldquo;Team.&rdquo;.</div></td>
      </tr>
      
      
      <tr>
        <td><code>int</code></td>
        <td>
          <strong>name_count_additions</strong>(
          tag: <code>StringName</code>, target: <code>Node</code>, lookback_sec: <code>float</code> = 1.0)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Counts how many times a specific [constant NAME] tag was added to the target within the last [param lookback_sec] seconds.</div></td>
      </tr>
      
      
      <tr>
        <td><code>int</code></td>
        <td>
          <strong>name_count_removals</strong>(
          tag: <code>StringName</code>, target: <code>Node</code>, lookback_sec: <code>float</code> = 1.0)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Counts how many times a specific [constant NAME] tag was removed from the target within the last [param lookback_sec] seconds.</div></td>
      </tr>
      
      
      <tr>
        <td><code>Array</code></td>
        <td>
          <strong>name_get_recent_additions</strong>(
          target: <code>Node</code>, lookback_sec: <code>float</code> = 1.0)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns an array of name tag identifiers that were added to the target within the last [param lookback_sec] seconds.</div></td>
      </tr>
      
      
      <tr>
        <td><code>Array</code></td>
        <td>
          <strong>name_get_recent_changes</strong>(
          target: <code>Node</code>, lookback_sec: <code>float</code> = 1.0)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns an array of all name tag events (additions and removals) that occurred within the last [param lookback_sec] seconds.</div></td>
      </tr>
      
      
      <tr>
        <td><code>Array</code></td>
        <td>
          <strong>name_get_recent_removals</strong>(
          target: <code>Node</code>, lookback_sec: <code>float</code> = 1.0)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns an array of name tag identifiers that were removed from the target within the last [param lookback_sec] seconds.</div></td>
      </tr>
      
      
      <tr>
        <td><code>bool</code></td>
        <td>
          <strong>name_had_tag</strong>(
          tag: <code>StringName</code>, target: <code>Node</code>, lookback_sec: <code>float</code> = 1.0)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns true if the target had the specified name tag at any point during the last [param lookback_sec] seconds.</div></td>
      </tr>
      
      
      <tr>
        <td><code>bool</code></td>
        <td>
          <strong>name_was_tag_added</strong>(
          tag: <code>StringName</code>, target: <code>Node</code>, lookback_sec: <code>float</code> = 1.0)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns true if the specified name tag was added to the target within the last [param lookback_sec] seconds.</div></td>
      </tr>
      
      
      <tr>
        <td><code>bool</code></td>
        <td>
          <strong>name_was_tag_removed</strong>(
          tag: <code>StringName</code>, target: <code>Node</code>, lookback_sec: <code>float</code> = 1.0)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns true if the specified name tag was removed from the target within the last [param lookback_sec] seconds.</div></td>
      </tr>
      
      
      <tr>
        <td><code>bool</code></td>
        <td>
          <strong>validate_tag_type</strong>(
          tag: <code>StringName</code>, expected_type: <code>int</code>)
          <code>static</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Validates that a tag exists and matches the expected type.
Returns false if tag doesn&rsquo;t exist or type doesn&rsquo;t match.</div></td>
      </tr>
      
      
    </tbody>
  </table>
  

  

  
  <h3>Constants</h3>
  <table class="api-table">
    <thead>
      <tr><th>Name</th><th>Value</th></tr>
    </thead>
    <tbody>
      
      <tr>
        <td><strong>NAME</strong></td>
        <td><code>0</code></td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>A standard identity tag for classes, states, or teams (e.g., State.Stunned).</div></td>
      </tr>
      
      
      <tr>
        <td><strong>CONDITIONAL</strong></td>
        <td><code>1</code></td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>A dynamic conditional tag with duration and magnitude support (e.g., Can.Attack).</div></td>
      </tr>
      
      
      <tr>
        <td><strong>EVENT</strong></td>
        <td><code>2</code></td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>A high-frequency ephemeral tag with payload support (e.g., Event.Damage).</div></td>
      </tr>
      
      
      <tr>
        <td><strong>UNKNOWN</strong></td>
        <td><code>255</code></td>
      </tr>
      
      
    </tbody>
  </table>
  
</div>


]]></content:encoded><category>zyris-engine</category><category>godot-plugin</category><category>ability-system</category><category>gamedev</category><category>gameplay-logic</category></item><item><title>ASTagSpec</title><link>https://cafegame.dev/docs/ability-system/classes/refcounted/as-tag-spec/</link><guid isPermaLink="true">https://cafegame.dev/docs/ability-system/classes/refcounted/as-tag-spec/</guid><pubDate>Sat, 18 Apr 2026 22:30:00 GMT</pubDate><description>&lt;div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
&lt;a href="https://cafegame.dev/docs/ability-system/classes/refcounted/as-tag-spec/"
class="lang-toggle-link lang-toggle-active"
data-lang="pt"
onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT&lt;/a>
&lt;span class="hx:mx-1">|&lt;/span>
&lt;a href="https://cafegame.dev/en/docs/ability-system/classes/refcounted/as-tag-spec/"
class="lang-toggle-link"
data-lang="en"
onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN&lt;/a>
&lt;/div>
&lt;style>
.lang-toggle-link {
text-decoration: none;
color: #6b7280;
font-weight: 500;
}
.lang-toggle-link:hover { color: #3b82f6; }
.lang-toggle-active {
color: #1f2937;
font-weight: 700;
border-bottom: 1px solid currentColor;
}
.dark .lang-toggle-active { color: #f3f4f6; }
&lt;/style>
&lt;div class="godot-api">
&lt;div class="api-header">
&lt;strong>Inherits:&lt;/strong> &lt;code>RefCounted&lt;/code>
&lt;/div>
&lt;p class="api-brief">Collection of unique Tags.&lt;/p>
&lt;div class="api-description">
&lt;h3>Description&lt;/h3>
&lt;div class="api-description-content" style="margin-top: 1.25rem;">
[ASTagSpec] manages a set of tags and provides methods for hierarchical matching.
&lt;/div>
&lt;/div>
&lt;h3>Methods&lt;/h3>
&lt;table class="api-table">
&lt;thead>
&lt;tr>&lt;th>Return&lt;/th>&lt;th>Name&lt;/th>&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>bool&lt;/code>&lt;/td>
&lt;td>
&lt;strong>add_tag&lt;/strong>(
tag: &lt;code>StringName&lt;/code>)
&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td colspan="2" class="item-desc">&lt;div>Adds a tag to the container. If the tag already exists, increments its reference count. Returns &lt;code>true&lt;/code> if this is the first reference to the tag.&lt;/div>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>void&lt;/code>&lt;/td>
&lt;td>
&lt;strong>clear&lt;/strong>(
)
&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td colspan="2" class="item-desc">&lt;div>Removes all tags from the container.&lt;/div>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>StringName[]&lt;/code>&lt;/td>
&lt;td>
&lt;strong>get_all_tags&lt;/strong>(
)
&lt;code>const&lt;/code>
&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td colspan="2" class="item-desc">&lt;div>Returns all tags currently in this container.&lt;/div>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>bool&lt;/code>&lt;/td>
&lt;td>
&lt;strong>has_all_tags&lt;/strong>(
tags: &lt;code>StringName[]&lt;/code>, exact: &lt;code>bool&lt;/code> = false)
&lt;code>const&lt;/code>
&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td colspan="2" class="item-desc">&lt;div>Returns true if the container has all of the specified tags.&lt;/div>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>bool&lt;/code>&lt;/td>
&lt;td>
&lt;strong>has_any_tags&lt;/strong>(
tags: &lt;code>StringName[]&lt;/code>, exact: &lt;code>bool&lt;/code> = false)
&lt;code>const&lt;/code>
&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td colspan="2" class="item-desc">&lt;div>Returns true if the container has any of the specified tags.&lt;/div>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>bool&lt;/code>&lt;/td>
&lt;td>
&lt;strong>has_tag&lt;/strong>(
tag: &lt;code>StringName&lt;/code>, exact: &lt;code>bool&lt;/code> = false)
&lt;code>const&lt;/code>
&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td colspan="2" class="item-desc">&lt;div>Returns true if the container has the specified tag.&lt;/div>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>bool&lt;/code>&lt;/td>
&lt;td>
&lt;strong>remove_tag&lt;/strong>(
tag: &lt;code>StringName&lt;/code>)
&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td colspan="2" class="item-desc">&lt;div>Decrements the reference count of a tag. If the count reaches zero, the tag is removed. Returns &lt;code>true&lt;/code> if the tag was actually removed (reference count reached zero).&lt;/div>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div></description><content:encoded><![CDATA[<div class="lang-toggle hx:text-sm hx:text-gray-500 hx:dark:text-gray-400 hx:text-center hx:mt-2 hx:mb-4">
    <a href="/docs/ability-system/classes/refcounted/as-tag-spec/"
       class="lang-toggle-link lang-toggle-active"
       data-lang="pt"
       onclick="document.cookie='lang_pref=pt; path=/; max-age=31536000; samesite=lax';">PT</a>
    <span class="hx:mx-1">|</span>
    <a href="/en/docs/ability-system/classes/refcounted/as-tag-spec/"
       class="lang-toggle-link"
       data-lang="en"
       onclick="document.cookie='lang_pref=en; path=/; max-age=31536000; samesite=lax';">EN</a>
  </div>

  <style>
    .lang-toggle-link {
      text-decoration: none;
      color: #6b7280;
      font-weight: 500;
    }
    .lang-toggle-link:hover { color: #3b82f6; }
    .lang-toggle-active {
      color: #1f2937;
      font-weight: 700;
      border-bottom: 1px solid currentColor;
    }
    .dark .lang-toggle-active { color: #f3f4f6; }
  </style>





  







<div class="godot-api">
  <div class="api-header">
    <strong>Inherits:</strong> <code>RefCounted</code>
  </div>

  
  
  
  
  
  
  
  <p class="api-brief">Collection of unique Tags.</p>

  
  <div class="api-description">
    <h3>Description</h3>
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    <div class="api-description-content" style="margin-top: 1.25rem;">
      [ASTagSpec] manages a set of tags and provides methods for hierarchical matching.
    </div>
  </div>
  

  

  
  <h3>Methods</h3>
  <table class="api-table">
    <thead>
      <tr><th>Return</th><th>Name</th></tr>
    </thead>
    <tbody>
      
      <tr>
        <td><code>bool</code></td>
        <td>
          <strong>add_tag</strong>(
          tag: <code>StringName</code>)
          
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Adds a tag to the container. If the tag already exists, increments its reference count. Returns <code>true</code> if this is the first reference to the tag.</div></td>
      </tr>
      
      
      <tr>
        <td><code>void</code></td>
        <td>
          <strong>clear</strong>(
          )
          
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Removes all tags from the container.</div></td>
      </tr>
      
      
      <tr>
        <td><code>StringName[]</code></td>
        <td>
          <strong>get_all_tags</strong>(
          )
          <code>const</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns all tags currently in this container.</div></td>
      </tr>
      
      
      <tr>
        <td><code>bool</code></td>
        <td>
          <strong>has_all_tags</strong>(
          tags: <code>StringName[]</code>, exact: <code>bool</code> = false)
          <code>const</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns true if the container has all of the specified tags.</div></td>
      </tr>
      
      
      <tr>
        <td><code>bool</code></td>
        <td>
          <strong>has_any_tags</strong>(
          tags: <code>StringName[]</code>, exact: <code>bool</code> = false)
          <code>const</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns true if the container has any of the specified tags.</div></td>
      </tr>
      
      
      <tr>
        <td><code>bool</code></td>
        <td>
          <strong>has_tag</strong>(
          tag: <code>StringName</code>, exact: <code>bool</code> = false)
          <code>const</code>
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Returns true if the container has the specified tag.</div></td>
      </tr>
      
      
      <tr>
        <td><code>bool</code></td>
        <td>
          <strong>remove_tag</strong>(
          tag: <code>StringName</code>)
          
        </td>
      </tr>
      
      <tr>
        
        
        
        
        
        
        
        
        <td colspan="2" class="item-desc"><div>Decrements the reference count of a tag. If the count reaches zero, the tag is removed. Returns <code>true</code> if the tag was actually removed (reference count reached zero).</div></td>
      </tr>
      
      
    </tbody>
  </table>
  

  

  
</div>


]]></content:encoded><category>zyris-engine</category><category>godot-plugin</category><category>ability-system</category><category>gamedev</category><category>gameplay-logic</category></item></channel></rss>