Berikut ini adalah review dari game Quest of Rosetta saya yang sangaaat sederhana… Kita mulai saja deh…

Untuk menjalankan game ini, saya mendistribusikan dalam bentuk source code, jadi dibutuhkan program compiler QuickBasic versi 4.5, atau file QBasic.exe dari MSDOS. Sedangkan program Turbo Basic atau Power Basic buatan Borland, tidak compatible dengan perintah-perintah di dalam program game ini.

Cara mainnya sebenarnya gampang (baca:simpel) kok. Hanya perlu kontrol dari tombol arrow key untuk menggerakkan Rosetta, trus tombol ENTER untuk memilih pilihan. Memang banyak ngomongnya, karena itu saya bilang game ini agak monoton, dan maaf kalau anda mengharapkan pukul2an, sikut2an sampai jambak2an, anda akan kecewa karena tidak akan anda temui disini. Trus mengenai ada gambar jin kura2, ya pengen gambar aja kayak gitu, boleh kan? 🙂

Gambar spritenya memang jelek, karena buatnya gampang2an saja. Itu pun saya buat dengan program sprite editor. Sebenarnya ada rencana untuk buat yang lebih bagus pakai VB atau Flash, tapi masih belum sempat.

Mengenai Format gambar menggunakan BSAVEnya QBasic. Kalau diperhatikan, isi filenya adalah sekumpulan bilangan integer alias bilangan bulat.

Cara mendeteksi tubrukan antar sprite saya pakai cara pendeteksi yang paling gampang saja. Jadi begini, untuk tiap scene, saya beri nomor, lalu saya beri pengecekan untuk tiap langkah Rosetta, misalnya untuk langkah atas, ini adalah subrutin untuk menjalankan Rosetta apabila tombol panah atas ditekan.

SELECT CASE c
CASE 1
IF mu = 0 THEN PUT (x.old, y.old), spru1 ELSE PUT (x.old, y.old), spru2
CASE 2
IF ml = 0 THEN PUT (x.old, y.old), sprl1 ELSE PUT (x.old, y.old), sprl2
CASE 3
IF mr = 0 THEN PUT (x.old, y.old), sprr1 ELSE PUT (x.old, y.old), sprr2
CASE 4
IF md = 0 THEN PUT (x.old, y.old), sprd1 ELSE PUT (x.old, y.old), sprd2
END SELECT

Pertama2 kita cek, posisi sprite Rosetta. sprite Rosetta digambarkan dengan dua sprite yang bergantian setiap dijalankan sehingga kelihatan dinamis walaupun tetap aja kaku. Nah perintah diatas akan mengecek posisi sprite Rosetta, apakah menghadap atas, kiri, kanan atau bawah. Variabel mu, ml, mr dan md digunakan untuk mengecek jenis sprite yang mana yang aktif pada saat itu, baru kemudian dilakukan penghapusan terhadap sprite. Asal tahu saja, kalau salah menentukan sprite yang dihapus, animasinya bisa berantakan… Trus kalau dihapus, kita akan gambar lagi spritenya di lokasi yang baru, tapi sebelumnya kita perlu cek lagi posisi Rosetta ada di scene keberapa? Kita cek dengan perintah SELECT CASE

SELECT CASE cek
CASE 0
y.bawah = y.atas
CASE 1
IF x.pos <= 170 OR x.pos >= 230 THEN y.bawah = y.atas
IF (x.pos >= 160 AND y.pos >= 50) AND (x.pos <= 180 AND y.pos <= 70) THEN Camiria: GOSUB Initsprite:

GOTO main
CASE 2, 3, 4, 14
y.bawah = y.atas
CASE 5
IF x.pos <= 170 OR x.pos >= 230 THEN y.bawah = y.atas
CASE 6, 8, 15, 17, 18, 19, 22, 23, 24
y.atas = y.atas + 20
y.bawah = y.atas
CASE 7, 9, 28, 29
IF x.pos <= 170 OR x.pos >= 230 THEN y.atas = y.atas + 20: y.bawah = y.atas
CASE 10
y.bawah = y.atas
IF (x.pos >= 160 AND y.pos >= 50) AND (x.pos <= 180 AND y.pos <= 70) THEN HouseNol: GOSUB Initsprite:

GOTO main
CASE 11, 20, 25, 33, 34
IF x.pos <= 170 OR x.pos >= 230 THEN y.atas = y.atas + 20: y.bawah = y.atas
CASE 13
IF (x.pos >= 160 AND y.pos >= 50) AND (x.pos <= 180 AND y.pos <= 70) THEN Tyverra: GOSUB Initsprite:

GOTO main
y.bawah = y.atas
CASE 21
IF (x.pos >= 160 AND y.pos >= 50) AND (x.pos <= 180 AND y.pos <= 70) THEN HouseOne: GOSUB Initsprite:

GOTO main
IF x.pos <= 170 OR x.pos >= 230 THEN y.bawah = y.atas
CASE 31
y.bawah = y.atas
IF (x.pos >= 160 AND y.pos >= 50) AND (x.pos <= 180 AND y.pos <= 70) THEN Winkle: GOSUB Initsprite:

GOTO main
CASE 37
y.bawah = y.atas
IF (x.pos >= 160 AND y.pos >= 50) AND (x.pos <= 180 AND y.pos <= 70) THEN HouseTwo: GOSUB Initsprite:

GOTO main
END SELECT

Perintah diatas akan mengecek posisi batas (ingat yang kita perhatikan disini adalah penekanan tombol atas). Variabel y.atas akan berisi suatu nilai yang menunjukkan batas atas dari gerakan Rosetta. Kalau kita perhatikan, dalam beberapa scene, variabel ini ditambah 20. Artinya di dalam scene tersebut, Rosetta lebih dibatasi geraknya. Pada posisi tertentu, saya menggunakan operator AND untuk membuat kotak bayangan, dimana apabila posisi Rosetta di dalam kotak tersebut, maka program akan memanggil sub yang lain, dalam hal ini kita misalkan Rosetta masuk ke dalam kota tertentu. Gampang dan sederhana khan? Jika muncul pertanyaan… kenapa pada semua CASE, variabel y.bawah diset sama dengan y.atas??? Nah, ini salah satu trik supaya sprite Rosetta tidak hancur pada saat dia menabrak batas pohon atau karang. Pada akhir subrutin, sebelum return ke program utama, nilai variabel y.bawah akan dikembalikan ke nilai aslinya.

IF mu = 0 THEN
IF y.pos <= y.atas THEN
IF cek = 1 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 0: GOSUB sc0
IF cek = 5 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 2: GOSUB sc2
IF cek = 7 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 4: GOSUB sc4
IF cek = 9 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 10: GOSUB sc10
IF cek = 12 THEN cek = 13: GOSUB sc13
IF cek = 11 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 12: GOSUB sc12
IF cek = 16 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 6: GOSUB sc6
IF cek = 20 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 11: GOSUB sc11
IF cek = 21 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 16: GOSUB sc16
IF cek = 25 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 20: GOSUB sc11
IF cek = 26 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 15: GOSUB sc15
IF cek = 27 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 26: GOSUB sc16
IF cek = 28 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 27: GOSUB sc16
IF cek = 30 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 31: GOSUB sc31
IF cek = 29 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 30: GOSUB sc16
IF cek = 32 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 28: GOSUB sc28
IF cek = 36 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 37: GOSUB sc10
IF cek = 35 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 36: GOSUB sc35
IF cek = 34 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 35: GOSUB sc35
IF cek = 33 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 34: GOSUB sc34
y.pos = y.bawah
ELSE
y.pos = y.pos – y.ofset
END IF
PUT (x.pos, y.pos), spru2
x.old = x.pos: y.old = y.pos
mu = 1
ELSE
IF y.pos <= y.atas THEN
IF cek = 1 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 0: GOSUB sc0
IF cek = 5 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 2: GOSUB sc2
IF cek = 7 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 4: GOSUB sc4
IF cek = 9 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 10: GOSUB sc10
IF cek = 12 THEN cek = 13: GOSUB sc13
IF cek = 11 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 12: GOSUB sc12
IF cek = 16 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 6: GOSUB sc6
IF cek = 20 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 11: GOSUB sc11
IF cek = 21 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 16: GOSUB sc16
IF cek = 25 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 20: GOSUB sc11
IF cek = 26 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 15: GOSUB sc15
IF cek = 27 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 26: GOSUB sc16
IF cek = 28 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 27: GOSUB sc16
IF cek = 30 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 31: GOSUB sc31
IF cek = 29 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 30: GOSUB sc16
IF cek = 32 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 28: GOSUB sc28
IF cek = 36 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 37: GOSUB sc10
IF cek = 35 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 36: GOSUB sc35
IF cek = 34 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 35: GOSUB sc35
IF cek = 33 THEN IF x.pos > 170 AND x.pos < 230 THEN cek = 34: GOSUB sc34
y.pos = y.bawah
ELSE
y.pos = y.pos – y.ofset
END IF
PUT (x.pos, y.pos), spru1
x.old = x.pos: y.old = y.pos
mu = 0
END IF
y.atas = batas1
x.kiri = batas2
x.kanan = batas3
y.bawah = batas4
RETURN

Waw, panjaaang banget… tapi belum seberapa dibanding sisanya. Kalau sudah paham sama sub rutin tombol atas, yang lainnya pasti paham dengan sendirinya. Bagian yang ini akan mengecek posisi sprite Rosetta. Apabila sudah kurang dari y.atas, maka saatnya Rosetta pindah scene dari satu scene ke scene lainnya. Variabel cek digunakan untuk mengecek scene. Variabel y.pos diset sama dengan y.bawah, dan karena tadi variabel y.bawah = y.atas, maka sprite Rosetta akan tetap diam di tempatnya. Lalu kita sampai pada perintah ELSE, yang artinya jika y.pos>y.atas. Nah disinilah, sprite Rosetta digambar lagi. Tentunya mesti hati2, jangan sampai kita memberikan sprite yang salah, soalnya gerakan Rosetta bisa lucu. Dan sebelum kembali ke looping utama, variabel2 batas dikembalikan seperti semula.

Untuk mendapatkan uang gampang kok. Kita harus sabar mondar-mandir di dua kota untuk kerja ngantar jerami buat kuda. Terus bisa juga gambling di danau keberuntungan.

Semua barang harus didapatkan karena ada kegunaannya sendiri2.Yg jelas, cerita berakhir kalau semua barang sudah didapatkan.

Jika ada keinginan untuk memodifikasi game ini (jangan lupa untuk mengontak saya ya?), yang terpenting adalah menambahkan unsur arcade. Misalnya Rosetta akan mempunyai LifeMeter dan harus melawan musuh2nya sebelum melawan musuh terakhirnya. Kalau di dalam perjalanannya LifeMeternya habis, maka GameOver… Bisa juga barang2nya ditambah dengan Minuman Tonic untuk menambah Life, misalnya. Kalau mau, boleh dibesarkan dunianya, biar tidak monoton. Gambar spritenya dapat juga dimodifikasi agar lebih baik lagi.

Pada versi sekuelnya yang belum sempat saya selesaikan, saya berhasil membuat scene-nya full layar, melihat inventorynya dengan teknik page dan savescreen, pendeteksian tubrukannya saya bikin lebih akurat dengan metode pembandingan warna, sehingga gerakan sprite tidak terbatas dan kaku, dan juga menghemat pemakaian memori, dan juga font yang digunakan bukan berupa sprite lagi. Disamping itu, saya dapat menganimasikan sprite lainnya pada saat Rosetta berjalan, ini yang membuat game menjadi tidak kaku.
Yah… semuanya kembali lagi pada keterbatasan program QuickBasic setelah pada jaman sekarang muncul program2 lain yang lebih canggih seperti VisualBasic dan Flash. Tapi bagi saya, kita tidak boleh meremehkan program2 lama. Apa yang saya dapatkan pada saat saya mempelajari teknik2 animasi, sekalipun dari program lama, saya yakin akan dapat pula saya terapkan pada program2 sekarang. So, mari kita terus belajar dan belajarrr… Setuju???