use crate::rules::*;
use weasel::creature::CreatureId;
use weasel::object::ObjectId;
use weasel::team::TeamId;
use weasel::{
Battle, BattleController, ClearStatus, CreateCreature, CreateObject, CreateTeam, EndTurn,
EntityId, EnvironmentTurn, EventKind, EventTrigger, Id, InflictStatus, Server, StartTurn,
};
mod rules;
static TEAM_ID: TeamId<CustomRules> = 1;
static CREATURE_ID: CreatureId<CustomRules> = 1;
static OBJECT_ID: ObjectId<CustomRules> = 2;
static ENTITY_1_ID: EntityId<CustomRules> = EntityId::Creature(CREATURE_ID);
static ENTITY_2_ID: EntityId<CustomRules> = EntityId::Object(OBJECT_ID);
fn main() {
let battle = Battle::builder(CustomRules::new()).build();
let mut server = Server::builder(battle).build();
CreateTeam::trigger(&mut server, TEAM_ID).fire().unwrap();
println!("Spawning a creature...");
CreateCreature::trigger(&mut server, CREATURE_ID, TEAM_ID, ())
.statistics_seed(50)
.fire()
.unwrap();
println!("Spawning an object...");
CreateObject::trigger(&mut server, OBJECT_ID, ())
.statistics_seed(50)
.fire()
.unwrap();
print_state(&server);
println!("Inflicting a power-up on the creature...");
InflictStatus::trigger(&mut server, ENTITY_1_ID, VIGOR)
.potency((50, None))
.fire()
.unwrap();
println!("Inflicting a DoT on the object...");
InflictStatus::trigger(&mut server, ENTITY_2_ID, DOT)
.potency((10, Some(2)))
.fire()
.unwrap();
print_state(&server);
for i in 1..=2 {
round(&mut server, i);
}
println!("Removing the creature power-up...");
ClearStatus::trigger(&mut server, ENTITY_1_ID, VIGOR)
.fire()
.unwrap();
print_state(&server);
print_dot_effects(&server);
}
fn round(server: &mut Server<CustomRules>, turn: u32) {
println!("Round {}", turn);
println!();
println!("Turn of Creature (1)...");
StartTurn::trigger(server, ENTITY_1_ID).fire().unwrap();
EndTurn::trigger(server).fire().unwrap();
println!("Turn of environment...");
EnvironmentTurn::trigger(server).fire().unwrap();
print_state(server);
}
fn print_state(server: &Server<CustomRules>) {
println!();
println!("------------------------- Entities -------------------------");
for character in server.battle().entities().characters() {
let statuses: Vec<_> = character
.statuses()
.map(|status| match *status.id() {
VIGOR => "vigor",
DOT => "DoT",
_ => unimplemented!(),
})
.collect();
println!(
"{:?} => health: {}, statuses: {:?}",
character.entity_id(),
character.statistic(&HEALTH).unwrap().value(),
statuses
);
}
println!();
}
fn print_dot_effects(server: &Server<CustomRules>) {
println!("Event derived from the DOT status:");
let events = server.battle().history().events();
let inflict_event = events
.iter()
.rev()
.find(|e| e.kind() == EventKind::InflictStatus)
.unwrap();
println!("{:?}", inflict_event.event());
for event in events {
if event.origin() == Some(inflict_event.id()) {
println!("+-- {:?}", event.event());
}
}
}