fix ko cryps requiring a skill
This commit is contained in:
parent
c677e90f42
commit
af1c06289d
@ -54,6 +54,7 @@ class CrypImage extends Phaser.GameObjects.Image {
|
|||||||
|
|
||||||
class CrypSkill extends Phaser.GameObjects.Text {
|
class CrypSkill extends Phaser.GameObjects.Text {
|
||||||
constructor(scene, row, iter, team, skill, cryp) {
|
constructor(scene, row, iter, team, skill, cryp) {
|
||||||
|
console.log(skill, cryp);
|
||||||
// Avatar will be a property of cryp
|
// Avatar will be a property of cryp
|
||||||
const {
|
const {
|
||||||
CRYP_MARGIN, TEXT_MARGIN, TEAM_MARGIN, X_PADDING, Y_PADDING,
|
CRYP_MARGIN, TEXT_MARGIN, TEAM_MARGIN, X_PADDING, Y_PADDING,
|
||||||
@ -151,6 +152,10 @@ function renderSkills(scene, group, cryp, game, team, iter) {
|
|||||||
});
|
});
|
||||||
} else if (game.phase === 'Target') {
|
} else if (game.phase === 'Target') {
|
||||||
const blockSkill = game.stack.find(skill => skill.source_cryp_id === cryp.id);
|
const blockSkill = game.stack.find(skill => skill.source_cryp_id === cryp.id);
|
||||||
|
|
||||||
|
// cryp not casting this turn
|
||||||
|
if (!blockSkill) return false;
|
||||||
|
|
||||||
group.add(scene.add.existing(new CrypSkill(scene, 1, iter, team, blockSkill, cryp)));
|
group.add(scene.add.existing(new CrypSkill(scene, 1, iter, team, blockSkill, cryp)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,8 +5,6 @@
|
|||||||
|
|
||||||
# WORK WORK
|
# WORK WORK
|
||||||
|
|
||||||
* unwrap account for all functions except list
|
|
||||||
|
|
||||||
* handle unserializable cryps
|
* handle unserializable cryps
|
||||||
|
|
||||||
* Global rolls
|
* Global rolls
|
||||||
@ -14,6 +12,7 @@
|
|||||||
* skills
|
* skills
|
||||||
* handle setting account better maybe?
|
* handle setting account better maybe?
|
||||||
* ensure cryp untargetable and doesn't resolve when KO
|
* ensure cryp untargetable and doesn't resolve when KO
|
||||||
|
* remove all statuses etc when KO
|
||||||
* calculate
|
* calculate
|
||||||
* hp increase/decrease
|
* hp increase/decrease
|
||||||
* private fields for opponents
|
* private fields for opponents
|
||||||
|
|||||||
@ -360,6 +360,7 @@ pub fn cryp_spawn(params: CrypSpawnParams, tx: &mut Transaction, account: &Accou
|
|||||||
pub fn cryp_learn(params: CrypLearnParams, tx: &mut Transaction, account: &Account) -> Result<Cryp, Error> {
|
pub fn cryp_learn(params: CrypLearnParams, tx: &mut Transaction, account: &Account) -> Result<Cryp, Error> {
|
||||||
let mut cryp = cryp_get(tx, params.id, account.id)?;
|
let mut cryp = cryp_get(tx, params.id, account.id)?;
|
||||||
|
|
||||||
|
// done here because i teach them a tonne of skills for tests
|
||||||
let max_skills = 4;
|
let max_skills = 4;
|
||||||
if cryp.skills.len() >= max_skills {
|
if cryp.skills.len() >= max_skills {
|
||||||
return Err(format_err!("cryp at max skills ({:?})", max_skills));
|
return Err(format_err!("cryp at max skills ({:?})", max_skills));
|
||||||
|
|||||||
@ -31,7 +31,10 @@ impl Team {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn skills_required(&self) -> usize {
|
fn skills_required(&self) -> usize {
|
||||||
let required = self.cryps.iter().filter(|c| c.available_skills().len() > 0).collect::<Vec<&Cryp>>().len();
|
let required = self.cryps.iter()
|
||||||
|
.filter(|c| !c.is_ko())
|
||||||
|
.filter(|c| c.available_skills().len() > 0)
|
||||||
|
.collect::<Vec<&Cryp>>().len();
|
||||||
// println!("{:?} requires {:?} skills this turn", self.id, required);
|
// println!("{:?} requires {:?} skills this turn", self.id, required);
|
||||||
return required;
|
return required;
|
||||||
}
|
}
|
||||||
@ -218,6 +221,10 @@ impl Game {
|
|||||||
None => return Err(err_msg("cryp not in team")),
|
None => return Err(err_msg("cryp not in team")),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if cryp.is_ko() {
|
||||||
|
return Err(err_msg("cryp is ko"));
|
||||||
|
}
|
||||||
|
|
||||||
// check the cryp has the skill
|
// check the cryp has the skill
|
||||||
if !cryp.knows(skill) {
|
if !cryp.knows(skill) {
|
||||||
return Err(err_msg("cryp does not have that skill"));
|
return Err(err_msg("cryp does not have that skill"));
|
||||||
@ -291,11 +298,13 @@ impl Game {
|
|||||||
{
|
{
|
||||||
let mob_team_id = Uuid::nil();
|
let mob_team_id = Uuid::nil();
|
||||||
let mobs = self.team_by_id(mob_team_id).clone();
|
let mobs = self.team_by_id(mob_team_id).clone();
|
||||||
|
let target_id = mobs.cryps.iter().find(|c| !c.is_ko()).map(|c| c.id).unwrap();
|
||||||
|
println!("targeting {:?}", target_id);
|
||||||
// TODO attack multiple players based on some criteria
|
// TODO attack multiple players based on some criteria
|
||||||
for incoming_skill_id in self.stack.clone().iter()
|
for incoming_skill_id in self.stack.clone().iter()
|
||||||
.filter(|s| s.target_cryp_id.is_none() && s.target_team_id == mob_team_id)
|
.filter(|s| s.target_cryp_id.is_none() && s.target_team_id == mob_team_id)
|
||||||
.map(|s| s.id) {
|
.map(|s| s.id) {
|
||||||
self.add_target(mob_team_id, mobs.cryps[0].id, incoming_skill_id).unwrap();
|
self.add_target(mob_team_id, target_id, incoming_skill_id).unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -376,6 +385,7 @@ impl Game {
|
|||||||
|
|
||||||
// update the stack with the resolved skills
|
// update the stack with the resolved skills
|
||||||
self.stack = self.stack.clone().iter_mut().map(|skill| {
|
self.stack = self.stack.clone().iter_mut().map(|skill| {
|
||||||
|
println!("{:?} resolving ", skill);
|
||||||
let mut source = self.cryp_by_id(skill.source_cryp_id).unwrap().clone();
|
let mut source = self.cryp_by_id(skill.source_cryp_id).unwrap().clone();
|
||||||
let mut target = self.cryp_by_id(skill.target_cryp_id.unwrap()).unwrap().clone();
|
let mut target = self.cryp_by_id(skill.target_cryp_id.unwrap()).unwrap().clone();
|
||||||
|
|
||||||
@ -405,6 +415,10 @@ impl Game {
|
|||||||
for mut cryp in self.all_cryps() {
|
for mut cryp in self.all_cryps() {
|
||||||
// println!("progressing durations for {:?}", cryp.name);
|
// println!("progressing durations for {:?}", cryp.name);
|
||||||
|
|
||||||
|
if cryp.is_ko() {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// only reduce cooldowns if no cd was used
|
// only reduce cooldowns if no cd was used
|
||||||
// have to borrow self for the skill check
|
// have to borrow self for the skill check
|
||||||
{
|
{
|
||||||
@ -795,6 +809,59 @@ mod tests {
|
|||||||
return game;
|
return game;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn create_2v2_test_game() -> Game {
|
||||||
|
let mut i = Cryp::new()
|
||||||
|
.named(&"pretaliate".to_string())
|
||||||
|
.level(8)
|
||||||
|
.learn(Skill::Attack)
|
||||||
|
.create();
|
||||||
|
|
||||||
|
let mut j = Cryp::new()
|
||||||
|
.named(&"poy sian".to_string())
|
||||||
|
.level(8)
|
||||||
|
.learn(Skill::Attack)
|
||||||
|
.create();
|
||||||
|
|
||||||
|
let mut x = Cryp::new()
|
||||||
|
.named(&"pronounced \"creeep\"".to_string())
|
||||||
|
.level(8)
|
||||||
|
.learn(Skill::Attack)
|
||||||
|
.create();
|
||||||
|
|
||||||
|
let mut y = Cryp::new()
|
||||||
|
.named(&"lemongrass tea".to_string())
|
||||||
|
.level(8)
|
||||||
|
.learn(Skill::Attack)
|
||||||
|
.create();
|
||||||
|
|
||||||
|
let mut game = Game::new();
|
||||||
|
|
||||||
|
game
|
||||||
|
.set_team_num(2)
|
||||||
|
.set_team_size(2)
|
||||||
|
.set_pve(false);
|
||||||
|
|
||||||
|
let x_team_id = Uuid::new_v4();
|
||||||
|
let mut x_team = Team::new(x_team_id);
|
||||||
|
x_team
|
||||||
|
.set_cryps(vec![x]);
|
||||||
|
|
||||||
|
let y_team_id = Uuid::new_v4();
|
||||||
|
let mut y_team = Team::new(y_team_id);
|
||||||
|
y_team
|
||||||
|
.set_cryps(vec![y]);
|
||||||
|
|
||||||
|
game
|
||||||
|
.team_add(x_team).unwrap()
|
||||||
|
.team_add(y_team).unwrap();
|
||||||
|
|
||||||
|
assert!(game.can_start());
|
||||||
|
|
||||||
|
game.start();
|
||||||
|
|
||||||
|
return game;
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn phase_test() {
|
fn phase_test() {
|
||||||
let mut game = create_test_game();
|
let mut game = create_test_game();
|
||||||
@ -952,4 +1019,34 @@ mod tests {
|
|||||||
// println!("{:#?}", game);
|
// println!("{:#?}", game);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn ko_pve_test() {
|
||||||
|
let mut game = create_test_game();
|
||||||
|
|
||||||
|
let x_team = game.teams[0].clone();
|
||||||
|
let y_team = game.teams[1].clone();
|
||||||
|
|
||||||
|
let x_cryp = x_team.cryps[0].clone();
|
||||||
|
let y_cryp = y_team.cryps[0].clone();
|
||||||
|
|
||||||
|
let x_attack_id = game.add_skill(x_team.id, x_cryp.id, Some(y_team.id), Skill::Attack).unwrap();
|
||||||
|
let y_attack_id = game.add_skill(y_team.id, y_cryp.id, Some(x_team.id), Skill::Attack).unwrap();
|
||||||
|
|
||||||
|
assert!(game.skill_phase_finished());
|
||||||
|
|
||||||
|
game.target_phase_start();
|
||||||
|
|
||||||
|
game.add_target(x_team.id, x_cryp.id, y_attack_id).unwrap();
|
||||||
|
game.add_target(y_team.id, y_cryp.id, x_attack_id).unwrap();
|
||||||
|
|
||||||
|
assert!(game.target_phase_finished());
|
||||||
|
|
||||||
|
game.resolve_phase_start();
|
||||||
|
|
||||||
|
assert!([Phase::Skill, Phase::Finish].contains(&game.phase));
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user