diff --git a/VERSION b/VERSION index 867e5243..589268e6 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.2.0 \ No newline at end of file +1.3.0 \ No newline at end of file diff --git a/acp/package.json b/acp/package.json index a13e342e..a0aeb290 100644 --- a/acp/package.json +++ b/acp/package.json @@ -1,6 +1,6 @@ { "name": "mnml-client", - "version": "1.2.0", + "version": "1.3.0", "description": "", "main": "index.js", "scripts": { diff --git a/client/assets/styles/styles.less b/client/assets/styles/styles.less index cd773c0d..f64f48fa 100644 --- a/client/assets/styles/styles.less +++ b/client/assets/styles/styles.less @@ -208,6 +208,7 @@ button[disabled] { } .options { + display: flex; width: 50%; } diff --git a/client/package.json b/client/package.json index 14bc2149..21e2be2a 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "mnml-client", - "version": "1.2.0", + "version": "1.3.0", "description": "", "main": "index.js", "scripts": { diff --git a/client/src/components/info.component.jsx b/client/src/components/info.component.jsx index 36fc19b5..29edb8cb 100644 --- a/client/src/components/info.component.jsx +++ b/client/src/components/info.component.jsx @@ -9,7 +9,6 @@ const shapes = require('./shapes'); function InfoComponent(args) { const { itemInfo, - combiner, player, info, } = args; @@ -25,6 +24,8 @@ function InfoComponent(args) {

double clicking items in the VBOX will purchase and move them to your INVENTORY.

hover over an item to see its effects and combinations.
+ combine a SKILL or SPEC with 2 COLOURS to create an item.
+ combine 3 of the same item to upgrade it.
click an item and then click a construct to equip that item to it.

click the READY button on the right to progress to the GAME PHASE.

@@ -40,17 +41,11 @@ function InfoComponent(args) { const regEx = /(RedPower|BluePower|GreenPower|RedLife|BlueLife|GreenLife|SpeedStat)/; const infoDescription = reactStringReplace(fullInfo.description, regEx, match => shapes[match]()); - const itemSource = itemInfo.combos.filter(c => c.item === info); - const itemSourceInfo = itemSource.length - ? `${itemSource[0].components[0]} ${itemSource[0].components[1]} ${itemSource[0].components[2]}` - : false; - const itemRegEx = /(Red|Blue|Green)/; - const itemSourceDescription = reactStringReplace(itemSourceInfo, itemRegEx, match => shapes[match]()); return (

{fullInfo.item}

-

{itemSourceDescription}

-
{infoDescription}
+

SKILL

+
{infoDescription}
); } @@ -144,6 +139,7 @@ function InfoComponent(args) { return (

{info}

+

SPEC

{infoDescription}
{thresholds} @@ -162,30 +158,11 @@ function InfoComponent(args) { function Combos() { if (!player) return false; - - // show recipe for what's in combiner - if (combiner.some(u => u !== null)) { - const filteredCombos = itemInfo.combos - .filter(combo => combiner.every(u => u === null - || combo.components.includes(player.vbox.bound[u]))); - if (filteredCombos.length > 6) return false; - return ( - - - {filteredCombos.map((c, i) => - - - {c.components.map((u, j) => )} - - )} - -
{convertItem(c.item)}{convertItem(u)}
- ); - } - if (!info) return false; + const vboxCombos = itemInfo.combos.filter(c => c.components.includes(info)); if (vboxCombos.length > 6) return false; + return ( diff --git a/client/src/components/vbox.component.jsx b/client/src/components/vbox.component.jsx index 6768cde6..e659ee72 100644 --- a/client/src/components/vbox.component.jsx +++ b/client/src/components/vbox.component.jsx @@ -14,7 +14,6 @@ const addState = connect( player, combiner, reclaiming, - vboxHighlight, vboxSelected, itemInfo, itemUnequip, @@ -49,7 +48,6 @@ const addState = connect( sendVboxCombine, sendVboxDiscard, sendVboxReclaim, - vboxHighlight, vboxSelected, itemInfo, itemUnequip, @@ -70,10 +68,6 @@ const addState = connect( return dispatch(actions.setInfo(item)); } - function setVboxHighlight(v) { - return dispatch(actions.setVboxHighlight(v)); - } - function setVboxSelected(v) { return dispatch(actions.setVboxSelected(v)); } @@ -86,7 +80,6 @@ const addState = connect( setCombiner, setReclaiming, setInfo, - setVboxHighlight, setVboxSelected, setItemEquip, }; @@ -105,7 +98,6 @@ function Vbox(args) { sendVboxCombine, sendVboxDiscard, sendVboxReclaim, - // vboxHighlight, setCombiner, setInfo, @@ -118,19 +110,12 @@ function Vbox(args) { sendItemUnequip, setReclaiming, - setVboxHighlight, } = args; if (!player) return false; const { vbox } = player; const vboxSelecting = vboxSelected.length; - // function setHighlight(type) { - // if (type === 'skill') return setVboxHighlight(itemInfo.items.filter(v => v.skill).map(v => v.item)); - // if (type === 'spec') return setVboxHighlight(itemInfo.items.filter(v => v.spec).map(v => v.item)); - // return false; - // } - function combinerChange(newCombiner) { setCombiner(newCombiner); @@ -140,20 +125,7 @@ function Vbox(args) { setItemEquip(null); } - if (newCombiner.every(c => c === null)) return setVboxHighlight([]); - - const combinerValues = newCombiner.map(cv => player.vbox.bound[cv]).filter(cv => cv); - - const filteredCombos = itemInfo.combos - .filter(combo => combinerValues.every(u => combo.components.includes(u))); - - const comboValues = itemInfo.items.filter(v => { - if (!filteredCombos.some(c => c.components.includes(v.item))) return false; - if (!['Red', 'Green', 'Blue'].includes(v.item) && combinerValues.includes(v.item)) return false; - return true; - }); - - return setVboxHighlight(comboValues.map(v => v.item)); + return true; } // diff --git a/client/src/reducers.jsx b/client/src/reducers.jsx index 35c45a64..496a5acc 100644 --- a/client/src/reducers.jsx +++ b/client/src/reducers.jsx @@ -50,7 +50,6 @@ module.exports = { teamPage: createReducer(0, 'SET_TEAM_PAGE'), teamSelect: createReducer([null, null, null], 'SET_TEAM_SELECT'), - vboxHighlight: createReducer([], 'SET_VBOX_HIGHLIGHT'), vboxSelected: createReducer([], 'SET_VBOX_SELECTED'), ws: createReducer(null, 'SET_WS'), diff --git a/client/src/socket.jsx b/client/src/socket.jsx index d4a0c421..d3f91ff4 100644 --- a/client/src/socket.jsx +++ b/client/src/socket.jsx @@ -200,7 +200,7 @@ function createSocket(events) { let pongTimeout; function onPong() { events.setPing(Date.now() - ping); - pongTimeout = setTimeout(sendPing, 1000); + // pongTimeout = setTimeout(sendPing, 1000); } // ------------- diff --git a/ops/package.json b/ops/package.json index 75a489af..69c69d72 100755 --- a/ops/package.json +++ b/ops/package.json @@ -1,6 +1,6 @@ { "name": "mnml-ops", - "version": "1.2.0", + "version": "1.3.0", "description": "", "main": "index.js", "scripts": { diff --git a/server/Cargo.toml b/server/Cargo.toml index 06eb0264..26856718 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mnml" -version = "1.2.0" +version = "1.3.0" authors = ["ntr "] [dependencies] diff --git a/server/src/account.rs b/server/src/account.rs index 716c9b10..db90e6a6 100644 --- a/server/src/account.rs +++ b/server/src/account.rs @@ -10,7 +10,7 @@ use postgres::transaction::Transaction; use http::MnmlHttpError; use names::{name as generate_name}; -use construct::{Construct, construct_recover, construct_spawn}; +use construct::{Construct, ConstructSkeleton, construct_spawn}; use instance::{Instance, instance_delete}; use mtx::{Mtx, FREE_MTX}; use pg::Db; @@ -350,23 +350,20 @@ pub fn constructs(tx: &mut Transaction, account: &Account) -> Result, _> = result.iter() - .map(|row| { + let mut constructs = result.iter() + .filter_map(|row| { let construct_bytes: Vec = row.get(0); - match from_slice::(&construct_bytes) { - Ok(c) => Ok(c), - Err(_e) => construct_recover(construct_bytes, tx), + match from_slice::(&construct_bytes) { + Ok(s) => Some(s), + Err(e) => { + warn!("{:?}", e); + None + }, } }) - .collect(); + .map(|sk| Construct::from_skeleton(&sk)) + .collect::>(); - // catch any errors - if constructs.is_err() { - warn!("{:?}", constructs); - return Err(err_msg("could not deserialise a construct")); - } - - let mut constructs = constructs.unwrap(); constructs.sort_by_key(|c| c.id); return Ok(constructs); } @@ -382,23 +379,19 @@ pub fn team(tx: &mut Transaction, account: &Account) -> Result, E let result = tx .query(query, &[&account.id])?; - let constructs: Result, _> = result.iter() - .map(|row| { + let mut constructs = result.iter() + .filter_map(|row| { let construct_bytes: Vec = row.get(0); - match from_slice::(&construct_bytes) { - Ok(c) => Ok(c), - Err(_e) => construct_recover(construct_bytes, tx), + match from_slice::(&construct_bytes) { + Ok(s) => Some(s), + Err(e) => { + warn!("{:?}", e); + None + }, } }) - .collect(); - - // catch any errors - if constructs.is_err() { - warn!("{:?}", constructs); - return Err(err_msg("could not deserialise a construct")); - } - - let mut constructs = constructs.unwrap(); + .map(|sk| Construct::from_skeleton(&sk)) + .collect::>(); if constructs.len() != 3 { return Err(format_err!("team not size 3 account={:?}", account)); diff --git a/server/src/construct.rs b/server/src/construct.rs index 5f2e0bb5..c7a4f35c 100644 --- a/server/src/construct.rs +++ b/server/src/construct.rs @@ -187,9 +187,10 @@ impl ConstructStat { } #[derive(Debug,Clone,Serialize,Deserialize)] -pub struct ConstructRecover { +pub struct ConstructSkeleton { pub id: Uuid, pub account: Uuid, + pub img: Uuid, pub name: String, } @@ -236,6 +237,27 @@ impl Construct { }; } + pub fn from_skeleton(skeleton: &ConstructSkeleton) -> Construct { + return Construct { + id: skeleton.id, + account: skeleton.id, + img: skeleton.img, + name: skeleton.name.clone(), + + .. Construct::new() + }; + } + + pub fn to_skeleton(&self) -> ConstructSkeleton { + ConstructSkeleton { + id: self.id, + account: self.id, + img: self.img, + name: self.name.clone(), + } + } + + pub fn named(mut self, name: &String) -> Construct { self.name = name.clone(); self @@ -827,10 +849,9 @@ pub fn construct_get(tx: &mut Transaction, id: Uuid, account_id: Uuid) -> Result let result = result.iter().next().ok_or(format_err!("construct {:} not found", id))?; let construct_bytes: Vec = result.get(0); - let construct = from_slice::(&construct_bytes) - .or_else(|_| construct_recover(construct_bytes, tx))?; + let skeleton = from_slice::(&construct_bytes)?; - return Ok(construct); + return Ok(Construct::from_skeleton(&skeleton)); } pub fn construct_select(tx: &mut Transaction, id: Uuid, account_id: Uuid) -> Result { @@ -847,10 +868,9 @@ pub fn construct_select(tx: &mut Transaction, id: Uuid, account_id: Uuid) -> Res let result = result.iter().next().ok_or(format_err!("construct {:} not found", id))?; let construct_bytes: Vec = result.get(0); - let construct = from_slice::(&construct_bytes) - .or_else(|_| construct_recover(construct_bytes, tx))?; + let skeleton = from_slice::(&construct_bytes)?; - return Ok(construct); + return Ok(Construct::from_skeleton(&skeleton)); } pub fn construct_spawn(tx: &mut Transaction, account: Uuid, name: String, team: bool) -> Result { @@ -878,7 +898,7 @@ pub fn construct_spawn(tx: &mut Transaction, account: Uuid, name: String, team: } pub fn construct_write(tx: &mut Transaction, construct: Construct) -> Result { - let construct_bytes = to_vec(&construct)?; + let construct_bytes = to_vec(&construct.to_skeleton())?; let query = " UPDATE constructs @@ -897,20 +917,6 @@ pub fn construct_write(tx: &mut Transaction, construct: Construct) -> Result, tx: &mut Transaction) -> Result { - let c = from_slice::(&construct_bytes)?; - - let mut construct = Construct::new() - .named(&c.name) - .set_account(c.account); - - construct.id = c.id; - - info!("recovered construct {:?}", c.name); - - return construct_write(tx, construct); -} - #[cfg(test)] mod tests { use construct::*; diff --git a/server/src/events.rs b/server/src/events.rs index ca1ce5af..da9fe692 100644 --- a/server/src/events.rs +++ b/server/src/events.rs @@ -132,12 +132,12 @@ impl Events { }, Event::Subscribe(id, obj) => { - info!("subscribe id={:?} object={:?}", id, obj); + trace!("subscribe id={:?} object={:?}", id, obj); match self.clients.get_mut(&id) { Some(client) => { client.subs.insert(obj); - info!("client={:?} subscriptions={:?}", id, client.subs.len()); + trace!("client={:?} subscriptions={:?}", id, client.subs.len()); Ok(()) }, None => return Err(format_err!("unknown client {:?}", id)) @@ -145,12 +145,12 @@ impl Events { }, Event::Unsubscribe(id, obj) => { - info!("unsubscribe id={:?} object={:?}", id, obj); + trace!("unsubscribe id={:?} object={:?}", id, obj); match self.clients.get_mut(&id) { Some(mut client) => { client.subs.remove(&obj); - info!("unsubscribe subscriptions removed={:?}", client.subs.len()); + trace!("unsubscribe subscriptions removed={:?}", client.subs.len()); Ok(()) }, None => return Err(format_err!("unknown client {:?}", id)) @@ -158,7 +158,7 @@ impl Events { }, Event::Push(id, msg) => { - info!("push id={:?}", id); + trace!("push id={:?}", id); let mut subs = 0; let mut dead = vec![]; @@ -177,11 +177,11 @@ impl Events { } if !dead.is_empty() { - info!("dead connections={:?}", dead.len()); + trace!("dead connections={:?}", dead.len()); dead.iter().for_each(|id| self.remove_client(*id)); } - info!("push subscribers={:?}", subs); + trace!("push subscribers={:?}", subs); Ok(()) }, diff --git a/server/src/item.rs b/server/src/item.rs index 67efb76e..a2d4b5cf 100644 --- a/server/src/item.rs +++ b/server/src/item.rs @@ -88,181 +88,181 @@ pub enum Item { AmplifyPlus, #[serde(rename = "Amplify++")] AmplifyPlusPlus, - + Absorb, #[serde(rename = "Absorb+")] AbsorbPlus, #[serde(rename = "Absorb++")] AbsorbPlusPlus, - + Banish, #[serde(rename = "Banish+")] BanishPlus, #[serde(rename = "Banish++")] BanishPlusPlus, - + Bash, #[serde(rename = "Bash+")] BashPlus, #[serde(rename = "Bash++")] BashPlusPlus, - + Blast, #[serde(rename = "Blast+")] BlastPlus, #[serde(rename = "Blast++")] BlastPlusPlus, - + Chaos, #[serde(rename = "Chaos+")] ChaosPlus, #[serde(rename = "Chaos++")] ChaosPlusPlus, - + Sustain, #[serde(rename = "Sustain+")] SustainPlus, #[serde(rename = "Sustain++")] SustainPlusPlus, - + Electrify, #[serde(rename = "Electrify+")] ElectrifyPlus, #[serde(rename = "Electrify++")] ElectrifyPlusPlus, - + Curse, #[serde(rename = "Curse+")] CursePlus, #[serde(rename = "Curse++")] CursePlusPlus, - + Decay, #[serde(rename = "Decay+")] DecayPlus, #[serde(rename = "Decay++")] DecayPlusPlus, - + Hex, #[serde(rename = "Hex+")] HexPlus, #[serde(rename = "Hex++")] HexPlusPlus, - + Haste, #[serde(rename = "Haste+")] HastePlus, #[serde(rename = "Haste++")] HastePlusPlus, - + Heal, #[serde(rename = "Heal+")] HealPlus, #[serde(rename = "Heal++")] HealPlusPlus, - + Hybrid, #[serde(rename = "Hybrid+")] HybridPlus, #[serde(rename = "Hybrid++")] HybridPlusPlus, - + Invert, #[serde(rename = "Invert+")] InvertPlus, #[serde(rename = "Invert++")] InvertPlusPlus, - + Counter, #[serde(rename = "Counter+")] CounterPlus, #[serde(rename = "Counter++")] CounterPlusPlus, - + Purge, #[serde(rename = "Purge+")] PurgePlus, #[serde(rename = "Purge++")] PurgePlusPlus, - + Purify, #[serde(rename = "Purify+")] PurifyPlus, #[serde(rename = "Purify++")] PurifyPlusPlus, - + Reflect, #[serde(rename = "Reflect+")] ReflectPlus, #[serde(rename = "Reflect++")] ReflectPlusPlus, - + Recharge, #[serde(rename = "Recharge+")] RechargePlus, #[serde(rename = "Recharge++")] RechargePlusPlus, - + Ruin, #[serde(rename = "Ruin+")] RuinPlus, #[serde(rename = "Ruin++")] RuinPlusPlus, - + Link, #[serde(rename = "Link+")] LinkPlus, #[serde(rename = "Link++")] LinkPlusPlus, - + Silence, #[serde(rename = "Silence+")] SilencePlus, #[serde(rename = "Silence++")] SilencePlusPlus, - + Slay, #[serde(rename = "Slay+")] SlayPlus, #[serde(rename = "Slay++")] SlayPlusPlus, - + Sleep, #[serde(rename = "Sleep+")] SleepPlus, #[serde(rename = "Sleep++")] SleepPlusPlus, - + Restrict, #[serde(rename = "Restrict+")] RestrictPlus, #[serde(rename = "Restrict++")] RestrictPlusPlus, - + Strike, #[serde(rename = "Strike+")] StrikePlus, #[serde(rename = "Strike++")] StrikePlusPlus, - + Siphon, #[serde(rename = "Siphon+")] SiphonPlus, #[serde(rename = "Siphon++")] SiphonPlusPlus, - + Intercept, #[serde(rename = "Intercept+")] InterceptPlus, #[serde(rename = "Intercept++")] InterceptPlusPlus, - + Break, #[serde(rename = "Break+")] BreakPlus, #[serde(rename = "Break++")] BreakPlusPlus, - + Triage, #[serde(rename = "Triage+")] TriagePlus, @@ -748,7 +748,7 @@ impl Item { Item::Counter| Item::CounterPlus | - Item::CounterPlusPlus => format!("Self targetting skill. Recharges RedLife for {:?}% RedPower and blocks red skills for {:?}T. + Item::CounterPlusPlus => format!("Self targetting skill. Recharges RedLife for {:?}% RedPower and blocks red skills for {:?}T. If a red skill is parried the construct will riposte the source dealing {:?}% RedPower as red damage.", self.into_skill().unwrap().multiplier(), self.into_skill().unwrap().effect()[0].get_duration(), diff --git a/server/src/skill.rs b/server/src/skill.rs index abd132a4..c587a465 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -503,181 +503,181 @@ pub enum Skill { AmplifyPlus, #[serde(rename = "Amplify++")] AmplifyPlusPlus, - + Absorb, #[serde(rename = "Absorb+")] AbsorbPlus, #[serde(rename = "Absorb++")] AbsorbPlusPlus, - + Banish, #[serde(rename = "Banish+")] BanishPlus, #[serde(rename = "Banish++")] BanishPlusPlus, - + Bash, #[serde(rename = "Bash+")] BashPlus, #[serde(rename = "Bash++")] BashPlusPlus, - + Blast, #[serde(rename = "Blast+")] BlastPlus, #[serde(rename = "Blast++")] BlastPlusPlus, - + Chaos, #[serde(rename = "Chaos+")] ChaosPlus, #[serde(rename = "Chaos++")] ChaosPlusPlus, - + Sustain, #[serde(rename = "Sustain+")] SustainPlus, #[serde(rename = "Sustain++")] SustainPlusPlus, - + Electrify, #[serde(rename = "Electrify+")] ElectrifyPlus, #[serde(rename = "Electrify++")] ElectrifyPlusPlus, - + Curse, #[serde(rename = "Curse+")] CursePlus, #[serde(rename = "Curse++")] CursePlusPlus, - + Decay, #[serde(rename = "Decay+")] DecayPlus, #[serde(rename = "Decay++")] DecayPlusPlus, - + Hex, #[serde(rename = "Hex+")] HexPlus, #[serde(rename = "Hex++")] HexPlusPlus, - + Haste, #[serde(rename = "Haste+")] HastePlus, #[serde(rename = "Haste++")] HastePlusPlus, - + Heal, #[serde(rename = "Heal+")] HealPlus, #[serde(rename = "Heal++")] HealPlusPlus, - + Hybrid, #[serde(rename = "Hybrid+")] HybridPlus, #[serde(rename = "Hybrid++")] HybridPlusPlus, - + Invert, #[serde(rename = "Invert+")] InvertPlus, #[serde(rename = "Invert++")] InvertPlusPlus, - + Counter, #[serde(rename = "Counter+")] CounterPlus, #[serde(rename = "Counter++")] CounterPlusPlus, - + Purge, #[serde(rename = "Purge+")] PurgePlus, #[serde(rename = "Purge++")] PurgePlusPlus, - + Purify, #[serde(rename = "Purify+")] PurifyPlus, #[serde(rename = "Purify++")] PurifyPlusPlus, - + Reflect, #[serde(rename = "Reflect+")] ReflectPlus, #[serde(rename = "Reflect++")] ReflectPlusPlus, - + Recharge, #[serde(rename = "Recharge+")] RechargePlus, #[serde(rename = "Recharge++")] RechargePlusPlus, - + Ruin, #[serde(rename = "Ruin+")] RuinPlus, #[serde(rename = "Ruin++")] RuinPlusPlus, - + Link, #[serde(rename = "Link+")] LinkPlus, #[serde(rename = "Link++")] LinkPlusPlus, - + Silence, #[serde(rename = "Silence+")] SilencePlus, #[serde(rename = "Silence++")] SilencePlusPlus, - + Slay, #[serde(rename = "Slay+")] SlayPlus, #[serde(rename = "Slay++")] SlayPlusPlus, - + Sleep, #[serde(rename = "Sleep+")] SleepPlus, #[serde(rename = "Sleep++")] SleepPlusPlus, - + Restrict, #[serde(rename = "Restrict+")] RestrictPlus, #[serde(rename = "Restrict++")] RestrictPlusPlus, - + Strike, #[serde(rename = "Strike+")] StrikePlus, #[serde(rename = "Strike++")] StrikePlusPlus, - + Siphon, #[serde(rename = "Siphon+")] SiphonPlus, #[serde(rename = "Siphon++")] SiphonPlusPlus, - + Intercept, #[serde(rename = "Intercept+")] InterceptPlus, #[serde(rename = "Intercept++")] InterceptPlusPlus, - + Break, #[serde(rename = "Break+")] BreakPlus, #[serde(rename = "Break++")] BreakPlusPlus, - + Triage, #[serde(rename = "Triage+")] TriagePlus, @@ -695,7 +695,7 @@ pub enum Skill { CounterAttackPlus, #[serde(rename = "CounterAttack++")] CounterAttackPlusPlus, - + Electrocute, #[serde(rename = "Electrocute+")] ElectrocutePlus, @@ -1758,13 +1758,14 @@ fn purge(source: &mut Construct, target: &mut Construct, mut results: Resolution .event(Event::Removal { effect: ce.effect, construct_effects: target.effects.clone() })); } - let mut turns = 0; + let mut turns = 1; for cs in target.skills.iter_mut() { if Effect::Purge.disables_skill(cs.skill) { turns += 1; } } - if turns > 0 { + + if turns > 1 { let mut effect = skill.effect()[0]; effect.duration = effect.duration * turns; results.push(Resolution::new(source, target).event(target.add_effect(skill, effect)).stages(EventStages::PostOnly));