vbox split

This commit is contained in:
ntr 2019-03-06 12:47:55 +11:00
parent fd1c693f01
commit 897ace6ed2
3 changed files with 37 additions and 31 deletions

View File

@ -193,7 +193,7 @@ impl Instance {
fn bot_vbox_phase(&mut self) -> &mut Instance {
for bot in self.players.iter_mut().filter(|p| p.bot) {
bot.vbox.fill(false);
bot.vbox.fill();
bot.set_ready(true);
}
@ -401,7 +401,7 @@ pub fn instance_join(params: InstanceJoinParams, tx: &mut Transaction, account:
}
let mut player = Player::new(account.id, instance.id, cryps);
player.vbox.fill(true);
player.vbox.fill();
player_create(tx, &player, account)?;
instance.add_player(player.clone());
@ -496,7 +496,7 @@ pub fn instance_game_finished(tx: &mut Transaction, game: &Game, instance_id: Uu
.iter()
.filter(|p| !p.bot) {
let mut player = player_get(tx, player.account, instance_id)?;
player.vbox.fill(false);
player.vbox.fill();
player_update(tx, player)?;
}
}

View File

@ -598,6 +598,7 @@ struct VboxAcceptMsg {
#[derive(Debug,Clone,Serialize,Deserialize)]
pub struct VboxAcceptParams {
pub instance_id: Uuid,
pub group: usize,
pub index: usize,
}

View File

@ -34,9 +34,13 @@ pub enum Var {
// specs
Damage,
Protection,
Healing,
Speed,
Hp,
HpI,
StamI,
SpeedI,
Amplify,
Banish,
Blast,
@ -135,20 +139,20 @@ impl Vbox {
Var::Attack,
Var::Attack,
Var::Attack,
Var::Stam5,
Var::Stam5,
Var::Speed5,
Var::Speed5,
Var::Damage,
Var::HpI,
Var::SpeedI,
Var::Damage,
Var::Red,
Var::Green,
Var::Blue,
];
let vbox = Vbox {
let mut vbox = Vbox {
id: Uuid::new_v4(),
account: account_id,
instance: instance_id,
free: starting_items,
bound: vec![],
free: vec![],
bound: starting_items,
balance: 9,
};
@ -175,36 +179,37 @@ impl Vbox {
let specs = vec![
(Var::Damage, 1),
(Var::Protection, 1),
(Var::Healing, 1),
(Var::Speed, 1),
(Var::Hp, 1),
];
let mut free = vec![];
let mut rng = thread_rng();
for i in 0..18 {
let vars = match i {
0...5 => &colours,
6...11 => &skills,
12...17 => &specs,
_ => panic!("vars oor"),
};
let dist = WeightedIndex::new(vars.iter().map(|item| item.1)).unwrap();
free.push(vars[dist.sample(&mut rng)].0);
}
self.free = free;
self.free = [&colours, &skills, &specs].iter()
.map(|vars| {
let dist = WeightedIndex::new(vars.iter().map(|item| item.1)).unwrap();
iter::repeat_with(|| {
vars[dist.sample(&mut rng)].0
})
.take(6)
.collect::<Vec<Var>>()
})
.collect::<Vec<Vec<Var>>>();
self
}
pub fn accept(&mut self, i: usize) -> Result<&mut Vbox, Error> {
pub fn accept(&mut self, i: usize, j: usize) -> Result<&mut Vbox, Error> {
if self.bound.len() >= 9 {
return Err(err_msg("too many vars bound"));
}
self.free.get(i).ok_or(format_err!("no var at index {:?}", i))?;
self.bound.push(self.free.remove(i));
self.free
.get(i).ok_or(format_err!("no var group at index {:?}", i))?
.get(j).ok_or(format_err!("no var at index {:?}", j))?;
self.bound.push(self.free[i].remove(j));
Ok(self)
}
@ -318,13 +323,13 @@ impl Vbox {
pub fn vbox_discard(params: VboxDiscardParams, tx: &mut Transaction, account: &Account) -> Result<Player, Error> {
let mut player = player_get(tx, account.id, params.instance_id)?;
player.vbox.fill(false);
player.vbox.fill();
return player_update(tx, player);
}
pub fn vbox_accept(params: VboxAcceptParams, tx: &mut Transaction, account: &Account) -> Result<Player, Error> {
let mut player = player_get(tx, account.id, params.instance_id)?;
player.vbox.accept(params.index)?;
player.vbox.accept(params.group, params.index)?;
return player_update(tx, player);
}