5.9 KiB
NIB — kurir atap
NIB adalah petarung Demi-Human kelima dan karakter kesebelas di roster: bocah tikus kurir dengan dua tongkat pendek dan tas surat besar, petarung terkecil dan tercepat. Ia berasal dari 8 karakter showcase dan dibuat playable setelah SOLAN. Pemain dapat memilihnya di roster VS/Training dan di Pengaturan → Karakter pemain; CPU memakai kit yang sama. Kartu identitas: assets/nib/character.md.
Dari showcase ke playable
Alurnya sama dengan SOLAN (solan-reference.md). Body showcase v1 (sudah chibi) langsung menjadi base sprite (base-selected.png, job ccd7d47b-e244-4c21-abc5-91cb2a68cddb), dan avatar showcase dipakai sebagai portrait HUD. Di roster.json NIB ditandai promoted, jadi showcase kini tinggal EDDA. Semua gambar baru dibuat dengan GPT Image 2.5 Sunburst, chroma hijau. Announcer tetap Grady. Alat pipeline: tools/nib_*.py.
Filter keamanan provider menolak idle dan run v1 sebagai false positive; usia numerik dihapus dari identitas dan v2 langsung lolos (qa-notes).
Paket siap digunakan ulang
| Paket | Isi |
|---|---|
| Sprite | 15 state / 54 frame, atlas 1792×4320, cell 448×288, anchor 224/280, idle 150 px (sepatu sampai puncak telinga), lebar 120–126 px |
| UI | portrait 384 (avatar showcase), cut-in 1600×686, 4 ikon 256, roster art dari showcase |
| VFX | 4 PNG alpha 256: letter (surat bersegel), plane (pesawat kertas), slip (kilatan selinap), stamp (cap segel saat melepas pesawat) |
| Audio | select_nib "Nib!" (0.914 s), nib_wins "Nib wins!" (1.411 s), Grady. Voice ultimate Evan "Special Delivery!" (1.254 s, sunyi di akhir dipotong) |
Ukuran 150 px dipilih dari lineup 140/150/160/170 (size-candidates.png). Pada ukuran itu wajah setara RHEA dan NIB tetap yang terkecil. Wrapper NIB_MANIFEST/METRICS ada di assets/nib/manifest.js. Sprite library memutar semua animasi.
Kemampuan dan balance
| Input | Gerakan | Damage / cooldown |
|---|---|---|
| Space×3 | BATON FLURRY: jab, ayunan naik, tongkat ganda. Rantai tercepat di roster (0.30/0.34/0.46 s); reach 95/75/95 di dalam ujung tongkat (107/80/101 px); knockback kecil 55/75/170 agar tetap dekat | 6/8/12 |
| I | EXPRESS LETTER: surat bersegel dilempar datar setinggi dada, 1100 px/s (tercepat di roster), hilang setelah 400 px | 16 / 3 s |
| O | ROOFTOP SLIP: dash rendah 650 px/s, reach 100. Bila mengenai, NIB menyelinap 70 px ke belakang lawan dan berbalik menghadapnya (dash berhenti) | 24 / 6 s |
| P | SPECIAL DELIVERY: pose cast 0.5 s, tiga pesawat kertas homing | 48 / 18 s |
Setiap basic hit yang valid mengembalikan 5% cooldown maksimum semua skill. HP tetap 200 dalam dua lapis. Semua nilai ada di nib.js.
Timeline Special Delivery
| Bagian | Waktu dari cast |
|---|---|
| Cut-in banner biru langit | 0–0.78 s |
| Pose cast pemain | 0–0.50 s, lalu bebas bergerak/menyerang |
| Pesawat 1 / 2 / 3 | 0.80 / 1.18 / 1.56 s dari tas NIB, meluncur naik lalu berbelok ke dada lawan |
| Pesawat | 620 px/s, belok maks 3.2 rad/s, hilang setelah 2.2 s; 16 damage, satu hit per pesawat |
| Selesai | setelah 2.6 s dan semua pesawat habis |
Pesawat dilepas 0.38 s berselang, lebih pendek dari stun 0.42 s, sehingga lawan yang diam terkena 48 di mana pun ia berdiri, termasuk di belakang NIB. Karena beloknya terbatas, lompatan saat pesawat tinggal ±100 px membuatnya meleset (tes: 2 dari 3 lolos); lompatan lebih awal atau berlari tetap terkejar. Tidak ada global hit-stop; knockback 40/40/180. Pause membekukan serangan ini, sedangkan reset, kembali ke menu dan akhir ronde membatalkannya. Serangan pemain (delivery) dan CPU (enemyDelivery) memiliki owner terpisah.
CPU
- NIB sebagai CPU memakai otak yang sama (cpu-ai.md) dan kit-nya lewat
KITS. Express Letter memakairange400 untuk jangkauan CPU. - Benchmark (NIB sebagai CPU): pemain diam K.O. dalam 17.9 / 17.2 / 12.1 / 12.7 s (Easy→Excellent), tercepat di roster pada Hard dan Excellent karena rantainya tercepat. Proyektil yang mengenai CPU 52 / 42 / 34 / 31%. Detail di cpu-ai.md.
Voice
"Special Delivery!" digenerate dengan empat preset pria muda: Cody (job gagal di provider), Evan, Ian dan Kevin. Evan dipilih karena pitch mediannya paling tinggi (±267 Hz; Kevin ±227, Ian ±192), paling muda untuk kurir kecil. Ucapan selesai 1.02 s, jadi sunyi di akhir dipotong (1.254 s). Angka pitch hanya panduan; timbre belum didengar pengguna. Cara mengganti: salin kandidat lain dari assets/nib/audio/ultimate-candidates/ ke nib-ultimate.mp3, lalu ganti VOICE_NAMES.nib di game.js. Record: generation.json.
Integrasi engine
KITSmemetakannibke kontrak kit yang sama. NIB memilikinibStrike(tongkat, surat, selinap) dan summonstartDelivery/updateDelivery(dipilih lewatstartSummon). Rooftop Slip memakai jalur dash yang sama dengan FENR/MIRA/HALDOR/ISOLDE/SOLAN, lalu memindahkan NIB ke belakang lawan.- Proyektil kini mendukung
homing(belok ke dada lawan dengan batasturnrad/s, kecepatanspeedH). Proyektil lama tidak berubah. - Snapshot QA berisi
delivery/enemyDelivery. Cut-in memakai kelas.nib-cutin, art ui/cutin.png, dan judul SPECIAL DELIVERY dari HTML.
Reproduksi
- Prompt/job: desain di roster.json; strip di strip-requests.json (13 × v1, 2 × v2); UI di ui-requests.json.
tools/nib_pipeline.py measure,tools/nib_measure.py, lalu tulisrel.json(alasan diqa/rel-decision.json).tools/nib_pipeline.py calibrate,sprite_gen.cli prepare --out-dir assets/nib/run --character-id nib --base-image assets/nib/base/base-selected.png --request assets/nib/request.json --chroma-key #00FF00, lalunormalizedanextract.tools/nib_align.py, lalupublish. Hitung emitter (ujung tongkat di frame 2) keemitters.json, lalu jalankanpublishsekali lagi.tools/nib_assets.pymengekspor portrait/ikon/cut-in/VFX, lalutools/web_images.pydannode tools/build_dist.mjs.
Catatan QA: assets/nib/run/qa-notes.md. Tes: node tests/nib.test.cjs (13 tes).