// ==UserScript==
// @name HH Unlock Images
// @namespace hhUnlock
// @version 2.06
// @license MIT
// @description This script unlocks images of both recruited girls and non-recruited girls.
// @author YanDee
// @match *://nutaku.haremheroes.com/harem*
// @match *://*.hentaiheroes.com/harem*
// @match *://*.gayharem.com/harem*
// @match *://*.comixharem.com/harem*
// @match *://*.hornyheroes.com/harem*
// @match *://*.pornstarharem.com/harem*
// @grant unsafeWindow
// ==/UserScript==
(function(uW, $, girlsDataList, number_format_lang, number_reduce, GT) {
if (document.visibilityState == "hidden" || typeof uW.Girl?.prototype?.showInRightOrig == "function"){
return;
}
let YD_sheet = false;
function YD_addStyle(rules_obj){
if (!YD_sheet){
let style = document.createElement("style");
document.getElementsByTagName("head")[0].appendChild(style);
YD_sheet = document.styleSheets[document.styleSheets.length - 1];
}
Object.entries(rules_obj).map(v => {
YD_sheet.insertRule(v[0] + "{" + Object.entries(v[1]).map(
s => s[0] + ":" + s[1] + ";"
).join("") + "}");
});
}
let totalIncome = Math.round(Object.values(girlsDataList).reduce((t,v) => v.own? t + v.salary_per_hour : t, 0)),
$girls_levels = $("#filter_girls").siblings(".girls_levels");
$girls_levels.children().addClass("orig_node");
$girls_levels.append(
$("<span>", {class: "hudSC_mix_icn"}),
$("<p>").append($("<span>", {class: "pompous_text", text: GT.design.haremdex_income})),
$("<p>").append(
$("<p>", {
class: "focus_text",
hh_title: number_format_lang(totalIncome) + " / " + GT.time.h,
"tooltip-id": "tooltip_1",
text: (totalIncome >= 1e6? number_reduce(totalIncome) : number_format_lang(totalIncome)) + " / " + GT.time.h
}),
$("<p>", {
class: "focus_text",
hh_title: number_format_lang(24 * totalIncome) + " / " + GT.time.d,
"tooltip-id": "tooltip_1",
text: (24 * totalIncome >= 1e6? number_reduce(24 * totalIncome) : number_format_lang(24 * totalIncome)) + " / " + GT.time.d
})
)
);
if (sessionStorage.haremLevDispMode != "default"){
sessionStorage.haremLevDispMode = "income";
$("div.girls_levels").addClass("show_income");
}
let styles = {
"div.girls_levels": {"cursor": "pointer"},
"#harem_left div.girls_levels.show_income>.orig_node": {"display": "none"},
"#harem_left div.girls_levels:not(.show_income)>:not(.orig_node)": {"display": "none"},
"#harem_left div.girls_levels p:not(.orig_node)": {"margin": "0"},
"#harem_whole #harem_right img.avatar": {"filter": "none"},
"#harem_whole #harem_right div.middle_part.missing_girl": {"margin-top": "0"},
"#harem_right .diamond-bar .showing": {
"box-shadow": "0 0 3px 5px rgba(20,255,0,0.75)",
"opacity": "1"
},
"#harem_right .diamond-bar :not(.showing)": {"cursor": "pointer"},
"div.diamond-bar>.diamond.anim:before": {"content": "'A'"}
};
YD_addStyle(styles);
$("#harem_left").on("click", ".girls_levels", function(){
this.classList.toggle("show_income");
sessionStorage.haremLevDispMode = this.classList.contains("show_income")? "income" : "default";
});
$("#harem_right").on("click contextmenu", ".diamond-bar .diamond:not(.showing)", function(e){
$(this).addClass("showing").siblings(".showing").removeClass("showing");
changeSkin(this.getAttribute("grade"), $(this).closest("[girl]").attr("girl"));
return e.type != "contextmenu";
});
function getDiamondBar(grade){
let body = $("<div>", {class: "diamond-bar"});
for (let i = 0; i < grade; i++) {
$("<div>", {class: "diamond locked" + (i? "" : " showing"), grade: i}).appendTo(body);
};
return body;
}
function getHeader(g_id){
let g_info = uW.girlsDataList[g_id] || {}, gem = g_info.element_data?.type, flavor = g_info.element_data?.flavor || "??";
let body = $("<h3>", {text: g_info.ref?.full_name || g_info.name || "Unknown"});
if (gem){
body.append($("<span>", {
class: gem + "_element_icn element_harem_details_icn domination-toggle",
"data-src": g_info.element_data?.ico_url || uW.IMAGES_URL + "/pictures/girls_elements/" + flavor + ".png",
"generic-tooltip": flavor
}));
}
body.append($("<span>", {carac: "class" + g_info.class}));
return [body, $("<p>", {class: "girl-rarity " + g_info.rarity, text: GT.design["girls_rarity_" + g_info.rarity]})];
}
function changeSkin(num, girl_id){
let gData = uW.girlsDataList[girl_id], $box = $(".avatar-box", "#harem_right");
if (typeof uW.girlAnimationInstance?.removeCurrentAnimation == "function"){
uW.girlAnimationInstance.removeCurrentAnimation();
}
if (Array.isArray(gData?.animated_grades) && gData.animated_grades.includes(String(num)) && !uW.Hero.infos.no_pachinko_anim){
$box.empty().append(
$("<canvas>", {class: "animated-girl-display", id: "id_" + girl_id + "_grade_" + num + "_animated"})
);
uW.girlAnimationInstance = new uW.GirlAnimation;
uW.girlAnimationInstance.initAnimation(girl_id, num);
return;
}
let ava = (gData?.avatar || "").replace(/av(a|b)\d/g, "ava" + num).toImageUrl("ava");
if ($box.length){
$box.empty().append(
$("<img>", {class: "avatar", src: ava})
);
return;
}
$("img.avatar:not([unappear])", "#harem_right").attr("src", ava);
}
function perform(){
let $opened = $("#harem_right").children(".opened[girl]"),
girl_id = $opened.attr("girl"),
g_data = girlsDataList[girl_id];
if (g_data?.own){
$(".diamond-bar .diamond.selected", $opened).addClass("showing");
}
else {
let grade = ((g_data?.graded2 || "").match(/<g[^>]*>[^<>]*<[^>]*\/g>/gi) || []).length + 1;
$("img.avatar:not([unappear])", $opened).before(getHeader(girl_id)).after(getDiamondBar(grade));
changeSkin(0, girl_id);
}
if (Array.isArray(g_data?.animated_grades)){
$(".diamond-bar .diamond", $opened).each((i,d) => $(d).toggleClass("anim", g_data.animated_grades.includes(String(i))));
}
}
uW.Girl.prototype.showInRightOrig = uW.Girl.prototype.showInRight;
uW.Girl.prototype.showInRight = function(){
this.showInRightOrig.apply(this);
perform();
};
perform();
})(unsafeWindow, unsafeWindow.jQuery, unsafeWindow.girlsDataList, unsafeWindow.number_format_lang, unsafeWindow.number_reduce, unsafeWindow.GT);