firecore_battle/default_engine/
scripting.rs

1use alloc::vec::Vec;
2use core::{fmt::Debug, hash::Hash};
3use std::error::Error;
4
5// use std::error::Error;
6
7use 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}