From: Ian Jackson Date: Sat, 27 Jun 2020 22:03:20 +0000 (+0100) Subject: reorganisation X-Git-Tag: otter-0.2.0~1522 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=e347e90616693577eaaf89b0f76b5d5f77a92ff4;p=otter.git reorganisation --- diff --git a/src/bin/server.rs b/src/bin/server.rs index b8b1fcbf..4fcd6c84 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -52,7 +52,7 @@ fn loading(token : InstanceAccess) -> Result { #[derive(Serialize,Debug)] struct SessionRenderContext { - clientid : u64, + clientid : ClientId, player : PlayerId, defs : Vec, uses : Vec, @@ -67,14 +67,15 @@ fn session(form : Json) -> Result { // make session in this game, log a message to other players let iad = lookup_token(&form.token).ok_or_else(|| anyhow!("unknown token"))?; let c = { - let mut g = iad.i.lock().map_err(|e| anyhow!("lock poison {:?}",&e))?; - let user = g.users.get_mut(iad.user).ok_or_else(|| anyhow!("user deleted"))?; + let mut ig = iad.i.lock().map_err(|e| anyhow!("lock poison {:?}",&e))?; + let _player = ig.gs.players.get_mut(iad.player) + .ok_or_else(|| anyhow!("player deleted"))?; let client = Client { }; - let clientid : slotmap::KeyData = user.clients.insert(client).into(); + let clientid = ig.clients[iad.player].insert(client); let mut uses = vec![]; let mut defs = vec![]; - for (gpid, pr) in &g.gs.pieces { + for (gpid, pr) in &ig.gs.pieces { let pri = PieceRenderInstructions { id : make_pieceid_visible(gpid), face : pr.face, @@ -102,8 +103,8 @@ fn session(form : Json) -> Result { } SessionRenderContext { - clientid : clientid.as_ffi(), - player : iad.user, + clientid, + player : iad.player, defs, uses, } @@ -132,7 +133,7 @@ fn api_grab(form : Json) -> impl response::Responder<'static> { let p = decode_visible_pieceid(form.p); let p = g.gs.pieces.get_mut(p).ok_or(OpError::PieceGone)?; if p.held != None { Err(OpError::PieceHeld)? }; - p.held = Some(iad.user); + p.held = Some(iad.player); Ok(()) })(); eprintln!("API {:?} => {:?}", &form, &r); @@ -200,9 +201,12 @@ fn updates(token : &RawStr, clientid : u64) -> impl response::Responder<'static> let clientid = slotmap::KeyData::from_ffi(clientid); let clientid = clientid.into(); let _ = { - let mut g = iad.i.lock().map_err(|e| anyhow!("lock poison {:?}",&e))?; - let user = g.users.get_mut(iad.user).ok_or_else(|| anyhow!("user deleted"))?; - let _client = user.clients.get_mut(clientid).ok_or_else(|| anyhow!("client deleted"))?; + let mut ig = iad.i.lock().map_err(|e| anyhow!("lock poison {:?}",&e))?; + let g = &mut ig.gs; + let _player = g.players.get_mut(iad.player) + .ok_or_else(|| anyhow!("user deleted"))?; + let _client = ig.clients[iad.player].get_mut(clientid) + .ok_or_else(|| anyhow!("client deleted"))?; }; let tc = TestCounterInner { next : 0 }; let tc = BufReader::new(tc); diff --git a/src/gamestate.rs b/src/gamestate.rs index 02199c4d..a85cdbf2 100644 --- a/src/gamestate.rs +++ b/src/gamestate.rs @@ -51,6 +51,12 @@ pub struct PieceRecord { #[derive(Debug)] pub struct GameState { pub pieces : DenseSlotMap, + pub players : DenseSlotMap, +} + +#[derive(Debug)] +pub struct Player { + pub nick : String, } pub fn xxx_gamestate_init() -> GameState { @@ -63,5 +69,5 @@ pub fn xxx_gamestate_init() -> GameState { }; pieces.insert(pr); } - GameState { pieces } + GameState { pieces, players : Default::default() } } diff --git a/src/global.rs b/src/global.rs index 8a97b467..43689b97 100644 --- a/src/global.rs +++ b/src/global.rs @@ -19,21 +19,16 @@ impl Borrow for RawToken { pub struct Client { } -pub struct Player { - pub nick : String, - pub clients : DenseSlotMap, -} - pub struct Instance { /* game state goes here */ - pub users : DenseSlotMap, pub gs : GameState, + pub clients : SecondarySlotMap>, } #[derive(Clone)] pub struct InstanceAccessDetails { pub i : Arc>, - pub user : PlayerId, + pub player : PlayerId, } #[derive(Clone)] @@ -57,7 +52,7 @@ pub fn lookup_token(s : &str) -> Option { GLOBAL.tokens.read().unwrap().get(s).cloned() } -const XXX_USERS_TOKENS : &[(&str, &str)] = &[ +const XXX_PLAYERS_TOKENS : &[(&str, &str)] = &[ ("kmqAKPwK4TfReFjMor8MJhdRPBcwIBpe", "alice"), ("ccg9kzoTh758QrVE1xMY7BQWB36dNJTx", "bob"), ]; @@ -75,18 +70,18 @@ impl<'r> FromParam<'r> for InstanceAccess<'r> { pub fn xxx_global_setup() { let i = Instance { - users : Default::default(), gs : xxx_gamestate_init(), + clients : Default::default(), }; let i = Arc::new(Mutex::new(i)); let mut ig = i.lock().unwrap(); - for (token, nick) in XXX_USERS_TOKENS { + for (token, nick) in XXX_PLAYERS_TOKENS { let nu = Player { nick : nick.to_string(), - clients : Default::default(), }; - let user = ig.users.insert(nu); - let ia = InstanceAccessDetails { i : i.clone(), user }; + let player = ig.gs.players.insert(nu); + ig.clients.insert(player, Default::default()); + let ia = InstanceAccessDetails { i : i.clone(), player }; GLOBAL.tokens.write().unwrap().insert( RawToken(token.to_string()), ia ); diff --git a/src/imports.rs b/src/imports.rs index 61070b8c..f960998a 100644 --- a/src/imports.rs +++ b/src/imports.rs @@ -27,7 +27,8 @@ pub use rocket::request::{FromParam,FromRequest,FromFormValue,LenientForm}; pub use rocket::response::NamedFile; pub use rocket::response; -pub use slotmap::dense::{DenseSlotMap}; +pub use slotmap::dense::DenseSlotMap; +pub type SecondarySlotMap = slotmap::secondary::SecondaryMap; pub use index_vec::{define_index_type,index_vec,IndexVec}; pub use crate::global::*;