initial commit
3
README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
Планировщик персонажа Fallout 4
|
||||
|
||||
https://lzrdblzzrd.github.io/f4cp/
|
233
css/style.css
Normal file
@@ -0,0 +1,233 @@
|
||||
html {
|
||||
border: 1px solid #42454a;
|
||||
}
|
||||
body {
|
||||
color: #FFF;
|
||||
background-color: #36393f;
|
||||
}
|
||||
.row {
|
||||
background: #2f3136;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar {
|
||||
width: 2px;
|
||||
background-color: transparent;
|
||||
}
|
||||
::-webkit-scrollbar-button {
|
||||
display: none;
|
||||
}
|
||||
::-webkit-scrollbar-corner {
|
||||
background-color: transparent;
|
||||
}
|
||||
::-webkit-scrollbar-thumb {
|
||||
background-color: #99aab5;
|
||||
}
|
||||
|
||||
.container-fluid {
|
||||
background-color: #202225;
|
||||
}
|
||||
.navbar {
|
||||
margin-bottom: 0;
|
||||
border: none;
|
||||
}
|
||||
.navbar-default, .navbar-brand {
|
||||
color: #fff !important;
|
||||
background-color: #202225;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.btn {
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
.col-md-3 {
|
||||
color: #FFF;
|
||||
background-color: #2f3136;
|
||||
border: 1px solid #42454a;
|
||||
}
|
||||
.col-md-3>h3, .col-md-3>h4, .col-md-3>span{
|
||||
font-family: monospace;
|
||||
margin-top: 0px;
|
||||
margin-bottom: 0px;
|
||||
font-size: 25px;
|
||||
text-align: center;
|
||||
}
|
||||
.col-md-3>h4 {
|
||||
}
|
||||
.include-bobbleheads {
|
||||
margin-top: -20px;
|
||||
}
|
||||
|
||||
.list-group-item:first-child, .list-group-item:last-child {
|
||||
border-top-left-radius: 0;
|
||||
border-top-right-radius: 0;
|
||||
border-bottom-left-radius: 0;
|
||||
border-bottom-right-radius: 0;
|
||||
}
|
||||
.list-special {
|
||||
font-family: monospace;
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
color: #2f3136;
|
||||
background-color: #2f3136;
|
||||
}
|
||||
.list-group-item {
|
||||
color: #FFF;
|
||||
background-color: #2f3136;
|
||||
border: 1px solid #42454a;
|
||||
}
|
||||
.list-special input {
|
||||
display: inline-block;
|
||||
width: 45px;
|
||||
height: 25px;
|
||||
}
|
||||
.container-fluid>h4 {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
.summary {
|
||||
padding-top: 25px;
|
||||
}
|
||||
.summary>li {
|
||||
border-top: 2px solid #42454a;
|
||||
font-size: 20px;
|
||||
font-weight: bolder;
|
||||
font-family: monospace;
|
||||
}
|
||||
.summary>:first-child {
|
||||
border-top: none;
|
||||
}
|
||||
.summary>ul>li {
|
||||
border-bottom: 1px solid #42454a;
|
||||
margin-top: -2px;
|
||||
font-style: italic;
|
||||
}
|
||||
.summary>ul>:last-child {
|
||||
margin-bottom: 10px;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
|
||||
|
||||
.form-control {
|
||||
color: #FFF;
|
||||
background-color: #36393f;
|
||||
border: 1px solid #42454a;
|
||||
}
|
||||
select.form-control {
|
||||
-moz-appearance: none;
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
}
|
||||
input::-webkit-outer-spin-button,
|
||||
input::-webkit-inner-spin-button {
|
||||
-webkit-appearance: none;
|
||||
|
||||
}
|
||||
input[type=number] {
|
||||
-moz-appearance: textfield; /* Firefox */
|
||||
}
|
||||
.form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control {
|
||||
background-color: #36393f;
|
||||
opacity: 1;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
.col-md-9 {
|
||||
color: #FFF;
|
||||
background-color: #36393f;
|
||||
padding-right: 0;
|
||||
padding-left: 0;
|
||||
}
|
||||
.table>tbody>tr>td, .table>tbody>tr>th, .table>tfoot>tr>td, .table>tfoot>tr>th, .table>thead>tr>td, .table>thead>tr>th {
|
||||
text-align: center;
|
||||
padding: 8px;
|
||||
line-height: 1.42857143;
|
||||
vertical-align: top;
|
||||
border-left: 1px solid #42454a; border-right: 1px solid #42454a;
|
||||
border-top: none;
|
||||
}
|
||||
|
||||
|
||||
|
||||
.popover {
|
||||
background: #202225;
|
||||
border-radius: 0px;
|
||||
}
|
||||
.popover-title {
|
||||
font-size: 20px;
|
||||
font-weight: bolder;
|
||||
color: #FFF;
|
||||
background: #2f3136;
|
||||
border: none;
|
||||
border-radius: 0px;
|
||||
}
|
||||
.popover-content {
|
||||
font-style: italic;
|
||||
color: #FFF;
|
||||
background: #36393f;
|
||||
border-radius: 0px;
|
||||
}
|
||||
.popover-content>.no-rank {
|
||||
border-bottom: 1px solid #42454a;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
.popover-content>:last-child {
|
||||
border-bottom: none;
|
||||
margin: none;
|
||||
}
|
||||
.popover.left>.arrow:after {
|
||||
border-left-color: #1a1b1e;
|
||||
color: #202225;
|
||||
}
|
||||
popover.right>.arrow:after{
|
||||
border-right-color: #1a1b1e;
|
||||
color: #202225;
|
||||
}
|
||||
.popover.top>.arrow:after {
|
||||
border-top-color: #1a1b1e;
|
||||
color: #202225;
|
||||
}
|
||||
.popover.bottom>.arrow:after {
|
||||
border-bottom-color: #1a1b1e;
|
||||
color: #202225;
|
||||
}
|
||||
|
||||
.has-rank {
|
||||
color: #FFFDE0;
|
||||
font-style: normal;
|
||||
font-weight: bold;
|
||||
background-color: rgba(0,224,167, 0.1);
|
||||
padding: 2px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
|
||||
|
||||
.perk {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
border: 1px solid #42454a;
|
||||
position: relative;
|
||||
left: 50%;
|
||||
transform: translate(-50%);
|
||||
}
|
||||
.overlay {
|
||||
font-size: 20px;
|
||||
bottom: 0px;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
color: #FFF;
|
||||
font-weight: bold;
|
||||
background-color: rgba(35,39,42, 0.75) /* 40% opaque red */
|
||||
}
|
||||
.unavailable {
|
||||
opacity: 0.1;
|
||||
}
|
BIN
cursors/danger.cur
Normal file
After Width: | Height: | Size: 4.2 KiB |
BIN
cursors/help.cur
Normal file
After Width: | Height: | Size: 4.2 KiB |
BIN
cursors/miniminus.cur
Normal file
After Width: | Height: | Size: 766 B |
BIN
cursors/miniplus.cur
Normal file
After Width: | Height: | Size: 4.2 KiB |
BIN
cursors/normal.cur
Normal file
After Width: | Height: | Size: 4.2 KiB |
BIN
cursors/plus.cur
Normal file
After Width: | Height: | Size: 4.2 KiB |
BIN
favicon.ico
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
img/action-boy-action-girl.png
Normal file
After Width: | Height: | Size: 8.7 KiB |
BIN
img/adamantium-skeleton.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
img/animal-friend.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
img/aquaboy.png
Normal file
After Width: | Height: | Size: 9.3 KiB |
BIN
img/armorer.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
img/attack-dog.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
img/awareness.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
img/basher.png
Normal file
After Width: | Height: | Size: 9.2 KiB |
BIN
img/better-criticals.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
img/big-leagues.png
Normal file
After Width: | Height: | Size: 7.5 KiB |
BIN
img/blacksmith.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
img/blitz.png
Normal file
After Width: | Height: | Size: 7.2 KiB |
BIN
img/bloody-mess.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
img/brand.png
Normal file
After Width: | Height: | Size: 7.4 KiB |
BIN
img/cannibal.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
img/cap-collector.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
img/chem-resistant.png
Normal file
After Width: | Height: | Size: 9.1 KiB |
BIN
img/chemist.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
img/commando.png
Normal file
After Width: | Height: | Size: 6.6 KiB |
BIN
img/concentrated-fire.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
img/critical-banker.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
img/demolition-expert.png
Normal file
After Width: | Height: | Size: 9.9 KiB |
BIN
img/fortune-finder.png
Normal file
After Width: | Height: | Size: 8.2 KiB |
BIN
img/four-leaf-clover.png
Normal file
After Width: | Height: | Size: 9.5 KiB |
BIN
img/ghoulish.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
img/grim-reapers-sprint.png
Normal file
After Width: | Height: | Size: 8.8 KiB |
BIN
img/gun-fu.png
Normal file
After Width: | Height: | Size: 9.9 KiB |
BIN
img/gun-nut.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
img/gunslinger.png
Normal file
After Width: | Height: | Size: 9.4 KiB |
BIN
img/hacker.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
img/heavy-gunner.png
Normal file
After Width: | Height: | Size: 9.1 KiB |
BIN
img/idiot-savant.png
Normal file
After Width: | Height: | Size: 8.3 KiB |
BIN
img/inspiration.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
img/intimidation.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
img/iron-fist.png
Normal file
After Width: | Height: | Size: 9.6 KiB |
BIN
img/lady-killer-black-widow.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
img/lead-belly.png
Normal file
After Width: | Height: | Size: 9.3 KiB |
BIN
img/life-giver.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
img/local-leader.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
img/locksmith.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
img/lone-wanderer.png
Normal file
After Width: | Height: | Size: 9.7 KiB |
BIN
img/medic.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
img/mister-sandman.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
img/moving-target.png
Normal file
After Width: | Height: | Size: 8.3 KiB |
BIN
img/mysterious-stranger.png
Normal file
After Width: | Height: | Size: 9.9 KiB |
BIN
img/nerd-rage.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
img/night-person.png
Normal file
After Width: | Height: | Size: 8.4 KiB |
BIN
img/ninja.png
Normal file
After Width: | Height: | Size: 8.9 KiB |
BIN
img/nuclear-physicist.png
Normal file
After Width: | Height: | Size: 9.1 KiB |
BIN
img/pain-train.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
img/party-boy-party-girl.png
Normal file
After Width: | Height: | Size: 7.6 KiB |
BIN
img/penetrator.png
Normal file
After Width: | Height: | Size: 9.5 KiB |
BIN
img/pickpocket.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
img/quick-hands.png
Normal file
After Width: | Height: | Size: 8.9 KiB |
BIN
img/rad-resistant.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
img/refractor.png
Normal file
After Width: | Height: | Size: 8.0 KiB |
BIN
img/ricochet.png
Normal file
After Width: | Height: | Size: 7.9 KiB |
BIN
img/rifleman.png
Normal file
After Width: | Height: | Size: 8.8 KiB |
BIN
img/robotics-expert.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
img/rooted.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
img/science.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
img/scrapper.png
Normal file
After Width: | Height: | Size: 8.5 KiB |
BIN
img/scrounger.png
Normal file
After Width: | Height: | Size: 7.4 KiB |
BIN
img/sneak.png
Normal file
After Width: | Height: | Size: 8.9 KiB |
BIN
img/sniper.png
Normal file
After Width: | Height: | Size: 7.8 KiB |
BIN
img/solar-powered.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
img/steady-aim.png
Normal file
After Width: | Height: | Size: 8.7 KiB |
BIN
img/strong-back.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
img/toughness.png
Normal file
After Width: | Height: | Size: 9.1 KiB |
BIN
img/vans.png
Normal file
After Width: | Height: | Size: 9.5 KiB |
BIN
img/wasteland-whisperer.png
Normal file
After Width: | Height: | Size: 15 KiB |
157
index.html
Normal file
@@ -0,0 +1,157 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Планировщик персонажа Fallout 4</title>
|
||||
<meta charset="utf-8" />
|
||||
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"/>
|
||||
<link rel="stylesheet" href="css/style.css"/>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="favicon.ico"/>
|
||||
<script type="text/javascript" >
|
||||
(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
|
||||
m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})
|
||||
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
|
||||
|
||||
ym(75487888, "init", {
|
||||
clickmap:true,
|
||||
trackLinks:true,
|
||||
accurateTrackBounce:true,
|
||||
webvisor:true
|
||||
});
|
||||
</script>
|
||||
<noscript><div><img src="https://mc.yandex.ru/watch/75487888" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
||||
</head>
|
||||
<body>
|
||||
<nav class="navbar navbar-default">
|
||||
<div class="container-fluid">
|
||||
<div class="navbar-header">
|
||||
<a class="navbar-brand" onclick="window.open('https://fallout.fandom.com/ru/wiki/%D0%A1%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BD%D0%BE%D1%81%D1%82%D0%B8_Fallout_4');">
|
||||
<img alt="Brand" src="img/brand.png" style="height:20px;width:20px;">
|
||||
</a>
|
||||
<a class="navbar-brand" onclick="window.open('https://fallout.fandom.com/ru/wiki/%D0%A1%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BD%D0%BE%D1%81%D1%82%D0%B8_Fallout_4');">Планировщик персонажа Fallout 4</a>
|
||||
<div class="navbar-form navbar-left">
|
||||
<a class="btn btn-danger" href="" role="button">Сбросить</a>
|
||||
<a class="btn btn-primary saveToFile" role="button">Сохранить как скриншот</a>
|
||||
<a class="btn btn-success rainbow" href="https://lzrdblzzrd.github.io/" role="button">С ❤ от lzrdblzzrd</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="col-md-3">
|
||||
<h3>S.P.E.C.I.A.L.</h3>
|
||||
<h3 class="bold points-left">Загрузка...</h3>
|
||||
<ul class="list-group list-special">
|
||||
<li data-special="st" data-special-ru="СИЛ" class="list-group-item clearfix">
|
||||
СИЛА
|
||||
|
||||
<span class="pull-right">
|
||||
<button class="btn btn-primary btn-xs btn-dec"><i class="glyphicon glyphicon-minus"></i></button>
|
||||
<input type="number" min="1" max="10" class="form-control" value="1" readonly/>
|
||||
<button class="btn btn-primary btn-xs btn-inc"><i class="glyphicon glyphicon-plus"></i></button>
|
||||
</span>
|
||||
</li>
|
||||
<li data-special="pe" data-special-ru="ВСП" class="list-group-item clearfix">
|
||||
ВОСПРИЯТИЕ
|
||||
|
||||
<span class="pull-right">
|
||||
<button class="btn btn-primary btn-xs btn-dec"><i class="glyphicon glyphicon-minus"></i></button>
|
||||
<input type="number" min="1" max="10" class="form-control" value="1" readonly/>
|
||||
<button class="btn btn-primary btn-xs btn-inc"><i class="glyphicon glyphicon-plus"></i></button>
|
||||
</span>
|
||||
</li>
|
||||
<li data-special="en" data-special-ru="ВЫН" class="list-group-item clearfix">
|
||||
ВЫНОСЛИВОСТЬ
|
||||
|
||||
<span class="pull-right">
|
||||
<button class="btn btn-primary btn-xs btn-dec"><i class="glyphicon glyphicon-minus"></i></button>
|
||||
<input type="number" min="1" max="10" class="form-control" value="1" readonly/>
|
||||
<button class="btn btn-primary btn-xs btn-inc"><i class="glyphicon glyphicon-plus"></i></button>
|
||||
</span>
|
||||
</li>
|
||||
<li data-special="ch" data-special-ru="ХАР" class="list-group-item clearfix">
|
||||
ХАРИЗМА
|
||||
|
||||
<span class="pull-right">
|
||||
<button class="btn btn-primary btn-xs btn-dec"><i class="glyphicon glyphicon-minus"></i></button>
|
||||
<input type="number" min="1" max="10" class="form-control" value="1" readonly/>
|
||||
<button class="btn btn-primary btn-xs btn-inc"><i class="glyphicon glyphicon-plus"></i></button>
|
||||
</span>
|
||||
</li>
|
||||
<li data-special="in" data-special-ru="ИНТ" class="list-group-item clearfix">
|
||||
ИНТЕЛЛЕКТ
|
||||
|
||||
<span class="pull-right">
|
||||
<button class="btn btn-primary btn-xs btn-dec"><i class="glyphicon glyphicon-minus"></i></button>
|
||||
<input type="number" min="1" max="10" class="form-control" value="1" readonly/>
|
||||
<button class="btn btn-primary btn-xs btn-inc"><i class="glyphicon glyphicon-plus"></i></button>
|
||||
</span>
|
||||
</li>
|
||||
<li data-special="ag" data-special-ru="ЛОВ" class="list-group-item clearfix">
|
||||
ЛОВКОСТЬ
|
||||
|
||||
<span class="pull-right">
|
||||
<button class="btn btn-primary btn-xs btn-dec"><i class="glyphicon glyphicon-minus"></i></button>
|
||||
<input type="number" min="1" max="10" class="form-control" value="1" readonly/>
|
||||
<button class="btn btn-primary btn-xs btn-inc"><i class="glyphicon glyphicon-plus"></i></button>
|
||||
</span>
|
||||
</li>
|
||||
<li data-special="lu" data-special-ru="УДЧ" class="list-group-item clearfix">
|
||||
УДАЧА
|
||||
|
||||
<span class="pull-right">
|
||||
<button class="btn btn-primary btn-xs btn-dec"><i class="glyphicon glyphicon-minus"></i></button>
|
||||
<input type="number" min="1" max="10" class="form-control" value="1" readonly/>
|
||||
<button class="btn btn-primary btn-xs btn-inc"><i class="glyphicon glyphicon-plus"></i></button>
|
||||
</span>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="include-bobbleheads">
|
||||
<input type="checkbox" class="include-bobbleheads-check"/> Собраны все 7 пупсов S.P.E.C.I.A.L. (не сохраняется)</input>
|
||||
</div>
|
||||
<h4>Сводка:</h4>
|
||||
<span class="required-level">Загрузка...</span>
|
||||
<ul class="summary">
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-md-9">
|
||||
<table class="table"></table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script src="https://code.jquery.com/jquery-2.2.4.min.js" integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=" crossorigin="anonymous"></script>
|
||||
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js" integrity="sha256-VazP97ZCwtekAsvgPBSUwPFKdrwD3unUfSGVYrahUqU=" crossorigin="anonymous"></script>
|
||||
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.0/FileSaver.min.js"></script>
|
||||
<script src="https://html2canvas.hertzen.com/dist/html2canvas.min.js"></script>
|
||||
<script src="js/perks.js"></script>
|
||||
<script src="js/scripts.js"></script>
|
||||
<script>
|
||||
function stop() {
|
||||
return false
|
||||
}
|
||||
|
||||
document.ondragstart = stop;
|
||||
document.onselectstart = stop;
|
||||
document.oncontextmenu = stop;
|
||||
|
||||
document.onkeydown = function(e) {
|
||||
if(event.keyCode == 123) { return stop() }
|
||||
if(e.ctrlKey && e.shiftKey && e.keyCode == 'I'.charCodeAt(0)){ return stop() }
|
||||
if(e.ctrlKey && e.shiftKey && e.keyCode == 'J'.charCodeAt(0)){ return stop() }
|
||||
if(e.ctrlKey && e.shiftKey && e.keyCode == 'C'.charCodeAt(0)){ return stop() }
|
||||
if(e.ctrlKey && e.keyCode == 'U'.charCodeAt(0)){ return stop() }
|
||||
}
|
||||
</script>
|
||||
<style>
|
||||
html, .form-control {cursor: url(cursors/normal.cur), default;}
|
||||
.perk, .btn-success {cursor: url(cursors/help.cur), pointer;}
|
||||
.btn-inc {cursor: url(cursors/miniplus.cur), pointer;}
|
||||
.btn-dec {cursor: url(cursors/miniminus.cur), pointer;}
|
||||
.btn-danger {cursor: url(cursors/danger.cur), pointer;}
|
||||
.saveToFile {cursor: url(cursors/plus.cur), pointer;}
|
||||
.include-bobbleheads-check {cursor: url(cursors/miniplus.cur), pointer;}
|
||||
.include-bobbleheads-check:checked {cursor: url(cursors/miniminus.cur), pointer;}
|
||||
</style>
|
||||
</body>
|
||||
</html>
|
1882
js/perks.js
Normal file
306
js/scripts.js
Normal file
@@ -0,0 +1,306 @@
|
||||
var totalPoints = 28;
|
||||
|
||||
var renderPerks = function () {
|
||||
var html = '',
|
||||
special = getSPECIAL();
|
||||
specialRu = getSPECIALru();
|
||||
|
||||
html += '<tr>';
|
||||
for (var i = 0; i < special.length; ++i) {
|
||||
html += '<th>' + specialRu[i].special.toUpperCase() + ': ' + special[i].value + '</th>';
|
||||
}
|
||||
html += '</tr>';
|
||||
|
||||
for (var i = 0; i <= 9; ++i) {
|
||||
html += '<tr>';
|
||||
for (var j = 0; j < perks.length; ++j) {
|
||||
var perk = perks[j].perks[i],
|
||||
className = i > special[j].value - 1 ? ' unavailable' : '';
|
||||
|
||||
if (!perk.currentRank) {
|
||||
perk.currentRank = 0;
|
||||
}
|
||||
if (className == ' unavailable') {
|
||||
perk.currentRank = 0;
|
||||
}
|
||||
|
||||
var title = '';
|
||||
title += perk.ranked.map(function (rank) {
|
||||
var rankClass = perk.currentRank >= rank.rank ? 'has-rank' : 'no-rank';
|
||||
return '<p class=' + rankClass + '>Ранг ' + rank.rank + ' (' + rank.level + '): ' + rank.description + '</p>';
|
||||
}).join('');
|
||||
|
||||
html += '<td><div oncontextmenu="return false;" data-placement="left" data-trigger="hover" data-original-title="' + perk.name_ru + '" rel="popover" data-html="true" data-content="' + title + '" data-i="' + i + '" data-j="' + j + '" class="perk' + className + '" style="background-image:url(\'img/' + perk.img + '\');">';
|
||||
if (className !== ' unavailable') {
|
||||
html += '<div class="overlay"> ' + perk.currentRank + ' / ' + perk.ranks + ' </div>';
|
||||
}
|
||||
html += '</td>';
|
||||
}
|
||||
html += '</tr>';
|
||||
}
|
||||
$('.table').html(html);
|
||||
}
|
||||
|
||||
var getJSON = function () {
|
||||
return btoa(JSON.stringify({
|
||||
s: getSPECIALShort(),
|
||||
r: getRanks()
|
||||
}));
|
||||
}
|
||||
|
||||
var getRanks = function () {
|
||||
var ranks = [];
|
||||
for (var i = 0; i < perks.length; ++i) {
|
||||
for (var j = 0; j < perks[i].perks.length; ++j) {
|
||||
var perk = perks[i].perks[j];
|
||||
if (perk.currentRank && perk.currentRank > 0) {
|
||||
var item = {};
|
||||
item[perk.name] = perk.currentRank;
|
||||
ranks.push(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ranks;
|
||||
}
|
||||
|
||||
var getSPECIALShort = function () {
|
||||
var specs = [];
|
||||
$('input[type="number"]').each(function () {
|
||||
specs.push($(this).val());
|
||||
});
|
||||
return specs;
|
||||
};
|
||||
|
||||
var getSPECIAL = function () {
|
||||
return $('[data-special]').map(function () {
|
||||
return {
|
||||
special: $(this).data('special'),
|
||||
value: $(this).find('input').val()
|
||||
};
|
||||
});
|
||||
};
|
||||
|
||||
var getSPECIALru = function () {
|
||||
return $('[data-special-ru]').map(function () {
|
||||
return {
|
||||
special: $(this).data('special-ru'),
|
||||
};
|
||||
});
|
||||
};
|
||||
|
||||
var requiredLevel = function () {
|
||||
var total = 0;
|
||||
for (var i = 0; i < perks.length; ++i) {
|
||||
for (var j = 0; j < perks[i].perks.length; ++j) {
|
||||
total += perks[i].perks[j].currentRank;
|
||||
}
|
||||
}
|
||||
|
||||
var remaining = totalPoints - getAllocatedPoints();
|
||||
if (remaining < 0) {
|
||||
total += remaining * -1;
|
||||
}
|
||||
|
||||
var maxLevel = 0;
|
||||
for (var i = 0; i < perks.length; ++i) {
|
||||
for (var j = 0; j < perks[i].perks.length; ++j) {
|
||||
for (var k = 0; k < perks[i].perks[j].currentRank; ++k) {
|
||||
if (perks[i].perks[j].ranked[k].level > maxLevel) {
|
||||
maxLevel = perks[i].perks[j].ranked[k].level;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (maxLevel > total)
|
||||
total = maxLevel;
|
||||
|
||||
return total;
|
||||
}
|
||||
|
||||
var renderRequiredLevel = function () {
|
||||
$('.required-level').text('Необходимый уровень: ' + requiredLevel());
|
||||
}
|
||||
|
||||
var renderAll = function () {
|
||||
renderPerks();
|
||||
calculatePoints();
|
||||
renderRequiredLevel();
|
||||
renderSummary();
|
||||
window.location.hash = '#' + getJSON();
|
||||
$('.perk').mousedown(function(e) {
|
||||
var $container = $(this),
|
||||
i = parseInt($container.data('i')),
|
||||
j = parseInt($container.data('j')),
|
||||
perk = perks[j].perks[i],
|
||||
special = getSPECIAL();
|
||||
className = i > special[j].value - 1 ? ' unavailable' : '';
|
||||
if (e.which === 1 && perk.currentRank < perk.ranks && className !== ' unavailable') {
|
||||
perk.currentRank += 1;
|
||||
renderAll();
|
||||
} else if (e.which === 3 && perk.currentRank != 0 && className !== ' unavailable') {
|
||||
perk.currentRank -= 1;
|
||||
renderAll();
|
||||
};
|
||||
});
|
||||
};
|
||||
|
||||
var calculatePoints = function () {
|
||||
|
||||
var remaining = totalPoints - getAllocatedPoints();
|
||||
if (remaining <= 0) {
|
||||
remaining = 0;
|
||||
$(".points-left").hide(250);
|
||||
} else {
|
||||
$(".points-left").show(250);
|
||||
};
|
||||
$pointsLeft.text(remaining + ' очков осталось');
|
||||
}
|
||||
|
||||
var getAllocatedPoints = function () {
|
||||
return $('[data-special] input').map(function () {
|
||||
return parseInt($(this).val());
|
||||
}).get().reduce(function (prev, curr) {
|
||||
return prev + curr;
|
||||
});
|
||||
}
|
||||
|
||||
var $pointsLeft = $('.points-left');
|
||||
$includeBobbleheads = $('.include-bobbleheads-check');
|
||||
|
||||
var includeBobbleheads = function () {
|
||||
return $includeBobbleheads.is(':checked');
|
||||
}
|
||||
|
||||
var pointsRemaining = function () {
|
||||
return parseInt($pointsLeft.text());
|
||||
}
|
||||
|
||||
var renderSummary = function () {
|
||||
var html = '';
|
||||
for (var i = 0; i < perks.length; ++i) {
|
||||
for (var j = 0; j < perks[i].perks.length; ++j) {
|
||||
var perk = perks[i].perks[j];
|
||||
if (perk.currentRank && perk.currentRank > 0) {
|
||||
html += '<li>' + perk.name_ru + ': ' + perk.currentRank + '/' + perk.ranks + '</li>';
|
||||
html += '<ul>';
|
||||
for (var k = 0; k < perk.currentRank; ++k) {
|
||||
html += '<li>' + perk.ranked[k].description + '</li>';
|
||||
}
|
||||
html += '</ul>';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$('.summary').html(html);
|
||||
$('[rel="popover"]').popover();
|
||||
}
|
||||
|
||||
$(function () {
|
||||
var hash = window.location.hash.replace('#', '');
|
||||
if (hash.length > 0) {
|
||||
var load = JSON.parse(atob(hash));
|
||||
$('input[type=number]').each(function (index) {
|
||||
$(this).val(load.s[index]);
|
||||
});
|
||||
|
||||
for (var i = 0; i < load.r.length; ++i) {
|
||||
var key = Object.keys(load.r[i])[0],
|
||||
value = load.r[i][key];
|
||||
|
||||
for (var j = 0; j < perks.length; ++j) {
|
||||
for (var k = 0; k < perks[j].perks.length; ++k) {
|
||||
var perk = perks[j].perks[k];
|
||||
if (perk.name === key) {
|
||||
perk.currentRank = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
renderAll();
|
||||
|
||||
$includeBobbleheads.on('click', function () {
|
||||
if (includeBobbleheads()) {
|
||||
totalPoints += 7;
|
||||
} else {
|
||||
totalPoints -= 7;
|
||||
}
|
||||
renderAll();
|
||||
});
|
||||
|
||||
$('.btn-inc').on('click', function () {
|
||||
var $li = $(this).parent().parent(),
|
||||
$input = $li.find('input'),
|
||||
value = parseInt($input.val()),
|
||||
remaining = totalPoints - getAllocatedPoints();
|
||||
|
||||
if (value < 10) {
|
||||
$input.val(value + 1);
|
||||
}
|
||||
|
||||
renderAll();
|
||||
});
|
||||
|
||||
$('.btn-dec').on('click', function () {
|
||||
var $li = $(this).parent().parent(),
|
||||
$input = $li.find('input'),
|
||||
value = parseInt($input.val()),
|
||||
special = $li.data('special');
|
||||
|
||||
if (value > 1) {
|
||||
$input.val(value - 1);
|
||||
|
||||
for (var i = 0; i < perks.length; ++i) {
|
||||
if (perks[i].special === special) {
|
||||
for (var j = value - 1; j < perks[i].perks.length; ++j) {
|
||||
perks[i].perks[j].currentRank = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
renderAll();
|
||||
});
|
||||
|
||||
$('body').on('click', '.btn-inc-perk, .btn-dec-perk', function () {
|
||||
var $container = $(this).parent().parent(),
|
||||
i = parseInt($container.data('i')),
|
||||
j = parseInt($container.data('j')),
|
||||
perk = perks[j].perks[i],
|
||||
incrementing = $(this).hasClass('btn-inc-perk');
|
||||
|
||||
if (!perk.currentRank)
|
||||
perk.currentRank = 0;
|
||||
|
||||
if (incrementing) {
|
||||
if (perk.currentRank < perk.ranks) {
|
||||
perk.currentRank += 1;
|
||||
}
|
||||
} else {
|
||||
if (perk.currentRank > 0) {
|
||||
perk.currentRank -= 1;
|
||||
}
|
||||
}
|
||||
|
||||
renderAll();
|
||||
});
|
||||
});
|
||||
|
||||
$('.saveToFile').on('click', function () {
|
||||
html2canvas($(".col-md-3")[0]).then(function(canvas) {
|
||||
canvas.toBlob(function(blob) {
|
||||
saveAs(blob, "F4CP Билд.png");
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
var angle = sessionStorage['angle'] || '0';
|
||||
|
||||
(function RainbowColor() {
|
||||
$(".rainbow").css({"background-color":"hsla(" + (180 + angle) + ", 100%, 50%, 50%)", "color":"hsl(" + angle + ", 100%, 50%)", "border-color":"hsl(" + (180 + angle) + ", 100%, 50%"});
|
||||
(angle < 360 ? angle++ : angle = 0); sessionStorage['angle'] = angle;
|
||||
requestAnimationFrame(RainbowColor);
|
||||
})();
|