You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

72 lines
1.9 KiB

use rhai::{Dynamic, Engine, Scope, AST};
use super::engine::setup_engine;
use super::types::{CardId, Player, RhaiResult};
pub struct Functions {
// // turn_start(data, player) -> data
// pub turn_start: Option<Box<dyn Fn(Dynamic, Player) -> RhaiResult<Dynamic> + Send>>,
// // turn_end(data, current_player) -> [data, next_player]
// pub turn_end: Box<dyn Fn(Dynamic, Player) -> RhaiResult<rhai::Array> + Send>,
// // on_click(data, card, action_author, current_player) -> [data, turn_end]
// pub on_click: Box<dyn Fn(Dynamic, CardId, Player, Player) -> RhaiResult<rhai::Array> + Send>,
ast: AST,
engine: Engine,
has_turn_start: bool,
}
impl Functions {
pub fn new(fns: &[String], ast: AST, game_name: &str) -> Self {
if !fns.contains(&"turn_end".to_string()) {
panic!(
"Expected turn_end function in game code for the game \"{}\"",
game_name
)
};
if !fns.contains(&"on_click".to_string()) {
panic!(
"Expected on_click function in game code for the game \"{}\"",
game_name
)
};
let has_turn_start = fns.contains(&"turn_start".to_string());
let engine = setup_engine();
Self {
engine,
ast,
has_turn_start,
}
}
pub fn turn_start(&self, d: Dynamic, p: Player) -> Option<RhaiResult<Dynamic>> {
if self.has_turn_start {
Some(
self.engine
.call_fn(&mut Scope::new(), &self.ast, "turn_start", (d, p)),
)
} else {
None
}
}
pub fn turn_end(&self, d: Dynamic, p: Player) -> RhaiResult<rhai::Array> {
self.engine
.call_fn(&mut Scope::new(), &self.ast, "turn_end", (d, p))
// TODO Check if the game has ended (With variable in the scope)
}
pub fn on_click(
&self,
data: Dynamic,
card: CardId,
action_author: Player,
current_turn: Player,
) -> RhaiResult<rhai::Array> {
self.engine.call_fn(
&mut Scope::new(),
&self.ast,
"on_click",
(data, card, action_author, current_turn),
)
}
}