use dotzuki_engine::battle::stack::{BattleCtx, EffectProvider};
use dotzuki_engine::battle::{BattlerRef, BattlerState};
pub trait RuleBindings<P: EffectProvider + ?Sized>: 'static {
fn apply_boost(&self, b: &mut BattlerState<P>, stat_index: usize, stages: i8) -> bool;
fn set_status(&self, b: &mut BattlerState<P>, status_index: usize) -> bool;
fn set_status_with_amount(
&self,
b: &mut BattlerState<P>,
status_index: usize,
_amount: u16,
) -> bool {
self.set_status(b, status_index)
}
fn make_volatile(&self, _name: &str, _amount: u16) -> Option<P::EffectStateKind> {
None
}
fn has_type(&self, b: &BattlerState<P>, type_index: usize) -> bool;
fn type_chart_mult(
&self,
_ctx: &BattleCtx<'_, P>,
_move_type_index: usize,
_defender: BattlerRef,
) -> (u32, u32) {
(1, 1)
}
fn current_stat_index(&self, _ctx: &BattleCtx<'_, P>) -> Option<usize> {
None
}
fn has_volatile(&self, _ctx: &BattleCtx<'_, P>, _who: BattlerRef, _name: &str) -> bool {
false
}
fn redirect_hp_loss(
&self,
_ctx: &mut BattleCtx<'_, P>,
_who: BattlerRef,
_source: BattlerRef,
_amount: u16,
) -> bool {
false
}
fn move_type_is_defender_type(
&self,
ctx: &BattleCtx<'_, P>,
move_type_index: usize,
who: BattlerRef,
) -> bool {
self.has_type(ctx.battler(who), move_type_index)
}
fn has_status(&self, _b: &BattlerState<P>, _status_index: usize) -> bool {
false
}
fn has_any_status(&self, _b: &BattlerState<P>) -> bool {
false
}
fn battler_level(&self, _b: &BattlerState<P>) -> u16 {
0
}
fn resource_id(&self, resource_index: usize) -> u16 {
resource_index as u16
}
fn can_pay_resource(&self, b: &BattlerState<P>, resource_index: usize, amount: u16) -> bool {
b.can_pay_resource(self.resource_id(resource_index), amount)
}
fn pay_resource(&self, b: &mut BattlerState<P>, resource_index: usize, amount: u16) {
b.pay_resource(self.resource_id(resource_index), amount);
}
}