2023-06-15 03:49:03 +00:00
|
|
|
use crate::{
|
|
|
|
types::{AppState, Rank},
|
|
|
|
ui::{new_game, playing_field, NewGameView, PlayingFieldView},
|
|
|
|
};
|
2023-04-21 02:50:48 +00:00
|
|
|
use serde::{Deserialize, Serialize};
|
2023-03-24 13:59:04 +00:00
|
|
|
use std::sync::{Arc, RwLock};
|
2023-04-21 02:50:48 +00:00
|
|
|
use typeshare::typeshare;
|
2023-03-20 12:16:20 +00:00
|
|
|
|
2023-06-15 03:49:03 +00:00
|
|
|
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
|
2023-04-21 02:50:48 +00:00
|
|
|
#[typeshare]
|
|
|
|
#[serde(tag = "type", content = "content")]
|
2023-05-11 13:39:31 +00:00
|
|
|
pub enum CoreRequest {
|
2023-06-15 03:49:03 +00:00
|
|
|
CreateGame(CreateGameRequest),
|
2023-05-26 04:16:40 +00:00
|
|
|
LaunchScreen,
|
|
|
|
NewGame,
|
2023-03-20 12:16:20 +00:00
|
|
|
PlayingField,
|
2023-06-15 03:49:03 +00:00
|
|
|
PlayStone(PlayStoneRequest),
|
2023-05-26 04:16:40 +00:00
|
|
|
StartGame,
|
2023-03-20 12:16:20 +00:00
|
|
|
}
|
|
|
|
|
2023-04-21 02:50:48 +00:00
|
|
|
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
|
|
|
|
#[typeshare]
|
2023-04-07 01:52:39 +00:00
|
|
|
pub struct PlayStoneRequest {
|
2023-05-11 13:39:31 +00:00
|
|
|
pub column: u8,
|
|
|
|
pub row: u8,
|
2023-04-07 01:52:39 +00:00
|
|
|
}
|
|
|
|
|
2023-06-15 03:49:03 +00:00
|
|
|
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
|
|
|
|
#[typeshare]
|
|
|
|
pub struct CreateGameRequest {
|
|
|
|
black_player: PlayerInfoRequest,
|
|
|
|
white_player: PlayerInfoRequest,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
|
|
|
|
#[typeshare]
|
|
|
|
pub enum PlayerInfoRequest {
|
|
|
|
Hotseat(HotseatPlayerRequest),
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
|
|
|
|
#[typeshare]
|
|
|
|
pub struct HotseatPlayerRequest {
|
|
|
|
name: Option<String>,
|
|
|
|
rank: Option<Rank>,
|
|
|
|
}
|
|
|
|
|
2023-04-21 02:50:48 +00:00
|
|
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
|
|
|
#[typeshare]
|
|
|
|
#[serde(tag = "type", content = "content")]
|
2023-05-11 13:39:31 +00:00
|
|
|
pub enum CoreResponse {
|
2023-05-26 04:16:40 +00:00
|
|
|
NewGameView(NewGameView),
|
2023-03-20 12:16:20 +00:00
|
|
|
PlayingFieldView(PlayingFieldView),
|
|
|
|
}
|
|
|
|
|
2023-04-21 13:25:21 +00:00
|
|
|
#[derive(Clone, Debug)]
|
2023-03-20 12:16:20 +00:00
|
|
|
pub struct CoreApp {
|
|
|
|
state: Arc<RwLock<AppState>>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl CoreApp {
|
|
|
|
pub fn new() -> Self {
|
|
|
|
let state = Arc::new(RwLock::new(AppState::new()));
|
|
|
|
|
|
|
|
Self { state }
|
|
|
|
}
|
|
|
|
|
2023-05-11 13:39:31 +00:00
|
|
|
pub async fn dispatch(&self, request: CoreRequest) -> CoreResponse {
|
2023-03-20 12:16:20 +00:00
|
|
|
match request {
|
2023-05-26 04:16:40 +00:00
|
|
|
/*
|
|
|
|
CoreRequest::LaunchScreen => {
|
|
|
|
let app_state = self.state.read().unwrap();
|
|
|
|
|
|
|
|
At launch, I want to either show a list of games in progress, the current game, or the game creation screen.
|
|
|
|
- if a live game is in progress, immmediately go to that game. Such a game will be classified at game creation, so it should be persisted to the state.
|
|
|
|
- if no live games are in progress, but there are slow games in progress, show a list of the slow games and let the player choose which one to jump into.
|
|
|
|
- if no games are in progress, show only the game creation screen
|
|
|
|
- game creation menu should be present both when there are only slow games and when there are no games
|
|
|
|
- the UI returned here will always be available in other places, such as when the user is viewing a game and wants to return to this page
|
|
|
|
|
|
|
|
For the initial version, I want only to show the game creation screen. Then I will backtrack record application state so that the only decisions can be made.
|
|
|
|
}
|
|
|
|
*/
|
2023-06-15 03:49:03 +00:00
|
|
|
CoreRequest::CreateGame(_) => {
|
|
|
|
let app_state = self.state.write().unwrap();
|
|
|
|
let game = app_state.game.as_ref().unwrap();
|
|
|
|
CoreResponse::PlayingFieldView(playing_field(game))
|
|
|
|
}
|
2023-05-26 04:16:40 +00:00
|
|
|
CoreRequest::LaunchScreen => CoreResponse::NewGameView(new_game()),
|
|
|
|
CoreRequest::NewGame => CoreResponse::NewGameView(new_game()),
|
2023-05-11 13:39:31 +00:00
|
|
|
CoreRequest::PlayingField => {
|
2023-04-07 01:52:39 +00:00
|
|
|
let app_state = self.state.read().unwrap();
|
|
|
|
let game = app_state.game.as_ref().unwrap();
|
2023-05-11 13:39:31 +00:00
|
|
|
CoreResponse::PlayingFieldView(playing_field(game))
|
2023-04-07 01:52:39 +00:00
|
|
|
}
|
2023-06-15 03:49:03 +00:00
|
|
|
CoreRequest::PlayStone(request) => {
|
2023-04-07 01:52:39 +00:00
|
|
|
let mut app_state = self.state.write().unwrap();
|
|
|
|
app_state.place_stone(request);
|
|
|
|
|
|
|
|
let game = app_state.game.as_ref().unwrap();
|
2023-05-11 13:39:31 +00:00
|
|
|
CoreResponse::PlayingFieldView(playing_field(game))
|
2023-04-07 01:52:39 +00:00
|
|
|
}
|
2023-05-26 04:16:40 +00:00
|
|
|
CoreRequest::StartGame => {
|
|
|
|
unimplemented!()
|
|
|
|
}
|
2023-03-20 12:16:20 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub async fn run(&self) {}
|
|
|
|
}
|