Commit Graph

36 Commits

Author SHA1 Message Date
rizkyaz0 fcda0e16ee Gabung wf/t6-ai: latihan lanjutan, rival adaptif, perbaikan AI jurus area 2026-10-05 14:58:40 +07:00
rizkyaz0 7f336df6e5 Latihan lanjutan, rival adaptif, dan perbaikan AI jurus area (RENCANA 6.5 dan 6.6)
Perbaikan AI: CPU hampir tidak pernah memakai skill 2 milik Ethanol Man (TAWA MELEDAK) dan Solo Man (SARUNG PUTAR). Penyebabnya, cpuPick selalu mendahulukan pukulan dasar (161 px) yang menutup lingkaran jurus area (135 dan 140 px), dan penutup kombo cpuFollowUp tidak pernah lolos cpuLands. Kini cpuAreaKit/cpuAreaFits mendahulukan jurus area pemusat-diri bila lawan di dalam lingkarannya (selisih 12 px, sejajar tinggi, tidak sedang berjalan keluar, pukulan pemain yang sedang disiapkan tidak mendarat lebih dulu), dan CPU berdiri lebih rapat saat jurus itu siap. Karakter lain dan urutan random() mesin tidak berubah.

Rival adaptif (ai.js, window.AIAdapt): CPU di versus mengingat kebiasaan pemain dalam satu pertandingan lewat jendela bergulir (melompat, memblok, memukul dekat, menembak dari jauh) dan menggeser sedikit antiAir, evade, punish, speed, aggression, dan peluang jurus didahulukan. Kekuatan mengikuti tingkat (easy hampir nol), dua arah, tanpa membaca tombol dan tanpa menyentuh damage atau HP. Layar hasil menampilkan satu kalimat "Rival belajar: kamu sering ..." bila ada kebiasaan dominan. Reset di startMatch.

Latihan lanjutan (training.js, training.css): tombol DUMMY di arena latihan membuka panel dengan perilaku dummy (Diam, Blok terus, Lompat terus, Serang acak, Ikuti pemain, CPU penuh), Reset posisi, Tampilkan hitbox, Tampilkan frame data (startup, aktif, recovery, total, jangkauan), Darah dummy tak terbatas, penghitung kombo dan damage, serta Rekam dan Putar ulang input pemain (maksimal 10 detik, dijadwalkan menurut waktu simulasi dengan benih random() yang sama, hasil dibandingkan dengan rekaman). Hanya aktif di latihan biasa, tidak di tutorial.

Kait di game.js dibuat satu baris (Training dan AIAdapt dipanggil dengan ?.). Catatan di docs/ENGINE_NOTES.md, laporan keseimbangan, dan komentar uji pasangan diperbarui. precache.js dan files.json tidak disentuh: perlu dibangun ulang oleh integrator untuk berkas baru.
2026-10-05 14:54:39 +07:00
rizkyaz0 f78a6dd622 Gabung wf/t7-daily: tantangan harian dan hadiah 2026-10-05 14:49:45 +07:00
rizkyaz0 2e211b9793 Gabung wf/t6-hazard: bahaya arena 2026-10-05 14:49:31 +07:00
rizkyaz0 1550c4fc6d Gabung wf/t7-code: kode tantangan dan kebiasaan bermain 2026-10-05 14:49:26 +07:00
rizkyaz0 33a3318e48 Tantangan harian dan hadiah hari pertama (RENCANA 7.1 dan 7.2): daily.js dan daily.css. Satu tantangan per tanggal lokal dari hash tanggal (aturan, lawan, arena, tingkat) dengan 10 aturan (Darah satu, Hanya ultimate, Tanpa blok, Lawan cepat, Lantai licin, Tanpa lompat, Kombo wajib, Satu ronde, Counter saja, Raksasa). Tombol HARIAN di menu utama membuka kartu tantangan (aturan, deskripsi, lawan, arena, tingkat, hadiah, streak, pilih petarung). Menang = 150 koin + 25 per hari beruntun, sekali per tanggal, masuk rincian koin layar hasil; MAIN LAGI mengulang tantangan yang sama. Baris aturan di layar VS dan penanda aturan di arena. Hadiah hari pertama +25 koin tiap tanggal dan kejutan tanggal (1 Jan, 14 Mar, 8 Agu, 17 Agu) sekali per tahun. Simpanan di Meta.save.daily. Kait kecil di game.js (arm, deny, hit, parry, cooldowns, slip, foeScale, heroHpShown, match.toWin di HUD) yang no-op tanpa tantangan aktif. Uji manual: ?daily=YYYY-MM-DD atau Daily.setDate(...) di konsol. 2026-10-05 14:48:24 +07:00
rizkyaz0 2dda2845ac Kode tantangan dan kebiasaan bermain lokal (RENCANA 7.5 dan 7.6): challenge.js memuat penyandi kode 8 karakter (XXXX-XXXX, 30 simbol tanpa 0 1 I L O U, pemeriksa 15 bit) untuk pemain, lawan, arena, tingkat, dan satu aturan khusus (adu cepat, satu ronde, lawan gesit, tanpa blok, pukulan berat); dialog Masukkan kode lewat tombol KODE TANTANGAN di menu utama, undangan lewat ?kode= di alamat, SALIN KODE dan TAUTAN di layar arena dan layar hasil; kait satu baris di game.js (begin, tune, roundStart, roundEnd, finish, hud, tanpa blok) dan menu.js (decorate, pending); statistik kebiasaan bermain di localStorage (karakter, mode, arena, lawan) dengan bagian Kebiasaan bermainmu di Koleksi, tombol HAPUS STATISTIK, dan catatan privasi di About; catatan mesin di ENGINE_NOTES 2026-10-05 14:47:28 +07:00
rizkyaz0 3902dfbc11 Rekam ulang K.O. dan ekspor tangkapan layar (RENCANA 7.3 dan 7.4): modul record.js + record.css. Dua perekam MediaRecorder bergantian (canvas.captureStream, webm, ~30 fps) menyimpan 6-12 dtk terakhir, berhenti saat menu/jeda/tab tersembunyi dan membuang yang lama; layar hasil mendapat SIMPAN KLIP, TONTON ULANG, FOTO dan BAGIKAN lewat kait kecil di vs.js; tombol kamera HUD dan menu jeda, F9, PNG berwatermark, Web Share dengan cadangan unduh; baris Rekam ulang K.O. dan Indikator REC di Pengaturan. game.js tidak diubah 2026-10-05 14:46:55 +07:00
rizkyaz0 50dac48995 Bahaya arena (RENCANA 6.2): satu kejutan khas per arena dengan aba-aba 1 detik
Modul baru hazard.js (+ hazard.css), tanpa gambar atau pustaka baru; semua digambar prosedural di kanvas.
- Bellora: genting jatuh dari menara (6 damage). Sunspire: silau matahari, layar memutih sebentar tanpa damage.
  Harbor: ombak dari kiri yang mendorong ke kanan sampai garis batas (3 damage). Elderwood: dua akar menyembul (5 damage).
  Moonrise: petir arkana di lingkaran rune (7 damage).
- Aba-aba tepat 1 detik (cincin atau garis di lantai, kilau di langit, suara sound(), teks "Awas: ..."); baris kecil
  "Bahaya: <nama>" di papan nama arena. Dapat dihindari dengan lompat atau geser.
- Hanya versus (Arcade, Survival, dua pemain); latihan dan tutorial tidak. Pertama 6-12 dtk, lalu tiap 9-14 dtk; tidak di
  4 dtk pertama, saat ultimate atau sinematik, saat petarung jatuh, atau di 3,5 dtk terakhir ronde.
- Deterministik (pengacak LCG sendiri berbenih mesin + ronde + arena, waktu dari dt simulasi), simetris untuk pemain, CPU, dan
  P2; damage kecil, tidak pernah mematikan (sisa 1 HP), tanpa luka atau kombo. CPU mencoba keluar zona lewat rencana sidestep.
- Pengaturan "Bahaya arena" Aktif/Mati (bawaan Aktif) dan Hazard.enabled untuk tantangan khusus; hormati Kurangi gerakan.
- Kait game.js: Hazard.step di step(), Hazard.draw (back, front) di draw(), dan __game.hazardCtx. Uji manual: ?hazard=cepat
  atau Hazard.trigger().
2026-10-05 14:44:34 +07:00
rizkyaz0 1605f0f1c4 Gabung wf/t5-balance: simulator keseimbangan, tier list, uji otomatis 2026-10-05 14:13:44 +07:00
rizkyaz0 806dec41b6 Uji otomatis satu perintah (RENCANA 5.4): node tests/all.mjs menjalankan sintaks semua JS, smoke, 49 pasangan arah singkat oleh bot (galat konsol, angka tidak wajar, jurus terpakai, data peringkat, tampilan Koleksi); perintah dicatat di ENGINE_NOTES dan README 2026-10-05 14:12:57 +07:00
rizkyaz0 a946bd3e89 Gabung wf/t4-tutorial: tutorial terpandu 2026-10-05 13:57:17 +07:00
rizkyaz0 04b9acc689 Gabung wf/t4-assist: bantuan dan aksesibilitas 2026-10-05 13:56:59 +07:00
rizkyaz0 cb7e575660 Gabung wf/t5-stats: statistik pertandingan 2026-10-05 13:56:38 +07:00
rizkyaz0 5dae5975fd Gabung wf/t4-pwa: PWA dan tata letak sentuh 2026-10-05 13:56:20 +07:00
rizkyaz0 20b11fd77b Tambah tutorial singkat terpandu (RENCANA 4.1)
Tombol TUTORIAL kecil di pojok kiri atas menu utama (di luar alur bilah, jadi tinggi menu tidak berubah) memulai latihan terpandu di arena latihan:
karakter terakhir yang dimainkan (atau Mega Chan) melawan dummy diam. Panel instruksi di bawah header HUD menampilkan delapan langkah berurutan
(gerak, lompat, kombo 3 pukulan, uppercut dan tinju maju, skill I dan O, blok lalu parry, lempar, ultimate) dengan tombol yang harus ditekan,
centang otomatis saat terdeteksi, tombol LEWATI dan KELUAR, serta penanda selesai (+50 koin satu kali, flag di Meta.save.eggs['code:tutorial']).
Di layar sentuh teks dan sasaran memakai tombol layar.

- tutorial.js, tutorial.css: modul baru (deteksi dari hero.state/jumps/action/blocking/cooldowns, pembungkus receiveHit hanya untuk mengamati hasil parry/blok).
- game.js: dua kait kecil di __game: stats() (kombo dan damage) dan dummyAttack(slow) (serangan dummy atas perintah, pembuka diperlambat untuk latihan parry).
- menu.js: satu baris memanggil Tutorial.decorate di akhir render(). index.html: tag tutorial.css dan tutorial.js (sebelum menu.js).
- docs/ENGINE_NOTES.md: catatan alur dan kait baru.
2026-10-05 13:55:19 +07:00
rizkyaz0 6244437fbb Tambah mode bantuan dan aksesibilitas (RENCANA 4.2 dan 4.3): modul access.js + access.css
Kotak lipat "Bantuan & aksesibilitas" disisipkan ke Pengaturan lewat JS (pilihan tersimpan di localStorage, tiap pilihan punya Atur ulang, plus Atur ulang semua).
Bantuan (hanya sisi pemain): Kombo otomatis (satu ketukan Spasi = rantai 3 pukulan), Blok otomatis (serangan dari depan ditahan lewat jalur blok biasa),
Tanpa cooldown (skill dan jurus toko tanpa cooldown, ultimate siap paling lama 5 dtk), Pemulihan darah pelan (+2 HP/dtk).
Aksesibilitas: ukuran teks Normal/Besar/Sangat besar (variabel CSS), mode buta warna protanopia/deuteranopia/tritanopia (filter SVG pada arena dan HUD,
bar HP lawan bergaris dan lapisan cadangan bertitik), Kurangi gerakan (otomatis mengikuti prefers-reduced-motion atau dipaksa; pengali Access.motion
untuk getaran layar, zoom K.O., kilat, dan animasi latar), Kontras tinggi untuk HUD.
Kait kecil di game.js, feel.js, dan vs.js memakai window.Access secara malas (tanpa modul semuanya no-op); catatan mesin diperbarui.
Mode ringan: diuji node --check dan smoke (tanpa galat halaman); keadaan pilihan aktif dan tampilan belum diuji, pengguna menguji manual.
2026-10-05 13:52:22 +07:00
rizkyaz0 b40925ad88 Layar statistik pertandingan (RENCANA 5.5): modul stats.js dengan kait kecil di game.js, kartu Statistik di layar hasil, ringkasan seumur hidup di Koleksi
- stats.js (window.MatchStats): statistik pemain 1 per pertandingan versus (juga 2 pemain, Arcade, Survival, Bayangan; latihan tidak): damage keluar/diterima (selisih HP per langkah), kombo terpanjang, counter hit, parry, blok, lempar, akurasi serangan dasar/skill 1/skill 2/ultimate (jurus dihitung mengenai sekali per pemakaian), ronde dan durasi (jumlah waktu fase fight, waktu simulasi tanpa Date.now)
- game.js: kait satu baris di startMatch/reset (reset), advanceMatch (tick), cast/startAttack (cast), hitDummy/dotDamage (hit lewat hitSource), heroGuard (parry/block), event 'complete' (finish -> info.stats)
- vs.js + stats.css: tombol STATISTIK di kepala layar hasil membuka kartu 4x3 di atas tombol aksi (digulir sendiri bila ruang kurang, Esc menutup), muat di 520 px dan ponsel lanskap; tanpa info.stats tidak ada tombol
- meta.js: award memanggil commit ke Meta.save.stats (kunci baru dmgDealt, dmgTaken, parries, blocks, throws, counters, rounds, playSec, statMatches; simpanan lama terbaca 0; bestCombo ikut naik ke kombo terbaik seluruh ronde); tab Koleksi menampilkan ringkasan seumur hidup
- index.html: dua tag baru di baris sendiri; catatan mesin diperbarui. Mode ringan: node --check dan smoke lulus, tampilan dan angka diuji manual oleh pemilik
2026-10-05 13:48:55 +07:00
rizkyaz0 717e45920f Tata letak tombol sentuh yang bisa diatur dan PWA (RENCANA 4.6 dan 4.7)
4.6: touchlayout.js dan touchlayout.css. Di layar sentuh, Pengaturan mendapat baris "Tata letak tombol" (ATUR) yang membuka editor layar penuh: pad arah, tombol aksi, dan panel tambahan bisa diseret dan diubah ukurannya dengan pegangan sudut (papan ketik: panah dan + -). Simpanan di localStorage (konoha.touchlayout.v1), posisi dijepit ke dalam layar, ada ATUR ULANG dan BATAL. Editor memakai salinan visual di dialog modal sehingga tombol asli tidak mengirim input; touch.js tidak diubah, kontrol asli hanya mendapat kelas dan variabel CSS.

4.7: manifest.webmanifest (fullscreen dengan cadangan standalone, landscape, ikon any dan maskable 192/512 di assets/pwa dibuat tools/make_pwa_icons.py dari potret yang sudah ada), tautan manifest, ikon, dan apple-touch-icon di index.html dan mobile.html. pwa.js menangkap beforeinstallprompt dan menampilkan "Pasang aplikasi" di Pengaturan hanya bila tersedia (di HP melalui window.parent.KonohaPWA karena event datang ke mobile.html). sw.js menambah halaman cadangan offline.html di cache kecil terpisah; perilaku cache lama tetap.

tools/build_precache.py kini memuat manifest.webmanifest dan assets/pwa. .htaccess dan DEPLOY.md: MIME manifest. Catatan di ENGINE_NOTES dan README. precache.js dan files.json belum dibangun ulang.
2026-10-05 13:47:22 +07:00
rizkyaz0 98e996a6b7 Gamepad dan ubah tombol (RENCANA 4.5): modul input.js + input.css. Gamepad: stik/D-pad dan tombol aksi memanggil __game.input (pad kedua = P2 di mode dua pemain), Start = jeda, navigasi menu depan/dialog/layar VS dengan D-pad, A, B, getaran saat kena (dapat dimatikan), toast 'Gamepad terhubung', pemetaan tampil di Pengaturan. Ubah tombol: dialog untuk 11 aksi Pemain 1 (localStorage, deteksi bentrok dengan tukar, Atur ulang, tombol P2/Esc/R dicadangkan); penerjemahan di fase capture; bantuan kontrol, label HUD, dan Daftar gerakan menu jeda mengikuti pemetaan. Catatan mesin diperbarui (mode ringan: diuji manual oleh pengguna) 2026-10-05 13:44:54 +07:00
rizkyaz0 92eccd6604 Catat urutan muat terkini dan titik temu fitur Tahap 3 di catatan mesin (startMatch, layar VS, Bayangan, urutan pengali damage, toast, penghitung slot misteri) 2026-10-04 07:42:18 +07:00
rizkyaz0 f103ae8d36 Gabung wf/t3-mystery: slot misteri yang hidup (RENCANA 3.7)
Konflik index.html dan meta.js diselesaikan dengan mempertahankan kedua sisi: mystery.css dimuat sesudah story.css, content/mystery.js dan mystery.js dimuat di antara touch.js dan menu.js seperti di cabangnya, dan daftar pencapaian tersembunyi di Koleksi memuat penasaran_berat sekaligus reuni.
2026-10-04 07:39:02 +07:00
rizkyaz0 0cec0c0ac0 Gabung wf/t3-story: mode cerita Arcade dan bos rahasia Bayangan (RENCANA 3.5 dan 3.6)
Konflik game.js di startMatch diselesaikan dengan mempertahankan kedua sisi: refreshPassives(matchStyles(...)) dari pasif dijalankan dulu, lalu setShadowFoe(...), dan info layar VS membawa styles sekaligus shadow. Urutan pengali di dotDamage dan receiveHit: pengali pasif dulu, lalu +10% Bayangan.
2026-10-04 07:38:00 +07:00
rizkyaz0 5a74cc5317 Gabung wf/t3-passive: pasif, kelemahan, dan gaya bertarung (RENCANA 3.2 dan 3.3)
Konflik index.html, meta.js, vs.js diselesaikan dengan mempertahankan kedua sisi: urutan skrip content/passives.js, passives.js, content/quotes.js, content/dialogs.js sebelum vs.js; Meta mengekspor styleOf, setStyle, dan pairEgg; VS.show memanggil Passives.decorateVS lalu memakai durasi dur milik dialog.
2026-10-04 07:36:06 +07:00
rizkyaz0 9a8de47718 Mode cerita Arcade dan bos rahasia Bayangan: kartu cerita pembuka, antar-lawan, bos, dan akhir khas tiap karakter (content/story.js, story.js, story.css); setelah semua lawan kalah muncul BAYANGAN, salinan gelap karakter pemain (HP +40%, damage +10%, CPU excellent, filter ungu tanpa gambar baru) dengan hadiah 1000 koin, pencapaian BAYANGAN, dan gelar; layar VS dan hasil menampilkan BAYANGAN <NAMA>; ?arcade=N untuk uji manual; catatan mesin diperbarui (mode ringan: diuji manual oleh pengguna) 2026-10-04 07:30:20 +07:00
rizkyaz0 eed969afe8 Slot misteri yang hidup (RENCANA 3.7): lima petak terkunci jadi sistem petunjuk bertahap tanpa gambar baru
- content/mystery.js: 5 slot dengan 3-4 petunjuk tiap slot (19 total); syarat dibaca dari Meta.save (menang, Survival, Arcade tamat, kombo, menang bersih, pencapaian, kejutan, dialog rahasia, barang toko). Teks samar dan lucu tanpa nama tokoh nyata.
- mystery.js dan mystery.css: siluet SVG sebaris dari bentuk locked.svg yang makin tajam tiap petunjuk terbuka, benda khas muncul di dua tahap terakhir, tanda tanya berubah, lencana n/total, titik BARU dan toast. Panel pratinjau memuat petunjuk terbuka, syarat petunjuk berikutnya dengan bilah progres, dan nomor slot.
- menu.js: empat pengait kecil (panel, dekorasi petak, pratinjau teks bawah roster, pesan saat ditekan). Slot tetap tidak bisa dipilih dan tetap data-fighter locked-N sehingga easter egg penasaran tetap jalan.
- meta.js: pencapaian tersembunyi PENASARAN BERAT bila semua petunjuk terbuka.
- ?mystery=N atau all di URL mempratinjau tahap tanpa menyimpan apa pun. Catatan mesin dan README diperbarui. Mode ringan: tanpa berkas uji baru, diuji manual oleh pemilik.
2026-10-04 07:25:08 +07:00
rizkyaz0 4262fb5d95 Tambah pasif dan kelemahan per karakter serta pilihan gaya bertarung (RENCANA 3.2 dan 3.3): satu titik kait passiveMod untuk pemain, CPU, dan P2; gaya Agresif/Seimbang/Bertahan di menu Karakter (Meta.save.style, simpanan lama tetap terbaca), CPU memakai gaya acak per pertandingan; tampil di menu Karakter, layar VS, dan Daftar gerakan 2026-10-04 06:59:25 +07:00
rizkyaz0 db14b18417 Dialog pasangan: balon pembalas muncul belakangan di sisi mana pun, rapikan beberapa baris dialog, dan lepas berkas uji t3-dialog (mode ringan: diuji manual); catatan mesin diperbarui 2026-10-04 06:58:03 +07:00
rizkyaz0 f24f7bccd9 Dialog pasangan di layar VS (21 pasangan, balon ucapan kiri-kanan) dan easter egg berpasangan: empat dialog rahasia berlabel DIALOG RAHASIA, +75 koin sekali per pasangan, pencapaian REUNI; layar VS ber-dialog tampil 3,3 dtk; uji tests/t3-dialog.mjs dan penyesuaian tunggu VS di t2-vsresult 2026-10-04 01:17:16 +07:00
rizkyaz0 deb7df20d0 Tambah uji regresi layar hasil dan VS: menu tidak menutupi arena setelah MAIN LAGI, Spasi/Enter tidak memulai ulang, toast tidak menutupi bilah VS, Statistik tidak meluap di layar pendek dan potret; catat di ENGINE_NOTES 2026-10-04 00:45:09 +07:00
rizkyaz0 4743c24246 Rapikan integrasi Tahap 2: catatan Yang baru memuat HUD, VS, dan layar hasil; tes arcade menunggu layar VS (bukan tidur tetap); catatan mesin 2026-10-03 08:24:58 +07:00
rizkyaz0 cc923f35ad Bersihkan sisa AETHER CLASH, kutipan layar loading, dan daftar Yang baru (RENCANA 2.5, 2.7, 2.8)
- Latar menu utama dan About: kolase tujuh potret petarung dengan CSS (lapisan miring, cahaya, gerak lambat yang menghormati prefers-reduced-motion); video dan banner game asal tidak dipakai lagi (berkas aset tetap ada)
- Teks sisa AETHER/ARCO/FENR/Mecha/Demi-Human dibersihkan dari index.html, tag arena, pengaturan, label aksesibilitas, dan dokumen; kredit Bang Tutorial tetap di About dan README
- brand.js, content/loading.js: kutipan acak berbahasa Indonesia di layar boot dan loading, berganti tiap dimuat
- brand.js, content/changelog.js: panel Yang baru di About dan toast Ada yang baru satu kali saat versi berubah
- README ditulis ulang untuk Konoha Fighting, DEPLOY.md dan catatan mesin diperbarui
- tests/t2-brand.mjs: 51 pemeriksaan
2026-10-03 07:53:09 +07:00
rizkyaz0 b9a0a1b06c Pindahkan skrip precache ke tools/, otomatis memuat semua berkas root (feel.js, meta.js) 2026-10-03 07:09:45 +07:00
rizkyaz0 120485a423 Catat feel.js dan hook uji rasa kena di ENGINE_NOTES 2026-10-02 23:19:41 +07:00
rizkyaz0 d418f56d29 Efek jurus hidup: gelombang, area, dash, jurus mode, dan semut Gufron
Mesin efek bersama (canvas 2D, tanpa gambar baru): proyektil punya umur, muncul dengan overshoot, memanjang, irisan bergoyang, ekor bayangan, percikan, dan memudar.
Gelombang suara kini berbeda per karakter (cincin berdenyut, teriakan dengan huruf, rantai cincin), ombak Ethanol Man bergulung dan mengangkat lawan.
Jurus area punya cincin aba-aba 0,25 s, gelombang kejut, retakan, dan serpihan. Dash meninggalkan bayangan sprite, debu, dan garis kecepatan.
Jurus mode mendapat mekanik berbeda lewat flag data: rebound, genangan api, split, korosi, belit, konvoi, ledakan susulan, sedotan.
Bahasa Semut: 10 semut mengitari lalu mengejar, damage naik di tengah (maks 45).
Pemain dan CPU memakai data dan efek yang sama; tests/t1-fx.mjs menguji semua jurus dari kedua sisi.
2026-10-02 23:13:55 +07:00
rizkyaz0 b1e3b75826 Tambah catatan mesin untuk pengerjaan fitur 2026-10-02 21:56:14 +07:00