#[derive(Serialize,Debug)]
struct SessionRenderContext {
- clientid : u64,
+ clientid : ClientId,
player : PlayerId,
defs : Vec<String>,
uses : Vec<String>,
// 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,
}
SessionRenderContext {
- clientid : clientid.as_ffi(),
- player : iad.user,
+ clientid,
+ player : iad.player,
defs,
uses,
}
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);
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);
#[derive(Debug)]
pub struct GameState {
pub pieces : DenseSlotMap<PieceId,PieceRecord>,
+ pub players : DenseSlotMap<PlayerId,Player>,
+}
+
+#[derive(Debug)]
+pub struct Player {
+ pub nick : String,
}
pub fn xxx_gamestate_init() -> GameState {
};
pieces.insert(pr);
}
- GameState { pieces }
+ GameState { pieces, players : Default::default() }
}
pub struct Client {
}
-pub struct Player {
- pub nick : String,
- pub clients : DenseSlotMap<ClientId,Client>,
-}
-
pub struct Instance {
/* game state goes here */
- pub users : DenseSlotMap<PlayerId,Player>,
pub gs : GameState,
+ pub clients : SecondarySlotMap<PlayerId,DenseSlotMap<ClientId,Client>>,
}
#[derive(Clone)]
pub struct InstanceAccessDetails {
pub i : Arc<Mutex<Instance>>,
- pub user : PlayerId,
+ pub player : PlayerId,
}
#[derive(Clone)]
GLOBAL.tokens.read().unwrap().get(s).cloned()
}
-const XXX_USERS_TOKENS : &[(&str, &str)] = &[
+const XXX_PLAYERS_TOKENS : &[(&str, &str)] = &[
("kmqAKPwK4TfReFjMor8MJhdRPBcwIBpe", "alice"),
("ccg9kzoTh758QrVE1xMY7BQWB36dNJTx", "bob"),
];
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
);
pub use rocket::response::NamedFile;
pub use rocket::response;
-pub use slotmap::dense::{DenseSlotMap};
+pub use slotmap::dense::DenseSlotMap;
+pub type SecondarySlotMap<K,V> = slotmap::secondary::SecondaryMap<K,V>;
pub use index_vec::{define_index_type,index_vec,IndexVec};
pub use crate::global::*;