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/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 372de462..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,10 +46,7 @@ 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 (
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 6a1266c2..581c6b5f 100644
--- a/server/src/item.rs
+++ b/server/src/item.rs
@@ -337,13 +337,27 @@ impl Item {
}
}
- 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)
@@ -355,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 {
@@ -1441,6 +1455,7 @@ pub struct ItemInfo {
pub spec: bool,
pub values: Option,
pub skill: bool,
+ pub speed: Option,
pub cooldown: Cooldown,
pub description: String,
}
@@ -1477,6 +1492,10 @@ pub fn item_info() -> ItemInfoCtr {
},
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
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/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"),
+ };
+ }
}
},
_ => (),