Merge branch 'release/1.8.0' of ssh://git.mnml.gg:40022/~/mnml into release/1.8.0
This commit is contained in:
commit
8b4c616629
35
CHANGELOG.md
35
CHANGELOG.md
@ -2,6 +2,41 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
This project adheres to [Semantic Versioning](http://semver.org/).
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
||||||
|
|
||||||
|
## [1.8.0] - 2019-10-31
|
||||||
|
# Added
|
||||||
|
- Drag and drop for vbox interactions can be used instead of single click / double click
|
||||||
|
|
||||||
|
- Base white items and be directly equipped from vbox rather than going through the inventory
|
||||||
|
- Useful if you want to equip an item without further combining with colours
|
||||||
|
|
||||||
|
- You can swap skills and specs between constructs without using the inventory
|
||||||
|
|
||||||
|
# Changed
|
||||||
|
|
||||||
|
- Construct life changed
|
||||||
|
- You now start with 800 green life (down from 950)
|
||||||
|
- You now start with 125 red life and blue life (up from 0)
|
||||||
|
|
||||||
|
- Game phase layout
|
||||||
|
- Enemy team effects appear under your construct instead of next to it
|
||||||
|
- Game phase constructs line up symmetrically now
|
||||||
|
|
||||||
|
- Mobile
|
||||||
|
- Tutorial is disabled for mobile view
|
||||||
|
- Landscape is now default view
|
||||||
|
- Vbox phase everything is now in one view
|
||||||
|
- Game constructs and animations are much larger in mobile view
|
||||||
|
|
||||||
|
- Absorb
|
||||||
|
- Reduced duration and cooldown from 2T -> 1T (Absorption duration unchanged)
|
||||||
|
- Absorption damage is now based on all damage taken (previously only green damage taken)
|
||||||
|
- Now recharges blue life based on 95 / 120 / 155 blue power
|
||||||
|
|
||||||
|
- Intercept
|
||||||
|
- Reduced duration to 1T down from 2T
|
||||||
|
- Reduced cooldown to 1T down from 2T
|
||||||
|
|
||||||
|
|
||||||
## [1.7.0] - 2019-10-31
|
## [1.7.0] - 2019-10-31
|
||||||
# Added
|
# Added
|
||||||
- Step by step tutorial
|
- Step by step tutorial
|
||||||
|
|||||||
@ -133,6 +133,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.skills {
|
.skills {
|
||||||
|
z-index: 2;
|
||||||
button {
|
button {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 2em;
|
height: 2em;
|
||||||
@ -144,6 +145,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.effects {
|
.effects {
|
||||||
|
z-index: 2;
|
||||||
grid-area: effects;
|
grid-area: effects;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
@ -230,7 +232,6 @@
|
|||||||
padding-left: 1em;
|
padding-left: 1em;
|
||||||
padding-right: 1em;
|
padding-right: 1em;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-size: 0.8em;
|
|
||||||
svg {
|
svg {
|
||||||
display: inline;
|
display: inline;
|
||||||
height: 1em;
|
height: 1em;
|
||||||
|
|||||||
@ -132,6 +132,7 @@
|
|||||||
grid-area: skills;
|
grid-area: skills;
|
||||||
padding: 0 0.5em;
|
padding: 0 0.5em;
|
||||||
margin-bottom: 0.75em;
|
margin-bottom: 0.75em;
|
||||||
|
z-index: 2;
|
||||||
|
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(3, 1fr);
|
grid-template-columns: repeat(3, 1fr);
|
||||||
@ -149,6 +150,7 @@
|
|||||||
grid-area: specs;
|
grid-area: specs;
|
||||||
padding: 0 0.5em;
|
padding: 0 0.5em;
|
||||||
margin-bottom: 0.75em;
|
margin-bottom: 0.75em;
|
||||||
|
z-index: 2;
|
||||||
|
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(3, 1fr);
|
grid-template-columns: repeat(3, 1fr);
|
||||||
|
|||||||
@ -309,6 +309,7 @@ li {
|
|||||||
background-size: contain;
|
background-size: contain;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-position: center;
|
background-position: center;
|
||||||
|
z-index: 0;
|
||||||
// pointer-events: none;
|
// pointer-events: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -217,7 +217,10 @@ function Construct(props) {
|
|||||||
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<label onDragStart={specClick} key={i} draggable="true" onDragEnd={() => setItemUnequip([])}>
|
<label onDragStart={ev => {
|
||||||
|
ev.dataTransfer.setData('text', '');
|
||||||
|
specClick(ev);
|
||||||
|
}} key={i} draggable="true" onDragEnd={() => setItemUnequip([])}>
|
||||||
<button
|
<button
|
||||||
key={i}
|
key={i}
|
||||||
onClick={specClick}
|
onClick={specClick}
|
||||||
|
|||||||
@ -215,7 +215,10 @@ class Vbox extends preact.Component {
|
|||||||
const vboxObject = shapes[v] ? shapes[v]() : v;
|
const vboxObject = shapes[v] ? shapes[v]() : v;
|
||||||
return (
|
return (
|
||||||
<label draggable='true'
|
<label draggable='true'
|
||||||
onDragStart={ev => ev.dataTransfer.setData('text', '')}
|
onDragStart={ev => {
|
||||||
|
onClick(ev);
|
||||||
|
ev.dataTransfer.setData('text', '')
|
||||||
|
}}
|
||||||
onDragEnd={clearVboxSelected}>
|
onDragEnd={clearVboxSelected}>
|
||||||
<button
|
<button
|
||||||
class={classes}
|
class={classes}
|
||||||
@ -328,7 +331,10 @@ class Vbox extends preact.Component {
|
|||||||
return (
|
return (
|
||||||
<label
|
<label
|
||||||
draggable='true'
|
draggable='true'
|
||||||
onDragStart={ev => ev.dataTransfer.setData('text', '')}
|
onDragStart={ev => {
|
||||||
|
onClick(ev);
|
||||||
|
ev.dataTransfer.setData('text', '');
|
||||||
|
}}
|
||||||
onDragEnd={() => {
|
onDragEnd={() => {
|
||||||
if (combiner.length === 1) combinerChange([]);
|
if (combiner.length === 1) combinerChange([]);
|
||||||
}}>
|
}}>
|
||||||
|
|||||||
@ -719,7 +719,7 @@ impl Item {
|
|||||||
Item::Banish|
|
Item::Banish|
|
||||||
Item::BanishPlus |
|
Item::BanishPlus |
|
||||||
Item::BanishPlusPlus => format!("Banish target for {:?}T.
|
Item::BanishPlusPlus => format!("Banish target for {:?}T.
|
||||||
Deal blue damage and red damage equal to {:?}% target red and blue life.
|
Deal {:?}% target RedLife and BlueLife as red and blue damage respectively.
|
||||||
Banished constructs are immune to all skills and effects.",
|
Banished constructs are immune to all skills and effects.",
|
||||||
self.into_skill().unwrap().effect()[0].get_duration(),
|
self.into_skill().unwrap().effect()[0].get_duration(),
|
||||||
self.into_skill().unwrap().multiplier()),
|
self.into_skill().unwrap().multiplier()),
|
||||||
@ -773,11 +773,12 @@ impl Item {
|
|||||||
Item::Absorb|
|
Item::Absorb|
|
||||||
Item::AbsorbPlus |
|
Item::AbsorbPlus |
|
||||||
Item::AbsorbPlusPlus => format!(
|
Item::AbsorbPlusPlus => format!(
|
||||||
"Gain Absorb for {:?}T. When attacked with Absorb you gain Absorption.
|
"Gain Absorb for {:?}T. Taking damage replaces Absorb with Absorption.
|
||||||
Absorption increases RedPower and BluePower based on Damage taken.
|
Absorption increases RedPower and BluePower based on damage taken.
|
||||||
Absorption lasts {:?}T.",
|
Absorption lasts {:?}T. Recharges BlueLife based on {:?}% BluePower.",
|
||||||
self.into_skill().unwrap().effect()[0].get_duration(),
|
self.into_skill().unwrap().effect()[0].get_duration(),
|
||||||
self.into_skill().unwrap().effect()[0].get_skill().unwrap().effect()[0].get_duration()),
|
self.into_skill().unwrap().effect()[0].get_skill().unwrap().effect()[0].get_duration(),
|
||||||
|
self.into_skill().unwrap().multiplier()),
|
||||||
|
|
||||||
Item::Haste|
|
Item::Haste|
|
||||||
Item::HastePlus |
|
Item::HastePlus |
|
||||||
|
|||||||
@ -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();
|
let mut target = game.construct_by_id(target.id).unwrap().clone();
|
||||||
|
|
||||||
match event {
|
match event {
|
||||||
Event::Damage { amount, skill, mitigation: _, colour: c } => {
|
Event::Damage { amount, skill, mitigation, colour: c } => {
|
||||||
if target.affected(Effect::Electric) && !skill.is_tick() {
|
if target.affected(Effect::Electric) && !skill.is_tick() {
|
||||||
let ConstructEffect { effect: _, duration: _, meta, tick: _ } = target.effects.iter()
|
let ConstructEffect { effect: _, duration: _, meta, tick: _ } = target.effects.iter()
|
||||||
.find(|e| e.effect == Effect::Electric).unwrap().clone();
|
.find(|e| e.effect == Effect::Electric).unwrap().clone();
|
||||||
@ -320,7 +320,7 @@ fn post_resolve(_skill: Skill, game: &mut Game, mut resolutions: Resolutions) ->
|
|||||||
.find(|e| e.effect == Effect::Absorb).unwrap().clone();
|
.find(|e| e.effect == Effect::Absorb).unwrap().clone();
|
||||||
match meta {
|
match meta {
|
||||||
Some(EffectMeta::Skill(s)) => {
|
Some(EffectMeta::Skill(s)) => {
|
||||||
resolutions = absorption(&mut source, &mut target, resolutions, skill, amount, s);
|
resolutions = absorption(&mut source, &mut target, resolutions, skill, amount + mitigation, s);
|
||||||
},
|
},
|
||||||
_ => panic!("no absorb skill"),
|
_ => panic!("no absorb skill"),
|
||||||
};
|
};
|
||||||
@ -833,6 +833,10 @@ impl Skill {
|
|||||||
Skill::HybridBlast => 50,
|
Skill::HybridBlast => 50,
|
||||||
|
|
||||||
Skill::HasteStrike => 60,
|
Skill::HasteStrike => 60,
|
||||||
|
|
||||||
|
Skill::Absorb=> 95,
|
||||||
|
Skill::AbsorbPlus => 120,
|
||||||
|
Skill::AbsorbPlusPlus => 155,
|
||||||
|
|
||||||
Skill::Intercept=> 80,
|
Skill::Intercept=> 80,
|
||||||
Skill::InterceptPlus => 110,
|
Skill::InterceptPlus => 110,
|
||||||
@ -911,11 +915,11 @@ impl Skill {
|
|||||||
Skill::HastePlusPlus => vec![ConstructEffect {effect: Effect::Haste, duration: 5,
|
Skill::HastePlusPlus => vec![ConstructEffect {effect: Effect::Haste, duration: 5,
|
||||||
meta: Some(EffectMeta::Multiplier(225)), tick: None }],
|
meta: Some(EffectMeta::Multiplier(225)), tick: None }],
|
||||||
|
|
||||||
Skill::Absorb => vec![ConstructEffect {effect: Effect::Absorb, duration: 2,
|
Skill::Absorb => vec![ConstructEffect {effect: Effect::Absorb, duration: 1,
|
||||||
meta: Some(EffectMeta::Skill(Skill::Absorption)), tick: None}],
|
meta: Some(EffectMeta::Skill(Skill::Absorption)), tick: None}],
|
||||||
Skill::AbsorbPlus => vec![ConstructEffect {effect: Effect::Absorb, duration: 3,
|
Skill::AbsorbPlus => vec![ConstructEffect {effect: Effect::Absorb, duration: 1,
|
||||||
meta: Some(EffectMeta::Skill(Skill::AbsorptionPlus)), tick: None}],
|
meta: Some(EffectMeta::Skill(Skill::AbsorptionPlus)), tick: None}],
|
||||||
Skill::AbsorbPlusPlus => vec![ConstructEffect {effect: Effect::Absorb, duration: 4,
|
Skill::AbsorbPlusPlus => vec![ConstructEffect {effect: Effect::Absorb, duration: 1,
|
||||||
meta: Some(EffectMeta::Skill(Skill::AbsorptionPlusPlus)), tick: None}],
|
meta: Some(EffectMeta::Skill(Skill::AbsorptionPlusPlus)), tick: None}],
|
||||||
|
|
||||||
Skill::Absorption => vec![ConstructEffect {effect: Effect::Absorption, duration: 3, meta: None, tick: None}],
|
Skill::Absorption => vec![ConstructEffect {effect: Effect::Absorption, duration: 3, meta: None, tick: None}],
|
||||||
@ -1675,6 +1679,19 @@ fn ruin(source: &mut Construct, target: &mut Construct, mut results: Resolutions
|
|||||||
|
|
||||||
fn absorb(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions {
|
fn absorb(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions {
|
||||||
results.push(Resolution::new(source, target).event(target.add_effect(skill, skill.effect()[0])));
|
results.push(Resolution::new(source, target).event(target.add_effect(skill, skill.effect()[0])));
|
||||||
|
let blue_amount = source.blue_power().pct(skill.multiplier());
|
||||||
|
let e = target.recharge(skill, 0, blue_amount);
|
||||||
|
let stages = match e {
|
||||||
|
Event::Recharge { red, blue, skill: _ } => {
|
||||||
|
if red > 0 || blue > 0 { EventStages::PostOnly }
|
||||||
|
else { EventStages::NoStages }
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
warn!("no recharge event found {:?}", e);
|
||||||
|
EventStages::NoStages
|
||||||
|
}
|
||||||
|
};
|
||||||
|
results.push(Resolution::new(source, target).event(e).stages(stages));
|
||||||
return results;;
|
return results;;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user