- Ikhtisar
- Struktur Proyek
- Mekanika Game
- Sistem Dialog
- Manajemen Status
- Menambahkan Konten Baru
- Detail Teknis
- Best Practices
- Common Issues & Solutions
- Contributing
- Dependencies
- Tentang Game
"The Unwanted Person" adalah game visual novel yang dibangun dengan React menggunakan sistem narasi bercabang. Game ini melacak pilihan pemain melalui dua metrik utama: "Kesenangan" dan "Pertemanan."
Dikembangkan oleh SingaCo.
Game ini bertujuan untuk edukasi.
src/
├── components/ # Komponen yang dapat digunakan kembali
├── context/ # Manajemen status game
├── pages/ # Adegan dan dialog game
│ ├── Day 1/
│ ├── Day 2/
│ ├── Day 3/
│ └── Day 4/
└── assets/ # Gambar, audio, dll.
- Kesenangan: Rentang 0-100
- Pertemanan: Rentang 0-100
- Nilai-nilai ini menentukan percabangan cerita dan akhir game.
- Jalur Positif: Terpicu jika Kesenangan & Pertemanan ≥ 63
- Jalur Negatif: Terpicu jika salah satu nilai < 63
- Buat file baru di folder hari yang sesuai:
const DialogX = () => {
const {
updateKesenangan,
updatePertemanan,
updateFeedback,
pathCerita,
kesenangan,
pertemanan,
} = useGameContext();
// Setup status dialog
const [dialog, setDialog] = useState(initialDialog);
useEffect(() => {
pathCeritaFunc();
}, []);
};const options = [
{
text: "Teks opsi dialog",
action: handleOptionA,
type: "positive", // atau "negative" atau "neutral"
},
];const handleOptionA = () => {
updateKesenangan(value); // Tambahkan atau kurangi kesenangan
updatePertemanan(value); // Tambahkan atau kurangi pertemanan
updateFeedback("Pesan umpan balik pemain");
};const positivePath = () => {
return (
<PageDialog
NamaKarakter="Nama Karakter"
Dialog={dialog}
gambarkarakter={["/path/to/image.png"]}
opsi={dialogOptions}
hari="Hari X"
background="/path/to/background.jpg"
status={{ kesenangan, pertemanan }}
onCompleteNavigate="/next/dialog/path"
/>
);
};const GameProvider = ({ children }) => {
const [kesenangan, setKesenangan] = useState(0);
const [pertemanan, setPertemanan] = useState(0);
const [feedback, setFeedback] = useState("");
const [pathCerita, setPathCerita] = useState(0);
const updateKesenangan = (value) => {
setKesenangan((prev) => Math.max(0, Math.min(100, prev + value)));
};
};const { kesenangan, pertemanan, updateKesenangan } = useGameContext();- Buat folder baru di
src/pages/ - Tambahkan konfigurasi rute
- Buat komponen dialog
- Buat file komponen dialog
- Atur status awal dan context
- Tentukan opsi dialog dan handler
- Implementasikan jalur positif/negatif
- Tambahkan logika navigasi
- Tempatkan gambar karakter di
/public/DAY{X}/ - Tempatkan latar belakang di
/public/DAY{X}/ - Tempatkan audio di
/public/audio/
const day_routes = [
{
path: "/dayX",
element: <DayX />,
children: [
{
path: "dialog1",
element: <Dialog1 />,
},
],
},
];PageDialog.propTypes = {
NamaKarakter: String, // Nama karakter
Dialog: String, // Teks dialog
gambarkarakter: Array, // Gambar karakter
opsi: Array, // Opsi dialog
hari: String, // Hari saat ini
background: String, // Gambar latar belakang
status: Object, // Status game
onCompleteNavigate: String, // Rute berikutnya
};<StatusBar kesenangan={kesenangan} pertemanan={pertemanan} /><AudioPlayer src="/audio/bgm.mp3" />- Pesan feedback muncul setelah pilihan pemain
- Dikontrol melalui fungsi
updateFeedback - Otomatis hilang setelah durasi tertentu
- Menggunakan React Router untuk transisi adegan
- Mendukung progresi linier dan bercabang
- Mempertahankan status antar adegan
- Always initialize dialog state
- Include console logs for debugging
- Handle both positive and negative paths
- Implement proper error handling
- Test all dialog branches
- Maintain consistent naming conventions
- Document all changes
- Path Not Updating: Ensure pathCeritaFunc is called in useEffect
- Dialog Not Showing: Check dialog state initialization
- Images Not Loading: Verify asset paths
- State Not Persisting: Confirm context implementation
- Navigation Issues: Check route configuration
- Fork the repository
- Create feature branch
- Follow coding standards
- Test thoroughly
- Submit pull request
- React
- React Router DOM
- React Circular Progressbar
- TypeIt React
"The Unwanted Person" adalah sebuah game naratif yang menggambarkan perjalanan emosional seorang remaja SMA bernama Risa dan sahabatnya, Aira, yang berjuang melawan perasaan terasing dan intimidasi dari geng sekolah. Dalam dunia yang penuh tantangan ini, pemain akan diajak untuk membantu Risa menemukan tempatnya dan mengatasi berbagai rintangan sosial.
Di sepanjang cerita, pemain akan membuat keputusan penting setiap harinya yang akan membentuk jalannya alur cerita dan menentukan akhir dari kisah mereka. Dengan alur cerita bercabang selama lima hari, pilihan-pilihan pemain akan membawa Risa ke berbagai kemungkinan akhir yang bisa bersifat positif, netral, atau negatif.
- Narasi Mendalam: Setiap hari menawarkan tiga pilihan dialog yang memengaruhi hubungan dan perkembangan cerita.
- Akhir yang Beragam: Tiga kemungkinan akhir (positif, netral, atau negatif) yang mencerminkan perjalanan emosional Risa berdasarkan keputusan pemain.
- Tema Relatable: Fokus pada isu-isu remaja seperti perasaan terasing, persahabatan, dan kekuatan untuk melawan intimidasi.
- Alur Cerita Bercabang: Setiap keputusan membuka jalur cerita yang unik, menciptakan pengalaman bermain yang berbeda setiap kali.
Apakah Anda akan membantu Risa dan Aira menghadapi rasa keterasingan mereka dan menemukan harapan, atau akankah mereka terjebak dalam keputusasaan? Semua tergantung pada pilihan Anda.
Selamat datang di "The Unwanted Person" – sebuah kisah yang mendalam tentang perjuangan, harapan, dan pentingnya membuat keputusan yang tepat.
