Pertemuan 11

Mekanik RPG: Stats, Inventory & Combat Sederhana

Menambahkan lapisan gameplay RPG pada visual novel untuk menciptakan pengalaman yang lebih mendalam. Sistem statistik, inventory, dan pertarungan berbasis teks membuat cerita lebih interaktif.

150 menit
Game Mechanics Workshop

Target Kompetensi

Sub-CPMK P11

Mahasiswa mampu mengimplementasikan mekanik RPG dasar (sistem statistik, inventory sederhana, dan combat berbasis teks) ke dalam visual novel menggunakan variabel Python dan logika kondisional Ren'Py.

Catatan Penting

Mekanik RPG adalah fitur opsional untuk proyek akhir. Prioritaskan kualitas cerita dan aset visual dulu sebelum menambahkan elemen RPG. Jangan sampai mengejar fitur RPG tapi cerita utama terbengkalai.

Sistem Statistik Karakter

Sistem Stats Lengkap
# Di variables.rpy atau script.rpy

## ===== STATISTIK KARAKTER UTAMA =====
default hp = 100               # Health Points (nyawa)
default hp_max = 100
default mp = 50                # Moral Points (semangat)
default mp_max = 50

## Atribut RPG
default kecerdasan = 10        # Memengaruhi opsi dialog akademik
default karisma = 10           # Memengaruhi opsi persuasi
default keberanian = 10        # Memengaruhi pilihan berani/berisiko
default integritas = 50        # Moral score (0-100)

## XP dan Level
default xp = 0
default level = 1

init python:
    def level_up():
        global level, xp, kecerdasan, karisma, keberanian
        xp_needed = level * 100
        if xp >= xp_needed:
            level += 1
            xp -= xp_needed
            kecerdasan += 2
            karisma += 1
            keberanian += 1
            return True    # Level up!
        return False       # Belum level up

label dapat_xp:
    $ xp += 50
    if level_up():
        narr "Level naik! Sekarang Level [level]."
        narr "Kecerdasan dan keberanianmu meningkat."

Inventory Sederhana Menggunakan List Python

Sistem Inventory dengan Python List
# Inventory sebagai Python list
default inventory = []          # Mulai kosong
default uang = 0                # Mata uang dalam game

# Definisi item sebagai dictionary
init python:
    ITEMS = {
        "buku_teori": {"nama": "Buku Teori Manajemen", "efek": "+15 Kecerdasan"},
        "kopi": {"nama": "Kopi Kampus", "efek": "+10 HP"},
        "surat_rekomendasi": {"nama": "Surat Rekomendasi Dosen", "efek": "Buka dialog khusus"},
    }

# Menambah item ke inventory
label dapat_buku:
    $ inventory.append("buku_teori")
    $ kecerdasan += 15
    narr "Kamu mendapatkan Buku Teori Manajemen!"
    narr "Kecerdasan bertambah +15."

# Menggunakan item (cek dulu apakah ada)
label minum_kopi:
    if "kopi" in inventory:
        $ inventory.remove("kopi")
        $ hp = min(hp + 10, hp_max)
        narr "Kamu meminum kopi. HP pulih +10."
    else:
        narr "Kamu tidak punya kopi."

# Dialog yang terkunci oleh item
menu:
    "Tunjukkan surat rekomendasi" if "surat_rekomendasi" in inventory:
        d "Luar biasa! Dengan rekomendasi Prof. Indra, saya langsung terima kamu."
    "Lamar tanpa surat":
        d "Kamu perlu pengalaman lebih. Coba lagi tahun depan."

Sistem Skill: Dialog Terkunci oleh Statistik

Sistem skill memungkinkan pilihan dialog yang hanya tersedia jika statistik karakter memenuhi syarat. Ini membuat statistik terasa bermakna.

Skill Check dalam Dialog
label negosiasi_dosen:
    d "Kamu terlambat mengumpulkan tugas, Ahmad."
    
    menu:
        "[Kecerdasan 20+] Jelaskan dengan data dan argumen logis." if kecerdasan >= 20:
            $ xp += 30
            a "Pak, berdasarkan penelitian terbaru tentang beban kognitif mahasiswa..."
            d "Argumen yang menarik. Baiklah, kamu dapat perpanjangan waktu."
        
        "[Karisma 15+] Minta dengan sopan dan personal." if karisma >= 15:
            $ xp += 20
            a "Pak, saya sangat menghargai mata kuliah Bapak. Boleh saya minta..."
            d "Kamu mahasiswa yang sopan. Oke, besok pagi paling lambat."
        
        "Minta maaf dengan jujur.":
            a "Maaf Pak, saya memang salah manajemen waktu."
            d "Jujur dihargai. Kasih besok tapi nilai ada pengurangan."

Sistem Pertarungan Berbasis Teks (Debat/Argumen)

Dalam konteks Social Impact VN, "combat" bisa diinterpretasikan sebagai debat argumen, presentasi, atau konfrontasi verbal.

Sistem Debat Sederhana
# Sistem debat: Ahmad vs Antagonis
default hp_debat_ahmad = 100      # Kepercayaan diri Ahmad
default hp_debat_lawan = 80       # Keyakinan lawan

label mulai_debat:
    narr "Rapat mahasiswa. Ahmad harus mempertahankan proposalnya."
    
    while hp_debat_lawan > 0 and hp_debat_ahmad > 0:
        narr "Kepercayaan Dirimu: [hp_debat_ahmad] | Keyakinan Lawan: [hp_debat_lawan]"
        
        menu:
            "Serang dengan data statistik":
                $ hp_debat_lawan -= 25
                narr "Argumenmu didukung data yang kuat! (-25 untuk lawan)"
            
            "Gunakan analogi yang mudah dipahami":
                $ hp_debat_lawan -= 15
                narr "Penonton mengangguk setuju."
            
            "Tahan serangan — dengarkan argumen lawan":
                $ hp_debat_ahmad -= 5    # Sedikit berkurang tapi dapat wawasan
                $ kecerdasan += 5
                narr "Mendengarkan membuka kelemahannya."
    
    if hp_debat_ahmad > 0:
        jump menang_debat
    else:
        jump kalah_debat

label menang_debat:
    narr "Tepuk tangan memenuhi ruangan! Proposalmu diterima."
    $ xp += 50
    $ integritas += 10
    return

label kalah_debat:
    narr "Proposal ditolak. Tapi kamu mendapat pelajaran berharga."
    $ kecerdasan += 10    # Kalah tapi belajar
    return

Menampilkan Statistik di Layar

Screen Statistik yang Rapi
screen stats_overlay():
    ## Panel statistik di sudut kanan atas
    frame:
        xalign 0.98
        yalign 0.02
        padding (16, 16)
        background "#00000099"
        
        vbox:
            spacing 6
            
            text "STATISTIK":
                size 14
                bold True
                color "#ffdd00"
            
            null height 8
            
            hbox:
                spacing 8
                text "HP": size 13; color "#ff6666"
                text "[hp]/[hp_max]": size 13
            
            hbox:
                spacing 8
                text "INT": size 13; color "#66ddff"
                text "[kecerdasan]": size 13
            
            hbox:
                spacing 8
                text "KAR": size 13; color "#ffaa44"
                text "[karisma]": size 13
            
            hbox:
                spacing 8
                text "Integritas": size 13; color "#44ff88"
                text "[integritas]/100": size 13

Mengintegrasikan RPG dengan Cerita Social Impact

Sistem RPG harus melayani cerita, bukan sebaliknya. Berikut cara menghubungkan mekanik RPG dengan tema social impact.

Statistik RPGRepresentasi NaratifCara Naik
KecerdasanKemampuan analisis dan akademikBelajar, membaca, mengerjakan tugas
KarismaKemampuan persuasi dan leadershipBerinteraksi positif dengan sesama
KeberanianBerani mengambil risiko demi kebenaranMemilih opsi yang berani tapi benar
IntegritasKejujuran dan moral characterMemilih jalan yang benar walau sulit

Tugas Pertemuan 11 (Opsional/Bonus)

Tugas Opsional — Untuk Nilai Bonus

Tugas ini bersifat opsional. Prioritaskan menyelesaikan inti proyek visual novel kamu terlebih dahulu.

Tambahkan Elemen RPG ke Proyekmu

  1. Implementasikan minimal 2 statistik karakter (pilih yang relevan dengan temamu).
  2. Buat minimal 1 skill check dalam menu pilihan.
  3. Buat screen untuk menampilkan statistik.
  4. Demonstrasikan bahwa statistik memengaruhi ending.

Kuis Pemahaman Pertemuan 11

Uji Pemahamanmu!

1. Tipe data Python apa yang paling tepat untuk membuat sistem inventory di Ren'Py?

Integer (angka bulat)
String (teks)
List (daftar)
Boolean (True/False)

2. Bagaimana cara memeriksa apakah item "buku_teori" ada di inventory?

inventory.find("buku_teori")
"buku_teori" in inventory
inventory.has("buku_teori")
inventory == "buku_teori"
Kembali ke P10 Lanjut ke P12: Polishing & Debug