cooldowns and statuses

This commit is contained in:
ntr 2018-10-25 16:18:56 +11:00
parent 17a1132700
commit 7ff281c140
3 changed files with 91 additions and 58 deletions

View File

@ -24,7 +24,9 @@ impl CrypSkill {
let turns = match skill { let turns = match skill {
Skill::Attack => None, Skill::Attack => None,
Skill::Block => Some(1), Skill::Block => Some(1),
Skill::Dodge => Some(1),
Skill::Heal => Some(2), Skill::Heal => Some(2),
Skill::Stun => Some(2),
}; };
CrypSkill { CrypSkill {
@ -32,6 +34,22 @@ impl CrypSkill {
cd: turns, cd: turns,
} }
} }
fn is_usable(&self, cryp: &Cryp) -> bool {
true
}
}
#[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)]
pub enum Status {
Stunned,
Silenced,
}
#[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)]
pub struct CrypStatus {
status: Status,
turns: u8,
} }
@ -44,14 +62,14 @@ pub enum Stat {
Stam, Stam,
} }
#[derive(Debug,Clone)] #[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)]
pub struct Roll { pub struct Roll {
pub base: u64, pub base: u64,
pub result: u64, pub result: u64,
pub kind: Stat, pub kind: Stat,
} }
#[derive(Debug,Clone,Serialize,Deserialize)] #[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)]
pub struct CrypStat { pub struct CrypStat {
pub value: u64, pub value: u64,
pub stat: Stat, pub stat: Stat,
@ -63,29 +81,6 @@ impl CrypStat {
self self
} }
// fn roll(&self, c: &Cryp, log: &mut Vec<String>) -> Roll {
// let mut rng = thread_rng();
// let base: u64 = rng.gen();
// let mut roll = Roll { kind: self.kind, base, result: base };
// log.push(format!("{:?}", self.kind));
// log.push(format!("{:064b} <- base roll", base));
// // apply skills
// roll = c.skills.iter().fold(roll, |roll, s| s.apply(roll));
// // finally combine with CrypStat
// log.push(format!("{:064b} <- finalised", roll.result));
// roll.result = roll.result & self.value;
// log.push(format!("{:064b} & <- attribute roll", self.value));
// log.push(format!("{:064b} = {:?}", roll.result, roll.result));
// log.push(format!(""));
// return roll;
// }
pub fn reduce(&mut self, dmg: u64) -> &mut CrypStat { pub fn reduce(&mut self, dmg: u64) -> &mut CrypStat {
self.value = self.value.saturating_sub(dmg); self.value = self.value.saturating_sub(dmg);
self self
@ -110,6 +105,7 @@ pub struct Cryp {
pub xp: u64, pub xp: u64,
pub lvl: u8, pub lvl: u8,
pub skills: Vec<CrypSkill>, pub skills: Vec<CrypSkill>,
pub statuses: Vec<CrypStatus>,
pub name: String, pub name: String,
} }
@ -132,6 +128,7 @@ impl Cryp {
lvl: 0, lvl: 0,
xp: 0, xp: 0,
skills: vec![CrypSkill::new(Skill::Attack)], skills: vec![CrypSkill::new(Skill::Attack)],
statuses: vec![],
name: String::new() name: String::new()
}; };
} }
@ -188,34 +185,14 @@ impl Cryp {
self self
} }
// pub fn assign_str(&mut self, opp: &Cryp, plr_t: &mut Turn, opp_t: &Turn) -> &mut Cryp {
// // let final_str = opp_t.str.result.saturating_sub(plr_t.agi.result);
// // let blocked = opp_t.str.result.saturating_sub(final_str);
// let final_str = opp_t.str.result & !plr_t.agi.result;
// let blocked = opp_t.str.result & plr_t.agi.result;
// plr_t.log.push(format!("{:064b} <- attacking roll {:?}", opp_t.str.result, opp_t.str.result));
// // plr_t.log.push(format!("{:064b} <- blocking roll {:?}", plr_t.agi.result, plr_t.agi.result));
// plr_t.log.push(format!("{:064b} <- final str {:?} ({:?} blocked)", final_str, final_str, blocked));
// self.hp.reduce(final_str);
// plr_t.log.push(format!("{:?} deals {:?} str to {:?} ({:?} blocked / {:?} hp remaining)"
// ,opp.name
// ,final_str
// ,self.name
// ,blocked
// ,self.hp.value));
// plr_t.log.push(format!(""));
// self
// }
pub fn is_ko(&self) -> bool { pub fn is_ko(&self) -> bool {
self.hp.value == 0 self.hp.value == 0
} }
pub fn available_skills(&self) -> Vec<&CrypSkill> {
self.skills.iter().filter(|s| s.is_usable(self)).collect()
}
pub fn knows(&self, skill: Skill) -> bool { pub fn knows(&self, skill: Skill) -> bool {
self.skills.iter().any(|s| s.skill == skill) self.skills.iter().any(|s| s.skill == skill)
} }
@ -312,3 +289,51 @@ mod tests {
return; return;
} }
} }
// pub fn assign_str(&mut self, opp: &Cryp, plr_t: &mut Turn, opp_t: &Turn) -> &mut Cryp {
// // let final_str = opp_t.str.result.saturating_sub(plr_t.agi.result);
// // let blocked = opp_t.str.result.saturating_sub(final_str);
// let final_str = opp_t.str.result & !plr_t.agi.result;
// let blocked = opp_t.str.result & plr_t.agi.result;
// plr_t.log.push(format!("{:064b} <- attacking roll {:?}", opp_t.str.result, opp_t.str.result));
// // plr_t.log.push(format!("{:064b} <- blocking roll {:?}", plr_t.agi.result, plr_t.agi.result));
// plr_t.log.push(format!("{:064b} <- final str {:?} ({:?} blocked)", final_str, final_str, blocked));
// self.hp.reduce(final_str);
// plr_t.log.push(format!("{:?} deals {:?} str to {:?} ({:?} blocked / {:?} hp remaining)"
// ,opp.name
// ,final_str
// ,self.name
// ,blocked
// ,self.hp.value));
// plr_t.log.push(format!(""));
// self
// }
// fn roll(&self, c: &Cryp, log: &mut Vec<String>) -> Roll {
// let mut rng = thread_rng();
// let base: u64 = rng.gen();
// let mut roll = Roll { kind: self.kind, base, result: base };
// log.push(format!("{:?}", self.kind));
// log.push(format!("{:064b} <- base roll", base));
// // apply skills
// roll = c.skills.iter().fold(roll, |roll, s| s.apply(roll));
// // finally combine with CrypStat
// log.push(format!("{:064b} <- finalised", roll.result));
// roll.result = roll.result & self.value;
// log.push(format!("{:064b} & <- attribute roll", self.value));
// log.push(format!("{:064b} = {:?}", roll.result, roll.result));
// log.push(format!(""));
// return roll;
// }

View File

@ -30,6 +30,10 @@ impl Team {
}; };
} }
fn skills_required(&self) -> usize {
self.cryps.iter().filter(|c| c.available_skills().len() > 0).collect::<Vec<&Cryp>>().len()
}
pub fn set_cryps(&mut self, cryps: Vec<Cryp>) -> &mut Team { pub fn set_cryps(&mut self, cryps: Vec<Cryp>) -> &mut Team {
self.cryps = cryps; self.cryps = cryps;
self self
@ -224,7 +228,7 @@ impl Game {
} }
fn skill_phase_finished(&self) -> bool { fn skill_phase_finished(&self) -> bool {
self.teams.iter().all(|t| t.skills.len() == self.team_size) self.teams.iter().all(|t| t.skills.len() == t.skills_required())
} }
// move all skills into their target team's targets list // move all skills into their target team's targets list

View File

@ -14,6 +14,8 @@ pub enum Skill {
Attack, Attack,
Block, Block,
Heal, Heal,
Stun,
Dodge,
} }
@ -46,6 +48,8 @@ impl Turn {
let stat = match self.skill { let stat = match self.skill {
Skill::Attack => &c.str, Skill::Attack => &c.str,
Skill::Block => &c.str, Skill::Block => &c.str,
Skill::Stun => &c.str,
Skill::Dodge => &c.agi,
Skill::Heal => &c.int, Skill::Heal => &c.int,
}; };