diff --git a/VERSION b/VERSION index b000a6a0..721b9931 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.4.7 \ No newline at end of file +1.4.8 \ No newline at end of file diff --git a/WORKLOG.md b/WORKLOG.md index 3fd7fa5d..f4230f25 100644 --- a/WORKLOG.md +++ b/WORKLOG.md @@ -27,7 +27,6 @@ * fuck magic * empower on ko -var / skill info rpc -> sell cost / cooldown * rework vecs into sets * remove names so games/instances are copy diff --git a/acp/package.json b/acp/package.json index d930178a..67f5a80c 100644 --- a/acp/package.json +++ b/acp/package.json @@ -1,6 +1,6 @@ { "name": "mnml-client", - "version": "1.4.7", + "version": "1.4.8", "description": "", "main": "index.js", "scripts": { diff --git a/client/package.json b/client/package.json index bbc55739..387e4c64 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "mnml-client", - "version": "1.4.7", + "version": "1.4.8", "description": "", "main": "index.js", "scripts": { diff --git a/client/src/components/info.component.jsx b/client/src/components/info.component.jsx index b088f711..32b059b3 100644 --- a/client/src/components/info.component.jsx +++ b/client/src/components/info.component.jsx @@ -3,7 +3,7 @@ const range = require('lodash/range'); const reactStringReplace = require('react-string-replace'); const { INFO } = require('./../constants'); -const { convertItem, removeTier, itemSpeed } = require('../utils'); +const { convertItem, removeTier } = require('../utils'); const shapes = require('./shapes'); function InfoComponent(args) { @@ -46,15 +46,14 @@ function InfoComponent(args) { : false; const itemRegEx = /(Red|Blue|Green)/; const itemSourceDescription = reactStringReplace(itemSourceInfo, itemRegEx, match => shapes[match]()); - const calcSpeed = itemSource.length - ? (24 + (itemSpeed(itemSource[0].components[0]) + itemSpeed(itemSource[0].components[1])) * itemSpeed(itemSource[0].components[2])) * 4 - : (24 + itemSpeed(info)) * 4; - const speed =
Speed {shapes.SpeedStat()} multiplier {calcSpeed}%
; + const speed =
Speed {shapes.SpeedStat()} multiplier {fullInfo.speed * 4}%
; + const cooldown = fullInfo.cooldown ? `${fullInfo.cooldown} Turn delay` : null; return (
-

{fullInfo.item}

-

SKILL

+

{fullInfo.item} - {fullInfo.cost}b

+

SKILL

{itemSourceDescription} +
{cooldown}
{infoDescription}
{speed}
@@ -133,7 +132,6 @@ function InfoComponent(args) { } return false; }); - console.log(info); const bonusObj = info.includes('Life') ?
+ {bonus.bonus}
:
+ {bonus.bonus}%
; @@ -157,7 +155,7 @@ function InfoComponent(args) { return (
-

{info}

+

{info} - {fullInfo.cost}b

SPEC

{itemSourceDescription}
{infoDescription}
@@ -167,10 +165,10 @@ function InfoComponent(args) {
); } - + const cost = fullInfo.cost ? `- ${fullInfo.cost}b` : false; return (
-

{fullInfo.item}

+

{fullInfo.item} {cost}

{fullInfo.description}
); diff --git a/client/src/events.jsx b/client/src/events.jsx index 216af011..17851207 100644 --- a/client/src/events.jsx +++ b/client/src/events.jsx @@ -87,12 +87,12 @@ function registerEvents(store) { ); } return setTimeout(() => { + const animSkill = anims.animTarget ? removeTier(anims.animTarget.skill) : false; store.dispatch(actions.setAnimSource(null)); store.dispatch(actions.setAnimTarget(null)); store.dispatch(actions.setAnimText(null)); store.dispatch(actions.setAnimFocus([])); - if (!sequence.includes('END_SKILL') - || ['Banish', 'Invert'].includes(removeTier(anims.animTarget.skill))) return cb(); + if (!sequence.includes('END_SKILL') || (animSkill && ['Banish', 'Invert'].includes(animSkill))) return cb(); return true; }, timeout); }, err => { diff --git a/client/src/utils.jsx b/client/src/utils.jsx index ab3a6f4c..b78a2b44 100644 --- a/client/src/utils.jsx +++ b/client/src/utils.jsx @@ -187,20 +187,6 @@ const removeTier = skill => { return skill; }; -function itemSpeed(item) { - switch (item) { - case 'Attack': return 1; - case 'Stun': return 2; - case 'Block': return 3; - case 'Buff': return 4; - case 'Debuff': return 4; - case 'Red': return 3; - case 'Green': return 2; - case 'Blue': return 1; - default: return 0; - } -} - function postData(url = '/', data = {}) { // Default options are marked with * return fetch(`/api${url}`, { @@ -264,6 +250,5 @@ module.exports = { TARGET_COLOURS, randomPoints, removeTier, - itemSpeed, match, }; diff --git a/ops/package.json b/ops/package.json index 35c94dd8..9bd16061 100755 --- a/ops/package.json +++ b/ops/package.json @@ -1,6 +1,6 @@ { "name": "mnml-ops", - "version": "1.4.7", + "version": "1.4.8", "description": "", "main": "index.js", "scripts": { diff --git a/server/Cargo.toml b/server/Cargo.toml index 565aef8f..1df1bf9a 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mnml" -version = "1.4.7" +version = "1.4.8" authors = ["ntr "] [dependencies] diff --git a/server/src/account.rs b/server/src/account.rs index 5eaeafd4..ed918a55 100644 --- a/server/src/account.rs +++ b/server/src/account.rs @@ -357,6 +357,10 @@ pub fn constructs(tx: &mut Transaction, account: &Account) -> Result>(); @@ -386,6 +390,10 @@ pub fn team(tx: &mut Transaction, account: &Account) -> Result, E }, } }) + .map(|mut sk| { + sk.account = account.id; + sk + }) .map(|sk| Construct::from_skeleton(&sk)) .collect::>(); diff --git a/server/src/construct.rs b/server/src/construct.rs index 80b4d7bb..21647aef 100644 --- a/server/src/construct.rs +++ b/server/src/construct.rs @@ -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 { + if name.len() > 20 { + return Err(err_msg("20 character name maximum")); + } + Ok(self.named(&name)) } pub fn learn(mut self, s: Skill) -> Construct { diff --git a/server/src/game.rs b/server/src/game.rs index 222ab0f6..b96d15ad 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -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); } diff --git a/server/src/item.rs b/server/src/item.rs index 42d564b5..581c6b5f 100644 --- a/server/src/item.rs +++ b/server/src/item.rs @@ -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 { #[derive(Debug,Clone,Serialize,Deserialize)] pub struct ItemInfo { pub item: Item, + pub cost: usize, pub spec: bool, - pub skill: bool, pub values: Option, + pub skill: bool, + pub speed: Option, + 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::>(); diff --git a/server/src/mtx.rs b/server/src/mtx.rs index 3352d100..f32f9339 100644 --- a/server/src/mtx.rs +++ b/server/src/mtx.rs @@ -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(), }; diff --git a/server/src/rpc.rs b/server/src/rpc.rs index be3071e8..d006a316 100644 --- a/server/src/rpc.rs +++ b/server/src/rpc.rs @@ -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; diff --git a/server/src/skill.rs b/server/src/skill.rs index e66ab6a4..4d5ba5d6 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -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"), + }; + } } }, _ => (), diff --git a/server/src/vbox.rs b/server/src/vbox.rs index 7088d0e9..c8df2087 100644 --- a/server/src/vbox.rs +++ b/server/src/vbox.rs @@ -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]