Entered skill trees for siren and operative

This commit is contained in:
Joshua Seigler 2019-05-03 14:11:03 -04:00
parent f728676e72
commit fe109c9f8c
11 changed files with 465 additions and 81 deletions

78
package-lock.json generated
View file

@ -4737,14 +4737,6 @@
"integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
"dev": true "dev": true
}, },
"immutability-helper": {
"version": "2.9.1",
"resolved": "https://registry.npmjs.org/immutability-helper/-/immutability-helper-2.9.1.tgz",
"integrity": "sha512-r/RmRG8xO06s/k+PIaif2r5rGc3j4Yhc01jSBfwPCXDLYZwp/yxralI37Df1mwmuzcCsen/E/ITKcTEvc1PQmQ==",
"requires": {
"invariant": "^2.2.0"
}
},
"import-cwd": { "import-cwd": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz",
@ -4831,6 +4823,7 @@
"version": "2.2.4", "version": "2.2.4",
"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
"integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
"dev": true,
"requires": { "requires": {
"loose-envify": "^1.0.0" "loose-envify": "^1.0.0"
} }
@ -5141,7 +5134,8 @@
"js-tokens": { "js-tokens": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true
}, },
"js-yaml": { "js-yaml": {
"version": "3.13.1", "version": "3.13.1",
@ -5320,6 +5314,7 @@
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"dev": true,
"requires": { "requires": {
"js-tokens": "^3.0.0 || ^4.0.0" "js-tokens": "^3.0.0 || ^4.0.0"
} }
@ -5843,7 +5838,8 @@
"object-assign": { "object-assign": {
"version": "4.1.1", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"dev": true
}, },
"object-copy": { "object-copy": {
"version": "0.1.0", "version": "0.1.0",
@ -6836,39 +6832,14 @@
"dev": true "dev": true
}, },
"preact": { "preact": {
"version": "8.4.2", "version": "10.0.0-beta.1",
"resolved": "https://registry.npmjs.org/preact/-/preact-8.4.2.tgz", "resolved": "https://registry.npmjs.org/preact/-/preact-10.0.0-beta.1.tgz",
"integrity": "sha512-TsINETWiisfB6RTk0wh3/mvxbGRvx+ljeBccZ4Z6MPFKgu/KFGyf2Bmw3Z/jlXhL5JlNKY6QAbA9PVyzIy9//A==" "integrity": "sha512-1uhj3JXOEzEPUof5t/iQW5heEvTOpexwS0FLAjJQfgfT8OCXICyzI2TwkYyFJ+W9q9GsDmhZgFagH2G0akFveQ=="
},
"preact-compat": {
"version": "3.18.5",
"resolved": "https://registry.npmjs.org/preact-compat/-/preact-compat-3.18.5.tgz",
"integrity": "sha512-F174NW6PI5GU+T28B0ZHblhxMsFaPVaSBiaE++xrxdDVunsO0mARYfOSZizTdb/PFLqXDzcQ1IWdnEt/vIiUvw==",
"requires": {
"immutability-helper": "^2.7.1",
"preact-render-to-string": "^3.8.2",
"preact-transition-group": "^1.1.1",
"prop-types": "^15.6.2",
"standalone-react-addons-pure-render-mixin": "^0.1.1"
}
},
"preact-render-to-string": {
"version": "3.8.2",
"resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-3.8.2.tgz",
"integrity": "sha512-przuZPajiurStGgxMoJP0EJeC4xj5CgHv+M7GfF3YxAdhGgEWAkhOSE0xympAFN20uMayntBZpttIZqqLl77fw==",
"requires": {
"pretty-format": "^3.5.1"
}
}, },
"preact-router": { "preact-router": {
"version": "2.6.1", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/preact-router/-/preact-router-2.6.1.tgz", "resolved": "https://registry.npmjs.org/preact-router/-/preact-router-3.0.0.tgz",
"integrity": "sha512-Ql3fptQ8hiioIw5zUcWUq5NShl7yFR4e6KBUzLbGI7+HKMIgBnH+aOITN5IrY1rbr2vhKXBdHdd9nLbbjcJTOQ==" "integrity": "sha512-v/dTwXa0TAeP2NTf4YFvT+TygejoSxN4Un9y90sNJiM/r6EY6wqBEoxmCdTTz5Yb101iP3Zuwr+4Wby7ZY1S+w=="
},
"preact-transition-group": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/preact-transition-group/-/preact-transition-group-1.1.1.tgz",
"integrity": "sha1-8KSTJ+pRXs406ivoZMSn0p5dbhA="
}, },
"pretty-error": { "pretty-error": {
"version": "2.1.1", "version": "2.1.1",
@ -6880,11 +6851,6 @@
"utila": "~0.4" "utila": "~0.4"
} }
}, },
"pretty-format": {
"version": "3.8.0",
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz",
"integrity": "sha1-v77VbV6ad2ZF9LH/eqGjrE+jw4U="
},
"private": { "private": {
"version": "0.1.8", "version": "0.1.8",
"resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
@ -6919,16 +6885,6 @@
"sisteransi": "^1.0.0" "sisteransi": "^1.0.0"
} }
}, },
"prop-types": {
"version": "15.7.2",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
"integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
"requires": {
"loose-envify": "^1.4.0",
"object-assign": "^4.1.1",
"react-is": "^16.8.1"
}
},
"proxy-addr": { "proxy-addr": {
"version": "2.0.5", "version": "2.0.5",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
@ -7071,11 +7027,6 @@
"integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=",
"dev": true "dev": true
}, },
"react-is": {
"version": "16.8.6",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz",
"integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA=="
},
"readable-stream": { "readable-stream": {
"version": "3.3.0", "version": "3.3.0",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz",
@ -7901,11 +7852,6 @@
"integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
"dev": true "dev": true
}, },
"standalone-react-addons-pure-render-mixin": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/standalone-react-addons-pure-render-mixin/-/standalone-react-addons-pure-render-mixin-0.1.1.tgz",
"integrity": "sha1-PHQJ9MecQN6axyxhbPZ5qZTzdVE="
},
"static-extend": { "static-extend": {
"version": "0.1.2", "version": "0.1.2",
"resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",

View file

@ -6,9 +6,8 @@
"watch": "pwa watch" "watch": "pwa watch"
}, },
"dependencies": { "dependencies": {
"preact": "^8.3.0", "preact": "^10.0.0-beta.1",
"preact-compat": "^3.18.0", "preact-router": "^3.0.0",
"preact-router": "latest",
"sirv-cli": "^0.2.0" "sirv-cli": "^0.2.0"
}, },
"devDependencies": { "devDependencies": {

7
pwa.config.js Normal file
View file

@ -0,0 +1,7 @@
const path = require('path');
exports.webpack = function (config, env) {
let { production, webpack } = env;
config.resolve.alias['@constants'] = path.resolve(__dirname, 'src/constants');
config.resolve.alias['preact-compat'] = 'preact/compact';
}

View file

@ -16,7 +16,7 @@ export default function App() {
<main> <main>
<Router> <Router>
<Home path="/" /> <Home path="/" />
<Zane path="/Zane" /> <Zane path="/operative" />
</Router> </Router>
</main> </main>

View file

@ -7,8 +7,10 @@ export default function Nav (props) {
<nav class={ style.nav }> <nav class={ style.nav }>
<ul class={ style.links }> <ul class={ style.links }>
<li><Link href="/">Home</Link></li> <li><Link href="/">Home</Link></li>
<li><Link href="/Zane">Zane</Link></li> <li><Link href="/operative">Zane</Link></li>
<li><Link href="/Amara">Amara</Link></li> <li><Link href="/siren">Amara</Link></li>
<li><Link href="/beastmaster">FL4K</Link></li>
<li><Link href="/bot-jock">Moze</Link></li>
</ul> </ul>
</nav> </nav>
); );

View file

@ -1,3 +1,106 @@
pre { .VaultHunter {
white-space: pre-wrap; display: flex;
} flex-direction: column;
align-items: center;
}
.trees, .tier {
display: flex;
}
.treeName {
text-align: center;
color: white;
order: 1;
font-size: 1em;
}
.tree {
display: flex;
flex-direction: column;
margin: 1rem;
background-image: linear-gradient(0deg, var(--themeColor), var(--themeColor));
background-size: calc(3.5rem * 3) calc(100% - 1.5rem);
background-repeat: no-repeat;
background-position: center bottom;
}
.tier {
width: calc(3.5rem * 5);
justify-content: center;
position: relative;
}
.skill {
position: relative;
z-index: 1;
flex: 0 1 auto;
margin: 0.5rem;
padding: 0rem;
height: 2.5rem;
width: 2.5rem;
line-height: 1;
display: flex;
text-align: center;
justify-content: center;
align-items: center;
color: white;
}
.skill:before {
content: '';
background-color: #333;
position: absolute;
bottom: 0;
right: 0;
height: 100%;
width: 100%;
z-index: -1;
}
.skill.bought:before {
background-color: #A70;
}
.actionSkill:before {
clip-path: polygon(50% 0%, 93.3% 25%, 93.3% 75%, 50% 100%, 6.7% 75%, 6.7% 25%);
}
.chevron:before {
clip-path: polygon(0 0, 50% 25%, 100% 0, 100% 75%, 50% 100%, 0 75%);
}
.diamond:before {
clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0 50%);
}
.augment, .actionSkill {
margin: 0.25rem;
padding: 0.25rem;
height: 3em;
width: 3em;
}
.augment {
outline: 0.25em solid var(--themeColor);
background-color: var(--themeColor);
}
.augment:first-child {
position: absolute;
left: 0;
}
.augment:last-child {
position: absolute;
right: 0;
}
.blue {
--themeColor: #007;
}
.red {
--themeColor: #700;
}
.green {
--themeColor: #070;
}

View file

@ -1,10 +1,50 @@
import { useState } from 'preact/hooks';
import SKILLS from '@constants/skills';
import style from './index.css'; import style from './index.css';
export default function VaultHunter ({name = 'Unnamed', skills = {}}) { function getInitials(string) {
const initials = string.match(/\b\w/g) || [];
return ((initials.shift() || '') + (initials.pop() || '')).toUpperCase();
}
export default function VaultHunter ({name = 'Unnamed', discipline = 'Classless', skills = {}}) {
const [build, setBuild] = useState(skills);
const trees =
Object.keys(build).map((treename, index) =>
<div class={ `${style.tree} ${[style.blue, style.red, style.green][index]}` }>
<h2 class={ style.treeName }>{ treename }</h2>
{ Object.keys(build[treename]).map(tier =>
<div class={ style.tier }>
{ Object.keys(build[treename][tier]).map(skillname => {
const skill = build[treename][tier][skillname];
const isAugment = [SKILLS.AUGMENT_CHEVRON, SKILLS.AUGMENT_DIAMOND].includes(skill.type);
let shapeStyle = null;
if (skill.type === SKILLS.AUGMENT_CHEVRON) { shapeStyle = style.chevron; }
if (skill.type === SKILLS.AUGMENT_DIAMOND) { shapeStyle = style.diamond; }
if (skill.type === SKILLS.ACTION_SKILL) { shapeStyle = style.actionSkill; }
return (
<div class={ [
style.skill,
isAugment ? style.augment : '',
shapeStyle,
skill.bought ? style.bought : '',
].join(' ') }>
{ getInitials(skillname) }
</div>
)
} ) }
</div>
) }
</div>
);
return ( return (
<div> <div class={ style.VaultHunter }>
<h2>{ name }</h2> <h2>{ name } the { discipline }</h2>
<pre>{JSON.stringify(skills, null, 2)}</pre> <div class={ style.trees }>
</div> { trees }
</div>
</div>
); );
} }

5
src/constants/skills.js Normal file
View file

@ -0,0 +1,5 @@
export default {
ACTION_SKILL: 1,
AUGMENT_CHEVRON: 2,
AUGMENT_DIAMOND: 3,
}

View file

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<title>PWA</title> <title>Borderlands 3 Skill Planner</title>
<meta charset="utf-8"/> <meta charset="utf-8"/>
<meta name="theme-color" content="#1e88e5"/> <meta name="theme-color" content="#1e88e5"/>
<meta name="mobile-web-app-capable" content="yes"/> <meta name="mobile-web-app-capable" content="yes"/>

View file

@ -6,6 +6,7 @@ export default function Zane () {
return ( return (
<VaultHunter <VaultHunter
name = 'Zane' name = 'Zane'
discipline = 'Operative'
skills = { skills } skills = { skills }
/> />
); );

View file

@ -1,70 +1,351 @@
import SKILLS from '@constants/skills';
const skills = { const skills = {
"Hitman": { "Hitman": {
"0": { "0": {
"SNTNL": { "SNTNL": {
text: "Send into battle an automated SNTL drone that continually flies through the environment and attacks enemies with its Machine Guns. Pressing LB or RB (controller) while SNTNL is active causes it to attack the enemy under Zane's crosshairs, if any.", text: "Send into battle an automated SNTL drone that continually flies through the environment and attacks enemies with its Machine Guns. Pressing LB or RB (controller) while SNTNL is active causes it to attack the enemy under Zane's crosshairs, if any.",
effect: rank => `Machine Gun Damage - 10, Duration - 24 sec, Cooldown - 36 sec`,
type: SKILLS.ACTION_SKILL,
bought: true,
} }
}, },
"1": { "1": {
"Violent Speed": { "Violent Speed": {
text: "After killing an enemy, Zane gains increased Movement Speed for a few seconds.", text: "After killing an enemy, Zane gains increased Movement Speed for a few seconds.",
ranks: 5,
effect: rank => `Movement Speed +${rank * 4}%, Duration 8 sec`,
}, },
"Cold Bore": { "Cold Bore": {
text: "Zane gains increased Weapon Swap Speed. The next shot fired after swapping weapons deals Bonus Cryo Damage.", text: "Zane gains increased Weapon Swap Speed. The next shot fired after swapping weapons deals Bonus Cryo Damage.",
ranks: 5,
effect: rank => `Weapon Swap Speed +${rank * 15}%, Bonus Cryo Damage ${rank * 6}%`,
}, },
"Violent Momentum": { "Violent Momentum": {
text: "Zane's Gun Damage is increased while moving. The quicker he moves, the greater the Gun Damage bonus.", text: "Zane's Gun Damage is increased while moving. The quicker he moves, the greater the Gun Damage bonus.",
ranks: 5,
effect: rank => `Gun Damage +${rank * 6}% at regular walk speed`,
}, },
}, },
"2": { "2": {
"Winter's Drone": { "Winter's Drone": {
text: "Converts SNTNL's primary weapons to Cryo Damage.", text: "Converts SNTNL's primary weapons to Cryo Damage.",
ranks: 1,
type: SKILLS.AUGMENT_CHEVRON,
}, },
"Cool Hand": { "Cool Hand": {
text: "Zane gains increased Reload Speed. After killing an enemy, Zane's Reload Speed is increased for a few seconds.", text: "Zane gains increased Reload Speed. After killing an enemy, Zane's Reload Speed is increased for a few seconds.",
ranks: 5,
effect: rank => `Reload Speed +${rank * 2}% (+${rank * 3}% after kill), Duration 8 sec `,
}, },
"Drone Delivery": { "Drone Delivery": {
text: "SNTRY will occasionally drop a free grenade based on your current grenade mod while attacking enemies.", text: "SNTRY will occasionally drop a free grenade based on your current grenade mod while attacking enemies.",
ranks: 1,
effect: rank => `Cooldown 15 sec`,
}, },
"Salvation": { "Salvation": {
text: "After killing an enemy, Zane's weapons gain Life Steal for a few seconds.", text: "After killing an enemy, Zane's weapons gain Life Steal for a few seconds.",
ranks: 5,
effect: rank => `Life Steal ${rank * 4}% of damage, Duration 8 sec`,
}, },
}, },
"3": { "3": {
"Bad Dose": { "Bad Dose": {
text: "SNTNL occasionally shoots out a beam of Radiation that weakens enemies and buffs Zane.", text: "SNTNL occasionally shoots out a beam of Radiation that weakens enemies and buffs Zane.",
ranks: 1,
effect: rank => `Fire Rate +3% per enemy, Movement Speed +6% per enemy, Damage 2, Duration 12 sec, Cooldown 8 sec`,
type: SKILLS.AUGMENT_CHEVRON,
}, },
"Seein' Red": { "Seein' Red": {
text: "Activating an Action Skill automatically activates all of Zane's kill skills.", text: "Activating an Action Skill automatically activates all of Zane's kill skills.",
}, },
"Static Field": { "Static Field": {
text: "SNTNL emits a static field that sends a Shock beam to nearby enemies, draining their shields and replenishing Zane's.", text: "SNTNL emits a static field that sends a Shock beam to nearby enemies, draining their shields and replenishing Zane's.",
ranks: 1,
effect: rank => `Shield Damage 2 per sec, Cooldown 2 sec`,
type: SKILLS.AUGMENT_CHEVRON,
}, },
}, },
"4": { "4": {
"Boomsday": { "Boomsday": {
text: "SNTNL adds a rocket pod to its primary weapons, allowing it to shoot rockets as well as machine guns.", text: "SNTNL adds a rocket pod to its primary weapons, allowing it to shoot rockets as well as machine guns.",
ranks: 1,
effect: rank => `Rocket Damage 50`,
type: SKILLS.AUGMENT_CHEVRON,
}, },
"Violent Violence": { "Violent Violence": {
text: "After killing an enemy, Zane gains increased Fire Rate for a few seconds.", text: "After killing an enemy, Zane gains increased Fire Rate for a few seconds.",
ranks: 5,
effect: rank => `Fire Rate +${rank * 4}%, Cooldown 8 sec`,
}, },
"Playing Dirty": { "Playing Dirty": {
text: "After killing an enemy, Zane's next five shots all have a chance to fire an additional projectile.", text: "After killing an enemy, Zane's next five shots all have a chance to fire an additional projectile.",
ranks: 5,
effect: rank => `Extra Shot Chance ${rank * 10}%`,
}, },
"Almighty Ordnance": { "Almighty Ordnance": {
text: "Hold down LB or RB (controller) while SNTNL is deployed to paint a target area. SNTNL fires a missile barrage at that area, and if an enemy is killed, Almighty Ordnance's duration is reset. This can only be used once per Action Skill use.", text: "Hold down LB or RB (controller) while SNTNL is deployed to paint a target area. SNTNL fires a missile barrage at that area, and if an enemy is killed, Almighty Ordnance's duration is reset. This can only be used once per Action Skill use.",
ranks: 1,
effect: rank => `Missile Damage 25, 5 Missiles per Barrage`,
type: SKILLS.AUGMENT_CHEVRON,
}, },
}, },
"5": { "5": {
"Good Misfortune": { "Good Misfortune": {
text: "Killing an enemy increases Zane's Action Skill Duration. This skill has diminishing returns.", text: "Killing an enemy increases Zane's Action Skill Duration. This skill has diminishing returns.",
ranks: 3,
effect: rank => `Kill skill, initial action skill bonus duration +${rank * 5}%`,
}, },
}, },
"6": { "6": {
"Death Follows Close": { "Death Follows Close": {
text: "All of Zane's kill skills gain increased effect and duration.", text: "All of Zane's kill skills gain increased effect and duration.",
ranks: 1,
effect: rank => `Kill Skill Effect +40%, Kill Skill Duration +4 sec`,
}, },
} }
}, },
"Doubled Agent": {
"0": {
"Digi-Clone": {
text: "Spawn a Digi-Clone of Zane. The clone stays in place, but distracts and fires at enemies. Pressing LB or RB (controller) while the Clone is active causes Zane and the Clone to swap places.",
effect: rank => `Duration - 18 seconds, Cooldown - 26 sec`,
type: SKILLS.ACTION_SKILL,
bought: true,
},
},
"1": {
"Synchronicity": {
text: "Whenever one or more of Zane's action skills are active, he gains increased Gun Damage for each active action skill.",
ranks: 5,
effect: rank => `Gun Damage +${rank * 2}% per active action skill`,
},
"Praemunitus": {
text: "Zane and his Dig-Clone gain increased Magazine Size.",
ranks: 3,
effect: rank => `Magazine Size +${rank * 4}%`,
},
"Borrowed Time": {
text: "Zane gains increased Action Skill Duration for every active action skill.",
ranks: 5,
effect: rank => `Action Skill Duration +${rank * 4}% per active action skill`,
},
},
"2": {
"Binary System": {
text: "Whenever Zane swaps places with his Clone, a Cryo Nova is triggered around Zane and his Clone.",
ranks: 1,
effect: rank => `Nova Damage 66`, // TODO scale with level?
type: SKILLS.AUGMENT_CHEVRON,
},
"Donnybrook": {
text: "Whenever Zane kills an enemy ,he and his Digi-Clone receive increased Gun Damage and gain Health Regeneration for a few seconds.",
ranks: 5,
effect: rank => `Gun Damage +${rank * 2}%, Health Regen ${rank * 0.5}% of missing health, Duration 8 sec`,
},
"Fractal Frags": {
text: "The Digi-Clone throws a copy of Zane's current grenade mod when it is first activated. If the Digi-Clone is killed, it drops a free grenade. Killing an enemy while the Digi-Clone is active gives the Clone a chance to throw a grenade.",
ranks: 1,
effect: rank => `Grenade Chance 30%`,
},
"Duct Tape Mod": {
text: "The first shot fired from Zane's gun has a chance to also fire a grenade. The more grenades in his capacity, the higher the chance.",
ranks: 5,
effect: rank => `Grenade Chance up to ${rank * 5}%`,
},
},
"3": {
"Schadenfreude": {
text: "Whenever the Clone takes damage, Zane's shield is restored by a portion of that damage.",
ranks: 1,
effect: rank => `Shields Restored +11% of damage`,
type: SKILLS.AUGMENT_CHEVRON,
},
"Quick Breather": {
text: "Whenever Zane swaps places with his Clone, his shield immediately begins recharging.",
ranks: 1,
},
"Which One's Real?": {
text: "Enemies are more likely to target the Clone for a few seconds after it's summoned and after swapping places.",
ranks: 1,
effect: rank => `Duration 6 sec`,
type: SKILLS.AUGMENT_CHEVRON,
},
},
"4": {
"Dopplebanger": {
text: "Hold down LB or RB (controller) to end the action skill early. When Zane's Action Skill is ended, the Clone explodes, dealing Fire Damage to all nearby enemies. The more Action Skill time remaining, the greater the damage.",
ranks: 1,
effect: rank => `Damage Up to 1,326`, // TODO scale with level?
type: SKILLS.AUGMENT_CHEVRON,
},
"Pocket Full of Grenades": {
text: "After killing an enemy, Zane gains Grenade Regeneration for a few seconds.",
ranks: 3,
effect: rank => `Grenade Regeneration ${rank * 5}%, Duration 8 sec`,
},
"Old-U": {
text: "Press LB or RB (controller) during Fight for Your Life if Digi-Clone is active to destroy the clone and immediately gain a Second Wind with full health.",
ranks: 1,
},
"Supersonic Man": {
text: "Whenever one or more of Zane's Action Skills are active, he gains increased Movement Speed for each active Action Skill.",
ranks: 3,
effect: rank => `Movement Speed +${rank * 4}% per active action skill`,
},
"Digital Distribution": {
text: "If Zane takes health damage while the Clone is active, a portion of that damage is shared to his Clone instead.",
ranks: 1,
effect: rank => `Shared Health Damage +75%`,
type: SKILLS.AUGMENT_CHEVRON,
},
},
"5": {
"Like a Ghost": {
text: "Zane and his Digi-Clone gain a chance to ignore bullets. This chance is increased for a few seconds after activating an action skill. This effect stacks.",
ranks: 3,
effect: rank => `Ignore Bullet Chance ${rank * 4}%, Additional Ignore Bullet Chance +${rank * 1}%, Duration 8 sec`,
},
"Boom. Enhance.": {
text: "Whenever Zane summons his Digi-Clone, it consumes up to 3 grenades. For every grenade consumed, the Digi-Clone gains increased Gun Damage, Max Health, Fire Rate, and Reload Speed.",
ranks: 1,
effect: rank => `Gun Damage +11% per grenade, Max Health +17% per grenade, Fire Rate +17% per grenade, Reload Speed +12% per grenade`,
},
"Trick of the Light": {
text: "Zane deals Bonus Shock Damage to enemies that aren't targeting him.",
ranks: 3,
effect: rank => `Bonus Damage ${rank * 6}% of damage dealt`,
},
},
"6": {
"Double Barrel": {
text: "The Clone is equipped with a copy of Zane's Current Weapon when activated. Swapping places with the Clone causes Zane and his clone to gain increased Gun Damage.",
ranks: 1,
effect: rank => `Gun Damage +10%, Item Duping +100%`,
},
},
},
"Under Cover": {
"0": {
"Barrier": {
text: "Drop a deployable Barrier that blocks incoming projectiles. Zane and his allies can shooter through the Barrier, dealing increased Gun Damage. Pressing LB or RB (controller) while Barrier is active picks up and holds the Barrier, but the size and bonuses are decreased.",
effect: rank => `Duration - 9 sec, Cooldown - 18 sec, Damage Amp +20%`,
type: SKILLS.ACTION_SKILL,
bought: true,
},
},
"1": {
"Adrenaline": {
text: "Zane gains increased Action Skill Cooldown Rate. This bonus is based on the amount of shield he has. The more percent full, the greater the bonus.",
ranks: 5,
effect: rank => `Action Skill Cooldown Rate - Up to +4%`,
},
"Hearty Stock": {
text: "Zane gains increased Maximum Shield Capacity.",
ranks: 5,
effect: rank => `Max Shield +6%`,
},
"Ready for Action": {
text: "Zane gains improved Shield Recharge Rate and Shield Recharge Delay.",
ranks: 5,
effect: rank => `Shield Recharge Rate +6%, Shield Recharge Delay -8%`,
},
},
"2": {
"Charged Relay": {
text: "Whenever Zane or an ally touches the Barrier, they gain increased Movement Speed and Fire Rate for a few seconds.",
ranks: 1,
effect: rank => `Fire Rate +13%, Movement Speed +11%, Duration 8 sec after moving away from barrier`,
type: SKILLS.AUGMENT_CHEVRON,
},
"Brainfreeze": {
text: "Whenever Zane scores a Critical Hit on an enemy, there's a chance they will be Slowed.",
ranks: 5,
effect: rank => `Slow Chance 2.5%`,
},
"Stiff Upper Lip": {
text: "Whenever Zane is damaged, he gains Damage Resistance against that damage type.",
ranks: 3,
effect: rank => `Damage Resistance +5%`,
},
"Rise to the Occasion": {
text: "Zane gains Health Regeneration. The lower his shield is, the higher the bonus. While Zane's shields are full, he does not receive any health regeneration.",
ranks: 5,
effect: rank => `Health Regeneration up to +1% of Max Health`,
},
},
"3": {
"Nanites or Some Shite": {
text: "Zane and his allies gain Health Regeneration, increased Reload Speed, and greatly improved Shield Recharge Delay while near his Barrier. The lower their health, the more health is regenerated.",
ranks: 1,
effect: rank => `Health Regeneration up to 4% of Max Health, Shield Recharge Delay -33%, Reload Speed +11%`,
type: SKILLS.AUGMENT_CHEVRON,
},
"Confident Competence": {
text: "While Zane's shields are active, he gains increased Gun Damage and Accuracy. This bonus is based on the amount of shields he has. The more percent full, the greater the bonus.",
ranks: 1,
effect: rank => `Gun Damage up to +10%, Accuracy up to +22%`,
},
"All-rounder": {
text: "Zane's Barrier becomes a dome, covering all sides.",
ranks: 1,
effect: rank => `Barrier cooldown +20%`,
type: SKILLS.AUGMENT_CHEVRON,
},
},
"4": {
"Redistribution": {
text: "Zane and allies near the Barrier gain increased Gun Damage for a few seconds after the Barrier takes damage.",
ranks: 1,
effect: rank => `Gun Damage +9%, Duration 3 sec`,
type: SKILLS.AUGMENT_CHEVRON,
},
"Really Expensive Jacket": {
text: "Elemental damage over time effects applied to Zane have reduced duration.",
ranks: 1,
effect: `Elemental Effect Duration -50%`,
},
"Best Served Cold": {
text: "Whenever Zane kills an enemy, they create a Cryo Nova, dealing damage to all nearby enemies. This skill has a short cooldown.",
ranks: 5,
effect: rank => `Damage 3, Cooldown 3 sec`,
},
"Futility Belt": {
text: "Zane gains resistance to non-elemental damage. Kill Skill - All elemental damage Zane takes is converted to non-elemental damage.",
ranks: 1,
effect: rank => `Damage Reduction +22%, Duration 8 sec`,
},
"Deterrence Field": {
text: "Enemies that touch the Barrier take Shock Damage and are staggered.",
ranks: 1,
effect: rank => `Shock Damage 18`, // TODO level scaling?
type: SKILLS.AUGMENT_CHEVRON,
},
},
"5": {
"Refreshment": {
text: "Whenever Zane damages a frozen enemy with his weapon, he gains some of that damage back as health.",
ranks: 3,
effect: rank => `Life Steal 8% of damage dealt`,
},
"Calm, Cool, Collected": {
text: "Whenever Zane Freezes an enemy, his shield instantly begins recharging. If Zane's shields are already full, he regenerates health for a few seconds. If Zane's health is already full, his Action Skill Cooldowns and Durations are immediately reset.",
ranks: 1,
effect: rank => `Health Regeneration up to 4% max health, Regeneration Duration 3 sec`,
},
"Nerves of Steel": {
text: "Zane gains increasing Accuracy and Handling. The longer his shield is full, the greater the bonus.",
ranks: 3,
effect: rank => `Accuracy +2% per sec, Handling +2.5% per sec, 99 Max Stacks`,
},
},
"6": {
"Distributed Denial": {
text: "Zane's barrier gains the effects of his currently equipped Shield Mod. Additionally, shield effects are applied to all allies near the barrier. Bonuses to Zane are reduced.",
ranks: 1,
},
},
},
}; };
export default skills; export default skills;