mirror of
https://github.com/ALEZ-DEV/Babylonia-terminal.git
synced 2025-12-15 17:08:51 +00:00
can now run the game
This commit is contained in:
parent
f6247cee5a
commit
85bb1e2c59
9
babylonia-terminal-gui/Cargo.lock
generated
9
babylonia-terminal-gui/Cargo.lock
generated
@ -72,6 +72,7 @@ dependencies = [
|
|||||||
"log",
|
"log",
|
||||||
"relm4",
|
"relm4",
|
||||||
"relm4-components",
|
"relm4-components",
|
||||||
|
"wincompatlib",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -402,7 +403,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d"
|
checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"windows-sys 0.52.0",
|
"windows-sys 0.59.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -1806,7 +1807,7 @@ dependencies = [
|
|||||||
"errno",
|
"errno",
|
||||||
"libc",
|
"libc",
|
||||||
"linux-raw-sys",
|
"linux-raw-sys",
|
||||||
"windows-sys 0.52.0",
|
"windows-sys 0.59.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -2195,7 +2196,7 @@ dependencies = [
|
|||||||
"fastrand",
|
"fastrand",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"rustix",
|
"rustix",
|
||||||
"windows-sys 0.52.0",
|
"windows-sys 0.59.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -2546,7 +2547,7 @@ version = "0.1.9"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
|
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"windows-sys 0.52.0",
|
"windows-sys 0.59.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|||||||
@ -9,3 +9,4 @@ anyhow = "1.0.94"
|
|||||||
log = "0.4.22"
|
log = "0.4.22"
|
||||||
relm4 = "0.9.1"
|
relm4 = "0.9.1"
|
||||||
relm4-components = "0.9.1"
|
relm4-components = "0.9.1"
|
||||||
|
wincompatlib = "0.7.5"
|
||||||
|
|||||||
@ -1,87 +1,112 @@
|
|||||||
|
use babylonia_terminal_sdk::game_state::GameState;
|
||||||
use log::debug;
|
use log::debug;
|
||||||
use relm4::RelmApp;
|
use manager::run_game;
|
||||||
use relm4::{
|
use relm4::{
|
||||||
gtk::{
|
gtk::{
|
||||||
self,
|
self,
|
||||||
prelude::{BoxExt, ButtonExt, GtkWindowExt, OrientableExt},
|
prelude::{BoxExt, ButtonExt, GtkWindowExt, OrientableExt, WidgetExt},
|
||||||
},
|
},
|
||||||
ComponentParts, RelmWidgetExt, SimpleComponent,
|
loading_widgets::LoadingWidgets,
|
||||||
|
prelude::{AsyncComponent, AsyncComponentParts, SimpleAsyncComponent},
|
||||||
|
view, ComponentParts, RelmWidgetExt, SimpleComponent,
|
||||||
};
|
};
|
||||||
|
use relm4::{Component, RelmApp};
|
||||||
|
|
||||||
|
mod manager;
|
||||||
|
|
||||||
pub fn run() {
|
pub fn run() {
|
||||||
debug!("Start GUI!");
|
debug!("Start GUI!");
|
||||||
let app = RelmApp::new("moe.celica.BabyloniaTerminal").with_args(vec![]);
|
let app = RelmApp::new("moe.celica.BabyloniaTerminal").with_args(vec![]);
|
||||||
app.run::<AppModel>(0);
|
app.run_async::<MainWindow>(None);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum AppMsg {
|
pub enum MainWindowMsg {
|
||||||
Increment,
|
RunGame,
|
||||||
Decrement,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct AppModel {
|
struct MainWindow {
|
||||||
counter: u8,
|
game_state: GameState,
|
||||||
|
is_game_running: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[relm4::component]
|
impl MainWindow {
|
||||||
impl SimpleComponent for AppModel {
|
fn new(game_state: GameState) -> Self {
|
||||||
type Input = AppMsg;
|
MainWindow {
|
||||||
|
game_state,
|
||||||
|
is_game_running: false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[relm4::component(async)]
|
||||||
|
impl SimpleAsyncComponent for MainWindow {
|
||||||
|
type Input = MainWindowMsg;
|
||||||
|
|
||||||
type Output = ();
|
type Output = ();
|
||||||
|
|
||||||
type Init = u8;
|
type Init = Option<GameState>;
|
||||||
|
|
||||||
view! {
|
view! {
|
||||||
|
#[root]
|
||||||
gtk::Window {
|
gtk::Window {
|
||||||
set_title: Some("Babylonia Terminal"),
|
|
||||||
set_default_width: 700,
|
|
||||||
set_default_height: 300,
|
|
||||||
|
|
||||||
gtk::Box {
|
gtk::Box {
|
||||||
set_orientation: gtk::Orientation::Vertical,
|
set_orientation: gtk::Orientation::Vertical,
|
||||||
set_spacing: 5,
|
set_spacing: 5,
|
||||||
set_margin_all: 5,
|
set_margin_all: 5,
|
||||||
|
|
||||||
|
#[name(start_button)]
|
||||||
gtk::Button {
|
gtk::Button {
|
||||||
set_label: "Increment",
|
set_label: "Start game",
|
||||||
connect_clicked => AppMsg::Increment,
|
connect_clicked => MainWindowMsg::RunGame,
|
||||||
},
|
},
|
||||||
|
|
||||||
gtk::Button {
|
|
||||||
set_label: "Decrement",
|
|
||||||
connect_clicked => AppMsg::Decrement,
|
|
||||||
},
|
|
||||||
|
|
||||||
gtk::Label {
|
|
||||||
#[watch]
|
|
||||||
set_label: &format!("Counter : {}", model.counter),
|
|
||||||
set_margin_all: 5,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn init(
|
async fn init(
|
||||||
counter: Self::Init,
|
game_state: Self::Init,
|
||||||
window: Self::Root,
|
root: Self::Root,
|
||||||
sender: relm4::ComponentSender<Self>,
|
sender: relm4::AsyncComponentSender<Self>,
|
||||||
) -> relm4::ComponentParts<Self> {
|
) -> AsyncComponentParts<Self> {
|
||||||
let model = AppModel { counter };
|
let model;
|
||||||
|
if game_state.is_none() {
|
||||||
|
model = MainWindow::new(
|
||||||
|
babylonia_terminal_sdk::game_state::GameState::get_current_state()
|
||||||
|
.await
|
||||||
|
.unwrap(),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
model = MainWindow::new(game_state.unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
let widgets = view_output!();
|
let widgets = view_output!();
|
||||||
|
|
||||||
ComponentParts { model, widgets }
|
AsyncComponentParts { model, widgets }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update(&mut self, message: Self::Input, _sender: relm4::ComponentSender<Self>) {
|
fn init_loading_widgets(root: Self::Root) -> Option<LoadingWidgets> {
|
||||||
|
view! {
|
||||||
|
#[local]
|
||||||
|
root {
|
||||||
|
set_title: Some("Babylonia Terminal"),
|
||||||
|
set_default_width: 700,
|
||||||
|
set_default_height: 300,
|
||||||
|
|
||||||
|
#[name(spinner)]
|
||||||
|
gtk::Spinner {
|
||||||
|
start: (),
|
||||||
|
set_halign: gtk::Align::Center,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Some(LoadingWidgets::new(root, spinner))
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn update(&mut self, message: Self::Input, _sender: relm4::AsyncComponentSender<Self>) {
|
||||||
match message {
|
match message {
|
||||||
AppMsg::Increment => {
|
MainWindowMsg::RunGame => run_game().await,
|
||||||
self.counter = self.counter.wrapping_add(1);
|
|
||||||
}
|
|
||||||
AppMsg::Decrement => {
|
|
||||||
self.counter = self.counter.wrapping_sub(1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
33
babylonia-terminal-gui/src/manager.rs
Normal file
33
babylonia-terminal-gui/src/manager.rs
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
use babylonia_terminal_sdk::{
|
||||||
|
components::proton_component::ProtonComponent, game_config::GameConfig,
|
||||||
|
game_manager::GameManager,
|
||||||
|
};
|
||||||
|
use log::error;
|
||||||
|
use relm4::tokio::sync::OnceCell;
|
||||||
|
use wincompatlib::prelude::Proton;
|
||||||
|
|
||||||
|
static PROTON: OnceCell<Proton> = OnceCell::const_new();
|
||||||
|
|
||||||
|
pub async fn get_proton() -> Proton {
|
||||||
|
PROTON
|
||||||
|
.get_or_init(|| async {
|
||||||
|
let proton_component = ProtonComponent::new(GameConfig::get_config().await.config_dir);
|
||||||
|
let proton = proton_component.init_proton();
|
||||||
|
if let Err(ref e) = proton {
|
||||||
|
error!("Failed to initialize proton : {}", e);
|
||||||
|
}
|
||||||
|
proton.unwrap()
|
||||||
|
})
|
||||||
|
.await
|
||||||
|
.clone()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn run_game() {
|
||||||
|
let proton = get_proton().await;
|
||||||
|
let game_dir = GameConfig::get_game_dir().await;
|
||||||
|
if game_dir.is_none() {
|
||||||
|
error!("Failed to start game, the game directory was not found")
|
||||||
|
}
|
||||||
|
|
||||||
|
GameManager::start_game(&proton, game_dir.unwrap(), None, false).await;
|
||||||
|
}
|
||||||
23
babylonia-terminal/Cargo.lock
generated
23
babylonia-terminal/Cargo.lock
generated
@ -150,6 +150,7 @@ dependencies = [
|
|||||||
"log",
|
"log",
|
||||||
"relm4",
|
"relm4",
|
||||||
"relm4-components",
|
"relm4-components",
|
||||||
|
"wincompatlib",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -406,15 +407,15 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "console"
|
name = "console"
|
||||||
version = "0.15.8"
|
version = "0.15.10"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb"
|
checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"encode_unicode",
|
"encode_unicode",
|
||||||
"lazy_static",
|
|
||||||
"libc",
|
"libc",
|
||||||
"unicode-width 0.1.14",
|
"once_cell",
|
||||||
"windows-sys 0.52.0",
|
"unicode-width",
|
||||||
|
"windows-sys 0.59.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -557,9 +558,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "encode_unicode"
|
name = "encode_unicode"
|
||||||
version = "0.3.6"
|
version = "1.0.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
|
checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "encoding_rs"
|
name = "encoding_rs"
|
||||||
@ -1435,7 +1436,7 @@ dependencies = [
|
|||||||
"console",
|
"console",
|
||||||
"number_prefix",
|
"number_prefix",
|
||||||
"portable-atomic",
|
"portable-atomic",
|
||||||
"unicode-width 0.2.0",
|
"unicode-width",
|
||||||
"web-time",
|
"web-time",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -2739,12 +2740,6 @@ version = "1.0.14"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
|
checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "unicode-width"
|
|
||||||
version = "0.1.14"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-width"
|
name = "unicode-width"
|
||||||
version = "0.2.0"
|
version = "0.2.0"
|
||||||
|
|||||||
@ -4,8 +4,8 @@ version = "0.1.0"
|
|||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
babylonia-terminal-cli = { path = "./../babylonia-terminal-cli" }
|
|
||||||
babylonia-terminal-gui = { path = "./../babylonia-terminal-gui" }
|
babylonia-terminal-gui = { path = "./../babylonia-terminal-gui" }
|
||||||
|
babylonia-terminal-cli = { path = "./../babylonia-terminal-cli" }
|
||||||
log = "0.4.22"
|
log = "0.4.22"
|
||||||
simple_logger = "5.0.0"
|
simple_logger = "5.0.0"
|
||||||
tokio = { version = "1.37.0", features = ["full"] }
|
tokio = { version = "1.37.0", features = ["full"] }
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user