Pertemuan 4

Transformasi Mindmap ke Logika Pemrograman (Ren'Py Scripting)

Membawa logika branching ke level berikutnya dengan variabel, kondisional, dan manajemen state. Ini adalah inti dari "pemrograman" dalam mata kuliah ini.

150 menit
Heavy Coding Session

Target Kompetensi

CPMK-3 & Sub-CPMK P4

Mahasiswa mampu mengimplementasikan logika pemrograman Python/Ren'Py (variabel, kondisional, loop) dan mentransformasikan Logical Branching dari Mindmap ke dalam sintaksis kode Ren'Py secara akurat.

Variabel di Ren'Py: Mengingat Pilihan Pemain

Variabel adalah "kotak penyimpanan" yang membuat game kamu menjadi cerdas. Dengan variabel, game bisa mengingat apa yang telah dipilih pemain dan bereaksi sesuai dengan itu.

Tiga Cara Mendeklarasikan Variabel

Jenis Deklarasi Variabel
# 1. default: Untuk variabel yang berubah selama game (paling umum)
#    Akan direset ke nilai awal setiap kali game baru dimulai
default kepercayaan_nabilah = 0       # Angka (integer)
default sudah_ketemu_ahmad = False   # Boolean (True/False)
default nama_pemain = ""             # Teks kosong (string)

# 2. define: Untuk nilai yang TIDAK berubah selama game
#    Biasanya untuk karakter dan konstanta
define n = Character("Nabilah")
define MAX_POIN = 100                  # Konstanta

# 3. $ (dollar): Mengubah nilai variabel DI DALAM cerita
label start:
    $ kepercayaan_nabilah = 5          # Set nilai
    $ kepercayaan_nabilah += 10        # Tambah nilai
    $ sudah_ketemu_ahmad = True        # Ubah boolean

Jenis-jenis Nilai Variabel

TipeContoh NilaiKegunaan
Integer (bilangan bulat) 0, 5, -3, 100 Skor, poin kepercayaan, hitungan hari
Float (bilangan desimal) 0.5, 3.14, -1.7 Persentase, probabilitas
Boolean (benar/salah) True, False Status event (sudah terjadi atau belum)
String (teks) "Ahmad", "ending_a" Nama, status teks, pilihan yang tersimpan

If / Elif / Else: Membuat Game yang Cerdas

Kondisional memungkinkan game bereaksi berbeda berdasarkan nilai variabel. Ini yang membuat visual novel terasa "responsif" terhadap pilihan pemain.

Struktur Kondisional Dasar
label akhir_cerita:
    if kepercayaan_nabilah >= 50:
        n "Ahmad, kamu sudah kubuktikan layak jadi teman terbaikku."
    elif kepercayaan_nabilah >= 25:
        n "Kita masih perlu banyak belajar satu sama lain, tapi aku percaya kamu."
    else:
        n "Sayangnya, kamu belum berhasil mendapatkan kepercayaanku sepenuhnya."

Kondisional pada Menu Pilihan

Kamu juga bisa menampilkan atau menyembunyikan pilihan berdasarkan kondisi tertentu:

Conditional Menu
menu:
    "Ceritakan rahasia kepada Nabilah" if kepercayaan_nabilah >= 30:
        # Pilihan ini HANYA muncul jika kepercayaan >= 30
        $ kepercayaan_nabilah += 20
        n "Terima kasih sudah mempercayaiku."
        jump ending_baik
    
    "Diam saja":
        # Pilihan ini selalu muncul
        n "Aku mengerti. Tidak apa-apa."
        jump ending_biasa
Teknik Affection/Trust System

Sistem kepercayaan (trust/affection points) adalah teknik klasik visual novel RPG. Setiap pilihan dialog memengaruhi angka kepercayaan, dan di akhir cerita, angka itu menentukan ending mana yang terbuka. Ini adalah cara elegan membuat cerita bercabang tanpa membuat kode yang terlalu kompleks.

Default, Init, dan Pengaturan Awal Game

Contoh Pengaturan Awal Proyek
# ================================================
# PENGATURAN VARIABEL GLOBAL
# Letakkan sebelum label start
# ================================================

# Poin Afeksi untuk setiap karakter
default afeksi_nabilah = 0
default afeksi_ahmad = 0

# Flag event (sudah terjadi atau belum)
default event_ketemu_nabilah = False
default event_belajar_bareng = False
default event_konflik = False

# Pilihan penting yang tersimpan
default pilihan_magang = ""        # "ambil" atau "tolak"
default hari_ke = 1                 # Tracking hari dalam cerita

# Definisi Karakter
define n = Character("Nabilah", color="#c8ffc8")
define a = Character("Ahmad", color="#ffc8c8")
define narr = Character("", what_italic=True)

Persistent Data: Menyimpan Antar Sesi

Variabel biasa hilang saat game ditutup. Persistent data tetap tersimpan bahkan setelah game ditutup — berguna untuk fitur "New Game+", galeri terbuka, atau mencatat ending yang pernah dicapai.

Penggunaan Persistent Data
# Inisialisasi persistent di awal
if not hasattr(persistent, 'ending_a_terbuka'):
    persistent.ending_a_terbuka = False
    persistent.ending_b_terbuka = False

# Saat ending tercapai, tandai sebagai terbuka
label ending_a:
    $ persistent.ending_a_terbuka = True
    narr "Selamat! Kamu mendapatkan Ending A: Karier Gemilang."
    return

Studi Kasus: Social Impact VN "Pilihan Hidup"

Berikut adalah contoh implementasi lengkap dari alur cerita sederhana yang menggabungkan semua konsep yang dipelajari di P3 dan P4.

script.rpy — Contoh Lengkap P4
# ================================================
# GAME: "PILIHAN HIDUP"
# Tema: Integritas di Lingkungan Akademik
# ================================================

default integritas = 0          # Skor integritas pemain
default sudah_lapor = False

define a = Character("Ahmad", color="#ffc8c8")
define r = Character("Rizal", color="#ffdd88")
define d = Character("Dosen", color="#88ddff")
define narr = Character("")

label start:
    narr "Hari ujian tengah semester. Ahmad melewati lorong kelas."
    r "Ahmad! Sini sebentar." # Rizal, teman dekat Ahmad
    r "Gue punya bocoran soal ujian hari ini. Mau?"
    
    menu:
        "Tolak dengan tegas.":
            $ integritas += 20
            a "Tidak, Rizal. Itu curang. Aku tidak mau."
            r "Terserah kamu deh. Rugi sendiri."
            jump scene_ujian_jujur

        "Minta waktu untuk pikir-pikir.":
            $ integritas += 5
            a "Aku... perlu waktu mikir, Zal."
            r "Cepetan, ujiannya 10 menit lagi."
            jump scene_dilema

        "Terima dan gunakan bocoran.":
            $ integritas -= 10
            a "(ragu-ragu) Oke... tapi ini terakhir kalinya."
            jump scene_ujian_curang

label scene_dilema:
    narr "Ahmad duduk gelisah sebelum ujian."
    a "(Pikiran) Jika pakai bocoran, nilai aman. Tapi kalau ketahuan..."
    a "(Pikiran) Empat tahun kuliah bisa hancur dalam satu keputusan."
    
    menu:
        "Kembalikan bocoran dan ujian dengan jujur.":
            $ integritas += 15
            jump scene_ujian_jujur
        "Tetap gunakan bocoran.":
            $ integritas -= 5
            jump scene_ujian_curang

label scene_ujian_jujur:
    narr "Ujian berlangsung. Ahmad menjawab dengan kemampuannya sendiri."
    a "(Keluar ruangan) Susah memang, tapi aku lega."
    jump scene_hasil

label scene_ujian_curang:
    narr "Ujian berlangsung. Tiga hari kemudian..."
    d "Ahmad, tolong temui saya di ruangan saya."
    narr "Jantung Ahmad berdegup kencang. Dosen tahu."
    jump scene_ketahuan

label scene_ketahuan:
    d "Saya punya bukti adanya kecurangan dalam ujian kemarin."
    
    menu:
        "Jujur dan minta maaf.":
            $ integritas += 10
            $ sudah_lapor = True
            a "Maaf, Pak. Saya... menggunakan bocoran soal."
            d "Kejujuran ini saya hargai. Ada konsekuensi, tapi lebih baik dari diam."
            jump scene_hasil
        "Menyangkal.":
            $ integritas -= 20
            a "T-tidak, Pak. Saya tidak tahu apa-apa."
            d "(Menampilkan bukti) Ini rekaman CCTV dan analisis jawaban."
            jump ending_buruk

label scene_hasil:
    if integritas >= 30:
        jump ending_terbaik
    elif integritas >= 10:
        jump ending_sedang
    else:
        jump ending_buruk

label ending_terbaik:
    narr "Satu semester kemudian. Ahmad menjadi mahasiswa berprestasi."
    narr "Integritas yang dijaganya menjadi fondasi karier yang ia banggakan."
    d "Ahmad, kamu adalah contoh mahasiswa yang kami harapkan."
    return

label ending_sedang:
    narr "Ahmad melewati semester dengan baik, meski ada beberapa penyesalan."
    narr "Ia belajar bahwa pilihan kecil membentuk karakter seseorang."
    return

label ending_buruk:
    narr "Ahmad diberikan sanksi akademik. Nilai semester ini tidak diakui."
    narr "Satu kebohongan kecil membawa konsekuensi yang jauh lebih besar."
    return

Tugas Pertemuan 4: Asset Planning (Technical Bible)

Deadline: Sebelum Pertemuan 5

Output: Dokumen Google Docs yang dibagikan ke dosen. Format: Technical Bible Proyek Visual Novel.

Isi Dokumen Tugas 4 (Technical Bible)

  1. Topik & Premis: Tulis ulang premis cerita dari Tugas P2.
  2. Daftar Variabel: Tuliskan semua variabel yang akan digunakan (nama, tipe, fungsi).
  3. Daftar Tokoh (Minimal 2): Nama, peran, deskripsi visual lengkap untuk prompt AI.
  4. Daftar Lokasi/Latar (Minimal 3): Nama lokasi, deskripsi visual untuk prompt AI background.
  5. Script Awal (Minimal 20 baris dialog) menggunakan variabel dan kondisional.
  6. Flowchart yang diperbarui dengan menunjukkan perubahan variabel di setiap percabangan.
Prompt AI untuk Membantu Membuat Script Dialog
"Saya sedang membuat visual novel bertemakan [TEMA KAMU]. Karakter utamanya adalah [DESKRIPSI KARAKTER]. Tolong buatkan dialog awal (opening scene) dalam format Ren'Py antara [KARAKTER A] dan [KARAKTER B] tentang [SITUASI AWAL]. Dialog harus dalam bahasa Indonesia, natural, dan memperkenalkan konflik utama cerita. Format: nama karakter, lalu dialog dalam tanda kutip."

Kuis Pemahaman Pertemuan 4

Uji Pemahamanmu!

1. Kapan kamu menggunakan default vs define?

default untuk karakter, define untuk variabel angka
default untuk variabel yang berubah selama game, define untuk nilai konstan
Keduanya sama saja, bisa dipertukarkan
define lebih cepat dari default

2. Apa fungsi tanda $ (dollar) dalam kode Ren'Py?

Menampilkan nilai variabel dalam dialog
Mengakses file eksternal
Menjalankan kode Python (mengubah variabel) di dalam alur cerita
Menandai akhir sebuah scene

3. Bagaimana cara membuat pilihan menu yang hanya muncul jika variabel kepercayaan lebih dari 20?

"Pilihan" where kepercayaan > 20:
"Pilihan" if kepercayaan > 20:
"Pilihan" when kepercayaan > 20:
if kepercayaan > 20: "Pilihan":
Kembali ke P3 Lanjut ke P5: AI Asset Production