Banana Republic adalah game strategi berbasis JavaFX untuk Tugas Besar 2 IF2010 Pemrograman Berorientasi Objek. Game ini mengadaptasi mekanik board game resource management: pemain mengumpulkan resource, melakukan trade, membangun pipe/settlement/laboratory, memainkan kartu eksperimen, menghindari efek robber, dan mengejar victory point.
- GUI JavaFX dengan main menu, lobby, game board, dialog trade, dialog card, robber, save/load, settings, dan result screen.
- Mode 3-4 pemain dengan kombinasi human player dan bot.
- Setup round, resource gathering, trade/build phase, robber discard/move/steal, dan game over phase.
- Dice roll dan produksi resource berdasarkan tile board.
- Domestic trade antar pemain, domestic trade langsung dengan bot jika bot memiliki resource yang diminta, dan maritime/bank trade.
- Build pipe, settlement, upgrade laboratory, longest road, largest army, dan victory point.
- Experiment card bawaan dan plugin card.
- Plugin runtime untuk map generator, bot strategy, dan experiment card.
- Save/load game ke file JSON, termasuk data plugin yang sedang digunakan.
- Audio BGM dan SFX melalui JavaFX Media.
- Unit, integration, UI smoke, architecture, dan resource test.
- JDK 21.0.11, sesuai
java-version.txt. - Apache Maven.
- Environment yang dapat menjalankan JavaFX GUI.
Catatan:
- Untuk development normal, tidak perlu mengunduh JavaFX SDK manual. JavaFX sudah dideklarasikan sebagai dependency Maven.
- Untuk menjalankan GUI di WSL, pastikan WSLg/display server aktif. Untuk audio di WSL, pastikan audio host sudah tersedia; jika
paplaybisa memutar suara tetapi aplikasi tidak, cek konfigurasi JavaFX Media/PulseAudio/PipeWire.
.
|-- pom.xml
|-- java-version.txt
|-- src/main/java/org/bananarepublic
| |-- core/ # Game engine, phase, state, turn, victory, player factory
| |-- service/ # Build, trade, resource production, robber, card, bot turn
| |-- model/ # Board, player, resource, building, card
| |-- persistence/ # Save/load JSON mapper dan service
| |-- plugin/ # Plugin API, loader, bot strategy bawaan
| |-- audio/ # Audio engine/service/effect
| `-- ui/ # JavaFX scene manager, controller, component
|-- src/main/resources
| |-- fxml/
| |-- images/
| |-- styles/
| `-- audio/
|-- src/test/java/org/bananarepublic
`-- plugins/ # Sample plugin projects
Jalankan dari root repository:
mvn javafx:runCommand tersebut menggunakan javafx-maven-plugin dengan main class:
org.bananarepublic.ui.App
Buat JAR aplikasi:
mvn packageOutput utama:
target/banana-republic.jar
Jalankan JAR:
java -jar target/banana-republic.jarJAR ini dibuat menggunakan maven-shade-plugin dan memasukkan dependency JavaFX Linux untuk distribusi Linux/WSL. Untuk development lintas OS, mvn javafx:run tetap menjadi cara paling aman.
Jalankan seluruh test:
mvn testTest JavaFX sudah dikonfigurasi headless melalui maven-surefire-plugin, sehingga tidak perlu menambahkan flag TestFX secara manual untuk workflow normal.
Untuk menjalankan subset test:
mvn -Dtest=TradeFlowTest,TradeServiceTest testFormat kode otomatis:
mvn spotless:applyCek format:
mvn spotless:checkJalankan Checkstyle:
mvn checkstyle:checkCek lengkap sebelum push:
mvn spotless:check checkstyle:check testBuild sampai packaging:
mvn verifyRepository menyediakan pre-commit hook di .githooks/pre-commit.
Aktifkan dengan:
git config core.hooksPath .githooks
chmod +x .githooks/pre-commitSetelah aktif, setiap commit akan menjalankan:
mvn -B spotless:check checkstyle:check testJika hook gagal hanya karena format, jalankan:
mvn spotless:applyWorkflow GitHub Actions berada di:
.github/workflows/ci.yml
CI berjalan pada setiap push dan pada pull_request ke main. Tahap yang dijalankan:
- Checkout repository.
- Setup Java Temurin 21.0.11.
mvn -B spotless:check.mvn -B checkstyle:check.mvn -B install -DskipTests.mvn -B -f plugins/pom.xml package.mvn -B test.
Project mendukung tiga jenis plugin:
MapGeneratorPluginuntuk map custom.PlayerStrategyuntuk bot custom.ExperimentCarduntuk kartu eksperimen custom.
Build sample plugin:
mvn install -DskipTests
mvn -f plugins/pom.xml packageOutput sample plugin:
plugins/banana-grant-card/target/banana-grant-card-1.0-SNAPSHOT.jar
plugins/volcano-island-map/target/volcano-island-map-1.0-SNAPSHOT.jar
plugins/aggressive-bot/target/aggressive-bot-1.0-SNAPSHOT.jar
Class name sample plugin:
| Plugin | Class Name | Tipe |
|---|---|---|
| Banana Grant Card | org.bananarepublic.plugins.BananaGrantCard |
ExperimentCard |
| Volcano Island Map | org.bananarepublic.plugins.VolcanoIslandMapGenerator |
MapGeneratorPlugin |
| Aggressive Bot | org.bananarepublic.plugins.AggressiveBotStrategy |
PlayerStrategy |
Map plugin dan bot plugin dapat dimuat dari lobby sebelum game dimulai. Card plugin dapat dimuat dari Settings & Plugins saat game berjalan.
Game dapat disimpan ke file JSON melalui tombol Save atau dialog Settings & Plugins. Load dilakukan dari menu/setting dengan memilih file save JSON.
Save data menyimpan:
- fase game dan pemain aktif,
- board, bangunan, robber, dan timer,
- inventory pemain,
- bank dan deck,
- plugin yang diperlukan untuk me-restore game.
Jika save menggunakan plugin, JAR plugin tersebut harus tetap tersedia di path yang tersimpan agar load dapat berhasil.
Kode produksi menggunakan Java assert sebagai pengecekan invariant internal, terutama pada build, trade, resource production, robber, longest road, bank, game engine, dan save/load mapper. Assertion bukan pengganti validasi input; validasi utama tetap menggunakan exception.
Jika ingin menjalankan aplikasi dengan assertion aktif:
java -ea -jar target/banana-republic.jarJika program gagal saat -ea aktif, itu biasanya menandakan invariant internal dilanggar dan perlu diperiksa sebagai bug logika.
Pastikan java -version menggunakan JDK 21.0.11 atau Java 21 yang kompatibel.
Pastikan WSLg atau display server sudah aktif. Jalankan dari terminal yang memiliki akses display GUI.
Pastikan audio host WSL berjalan. Jika paplay dapat memutar audio tetapi aplikasi tidak, cek dependency JavaFX Media dan konfigurasi PulseAudio/PipeWire.
Pastikan:
- file JAR plugin ada,
- class name lengkap benar,
- plugin mengimplementasikan tipe yang diminta,
- main project sudah di-install ke local Maven repository sebelum build sample plugin.
Pastikan file save masih valid dan plugin yang direferensikan save file masih tersedia di path yang sama.