diff --git a/client/src/components/battle.jsx b/client/src/components/battle.jsx
index 89df804b..8e2c8fe4 100644
--- a/client/src/components/battle.jsx
+++ b/client/src/components/battle.jsx
@@ -7,12 +7,7 @@ function CrypPanel({ battle }) {
{JSON.stringify(battle.a)}
{JSON.stringify(battle.b)}
- {
- battle.log.map((l, i) => {
- if (l === '') return (
);
- return
{l}
- })
- }
+ {battle.log.map((l, i) => (
{l}
))}
);
diff --git a/server/src/battle.rs b/server/src/battle.rs
index 4026984f..5c7e6c8d 100755
--- a/server/src/battle.rs
+++ b/server/src/battle.rs
@@ -1,73 +1,202 @@
-use uuid::Uuid;
-// use rand::prelude::*;
-
-use cryp::Cryp;
-
-// impl Attribute {
-// pub fn as_str(&self) -> &'static str {
-// match self {
-// Dmg => "dmg",
-// Def => "def",
-// }
-// }
-// }
-
-#[derive(Debug,Clone,Serialize,Deserialize)]
-pub struct Battle {
- pub a: Cryp,
- pub b: Cryp,
- pub log: Vec,
-}
-
-impl Battle {
- pub fn new(a: &Cryp, b: &Cryp) -> Battle {
- return Battle {
- a: a.clone(),
- b: b.clone(),
- log: vec![],
- };
- }
-
- pub fn cryps(&self) -> Vec<&Cryp> {
- vec![&self.a, &self.b]
- }
-
- pub fn next(&mut self) -> &mut Battle {
- if self.finished() {
- panic!("{:?} is finished", self);
- }
-
- let mut a_turn = self.a.turn();
- let mut b_turn = self.b.turn();
-
- self.a.assign_dmg(&self.b, &mut a_turn, &b_turn);
- self.b.assign_dmg(&self.a, &mut b_turn, &a_turn);
-
- self.log.append(&mut a_turn.log);
- self.log.append(&mut b_turn.log);
-
- self
- }
-
- pub fn finished(&self) -> bool {
- self.cryps().iter().any(|c| c.is_ko())
- }
-
- pub fn cryp_by_id(&self, id: Uuid) -> &Cryp {
- match self.cryps().iter().find(|c| c.id == id) {
- Some(c) => c,
- None => panic!("cryp not in battle {:?}", self),
- }
- }
-
- pub fn winner(&self) -> Option<&Cryp> {
- if self.cryps().iter().all(|c| c.is_ko()) {
- return None
- }
-
- match self.cryps().iter().find(|c| !c.is_ko()) {
- Some(w) => Some(w),
- None => panic!("no winner found {:?}", self),
- }
- }
-}
+use uuid::Uuid;
+// use rand::prelude::*;
+
+use cryp::Cryp;
+use skill::Skill;
+
+#[derive(Debug,Clone,Serialize,Deserialize)]
+pub enum Phase {
+ Skill,
+ Target,
+}
+
+#[derive(Debug,Clone,Serialize,Deserialize)]
+pub struct Team {
+ player: Uuid,
+ cryps: Vec,
+ skills: Vec,
+ targets: Vec,
+}
+
+impl Team {
+ pub fn new(player: Uuid) -> Team {
+ return Team {
+ player,
+ cryps: vec![],
+ skills: vec![],
+ targets: vec![],
+ };
+ }
+
+ pub fn set_cryps(&mut self, cryps: Vec) -> &mut Team {
+ self.cryps = cryps;
+ self
+ }
+}
+
+#[derive(Debug,Clone,Serialize,Deserialize)]
+pub struct Battle {
+ pub team_size: usize,
+ pub team_num: usize,
+ pub teams: Vec,
+ pub is_pve: bool,
+ pub phase: Phase,
+ pub log: Vec,
+}
+
+impl Battle {
+ pub fn new() -> Battle {
+ return Battle {
+ team_size: 0,
+ team_num: 0,
+ teams: vec![],
+ is_pve: true,
+ phase: Phase::Skill,
+ log: vec![],
+ };
+ }
+
+ pub fn set_team_num(&mut self, size: usize) -> &mut Battle {
+ self.team_num = size;
+ self
+ }
+
+ pub fn set_team_size(&mut self, size: usize) -> &mut Battle {
+ self.team_size = size;
+ self
+ }
+
+ pub fn add_team(&mut self, team: Team) -> &mut Battle {
+ if self.teams.len() == self.team_num {
+ panic!("maximum number of teams");
+ }
+ self.teams.push(team);
+ self
+ }
+
+ pub fn start(&mut self) -> &mut Battle {
+ self
+ }
+
+ pub fn add_skill(&mut self, player: Uuid, skill: Skill) -> &mut Battle {
+ // check if cryp actually has this skill
+ self.team_by_player(player).skills.push(skill);
+ self
+ }
+
+ pub fn team_by_player(&mut self, player: Uuid) -> &mut Team {
+ match self.teams.iter_mut().find(|t| t.player == player) {
+ Some(t) => t,
+ None => panic!("player not in battle {:?}", player),
+ }
+ }
+
+ pub fn can_start(&mut self) -> bool {
+ self.teams.len() == self.team_num
+ }
+
+ // battle.new()
+ // battle.set_team_size(1)
+ // battle.add_team(vec)
+ // battle.can_start() -> enough_teams() -> false
+ // battle.add_team(vec)
+ // battle.can_start() -> enough_teams() -> true
+ // battle.start() -> start_move_phase() -> is_pve() ? mob_moves()
+ // battle.skill_phase() -> send_state()
+ // battle.add_skill(team_id, cryp_id, skill)
+ // battle.skill_phase_finished() -> enough_moves()
+ // battle.targets_phase() -> is_pve() ? mob_targets()
+ // battle.select_target(skill, target)
+ // battle.targets_phase_finished() -> enough_targets()
+ // battle.assign_dmg()
+ // battle.is_finished()
+
+ // pub fn next(&mut self) -> &mut Battle {
+ // if self.finished() {
+ // panic!("{:?} is finished", self);
+ // }
+
+ // let mut a_turn = self.a.turn();
+ // let mut b_turn = self.b.turn();
+
+ // self.a.assign_dmg(&self.b, &mut a_turn, &b_turn);
+ // self.b.assign_dmg(&self.a, &mut b_turn, &a_turn);
+
+ // self.log.append(&mut a_turn.log);
+ // self.log.append(&mut b_turn.log);
+
+ // self
+ // }
+
+ pub fn skill_phase_finished(&self) -> bool {
+ self.teams.iter().all(|t| t.skills.len() == self.team_size)
+ }
+
+ pub fn finished(&self) -> bool {
+ self.teams.iter().any(|t| t.cryps.iter().all(|c| c.is_ko()))
+ }
+
+ // pub fn cryp_by_id(&self, id: Uuid) -> &Cryp {
+ // match self.cryps().iter().find(|c| c.id == id) {
+ // Some(c) => c,
+ // None => panic!("cryp not in battle {:?}", self),
+ // }
+ // }
+
+ // pub fn winner(&self) -> Option<&Cryp> {
+ // if self.cryps().iter().all(|c| c.is_ko()) {
+ // return None
+ // }
+
+ // match self.cryps().iter().find(|c| !c.is_ko()) {
+ // Some(w) => Some(w),
+ // None => panic!("no winner found {:?}", self),
+ // }
+ // }
+}
+
+
+#[cfg(test)]
+mod tests {
+ use battle::*;
+ use cryp::*;
+
+ #[test]
+ fn battle_test() {
+ let x = Cryp::new()
+ .named(&"pronounced \"creeep\"".to_string())
+ .level(8)
+ .learn(Skill::Stoney)
+ .create();
+
+ let y = Cryp::new()
+ .named(&"lemongrass tea".to_string())
+ .level(8)
+ .create();
+
+ let mut battle = Battle::new();
+
+ battle
+ .set_team_num(2)
+ .set_team_size(1);
+
+ let x_id = Uuid::new_v4();
+ let mut x_team = Team::new(x_id);
+ x_team
+ .set_cryps(vec![x]);
+
+ let y_id = Uuid::new_v4();
+ let mut y_team = Team::new(y_id);
+ y_team
+ .set_cryps(vec![y]);
+
+ battle
+ .add_team(x_team)
+ .add_team(y_team);
+
+ assert!(battle.can_start());
+
+ return;
+ }
+
+}
diff --git a/server/src/combat.rs b/server/src/combat.rs
index 7bc28f69..779574e5 100755
--- a/server/src/combat.rs
+++ b/server/src/combat.rs
@@ -13,69 +13,6 @@ use cryp::{Cryp, cryp_write};
use battle::Battle;
use skill::Skill;
-// struct Encounter {
-// mob: Cryp,
-// success: bool,
-// player: Cryp,
-// }
-
-
-pub fn battle_resolve(a: &Cryp, b: &Cryp) -> Battle {
- let mut battle = Battle::new(a, b);
- loop {
- battle.next();
- if battle.finished() {
- break battle
- }
- }
-}
-
-// fn pve_completion(plr: Cryp) -> Encounter {
-// let mut rng = thread_rng();
-// let mob_lvl: u8 = rng.gen_range(1, plr.lvl);
-
-// let mob = Cryp::new()
-// .named(&"bamboo basher".to_string())
-// .level(mob_lvl)
-// .create();
-
-// let outcome = battle_resolve(&plr, &mob);
-
-// let success = match outcome.winner() {
-// Some(c) => c.id == plr.id,
-// None => false,
-// };
-
-// return Encounter {
-// mob: mob,
-// success,
-// player: plr,
-// };
-// }
-
-// pub fn keep_levelling(mut c: Cryp) -> Cryp {
-// loop {
-// let enc = pve_completion(c);
-// c = enc.player;
-
-// if !enc.success {
-// println!("{:?} has been KO'd", c.name);
-// break c;
-// }
-
-// println!("{:?} rekt {:?}", c.name, enc.mob.name);
-// c = c.add_xp();
-// println!("{:?} now has {:?} xp and is lvl {:?}", c.name, c.xp, c.lvl);
-
-// // LEVEL CAP
-// if c.lvl == 12 {
-// break c;
-// }
-
-// continue;
-// }
-// }
-
fn generate_mob(plr: &Cryp) -> Cryp {
let mut rng = thread_rng();
@@ -93,112 +30,54 @@ fn generate_mob(plr: &Cryp) -> Cryp {
}
pub fn pve(params: CombatPveParams, tx: &mut Transaction, account: &Account) -> Result {
- let query = "
- SELECT *
- FROM cryps
- WHERE id = $1
- AND account = $2;
- ";
+ return Err(err_msg("cryp is ko"));
- let result = tx
- .query(query, &[¶ms.id, &account.id])?;
+ // let query = "
+ // SELECT *
+ // FROM cryps
+ // WHERE id = $1
+ // AND account = $2;
+ // ";
- let returned = match result.iter().next() {
- Some(row) => row,
- None => return Err(err_msg("cryp not found")),
- };
+ // let result = tx
+ // .query(query, &[¶ms.id, &account.id])?;
- // tells from_slice to cast into a cryp
- let cryp_bytes: Vec = returned.get("data");
- let plr: Cryp = from_slice::(&cryp_bytes)?;
+ // let returned = match result.iter().next() {
+ // Some(row) => row,
+ // None => return Err(err_msg("cryp not found")),
+ // };
- // TEMP
- if plr.hp.value == 0 {
- return Err(err_msg("cryp is ko"));
- // plr.rez();
- }
+ // // tells from_slice to cast into a cryp
+ // let cryp_bytes: Vec = returned.get("data");
+ // let plr: Cryp = from_slice::(&cryp_bytes)?;
- let mob = generate_mob(&plr);
- let mut battle = Battle::new(&plr, &mob);
+ // // TEMP
+ // if plr.hp.value == 0 {
+ // return Err(err_msg("cryp is ko"));
+ // // plr.rez();
+ // }
- loop {
- battle.next();
+ // let mob = generate_mob(&plr);
+ // let mut battle = Battle::new(&plr, &mob);
- if battle.finished() {
- let success = match battle.winner() {
- Some(c) => c.id == plr.id,
- None => false,
- };
+ // loop {
+ // battle.next();
- let mut post_battle_plr = battle.cryp_by_id(plr.id).clone();
+ // if battle.finished() {
+ // let success = match battle.winner() {
+ // Some(c) => c.id == plr.id,
+ // None => false,
+ // };
- if success {
- post_battle_plr = post_battle_plr.add_xp();
- }
+ // let mut post_battle_plr = battle.cryp_by_id(plr.id).clone();
- cryp_write(post_battle_plr, tx)?;
-
- break Ok(battle)
- }
- }
-}
-
-
-pub fn test_battle() {
- let a = Cryp::new()
- .named(&"pronounced \"creeep\"".to_string())
- .level(8)
- .learn(Skill::Stoney)
- .create();
-
- let b = Cryp::new()
- .named(&"lemongrass tea".to_string())
- .level(8)
- .create();
-
- let outcome = battle_resolve(&a, &b);
-
- match outcome.winner() {
- Some(w) => println!("{:?} is the winner with {:?} hp remaining", w.name, w.hp),
- None => println!("{:?} was a draw", outcome),
- };
-
- return
-}
-
-
-#[cfg(test)]
-mod tests {
- use combat::*;
-
- // #[test]
- // fn pve_completion_test() {
- // let player = Cryp::new()
- // .named(&"ca phe sua da".to_string())
- // .level(2)
- // .create();
-
- // keep_levelling(player);
- // return;
- // }
-
- // #[test]
- // fn pve_test() {
- // let name = "ca phe sua da".to_string();
- // let player = Cryp::new()
- // .named(&name)
- // .level(2)
- // .create();
-
- // let _battle = pve(player);
- // return;
- // }
-
-
- #[test]
- fn battle_test() {
- test_battle();
- return;
- }
+ // if success {
+ // post_battle_plr = post_battle_plr.add_xp();
+ // }
+ // cryp_write(post_battle_plr, tx)?;
+
+ // break Ok(battle)
+ // }
+ // }
}
diff --git a/server/src/skill.rs b/server/src/skill.rs
index e7e1e071..d2c7c8b4 100755
--- a/server/src/skill.rs
+++ b/server/src/skill.rs
@@ -7,16 +7,15 @@ pub enum Skill {
}
impl Skill {
- pub fn apply(&self, mut roll: Roll) -> Roll {
+ pub fn apply(&self, roll: Roll) -> Roll {
match self {
Skill::Stoney => stoney(self, roll),
Skill::Evasive => evasive(self, roll),
- _ => panic!("missing skill"),
}
}
}
-fn stoney(s: &Skill, mut roll: Roll) -> Roll {
+fn stoney(_s: &Skill, mut roll: Roll) -> Roll {
let effect = 0b11110000;
match roll.kind {
StatKind::Def => {
@@ -28,7 +27,7 @@ fn stoney(s: &Skill, mut roll: Roll) -> Roll {
}
}
-fn evasive(s: &Skill, mut roll: Roll) -> Roll {
+fn evasive(_s: &Skill, mut roll: Roll) -> Roll {
match roll.kind {
StatKind::Def => {
if roll.result.is_power_of_two() {