Merge branch 'develop' into msg-pane

This commit is contained in:
ntr
2019-09-21 16:23:03 +10:00
18 changed files with 103 additions and 69 deletions
+8
View File
@@ -357,6 +357,10 @@ pub fn constructs(tx: &mut Transaction, account: &Account) -> Result<Vec<Constru
},
}
})
.map(|mut sk| {
sk.account = account.id;
sk
})
.map(|sk| Construct::from_skeleton(&sk))
.collect::<Vec<Construct>>();
@@ -386,6 +390,10 @@ pub fn team(tx: &mut Transaction, account: &Account) -> Result<Vec<Construct>, E
},
}
})
.map(|mut sk| {
sk.account = account.id;
sk
})
.map(|sk| Construct::from_skeleton(&sk))
.collect::<Vec<Construct>>();
+7 -4
View File
@@ -238,7 +238,7 @@ impl Construct {
pub fn from_skeleton(skeleton: &ConstructSkeleton) -> Construct {
return Construct {
id: skeleton.id,
account: skeleton.id,
account: skeleton.account,
img: skeleton.img,
name: skeleton.name.clone(),
@@ -249,7 +249,7 @@ impl Construct {
pub fn to_skeleton(&self) -> ConstructSkeleton {
ConstructSkeleton {
id: self.id,
account: self.id,
account: self.account,
img: self.img,
name: self.name.clone(),
}
@@ -271,8 +271,11 @@ impl Construct {
self
}
pub fn new_name(self, name: String) -> Construct {
self.named(&name)
pub fn new_name(self, name: String) -> Result<Construct, Error> {
if name.len() > 20 {
return Err(err_msg("20 character name maximum"));
}
Ok(self.named(&name))
}
pub fn learn(mut self, s: Skill) -> Construct {
+1 -1
View File
@@ -322,7 +322,7 @@ impl Game {
return Err(err_msg("game not in skill phase"));
}
let mut game_state = self.clone();
self.stack.retain(|s| game_state.construct_by_id(s.source_construct_id).unwrap().account == player_id);
self.stack.retain(|s| game_state.construct_by_id(s.source_construct_id).unwrap().account != player_id);
return Ok(self);
}
+52 -14
View File
@@ -1,7 +1,7 @@
use skill::{Skill};
use spec::{Spec, SpecValues};
use construct::{Colours};
use effect::{Colour};
use effect::{Colour, Cooldown};
#[derive(Debug,Copy,Clone,Serialize,Deserialize,PartialEq,PartialOrd,Ord,Eq)]
pub enum Item {
@@ -320,18 +320,44 @@ impl Item {
let combos = get_combos();
let combo = combos.iter().find(|c| c.item == *self)
.unwrap_or_else(|| panic!("unable to find components for {:?}", self));
return combo.components.iter().fold(0, |acc, c| acc + c.cost());
return combo.components.iter().fold(0, |acc, c| {
match c {
Item::Attack |
Item::Block |
Item::Buff |
Item::Debuff |
Item::Stun => acc,
Item::Power |
Item::Life |
Item::Speed => acc + 1,
_ => acc + c.cost(),
}
});
},
}
}
pub fn speed(&self) -> u64 {
pub fn base_speed(&self) -> u64 {
match self {
Item::Attack => 1,
Item::Stun => 2,
Item::Block => 3,
Item::Buff |
Item::Debuff => 4,
Item::Blue => 1,
Item::Green => 2,
Item::Red => 3,
_ => 0,
}
}
pub fn speed(&self) -> u64 {
match self {
Item::Attack |
Item::Stun |
Item::Block |
Item::Buff |
Item::Debuff => 24 + self.base_speed(),
_ => {
let combos = get_combos();
let combo = combos.iter().find(|c| c.item == *self)
@@ -343,17 +369,17 @@ impl Item {
combo.components.iter().for_each(|unit| {
colour_speed += match unit {
Item::Red => 3,
Item::Green => 2,
Item::Blue => 1,
Item::Red |
Item::Green |
Item::Blue => unit.base_speed(),
_ => 0,
};
skill_speed += match unit {
Item::Attack => 1,
Item::Stun => 2,
Item::Block => 3,
Item::Attack |
Item::Stun |
Item::Block |
Item::Buff |
Item::Debuff => 4,
Item::Debuff => unit.base_speed(),
_ => 0,
};
if colour_speed == 0 && skill_speed == 0 {
@@ -960,7 +986,7 @@ impl Item {
Item::BreakPlus => vec![Item::Break, Item::Break, Item::Break],
Item::BreakPlusPlus => vec![Item::BreakPlus, Item::BreakPlus, Item::BreakPlus],
Item::LinkPlus => vec![Item::Link, Item::Link, Item::Link],
Item::LinkPlusPlus => vec![Item::LinkPlusPlus, Item::LinkPlusPlus, Item::LinkPlusPlus],
Item::LinkPlusPlus => vec![Item::LinkPlus, Item::LinkPlus, Item::LinkPlus],
Item::BanishPlus => vec![Item::Banish, Item::Banish, Item::Banish],
Item::BanishPlusPlus => vec![Item::BanishPlus, Item::BanishPlus, Item::BanishPlus],
@@ -1425,9 +1451,12 @@ pub fn get_combos() -> Vec<Combo> {
#[derive(Debug,Clone,Serialize,Deserialize)]
pub struct ItemInfo {
pub item: Item,
pub cost: usize,
pub spec: bool,
pub skill: bool,
pub values: Option<SpecValues>,
pub skill: bool,
pub speed: Option<u64>,
pub cooldown: Cooldown,
pub description: String,
}
@@ -1455,13 +1484,22 @@ pub fn item_info() -> ItemInfoCtr {
.into_iter()
.map(|v| ItemInfo {
item: v,
cost: v.cost(),
spec: v.into_spec().is_some(),
skill: v.into_skill().is_some(),
description: v.into_description(),
values: match v.into_spec() {
Some(s) => Some(s.values()),
None => None
},
skill: v.into_skill().is_some(),
description: v.into_description(),
speed: match v.into_skill() {
Some(s) => Some(s.speed()),
None => None
},
cooldown: match v.into_skill() {
Some(s) => s.base_cd(),
None => None
},
})
.collect::<Vec<ItemInfo>>();
+1 -1
View File
@@ -152,7 +152,7 @@ pub fn apply(tx: &mut Transaction, account: &Account, variant: MtxVariant, const
account::debit(tx, account.id, cost)?;
construct = match mtx.variant {
MtxVariant::Rename => construct.new_name(name),
MtxVariant::Rename => construct.new_name(name)?,
_ => construct.new_img(),
};
+1 -1
View File
@@ -14,7 +14,7 @@ use cookie::Cookie;
use stripe::{Client as StripeClient, Subscription};
use crossbeam_channel::{unbounded, Sender as CbSender};
use ws::{Builder, listen, CloseCode, Message, Handler, Request, Response, Settings, Sender as WsSender};
use ws::{Builder, CloseCode, Message, Handler, Request, Response, Settings, Sender as WsSender};
use account::{Account};
use account;
+12 -11
View File
@@ -293,7 +293,7 @@ fn post_resolve(_skill: Skill, game: &mut Game, mut resolutions: Resolutions) ->
let mut target = game.construct_by_id(target.id).unwrap().clone();
match event {
Event::Damage { amount, skill, mitigation: _, colour: _ } => {
Event::Damage { amount, skill, mitigation: _, colour: c } => {
if target.affected(Effect::Electric) {
let ConstructEffect { effect: _, duration: _, meta, tick: _ } = target.effects.iter()
.find(|e| e.effect == Effect::Electric).unwrap().clone();
@@ -315,16 +315,17 @@ fn post_resolve(_skill: Skill, game: &mut Game, mut resolutions: Resolutions) ->
_ => panic!("no absorb skill"),
};
}
if target.affected(Effect::Counter) {
let ConstructEffect { effect: _, duration: _, meta, tick: _ } = target.effects.iter()
.find(|e| e.effect == Effect::Counter).unwrap().clone();
match meta {
Some(EffectMeta::Skill(s)) => {
resolutions = counter_attack(&mut target, &mut source, resolutions, s);
},
_ => panic!("no counter skill"),
};
if c == Colour::Red {
if target.affected(Effect::Counter) {
let ConstructEffect { effect: _, duration: _, meta, tick: _ } = target.effects.iter()
.find(|e| e.effect == Effect::Counter).unwrap().clone();
match meta {
Some(EffectMeta::Skill(s)) => {
resolutions = counter_attack(&mut target, &mut source, resolutions, s);
},
_ => panic!("no counter skill"),
};
}
}
},
_ => (),
+1 -1
View File
@@ -240,7 +240,7 @@ mod tests {
let mut vbox = Vbox::new();
vbox.bound = vec![Item::Strike];
vbox.reclaim(0).unwrap();
assert_eq!(vbox.bits, 22);
assert_eq!(vbox.bits, 20);
}
#[test]