MOODUL 13 · TASE 5 — SPETSIALIST

🧠 AI-Toega Mänguarendus

GitHub Copilot, ChatGPT, prompt engineering, AI-genereeritud sisu, koodi genereerimine ja refaktoreerimine.

⏱️ ~5-7 tundi 📝 6 harjutust 🟣 Spetsialist

🤖 Samm 1 — GitHub Copilot Efektiivne Kasutamine

💡 Copiloti parimad praktikad
  • Kirjuta alati selge kommentaar enne koodi — Copilot kasutab seda kontekstina
  • Lisa tüübi annotatsioone (TypeScript) — paremad soovitused
  • Ava seotud failid kõrvaltabidesse — Copilot loeb neid
  • Kasuta Tab aktseptimiseks, Esc tagasilükkamiseks, Alt+] alternatiivide vaatamiseks
Näide — Kommentaar-juhitud genereerimine
// Loo partiklisüsteem mis emiteerib ringikujuliselt
// Partiklid liiguvad väljapoole, kaotavad läbipaistvust
// ja vähenevad suuruses. Max 200 partiklit.

class CircleEmitter {
  particles: Particle[] = [];
  maxParticles = 200;
  emitRate = 30; // partiklit sekundis
  
  // Copilot genereerib ülejäänud koodi...
  emit(x: number, y: number, delta: number): void {
    const count = Math.floor(this.emitRate * delta);
    for (let i = 0; i < count && this.particles.length < this.maxParticles; i++) {
      const angle = Math.random() * Math.PI * 2;
      const speed = 50 + Math.random() * 100;
      this.particles.push({
        x, y,
        vx: Math.cos(angle) * speed,
        vy: Math.sin(angle) * speed,
        life: 1,
        size: 4 + Math.random() * 4,
      });
    }
  }
  
  update(delta: number): void {
    for (let i = this.particles.length - 1; i >= 0; i--) {
      const p = this.particles[i];
      p.x += p.vx * delta;
      p.y += p.vy * delta;
      p.life -= delta;
      p.size *= 0.99;
      if (p.life <= 0) this.particles.splice(i, 1);
    }
  }
}

// 🔑 Oluline: Copilot pakkus kogu emit() ja update()
// põhinedes ainult kommentaarile!

💬 Samm 2 — Prompt Engineering Mänguarenduses

Efektiivsed promptid
// ==========================================
// HALB PROMPT:
// "Tee mulle mäng"
//
// HEA PROMPT:
// "Loo TypeScript klass EnemySpawner:
//  - Spawn'ib vaenlasi wave'idena (laine 1: 5 vaenlast, laine 2: 8, jne)
//  - Iga wave vahel 10s paus
//  - Vaenlaste tüübid: Grunt (HP:50), Tank (HP:150), Fast (HP:30, speed:2x)
//  - Spawn positsioonid: ekraani servadest
//  - Event: onWaveStart(waveNumber), onWaveComplete(), onAllWavesComplete()
//  - Kasuta EventEmitter mustrit
//  - Koodi kommentaarid eesti keeles"
// ==========================================

// KONTEKSTI ANDMINE:
// "Minu projektis on järgmine struktuur:
//  - Entity klass (position, update, render)
//  - GameLoop klass (entities[], addEntity, removeEntity)  
//  - Vector2 klass (add, sub, normalize, scale)
//  Loo Projectile klass mis laiendab Entity-t..."

// ITERATIIVNE TÄIENDAMINE:
// 1. "Loo põhi Inventory klass"
// 2. "Lisa stackable items tugi (max stack: 99)"
// 3. "Lisa drag & drop HTML5 API-ga"
// 4. "Lisa tooltip mis näitab item stat'e"
// 5. "Optimeeri: kasuta Object Pool'i"

🎨 Samm 3 — AI Sisu Genereerimine

aiContent.ts — Protseduurne tekst ja dialoogid
// Mängu dialogide genereerimine API kaudu
async function generateNPCDialog(
  npcName: string,
  personality: string,
  context: string
): Promise<string> {
  const response = await fetch('https://api.openai.com/v1/chat/completions', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${API_KEY}`,
    },
    body: JSON.stringify({
      model: 'gpt-4o-mini',
      messages: [
        {
          role: 'system',
          content: `Sa oled NPC nimega ${npcName}. 
            Iseloom: ${personality}. 
            Räägi lühidalt (max 2 lauset). 
            Kontekst: fantaasia-RPG maailm.`,
        },
        { role: 'user', content: context },
      ],
      max_tokens: 100,
      temperature: 0.8,
    }),
  });

  const data = await response.json();
  return data.choices[0].message.content;
}

// Item kirjelduste genereerimine
async function generateItemDescription(
  itemName: string,
  itemType: string,
  rarity: string
): Promise<string> {
  // Kasuta cache'i et mitte iga kord API-t kutsuda
  const cacheKey = `item_${itemName}`;
  const cached = localStorage.getItem(cacheKey);
  if (cached) return cached;

  const desc = await generateNPCDialog(
    'Narrator',
    'poeetiline jutustaja',
    `Kirjelda eset: ${itemName} (${itemType}, ${rarity})`
  );
  
  localStorage.setItem(cacheKey, desc);
  return desc;
}

// NB! Ära kasuta API kutseid reaalajas mängu ajal!
// Genereeri sisu eelnevalt ja cache'ita.
⚠️ AI API kulude kontroll

API kutsed maksavad raha! Strateegia: genereeri sisu arenduse ajal ja salvesta JSON-failidesse. Mängu käivitudes laadi staatiliselt.

🔧 Samm 4 — Copilot Chat Mänguarenduses

Copilot Chat näited
// VS Code'is: Ctrl+I (inline chat) või Ctrl+Shift+I (chat panel)

// ---- KOODISELETUS ----
// Vali kood → "Selgita seda koodi"
// → Copilot annab detailse selgituse

// ---- BUGIDE LEIDMINE ----
// Vali kood → "Leia bugid selles koodis"
// → Copilot tuvastab potentsiaalsed probleemid

// ---- REFAKTOREERIMINE ----
// Vali kood → "/fix optimeeri see game loop"
// → Copilot pakub refaktoreeritud versiooni

// ---- TESTID ----
// Vali kood → "/tests loo unit testid"
// → Copilot genereerib Vitest testid

// ---- DOKUMENTATSIOON ----
// Vali kood → "/doc lisa JSDoc kommentaarid"
// → Copilot lisab JSDoc annotatsioonid

// ---- MÄNGU-SPETSIIFILISED ----
// "Kuidas implementeerida A* pathfinding TypeScriptis?"
// "Optimeeri see collision detection O(n²) → O(n log n)"
// "Loo shader mis teeb water ripple efekti"
// "Kuidas lisada gamepad tugi HTML5 Gamepad API-ga?"

📝 Harjutused

  • Copilot kommentaar-juhtimine

    Kirjuta 10 detailset kommentaari ja lase Copilotil genereerida kood. Hinda tulemusi: mitu oli kohe kasutatavad? Mis vajasid parandusi?

  • Prompt Engineering harjutus

    Loo EnemySpawner wave-süsteem ainult promptidega. Alusta lihtsast → lisa keerukust iteratiivselt. Dokumenteeri iga prompt ja tulemus.

  • AI-genereeritud mängu sisu

    Genereeri 20 item'i nimed, kirjeldused ja stat'id. Salvesta JSON-faili. Laadi JSON mängu ja kuva inventaris. Loo ka quest kirjeldused.

  • Koodiülevaatus AI-ga

    Võta oma vana mängukood → lase AI-l analüüsida (bugid, optimeerimised, turvaaugud). Rakenda parandused. Enne/pärast FPS võrdlus.

  • Testide genereerimine

    Vali 5 mängufunktsiooni → genereeri igale unit testid AI-ga. Käivita Vitest. Paranda testid mis ei lähe läbi. Saavuta 80%+ katvus.

  • AI + protseduurne genereerimine

    Kombineeri AI-genereeritud JSON (seiklus-sündmused) + protseduurne dungeon. Iga ruum saab unikaalse AI-kirjelduse. Cache tulemused.

← Moodul 12 Moodul 14: Optimeerimine →