TDD-004
Telemetry Schema
Document Information
Purpose
Dokumen ini menetapkan peristiwa apa yang dicatat, bentuk datanya, ke mana ia ditulis, dan angka apa yang diturunkan darinya.
Kenapa ia kritis, bukan pelengkap. Sejumlah keputusan besar sengaja ditunda ke playtest — terutama Skala Dunia (S), yang menyentuh Fear Radius, jangkauan senjata, Jarak Baca, dan seluruh kecepatan sekaligus (GDD-007). Playtest tanpa instrumentasi pulang membawa kesan, dan kesan tidak dapat menyelesaikan perdebatan skala. RBB-002 mengunci konsekuensinya: telemetri ditulis bersamaan dengan sistemnya, tidak pernah ditempel belakangan.
Sumber turunan: Rencana Bangun Bertahap Fase 0 · GDD-007 Skala Dunia · TDD-001 arsitektur modul.
Ke Mana Data Ditulis
| Jalur | Putusan | |
|---|---|---|
| HttpService → endpoint eksternal | Dipakai. Satu POST JSON per batch. Untuk playtest tertutup, penerimanya cukup Google Apps Script Web App yang menulis ke Spreadsheet — gratis, tanpa server yang harus dijaga, dan median dapat dihitung dengan satu rumus di sel. | |
| AnalyticsService bawaan Roblox | Tidak dipakai sebagai jalur utama — parameter kustomnya terlalu terbatas untuk memasangkan dua peristiwa lewat animalId, dan itu justru inti pengukuran kita. | |
| DataStore | Tidak dipakai. Ia penyimpanan profil, bukan aliran peristiwa, dan tidak dapat dikueri. | |
UlarMenggigit | biome, Stamina saat digigit, berujung Sekarat atau tidak | (baru Agustus 2026, DN-013) Menjawab pertanyaan kepadatan ular. Satuannya gigitan per sesi, bukan jumlah ular — dan hanya telemetri yang dapat mengukurnya. Fase 1 ke atas; Fase 0 belum memuat ular. |
Syarat teknis: Allow HTTP Requests wajib aktif di pengaturan game, dan HttpService hanya berjalan di tempat yang sudah dipublikasikan — bukan di Studio tanpa izin. Ini perlu disiapkan sebelum playtest, bukan pada hari playtest.
Jalur pindahnya sudah aman. Bentuk peristiwa di bawah tidak mengandaikan penerimanya apa pun. Mengganti Spreadsheet dengan basis data sungguhan kelak berarti mengubah satu URL, bukan menulis ulang instrumentasinya.
Batching
- Peristiwa disangga per pemain di server, tidak pernah dikirim satu per satu —
HewanTerlihatsaja bisa menyala puluhan kali per sesi. - Disiram (flush) saat sesi berakhir, tiap 60 detik, atau saat sangga mencapai 50 peristiwa — mana yang lebih dulu. Siraman berkala mencegah satu crash menghapus seluruh sesi.
- Kegagalan pengiriman tidak pernah mengganggu permainan. Bungkus dalam
pcall; bila gagal, buang sangganya dan lanjut. Telemetri yang bisa menjatuhkan sesi lebih merugikan daripada telemetri yang hilang. - Seluruhnya berjalan di server. Client tidak pernah mengirim telemetri — ia dapat dipalsukan, dan angka palsu lebih buruk daripada tidak ada angka (CDR-007).
Amplop — Field yang Selalu Ada
| Field | Tipe | Isi |
|---|---|---|
event | string | Nama peristiwa |
sessionId | string | GUID, dibuat saat pemain masuk. Mengikat seluruh peristiwa satu sesi. |
playerHash | string | UserId yang di-hash dengan salt proyek — stabil antar sesi, tetapi bukan identitas mentah. Lihat catatan privasi. |
t | number | Detik sejak sesi dimulai, presisi 0,1 — bukan waktu jam. Selisih antar peristiwa yang dipakai, bukan tanggalnya. |
build | string | Versi build, mis. "F0.3" |
S | number | Nilai Skala Dunia yang berlaku saat itu. |
Field S adalah yang paling mudah dilupakan dan paling mahal bila hilang. Seluruh tujuan playtest ini adalah mencoba beberapa nilai S. Tanpa mencatatnya di tiap peristiwa, data sebelum dan sesudah perubahan tercampur menjadi satu kolam — dan pertanyaan yang ingin dijawab justru menjadi tidak terjawab oleh datanya sendiri.
Privasi. UserId mentah tidak pernah dikirim keluar. playerHash memberi kesinambungan antar sesi tanpa memindahkan identitas Roblox ke layanan luar. Isi Chat Clan, nama clan, dan seluruh teks buatan pemain tidak pernah masuk telemetri — tidak ada peristiwa yang membawa teks bebas.
Empat Peristiwa Fase 0
Inilah yang dibangun bersamaan dengan sistem berburu pertama, dan yang menjawab pertanyaan Skala Dunia.
HewanTerlihat
| Field | Tipe | Isi |
|---|---|---|
animalId | string | ID instance hewan itu di dunia, bukan ID spesies. Inilah yang memasangkan penglihatan dengan tembakan. |
species | string | ANM0001, dst |
jarak | number | Studs saat pertama terlihat |
statusHewan | string | Netral / Makan / AngkatKepala |
Definisi “terlihat” harus dikunci, dan ini bukan soal remeh. Bila peristiwa ini menyala tiap kali hewan masuk bidang pandang kamera, seorang pemain yang berputar di tempat akan mencatat puluhan penglihatan dan median waktu pendekatan menjadi omong kosong. Aturannya:
- Menyala sekali per
animalIdper sesi — penglihatan berikutnya atas hewan yang sama diabaikan. - Syaratnya garis pandang tidak terhalang dan jarak di dalam Jarak Baca Varian yang disewa (15 tanpa teropong, MDD-003).
- Diperiksa di server dengan laju rendah (mis. 4× per detik), bukan tiap frame.
TembakanDilepas
| Field | Tipe | Isi |
|---|---|---|
animalId | string | Target. Wajib — inilah pasangannya dengan HewanTerlihat. |
species | string | ANM0001, dst |
senjata | string | WPN0001–0004 |
jarak | number | Studs saat pelepasan |
rasioJangkauan | number | jarak ÷ jangkauan senjata — 0,0 sampai 1,0. Ini yang menguji Peluang Tangkap tanpa bergantung pada nilai S. |
kena | boolean | Hasil yang ditentukan server saat pelepasan |
sikapTubuh | string | Sprint / Jalan / Jongkok / Tiarap |
diRumput | boolean | Apakah pemain berada di zona rumput tinggi |
HewanKabur
| Field | Tipe | Isi |
|---|---|---|
animalId | string | — |
species | string | — |
sebab | string | Terdeteksi / TembakanMeleset / AlarmBeruntun |
jarak | number | Jarak pemain saat hewan kabur |
frEfektif | number | Fear Radius efektif setelah seluruh pengali — memvalidasi Aturan Penumpukan Deteksi dengan angka nyata, bukan hitungan kertas |
SesiSelesai
| Field | Tipe | Isi |
|---|---|---|
durasi | number | Detik |
tangkapan | number | Jumlah hewan yang berhasil diekstraksi |
jarakBerjalan | number | Studs |
varian | string | BPK yang disewa |
sebabKeluar | string | Ekstraksi / Keluar / Terputus |
Dikirim pada PlayerRemoving dan BindToClose. Tanpa keduanya, sesi yang berakhir karena server ditutup akan hilang seluruhnya — dan sesi terpanjang justru yang paling sering berakhir begitu.
Angka yang Diturunkan
Peristiwa mentah tidak berguna sampai diketahui apa yang dihitung darinya. Kelimanya dihitung dari empat peristiwa di atas, tanpa tambahan.
| Angka | Cara hitung | Menjawab |
|---|---|---|
| Waktu pendekatan median | TembakanDilepas.t − HewanTerlihat.t, dipasangkan lewat animalId | Skala Dunia (S) — target 30–60 detik |
| Rasio penglihatan yang berujung tembakan | Jumlah animalId berpasangan ÷ seluruh HewanTerlihat | Berapa banyak hewan yang dilihat lalu diabaikan atau hilang |
Sebaran rasioJangkauan | Histogram dari TembakanDilepas | Apakah pemain benar-benar memakai paruh luar jangkauan, atau selalu merayap mendekat |
| Meleset nyata vs dirancang | Rasio kena=false per pita rasioJangkauan, dibandingkan (10 − Handling) × 5% | Apakah rumus Peluang Tangkap terasa seperti angkanya |
Sebaran sebab pada HewanKabur | Hitung per kategori | Apakah kegagalan didominasi deteksi atau tembakan meleset — keduanya menuntut perbaikan yang berbeda |
Hanya penglihatan yang berpasangan yang masuk median. Hewan yang dilihat lalu tidak pernah ditembak tidak punya waktu pendekatan — memasukkannya sebagai nol atau sebagai durasi sesi sama-sama merusak angkanya. Ia dihitung terpisah, sebagai baris kedua di tabel ini.
Tidak ada sampling. Pada skala playtest tertutup (puluhan pemain), seluruh peristiwa dicatat. Sampling baru menjadi pertimbangan bila jumlah pemain harian menembus ribuan — dan bila hari itu tiba, yang disampel adalah HewanTerlihat, satu-satunya yang volumenya tumbuh cepat.
Peristiwa Fase Berikutnya
Sengaja belum dibuatkan skema. Bentuknya ditetapkan saat sistemnya dibangun, mengikuti RBB-002 — menulis skema untuk sistem yang belum ada berarti menebak field yang akan berubah sebelum dipakai.
| Fase | Peristiwa | Menjawab |
|---|---|---|
| 1 | LevelNaik · VarianDisewa · EkstraksiSelesai | Apakah tangga Varian terasa seperti kemajuan |
| 2 | TutorialLangkah · TawaranDilihat · TawaranDibeli · CaravanDikirim · PatroliDiklaim | Di langkah mana pemain baru berhenti, dan apakah rantai Day 1 tersambung |
| 3 | SesiHarian · FiturDibuka | Retensi hari 7 dan hari 28 |
TutorialLangkah adalah yang paling menentukan di antara semuanya. Seluruh rancangan FTUE menit 0–30 berdiri di atas asumsi bahwa pemain menyelesaikan tiap langkah. Satu peristiwa per langkah mengubah asumsi itu menjadi corong yang dapat dilihat — dan titik bocornya biasanya bukan di tempat yang diduga.
Aturan
| Kode | Aturan |
|---|---|
| TEL-001 | Seluruh telemetri dikirim dari server. Client tidak pernah mengirim peristiwa — ia dapat dipalsukan, dan angka palsu lebih buruk daripada tidak ada angka. |
| TEL-002 | Kegagalan telemetri tidak pernah boleh mengganggu permainan. Selalu di dalam pcall; bila gagal, sangga dibuang dan sesi lanjut. |
| TEL-003 | Setiap peristiwa membawa nilai S yang berlaku. Tanpa ini, data dari beberapa nilai skala tercampur dan pertanyaan yang ingin dijawab menjadi tidak terjawab. |
| TEL-004 | Tidak ada teks buatan pemain yang masuk telemetri — tidak isi chat, tidak nama clan, tidak apa pun yang diketik. UserId dikirim hanya sebagai hash ber-salt. |
| TEL-005 | Peristiwa yang harus dipasangkan wajib membawa ID instance, bukan ID spesies. Tanpa animalId, waktu pendekatan tidak dapat dihitung sama sekali. |
Dependencies
- Rencana Bangun Bertahap — Fase 0, dan aturan RBB-002.
- GDD-007 — Skala Dunia, Aturan Penumpukan Deteksi.
- MDD-002 — Peluang Tangkap, jangkauan dan Handling senjata.
- TDD-001 — penempatan modul (
ServerScriptService/Services/TelemetryService). - CDR-007 — otoritas server.