Merge branch 'release/1.5.2'

This commit is contained in:
ntr 2019-09-30 21:15:11 +10:00
commit 87ffb48b7e
17 changed files with 2850 additions and 194 deletions

View File

@ -1 +1 @@
1.5.1
1.5.2

View File

@ -1,6 +1,6 @@
{
"name": "mnml-client",
"version": "1.5.1",
"version": "1.5.2",
"description": "",
"main": "index.js",
"scripts": {

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 98 KiB

View File

@ -187,6 +187,11 @@
align-self: center;
text-align: center;
height: auto;
svg {
display: inline;
height: 1em;
margin-right: 0.1em
}
}
/* some stupid bug in chrome makes it fill the entire screen */

View File

@ -288,7 +288,7 @@ li {
.logo {
height: 2em;
background-image: url("../../src/components/svgs/menu.logo.svg");
background-image: url("../../assets/mnml.logo.trim.svg");
background-size: contain;
background-repeat: no-repeat;
background-position: left;

View File

@ -3,7 +3,7 @@
font-size: 12pt;
padding: 0;
grid-template-columns: 1fr;
grid-template-rows: 1fr min-content;
grid-template-rows: 10fr 1fr;
grid-template-areas:
"main"
"footer";
@ -31,6 +31,9 @@
footer {
display: flex;
position: fixed;
bottom: 0;
width: 100%;
}
#nav-btn, #instance-nav {

View File

@ -1,6 +1,6 @@
{
"name": "mnml-client",
"version": "1.5.1",
"version": "1.5.2",
"description": "",
"main": "index.js",
"scripts": {

View File

@ -74,8 +74,8 @@ function getObjects(resolution, stages, game, account) {
function getSequence(resolution) {
if (!resolution.event) return [];
if (resolution.event[0] === 'Inversion') return [];
if (['TargetKo', 'Ko'].includes(resolution.event[0])) return [];
if (['Skill', 'AoeSkill'].includes(resolution.event[0])) return ['START_SKILL', 'END_SKILL'];
if (resolution.event[0] === 'Ko') return ['POST_SKILL'];
switch (resolution.stages) {
case 'AllStages': return ['START_SKILL', 'END_SKILL', 'POST_SKILL'];

View File

@ -52,6 +52,8 @@ function GameFooter(props) {
sendInstanceState,
} = props;
if (!game) return false; // ???
const playerTeam = game.players.find(t => t.id === account.id);
function quitClick() {

View File

@ -32,7 +32,7 @@ function Instance(args) {
sendInstanceReady,
} = args;
if (!instance) return false;
const rdyClasses = `ready-btn ready`;
const readyInfo = instance.phase === 'Lobby'
? 'lobbyReady'

View File

@ -106,7 +106,7 @@ function JoinButtons(args) {
try {
document.execCommand('copy');
infoToast('Invite link copied.');
infoToast('Invite link copied to clipboard.');
} catch (err) {
console.error('link copy error', err);
errorToast('Invite link copy error.');

View File

@ -2,12 +2,15 @@ const preact = require('preact');
const { Component } = require('preact');
const { connect } = require('preact-redux');
// const anime = require('animejs').default;
const reactStringReplace = require('react-string-replace');
const throttle = require('lodash/throttle');
const shapes = require('./shapes');
const { removeTier } = require('../utils');
const addState = connect(
({ game, account, animTarget, animating }) =>
({ game, account, animTarget, animating })
({ game, account, animTarget, animating, itemInfo }) =>
({ game, account, animTarget, animating, itemInfo })
);
class TargetSvg extends Component {
@ -25,7 +28,7 @@ class TargetSvg extends Component {
}
render(props, state) {
const { game, account, animating, animTarget } = props;
const { game, account, animating, animTarget, itemInfo } = props;
const { width, height } = state;
if (!game) return false; // game will be null when battle ends
@ -33,9 +36,17 @@ class TargetSvg extends Component {
// just put skill name up
if (animating) {
if (!animTarget) return false;
const itemSource = itemInfo.combos.filter(c => c.item === removeTier(animTarget.skill));
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 (
<h1 class="resolving-skill">{animTarget.skill}</h1>
<div class="resolving-skill">
<h1>{animTarget.skill}</h1>
<div> {itemSourceDescription} </div>
</div>
);
}

View File

@ -1,6 +1,6 @@
{
"name": "mnml-ops",
"version": "1.5.1",
"version": "1.5.2",
"description": "",
"main": "index.js",
"scripts": {

View File

@ -1,6 +1,6 @@
[package]
name = "mnml"
version = "1.5.1"
version = "1.5.2"
authors = ["ntr <ntr@smokestack.io>"]
[dependencies]

View File

@ -967,9 +967,9 @@ mod tests {
construct.apply_modifiers(&player_colours);
assert!(construct.red_power.value == construct.red_power.base + construct.red_power.base.pct(50));
assert!(construct.green_power.value == construct.green_power.base + construct.green_power.base.pct(75));
assert!(construct.blue_power.value == construct.blue_power.base + construct.blue_power.base.pct(100));
assert!(construct.red_power.value == construct.red_power.base + construct.red_power.base.pct(35));
assert!(construct.green_power.value == construct.green_power.base + construct.green_power.base.pct(50));
assert!(construct.blue_power.value == construct.blue_power.base + construct.blue_power.base.pct(70));
return;
}
@ -993,7 +993,7 @@ mod tests {
assert!(construct.red_power.value == construct.red_power.base + construct.red_power.base.pct(10));
assert!(construct.green_power.value == construct.green_power.base + construct.green_power.base.pct(10));
assert!(construct.blue_power.value == construct.blue_power.base + construct.blue_power.base.pct(10));
assert!(construct.green_life.value == construct.green_life.base + 100);
assert!(construct.green_life.value == construct.green_life.base + 125);
return;
}
@ -1039,7 +1039,7 @@ mod tests {
construct.apply_modifiers(&player_colours);
assert!(construct.red_power.value == construct.red_power.base + construct.red_power.base.pct(50));
assert!(construct.red_power.value == construct.red_power.base + construct.red_power.base.pct(35));
assert!(construct.green_power.value == construct.green_power.base + construct.green_power.base.pct(25));
assert!(construct.blue_power.value == construct.blue_power.base + construct.blue_power.base.pct(25));

View File

@ -305,7 +305,7 @@ fn post_resolve(_skill: Skill, game: &mut Game, mut resolutions: Resolutions) ->
};
}
if target.affected(Effect::Absorb) {
if target.affected(Effect::Absorb) && !target.is_ko() {
let ConstructEffect { effect: _, duration: _, meta, tick: _ } = target.effects.iter()
.find(|e| e.effect == Effect::Absorb).unwrap().clone();
match meta {
@ -316,7 +316,7 @@ fn post_resolve(_skill: Skill, game: &mut Game, mut resolutions: Resolutions) ->
};
}
if c == Colour::Red {
if target.affected(Effect::Counter) {
if target.affected(Effect::Counter) && !target.is_ko() {
let ConstructEffect { effect: _, duration: _, meta, tick: _ } = target.effects.iter()
.find(|e| e.effect == Effect::Counter).unwrap().clone();
match meta {
@ -717,27 +717,28 @@ impl Skill {
Skill::Attack => 80, // Base
Skill::Blast=> 110, // BB
Skill::BlastPlus => 130, // BB
Skill::BlastPlusPlus => 150, // BB
Skill::BlastPlus => 145, // BB
Skill::BlastPlusPlus => 210, // BB
Skill::Chaos=> 40, // BR
Skill::ChaosPlus => 50, // BR
Skill::ChaosPlusPlus => 60, // BR
Skill::ChaosPlus => 65, // BR
Skill::ChaosPlusPlus => 90, // BR
Skill::Heal=> 125, //GG
Skill::HealPlus => 185, //GG
Skill::HealPlusPlus => 270, //GG
Skill::Heal=> 130, //GG
Skill::HealPlus => 160, //GG
Skill::HealPlusPlus => 200, //GG
Skill::SiphonTick=> 40, // GB
Skill::SiphonTickPlus => 70,
Skill::SiphonTickPlusPlus => 110,
Skill::SiphonTickPlus => 50,
Skill::SiphonTickPlusPlus => 60,
Skill::Slay=> 70, // RG
Skill::SlayPlus => 90,
Skill::SlayPlusPlus => 120,
Skill::SlayPlus => 115,
Skill::SlayPlusPlus => 180,
Skill::Strike=> 90, //RR
Skill::StrikePlus => 110,
Skill::StrikePlusPlus => 140,
Skill::StrikePlus => 140,
Skill::StrikePlusPlus => 200,
// Block Base
Skill::ElectrocuteTick=> 80,
@ -1583,9 +1584,17 @@ fn absorb(source: &mut Construct, target: &mut Construct, mut results: Resolutio
fn absorption(source: &mut Construct, target: &mut Construct, mut results: Resolutions, reflect_skill: Skill, amount: u64, skill: Skill) -> Resolutions {
let absorb = skill.effect()[0].set_meta(EffectMeta::AddedDamage(amount));
results.push(Resolution::new(source, target)
.event(target.add_effect(reflect_skill, absorb))
.stages(EventStages::PostOnly));
let absorb_index = target.effects.iter().position(|e| e.effect == Effect::Absorb).expect("No absorb");
let ce = target.effects.remove(absorb_index);
results.push(Resolution::new(source, target)
.event(Event::Removal { effect: ce.effect, construct_effects: target.effects.clone() })
.stages(EventStages::PostOnly));
return results;;
}

View File

@ -174,161 +174,161 @@ impl Spec {
Spec::PowerRR=> SpecValues {
base: 25,
bonuses: vec![
SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 25 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 25 },
SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 25 }
SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 10 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 15 },
SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 20 }
],
},
Spec::PowerGG=> SpecValues {
base: 25,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 25 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 25 },
SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 25 }
SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 10 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 15 },
SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 20 }
],
},
Spec::PowerBB=> SpecValues {
base: 25,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 25 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 25 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 25 }
SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 10 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 15 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 20 }
],
},
Spec::PowerRG=> SpecValues {
base: 15,
base: 20,
bonuses: vec![
SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 15 },
SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 15 },
SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 5 },
SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 10 },
SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 15 }
],
},
Spec::PowerGB=> SpecValues {
base: 15,
base: 20,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 15 },
SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 15 },
SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 5 },
SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 10 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 15 }
],
},
Spec::PowerRB=> SpecValues {
base: 15,
base: 20,
bonuses: vec![
SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 15 },
SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 15 },
SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 5 },
SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 10 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 15 }
],
},
Spec::PowerRRPlus => SpecValues {
base: 40,
base: 45,
bonuses: vec![
SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 40 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 40 },
SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 40 }
SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 15 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 25 },
SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 35 }
],
},
Spec::PowerGGPlus => SpecValues {
base: 40,
base: 45,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 40 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 40 },
SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 40 }
SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 15 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 25 },
SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 35 }
],
},
Spec::PowerBBPlus => SpecValues {
base: 40,
base: 45,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 40 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 40 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 40 }
SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 15 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 25 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 35 }
],
},
Spec::PowerRGPlus => SpecValues {
base: 25,
base: 35,
bonuses: vec![
SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 25 },
SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 25 },
SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 10 },
SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 20 },
SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 25 }
],
},
Spec::PowerGBPlus => SpecValues {
base: 25,
base: 35,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 25 },
SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 25 },
SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 10 },
SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 20 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 25 }
],
},
Spec::PowerRBPlus => SpecValues {
base: 25,
base: 35,
bonuses: vec![
SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 25 },
SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 25 },
SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 10 },
SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 20 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 25 }
],
},
Spec::PowerRRPlusPlus => SpecValues {
base: 60,
base: 80,
bonuses: vec![
SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 60 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 60 },
SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 25 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 45 },
SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 60 }
],
},
Spec::PowerGGPlusPlus => SpecValues {
base: 60,
base: 80,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 60 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 60 },
SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 25 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 45 },
SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 60 }
],
},
Spec::PowerBBPlusPlus => SpecValues {
base: 60,
base: 80,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 60 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 60 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 25 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 45 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 60 }
],
},
Spec::PowerRGPlusPlus => SpecValues {
base: 40,
base: 60,
bonuses: vec![
SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 40 },
SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 40 },
SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 40 }
SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 20 },
SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 30 },
SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 45 }
],
},
Spec::PowerGBPlusPlus => SpecValues {
base: 40,
base: 60,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 40 },
SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 40 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 40 }
SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 20 },
SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 30 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 45 }
],
},
Spec::PowerRBPlusPlus => SpecValues {
base: 40,
base: 60,
bonuses: vec![
SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 40 },
SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 40 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 40 }
SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 20 },
SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 30 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 45 }
],
},
@ -500,167 +500,167 @@ impl Spec {
},
Spec::Life => SpecValues {
base: 100,
base: 125,
bonuses: vec![]},
Spec::LifeRR=> SpecValues {
base: 200,
base: 275,
bonuses: vec![
SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 100 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 100 },
SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 100 }
SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 75 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 125 },
SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 175 }
],
},
Spec::LifeGG=> SpecValues {
base: 200,
base: 225,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 100 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 100 },
SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 100 }
SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 50 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 75 },
SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 125 }
],
},
Spec::LifeBB=> SpecValues {
base: 200,
base: 275,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 100 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 100 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 100 }
SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 75 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 125 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 175 }
],
},
Spec::LifeRG=> SpecValues {
base: 150,
base: 125,
bonuses: vec![
SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 75 },
SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 50 },
SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 75 },
SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 75 }
SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 125 }
],
},
Spec::LifeGB=> SpecValues {
base: 150,
base: 125,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 75 },
SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 50 },
SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 75 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 75 }
SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 125 }
],
},
Spec::LifeRB=> SpecValues {
base: 150,
base: 175,
bonuses: vec![
SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 75 },
SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 50 },
SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 75 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 75 }
SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 125 }
],
},
Spec::LifeRRPlus => SpecValues {
base: 300,
base: 500,
bonuses: vec![
SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 150 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 150 },
SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 150 }
],
},
Spec::LifeGGPlus => SpecValues {
base: 300,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 150 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 150 },
SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 150 }
],
},
Spec::LifeBBPlus => SpecValues {
base: 300,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 150 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 150 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 150 }
],
},
Spec::LifeRGPlus => SpecValues {
base: 200,
bonuses: vec![
SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 100 },
SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 100 },
SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 100 }
],
},
Spec::LifeGBPlus => SpecValues {
base: 200,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 100 },
SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 100 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 100 }
],
},
Spec::LifeRBPlus => SpecValues {
base: 200,
bonuses: vec![
SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 100 },
SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 100 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 100 }
],
},
Spec::LifeRRPlusPlus => SpecValues {
base: 300,
bonuses: vec![
SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 300 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 300 },
SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 125 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 225 },
SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 300 }
],
},
Spec::LifeGGPlusPlus => SpecValues {
base: 300,
Spec::LifeGGPlus => SpecValues {
base: 400,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 300 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 300 },
SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 90 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 130 },
SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 225 }
],
},
Spec::LifeBBPlus => SpecValues {
base: 500,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 125 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 225 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 300 }
],
},
Spec::LifeRGPlus => SpecValues {
base: 225,
bonuses: vec![
SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 100 },
SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 150 },
SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 225 }
],
},
Spec::LifeGBPlus => SpecValues {
base: 225,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 100 },
SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 150 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 225 }
],
},
Spec::LifeRBPlus => SpecValues {
base: 350,
bonuses: vec![
SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 100 },
SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 150 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 225 }
],
},
Spec::LifeRRPlusPlus => SpecValues {
base: 875,
bonuses: vec![
SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 225 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 400 },
SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 525 }
],
},
Spec::LifeGGPlusPlus => SpecValues {
base: 475,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 130 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 225 },
SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 300 }
],
},
Spec::LifeBBPlusPlus => SpecValues {
base: 300,
base: 875,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 300 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 300 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 300 }
SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 225 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 400 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 525 }
],
},
Spec::LifeRGPlusPlus => SpecValues {
base: 200,
base: 400,
bonuses: vec![
SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 200 },
SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 200 },
SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 200 }
SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 175 },
SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 275 },
SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 400 }
],
},
Spec::LifeGBPlusPlus => SpecValues {
base: 200,
base: 625,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 200 },
SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 200 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 200 }
SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 175 },
SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 275 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 400 }
],
},
Spec::LifeRBPlusPlus => SpecValues {
base: 200,
base: 400,
bonuses: vec![
SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 200 },
SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 200 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 200 }
SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 175 },
SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 275 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 400 }
],
},
}