firecore_battle/default_engine/
scripting.rs1use alloc::vec::Vec;
2use core::{fmt::Debug, hash::Hash};
3use std::error::Error;
4
5use pokedex::{item::Item, moves::Move};
8
9use rand::Rng;
10
11use crate::{
12 engine::{BattlePokemon, Players},
13 engine::{ItemResult, MoveResult},
14 pokemon::{Indexed, PokemonIdentifier},
15 prelude::BattleData,
16};
17
18pub trait ScriptingEngine {
19 type Error: Error;
20
21 fn execute_move<
22 ID: Eq + Hash + Clone + 'static + Debug,
23 R: Rng + Clone + 'static,
24 PLR: Players<ID>,
25 >(
26 &self,
27 random: &mut R,
28 m: &Move,
29 user: Indexed<ID, &BattlePokemon>,
30 targets: Vec<PokemonIdentifier<ID>>,
31 players: &PLR,
32 ) -> Result<Vec<Indexed<ID, MoveResult>>, Self::Error>;
33
34 fn execute_item<ID: PartialEq, R: Rng, PLR: Players<ID>>(
35 &self,
36 battle: &BattleData,
37 random: &mut R,
38 item: &Item,
39 user: &ID,
40 target: PokemonIdentifier<ID>,
41 players: &mut PLR,
42 ) -> Result<Vec<ItemResult>, Self::Error>;
43}
44
45pub struct DefaultScriptEngine;
46
47impl ScriptingEngine for DefaultScriptEngine {
48 type Error = DefaultScriptError;
49
50 fn execute_move<
51 ID: Eq + Hash + Clone + 'static + core::fmt::Debug,
52 R: Rng + Clone + 'static,
53 PLR: Players<ID>,
54 >(
55 &self,
56 _: &mut R,
57 _: &Move,
58 _: Indexed<ID, &BattlePokemon>,
59 _: Vec<PokemonIdentifier<ID>>,
60 _: &PLR,
61 ) -> Result<Vec<Indexed<ID, MoveResult>>, Self::Error> {
62 Err(DefaultScriptError)
63 }
64
65 fn execute_item<ID: PartialEq, R: Rng, PLR: Players<ID>>(
66 &self,
67 _: &BattleData,
68 _: &mut R,
69 _: &Item,
70 _: &ID,
71 _: PokemonIdentifier<ID>,
72 _: &mut PLR,
73 ) -> Result<Vec<ItemResult>, Self::Error> {
74 Err(DefaultScriptError)
75 }
76}
77
78#[derive(Debug)]
79pub struct DefaultScriptError;
80
81impl Error for DefaultScriptError {}
82
83impl core::fmt::Display for DefaultScriptError {
84 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
85 write!(f, "No script engine is in use!")
86 }
87}