您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adding things here and there in Harem Heroes game.
// ==UserScript== // @name Harem Heroes++ // @namespace haremheroes.com // @description Adding things here and there in Harem Heroes game. // @version 0.05.1 // @match http://nutaku.haremheroes.com/* // @match https://www.hentaiheroes.com/* // @match https://www.gayharem.com/* // @run-at document-end // @grant none // @author Raphael // ==/UserScript== /* ================== localStorage ================== - lsMarket (updated each time you enter the Market / click buttons in Market) .buyable .potion.Nb = number of buyable books .potion.Xp = total xp of buyable books .potion.Value = cost of buyable books .gift.Nb = number of owned gifts .gift.Xp = total affection of buyable gifts .gift.Value = cost of buyable gifts .stocks .armor.Nb = number of owned equipments .booster.Nb = number of owned boosters .potion.Nb = number of owned books .potion.Xp = total xp you can give to your girls .gift.Nb = number of owned gifts .gift.Xp = total affection you can give to your girls .restock .herolvl = hero level before restock .time = next market restock time ================== */ var CurrentPage = window.location.pathname; // css define var sheet = (function() { var style = document.createElement('style'); document.head.appendChild(style); return style.sheet; })(); // verify localstorage var lsAvailable = (lsTest() === true) ? 'yes' : 'no'; FightATroll(); // added everywhere if (CurrentPage.indexOf('shop') != -1) ModifyMarket(); // Current page: Market else if (CurrentPage.indexOf('harem') != -1) ModifyHarem(); // Current page: Harem else if (CurrentPage.indexOf('quest') != -1) ModifyScenes(); // Current page: Haremettes' Scenes /* ====================== Fight A Troll Menu ====================== */ function FightATroll() { // Trolls' database var Trolls = ['Dark Lord', 'Ninja Spy', 'Gruntt', 'Edwarda', 'Donatien', 'Silvanus', 'Bremen', 'Finalmecia']; // get current world of player var CurrentWorld = Hero.infos.questing.id_world - 1, TrollName = '', TrollsMenu = ''; // generate troll list for (var i = 0; i < CurrentWorld; i++) { if (typeof Trolls[i] !== typeof undefined && Trolls[i] !== false) { TrollName = Trolls[i]; } else TrollName = 'World ' + (i+1) + ' troll'; TrollsMenu += '<a href="/battle.html?id_troll=' + (i+1) + '">' + TrollName + '</a><br />'; } // display: 'Fight a troll' menu $('#contains_all > header').children('[type=energy_fight]').append('<div id="FightTroll">Fight a Troll<span class="Arrow"></span><div class="TrollsMenu">' + TrollsMenu + '</div></div>'); // ----------------- // CSS RULES // ----------------- sheet.insertRule('#FightTroll {' + 'position: absolute;' + 'z-index: 99;' + 'width: 90%;' + 'margin:21px 0 0 13px;' + 'border-radius: 8px 10px 10px 8px;' + 'background: rgba(102,136,153,0.67);' + 'box-shadow: 0 0 0 1px rgba(255,255,255,0.73);' + 'text-align: center; }'); sheet.insertRule('#FightTroll > .Arrow {' + 'float:right;' + 'background-image: url("http://i.harem-battle.club/images/2017/09/19/Fmo.png");' + 'background-size: 18px 18px;' + 'background-repeat: no-repeat;' + 'width: 18px;' + 'height: 18px; }'); sheet.insertRule('#FightTroll > .TrollsMenu {' + 'position: absolute;' + 'width: 88%;' + 'margin-left:6px;' + 'border-radius: 0px 0 8px 8px;' + 'background: rgba(102,136,153,0.67);' + 'line-height: 15px;' + 'opacity: 0;' + 'visibility: hidden;' + 'transition: opacity 400ms, visibility 400ms; }'); sheet.insertRule('#FightTroll:hover > .TrollsMenu {' + 'opacity: 1;' + 'visibility: visible; }'); sheet.insertRule('#FightTroll a {' + 'color: rgb(255, 255, 255);' + 'text-decoration: none; }'); sheet.insertRule('#FightTroll a:hover {' + 'color: rgb(255, 247, 204);' + 'text-decoration: underline; }'); } /* ========== Market ========== */ function ModifyMarket() { var lsMarket = {}; lsMarket.buyable = {}; lsMarket.stocks = {}; lsMarket.restock = {}; setTimeout( function() { // save time of restock var RestockTimer = $('#shop > .shop_count > span').text().split(':'), s = 0, m = 1; // convert HH:MM:SS or MM:SS or SS to seconds while (RestockTimer.length > 0) { s += m * parseInt(RestockTimer.pop(), 10); m *= 60; } lsMarket.restock.herolvl = Hero.infos.level; lsMarket.restock.time = (new Date()).getTime() + s*1000; // first load get_buyableStocks('potion'); get_buyableStocks('gift'); equipments_shop(0); boosters_shop(0); books_shop(0); gifts_shop(0); }, 500 ); // catch click on Buy, Restock, Equip/Offer or Sell > update tooltip after 500ms var timer; $('#shop > button, #inventory > button').click(function() { var clickedButton = $(this).attr('rel'), opened_shop = $('#shop').children('.selected'); clearTimeout(timer); // kill previous update timer = setTimeout( function() { if (opened_shop.hasClass('armor')) { equipments_shop(1); } else if (opened_shop.hasClass('booster')) { boosters_shop(1); } else if (opened_shop.hasClass('potion')) { if (clickedButton == 'buy' || clickedButton == 'shop_reload') get_buyableStocks('potion'); books_shop(1); } else if (opened_shop.hasClass('gift')) { if (clickedButton == 'buy' || clickedButton == 'shop_reload') get_buyableStocks('gift'); gifts_shop(1); } }, 500 ); }); function get_buyableStocks(loc_class) { // initialize var itemsNb = 0, itemsXp = 0, itemsPrice = 0, loc = $('#shop').children('.' + loc_class); // get stats loc.find('.slot').each(function() { if ($(this).hasClass('empty')) return false; var item = $(this).data('d'); itemsNb++; itemsXp += parseInt(item.value, 10); itemsPrice += parseInt(item.price, 10); }); // save lsMarket.buyable[loc_class] = {'Nb':itemsNb, 'Xp':itemsXp, 'Value':itemsPrice}; } function equipments_shop(update) { tt_create(update, 'armor', 'EquipmentsTooltip', 'equipments', ''); } function boosters_shop(update) { tt_create(update, 'booster', 'BoostersTooltip', 'boosters', ''); } function books_shop(update) { tt_create(update, 'potion', 'BooksTooltip', 'books', 'Xp'); } function gifts_shop(update) { tt_create(update, 'gift', 'GiftsTooltip', 'gifts', 'affection'); } // create/update tooltip & save to localstorage function tt_create(update, loc_class, tt_class, itemName, itemUnit) { // initialize var itemsNb = 0, itemsXp = (itemUnit === '') ? -1 : 0, itemsSell = 0, loc = $('#inventory').children('.' + loc_class); // get stats loc.find('.slot').each(function() { if ($(this).hasClass('empty')) return false; var item = $(this).data('d'), Nb = parseInt(item.count, 10); itemsNb += Nb; itemsSell += Nb * parseInt(item.price_sell, 10); if (itemsXp != -1) itemsXp += Nb * parseInt(item.value, 10); }); var tooltip = 'You own <b>' + NbCommas(itemsNb) + '</b> ' + itemName + '.<br />' + (itemsXp == -1 ? '' : 'You can give a total of <b>' + NbCommas(itemsXp) + '</b> ' + itemUnit + '.<br />') + 'You can sell everything for <b>' + NbCommas(itemsSell) + '</b> <span class="imgMoney"></span>.'; // save to localstorage lsMarket.stocks[loc_class] = (loc_class == 'potion' || loc_class == 'gift') ? {'Nb':itemsNb, 'Xp':itemsXp} : {'Nb':itemsNb}; localStorage.setItem('lsMarket', JSON.stringify(lsMarket)); // create or update tooltip if (update === 0) { loc.prepend('<span class="CustomTT"></span><div class="' + tt_class + '">' + tooltip + '</div>'); } else { loc.children('.' + tt_class).html(tooltip); } } // ----------------- // CSS RULES // ----------------- sheet.insertRule('#inventory .CustomTT {' + 'float: right;' + 'margin: 11px 1px 0 0;' + 'background-image: url("http://i.harem-battle.club/images/2017/09/13/FPE.png");' + 'background-size: 20px 20px;' + 'width: 20px;' + 'height: 20px; }'); sheet.insertRule('#inventory .CustomTT:hover {' + 'cursor: help; }'); sheet.insertRule('#inventory .CustomTT:hover + div {' + 'opacity: 1;' + 'visibility: visible; }'); sheet.insertRule('#inventory .EquipmentsTooltip, #inventory .BoostersTooltip, #inventory .BooksTooltip, #inventory .GiftsTooltip {' + 'position: absolute;' + 'z-index: 99;' + 'width: 240px;' + 'border: 1px solid rgb(162, 195, 215);' + 'border-radius: 8px;' + 'box-shadow: 0px 0px 4px 0px rgba(0,0,0,0.1);' + 'padding: 3px 7px 4px 7px;' + 'background-color: #F2F2F2;' + 'font: normal 10px/17px Tahoma, Helvetica, Arial, sans-serif;' + 'color: #057;' + 'opacity: 0;' + 'visibility: hidden;' + 'transition: opacity 400ms, visibility 400ms; }'); sheet.insertRule('#inventory .EquipmentsTooltip, #inventory .BoostersTooltip {' + 'margin: -33px 0 0 210px;' + 'height: 43px; }'); sheet.insertRule('#inventory .BooksTooltip, #inventory .GiftsTooltip {' + 'margin: -50px 0 0 210px;' + 'height: 60px; }'); sheet.insertRule('#inventory .EquipmentsTooltip b, #inventory .BoostersTooltip b, #inventory .BooksTooltip b, #inventory .GiftsTooltip b {' + 'font-weight:bold; }'); sheet.insertRule('#inventory .imgMoney {' + 'background-size: 12px 12px;' + 'background-repeat: no-repeat;' + 'width: 12px;' + 'height: 14px;' + 'vertical-align: text-bottom;' + 'background-image: url("http://i.harem-battle.club/images/2017/01/07/0Gsvn.png");' + 'display: inline-block; }'); } /* ========= Harem ========= */ function ModifyHarem() { // initialize var i = 0, GirlId = '', GirlName = '', Anchor = '', Specialty = [0, 0, 0], // [Hardcore, Charm, Know-how] UnlockedSc = 0, AvailableSc = 0, IncHourly = 0, IncCollect = 0, HList = [], Saffection = 0, // S= Stats tab Smoney = 0, Skobans = 0, ScenesLink = ''; var EvoReq = []; EvoReq.push({ affection: 15, money: 3150, kobans: 30 }); EvoReq.push({ affection: 50, money: 6750, kobans: 90 }); EvoReq.push({ affection: 150, money: 18000, kobans: 150 }); EvoReq.push({ affection: 700, money: 135000, kobans: 240 }); EvoReq.push({ affection: 1750, money: 968000, kobans: 300 }); // parse haremettes list $('#harem_left').find('div[girl]').each( function(){ i++; GirlId = $(this).attr('girl'); GirlName = $(this).find('h4').text(); IncCollect += parseInt($(this).find('.sal').text(), 10); HList.push({Id: GirlId, Order: i, Name: GirlName}); // add anchor $(this).attr('id', GirlName); // is opened girl? if ($(this).hasClass('opened')) Anchor = GirlName; // display: haremette number $(this).find('h4').append('<div class="HaremetteNb">' + i + '</div>'); }); var HaremBottom = '<a href="#' + GirlName + '">Bottom</a>'; // auto-scroll to anchor location.hash = '#' + Anchor; // get haremettes stats & display wiki link i = 0; $('#harem_right').children('[girl]').each( function() { // display: wiki link $(this).append('<div class="WikiLink"><a href="http://harem-battle.club/wiki/Harem-Heroes/HH:' + HList[i].Name + '" target="_blank"> her wiki page </a></div>'); i++; var j = 0, Taffection = 0, // T= Total requirements (right tooltip) Tmoney = 0, Tkobans = 0, FirstLockedScene = 1, AffectionTT = 'She is your <b>' + i + '</b>th haremette. Her evolution costs are:<br />', girl_quests = $(this).find('.girl_quests'); // get stats: specialty Spe = parseInt($(this).find('h3 > span').attr('carac'), 10) - 1; Specialty[Spe]++; // get stats: hourly income IncHourly += parseInt($(this).find('.salary').text(), 10); girl_quests.find('g').each( function() { // prepare affection tooltip var Raffection = EvoReq[j].affection * i, // R= Required for this star (right tooltip) Rmoney = EvoReq[j].money * i, Rkobans = EvoReq[j].kobans * i; Taffection += Raffection; Tmoney += Rmoney; Tkobans += Rkobans; j++; AffectionTT += '<b>' + j + '</b><span class="imgStar"></span> : ' + NbCommas(Raffection) + ' affection, ' + NbCommas(Rmoney) + ' <span class="imgMoney"></span> or ' + NbCommas(Rkobans) + ' <span class="imgKobans"></span><br />'; // get stats: unlocked/available scenes & prepare scenes link AvailableSc++; ScenesLink += (ScenesLink === '') ? 'hh_scenes=' : ','; var SceneHref = $(this).parent().attr('href'); if ($(this).hasClass('grey')) { if (FirstLockedScene === 0) { Saffection += Raffection; ScenesLink += '0'; } else { FirstLockedScene = 0; var XpLeft = girl_quests.parent().children('.girl_exp_left'); var isUpgradable = girl_quests.parent().children('.green_text_button'); // girl has Xp left Saffection += (XpLeft.length) ? parseInt(XpLeft.text().match(/^.+: (.*)$/)[1].replace(',',''), 10) : 0; // girl is upgradable ScenesLink += (isUpgradable.length) ? '0.' + isUpgradable.attr('href').substr(7) : '0'; } Smoney += Rmoney; Skobans += Rkobans; } else { UnlockedSc++; ScenesLink += $(this).parent().attr('href').substr(7); } }); // change scene links girl_quests.children('a').each(function() { var attr = $(this).attr('href'); if (typeof attr !== typeof undefined && attr !== false) { $(this).attr('href', attr + '?' + ScenesLink); } }); ScenesLink = ''; AffectionTT += '<b>Total:</b> ' + NbCommas(Taffection) + ' affection, ' + NbCommas(Tmoney) + ' <span class="imgMoney"></span> or ' + NbCommas(Tkobans) + ' <span class="imgKobans"></span>'; // display: Affection costs tooltip girl_quests.parent().children('h4').prepend('<span class="CustomTT"></span><div class="AffectionTooltip">' + AffectionTT + '</div>'); }); // ### TAB: Quick List ### // order haremettes alphabetically HList.sort(function(a, b) { var textA = a.Name.toUpperCase(), textB = b.Name.toUpperCase(); return (textA < textB) ? -1 : (textA > textB) ? 1 : 0; }); // html quick list var len = HList.length, QListString = '<div class="QListContent"><span class="Title">Quick List:</span>'; for (i = 0; i < len; i++) { QListString += '<br /><a f="ql_girl" girl="' + HList[i].Id + '" href="#' + HList[i].Name + '">' + HList[i].Name + '</a> (#' + HList[i].Order + ')'; } QListString += '</div>'; // ### TAB: Stats ### // Market stocks try { var lsMarket = JSON.parse(localStorage.getItem('lsMarket')), d = new Date(lsMarket.restock.time); console.log(lsMarket); // buyable stocks if (new Date() > lsMarket.restock.time || Hero.infos.level > lsMarket.restock.herolvl) { var RestockInfo = '> The <a href="../shop.html">Market</a> restocked since your last visit.'; } else { var marketBookTxt = lsMarket.buyable.potion.Nb + ' book' + (lsMarket.buyable.potion.Nb > 1 ? 's' : '') + ' (' + NbCommas(lsMarket.buyable.potion.Xp) + ' Xp)', marketGiftTxt = lsMarket.buyable.gift.Nb + ' gift' + (lsMarket.buyable.gift.Nb > 1 ? 's' : '') + ' (' + NbCommas(lsMarket.buyable.gift.Xp) + ' Aff)', RestockInfo = '- ' + marketBookTxt + ' for ' + NbCommas(lsMarket.buyable.potion.Value) + ' <img src="http://i.harem-battle.club/images/2017/01/07/0Gsvn.png">' + '<br />- ' + marketGiftTxt + ' for ' + NbCommas(lsMarket.buyable.gift.Value) + ' <img src="http://i.harem-battle.club/images/2017/01/07/0Gsvn.png">' + '<br /><font style="color:gray;">Restock: ' + d.toLocaleString() + ' (or level ' + (Hero.infos.level+1) + ')</font>'; } // my stocks var myArmorTxt = NbCommas(lsMarket.stocks.armor.Nb) + (lsMarket.stocks.armor.Nb > 99 ? '+ ' : ' ') + 'equipment' + (lsMarket.stocks.armor.Nb > 1 ? 's' : ''), myBoosterTxt = NbCommas(lsMarket.stocks.booster.Nb) + ' booster' + (lsMarket.stocks.booster.Nb > 1 ? 's' : ''), myBookTxt = NbCommas(lsMarket.stocks.potion.Nb) + ' book' + (lsMarket.stocks.potion.Nb > 1 ? 's' : '') + ' (' + NbCommas(lsMarket.stocks.potion.Xp) + ' Xp)', myGiftTxt = NbCommas(lsMarket.stocks.gift.Nb) + ' gift' + (lsMarket.stocks.gift.Nb > 1 ? 's' : '') + ' (' + NbCommas(lsMarket.stocks.gift.Xp) + ' Aff)', MarketStocks = '- ' + myArmorTxt + ', ' + myBoosterTxt + '<br />- ' + myBookTxt + '<br />- ' + myGiftTxt + '<span class="subTitle">Currently Buyable Stocks:</span>' + RestockInfo; } catch(e) { var MarketStocks = (lsAvailable == 'yes') ? '> Visit the <a href="../shop.html">Market</a> first.' : '> Your webbrowser is not compatible.'; } var StatsString = '<div class="StatsContent"><span class="Title">Harem Stats:</span>' + '<span class="subTitle" style="margin-top:-10px;">' + i + ' haremettes:</span>' + '- ' + Specialty[0] + ' Hardcore, ' + Specialty[1] + ' Charm, ' + Specialty[2] + ' Know-how' + '<br />- ' + UnlockedSc + '/' + AvailableSc + ' unlocked scenes' + '<span class="subTitle">Money incomes:</span>' + '~' + NbCommas(IncHourly) + ' <img src="http://i.harem-battle.club/images/2017/01/07/0Gsvn.png"> per hour' + '<br />' + NbCommas(IncCollect) + ' <img src="http://i.harem-battle.club/images/2017/01/07/0Gsvn.png"> when all collectable' + '<span class="subTitle">Required to unlock all locked scenes:</span>' + '- ' + NbCommas(Saffection) + ' affection' + '<br />- ' + NbCommas(Smoney) + ' <img src="http://i.harem-battle.club/images/2017/01/07/0Gsvn.png">' + ' or ' + NbCommas(Skobans) + ' <img src="http://i.harem-battle.club/images/2016/08/30/gNUo3XdY.png">' + '<span class="subTitle">My Stocks:</span>' + MarketStocks + '</div>'; // add custom bar buttons/links & quick list div & stats div $('#harem_left').append('<div id="CustomBar">' + '<img f="list" src="http://i.harem-battle.club/images/2017/09/10/FRW.png">' + '<img f="stats" src="http://i.harem-battle.club/images/2017/09/11/FRh.png">' + '<div class="TopBottomLinks"><a href="#Bunny">Top</a> | ' + HaremBottom + '</div>' + '</div>' + '<div id="TabsContainer">' + QListString + StatsString + '</div>'); // cache TabsContainer = $('#TabsContainer'); QList = TabsContainer.children('.QListContent'); Stats = TabsContainer.children('.StatsContent'); // catch clicks $('body').click(function(e) { var clickOn = e.target.getAttribute('f'); switch (clickOn) { // on quick list button case 'list': toggleTabs(QList, Stats); break; // on stats button case 'stats': toggleTabs(Stats, QList); break; // on a girl in quick list case 'ql_girl': var clickedGirl = e.target.getAttribute('girl'); $('#harem_left').find('[girl=' + clickedGirl + ']').triggerHandler('click'); break; // somewhere else except custom containers default: var clickedContainer = $(e.target).closest('[id]').attr('id'); if (clickedContainer == 'TabsContainer') return; TabsContainer.fadeOut(400); } }); // tabs switching animations function toggleTabs(tabIn, tabOut) { if (TabsContainer.css('display') == 'block') { if (tabOut.css('display') == 'block') { tabOut.fadeOut(200); setTimeout( function(){ tabIn.fadeIn(300); }, 205 ); } else { TabsContainer.fadeOut(400); } } else { tabOut.toggle(false); tabIn.toggle(true); TabsContainer.fadeIn(400); } } // ----------------- // CSS RULES // ----------------- sheet.insertRule('#harem_left .HaremetteNb {' + 'float: right;' + 'line-height: 14px;' + 'font-size: 12px; }'); sheet.insertRule('#CustomBar {' + 'position: absolute;' + 'z-index: 99;' + 'width: 100%;' + 'padding: 3px 10px 0 3px;' + 'font: bold 10px Tahoma, Helvetica, Arial, sans-serif; }'); sheet.insertRule('#CustomBar img {' + 'width: 20px;' + 'height: 20px;' + 'margin-right: 3px;' + 'opacity: 0.5; }'); sheet.insertRule('#CustomBar img:hover {' + 'opacity: 1;' + 'cursor: pointer; }'); sheet.insertRule('#CustomBar .TopBottomLinks {' + 'float: right;' + 'margin-top: 2px; }'); sheet.insertRule('#CustomBar a, #TabsContainer a, #harem_right .WikiLink a {' + 'color: #057;' + 'text-decoration: none; }'); sheet.insertRule('#CustomBar a:hover, #TabsContainer a:hover, #harem_right .WikiLink a:hover {' + 'color: #B14;' + 'text-decoration: underline; }'); sheet.insertRule('#TabsContainer {' + 'position: absolute;' + 'z-index: 99;' + 'margin: -270px 0 0 -1px;' + 'width: 240px;' + 'height: 270px;' + 'overflow-y: scroll;' + 'border: 1px solid rgb(156, 182, 213);' + 'box-shadow: 1px -1px 1px 0px rgba(0,0,0,0.3);' + 'font: normal 10px/16px Tahoma, Helvetica, Arial, sans-serif;' + 'color: #000000;' + 'background-color: #ffffff;' + 'display: none; }'); sheet.insertRule('#TabsContainer > div {' + 'padding: 1px 0 8px 10px; }'); sheet.insertRule('#TabsContainer .Title {' + 'margin-left: -5px;' + 'font: bold 12px/22px Tahoma, Helvetica, Arial, sans-serif;' + 'color: #B14; }'); sheet.insertRule('#TabsContainer .subTitle {' + 'padding-top: 10px;;' + 'font-weight: bold;' + 'display: block; }'); sheet.insertRule('#TabsContainer img {' + 'width: 14px;' + 'height: 14px;' + 'vertical-align: text-bottom; }'); sheet.insertRule('#harem_right .CustomTT {' + 'float: right;' + 'margin-left: -25px;' + 'background-image: url("http://i.harem-battle.club/images/2017/09/13/FPE.png");' + 'background-size: 18px 18px;' + 'width: 18px;' + 'height: 18px; }'); sheet.insertRule('#harem_right .CustomTT:hover {' + 'cursor: help; }'); sheet.insertRule('#harem_right .CustomTT:hover + div {' + 'opacity: 1;' + 'visibility: visible; }'); sheet.insertRule('#harem_right .AffectionTooltip {' + 'position: absolute;' + 'z-index: 99;' + 'margin: -130px 0 0 -28px;' + 'width: 280px;' + 'height: 127px;' + 'border: 1px solid rgb(162, 195, 215);' + 'border-radius: 8px;' + 'box-shadow: 0px 0px 4px 0px rgba(0,0,0,0.1);' + 'padding: 3px 7px 4px 7px;' + 'background-color: #F2F2F2;' + 'font: normal 10px/17px Tahoma, Helvetica, Arial, sans-serif;;' + 'text-align: left;' + 'opacity: 0;' + 'visibility: hidden;' + 'transition: opacity 400ms, visibility 400ms; }'); sheet.insertRule('#harem_right .AffectionTooltip b {' + 'font-weight: bold; }'); sheet.insertRule('#harem_right .WikiLink {' + 'float: right;' + 'margin: -13px 7px 0 0;' + 'font-size: 12px; }'); sheet.insertRule('#harem_right .imgStar, #harem_right .imgMoney, #harem_right .imgKobans {' + 'background-size: 10px 10px;' + 'background-repeat: no-repeat;' + 'width: 10px;' + 'height: 14px;' + 'display: inline-block; }'); sheet.insertRule('#harem_right .imgStar {' + 'background-image: url("http://i.harem-battle.club/images/2016/12/29/R9HWCKEtD.png"); }'); sheet.insertRule('#harem_right .imgMoney {' + 'background-image: url("http://i.harem-battle.club/images/2017/01/07/0Gsvn.png"); }'); sheet.insertRule('#harem_right .imgKobans {' + 'background-image: url("http://i.harem-battle.club/images/2016/08/30/gNUo3XdY.png"); }'); } /* ========== Scenes ========== */ function ModifyScenes() { // parse GET hh_scenes variable var currentScene = CurrentPage.substr(7), hh_scenesParams = new URL(window.location.href).searchParams.get('hh_scenes'), hh_scenes = hh_scenesParams.split(','), len = hh_scenes.length; // no scenes, less than 3 or more than 5 (human manipulation) if (!len || len < 3 || len > 5) { return false; } else { var ScenesNavigate = '<div class="Scenes" style="display:block;">Navigate:<br/>', SceneLink = ''; for (var i = 0; i < len; i++ ) { // string format certification if (/^(0\.)?[0-9]{1,5}$/.test(hh_scenes[i]) === true) { if (hh_scenes[i] == currentScene) { SceneLink = '<span class="current">current</span>'; } else if (hh_scenes[i] == '0') { SceneLink = '<span class="locked">locked</span>'; } else if (parseInt(hh_scenes[i], 10) < 1) { SceneLink = '<a href="/quest/' + hh_scenes[i].substr(2) + '">unlock it!</a>'; } else { SceneLink = '<a href="/quest/' + hh_scenes[i] + '?hh_scenes=' + hh_scenesParams + '">scene</a>'; } ScenesNavigate += (i+1) + '<span class="imgStar"></span> ' + SceneLink + '<br />'; } // string error: doesn't match (human manipulation) else return false; } ScenesNavigate += '<span class="backToHarem">< <a href="' + $('#breadcrumbs').children('a').eq(2).attr('href') + '">Harem</a></span></div>'; // insert navigate interface $('#controls').append(ScenesNavigate); } // ----------------- // CSS RULES // ----------------- sheet.insertRule('#controls .Scenes {' + 'height:200px;' + 'box-shadow: 3px 3px 0px 0px rgba(0,0,0,0.3);' + 'background-color:#000000;' + 'background: linear-gradient(to bottom, rgba(196,3,35,1) 0%,rgba(132,2,30,1) 51%,rgba(79,0,14,1) 100%);' + 'text-shadow: 2px 2px 2px rgba(0, 0, 0, 0.4);' + 'display: block !important; }'); sheet.insertRule('#controls .current {' + 'color: rgb(251, 255, 108); }'); sheet.insertRule('#controls .locked {' + 'color: rgb(150, 99, 99); }'); sheet.insertRule('#controls .Scenes a {' + 'color: rgb(233, 142, 228);' + 'text-decoration: none; }'); sheet.insertRule('#controls .Scenes a:hover {' + 'color: rgb(254, 202, 255);' + 'text-decoration: underline; }'); sheet.insertRule('#controls .backToHarem {' + 'position: absolute;' + 'bottom: 0;' + 'left: 0;' + 'width: 100%; }'); sheet.insertRule('#controls .imgStar {' + 'background-image: url("http://i.harem-battle.club/images/2016/12/29/R9HWCKEtD.png");' + 'background-size: 10px 10px;' + 'background-repeat: no-repeat;' + 'width: 10px;' + 'height: 18px;' + 'display: inline-block; }'); } // is localstorage available? function lsTest() { try { localStorage.setItem('test', 'test'); localStorage.removeItem('test'); return true; } catch(e) { return false; } } // adds thousands commas function NbCommas(x) { return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); }