Fast trivia duels where the floor decides the loser.
Trivia Drop is a Minecraft Java Fabric party game where players race to the correct colored zone for each question before the wrong floor collapses. It is designed for 2–16 players, with short matches, highly readable UI, and a content pipeline that keeps every question objective, source-backed, and easy to expand. The v2 product focus is a scalable multi-category question system, reliable server-authoritative game logic, and cinematic presentation for streams and short-form video.
Server Host Raka, 27 - Raka runs a small Minecraft community server and wants a party mini-game that can be launched quickly for events. He needs something stable, easy to configure, and fun for mixed-skill players.
Streamer Naya, 23 - Naya creates Minecraft content and needs games that produce obvious, funny moments on camera. She cares about fast pacing, readable visuals, and clear tension before the drop.
Casual Player Dimas, 15 - Dimas joins with friends and may not know every trivia topic. He needs the rules to be obvious, the UI to be readable, and the game to stay fair even if he is not a trivia expert.
Raka wants a minigame for his community server that can be launched quickly, works for mixed-skill players, and produces funny moments on stream. He used to rely on ad hoc party games, but players would get bored, matches would drag, and unclear questions caused arguments.
With Trivia Drop, Raka loads a validated question pack, sets the arena once, and starts a match with a single command. The server handles the whole flow: category reveal, question display, timer, drop, elimination, and winner camera, so he can focus on hosting instead of babysitting the game.
After a few rounds, players understand the rules instantly and viewers can follow the action because the UI is clear and the outcomes are dramatic. Raka gets a repeatable event format that is easy to update with new questions, keeps the match fair, and turns his server into a place people want to return to.
Team & resourcing - Small team - 2 engineers, 1 designer, part-time PM, and optional content writer/QA support
Paste this into Cursor, Bolt, Lovable, or v0 to start building.
Build a Minecraft Java Fabric mod called Trivia Drop, a server-authoritative party trivia mini-game for 2-16 players. Core gameplay: - Players start in a lobby, then enter a match loop with phases: lobby, intro cutscene, category reveal, question, thinking, drop resolution, reset, winner cam. - Each round shows one trivia question with 4 colored answer zones: Red=A, Blue=B, Green=X, Yellow=Y. - Players run to the correct zone before the timer ends; wrong zones collapse to air and eliminate players. - Support TRUE_FALSE rounds with only 2 active zones, plus mixed-category and single-category modes. - The server is authoritative: do not send the correct answer to clients until the drop resolution phase. Primary screens/UI: - Custom question banner at top center with round number and category badge. - Four large option cards at the bottom replacing the hotbar area. - Timer bomb icon top right with urgent countdown in the last 3 seconds. - Zone indicator above the hotbar showing the currently active answer zone. - Drop cam result panel showing the correct answer, explanation, and source after the floor collapses. - Winner screen with fireworks and summary stats. Data model: - Question JSON files stored at data/triviadrop/questions/<category>.json. - Question fields: id, type, difficulty, question, options, correct, explanation, source, tags, deprecated optional. - Categories include umum, geografi, sains, matematika, sejarah, bahasa, teknologi, minecraft, olahraga, budaya, hiburan, meme62. - Add a QuestionManager, QuestionValidator, and QuestionPicker that loads, validates, randomizes, and avoids repeats across the current match and recent matches. Required systems: - Commands: /trivia start [mode] [category], /trivia stop, /trivia setspawn, /trivia reload, /trivia stats. - Networking packets for phase sync, question sync, zone sync, cutscene sync, and round result sync. - Client-side camera controller, HUD renderer, and simple animations. - Config file for player limits, thinking duration, cooldowns, language, and reduced-motion option. - Basic stats logging for matches, categories, eliminations, and validation failures. Tech stack: - Java 17, Fabric API, Fabric Loader, Minecraft client/server mixins, Gson for JSON parsing, and standard Minecraft resource/data pack assets. - Use clean package structure: command, config, question, game, network, client, mixin. - Keep implementation lightweight and performant for small hosted servers. Deliver a working MVP first with a simple arena reset and match loop, then add polished HUD, cutscenes, audio hooks, and validation-friendly content loading.
# Trivia Death Drop — Master Plan v2 *Game Design, Bank Soal Multi-Kategori & Technical Blueprint • Fabric Mod • Versi 2.0 • 24 Oktober 2026* --- ## 0. Ringkasan Eksekutif | Item | Isi | | --- | --- | | Nama | Trivia Death Drop | | Platform | Minecraft Java • Fabric API (arsitektur Client–Server) | | Genre | Party game / battle royale trivia (ala Mario Party, WarioWare) | | Premis | Soal muncul → pemain berlari ke kuadran warna jawaban → lantai kuadran yang salah runtuh → pemain terakhir menang | | Pemain | 2–16 (ideal 4–10 untuk konten video) | | Durasi 1 match | ±4–8 menit | | Perubahan utama v2 | Bank soal tidak lagi hanya meme +62, tetapi 11 kategori dengan jawaban objektif, tingkat kesulitan, mode permainan, dan pipeline kualitas soal | ### Pilar Desain 1. **Adil** — setiap soal punya tepat satu jawaban benar yang bisa diverifikasi. 2. **Chaos terkontrol** — dorong-dorongan seru, tapi hasil akhir ditentukan pengetahuan. 3. **Juicy** — UI, kamera, dan suara terasa seperti game konsol. 4. **Mudah dikonten-kan** — momen jatuh selalu terlihat jelas dari kamera sinematik. 5. **Mudah diperluas** — soal dan kategori berbasis data (JSON/datapack), bukan hardcode. --- ## 1. Sistem Kategori & Bank Soal (Fitur Baru) ### 1.1 Daftar Kategori | ID | Kategori | Cakupan | Target soal awal | | --- | --- | --- | --- | | `umum` | Pengetahuan Umum | Fakta dunia, rekor, benda sehari-hari | 60 | | `geografi` | Geografi | Ibu kota, gunung, sungai, selat, benua | 60 | | `sains` | Sains & Alam | Fisika, kimia, biologi, astronomi | 60 | | `matematika` | Matematika & Logika | Hitungan cepat, pola bilangan, persen | 60 | | `sejarah` | Sejarah | Sejarah Indonesia & dunia | 60 | | `bahasa` | Bahasa Indonesia | Ejaan baku, sinonim, antonim, peribahasa | 50 | | `teknologi` | Teknologi & Internet | Singkatan, perangkat, pemrograman dasar | 50 | | `minecraft` | Minecraft & Gaming | Mob, blok, crafting, dimensi, sejarah game | 60 | | `olahraga` | Olahraga | Aturan, turnamen, atlet, rekor | 50 | | `budaya` | Budaya & Kuliner Nusantara | Makanan, tarian, alat musik, rumah adat | 60 | | `hiburan` | Seni & Hiburan | Film, musik, tokoh seni (fakta tetap) | 40 | | `meme62` | Meme & Internet +62 | Slang dan istilah viral dengan kunci jawaban jelas | 40 | **Total target rilis: ±650 soal** (cukup untuk puluhan match tanpa pengulangan). Target akhir: 1.000+. ### 1.2 Aturan Soal Objektif (WAJIB lolos semua) - Hanya **satu** jawaban benar yang bisa dibuktikan dengan sumber (KBBI, buku pelajaran, situs resmi, dokumentasi). - **Bukan opini** (“makanan terenak”, “lagu terbaik”). - **Bukan data yang cepat basi** (“presiden sekarang”, “harga terbaru”). Jika harus, beri `validUntil` atau hindari. - Teks soal **maksimal ±90 karakter**, jawaban **maksimal ±22 karakter** agar muat di kartu. - Tiga pilihan salah harus **masuk akal** (distraktor yang meyakinkan), bukan jawaban konyol. - Posisi jawaban benar **diacak saat runtime**, dan bank soal dijaga seimbang (±25% per warna). - Wajib ada kolom `explanation` singkat (untuk ditampilkan di layar sesudah lantai runtuh). - Soal meme +62 wajib punya sumber/asal viral yang bisa dicek, supaya tetap objektif. ### 1.3 Tipe Soal | Tipe | Cara main | Zona aktif | | --- | --- | --- | | `MCQ4` | Pilihan ganda A/B/X/Y (standar) | 4 kuadran | | `TRUE_FALSE` | Benar atau Salah | 2 kuadran (Biru = Benar, Merah = Salah); 2 sisanya dihilangkan dari awal | | `ESTIMASI` *(fase lanjut)* | Pilih rentang angka terdekat | 4 kuadran berisi rentang | ### 1.4 Kurva Kesulitan & Waktu per Ronde | Ronde | Kesulitan | Waktu berpikir | Catatan | | --- | --- | --- | --- | | 1–3 | Mudah | 10 detik | Pemanasan, sedikit yang gugur | | 4–6 | Sedang | 9 detik | Mulai ada eliminasi | | 7–9 | Sulit | 8 detik | Soal lintas kategori | | 10+ | Sudden Death | 6–7 detik | Soal tersulit + Tongkat Senggol cooldown lebih pendek | Distribusi bank: **40% mudah • 40% sedang • 20% sulit**. ### 1.5 Contoh Soal per Kategori **Geografi** - Ibu kota Australia? → Canberra (distraktor: Sydney, Melbourne, Perth) - Gunung tertinggi di Indonesia? → Puncak Jaya - Sungai terpanjang di Indonesia? → Kapuas **Sains & Alam** - Planet terbesar di tata surya? → Jupiter - Gas terbanyak di atmosfer Bumi? → Nitrogen - Organel “pembangkit tenaga” sel? → Mitokondria **Matematika & Logika** - 15% dari 200 = ? → 30 - Pola 2, 4, 8, 16, … angka berikutnya? → 32 - Akar kuadrat dari 169? → 13 **Sejarah** - Proklamasi kemerdekaan Indonesia dibacakan tahun? → 1945 - Penjahit Bendera Pusaka? → Fatmawati - Sumpah Pemuda diikrarkan tahun? → 1928 **Bahasa Indonesia** - Bentuk baku yang benar? → apotek (bukan apotik) - Antonim kata “rajin”? → malas **Teknologi** - CPU adalah singkatan dari? → Central Processing Unit - Bahasa pemrograman utama Minecraft Java Edition? → Java **Minecraft & Gaming** - Bahan utama membuat portal Nether? → Obsidian - Boss utama dimensi The End? → Ender Dragon - Nyawa maksimal pemain secara default? → 20 HP (10 hati) **Olahraga** - Jumlah pemain sepak bola per tim di lapangan? → 11 - Juara Piala Dunia FIFA 2022? → Argentina - Olimpiade diselenggarakan setiap berapa tahun? → 4 tahun **Budaya & Kuliner** - Rendang berasal dari? → Sumatera Barat (Minangkabau) - Tari Kecak berasal dari? → Bali - Angklung berasal dari? → Jawa Barat **Seni & Hiburan** - Band pelantun “Bohemian Rhapsody”? → Queen **Meme & Internet +62** - “Mager” singkatan dari? → Malas gerak - “Gaskeun” kurang lebih berarti? → Ayo lakukan / ayo berangkat > Semua contoh di atas wajib tetap diverifikasi ulang saat dimasukkan ke bank resmi (lihat pipeline di Bagian 8). ### 1.6 Mode Permainan | Mode | Deskripsi | Command | | --- | --- | --- | | Campuran *(default)* | Kategori diacak tiap ronde | `/trivia start` | | Satu Kategori | Semua soal dari satu kategori | `/trivia start kategori geografi` | | Voting Kategori | Sebelum ronde, pemain voting kategori lewat zona | `/trivia start voting` | | Meme Only | Hanya `meme62` (edisi +62 klasik) | `/trivia start meme62` | | Marathon | Tanpa eliminasi, skor tertinggi menang *(opsional, fase lanjut)* | `/trivia start marathon` | ### 1.7 Format Data (`data/triviadrop/questions/<kategori>.json`) ```json { "category": "geografi", "questions": [ { "id": "geo_001", "type": "MCQ4", "difficulty": "EASY", "question": "Ibu kota Australia?", "options": ["Canberra", "Sydney", "Melbourne", "Perth"], "correct": 0, "explanation": "Canberra adalah ibu kota; Sydney hanya kota terbesar.", "source": "https://...", "tags": ["ibu-kota", "benua-australia"] } ] } ``` Saat dimuat, `correct` diacak ke posisi warna lewat `QuestionPicker` — indeks 0 di file **tidak** berarti Merah. ### 1.8 Logika Pemilihan Soal (`QuestionPicker`) 1. Filter berdasarkan mode, kategori, dan tingkat kesulitan ronde. 2. Buang soal yang sudah keluar di match ini (dan 3 match terakhir bila memungkinkan). 3. Hindari 2 ronde berturut-turut dari kategori yang sama (mode Campuran). 4. Acak urutan opsi; catat posisi warna benar. 5. Jika bank habis → reset riwayat dan kirim peringatan di log server. --- ## 2. Struktur Direktori (Diperbarui) ```text trivia-death-drop/ ├── src/main/java/com/myvlex/triviadrop/ │ ├── TriviaDropMod.java # Init server: command, tick event, packet registry │ ├── TriviaDropClient.java # Init client: HUD, sound, packet receiver │ ├── command/ │ │ └── TriviaCommand.java # start [mode] [kategori], stop, setspawn, reload, stats │ ├── config/ │ │ ├── ArenaBounds.java # Koordinat kuadran & kamera cutscene │ │ ├── GameSettings.java # Durasi, jumlah ronde, pemain min/max (dari config.json) │ │ └── QuestionManager.java # Loader semua file kategori │ ├── question/ # BARU │ │ ├── Question.java # Record data soal │ │ ├── Category.java # Enum + warna badge + ikon │ │ ├── Difficulty.java # EASY, MEDIUM, HARD │ │ ├── QuestionType.java # MCQ4, TRUE_FALSE, ESTIMASI │ │ ├── QuestionPicker.java # Logika pemilihan & anti-ulang │ │ └── QuestionValidator.java # Validasi saat load (lihat Bagian 8) │ ├── game/ │ │ ├── GameLoop.java # State machine per tick │ │ ├── GamePhase.java # IDLE, LOBBY, INTRO_CAM, CATEGORY_REVEAL, QUESTION, │ │ │ # THINKING, DROP_CAM, RESET, WINNER_CAM │ │ ├── GameMode.java # MIXED, SINGLE, VOTING, MEME, MARATHON │ │ ├── PlayerTracker.java # Hidup/mati, zona saat ini, skor, disconnect │ │ └── ArenaManipulator.java # Set/hapus blok kaca, partikel, petir │ ├── network/ │ │ └── ModPackets.java # SyncPhaseS2C, SyncQuestionS2C, SyncZoneS2C, CutsceneS2C, ResultS2C │ ├── client/ │ │ ├── CameraController.java # Bezier/Lerp kamera │ │ ├── HudAnimator.java # Slide, bounce, shake, scale │ │ └── NintendoHudRenderer.java # Gambar tekstur & font │ └── mixin/ │ ├── CameraMixin.java │ ├── InGameHudMixin.java │ └── KeyboardInputMixin.java │ └── src/main/resources/ ├── fabric.mod.json ├── triviadrop.mixins.json ├── data/triviadrop/ │ ├── config.json # Pengaturan default game │ └── questions/ │ ├── umum.json geografi.json sains.json matematika.json │ ├── sejarah.json bahasa.json teknologi.json minecraft.json │ └── olahraga.json budaya.json hiburan.json meme62.json └── assets/triviadrop/ ├── lang/id_id.json en_us.json # Teks UI (siap multi-bahasa) ├── sounds.json ├── font/ (nintendo_bold.json, FredokaOne-Bold.ttf) ├── sounds/ (lihat Bagian 4) └── textures/gui/ (lihat Bagian 3) ``` --- ## 3. Aset UI & Texture (Spesifikasi Figma) Buat aset di Figma **2x** dari ukuran tampil, lalu render dengan `MatrixStack.scale(0.5f, 0.5f, 1.0f)`. Gaya: sudut sangat membulat, stroke putih/hitam 4–6 px, warna vibrant. | File | Canvas (px) | Deskripsi | Posisi render | | --- | --- | --- | --- | | `question_banner.png` | 512 × 128 | Kotak krem, border kuning tebal, header pill “RONDE X”, drop shadow keras | Tengah atas (Y: 15), meluncur dari Y: -150 | | `option_cards.png` | 512 × 256 (sprite 2×2) | 4 kartu 256×128: Merah, Biru, Hijau, Kuning, ikon lingkaran A/B/X/Y | Bawah layar, berjejer 4 menggantikan hotbar | | `timer_bomb.png` | 256 × 128 (sprite) | Bom kartun + percikan sumbu | Kanan atas (X: W-80, Y: 20), berdenyut | | `countdown_numbers.png` | 512 × 512 (sprite) | Angka 3, 2, 1 raksasa + badge “JATUH!” | Tengah layar, zoom-out 3.0 → 1.0 | | `zone_indicator.png` | 256 × 64 | Pill gelap + ikon sepatu, border diwarnai dinamis | Di atas hotbar (Y: H-45) | | `transition_star.png` | 512 × 512 | Layar hitam dengan lubang bintang/Creeper | Fullscreen, scale 0 → 10 | | `category_badge.png` **(BARU)** | 1024 × 128 (sprite 12 ikon 128×128 ) | Ikon per kategori (globe, atom, buku, dll.) dengan warna khas | Di dalam banner soal, kiri atas | | `result_panel.png` **(BARU)** | 512 × 192 | Panel kecil penjelasan jawaban benar + sumber singkat | Tengah bawah saat Drop Cam | | `tf_cards.png` **(BARU)** | 512 × 128 | Versi 2 kartu besar “BENAR” (biru) dan “SALAH” (merah) | Bawah layar saat soal TRUE\_FALSE | Warna kartu tetap konsisten: **Merah = A, Biru = B, Hijau = X, Kuning = Y**. --- ## 4. Audio & Sound Effects | Event | Suara | | --- | --- | | Intro | `bgm_intro` — musik pembuka ceria 4 detik | | Kategori diumumkan **(BARU)** | `sfx_category_reveal` — stinger pendek + suara “ting” | | Banner & kartu masuk | `sfx_card_slide` (Whoosh-Pop) + `sfx_ui_pop` per kartu | | Berpikir | `bgm_thinking` — loop tegang, makin cepat di akhir | | Pindah zona | `sfx_zone_step` — Blip bernada tinggi | | 3–2–1 | `sfx_countdown` / `sfx_tick_urgent` | | Jawaban benar terungkap **(BARU)** | `sfx_correct_ding` | | Lantai runtuh | `sfx_drop_meme` — kaca pecah + meme sound (Vine Boom, dll.) | | Pemain tersenggol **(BARU)** | `sfx_bonk` | | Pemenang | `sfx_fanfare_win` | > Catatan lisensi: pakai SFX bebas hak cipta atau buat sendiri agar aman diunggah ke YouTube/TikTok. --- ## 5. Alur Permainan Detik demi Detik | Fase | Durasi | Kontrol pemain | Kejadian utama | | --- | --- | --- | --- | | 1. Intro Cutscene | 4 d (80 tick) | WASD terkunci, HUD vanilla hilang | Transisi bintang → teleport ke tengah arena → kamera fly-over (20, Y+15, 20) → (-20, Y+8, 20) → judul bounce-in | | 2. Category Reveal **(BARU)** | 1 d (20 tick) | Kamera ke first-person | Ikon + nama kategori muncul di banner, `sfx_category_reveal` | | 3. Question Pop-Up | 2 d (40 tick) | Bebas bergerak, dapat Tongkat Senggol (cooldown 5 d) | Banner turun (easeOutBack), 4 kartu muncul bergantian jeda 0.1 d | | 4. Thinking / Chaos | 6–10 d sesuai ronde | Lari, dorong, sabotase | Kartu zona yang diinjak membesar 1.15× dan bergoyang; zone indicator update; 3 detik terakhir panic mode (bom merah + countdown 3-2-1) | | 5. Drop Cam | 4.5 d (90 tick) | Kamera di pojok (16, Y+12, 16) | Detik 0–1 tegang: kartu benar berkedip hijau, lainnya abu-abu; detik 1 lantai salah jadi AIR + partikel + petir; detik 3 tampil `result_panel` berisi penjelasan | | 6. Evaluasi | 2 d (40 tick) | — | >1 pemain: lantai pulih (poof putih) → ulang ke fase 2/3; 1 pemain: Winner Podium; 0 pemain: lihat Edge Cases | | 7. Winner Cam | 8 d | Kamera zoom-in 3 blok di depan pemenang | Kembang api, banner “PEMENANG: \[Nama\]”, ringkasan statistik, lalu kembali ke lobi | ### Rumus Animasi (siap pakai) ```text easeOutBack(t) = 1 + 2.70158 * (t-1)^3 + 1.70158 * (t-1)^2 easeInOut(t) = t < 0.5 ? 4*t^3 : 1 - ((-2*t + 2)^3) / 2 pulseScale = 1.0 + sin((worldTime + tickDelta) * 0.35) * 0.08 ``` Gunakan `easeOutBack` untuk pop-up UI, `easeInOut` untuk kamera cutscene, dan `pulseScale` untuk kartu yang diinjak serta detak bom. ### Edge Cases & Aturan Khusus (BARU) | Situasi | Aturan | | --- | --- | | Pemain berdiri di garis tengah / tidak di zona mana pun saat waktu habis | Dianggap **salah** (jatuh) | | Semua pemain yang tersisa salah | Tidak ada yang tereliminasi, ronde diulang dengan soal baru (maksimal 2 kali, setelahnya yang paling lama di zona benar menang / sudden death) | | Semua tersisa benar | Tidak ada yang jatuh, lanjut ronde berikutnya dengan waktu dipercepat | | Pemain disconnect | Dianggap tereliminasi di ronde itu; tidak membatalkan match | | Pemain join di tengah match | Otomatis Spectator | | Server restart / `/trivia stop` | Pulihkan arena, kembalikan inventori, kamera, dan kontrol semua pemain | | Tongkat Senggol | Knockback tetap, tidak merusak, cooldown 5 d (3 d di Sudden Death) | | Pemain terjatuh sebelum waktu habis (didorong keluar arena) | Tereliminasi langsung, jadi Spectator | --- ## 6. Rencana Pengerjaan (Roadmap) | Tahap | Fokus | Deliverable | Definition of Done | Estimasi | | --- | --- | --- | --- | --- | | 1 | Core arena & server loop (tanpa UI/kamera) | `/trivia start`, loader semua JSON kategori, `QuestionPicker`, penghancuran kaca, pesan chat | Match 2+ pemain berjalan sampai ada pemenang tanpa crash; semua kategori bisa dimuat | 1–2 minggu | | 2 | Networking & cutscene kamera | Packet `CutsceneS2C`, `CameraMixin`, `KeyboardInputMixin` | Kamera terbang A→B saat intro & drop cam, kontrol terkunci/lepas dengan benar | 1–2 minggu | | 3 | Desain Figma & custom HUD | 9 file texture, `NintendoHudRenderer`, `HudAnimator` | Banner, kartu, timer, countdown tampil benar di 3 resolusi layar | 2 minggu | | 4 | Audio, sabotase, mode | Semua `.ogg`, Tongkat Senggol, mode Satu Kategori & Voting | Playtest 4+ pemain tanpa bug blocker | 1 minggu | | 5 | Konten soal | ±650 soal lolos validator & review | Distribusi warna benar seimbang, semua soal punya sumber | Paralel dari tahap 1 | | 6 | Polish & rilis | Config, lang file, README, thumbnail, build `.jar` | Build rilis stabil, panduan install tersedia | 1 minggu | ### Checklist Milestone - [ ] Tahap 1 selesai: logika eliminasi 100% benar di chat-mode - [ ] Tahap 2 selesai: cutscene intro & drop berfungsi - [ ] Tahap 3 selesai: HUD lengkap dengan animasi - [ ] Tahap 4 selesai: audio & sabotase terpasang - [ ] Tahap 5 selesai: bank soal ≥ 650 tervalidasi - [ ] Tahap 6 selesai: rilis v1.0 --- ## 7. Sistem Teknis Tambahan ### Konfigurasi (`config.json`) | Key | Fungsi | Default | | --- | --- | --- | | `minPlayers` / `maxPlayers` | Batas pemain | 2 / 16 | | `thinkingSeconds` | Durasi dasar berpikir | 10 | | `minThinkingSeconds` | Batas terendah di sudden death | 6 | | `pushStickCooldown` | Cooldown tongkat (detik) | 5 | | `mixedModeCategories` | Kategori yang aktif di mode Campuran | semua | | `showExplanation` | Tampilkan penjelasan jawaban | true | | `language` | Bahasa UI | id\_id | ### Command - `/trivia start [mode] [kategori]` — mulai match - `/trivia stop` — hentikan dan pulihkan arena - `/trivia setspawn` — set titik spawn / pusat arena - `/trivia reload` — muat ulang bank soal tanpa restart server - `/trivia stats` — statistik pemain dan kategori ### Sinkronisasi Jaringan - Server menjadi sumber kebenaran: fase, soal, waktu, dan hasil. - Client hanya merender; **jawaban benar tidak dikirim ke client sebelum Drop Cam** (anti-cheat). - Paket `SyncZoneS2C` mengirim zona yang sedang diinjak tiap pemain (untuk indikator). --- ## 8. Pipeline Pembuatan & Kontrol Kualitas Soal ### Alur Kerja 1. **Draft** — tulis soal sesuai template JSON. 2. **Verifikasi sumber** — minimal 1 sumber tepercaya (2 untuk soal sulit atau soal angka/tahun). 3. **Review silang** — teman memeriksa ambiguitas, ejaan, dan distraktor. 4. **Validator otomatis** — dijalankan saat build dan saat `/trivia reload`. 5. **Playtest** — catat soal yang terlalu mudah, terlalu sulit, atau membingungkan. 6. **Revisi** — soal bermasalah ditandai `deprecated: true`, bukan dihapus. ### Aturan Validator (`QuestionValidator`) - ID unik di seluruh bank. - `options` berjumlah tepat 4 (atau 2 untuk TRUE\_FALSE) dan tidak ada duplikat. - `correct` berada dalam rentang indeks. - Panjang teks soal/jawaban tidak melebihi batas kartu. - `difficulty`, `type`, dan `category` valid. - Ada `explanation` dan `source`. - Peringatan jika distribusi jawaban benar per posisi menyimpang lebih dari 10% dari merata. ### Template Cepat Review Soal - [ ] Hanya satu jawaban benar? - [ ] Tidak bergantung pada opini atau waktu? - [ ] Distraktor masuk akal? - [ ] Muat di kartu? - [ ] Ejaan sesuai KBBI? - [ ] Ada sumber dan penjelasan? ### Target Konten | Tingkat | Jumlah per kategori (rata-rata) | | --- | --- | | Mudah | 20–24 | | Sedang | 20–24 | | Sulit | 10–12 | --- ## 9. Rencana Pengujian | Area | Uji | | --- | --- | | Logika game | Eliminasi benar, semua-salah, semua-benar, 1 pemain tersisa, disconnect | | Soal | Tidak ada soal ganda dalam 1 match, distribusi warna merata, validator lolos | | Kamera & kontrol | Kontrol terkunci hanya saat cutscene; pulih jika `/trivia stop` di tengah cutscene | | HUD | Skala di GUI scale 1–4, resolusi 720p/1080p/1440p, teks panjang tidak terpotong | | Jaringan | Latensi tinggi, pemain bergabung telat, 16 pemain bersamaan | | Performa | Rebuild lantai tidak memicu lag spike di server kecil | | Kompatibilitas | Fabric API versi target, mod HUD populer (opsional) | --- ## 10. Risiko & Mitigasi | Risiko | Dampak | Mitigasi | | --- | --- | --- | | Soal salah atau ambigu | Pemain kesal, konten tidak kredibel | Pipeline verifikasi sumber + review silang | | Bank soal habis cepat | Soal berulang | Target 1.000+ soal, riwayat anti-ulang antar match | | Mixin bentrok dengan mod lain | Crash atau kamera bug | Gunakan injection point minimal, uji dengan mod populer | | Cutscene membuat pusing | Pemain tidak nyaman | Opsi “kurangi gerakan kamera” di config | | Aset audio kena copyright | Video diklaim | Pakai SFX bebas lisensi/buat sendiri, catat daftar lisensi | | Scope terlalu besar | Proyek mandek | Kerjakan sesuai tahap; fitur Marathon/Estimasi masuk backlog | --- ## 11. Backlog Ide Lanjutan - Soal bergambar (gambar flag, siluet mob) dengan tipe `IMAGE_MCQ`. - Mode tim (merah vs biru) dan skor poin. - Power-up: Shield (kebal 1 ronde), 50:50 (hapus 1 zona salah), Freeze Stick. - Pack soal tambahan lewat datapack/resource pack komunitas. - Leaderboard dan statistik antar match. - Dukungan multi-bahasa (en\_us, id\_id). - Integrasi streamer: tampilkan skor di overlay OBS. --- ## 12. Langkah Berikutnya (Aksi Segera) 1. Buat folder `question/` dan record `Question.java`. 2. Siapkan 12 file JSON kosong dengan template, isi minimal 10 soal per kategori untuk uji awal. 3. Implementasikan `QuestionValidator` dan `QuestionPicker`. 4. Jalankan match versi chat-mode dengan mode Campuran. 5. Baru lanjut ke networking dan kamera.
Design by The Resonance | Powered by GPC – The AI Transformation Company