@ -2,6 +2,7 @@ use rhai::{
serde ::{ from_dynamic , to_dynamic } ,
Dynamic , Func , AST ,
} ;
use uuid ::Uuid ;
use std ::collections ::HashMap ;
@ -22,6 +23,7 @@ pub struct RunningGame {
functions : Functions ,
current_player : Player ,
data : HashMap < String , serde_json ::Value > ,
players : HashMap < Uuid , u32 > ,
}
// TODO add errors
@ -40,30 +42,45 @@ impl RunningGame {
Ok ( ( ast , fns ) )
}
pub fn new ( name : String , ast : AST , fns : & [ String ] , conf : & Config , players : u32 ) -> Self {
pub fn new (
name : String ,
ast : AST ,
fns : & [ String ] ,
conf : & Config ,
current_players : & [ Uuid ] ,
) -> Self {
// log::info!("Fns: {:?}", fns);
let functions = Functions ::new ( fns , ast . clone ( ) , & name ) ;
let engine = setup_engine ( ) ;
let setup = Func ::< ( Dynamic , ) , Dynamic > ::create_from_ast ( engine , ast , "setup" ) ;
let piles = conf . piles . clone ( ) ;
let player_piles = vec ! [ conf . player_piles . clone ( ) ; players as usize ] ;
let player_piles = vec ! [ conf . player_piles . clone ( ) ; current_players . len ( ) ] ;
let Data {
piles ,
player_piles ,
players : _ ,
other ,
} = from_dynamic (
& setup ( to_dynamic ( Data ::new ( piles , player_piles , players ) ) . unwrap ( ) ) . unwrap ( ) ,
& setup (
to_dynamic ( Data ::new ( piles , player_piles , current_players . len ( ) as u32 ) ) . unwrap ( ) ,
)
. unwrap ( ) ,
)
. unwrap ( ) ;
let mut players = HashMap ::new ( ) ;
for ( i , player ) in current_players . iter ( ) . enumerate ( ) {
players . insert ( player . clone ( ) , i as u32 ) ;
}
log ::info ! ( "PLayers in game {}: {:?}" , name , players ) ;
Self {
name ,
piles ,
player_piles ,
functions ,
current_player : Player ::new ( 0 , players ) ,
current_player : Player ::new ( 0 , current_ players. len ( ) as u32 ) ,
data : other ,
players ,
}
// Self {setup: Box::new(Func::<(Vec<Pile>, Vec<Vec<Pile>>), ()>::create_from_ast(engine, ast, "setup"))}
}