v0.14.9 - Rewrite gear scraper with correct DOM selectors

- Character Equipment page (?s=Character&ss=eq): reads #eqsb > .eqb
  divs with onmouseover='equips.set(ID,...)' for item names and IDs
- triggerAllTooltips() calls equips.set() for each item to populate
  the #popup_box tooltip, then parses full stat blocks (ADB, damage,
  mitigation, attributes, burden, interference, condition)
- Armory Organize page: reads #equiplist table rows with
  onmouseover='hover_equip(ID)' and checkbox values
- Reads right-side #equipinfo preview for condition and stats
- Modify detail page: reads full stat tables
This commit is contained in:
GaboGG 2026-07-27 15:12:28 -04:00
parent 6167df57b4
commit a7a304f5d4
28 changed files with 3054 additions and 546 deletions

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 763 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 909 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,47 @@
function api_call(h,g,d){h.open("POST",MAIN_URL+"json");h.setRequestHeader("Content-Type","application/json");h.withCredentials=!0;h.onreadystatechange=d;h.send(JSON.stringify(g))}function api_response(h){if(4==h.readyState)if(200==h.status)if(h=JSON.parse(h.responseText),void 0!=h.login)top.location.href=login_url;else return h;else alert("Server communication failed: "+h.status+" ("+h.responseText+")"),document.location+="";return!1}
function number_format(h){return h.toString().replace(/\B(?=(\d{3})+(?!\d))/g," ")}var e=function(h){return document.getElementById(h)};
function Common(){function h(a,f,l){a=a.getElementsByTagName("DIV");f=["f2l"+f,"f2r"+f,"f4l"+f,"f4r"+f];var r=["f2l"+l,"f2r"+l,"f4l"+l,"f4r"+l];l="a"==l?"#0030CB":"#5C0D11";for(var n=0;n<a.length;n++)for(var w=0;w<f.length;w++)a[n].className=a[n].className.replace(f[w],r[w]),a[n].style.color=l}this.goto_arena=function(){document.location=MAIN_URL+"?s=Battle&ss=ar"};this.goto_ring=function(){document.location=MAIN_URL+"?s=Battle&ss=rb"};this.goto_grindfest=function(){document.location=MAIN_URL+"?s=Battle&ss=gr"};
this.goto_tower=function(){document.location=MAIN_URL+"?s=Battle&ss=tw"};this.findPos=function(a){var f=0,l=0;if(a.offsetParent){do f+=a.offsetLeft,l+=a.offsetTop;while(a=a.offsetParent)}return[f,l]};this.findPosWithScroll=function(a){var f=0,l=0;if(a.offsetParent){do f+=a.offsetLeft+(a.scrollLeft?a.scrollLeft:0),l+=a.offsetTop+(a.scrollTop?a.scrollTop:0);while(a=a.offsetParent)}return[f,l]};this.findScrollOffset=function(a){var f=0,l=0;if(a.offsetParent){do f+=a.scrollLeft?a.scrollLeft:0,l+=a.scrollTop?
a.scrollTop:0;while(a=a.offsetParent)}return[f,l]};this.getCursorPosition=function(a){a=a||window.event;var f={x:0,y:0};if(a.pageX||a.pageY)f.x=a.pageX,f.y=a.pageY;else{var l=document.documentElement,r=document.body;f.x=a.clientX+(l.scrollLeft||r.scrollLeft)-(l.clientLeft||0);f.y=a.clientY+(l.scrollTop||r.scrollTop)-(l.clientTop||0)}return f};this.decimalround=function(a,f){return Math.round(a*Math.pow(10,f))/Math.pow(10,f)};this.suppress_popups=!1;this.show_popup_box=function(a,f,l,r,n,w,B,D,H,F){if(!this.suppress_popups){var G=
e("popup_box"),J=[0,0],I=[0,0],L=0;void 0!=w&&(L=w.offsetWidth,J=common.findPosWithScroll(w),""!=n&&(n=e(n),I[0]=n.scrollLeft,I[1]=n.scrollTop));G.style.left=("right"==B?J[0]-I[0]+L+a:J[0]-I[0]-a-l)+"px";G.style.top=J[1]-I[1]+f+"px";G.style.width=l+"px";G.style.height=r+"px";G.innerHTML="<div>"+D+"</div><div>"+H+"</div><div>"+F+"</div>";G.style.visibility="visible"}};this.hide_popup_box=function(){e("popup_box").removeAttribute("style")};this.show_itemc_box=function(a,f,l,r,n,w){this.show_popup_box(a,
f,398,75,l,r,n,dynjs_itemc[w].n,dynjs_itemc[w].q,"Consumable")};this.show_itemr_box=function(a,f,l,r,n,w,B,D){this.show_popup_box(a,f,398,85,l,r,n,w,B,D)};var g=void 0,d=0,m=0,q=0,u=function(){var a=g.scrollTop;g.scrollTop=0<d?Math.min(g.scrollTop+q,m):Math.max(g.scrollTop-q,m);a!=g.scrollTop?setTimeout(u,1):(g=void 0,m=d=0)};this.scrollpane_up=function(a,f,l){void 0==g&&(g=e(a),d=-1,m=Math.max(0,g.scrollTop-f),q=void 0!=l?1E3:25,u())};this.scrollpane_down=function(a,f,l){void 0==g&&(g=e(a),d=1,m=
g.scrollTop+f,q=void 0!=l?1E3:25,u())};this.hookEvent=function(a,f,l){"string"==typeof a&&(a=e(a));null!=a&&(a.addEventListener?("mousewheel"==f&&a.addEventListener("DOMMouseScroll",l,!1),a.addEventListener(f,l,!1)):a.attachEvent&&a.attachEvent("on"+f,l))};this.unhookEvent=function(a,f,l){"string"==typeof a&&(a=e(a));null!=a&&(a.removeEventListener?("mousewheel"==f&&a.removeEventListener("DOMMouseScroll",l,!1),a.removeEventListener(f,l,!1)):a.detachEvent&&a.detachEvent("on"+f,l))};this.cancelEvent=
function(a){a=a?a:window.event;a.stopPropagation&&a.stopPropagation();a.preventDefault&&a.preventDefault();a.cancelBubble=!0;a.cancel=!0;return a.returnValue=!1};this.number_format=function(a){x=(a+"").split(".");x1=x[0];x2=1<x.length?"."+x[1]:"";for(a=/(\d+)(\d{3})/;a.test(x1);)x1=x1.replace(a,"$1,$2");return x1+x2};var v=[9,5,10,10,10,10,10,10,9,9,4,4,5,10,11,8,8,8,11,11,4,4,4];this.get_dynamic_digit_string=function(a){a=this.number_format(a);for(var f="",l=0,r=a.length-1;0<=r;r--){var n=","==a.charAt(r)?
11:"."==a.charAt(r)?10:"+"==a.charAt(r)?15:":"==a.charAt(r)?22:"-"==a.charAt(r)?16:parseInt(a.charAt(r));f=f+'<div style="float:right; height:12px; width:'+(v[n]+1)+"px; background:transparent url("+IMG_URL+"font/12b.png) 0px -"+12*n+'px"></div>';l+=v[n]}return'<div style="position:relative; display:inline; height:12px; width:'+l+'px">'+f+"</div>"};this.apply_select=function(a){h(a,"b","a");a.style.color="#0030CB"};this.apply_unselect=function(a){h(a,"a","b");a.removeAttribute("style")};var y=void 0;
this.text_select=function(a){var f=y!=a;this.text_unselect();f&&(this.apply_select(a),y=a)};this.text_unselect=function(){void 0!=y&&(this.apply_unselect(y),y=void 0)}}var common=new Common;
function ItemShop(){function h(){y=!0;1>d||1>m?y=!1:"shop_pane"==g&&m*u>current_credits&&(y=!1);e("accept_button").src=IMG_URL+"shops/accept"+(y?"":"_d")+".png";e("cost_field").value=u;e("sum_field").value=(m*u).toLocaleString("en")}var g=void 0,d=0,m=0,q=void 0,u=0,v=0,y=!1;this.set_item=function(a,f,l,r,n){f==d&&a==g&&(a=void 0,r=l=f=0,n=void 0);g=a;d=f;u=r;q=f&&!n?dynjs_itemc[f].n:n;v=l;this.set_count(0<f?1:0);h()};this.set_count=function(a){m=Math.max(0,Math.min(a,v));e("count_field").value=m;
h()};this.increase_count=function(a){this.set_count(1==m&&1<a?a:m+a)};this.read_count=function(){m=Math.max(0,parseInt(e("count_field").value));0<d&&m>v&&this.set_count(v);h()};this.commit_transaction=function(){y&&confirm("Are you sure you wish to "+("shop_pane"==g?"purchase":"sell")+" "+m+' "'+q.replace("&#039;","'")+'" for '+common.number_format(m*u)+" credits ?")&&(e("select_mode").value=g,e("select_item").value=d,e("select_count").value=m,e("shopform").submit())}}
function Snowflake(){var h=e("shrine_info"),g=e("shrine_artifact"),d=e("shrine_trophy"),m=e("shrine_collectible"),q=e("shrine_offertext"),u=0,v=0,y=0,a="",f="",l=void 0,r=!1;this.set_shrine_item=function(n,w,B,D){n==u&&(B=w=n=0,D=void 0);u=n;v=w;y=B;l=D;r=!0;n=0;1>u?(e("accept_equip").style.display="none",r=!1,n=1):2E4<=u&&3E4>u?(r=!0,n=2):3E4<=u&&4E4>u?(r=y<=v,n=3):7E4<=u&&8E4>u&&(r=!0,n=4);if(3==n)for(e("accept_equip").style.display="",e("accept_reward").style.display="none",w=e("accept_equip").querySelectorAll(".accept_equip"),
B=0;B<w.length;B++)w[B].disabled=r?"":"disabled";else e("accept_equip").style.display="none",e("accept_reward").style.display=1<n?"":"none",e("accept_reward").disabled=r?"":"disabled";h.style.display=1==n?"":"none";g.style.display=2==n?"":"none";d.style.display=3==n?"":"none";m.style.display=4==n?"":"none";q.innerHTML=0==u?"":y>v?"You have "+v+" / "+y+" items required for this offering.":"Offer "+y+"x "+l+" for :"};this.submit_shrine_reward=function(n,w){a=n;f=w;this.commit_transaction()};this.commit_transaction=
function(){r&&confirm("Are you sure you wish to offer Snowflake "+(1<y?y+"x":"a")+" "+l.replace("&#039;","'")+" ?")&&(e("select_item").value=u,e("select_reward_type").value=a,e("select_reward_slot").value=f,e("shopform").submit())}}
function MoogleMail(){var h=0,g=void 0;this.set_mooglemail_item=function(d,m){if(void 0==m||"1"!=m.getAttribute("data-locked"))d==h&&(d=0),0==d?(common.text_unselect(),h=0):(void 0!=m&&common.text_select(m),h=d,"equip"==g&&this.apply_attachment())};this.set_mooglemail_pane=function(d){this.set_mooglemail_item(0);g=g==d?void 0:d;e("mmail_attachinfo").style.display=void 0==g?"":"none";e("mmail_attachitem").style.display="item"==g?"":"none";e("mmail_attachequip").style.display="equip"==g?"":"none";e("mmail_attachcredits").style.display=
"credits"==g?"":"none";e("mmail_attachhath").style.display="hath"==g?"":"none"};this.apply_attachment=function(){if(void 0!=g){var d="equip"==g?1:Math.max(1,parseInt(e("count_"+g).value));0<d&&(e("action").value="attach_add",e("select_item").value=h,e("select_count").value=d,e("select_pane").value=g,e("mailform").submit())}};this.check_apply_attachment=function(d){13==d.keyCode&&this.apply_attachment()};this.mmail_send=function(){var d="";0<attach_count&&(d="You have attached "+attach_count+(1==attach_count?
" item":" items")+(0<attach_cod?", and the CoD is set to "+attach_cod+" credits, kupo!":", but you have not set a CoD, kupo! The attachments will be a gift, kupo!"));0<send_cost&&(d+=" Sending it will cost you "+send_cost+" credits, kupo!");confirm(d+" Are you sure you wish to send this message, kupo?")&&(e("action").value="send",e("mailform").submit())};this.mmail_save=function(){e("action").value="save";e("mailform").submit()};this.mmail_discard=function(){confirm("Are you sure you wish to discard this message, kupo?")&&
(e("action").value="discard",e("mailform").submit())};this.remove_attachment=function(d){0<mail_state&&0<attach_cod&&!confirm("Removing the attachments will deduct "+attach_cod+" Credits from your account, kupo! Are you sure?")||(e("action").value="attach_remove",e("action_value").value=d,e("mailform").submit())};this.return_mail=function(){confirm("This will return the message to the sender, kupo! Are you sure?")&&(e("action").value="return_message",e("mailform").submit())};this.check_set_cod=function(d){13==
d.keyCode&&this.set_cod()};this.set_cod=function(){e("action").value="attach_cod";e("action_value").value=Math.max(0,parseInt(e("newcod").value));e("mailform").submit()}}
function Equips(){var h=0,g=void 0;this.set=function(d,m,q,u){var v="undefined"==typeof dynjs_eqstore||"undefined"==typeof dynjs_eqstore[d]?dynjs_equip:dynjs_eqstore;h=d;g=v[d].k;common.show_popup_box(q,u,360,360,m,void 0,"right",v[d].t,v[d].d,"")};this.unset=function(){h=0;g=void 0;common.hide_popup_box()};this.pop_equipwindow=function(){return 0<h?(window.open(MAIN_URL+"equip/"+h+"/"+g,"_pu"+(Math.random()+"").replace(/0\./,""),"toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width=450,height=520,left="+
(screen.width-450)/2+",top="+(screen.height-520)/2),!0):!1};this.lock=function(d,m){var q=new XMLHttpRequest;api_call(q,{type:"simple",method:"lockequip",uid,token:simple_token,eid:d,lock:"il"==m.className?0:1},function(){var u=api_response(q);if(0!=u&&void 0!=u.eid){m.className=u.locked?"il":"iu";var v=e("e"+d),y=v.getAttribute("data-locked");if(y){if("0"===y&&v.getAttribute("style")&&v.onclick)v.onclick();v.setAttribute("data-locked",u.locked)}}})};document.onkeypress=function(d){d.shiftKey||d.altKey||
"c"==String.fromCharCode(window.event?d.keyCode:d.which)&&equips.pop_equipwindow()&&common.cancelEvent(d)}}
function Training(){this.start_training=function(m){e("start_train").value=m;e("trainform").submit()};this.cancel_training=function(){e("cancel_train").value=1;e("trainform").submit()};var h=e("train_progbar"),g=e("train_progcnt");if("undefined"!=typeof reload_to)var d=setInterval(function(){var m=Date.now()/1E3+time_skew,q=m<end_time?q=100-100*(end_time-m)/total_time:100,u=Math.floor(q),v=Math.floor(100*(q-u));g.innerHTML=u+"."+(10>v?"0":"")+v;h.style.width=4*q+"px";m>=end_time&&(document.location=
reload_to,clearInterval(d))},ticktime)}
function ItemSelector(){var h=0,g=!1;this.set_item=function(q){h==q?this.commit_slot(0):h=q};var d=void 0,m=void 0;this.hover_slot=function(q){0!=h&&(void 0!=d&&this.unhover_slot(),common.suppress_popups=!0,d=q,m=q.innerHTML,q.innerHTML=dynjs_itemc[h].n,q.className="ss")};this.unhover_slot=function(){void 0!=d&&(d.innerHTML=m,d.removeAttribute("class"),d=void 0,common.suppress_popups=!1)};this.commit_slot=function(q){g||(g=!0,e("slot").value=q,e("item").value=h,e("selectionform").submit())}}
function MonsterLab(){this.create_monster=function(h){e("selected_patk").value=h;e("create_form").submit()}}
function Battle(){var h=e("infopane"),g=[void 0,void 0],d=[void 0,void 0],m="log",q=void 0,u=void 0,v=void 0,y=1,a=0,f=void 0,l=e("ta_monster_1"),r=e("ta_monster_2"),n=!1,w=function(b){void 0!=h&&(h.innerHTML=b)};this.set_infopane=function(b){switch(b){case "Attack":var k="Damages a single enemy. Depending on your equipped weapon, this can place certain status effects on the affected monster. To attack, click here, then click your target. Simply clicking an enemy will also perform a normal attack.";break;
case "Skillbook":k="Use special skills and magic. To use offensive spells and skills, first click it, then click your target. To use it on yourself, click it twice.";break;case "Items":k="Use various consumable items that can replenish your vitals or augment your power in various ways.";break;case "Spirit":k="Toggle Spirit Channeling.";break;case "Defend":k="Increases your defensive capabilities for the next turn.";break;case "Focus":k="Reduces the chance that your next spell will be resisted. Your defenses and evade chances are lowered for the next turn.";
break;default:k="Choose from the Battle Actions highlighted above, and use them to defeat your enemies listed to the right. When all enemies are reduced to zero Health, you win. If your Health reaches zero, you are defeated."}w('<div class="btii">'+b+"</div><div>"+k+"</div>")};this.set_infopane_spell=function(b,k,t,z,C,A){var E="";if(0<z||0<C)E="Requires ",0<z&&(E+=z+" Magic Points"),0<z&&0<C&&(E+=z+" and "),0<C&&(E+=C+" Charge"+(1==C?"":"s")),E+=" to use.";0<A&&(E+=" Cooldown: "+A+" turns.");w('<div class="btii">'+
b+'</div><div style="position:relative"><div style="float:left; width:601px"><div style="padding-bottom:3px; padding-right:3px">'+k+'</div><div><span style="font-weight:bold">'+E+'</span></div></div><div style="float:left; width:32px; height:32px; position:relative"><img src="'+IMG_URL+"a/"+t+'.png" style="border:0px; margin:0px; padding:0px; position:absolute; left:3px; top:4px; z-index:3" /><img src="'+IMG_URL+'ab/b.png" style="border:0px; margin:0px; padding:0px; position:absolute; left:-5px; top:-4px; z-index:3" /></div></div>')};
this.set_infopane_effect=function(b,k,t){w('<div class="btii">'+b+'</div><div style="padding-bottom:3px">'+k+'</div><div><span style="font-weight:bold">'+("autocast"==t?"Expires if magic is depleted to below 10%":"permanent"==t?"Permanent until triggered":"decaying"==t?"Decays by 20% per turn":"Expires in "+t+" turn"+(1==t?"":"s"))+".</span></div>")};this.set_infopane_item=function(b){w('<div class="btii">'+dynjs_itemc[b].n+'</div><div style="padding-bottom:3px">'+dynjs_itemc[b].q+"</div>")};this.lock_action=
function(b,k,t,z){if(!n)if(d[k]==b&&"skill"!=t?(g[k]=void 0,d[k]=void 0):(g[k]=h.innerHTML,d[k]=b),0==k&&(g[1]=void 0,d[1]=void 0),1==k)q!=t&&(this.clear_actions(),q=t,b.src=IMG_URL+"battle/"+q+"_s.png",this.set_mode(t)),this.set_selected_subaction(b,z);else switch(q==t?"skill"==t?this.set_selected_subaction(void 0):q=void 0:(this.clear_actions(),q=t),b.src=IMG_URL+"battle/"+t+"_"+(void 0==q?"n":"s")+".png",this.set_mode(t),t){case "attack":this.toggle_default_pane();break;case "skill":this.toggle_magic_pane();
break;case "items":this.toggle_item_pane();break;default:this.touch_and_go()}};this.clear_actions=function(){if(void 0!=q){if("spirit"!=q){var b="magic"==q?"skill":q;e("ckey_"+b).src=IMG_URL+"battle/"+b+"_n.png"}q=void 0}};this.clear_infopane=function(){void 0!=g[1]?w(g[1]):void 0!=g[0]?w(g[0]):this.set_infopane("Battle Time")};var B=function(b){e("pane_"+b).style.display="none";m=void 0};this.toggle_pane=function(b){b==m?this.toggle_default_pane():(B(m),e("pane_"+b).style.display="",m=b)};this.toggle_default_pane=
function(){"log"!=m&&(B(m),e("pane_log").style.display="",m=m="log")};this.toggle_magic_pane=function(){"skill"==m?this.toggle_pane("magic"):"magic"==m?this.toggle_pane("skill"):this.toggle_pane(default_magic_pane)};this.toggle_skill_pane=function(){this.toggle_pane("skill")};this.toggle_item_pane=function(){this.toggle_pane("item")};var D="attack",H=0,F=0;this.set_mode=function(b){D=D==b&&"magic"!=b?"attack":b};this.reset_skill=function(){F=H=0;this.set_selected_subaction(void 0)};this.set_hostile_skill=
function(b){F=F==b?0:b};this.set_friendly_skill=function(b){F==b?(H=0,this.touch_and_go()):F=b};this.hover_target=function(b){if(void 0==v){var k=common.findPosWithScroll(b),t=common.findPosWithScroll(e("battle_right"));k[0]-=t[0];k[1]-=t[1];l.style.left=k[0]-7+"px";l.style.top=k[1]+b.offsetHeight/2-3+"px";r.style.left=k[0]+b.offsetWidth+2+"px";r.style.top=k[1]+b.offsetHeight/2-3+"px";l.style.visibility="visible";r.style.visibility="visible"}};this.unhover_target=function(){void 0==v&&(l.removeAttribute("style"),
r.removeAttribute("style"))};this.commit_target=function(b){n||void 0!=v||(H=v=b,this.touch_and_go())};var G=void 0,J=void 0,I=void 0;this.touch_and_go=function(){n||void 0!=f||(G=D,J=H,I=F,f=new XMLHttpRequest,api_call(f,{type:"battle",method:"action",token:battle_token,mode:D,target:H,skill:F},this.process_action))};this.recast=function(){n||void 0==G||(D=G,H=J,F=I,this.touch_and_go())};for(var L=0,O=!1,M="pane_completion pane_effects pane_action pane_vitals pane_quickbar table_skills table_magic pane_item pane_monster".split(" "),
Q=[],P=0;P<M.length;P++){var R=M[P];Q[R]=e(R)}this.process_action=function(){var b=api_response(f);if(0!=b){if(void 0!=b.error)this.battle_continue();else if(void 0!=b.reload)this.battle_continue();else{for(var k=0;k<M.length;k++){var t=M[k];void 0!=b[t]&&(Q[t].innerHTML=b[t])}has_debug&&(e("debugpane").innerHTML=b.debugpane);if(void 0!=b.textlog){t=e("textlog");t.insertRow(0).insertCell(0).className="tls";var z=b.textlog.length;for(k=0;k<z;k++){var C=t.insertRow(0).insertCell(0);C.className="tl"+
(void 0!=b.textlog[k].c?b.textlog[k].c:"");C.innerHTML=b.textlog[k].t}for(L+=z;100<L;)t.deleteRow(-1),--L}void 0==b.pane_completion?(e("pane_completion").innerHTML="",n=!1):n=!0;e("expbar").style.width=b.exp+"px";1234==b.exp?(O=!0,e("expbar").src=IMG_URL+"bar_yellow.png"):O&&(O=!1,e("expbar").src=IMG_URL+"bar_blue.png");do_healthflash=b.healthflash;v=void 0;battle.unhover_target();battle.reset_skill();battle.set_mode("attack");a=1;l.style.opacity=a;r.style.opacity=a;battle.toggle_default_pane();g[0]=
void 0;g[1]=void 0;battle.clear_infopane();battle.clear_actions()}f=void 0}};var S=!1;this.battle_continue=function(){S||(S=!0,document.location+="")};this.set_selected_subaction=function(b,k){void 0==b?(u=void 0,common.text_unselect()):u==k?this.set_selected_subaction(void 0):common.text_select(b)};var N=0;this.start_flash_loop=function(){setInterval(function(){a=common.decimalround(Math.min(1,Math.max(0,a+.07*y)),2);if(0==a||1==a)y*=-1;void 0!=v&&(l.style.opacity=a,r.style.opacity=a);do_healthflash?
(N=Math.floor(80+150*a),e(vital_prefix+"vbh").style.backgroundColor="rgb("+N+",50,50)"):0!=N&&(e(vital_prefix+"vbh").style.backgroundColor="",N=0);for(var b=0,k;k=e("effect_expire_"+ ++b);)k.style.opacity=.8-a/2},20)};document.onkeydown=function(b){b=b||window.event;if(b.target)var k=b.target;else b.srcElement&&(k=b.srcElement);3==k.nodeType&&(k=k.parentNode);if("INPUT"!=k.tagName&&"TEXTAREA"!=k.tagName){k=b.keyCode?b.keyCode:b.which;var t=String.fromCharCode(k),z=void 0,C=void 0,A=-1;switch(k){case 48:case 96:A=
0;break;case 49:case 97:A=1;break;case 50:case 98:A=2;break;case 51:case 99:A=3;break;case 52:case 100:A=4;break;case 53:case 101:A=5;break;case 54:case 102:A=6;break;case 55:case 103:A=7;break;case 56:case 104:A=8;break;case 57:case 105:A=9}var E=!1;if(b.altKey){if(0<=A&&10>A){0==A&&(A=10);E=!0;var K=e("qb"+A);K&&(K.onmouseover(),K.onclick())}}else{if(13==k||32==k)z="btcp";else if(-1<A)z="mkey_"+A;else if(112<=k&&123>=k||"G"==t||"P"==t)"item"!=m&&(z="ckey_items"),C="G"==t||"P"==t?"ikey_p":b.ctrlKey?
"ikey_n"+(k-111):b.shiftKey?"ikey_s"+(k-111):"ikey_"+(k-111);else if(!b.ctrlKey&&!b.shiftKey)switch(t){case "Q":z="ckey_attack";break;case "W":z="ckey_skill";break;case "E":z="ckey_items";break;case "S":z="ckey_spirit";break;case "D":z="ckey_defend";break;case "F":z="ckey_focus";break;case "R":z="recast"}if(z||C)E=!0;if(z)if("recast"==z)battle.recast();else if(K=e(z))K.onclick();if(C&&(K=e(C)))K.onclick()}if(E)return b.cancelBubble=!0,b.returnValue=!1,b.stopPropagation&&(b.stopPropagation(),b.preventDefault()),
!1}};this.clear_infopane();this.start_flash_loop();this.set_infopane("Battle Time")}function at_show_aux(h,g){h=e(h);g=e(g);for(var d="x"==g.at_position?h.offsetWidth+0:0;h;h=h.offsetParent)d+=h.offsetLeft;g.style.position="absolute";g.style.top="27px";g.style.left=d+"px";g.style.visibility="visible"}function at_show(){p=e(this.at_parent);c=e(this.at_child);at_show_aux(p.id,c.id)}function at_hide(){c=e(this.at_child);e(c.id).style.visibility="hidden"}
function at_click(){p=e(this.at_parent);c=e(this.at_child);"visible"!=c.style.visibility?at_show_aux(p.id,c.id):c.style.visibility="hidden";return!1}
function at_attach(h,g,d,m,q){p=e(h);c=e(g);p.at_parent=p.id;c.at_parent=p.id;p.at_child=c.id;c.at_child=c.id;p.at_position=m;c.at_position=m;c.style.position="absolute";c.style.visibility="hidden";switch(d){case "click":p.onclick=at_click;p.onmouseout=at_hide;c.onmouseover=at_show;c.onmouseout=at_hide;break;case "hover":p.onmouseover=at_show,p.onmouseout=at_hide,c.onmouseover=at_show,c.onmouseout=at_hide}};

View file

@ -0,0 +1,37 @@
function get_eqdata(a){if("undefined"!=typeof dynjs_eqstore&&"undefined"!=typeof dynjs_eqstore[a])return dynjs_eqstore[a];if("undefined"!=typeof dynjs_equip&&"undefined"!=typeof dynjs_equip[a])return dynjs_equip[a]}
function rehover_last_checked(){if(0<last_checked_eqid){if(!e("e"+last_checked_eqid).checked)for(i=last_checked_eqid=0;i<equipform.elements.length;i++)if("eqids[]"==equipform.elements[i].name&&equipform.elements[i].checked){last_checked_eqid=equipform.elements[i].value;break}0<last_checked_eqid&&hover_equip(last_checked_eqid)}}
function hover_equip(a){if("undefined"!=typeof last_hover_eqid){last_hover_eqid||(infotext=equipinfo.innerHTML);var c=get_eqdata(a);if("undefined"!=typeof c){curr_hover_eqid=last_hover_eqid=a;last_hover_key=c.k;if("undefined"!=typeof showequipped_eqid)equipinfo.innerHTML=showequipped_eqid==a?"":'<div class="showequip"><div></div><div>'+c.d+"</div></div>";else{var b=void 0;const g=new URLSearchParams(window.location.search);g.has("filter")&&(b=g.get("filter"));b="purchase"!=title?"?s=Bazaar&amp;ss=am&amp;screen=modify"+
(b?"&amp;filter="+b:"")+"&amp;eqids[]="+a:null;equipinfo.innerHTML="undefined"==typeof c.n?'<div class="showequip"><div>'+(b?'<a href="'+b+'">'+c.t+"</a>":c.t)+"</div><div>"+c.d+"</div></div>":'<div class="showequip"><div><div>'+(b?'<a href="'+b+'">'+c.t+"</a>":c.t)+"</div><div>("+c.n+")</div></div><div>"+c.d+"</div></div>"}update_iteminfo()}if("sacrifice"==title&&eqitems[a]){c=0;for(f in eqitems[a].s)c+=eqitems[a].s[f].boost;var f='<p style="font-weight:normal">The selected equipment will be sacrified, and fused with your:</p><p><a href="'+
backurl+'">'+fusename+'</a></p><p style="font-weight:normal">This has the following effects and base costs:</p>';f+="<p>+"+c+" Base Stat Rolls</p>";for(let g in eqitems[a].m)if(60201>g||60239<g)f+="<p>"+eqitems[a].m[g]+"x "+itemdata[g].n+" ("+itemdata[g].c+")</p>";f+="<p"+(eqitems[a].c>credit_balance?' class="eqred"':"")+">"+number_format(eqitems[a].c)+" Credits</p>";e("itemlist").innerHTML=f}}}function unhover_equip(a){curr_hover_eqid==a&&(curr_hover_eqid=0,update_iteminfo())}
function reset_infopane(){"undefined"!=typeof infotext&&(curr_hover_eqid&&unhover_equip(curr_hover_eqid),void 0!=hoverow&&(hoverow.removeAttribute("data-hover"),hoverow=void 0),equipinfo.innerHTML=infotext,itemlist.innerHTML="")}
function update_iteminfo(){if("undefined"!=typeof eqitems){var a=show_items=show_credits=!1,c=single_header=void 0;"repair"==title&&(show_items=!0,a=!document.getElementById("replace_charms").checked,c="Total Repair Cost");"salvage"==title&&(show_items=!0,show_credits=document.getElementById("sell_salvage").checked,eqcredits.style.display=show_credits?"":"none",c="Total Salvage");"itemworld"==title&&(show_items=!0,c="Required Items");"soulbind"==title&&(show_items=!0,c="Required Items");if("sell"==
title||"purchase"==title)show_credits=!0;confirm_info=void 0;var b=[],f=[],g=0;for(i=0;i<equipform.elements.length;i++)"eqids[]"==equipform.elements[i].name&&equipform.elements[i].checked&&(eqid=equipform.elements[i].value,show_items&&"undefined"!=typeof eqitems[eqid]&&Object.keys(eqitems[eqid].m).forEach(d=>{let l;b[d]=(null!=(l=b[d])?l:0)+eqitems[eqid].m[d]}),show_credits&&(g+=eqitems[eqid].c),"undefined"!=typeof eqitems[eqid].p?(confirm_info=eqitems[eqid].p,confirm_info.eqname=eqitems[eqid].t):
"sacrifice"==title&&(confirm_info=eqitems[eqid]));show_items&&0<curr_hover_eqid&&"undefined"!=typeof eqitems[curr_hover_eqid]&&Object.keys(eqitems[curr_hover_eqid].m).forEach(d=>{void 0==b[d]&&(b[d]=0);f[d]=eqitems[curr_hover_eqid].m[d]});var h=[],k=0<curr_hover_eqid&&document.getElementById("e"+curr_hover_eqid).checked;block_submit=!1;if(0<b.length){h.push('<tr><th colspan="3">'+c+":</th></tr>");for(let d in b)a&&61900<=d&&64999>=d||(c=("repair"==title||"soulbind"==title)&&itemdata[d].c<b[d]||"itemworld"==
title&&itemdata[d].c<(curr_hover_eqid?f[d]:b[d]),multiselect?h.push("<tr"+(c?' style="color:red"':"")+"><td>"+b[d]+"x</td><td>"+itemdata[d].n+"</td><td>"+(hide_delta||k||!curr_hover_eqid||void 0==f[d]?"":" ("+(k?"-":"+")+f[d]+")")+"</td></tr>"):h.push("<tr"+(c?' style="color:red"':"")+"><td>"+(curr_hover_eqid?f[d]:b[d])+"x "+itemdata[d].n+"</td></tr>"),c&&(block_submit=!0))}show_items&&(itemlist.innerHTML=0<h.length?"<table>"+h.join("")+"</table>":"");show_credits&&(eqcrsum.innerHTML=g+" Credits",
eqcrsum.style.color="purchase"==title&&credit_balance<g?"red":"",eqcrdiff.innerHTML=curr_hover_eqid&&!k?" ("+(k?"-":"+")+eqitems[curr_hover_eqid].c+")":"")}}let unprotect_eqid=0,unprotect_rowelem=void 0;
function confirm_unprotect(a,c,b,f){e("e"+c).disabled&&(unprotect_eqid=c,unprotect_rowelem=a,e("confirm_body").innerHTML="<p>Are you sure you want to make this protected equipment selectable?</p><p><strong>"+b+"</strong></p>"+(f?"<p>Obtained: <strong>"+f+"</strong></p>":"")+'<button id="confirm_button" type="button" onclick="unprotect_equip()">Confirm Select</button>',confirm_open())}
function unprotect_equip(){unprotect_eqid&&(unprotect_rowelem.removeAttribute("data-eqprotect"),++selectable_count,update_multiselector(),e("e"+unprotect_eqid).disabled=!1,select_equip(unprotect_eqid,void 0,unprotect_rowelem),unprotect_eqid=0);confirm_close()}
function select_equip(a,c,b){if(e("e"+a).disabled)return!1;if(!multiselect)for(i=0;i<equipform.elements.length;i++)"eqids[]"==equipform.elements[i].name&&equipform.elements[i].checked&&(equipform.elements[i].checked=!1);last_hover_eqid!=a&&void 0!=b&&(hide_delta=!0,hover_equip(a),void 0!=hoverow&&hoverow.removeAttribute("data-hover"),hoverow=b,hoverow.setAttribute("data-hover",1));b=document.getElementById("e"+a);const f=b.checked?!1:"checked";if(multiselect&&void 0!=c&&c.shiftKey&&0<last_clicked_eqid&&
a!=last_clicked_eqid&&f==last_statechange)for(c=!1,i=0;i<equipform.elements.length;i++)if("eqids[]"==equipform.elements[i].name&&!equipform.elements[i].disabled){let g=equipform.elements[i].value==a||equipform.elements[i].value==last_clicked_eqid;!c&&g&&(c=!0,g=!1);c&&(equipform.elements[i].checked=f);c&&g&&(c=!1)}b.checked=f;last_clicked_eqid=a;(last_statechange=f)&&(last_checked_eqid=a);update_selected_count();return!1}let selected_count=0,selected_soulbound=0,selected_rarity=[];
function update_selected_count(){selected_soulbound=selected_count=0;selected_rarity=[];for(i=0;i<equipform.elements.length;i++)if("eqids[]"==equipform.elements[i].name&&equipform.elements[i].checked){++selected_count;let a=get_eqdata(parseInt(equipform.elements[i].value));if(void 0!=a){let c;selected_rarity[a.q]=(null!=(c=selected_rarity[a.q])?c:0)+1;let b;null!=(b=a.s)&&b&&++selected_soulbound}}1>selected_count&&(last_clicked_eqid=0);multiselect&&update_multiselector();update_iteminfo();document.getElementById("equipsubmit").disabled=
!block_submit&&0<selected_count?"":"disabled"}function update_multiselector(){multiselect&&(e("equipcount").innerHTML='<input type="checkbox" onclick="select_all()"'+(selected_count<selectable_count?"":'checked="checked"')+" /><span></span> Selected "+selected_count+" of "+selectable_count+" matching equipment available to "+title)}
function select_all(){last_clicked_eqid=0;let a=selected_count<selectable_count?"checked":!1;for(i=0;i<equipform.elements.length;i++)"eqids[]"!=equipform.elements[i].name||equipform.elements[i].disabled||(equipform.elements[i].checked=a);update_selected_count()}
function confirm_action(a,c,b,f,g){if(!a.disabled){a="<div>"+b.replace("%SELECTCOUNT%","<strong>"+selected_count+"</strong>")+"</div>";b=!1;if(confirm_info&&(console.log(JSON.stringify(confirm_info,null,2)),"itemworld"==title&&(a+="\n<p><strong>"+confirm_info.eqname+'</strong></p>\n<table id="iwinfo">\n\t<tr><td>World Level:</td><td>'+confirm_info.iwlvl+"</td></tr>\n\t<tr><td>Battle Rounds:</td><td>"+confirm_info.rounds+"</td></tr>\n\t<tr><td>Monster LVL:</td><td>"+confirm_info.monsterlevel+"</td></tr>\n\t<tr><td>Difficulty:</td><td>"+
confirm_info.diffname+(0<confirm_info.diffboost?" +"+confirm_info.diffboost+"%":"")+"</td></tr>\n\t<tr><td>Entry Cost:</td><td>"+confirm_info.req_worldseeds+" World Seed"+(1==confirm_info.req_worldseeds?"":"s")+" ("+confirm_info.has_worldseeds+")</td></tr>\n</table>"),"sacrifice"==title)){a+="\n<p><strong>"+confirm_info.t+'</strong></p>\n<table id="fuseinfo">';let k=[];for(let d in confirm_info.s){let l=confirm_info.s[d].bndid,m=itemdata[l].c<confirm_info.m[l];k.push("<tr><td>"+confirm_info.s[d].label+
"</td><td>"+confirm_info.s[d].value+"</td><td>+"+confirm_info.s[d].boost+"</td><td"+(m?' class="eqred"':"")+">"+confirm_info.m[l]+"x "+itemdata[l].n+" ("+itemdata[l].c+")</td></tr>");m&&(b=!0)}a+=k.join("");a+="\n</table>";for(let d in confirm_info.m)if(60201>d||60239<d)a+="<p>"+confirm_info.m[d]+"x "+itemdata[d].n+" ("+itemdata[d].c+")</p>";a+="<p"+(confirm_info.c>credit_balance?' class="eqred"':"")+">"+number_format(confirm_info.c)+" Credits</p>";credit_balance<confirm_info.c&&(b=!0)}if(f){var h;
f=null!=(h=selected_rarity[7])?h:0;let k,d;h=(null!=(k=selected_rarity[8])?k:0)+(null!=(d=selected_rarity[9])?d:0);multiselect?(0<selected_soulbound&&(a+="<p><strong>You have selected "+(1<selected_soulbound?selected_soulbound:"a")+" SOULBOUND equipment.</strong></p>"),0<f&&(a+="<p><strong>You have selected "+(1<f?f:"a")+" LEGENDARY equipment.</strong></p>"),0<h&&(a+="<p><strong>You have selected "+(1<h?h:"a")+" PEERLESS equipment.</strong></p>")):0<selected_soulbound+f+h&&(a+="<p><strong>You have selected a "+
(0<selected_soulbound?"SOULBOUND ":"")+(0<f?"LEGENDARY ":"")+(0<h?"PEERLESS ":"")+"equipment.</strong></p>");a=(b?a+"<p>You are missing some required resources.</p>":a+"<p>Check both safety boxes to continue.</p>")+('\n<table>\n\t<tr>\n\t\t<td><label class="lc"><input id="cfs1" type="checkbox" onchange="confirm_safety()"'+(b?' disabled="disabled"':"")+'><span></span></label></td>\n\t\t<td><input id="confirm_button" type="submit" value="'+c+'" disabled="disabled"'+(g?' formaction="'+g+'"':"")+' /></td>\n\t\t<td><label class="lc"><input id="cfs2" type="checkbox" onchange="confirm_safety()"'+
(b?' disabled="disabled"':"")+"><span></span></label></td>\n\t</tr>\n</table>")}else a+='<input id="confirm_button" id="equipsubmit" type="submit" value="'+c+'"'+(g?' formaction="'+g+'"':"")+(b?' disabled="disabled"':"")+" />";e("confirm_body").innerHTML=a;confirm_open()}}function confirm_safety(){e("confirm_button").disabled=e("cfs1").checked&&e("cfs2").checked?"":"disabled"}
function recalc_cp(a){var c=parseInt(a.getAttribute("data-cp"));"charmtype"==a.name?(sel_cp_charm=c,sel_charmtype=parseInt(a.value),charmname=a.getAttribute("data-name"),disabled_charm=a.getAttribute("data-disabled"),charm_stats[sel_charmtype]&&(e("eqstats").innerHTML=charm_stats[sel_charmtype])):(sel_cp_pouch=c,sel_pouchtype=parseInt(a.value),pouchname=a.getAttribute("data-name"),disabled_pouch=a.getAttribute("data-disabled"));if(a=sel_charmtype&&(disabled_charm||disabled_pouch)){var b;c=null!=(b=
disabled_charm)?b:disabled_pouch;e("cdreason").innerHTML="("+c+")"}else e("cdreason").innerHTML="&nbsp;";b=exl_cp+sel_cp_charm+sel_cp_pouch;e("cpreadout").innerHTML="Charm Points: "+b+" / "+max_cp;e("cpreadout").style.color=b>max_cp?"#FF0000":"";can_submit=!a&&(0==sel_charmtype||b<=max_cp)&&(cur_charm_worn||cur_charm_broken||cur_pouch_broken||cur_charmtype!=sel_charmtype||0<sel_charmtype&&cur_pouchtype!=sel_pouchtype);e("setcharm").disabled=can_submit?"":"disabled";!a&&b>max_cp&&(e("cdreason").innerHTML=
"(Insufficient Charm Points)");b="Attach Charm";!sel_charmtype&&0<cur_charmtype?b="Destroy Charm":sel_charmtype&&sel_charmtype==cur_charmtype&&(cur_charm_worn||cur_charm_broken?b="Replace Charm":cur_pouchtype!=sel_pouchtype?b="Replace Pouch":cur_pouch_broken&&(b="Repair Pouch"));e("setcharm").innerHTML=b}
function pop_setcharm(){if(can_submit){let b=[];if(cur_charm_worn||cur_charm_broken||cur_charmtype!=sel_charmtype)for(var a in charm_mats[sel_charmtype])b.push("<tr><td>"+charm_mats[sel_charmtype][a].c+"x</td><td>"+charm_mats[sel_charmtype][a].n+"</td></tr>");if((!cur_charm_broken||0<sel_pouchtype)&&(cur_pouch_broken||cur_pouchtype!=sel_pouchtype))for(var c in pouch_mats[sel_pouchtype])b.push("<tr><td>"+pouch_mats[sel_pouchtype][c].c+"x</td><td>"+pouch_mats[sel_pouchtype][c].n+"</td></tr>");a=cur_charmtype?
"Replace":"Attach";c="attach a new charm";sel_charmtype?(cur_charmtype==sel_charmtype&&(c=cur_charm_worn||cur_charm_broken?"replace the "+(cur_charm_broken?"torn":"worn")+" charm":cur_pouch_broken?"replace the destroyed pouch":"replace the intact pouch",a="Replace"),e("confirm_body").innerHTML="<p>Are you sure you want to "+c+" in <strong>Slot "+charmslot+"</strong>:</p><p><strong>"+charmname+"</strong> with a <strong>"+pouchname+"</strong></p>",0<b.length&&(e("confirm_body").innerHTML+='<p>by spending the following materials:</p><table id="charmats">'+
b.join("")+"</table>")):(e("confirm_body").innerHTML="<p>Are you sure you want to <strong>DESTROY</strong> the charm and pouch in <strong>Slot "+charmslot+"</strong>?</p>",a="Destroy");0<sel_charmtype&&(!cur_charmtype||cur_charm_worn||cur_charm_broken||cur_charmtype==sel_charmtype||(e("confirm_body").innerHTML+="<p>The existing charm will be <strong>DESTROYED</strong>.</p>"),cur_pouch_broken||(cur_pouchtype!=sel_pouchtype?0<cur_charmtype&&(e("confirm_body").innerHTML+="<p>The existing pouch will be <strong>DESTROYED</strong>.</p>"):
0<sel_pouchtype&&(e("confirm_body").innerHTML+="<p>The existing pouch will be reused.</p>")));e("confirm_body").innerHTML+='<button id="confirm_button" type="submit" name="action" value="setcharm">Confirm '+a+"</button>";confirm_open()}}let is_confirm_open=!1,is_confirm_text=!1;
function pop_rename(a,c){is_confirm_text=!0;e("confirm_body").innerHTML="<p>Enter a new customized name for your</p><p><strong>"+a+'</strong></p><input name="eqname" type="text" maxlength="50" placeholder="'+a+'" value="'+c+'" /><p>Enter a blank name to revert to the default name. Customized names are always removed if the equipment is sold or attached to a MoogleMail.</p><button id="confirm_button" type="submit" name="action" value="rename">Rename Equipment</button>';confirm_open()}
function pop_upgrade(){e("confirm_body").innerHTML='<p>Are you sure you want to spend the requisite materials and credits to upgrade this equipment? Credits and Cores cannot be refunded.</p><table class="upgrmats">'+e("upgrmats").innerHTML+'</table><button id="confirm_button" type="submit" name="action" value="upgrade">Confirm Upgrade</button>';confirm_open()}
function pop_unequip(){e("confirm_body").innerHTML='<p>Are you sure you want to force unequip this item from all equipment sets in all personas? This may also unequip other gear that depends on it.</p><button id="confirm_button" type="submit" name="action" value="unequip">Confirm Unequip</button>';confirm_open()}
function pop_equipwindow(){"undefined"!=typeof last_hover_eqid&&0<last_hover_eqid&&window.open(MAIN_URL+"equip/"+last_hover_eqid+"/"+last_hover_key,"_pu"+(Math.random()+"").replace(/0\./,""),"toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width=450,height=520,left="+(screen.width-450)/2+",top="+(screen.height-520)/2)}function confirm_open(){is_confirm_open=!0;e("confirm_outer").style.visibility=""}
function confirm_close(){is_confirm_text=is_confirm_open=!1;e("confirm_outer").style.visibility="hidden"}
document.onkeydown=function(a){a.shiftKey||a.altKey||(is_confirm_open?(("Enter"==a.key||!is_confirm_text&&" "==a.key)&&e("confirm_button").click(),"Escape"==a.key&&confirm_close()):("c"==a.key&&(pop_equipwindow(),common.cancelEvent(a)),"x"==a.key&&"purchase"!=title&&last_hover_eqid&&(a=(new URLSearchParams(window.location.search)).get("filter"),document.location="?s=Bazaar&ss=am&screen=modify"+(a?"&filter="+a:"")+"&eqids[]="+last_hover_eqid)))};

View file

@ -0,0 +1,188 @@
:root{scrollbar-width:thin;scrollbar-color:#5C0D1169 transparent}
body{font-size:8pt;font-family:verdana;color:#5C0D11;background:#E3E0D1;padding:2px;margin:0;text-align:center}
div{margin:0;padding:0;scrollbar-width:thin;scrollbar-color:#5C0D1169 transparent}
a:link,a:visited,a:active{color:#5C0D11}
a:hover{color:#9B4E03}
p{padding:3px 1px;margin:1px}
hr{border:0;border-top:1px solid #5C0D11}
.emsg {color:#FF5555;font-weight:bold}
.c{clear:both}
.v{font-family:verdana;font-size:11pt;font-weight:bold}
input,textarea{outline:none}
input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
input[type=number]{-moz-appearance:textfield}
input[type="submit"],input[type="button"],button{font-family:verdana;font-size:9pt;font-weight:bold;color:#5C0D11BB;background:#EDEADA;border:2px solid #5C0D11;border-radius:14px;margin:2px 3px;padding:4px 9px}
input[type="submit"]:enabled:hover,input[type="submit"]:enabled:focus,input[type="button"]:enabled:hover,input[type="button"]:enabled:focus,button:enabled:hover,button:enabled:focus{color:#9B4E03;border-color:#9B4E03;background:#EEEDE5;cursor:pointer}
input[type="submit"]:enabled:active,input[type="submit"]:enabled:active,button:enabled:active{background:radial-gradient(#DFDACC,#F3F0E0);border-color:#9B4E03;cursor:pointer}
input[type="submit"]:disabled,input[type="button"]:disabled,button:disabled{color:#C2A8A4;border-color:#C2A8A4;background:#EDEADA}
input[type="text"],input[type="password"],input[type="number"],textarea,select,option{font-size:10pt;border-radius:5px;color:#5C0D11;background:#EDEADA;border:1px solid #5C0D11;margin:4px 0 0 0;padding:3px}
input[type="text"]:enabled:hover:not([readonly]),input[type="password"]:enabled:hover:not([readonly]),input[type="number"]:enabled:hover:not([readonly]),textarea:enabled:hover:not([readonly]),select:enabled:hover:not([readonly]){background:#F2EFDF}
input[type="text"]:enabled:focus:not([readonly]),input[type="password"]:enabled:focus:not([readonly]),input[type="number"]:enabled:focus:not([readonly]),textarea:enabled:focus:not([readonly]),select:enabled:focus:not([readonly]){color:#9B4E03;background:#F2EFDF}
input[type="text"]:disabled,input[type="password"]:disabled,input[type="number"]:disabled,textarea:disabled,select:disabled{color:#C2A8A4;background:#EDEADA;border-color:#C2A8A4}
img{border:0;margin:0;padding:0}
img[onclick],div[onclick]{cursor:pointer}
table{border-collapse:collapse}
.nosel{user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;cursor:default}
.lc,.lr{display:block;position:relative;padding:0 0 0 30px;margin:0;vertical-align:middle;height:24px;line-height:24px}
.lc:not([data-disabled]),.lr:not([data-disabled]),.lc:not([data-disabled]) *,.lr:not([data-disabled]) *{cursor:pointer}
.lc>input,.lr>input{position:absolute !important;opacity:0;width:1px;height:1px}
.lc:hover input:enabled ~ span,.lr:hover input:enabled ~ span,.lc input:enabled:focus ~ span,.lr input:enabled:focus ~ span{background-color:#F3F0E0 !important;border-color:#977273 !important}
.lc input:disabled ~ span,.lr input:disabled ~ span{border-color:#DBD4D3 !important}
.lc input:disabled ~ span::after,.lr input:disabled ~ span::after{border-color:#B5AEAD !important}
.lc>input:checked ~ span:after,.lr>input:checked ~ span:after{display:block}
.lc>span{position:absolute;top:0;left:0;height:20px;width:20px;background-color:#EDEADA;border:2px solid #B5A4A4;border-radius:3px}
.lc>span:after{content:"";position:absolute;display:none;left:6px;top:2px;width:5px;height:10px;border:solid #5C0D12;border-width:0 3px 3px 0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}
.lr>span{position:absolute;top:0;left:0;height:20px;width:20px;background-color:#EDEADA;border:2px solid #B5A4A4;border-radius:50%}
.lr>span:after{content:"";position:absolute;display:none;top:5px;left:5px;width:10px;height:10px;border-radius:50%;background:#5C0D12}
/* common global */
#csp{background:#EDEBDF;border:1px solid #5C0D12;width:1236px;height:702px;position:relative}
#mainpane{width:1228px;height:670px;padding:2px 0 2px 8px;overflow:hidden}
/* message box */
#messagebox_outer{position:absolute;z-index:99;top:0;left:0;width:100%;height:100%;background-color:#EDEBDFCC;backdrop-filter:blur(1px);cursor:pointer}
#messagebox_inner{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);display:flex;justify-content:center;flex-flow:column nowrap;border-radius:5px;min-width:500px;max-width:1150px;min-height:200px;max-height:600px;background:#EDEBDF;border:2px solid #5C0D11;font-size:10pt;font-weight:bold;font-family:verdana;overflow:hidden;overflow-y:auto;padding:10px 20px 20px}
#messagebox_inner>p{white-space:nowrap}
.messagebox_error{color:#FF2323}
/* fonts and font colors */
.fal{text-align:left}
.fac{text-align:center}
.far{text-align:right}
.fcb{color:#5C0D11}
.fcy{color:#FCFF00}
.fcg{color:#8A8A8A}
.fcr{color:#CB000A}
.fca{color:#0030CB}
.fc{display:flex;flex-direction:row;align-items:center;justify-content:center}
.fl{display:flex;flex-direction:row;align-items:center;justify-content:left}
.fr{display:flex;flex-direction:row;align-items:center;justify-content:right}
.f2b,.f2g,.f2r,.f2y,.f2a{height:10px}
.f4b,.f4g,.f4r,.f4y,.f4a{height:12px}
.f2b>div,.f2g>div,.f2r>div,.f2y>div,.f2a>div{height:10px;background-color:transparent}
.f4b>div,.f4g>div,.f4r>div,.f4y>div,.f4a>div{height:12px;background-color:transparent}
.f2b>div{background-image:url(/y/font/10b.png)}
.f2g>div{background-image:url(/y/font/10g.png)}
.f2r>div{background-image:url(/y/font/10r.png)}
.f2y>div{background-image:url(/y/font/10y.png)}
.f2a>div{background-image:url(/y/font/10a.png)}
.f4b>div{background-image:url(/y/font/12b.png)}
.f4g>div{background-image:url(/y/font/12g.png)}
.f4r>div{background-image:url(/y/font/12r.png)}
.f4y>div{background-image:url(/y/font/12y.png)}
.f4a>div{background-image:url(/y/font/12a.png)}
.c20{width:9px;background-position:0 -0px}
.c21{width:5px;background-position:0 -10px}
.c22{width:10px;background-position:0 -20px}
.c23{width:10px;background-position:0 -30px}
.c24{width:10px;background-position:0 -40px}
.c25{width:10px;background-position:0 -50px}
.c26{width:10px;background-position:0 -60px}
.c27{width:10px;background-position:0 -70px}
.c28{width:9px;background-position:0 -80px}
.c29{width:9px;background-position:0 -90px}
.c2a{width:4px;background-position:0 -100px}
.c2b{width:4px;background-position:0 -110px}
.c2c{width:5px;background-position:0 -120px}
.c2d{width:10px;background-position:0 -130px}
.c2e{width:11px;background-position:0 -140px}
.c2f{width:8px;background-position:0 -150px}
.c2g{width:8px;background-position:0 -160px}
.c2h{width:8px;background-position:0 -170px}
.c2i{width:11px;background-position:0 -180px}
.c2j{width:11px;background-position:0 -190px}
.c2k{width:4px;background-position:0 -200px}
.c2l{width:4px;background-position:0 -210px}
.c2m{width:4px;background-position:0 -220px}
.c2n{width:4px;background-position:0 -230px}
.c2o{width:6px;background-position:0 -240px}
.c2p{width:6px;background-position:0 -250px}
.c2q{width:6px;background-position:0 -260px}
.c2r{width:6px;background-position:0 -270px}
.c2s{width:8px;background-position:0 -280px}
.c39{width:4px;background-position:0 -390px}
.c3a{width:11px;background-position:0 -400px}
.c3b{width:9px;background-position:0 -410px}
.c3c{width:9px;background-position:0 -420px}
.c3d{width:9px;background-position:0 -430px}
.c3e{width:8px;background-position:0 -440px}
.c3f{width:8px;background-position:0 -450px}
.c3g{width:9px;background-position:0 -460px}
.c3h{width:10px;background-position:0 -470px}
.c3i{width:4px;background-position:0 -480px}
.c3j{width:6px;background-position:0 -490px}
.c3k{width:10px;background-position:0 -500px}
.c3l{width:6px;background-position:0 -510px}
.c3m{width:13px;background-position:0 -520px}
.c3n{width:9px;background-position:0 -530px}
.c3o{width:9px;background-position:0 -540px}
.c3p{width:10px;background-position:0 -550px}
.c3q{width:10px;background-position:0 -560px}
.c3r{width:11px;background-position:0 -570px}
.c3s{width:10px;background-position:0 -580px}
.c3t{width:8px;background-position:0 -590px}
.c3u{width:10px;background-position:0 -600px}
.c3v{width:11px;background-position:0 -610px}
.c3w{width:14px;background-position:0 -620px}
.c3x{width:11px;background-position:0 -630px}
.c3y{width:10px;background-position:0 -640px}
.c3z{width:10px;background-position:0 -650px}
.c40{width:10px;background-position:0 -0px}
.c41{width:6px;background-position:0 -12px}
.c42{width:11px;background-position:0 -24px}
.c43{width:11px;background-position:0 -36px}
.c44{width:11px;background-position:0 -48px}
.c45{width:11px;background-position:0 -60px}
.c46{width:11px;background-position:0 -72px}
.c47{width:11px;background-position:0 -84px}
.c48{width:10px;background-position:0 -96px}
.c49{width:10px;background-position:0 -108px}
.c4a{width:5px;background-position:0 -120px}
.c4b{width:5px;background-position:0 -132px}
.c4c{width:6px;background-position:0 -144px}
.c4d{width:11px;background-position:0 -156px}
.c4e{width:12px;background-position:0 -168px}
.c4f{width:9px;background-position:0 -180px}
.c4g{width:9px;background-position:0 -192px}
.c4h{width:9px;background-position:0 -204px}
.c4i{width:12px;background-position:0 -216px}
.c4j{width:12px;background-position:0 -228px}
.c4k{width:5px;background-position:0 -240px}
.c4l{width:5px;background-position:0 -252px}
.c4m{width:5px;background-position:0 -264px}
.c4n{width:5px;background-position:0 -276px}
.c4o{width:7px;background-position:0 -288px}
.c4p{width:7px;background-position:0 -300px}
.c4q{width:7px;background-position:0 -312px}
.c4r{width:7px;background-position:0 -324px}
.c4s{width:9px;background-position:0 -336px}
.c59{width:5px;background-position:0 -468px}
.c5a{width:12px;background-position:0 -480px}
.c5b{width:10px;background-position:0 -492px}
.c5c{width:10px;background-position:0 -504px}
.c5d{width:10px;background-position:0 -516px}
.c5e{width:9px;background-position:0 -528px}
.c5f{width:9px;background-position:0 -540px}
.c5g{width:10px;background-position:0 -552px}
.c5h{width:11px;background-position:0 -564px}
.c5i{width:5px;background-position:0 -576px}
.c5j{width:7px;background-position:0 -588px}
.c5k{width:11px;background-position:0 -600px}
.c5l{width:7px;background-position:0 -612px}
.c5m{width:15px;background-position:0 -624px}
.c5n{width:10px;background-position:0 -636px}
.c5o{width:10px;background-position:0 -648px}
.c5p{width:11px;background-position:0 -660px}
.c5q{width:11px;background-position:0 -672px}
.c5r{width:12px;background-position:0 -684px}
.c5s{width:12px;background-position:0 -696px}
.c5t{width:9px;background-position:0 -708px}
.c5u{width:11px;background-position:0 -720px}
.c5v{width:12px;background-position:0 -732px}
.c5w{width:16px;background-position:0 -744px}
.c5x{width:12px;background-position:0 -756px}
.c5y{width:11px;background-position:0 -768px}
.c5z{width:11px;background-position:0 -780px}

View file

@ -0,0 +1,665 @@
tr[onclick]{cursor:pointer}
td[onclick]{cursor:pointer}
input[type="checkbox"]{position:relative;top:1px}
/* navbar */
#navbar{height:23px;border-bottom:1px solid #5C0D11;padding:3px 0 0 25px}
#navbar>div{float:left;width:150px;height:21px;text-align:left;margin-left:10px}
#navbar>div>div:first-child{height:21px}
.nc{text-align:left;position:absolute;visibility:hidden;background:#EDEBDF;z-index:99;opacity:0.95;width:180px;margin:-3px 0 0}
.nc>div{border:1px solid #5C0D11;border-top:0;margin:2px 0 0}
.nc>div>div{height:12px;padding:8px 3px 5px;background:#EDEBDF}
.nc>div>div:hover{background:#F2EFDF}
#stamina_readout{cursor:default}
#stamina_readout>div:nth-child(1){width:20px;float:left;position:relative;top:-3px;left:-3px;font-size:12pt;padding-left:15px}
#stamina_readout>div:nth-child(2){width:110px;padding-top:5px;float:left}
#stamina_readout>div:nth-child(3){width:25px;padding-left:5px;float:left}
#stamina_restore{width:180px}
#stamina_restore>div>div:first-child{padding:10px 0 10px 5px !important}
#stamina_restore img{width:135px;height:15px;padding-left:6px}
#level_readout{padding:5px 2px 0 0}
#level_details,#world_text{background:transparent !important;font-size:10pt;font-weight:bold;font-family:verdana;text-align:center}
#level_details>div{width:340px;margin-left:-90px;background:#EDEBDF;opacity:0.99;padding:5px 0 !important;height:48px}
#level_details>div>div:hover{background:inherit !important}
#world_readout{padding:5px 2px 0 0}
#world_text>div{width:250px;margin-left:-30px;background:#EDEBDF;opacity:0.99;padding:5px 0 !important}
#mail_img{padding:0 4px}
#nav_mail{padding-top:4px;float:right !important;width:44px !important}
#nav_mail>div:nth-child(1){float:left;width:20px}
#nav_mail>div:nth-child(2){float:left;width:24px}
/* filter bar */
#filterbar{padding:5px 15px;font-size:14px;font-family:verdana;font-weight:bold;display:flex;flex-direction:row;align-items:center;user-select:none}
#filterbar>a{flex-grow:1;text-decoration:none}
#filterbar>a>div{border-radius:9px 9px 0px 0px}
.cfb{padding:5px 1px;border-top:1px solid #EDEBDF;border-bottom:1px solid #5C0D11}
.cfb:hover{color:#9B4E03;}
.cfbs{padding:5px 0;border-top:1px solid #EDEBD !importantF;border:1px solid #5C0D11;border-bottom:1px solid #EDEBDF}
/* forge */
#forge_outer{width:1066px;height:600px;padding-top:4px;position:relative;margin:auto}
/* common non-battle screens */
#networth{position:absolute;top:675px;left:0px;height:19px;padding:3px;border:1px solid #5C0D12;border-bottom:0;border-left:0;font-size:10pt;font-weight:bold;font-family:verdana}
/* scrollpane */
.csps{height:19px;width:99%}
.csps>img{margin:2px}
.csps>img:first-child{float:left}
.csps>img:last-child{float:right}
.cspp{clear:both;overflow:hidden}
/* equip/char shared */
#eqch_outer{height:650px;text-align:center;padding-top:4px;position:relative}
#eqch_left{width:840px;height:648px;text-align:center;float:left;position:relative}
#eqch_stats{width:375px;height:748px;float:left;position:relative}
#stats_scrollable{height:641px;padding:0 10px 5px;overflow-y:scroll;scrollbar-gutter:stable;border:2px ridge #5C0D12;border-right:0;margin-top:3px;border-radius:9px 0 0 9px}
#stats_scrollable td:nth-child(1){text-align:right;padding-left:15px;padding-right:3px;min-width:40px}
#stats_scrollable td:nth-child(2){text-align:left}
#stats_scrollable table{margin-bottom:8px}
.spc{padding:10px 0 3px 10px;width:320px}
/* character */
#persona_outer{width:530px;text-align:center;padding-top:40px;margin:auto}
#persona_outer img{padding-top:2px}
#persona_outer select{font-family:verdana;font-size:11pt;font-weight:bold;width:280px;margin:auto}
#persona_outer select>option{font-family:verdana;font-size:10pt;font-weight:bold;width:280px}
#persona_select{margin:auto;height:28px}
#persona_select>div:nth-child(1){float:left;width:150px;padding-top:8px;height:20px}
#persona_select>div:nth-child(2){float:left;width:300px}
#persona_select>div:nth-child(3){float:left;width:75px;padding-top:4px}
#persona_new{margin:10px auto 0}
#persona_used{margin:10px auto 0;width:300px;height:10px}
#attr_outer{width:624px;text-align:center;padding-top:40px;margin:auto}
#attr_outer>div:first-child{height:12px}
#attr_table{border-top:1px solid #5C0D11;margin:auto}
#attr_table img{padding-top:2px}
#attr_table>tbody>tr>td{height:16px}
#attr_table>tbody>tr>td:nth-child(1){width:100px}
#attr_table>tbody>tr>td:nth-child(2){width:50px}
#attr_table>tbody>tr>td:nth-child(3){width:35px;padding-left:6px}
#attr_table>tbody>tr>td:nth-child(4){width:45px}
#attr_table>tbody>tr>td:nth-child(5){width:40px;text-align:right}
#attr_table>tbody>tr>td:nth-child(6){width:40px;padding:2px 5px 0 0}
#attr_table>tbody>tr>td:nth-child(7){width:40px;text-align:left}
#attr_table>tbody>tr>td:nth-child(8){width:160px}
#attr_table>tbody>tr:last-child>td:nth-child(2){width:auto;text-align:center}
#attr_table>tbody>tr:last-child>td:nth-child(3){width:auto;padding:0}
#pabonus{width:624px;margin:10px auto 0}
#prof_outer{width:524px;text-align:center;padding-top:40px;margin:auto}
#prof_outer>div{width:260px;float:left;height:150px}
#prof_outer>div>div{height:12px}
#prof_outer table{border-top:1px solid #5C0D11;margin:auto;height:135px}
#prof_outer table>tbody>tr>td:nth-child(1){width:150px;height:18px}
#prof_outer table>tbody>tr>td:nth-child(2){width:80px;height:18px}
/* itemlist */
.itemlist{font-family:verdana;font-size:9pt;font-weight:bold;text-align:right}
.itemlist>tbody>tr:first-child>td{padding-top:5px}
.itemlist>tbody>tr>td:first-child{width:300px !important;padding-left:5px}
.itemlist>tbody>tr>td:last-child{width:50px}
.itemlist>tbody>tr>td>div{padding:1px 5px 5px 18px;float:right}
.itemlist>tbody>tr>td>div[onclick]:not([style]):hover{opacity:0.6;color:#0030CB !important}
.it{padding-top:7px}
/* item inventory */
#item_outer{width:1066px;margin:auto;height:650px;padding-top:4px;position:relative}
#item_left{width:354px;height:648px;float:left;position:relative}
#item_right{width:650px;height:648px;float:left;position:relative;margin-left:50px}
#item_left>div:first-child,#item_right>div:first-child{height:20px;padding:5px 3px}
#item_list{height:620px;padding:0 3px}
#item_slots{height:620px;padding:0 2px;font-family:verdana;font-size:9pt;font-weight:bold}
#item_slots>div{float:left;width:320px}
.sa{width:300px;height:40px;margin:2px auto;clear:both;text-align:left;position:relative}
.sa>div:first-child{float:left;height:20px;width:24px;padding:13px 22px 8px 2px;text-align:right}
.sa>div:last-child{float:left;min-width:120px;height:40px}
.sa>div:last-child>div{min-width:120px;height:20px;padding:10px 0}
.sa>div:last-child>div:hover{text-decoration:line-through;color:#C2A8A4}
.sd>div:last-child>div{color:#C2A8A4}
.ss,.ss:hover{opacity:0.6;color:#0030CB !important;text-decoration:none !important}
/* item shop */
#itshop_outer{width:800px;height:620px;padding-top:4px;margin:auto}
.itshop_pane{width:400px;height:540px;float:left;position:relative;z-index:3}
.itshop_pane>div:first-child{width:350px;height:20px;position:absolute;top:5px;left:13px}
.itshop_pane>div:last-child{width:400px;height:520px;position:absolute;top:0px;left:0px}
#itshop_touter{clear:both;width:320px;height:60px;margin:auto;padding-top:8px}
#itshop_t1{padding-top:2px;height:20px;display:flex;flex-flow:row nowrap;justify-content:center}
#itshop_t1>div{margin:auto}
#itshop_t1>input{margin:auto;font-family:verdana;font-size:10pt;font-weight:bold;text-align:right;padding:1px 2px 2px;background:#F2EFDF !important;border:1px solid #9B4E03 !important;color:#5C0D11 !important}
#itshop_t1>input:nth-child(1),#itshop_t1>input:nth-child(3){width:75px}
#itshop_t1>input:nth-child(6){width:100px}
#itshop_t1>div:nth-child(2),#itshop_t1>div:nth-child(5){padding:4px 10px 0;width:25px}
#itshop_t1>div:nth-child(4),#itshop_t1>div:nth-child(7){padding:5px 2px 0 5px;width:10px}
#itshop_t2{padding:9px 10px 0 0;height:15px;display:flex;flex-flow:row nowrap;justify-content:center}
#itshop_t2>div{margin:auto;font-weight:bold;padding:2px}
#itshop_t2>div:nth-child(1){width:20px}
#itshop_t2>div:nth-child(2){width:30px}
#itshop_t2>div:nth-child(3){width:35px}
#itshop_t2>div:nth-child(4){width:45px}
#itshop_t2>div:nth-child(5){width:50px}
#itshop_t3{padding-top:11px}
/* equiplist */
.equiplist{font-family:verdana;font-size:9pt;font-weight:bold;text-align:left}
.eqp{clear:both;position:relative;height:22px;width:540px}
.eqp>div:last-child{padding:1px 5px 5px 0;float:left;position:absolute;top:0px;left:20px}
.eqp>div:last-child:not([onclick]){color:#C2A8A4}
.eqp>div:last-child[onclick]:not([data-locked="1"]):not([style]):hover{opacity:0.6;color:#0030CB !important}
.eqp>div:last-child[data-locked="1"]{cursor:default !important}
.tp{margin-top:7px}
.tp>div:first-child>img{top:8px}
/* equipment stat readout */
.showequip{margin:10px auto 0;width:420px;min-height:300px}
.showequip>div{margin:3px auto 0;text-align:center}
.showequip>div:first-child{border-bottom:1px solid #A47C78;font-size:10pt;font-weight:bold;padding:2px 0 4px}
.showequip>div:first-child>div:nth-child(2){font-size:9pt;font-weight:normal;padding:3px 0 2px}
.showequip a{text-decoration:none}
#equip_extended{margin:10px auto 0;border:1px solid #5C0D11;background:#EDEBDF;width:320px;height:400px;padding:3px}
#equip_extended>div:last-child{margin:7px auto 2px;text-align:center}
#equip_extended>div:last-child>div{font-weight:bold}
.eq>div{margin:1px auto;padding:1px;text-align:center;min-height:17px}
.eq span,.ep span{font-weight:bold}
.eq div[title],.ep div[title]{cursor:help}
.eqt,.eqr{font-size:110%;font-weight:bold}
.eqc{font-weight:bold}
.eqs{color:red}
.ex{display:grid;grid-template-columns:repeat(2,1fr);gap:2px 5px;text-align:center;justify-items:center;border-top:1px solid #A47C78;padding-top:2px;text-align:right !important}
.ex>div{width:165px;height:18px}
.ex>div>div:nth-child(1){float:left;width:99px;padding:2px;white-space:nowrap}
.ex>div>div:nth-child(2){float:left;width:45px;padding:2px 0 2px 2px}
.ex>div>div:nth-child(3){float:left;width:6px;padding:2px}
.ep>div:first-child{font-weight:bold;margin:4px auto 0 !important;width:320px !important;grid-column:1/-1}
.ep>div{width:115px;height:18px}
.ep>div>div:nth-child(1){float:left;width:60px;padding:2px;white-space:nowrap;text-align:right}
.ep>div>div:nth-child(2){float:left;width:45px;padding:2px 0 2px 2px;text-align:left}
.ep{display:grid;gap:2px 5px;justify-items:center}
.ep1{grid-template-columns:repeat(1,1fr)}
.ep2{grid-template-columns:repeat(2,1fr)}
.ep3{grid-template-columns:repeat(3,1fr)}
#eu>span{white-space:nowrap;color:red}
#ep>span{white-space:nowrap;color:blue}
#ee>span{white-space:nowrap;color:purple}
.fbr{flex-basis:100%;height:0 !important}
/* equip popup */
#popup_box{visibility:hidden;border:1px solid #5C0D11;background:#EDEBDF;opacity:0.95;text-align:left;padding:3px;z-index:5;position:absolute}
#popup_box>div:nth-child(1){text-align:center;font-weight:bold;padding-bottom:3px;margin-bottom:5px;font-size:120%;border-bottom:1px solid #A47C78}
#popup_box>div:nth-child(2){text-align:left;margin-bottom:5px}
#popup_box>div:nth-child(3){font-weight:bold}
/* ability */
#ability_outer{width:1066px;text-align:center;padding:4px 0 0 5px;position:relative;margin:auto}
#ability_top{width:99%;margin:10px auto 0;height:130px;position:relative}
#ability_top>div{position:absolute}
#ability_top>div:nth-child(1){height:32px;top:0px;left:6px}
#ability_top>div:nth-child(2){height:32px;top:42px;left:6px}
#ability_top>div:nth-child(3){height:32px;width:145px;top:84px;left:474px}
#ability_top>div:nth-child(4){height:30px;width:200px;left:10px;top:102px}
#ability_top>div:nth-child(5){height:30px;width:200px;left:190px;top:102px}
#ability_top>div:nth-child(6){height:30px;width:100px;left:370px;top:99px}
#ability_bot{width:100%;margin:auto;height:500px;clear:both}
#ability_treelist{float:left;width:145px;height:488px;padding-top:5px;border-right:1px solid #5C0D12}
#ability_treelist>div{height:31px}
#ability_treepane{float:left;width:906px;height:500px;padding:10px 0 0 10px}
#ability_treepane>div{position:relative;clear:both;padding:5px 0 0}
#ability_treepane>div>div{float:left}
#ability_treepane>div>div:nth-child(1){width:184px;padding-top:17px}
#ability_treepane>div>div:nth-child(2){width:48px;margin-left:5px}
#ability_treepane>div>div:nth-child(3){width:500px;margin-left:-3px;padding-top:6px}
#ability_treepane>div>div:nth-child(3)>div{float:left;height:30px}
#ability_treepane>div>div:nth-child(4){width:100px;padding-top:16px}
#ability_treepane>div>div:nth-child(5){width:60px;margin-left:8px;padding-top:13px}
#ability_info{position:absolute;visibility:hidden;left:400px;top:155px;width:680px;height:280px;background:#F2EFDF;border:1px solid #5C0D12;z-index:1;overflow:hidden}
#ability_info>div:nth-child(1){text-align:center;font-weight:bold;font-size:110%;margin:3px auto 0}
#ability_info>div:nth-child(2){margin:4px auto 6px}
#ability_info>div:nth-child(3){display:flex;flex-flow:row nowrap;justify-content:center}
#ability_info>div:nth-child(3)>div:first-child{border-right:1px solid #5C0D11}
#ability_info>div:nth-child(3)>div{flex:1;min-width:335px;height:250px;overflow:hidden}
#ability_info>div:nth-child(3)>div>div:first-child{margin:2px auto 2px;font-weight:bold;border-bottom:1px solid #5C0D11}
#ability_info>div:nth-child(3)>div>div:last-child{margin-top:6px}
#ability_info>div:nth-child(3)>div>div:last-child>div{margin-top:6px}
.ability_slotbar>div{float:left;width:44px;height:46px;position:relative;z-index:3;margin-left:8px}
.ability_slotbox>div{width:44px;height:46px;position:relative;z-index:3}
.ability_slotbar>div>div,div.ability_slotbox>div>div{opacity:1.0;width:34px;height:36px;position:absolute;top:3px;left:5px;z-index:4}
.aw1>div{width:500px}
.aw2>div{width:250px}
.aw3>div{width:166px}
.aw5>div{width:100px}
.aw7>div{width:71px}
.aw10>div{width:50px}
/* lottery */
#lottery_eqname{margin:5px auto 0;width:440px;font-family:verdana;font-size:10pt;font-weight:bold}
#lottery_eqstat{margin:10px auto 0;border:1px solid #5C0D11;background:#EDEBDF;width:420px;height:320px;opacity:0.9;text-align:left;padding:3px}
/* monster lab */
#monster_outer{width:1066px;height:650px;padding-top:4px;position:relative;margin:auto;font-family:verdana;font-size:10pt;font-weight:bold}
#monster_nav{width:1000px;height:32px;margin:auto}
#monster_nav>div:first-child,#monster_nav>div:last-child{width:100px;padding-top:9px;float:left}
#monster_nav>div:nth-child(2){width:795px;padding-top:8px;float:left}
#monster_head{width:1066px;padding-top:4px;}
.msl{border:2px ridge #5C0D12;width:996px;height:26px;margin:2px auto}
.msl:hover{background:#F2EFDF}
.msl>div:nth-child(1){float:left;width:25px;padding:8px 10px 0 0}
.msl>div:nth-child(2){float:left;width:300px;padding:8px 0 0 0}
.msl>div:nth-child(3){float:right;width:90px;padding:8px 0 0 6px}
.msl>div:nth-child(4){float:right;width:100px;padding:8px 0 0 0}
.msl>div:nth-child(5)>div{background-image:url(/y/monster/hungerbar.png)}
.msl>div:nth-child(6)>div{background-image:url(/y/monster/moralebar.png)}
.msn{float:right;width:200px;height:20px;position:relative}
.msn>div{position:absolute;top:2px;left:0px;z-index:2;height:22px;width:200px}
.msn>div>img{border:0;position:absolute;top:7px;left:64px;height:8px}
#monster_list{width:1076px;height:565px;margin:auto}
#monster_actions{width:1000px;margin:auto;font-size:10pt;font-family:verdana;font-weight:bold;display:flex;flex-flow:row nowrap;justify-content:center}
#monster_actions>div{width:300px;height:70px;margin:auto}
#monster_actions>div>div{margin:2px auto}
#monster_actions>div:nth-child(2)>div:last-child{padding-top:12px}
#monsterstats_outer{width:1066px;height:660px;padding-top:4px}
#monsterstats_rename{width:900px;padding-top:10px;height:10px;margin:auto}
#monsterstats_left{width:800px;float:left;padding-top:20px}
#monsterstats_top>div{width:200px;height:180px;float:left;margin:0 23px}
#monsterstats_top>div:first-child{display:flex;flex-flow:column nowrap;justify-content:center;align-items:center}
#monsterstats_top>div:first-child>div{padding-bottom:20px}
#monsterstats_rendel{height:16px;padding:0 !important}
#monsterstats_rendel>img:first-child{padding:0 5px 0 0}
#monsterstats_rendel>img:last-child{padding:0 0 0 5px}
.mcr>div{width:200px;height:12px;margin:0 auto 5px;border-bottom:1px solid #5C0D11}
.mcr>table{width:200px;height:160px;margin:auto}
.mcr>table>tbody>tr>td:nth-child(1){width:50px;height:18px;text-align:left}
.mcr>table>tbody>tr>td:nth-child(2){width:50px;height:18px;text-align:left}
.mcr>table>tbody>tr>td:nth-child(3){width:70px;height:18px}
#monsterstats_right{width:200px;float:right;margin-right:65px;padding-top:20px}
#monsterstats_right>div:first-child{width:200px;height:12px;margin:auto;border-bottom:1px solid #5C0D11;padding-bottom:1px}
.mst{width:195px;height:17px;padding-top:8px}
.mst>div:first-child{width:140px;float:left}
.mst>div:last-child{width:55px;float:left}
#upgrade_text{width:800px;padding-top:28px;margin:auto;height:14px;clear:both}
#monsterstats_chaos{width:800px;height:340px;margin:26px auto 0 20px}
#chaosupg{text-align:left;margin:auto}
#chaosupg>tbody>tr>td:nth-child(1){width:120px;padding:2px 10px 0 0}
#chaosupg>tbody>tr>td:nth-child(2){width:160px;padding:2px 0 0}
#chaosupg>tbody>tr>td:nth-child(3){width:20px;padding:3px 6px 0 0}
#chaosupg>tbody>tr>td:nth-child(4){width:400px;padding:0 0 1px}
.mcu0,.mcu1,.mcu2{float:left;width:8px;height:15px;background-repeat:no-repeat}
.mcu0{background-image:url(/y/monster/upg0.png)}
.mcu1{background-image:url(/y/monster/upg1.png)}
.mcu2{background-image:url(/y/monster/upg2.png)}
#monsterskills{text-align:left;margin:20px auto 10px}
#monsterskills th{border-bottom:1px solid #5C0D11}
#monsterskills>tbody>tr>td:nth-child(1){width:200px;height:20px}
#monsterskills>tbody>tr>td:nth-child(1)>input{border-color:#C2A8A4;font-size:11pt;font-weight:bold;width:190px;height:17px;margin-right:5px}
#monsterskills>tbody>tr>td:nth-child(3){width:125px;height:30px}
#monsterskills>tbody>tr>td:nth-child(2),#monsterskills>tbody>tr>td:nth-child(4){width:125px;height:30px;padding-top:5px}
#monsterskills>tbody>tr>td:nth-child(5),#monsterskills>tbody>tr>td:nth-child(6){width:75px;height:30px;padding-top:5px}
.msp{position:relative}
.msp>div:first-child{position:absolute;height:25px;top:-12px;border:1px solid #9B4E03;background:#F2EFDF;z-index:2}
.msp>div:first-child>div{width:125px;height:25px;float:left;padding-top:6px}
.msp>div:last-child{width:125px;height:25px;position:absolute;top:-5px}
#monstercreate_outer{width:808px;height:650px;padding-top:4px;position:relative;margin:auto;font-family:verdana;font-size:10pt;font-weight:bold}
#monstercreate_left{width:254px;height:640px;float:left}
#monstercreate_left>div{width:200px;height:20px;text-align:right;padding-top:28px}
#monstercreate_right{width:554px;height:640px;float:left}
#monstercreate_info{width:554px;text-align:left;padding-top:25px;height:370px}
#monstercreate_info>ul{margin:4px 0}
#monstercreate_stats{width:480px;padding-top:20px;padding-left:30px; height:140px}
#monstercreate_stats>div{width:158px;float:left;height:138px}
#monstercreate_stats>div>div:first-child{width:158px;margin:auto;height:12px;border-bottom:1px solid #9B4E03}
#monstercreate_stats>div:nth-child(1)>table{width:150px}
#monstercreate_stats>div:nth-child(2)>table{width:100px}
#monstercreate_stats>div:nth-child(3)>table{width:135px}
.mcs{margin:auto;padding-top:5px}
.mcs>tbody>tr>td{height:16px}
.mcs>tbody>tr>td:last-child{width:40px}
#monstercreate_patk{width:480px;padding:20px 0 0 30px;height:50px}
#monstercreate_patk>div:first-child{height:12px}
#monstercreate_patk>div:last-child{margin:auto;padding-top:10px}
#monstercreate_patk>div:last-child>div{float:left;width:90px}
/* training */
#train_outer{margin:25px auto 0}
#train_progress{text-align:center;width:465px;margin:auto}
#train_progress>div:nth-child(1)>div{float:left;height:20px}
#train_progress>div:nth-child(1)>div:nth-child(1){width:25px;text-align:right;padding:3px}
#train_progress>div:nth-child(1)>div:nth-child(2){width:400px;background-color:#E3E0D1;border:1px solid #5C0D12;text-align:left}
#train_progress>div:nth-child(1)>div:nth-child(3){width:25px;text-align:left;padding:3px}
#train_progress>div:nth-child(3){font-weight:bold;padding-top:6px}
#train_progbar{height:20px}
#train_progcnt{font-weight:bold}
#train_table{text-align:left;margin:15px auto 0;height:500px}
#train_table td{border-top:1px solid #5C0D11;border-bottom:1px solid #5C0D11}
#train_table>tbody>tr>td:nth-child(1){width:160px}
#train_table>tbody>tr>td:nth-child(2){width:300px;padding:0 5px 0 20px}
#train_table>tbody>tr>td:nth-child(3){width:120px}
#train_table>tbody>tr>td:nth-child(4){width:60px}
#train_table>tbody>tr>td:nth-child(5){width:35px}
#train_table>tbody>tr>td:nth-child(6){width:10px}
#train_table>tbody>tr>td:nth-child(7){width:35px}
#train_table>tbody>tr>td:nth-child(8){width:80px;text-align:center}
/* settings */
#settings_outer{height:668px;overflow:auto;font-size:9pt}
#settings_outer>div{width:650px;text-align:justify;margin:auto}
.settings_block{padding-top:20px;clear:both}
.settings_block>div:first-child{width:400px;height:12px}
.settings_block p{padding:2px 5px}
#settings_apply{padding-top:10px;text-align:center}
#settings_challenge,#settings_title{margin:10px auto 5px}
#settings_challenge td,#settings_title td{border-top:1px solid #5C0D11;border-bottom:1px solid #5C0D11;height:27px}
#settings_challenge>tbody>tr>td:nth-child(1){width:150px}
#settings_challenge>tbody>tr>td:nth-child(2){width:100px}
#settings_challenge>tbody>tr>td:nth-child(3){width:250px}
#settings_challenge>tbody>tr>td:nth-child(4){width:25px}
#settings_title>tbody>tr>td:nth-child(1){width:200px}
#settings_title>tbody>tr>td:nth-child(2){width:300px}
#settings_title>tbody>tr>td:nth-child(3){width:25px}
#settings_cfont{padding-left:30px}
#settings_quickbar{position:relative}
#settings_quickbar>table{width:260px;float:left;margin-left:40px}
#settings_autocast{margin-left:20px}
#settings_autosalvage{margin-left:20px}
#settings_autosalvage td,#settings_autocast td,#settings_quickbar td{padding:4px}
#settings_autosalvage td:first-child,#settings_autocast td:first-child,#settings_quickbar td:first-child{text-align:right;padding:4px 5px 0 0}
/* shrine */
#shrine_outer{width:910px;height:660px;padding-top:4px;margin:auto}
#shrine_left{width:404px;height:640px;float:left}
#shrine_left>div:first-child{height:20px;padding-top:10px}
#shrine_left>div:last-child{height:620px}
#shrine_right{width:504px;height:640px;float:left;font-family:verdana;font-size:10pt;font-weight:bold}
#shrine_right>div:first-child{padding:50px 0 10px 30px;text-align:left}
#shrine_right>div:last-child{padding:10px 0 0}
#accept_equip{padding:10px}
#accept_equip>div{padding:7px}
/* mooglemail */
#mmail_outer{width:1220px;height:650px;padding-top:10px;margin:auto}
#mmail_outer>div:first-child{height:20px;margin:2px auto 10px}
#mmail_left{width:604px;height:625px;float:left}
#mmail_left>table{margin:15px auto 5px}
#mmail_left>table>tbody>tr>td:first-child{text-align:right;width:100px;padding-top:3px}
#mmail_left>table input{border-color:#C2A8A4;height:17px;width:496px;font-family:verdana;font-size:10pt;font-weight:bold}
#mmail_left>textarea{border-color:#C2A8A4;width:585px;height:500px;font-family:verdana;font-size:10pt;font-weight:bold}
#mmail_showbuttons{height:20px;padding-top:8px}
#mmail_right{width:563px;height:625px;float:left;padding:5px 0 0 30px}
#mmail_attachpanes{height:585px;font-family:verdana;font-size:10pt;font-weight:bold}
#mmail_attachpanes input{font-family:verdana;font-size:10pt;font-weight:bold;width:100px;text-align:right}
#mmail_attachitem,#mmail_attachequip{height:570px;position:relative}
#mmail_attachequip>div:nth-child(1),#mmail_attachitem>div:nth-child(1){height:20px;width:450px;position:absolute;top:5px;left:50px}
#mmail_attachequip>div:nth-child(2){height:550px;width:550px;position:absolute;top:0px;left:0px}
#mmail_attachitem>div:nth-child(2){height:520px;width:550px;position:absolute;top:0px;left:0px}
#mmail_attachitem>div:nth-child(3){height:25px;width:550px;position:absolute;top:535px;left:0px}
#mmail_attachitem>div:nth-child(3)>img{position:relative;top:2px}
#mmail_attachinfo{text-align:justify}
#mmail_attachcount{width:540px;padding-top:10px;height:20px !important}
#mmail_attachremove{width:540px;text-align:center;padding-top:3px}
#mmail_attachlist{padding-top:5px;width:540px}
#mmail_attachlist>div{height:42px;display:flex;flex-flow:row nowrap;justify-content:center;align-items:center}
#mmail_currentcod{width:540px;height:20px;padding-top:20px}
#mmail_setcod{width:540px;height:20px;text-align:center;padding-left:40px}
#mmail_setcod>img{position:relative;top:2px}
#mmail_attachlist>div>div{cursor:default}
#mmail_attachlist>div>div:first-child{margin:auto;width:360px;padding:0 0 0 80px;text-align:center}
#mmail_attachlist>div>div:last-child{margin:auto;height:15px;width:80px;padding:1px 10px 0}
#mmail_attachcredits,#mmail_attachhath{padding-top:25px}
#mmail_attachcredits>div,#mmail_attachhath>div{height:30px}
#mmail_attachcredits img,#mmail_attachhath img{position:relative;top:2px}
#mmail_attachbuttons{height:20px;margin:15px auto 5px}
#mmail_attachhelp{padding:10px 30px}
#mmail_attachhelp>p{padding:5px 2px}
#mmail_fin{width:604px;height:625px;float:left;padding-top:215px}
#mmail_fin>div{height:30px}
#mmail_outerlist{height:580px}
#mmail_list{text-align:left;margin:25px auto 0;width:1000px}
#mmail_list>tbody>tr>th{border-bottom:1px solid #5C0D11;height:20px}
#mmail_list>tbody>tr>td{border-top:1px solid #5C0D11;border-bottom:1px solid #5C0D11;height:24px;font-size:10pt;font-weight:bold}
#mmail_list>tbody>tr>td:nth-child(1){width:150px}
#mmail_list>tbody>tr>td:nth-child(3){width:130px}
#mmail_list>tbody>tr>td:nth-child(4){width:120px}
#mmail_list>tbody>tr[onclick]:hover{background:#F2EFDF}
#mmail_nnm{padding-top:20px;border:0 !important}
#mmail_pager{height:20px;width:1000px;margin:auto;font:bold 12px verdana}
#mmail_pager>div:first-child{float:left;width:80px}
#mmail_pager>div:last-child{float:right;width:80px}
#mmail_pager>div>a{text-decoration:none}
#mmail_pager>div>span{color:#C2A8A4}
/* battleinit */
#arena_list{margin:20px auto 0px}
#arena_list>tbody>tr>td{height:33px;border-top:1px solid #5C0D11;border-bottom:1px solid #5C0D11;position:relative}
#arena_list>tbody>tr>td>div{height:20px}
#arena_list>tbody>tr>td>div:first-child,#grindfest>div>div:first-child{z-index:1}
#arena_list>tbody>tr>td>div:last-child,#grindfest>div>div:last-child{z-index:2}
#arena_list>tbody>tr>th{padding-bottom:6px}
#arena_list>tbody>tr>th:nth-child(1){width:375px}
#arena_list>tbody>tr>th:nth-child(2){width:120px}
#arena_list>tbody>tr>th:nth-child(3){width:95px}
#arena_list>tbody>tr>th:nth-child(4){width:85px}
#arena_list>tbody>tr>th:nth-child(5){width:90px}
#arena_list>tbody>tr>th:nth-child(6){width:115px}
#arena_list>tbody>tr>th:nth-child(7){width:117px}
#arena_list>tbody>tr>th:nth-child(8){width:90px}
#arena_tokens{margin:20px auto 0;width:500px;height:12px}
#grindfest{margin:200px auto 0;width:730px}
#grindfest>div{position:relative;width:233px;margin:5px auto}
#grindfest>div>img{position:absolute;top:2px;left:0px;width:233px;height:20px}
#itemworld_outer{width:1066px;height:660px;padding-top:10px;margin:auto}
#itemworld_left{width:604px;height:540px;float:left}
#itemworld_left>div{width:598px;height:580px}
#itemworld_right{width:460px;height:540px;float:left;text-align:justify}
#itemworld_right>div:first-child{padding:50px 20px 30px 10px}
#itemworld_right>div:last-child{text-align:center;padding-top:10px}
#towerstart{width:520px;margin:160px auto 0}
#towerstart>p{padding:5px 0}
#towerstart>div{padding:5px 0}
/* market */
#market_outer{display:flex;flex-direction:row;align-items:stretch;justify-content:start;flex-wrap:nowrap;height:100%}
#market_left,#market_itemlist,#market_itempage,#market_itemfilter{user-select:none}
#market_left{display:flex;flex-direction:column;align-items:stretch;justify-content:start;flex-wrap:nowrap}
#market_left>div,#market_left>a>div{border-right:1px solid #5C0D11}
#market_left>div:last-of-type{flex-grow:1}
#market_left a,#market_right a{text-decoration:none}
#market_right{display:flex;flex-direction:column;align-items:stretch;justify-content:start;flex-wrap:nowrap;flex-grow:1}
#market_xfer{text-align:center;font-size:10pt;white-space:nowrap;padding:10px 10px 20px 0}
#market_xfer>form>div{margin:5px auto}
#market_xfer>form>div:nth-child(2){padding-left:5px;margin-bottom:9px}
#market_xfer input[type="submit"]{width:120px}
#market_xfer input[type="text"]{width:105px;font-size:12pt;font-weight:bold;text-align:right;border-radius:5px;margin-left:8px}
.credit_balance{margin-top:10px}
.credit_balance>div:last-child{padding:3px 0 5px}
.market_tab{padding:15px 5px;font-weight:bold;font-size:14px;font-family:verdana;cursor:pointer;border-radius:9px 0 0 9px;border:1px solid transparent}
.market_tab:hover{color:#9B4E03}
.market_cur{border:1px solid #5C0D11;border-right:1px solid transparent !important}
#market_itemlist{flex-grow:1;flex-shrink:1;overflow:auto}
#market_itemlist>table{min-width:800px;text-align:right;margin:auto;font-family:verdana;font-size:10pt;font-weight:bold;border-collapse:separate;border-spacing:0}
#market_itemlist tr:hover:not(:first-child),.market_itemorders tr[onclick]:hover{color:#9B4E03;background:linear-gradient(to right,#605A5A00 0%, #605A5A0A 5%, #605A5A0A 95%,#605A5A00 100%)}
#market_itemlist th{border-bottom:1px solid #5C0D11;padding:10px 0 10px 20px;position:sticky;top:0;background:#EDEBDF}
#market_itemlist th:first-child{min-width:200px}
#market_itemlist td{height:30px;border-bottom:1px solid #5C0D1136}
#market_itemlist td:nth-child(2), #market_itemlist td:nth-child(3){padding-right:20px}
#market_itemlist td:last-child,#market_itemlist th:last-child{padding-right:20px}
#market_itemlist td:not(:first-child){font-weight:normal}
#market_itemlist>p{font-size:9pt;font-style:italic;padding:10px}
#market_itemlist tr[data-orderdisabled="1"]{color:#e63e3e}
#market_itemfilter{padding:5px 20px;display:flex;flex-direction:row;align-items:center;justify-content:center;font-weight:bold;font-size:10pt}
#market_itemfilter>div{padding:0 20px}
#market_itempage{display:flex;flex-direction:column;align-items:stretch;justify-content:start;flex-wrap:nowrap;flex-grow:1;font-weight:bold}
#market_itempage>div:nth-child(4){padding:10px 0 5px;font-size:10pt;font-family:verdana}
#market_itempage>div:first-child,#market_itempage>div:last-child{padding:15px 0;font-size:10pt;font-family:verdana}
#market_itemheader{display:flex;flex-direction:row;align-items:center;justify-content:center}
#market_itemheader>div:nth-child(2){width:400px}
#market_iteminfo{padding:0 0 15px;font-weight:normal;font-size:9pt}
#market_iteminfo span{font-weight:bold}
#market_itembody{flex-grow:1;display:flex;flex-direction:row;align-items:stretch;justify-content:space-around;flex-wrap:nowrap}
#market_itemsell,#market_itembuy{display:flex;flex-direction:column;align-items:stretch;justify-content:start}
#market_itemhistory{display:flex;flex-direction:column;align-items:stretch;justify-content:start;flex-wrap:nowrap;font-size:9pt}
#market_itemhistory td,#market_itemhistory th{padding:4px 6px}
#market_itemhistory td{text-align:right;height:16px}
#market_itemhistory th{text-align:center;border-bottom:1px solid #5C0D1136}
#market_itemhistory td:not(:first-child){font-weight:normal}
#market_itemhistory p{font-weight:normal;font-style:italic;font-size:8pt;padding:6px}
#market_itemhistory>div:not(:first-child){padding-top:3px}
#buyorder_update[data-orderdisabled="1"]:enabled{color:#e63e3e;border-color:#e63e3e}
#buyorder_update[data-orderdisabled="1"]:disabled{color:#ec9999;border-color:#ec9999}
.market_placeorder{margin:10px;font-size:10pt}
.market_placeorder span{font-weight:bold}
.market_placeorder td{padding:5px 2px;min-width:50px}
.market_placeorder td:nth-child(1){padding-top:6px;text-align:right}
.market_placeorder td:nth-child(3){padding-top:6px;text-align:left}
.market_placeorder td:nth-child(2){text-align:center}
.market_placeorder tr:nth-child(3) td,.market_placeorder tr:nth-child(4) td,.market_placeorder tr:nth-child(5) td{text-align:center;padding:7px 0 2px}
.market_placeorder input[type=number],.market_placeorder input[type=text]{width:70px;height:18px;border-width:1px 0;padding:2px 4px;margin:0;border-radius:0;text-align:right;vertical-align:top}
.market_placeorder input[type=button]{width:24px;height:24px;border-width:1px;margin:0}
.market_placeorder input[type=button]:nth-child(1){border-radius:50% 0 0 50%;padding:0 0 0 2px}
.market_placeorder input[type=button]:nth-child(3){border-radius:0 50% 50% 0;padding:0 2px 0 0}
.market_itemorders{padding-top:10px}
.market_itemorders p{font-weight:normal;font-style:italic;padding:6px}
.market_itemorders table{min-width:100px;margin:5px auto 0;font-weight:normal;font-size:9pt;font-weight:bold}
.market_itemorders th{padding:4px 8px;text-align:right;border-bottom:1px solid #5C0D1136}
.market_itemorders td{padding:8px;text-align:right}
.market_itemorders tr[data-orderconflict="1"]{color:#e63e3e}
.market_itemorders tr[data-orderconflict="1"]:hover{color:#ce3131}
.market_itemorders tr[data-orderactive="1"]{font-style:italic}
.market_itemorders tr[data-orderinsufficient="1"]{font-weight:normal}
.market_itemorders span,#market_itemhistory span,#market_tradelog span{opacity:0.3}
#market_recent{margin:8px auto 0}
#market_recent td>div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:left;max-width:100px}
#market_recent td>div>span,#market_tradelog td:nth-child(2)>span{font-style:italic}
#market_price{margin:8px auto}
#market_accountlog{overflow:auto}
#market_accountlog table,#market_tradelog table{margin:0 auto;text-align:left;font-size:9pt}
#market_accountlog td,#market_tradelog td{padding:3px 5px}
#market_accountlog th,#market_tradelog th{padding:5px 5px 3px;position:sticky;top:0;background:#EDEBDF}
#market_accountlog td:nth-child(1),#market_tradelog td:nth-child(1){font-weight:bold}
#market_accountlog td:nth-child(2),#market_accountlog td:nth-child(3){text-align:right}
#market_accountlog th:nth-child(2),#market_accountlog th:nth-child(3){text-align:center}
#market_tradelog_top,#market_tradelog_bot{font-weight:bold;font-size:10pt;font-family:verdana;padding:5px}
#market_tradelog{flex-grow:1;flex-shrink:1;overflow:auto}
#market_tradelog td:nth-last-child(1),#market_tradelog td:nth-last-child(2),#market_tradelog td:nth-last-child(3){text-align:right}
#market_tradelog th:nth-last-child(1),#market_tradelog th:nth-last-child(2),#market_tradelog th:nth-last-child(3){text-align:center}
/* equipment */
#eqsh{height:20px;text-align:center;padding-top:10px}
#eqsl{height:20px;margin:auto;position:relative}
#eqsl>div{float:left}
#eqsb{height:608px;overflow:auto;position:relative}
.eqb{width:650px;height:20px;margin:4px auto;padding:8px 0 14px;clear:both;text-align:left;position:relative;border:1px solid #5C0D11;border-radius:9px;user-select:none}
.eqb:not(.eqdisabled):hover{background:#F2EFDF;border:1px solid #9B4E03}
.eqb>div{clear:both;width:650px;margin:auto;text-align:center;font-size:10pt;font-weight:bold}
.eqb>div:last-child{padding-top:2px}
.eqempty{color:#9C9C9C}
.eqdisabled{border-color:#9C9C9C !important;color:#9C9C9C !important}
.eqselected{border:2px solid !important;padding:4px 0 !important}
.eqtplabel td{padding-left:10px !important;font-style:italic}
/* armory */
#armory_outer{display:flex;flex-direction:row;align-items:stretch;justify-content:start;flex-wrap:nowrap;height:100%;user-select:none}
#armory_left{display:flex;flex-direction:column;align-items:stretch;justify-content:start;flex-wrap:nowrap;padding-top:50px}
#armory_left>div,#armory_left>a>div{border-right:1px solid #5C0D11}
#armory_left>div:last-of-type{flex-grow:1}
#armory_left a,#armory_right a{text-decoration:none}
#armory_right{display:flex;flex-direction:column;align-items:stretch;justify-content:start;flex-wrap:nowrap;flex-grow:1}
.armory_tab{padding:15px 5px;font-weight:bold;font-size:14px;font-family:verdana;cursor:pointer;border-radius:9px 0 0 9px;border:1px solid transparent}
.armory_tab:hover{color:#9B4E03}
.armory_cur{border:1px solid #5C0D11;border-right:1px solid transparent !important}
#equipselect_outer{display:flex;flex-direction:row;align-items:stretch;justify-content:start;flex-wrap:nowrap;height:630px;width:100%}
#equipselect_left{padding:10px 20px;background:#EDEBDF;flex:1;display:flex;flex-direction:column;align-items:stretch}
#equiplist{overflow-y:scroll;scrollbar-gutter:stable;flex:1;padding-right:5px}
#equiplist tr[data-eqprotect]{opacity:0.5}
#equipselect_left table{width:100%;background:#EDEBDF}
#equipselect_left td,#equipselect_left th{padding:6px 2px;text-align:left}
#equipselect_left th{font-style:italic;font-weight:normal;font-size:9pt}
#equipselect_left td{font-size:10pt;font-weight:bold;border-top:1px solid #5C0D1136;border-bottom:1px solid #5C0D1136}
#equipselect_left tr:not(.eqselall):not(.eqtplabel):hover,tr[data-hover="1"]{color:#9B4E03;background:linear-gradient(to right,#605A5A00 0%, #605A5A0A 5%, #605A5A0A 95%,#605A5A00 100%)}
#equipselect_left td:not(:first-child){text-align:right;padding-right:5px}
#equipselect_right{width:440px;display:flex;flex-direction:column;align-items:stretch;justify-content:start;flex-wrap:nowrap}
#eqback{font-weight:bold;text-align:left;font-size:9pt;margin:0 0 8px 2px}
#equipinfo{flex:1}
#equipblurb{text-align:justify;font-size:10pt;padding:0 10px 0 3px}
#equipblurb table{margin:10px 0 0 20px}
#equipblurb td{padding:3px;text-align:right}
#equipblurb td:not(:first-child){font-weight:bold}
#equipblurb a{font-weight:bold}
#equipaction{padding-bottom:7px}
#equipaction label{text-align:left;margin:5px 0 5px 15px;font-weight:bold;font-size:9pt}
#equipaction p{font-weight:bold;font-size:9pt}
#equipaction td:first-child{font-weight:bold;text-align:right}
#equipaction td[data-inactive="1"]{filter:saturate(0);opacity:0.5}
.eqaction{width:250px;margin:auto}
.eqorganize{margin:auto}
.eqorganize td{min-width:54px}
.eqorganize span{font-size:12pt}
.eqmodify td:first-child{font-size:12pt}
#equipsubmit{margin:10px auto 5px}
#itemlist{margin:5px auto;font-size:9pt;font-weight:bold;overflow-y:scroll;scrollbar-gutter:stable;flex-shrink:1}
#itemlist>table{margin:auto}
#itemlist th,.eqils td{padding:2px;text-align:center}
.eqilm td{padding:2px;text-align:left}
.eqilm td:first-child{min-width:40px;text-align:right;padding-left:0}
.eqilm td:last-child{min-width:50px}
#eqcredits{margin:auto}
#eqcredits td{width:100px;font-weight:bold;font-size:9pt}
#eqcredits td:nth-child(2){width:120px;text-align:center}
#eqcredits td:nth-child(3){text-align:left}
#equipmodify_outer{display:flex;flex-direction:row;align-items:stretch;justify-content:start;flex-wrap:nowrap;height:630px;width:100%}
#equipmodify_left{padding:10px 20px;flex:1}
#equipmodify_left>p{font-weight:bold;font-size:9pt}
#equipmodify_middle{padding:10px 20px;flex:1;display:flex;flex-direction:column;align-items:stretch;justify-content:start;flex-wrap:nowrap}
#equipmodify_middle>div{flex:1}
#equipmodify_right{width:440px;display:flex;flex-direction:column;align-items:stretch;justify-content:start;flex-wrap:nowrap}
#equipmodify_right button{width:165px;margin:5px;white-space:nowrap}
#equipmodify_right table{margin:auto}
#charmslots{margin:-7px 0 -1px}
.eqcharm{width:300px;height:52px;margin:9px auto;padding:6px 1px 5px;border:1px solid #5C0D11;border-radius:9px;user-select:none}
.eqcharm:not(.eqdisabled):hover{background:#F2EFDF;border:1px solid #9B4E03}
.eqcharm>div{text-align:center;font-size:10pt;font-weight:bold}
.eqcharm>div:last-child{padding-top:2px}
.eqcharm p{padding:1px}
.eqcharm table{margin:2px auto 0;text-align:center;font-size:10pt;font-weight:bold;width:280px}
.eqcharm td:first-child{text-align:left;padding-left:50px}
.eqcharm td:last-child{text-align:right;padding-right:50px}
.chsel{border:2px solid !important;padding:5px 0 4px !important}
.chdmg{text-decoration:line-through}
.eqce{color:#9C9C9C;margin-top:7px}
#equpgrade>p,#eqbaserolls>p{font-weight:bold;font-size:9pt}
#equpgrade>p:first-child,#eqbaserolls>p:first-child{font-size:10pt}
#equpgrade>button,#eqbaserolls>button{width:175px;margin:5px}
.upgrmats,#eqbaserolls>table{margin:auto}
.upgrmats td,#eqbaserolls td{font-size:9pt;padding:3px 2px;text-align:left}
.upgrmats td:first-child,#eqbaserolls td:first-child{text-align:right}
.eqred{color:#FF0000}
#confirm_body .upgrmats{font-weight:bold}
#eqbaserolls td:last-child{text-align:left;padding-right:5px;font-weight:bold}
#confirm_outer{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#EDEBDFCC;z-index:9999;display:flex;flex-flow:column;justify-content:center;align-items:center;backdrop-filter:blur(1px)}
#confirm_inner{background:#EDEBDF;border:2px solid;border-radius:9px}
#confirm_inner>div{width:500px;padding:5px;text-align:center}
#confirm_header{display:flex;flex-flow:row;justify-content:start;border-bottom:1px solid}
#confirm_header>div:first-child{text-align:left;flex-grow:1;font-size:12pt;padding-top:3px}
#confirm_header>div:last-child{width:30px;text-align:right;font-size:14pt;padding-right:5px}
#confirm_body{font-size:10pt}
#confirm_body>input[type="text"]{width:95%;margin:5px 0}
#confirm_body>button{margin:10px}
#confirm_body>table{margin:auto}
#confirm_body label{position:relative;left:3px;margin:0 10px}
#eqselcharm{overflow-y:scroll;scrollbar-gutter:stable}
#eqselcharm table,#eqselpouch table{width:290px}
#eqselcharm td,#eqselpouch td{font-size:10pt;font-weight:bold;text-align:left;padding:5px 0}
#eqselcharm td:last-child,#eqselpouch td:last-child{text-align:right}
#eqselpouch{flex:0 !important}
#equipmodify_outer tr[data-disabled]{color:#9C9C9C !important;border-color:#9C9C9C !important}
#setcharm{margin-bottom:0}
#cdreason{font-weight:bold;padding:0;margin:0 0 3px}
#charmats td:first-child,#iwinfo td:first-child{text-align:right;padding-right:5px}
#charmats td:last-child{text-align:left}
#iwinfo{margin:0 auto 5px !important}
#iwinfo td{padding:3px}
#iwinfo td:last-child{text-align:left;font-weight:bold}
#armory_repaircosts{font-weight:bold;margin:0 auto 3px !important}
#armory_repaircosts td{padding:3px}
#fuseinfo{margin:3px auto 0 !important}
#fuseinfo td:nth-child(1){text-align:right}
#fuseinfo td:nth-child(2){padding:1px 2px 1px 5px}
#fuseinfo td:nth-child(3){font-weight:bold;padding:1px 5px 1px 2px}
#fuseinfo td:nth-child(4){text-align:left}

Binary file not shown.

After

Width:  |  Height:  |  Size: 690 B

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 763 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 909 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,47 @@
function api_call(h,g,d){h.open("POST",MAIN_URL+"json");h.setRequestHeader("Content-Type","application/json");h.withCredentials=!0;h.onreadystatechange=d;h.send(JSON.stringify(g))}function api_response(h){if(4==h.readyState)if(200==h.status)if(h=JSON.parse(h.responseText),void 0!=h.login)top.location.href=login_url;else return h;else alert("Server communication failed: "+h.status+" ("+h.responseText+")"),document.location+="";return!1}
function number_format(h){return h.toString().replace(/\B(?=(\d{3})+(?!\d))/g," ")}var e=function(h){return document.getElementById(h)};
function Common(){function h(a,f,l){a=a.getElementsByTagName("DIV");f=["f2l"+f,"f2r"+f,"f4l"+f,"f4r"+f];var r=["f2l"+l,"f2r"+l,"f4l"+l,"f4r"+l];l="a"==l?"#0030CB":"#5C0D11";for(var n=0;n<a.length;n++)for(var w=0;w<f.length;w++)a[n].className=a[n].className.replace(f[w],r[w]),a[n].style.color=l}this.goto_arena=function(){document.location=MAIN_URL+"?s=Battle&ss=ar"};this.goto_ring=function(){document.location=MAIN_URL+"?s=Battle&ss=rb"};this.goto_grindfest=function(){document.location=MAIN_URL+"?s=Battle&ss=gr"};
this.goto_tower=function(){document.location=MAIN_URL+"?s=Battle&ss=tw"};this.findPos=function(a){var f=0,l=0;if(a.offsetParent){do f+=a.offsetLeft,l+=a.offsetTop;while(a=a.offsetParent)}return[f,l]};this.findPosWithScroll=function(a){var f=0,l=0;if(a.offsetParent){do f+=a.offsetLeft+(a.scrollLeft?a.scrollLeft:0),l+=a.offsetTop+(a.scrollTop?a.scrollTop:0);while(a=a.offsetParent)}return[f,l]};this.findScrollOffset=function(a){var f=0,l=0;if(a.offsetParent){do f+=a.scrollLeft?a.scrollLeft:0,l+=a.scrollTop?
a.scrollTop:0;while(a=a.offsetParent)}return[f,l]};this.getCursorPosition=function(a){a=a||window.event;var f={x:0,y:0};if(a.pageX||a.pageY)f.x=a.pageX,f.y=a.pageY;else{var l=document.documentElement,r=document.body;f.x=a.clientX+(l.scrollLeft||r.scrollLeft)-(l.clientLeft||0);f.y=a.clientY+(l.scrollTop||r.scrollTop)-(l.clientTop||0)}return f};this.decimalround=function(a,f){return Math.round(a*Math.pow(10,f))/Math.pow(10,f)};this.suppress_popups=!1;this.show_popup_box=function(a,f,l,r,n,w,B,D,H,F){if(!this.suppress_popups){var G=
e("popup_box"),J=[0,0],I=[0,0],L=0;void 0!=w&&(L=w.offsetWidth,J=common.findPosWithScroll(w),""!=n&&(n=e(n),I[0]=n.scrollLeft,I[1]=n.scrollTop));G.style.left=("right"==B?J[0]-I[0]+L+a:J[0]-I[0]-a-l)+"px";G.style.top=J[1]-I[1]+f+"px";G.style.width=l+"px";G.style.height=r+"px";G.innerHTML="<div>"+D+"</div><div>"+H+"</div><div>"+F+"</div>";G.style.visibility="visible"}};this.hide_popup_box=function(){e("popup_box").removeAttribute("style")};this.show_itemc_box=function(a,f,l,r,n,w){this.show_popup_box(a,
f,398,75,l,r,n,dynjs_itemc[w].n,dynjs_itemc[w].q,"Consumable")};this.show_itemr_box=function(a,f,l,r,n,w,B,D){this.show_popup_box(a,f,398,85,l,r,n,w,B,D)};var g=void 0,d=0,m=0,q=0,u=function(){var a=g.scrollTop;g.scrollTop=0<d?Math.min(g.scrollTop+q,m):Math.max(g.scrollTop-q,m);a!=g.scrollTop?setTimeout(u,1):(g=void 0,m=d=0)};this.scrollpane_up=function(a,f,l){void 0==g&&(g=e(a),d=-1,m=Math.max(0,g.scrollTop-f),q=void 0!=l?1E3:25,u())};this.scrollpane_down=function(a,f,l){void 0==g&&(g=e(a),d=1,m=
g.scrollTop+f,q=void 0!=l?1E3:25,u())};this.hookEvent=function(a,f,l){"string"==typeof a&&(a=e(a));null!=a&&(a.addEventListener?("mousewheel"==f&&a.addEventListener("DOMMouseScroll",l,!1),a.addEventListener(f,l,!1)):a.attachEvent&&a.attachEvent("on"+f,l))};this.unhookEvent=function(a,f,l){"string"==typeof a&&(a=e(a));null!=a&&(a.removeEventListener?("mousewheel"==f&&a.removeEventListener("DOMMouseScroll",l,!1),a.removeEventListener(f,l,!1)):a.detachEvent&&a.detachEvent("on"+f,l))};this.cancelEvent=
function(a){a=a?a:window.event;a.stopPropagation&&a.stopPropagation();a.preventDefault&&a.preventDefault();a.cancelBubble=!0;a.cancel=!0;return a.returnValue=!1};this.number_format=function(a){x=(a+"").split(".");x1=x[0];x2=1<x.length?"."+x[1]:"";for(a=/(\d+)(\d{3})/;a.test(x1);)x1=x1.replace(a,"$1,$2");return x1+x2};var v=[9,5,10,10,10,10,10,10,9,9,4,4,5,10,11,8,8,8,11,11,4,4,4];this.get_dynamic_digit_string=function(a){a=this.number_format(a);for(var f="",l=0,r=a.length-1;0<=r;r--){var n=","==a.charAt(r)?
11:"."==a.charAt(r)?10:"+"==a.charAt(r)?15:":"==a.charAt(r)?22:"-"==a.charAt(r)?16:parseInt(a.charAt(r));f=f+'<div style="float:right; height:12px; width:'+(v[n]+1)+"px; background:transparent url("+IMG_URL+"font/12b.png) 0px -"+12*n+'px"></div>';l+=v[n]}return'<div style="position:relative; display:inline; height:12px; width:'+l+'px">'+f+"</div>"};this.apply_select=function(a){h(a,"b","a");a.style.color="#0030CB"};this.apply_unselect=function(a){h(a,"a","b");a.removeAttribute("style")};var y=void 0;
this.text_select=function(a){var f=y!=a;this.text_unselect();f&&(this.apply_select(a),y=a)};this.text_unselect=function(){void 0!=y&&(this.apply_unselect(y),y=void 0)}}var common=new Common;
function ItemShop(){function h(){y=!0;1>d||1>m?y=!1:"shop_pane"==g&&m*u>current_credits&&(y=!1);e("accept_button").src=IMG_URL+"shops/accept"+(y?"":"_d")+".png";e("cost_field").value=u;e("sum_field").value=(m*u).toLocaleString("en")}var g=void 0,d=0,m=0,q=void 0,u=0,v=0,y=!1;this.set_item=function(a,f,l,r,n){f==d&&a==g&&(a=void 0,r=l=f=0,n=void 0);g=a;d=f;u=r;q=f&&!n?dynjs_itemc[f].n:n;v=l;this.set_count(0<f?1:0);h()};this.set_count=function(a){m=Math.max(0,Math.min(a,v));e("count_field").value=m;
h()};this.increase_count=function(a){this.set_count(1==m&&1<a?a:m+a)};this.read_count=function(){m=Math.max(0,parseInt(e("count_field").value));0<d&&m>v&&this.set_count(v);h()};this.commit_transaction=function(){y&&confirm("Are you sure you wish to "+("shop_pane"==g?"purchase":"sell")+" "+m+' "'+q.replace("&#039;","'")+'" for '+common.number_format(m*u)+" credits ?")&&(e("select_mode").value=g,e("select_item").value=d,e("select_count").value=m,e("shopform").submit())}}
function Snowflake(){var h=e("shrine_info"),g=e("shrine_artifact"),d=e("shrine_trophy"),m=e("shrine_collectible"),q=e("shrine_offertext"),u=0,v=0,y=0,a="",f="",l=void 0,r=!1;this.set_shrine_item=function(n,w,B,D){n==u&&(B=w=n=0,D=void 0);u=n;v=w;y=B;l=D;r=!0;n=0;1>u?(e("accept_equip").style.display="none",r=!1,n=1):2E4<=u&&3E4>u?(r=!0,n=2):3E4<=u&&4E4>u?(r=y<=v,n=3):7E4<=u&&8E4>u&&(r=!0,n=4);if(3==n)for(e("accept_equip").style.display="",e("accept_reward").style.display="none",w=e("accept_equip").querySelectorAll(".accept_equip"),
B=0;B<w.length;B++)w[B].disabled=r?"":"disabled";else e("accept_equip").style.display="none",e("accept_reward").style.display=1<n?"":"none",e("accept_reward").disabled=r?"":"disabled";h.style.display=1==n?"":"none";g.style.display=2==n?"":"none";d.style.display=3==n?"":"none";m.style.display=4==n?"":"none";q.innerHTML=0==u?"":y>v?"You have "+v+" / "+y+" items required for this offering.":"Offer "+y+"x "+l+" for :"};this.submit_shrine_reward=function(n,w){a=n;f=w;this.commit_transaction()};this.commit_transaction=
function(){r&&confirm("Are you sure you wish to offer Snowflake "+(1<y?y+"x":"a")+" "+l.replace("&#039;","'")+" ?")&&(e("select_item").value=u,e("select_reward_type").value=a,e("select_reward_slot").value=f,e("shopform").submit())}}
function MoogleMail(){var h=0,g=void 0;this.set_mooglemail_item=function(d,m){if(void 0==m||"1"!=m.getAttribute("data-locked"))d==h&&(d=0),0==d?(common.text_unselect(),h=0):(void 0!=m&&common.text_select(m),h=d,"equip"==g&&this.apply_attachment())};this.set_mooglemail_pane=function(d){this.set_mooglemail_item(0);g=g==d?void 0:d;e("mmail_attachinfo").style.display=void 0==g?"":"none";e("mmail_attachitem").style.display="item"==g?"":"none";e("mmail_attachequip").style.display="equip"==g?"":"none";e("mmail_attachcredits").style.display=
"credits"==g?"":"none";e("mmail_attachhath").style.display="hath"==g?"":"none"};this.apply_attachment=function(){if(void 0!=g){var d="equip"==g?1:Math.max(1,parseInt(e("count_"+g).value));0<d&&(e("action").value="attach_add",e("select_item").value=h,e("select_count").value=d,e("select_pane").value=g,e("mailform").submit())}};this.check_apply_attachment=function(d){13==d.keyCode&&this.apply_attachment()};this.mmail_send=function(){var d="";0<attach_count&&(d="You have attached "+attach_count+(1==attach_count?
" item":" items")+(0<attach_cod?", and the CoD is set to "+attach_cod+" credits, kupo!":", but you have not set a CoD, kupo! The attachments will be a gift, kupo!"));0<send_cost&&(d+=" Sending it will cost you "+send_cost+" credits, kupo!");confirm(d+" Are you sure you wish to send this message, kupo?")&&(e("action").value="send",e("mailform").submit())};this.mmail_save=function(){e("action").value="save";e("mailform").submit()};this.mmail_discard=function(){confirm("Are you sure you wish to discard this message, kupo?")&&
(e("action").value="discard",e("mailform").submit())};this.remove_attachment=function(d){0<mail_state&&0<attach_cod&&!confirm("Removing the attachments will deduct "+attach_cod+" Credits from your account, kupo! Are you sure?")||(e("action").value="attach_remove",e("action_value").value=d,e("mailform").submit())};this.return_mail=function(){confirm("This will return the message to the sender, kupo! Are you sure?")&&(e("action").value="return_message",e("mailform").submit())};this.check_set_cod=function(d){13==
d.keyCode&&this.set_cod()};this.set_cod=function(){e("action").value="attach_cod";e("action_value").value=Math.max(0,parseInt(e("newcod").value));e("mailform").submit()}}
function Equips(){var h=0,g=void 0;this.set=function(d,m,q,u){var v="undefined"==typeof dynjs_eqstore||"undefined"==typeof dynjs_eqstore[d]?dynjs_equip:dynjs_eqstore;h=d;g=v[d].k;common.show_popup_box(q,u,360,360,m,void 0,"right",v[d].t,v[d].d,"")};this.unset=function(){h=0;g=void 0;common.hide_popup_box()};this.pop_equipwindow=function(){return 0<h?(window.open(MAIN_URL+"equip/"+h+"/"+g,"_pu"+(Math.random()+"").replace(/0\./,""),"toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width=450,height=520,left="+
(screen.width-450)/2+",top="+(screen.height-520)/2),!0):!1};this.lock=function(d,m){var q=new XMLHttpRequest;api_call(q,{type:"simple",method:"lockequip",uid,token:simple_token,eid:d,lock:"il"==m.className?0:1},function(){var u=api_response(q);if(0!=u&&void 0!=u.eid){m.className=u.locked?"il":"iu";var v=e("e"+d),y=v.getAttribute("data-locked");if(y){if("0"===y&&v.getAttribute("style")&&v.onclick)v.onclick();v.setAttribute("data-locked",u.locked)}}})};document.onkeypress=function(d){d.shiftKey||d.altKey||
"c"==String.fromCharCode(window.event?d.keyCode:d.which)&&equips.pop_equipwindow()&&common.cancelEvent(d)}}
function Training(){this.start_training=function(m){e("start_train").value=m;e("trainform").submit()};this.cancel_training=function(){e("cancel_train").value=1;e("trainform").submit()};var h=e("train_progbar"),g=e("train_progcnt");if("undefined"!=typeof reload_to)var d=setInterval(function(){var m=Date.now()/1E3+time_skew,q=m<end_time?q=100-100*(end_time-m)/total_time:100,u=Math.floor(q),v=Math.floor(100*(q-u));g.innerHTML=u+"."+(10>v?"0":"")+v;h.style.width=4*q+"px";m>=end_time&&(document.location=
reload_to,clearInterval(d))},ticktime)}
function ItemSelector(){var h=0,g=!1;this.set_item=function(q){h==q?this.commit_slot(0):h=q};var d=void 0,m=void 0;this.hover_slot=function(q){0!=h&&(void 0!=d&&this.unhover_slot(),common.suppress_popups=!0,d=q,m=q.innerHTML,q.innerHTML=dynjs_itemc[h].n,q.className="ss")};this.unhover_slot=function(){void 0!=d&&(d.innerHTML=m,d.removeAttribute("class"),d=void 0,common.suppress_popups=!1)};this.commit_slot=function(q){g||(g=!0,e("slot").value=q,e("item").value=h,e("selectionform").submit())}}
function MonsterLab(){this.create_monster=function(h){e("selected_patk").value=h;e("create_form").submit()}}
function Battle(){var h=e("infopane"),g=[void 0,void 0],d=[void 0,void 0],m="log",q=void 0,u=void 0,v=void 0,y=1,a=0,f=void 0,l=e("ta_monster_1"),r=e("ta_monster_2"),n=!1,w=function(b){void 0!=h&&(h.innerHTML=b)};this.set_infopane=function(b){switch(b){case "Attack":var k="Damages a single enemy. Depending on your equipped weapon, this can place certain status effects on the affected monster. To attack, click here, then click your target. Simply clicking an enemy will also perform a normal attack.";break;
case "Skillbook":k="Use special skills and magic. To use offensive spells and skills, first click it, then click your target. To use it on yourself, click it twice.";break;case "Items":k="Use various consumable items that can replenish your vitals or augment your power in various ways.";break;case "Spirit":k="Toggle Spirit Channeling.";break;case "Defend":k="Increases your defensive capabilities for the next turn.";break;case "Focus":k="Reduces the chance that your next spell will be resisted. Your defenses and evade chances are lowered for the next turn.";
break;default:k="Choose from the Battle Actions highlighted above, and use them to defeat your enemies listed to the right. When all enemies are reduced to zero Health, you win. If your Health reaches zero, you are defeated."}w('<div class="btii">'+b+"</div><div>"+k+"</div>")};this.set_infopane_spell=function(b,k,t,z,C,A){var E="";if(0<z||0<C)E="Requires ",0<z&&(E+=z+" Magic Points"),0<z&&0<C&&(E+=z+" and "),0<C&&(E+=C+" Charge"+(1==C?"":"s")),E+=" to use.";0<A&&(E+=" Cooldown: "+A+" turns.");w('<div class="btii">'+
b+'</div><div style="position:relative"><div style="float:left; width:601px"><div style="padding-bottom:3px; padding-right:3px">'+k+'</div><div><span style="font-weight:bold">'+E+'</span></div></div><div style="float:left; width:32px; height:32px; position:relative"><img src="'+IMG_URL+"a/"+t+'.png" style="border:0px; margin:0px; padding:0px; position:absolute; left:3px; top:4px; z-index:3" /><img src="'+IMG_URL+'ab/b.png" style="border:0px; margin:0px; padding:0px; position:absolute; left:-5px; top:-4px; z-index:3" /></div></div>')};
this.set_infopane_effect=function(b,k,t){w('<div class="btii">'+b+'</div><div style="padding-bottom:3px">'+k+'</div><div><span style="font-weight:bold">'+("autocast"==t?"Expires if magic is depleted to below 10%":"permanent"==t?"Permanent until triggered":"decaying"==t?"Decays by 20% per turn":"Expires in "+t+" turn"+(1==t?"":"s"))+".</span></div>")};this.set_infopane_item=function(b){w('<div class="btii">'+dynjs_itemc[b].n+'</div><div style="padding-bottom:3px">'+dynjs_itemc[b].q+"</div>")};this.lock_action=
function(b,k,t,z){if(!n)if(d[k]==b&&"skill"!=t?(g[k]=void 0,d[k]=void 0):(g[k]=h.innerHTML,d[k]=b),0==k&&(g[1]=void 0,d[1]=void 0),1==k)q!=t&&(this.clear_actions(),q=t,b.src=IMG_URL+"battle/"+q+"_s.png",this.set_mode(t)),this.set_selected_subaction(b,z);else switch(q==t?"skill"==t?this.set_selected_subaction(void 0):q=void 0:(this.clear_actions(),q=t),b.src=IMG_URL+"battle/"+t+"_"+(void 0==q?"n":"s")+".png",this.set_mode(t),t){case "attack":this.toggle_default_pane();break;case "skill":this.toggle_magic_pane();
break;case "items":this.toggle_item_pane();break;default:this.touch_and_go()}};this.clear_actions=function(){if(void 0!=q){if("spirit"!=q){var b="magic"==q?"skill":q;e("ckey_"+b).src=IMG_URL+"battle/"+b+"_n.png"}q=void 0}};this.clear_infopane=function(){void 0!=g[1]?w(g[1]):void 0!=g[0]?w(g[0]):this.set_infopane("Battle Time")};var B=function(b){e("pane_"+b).style.display="none";m=void 0};this.toggle_pane=function(b){b==m?this.toggle_default_pane():(B(m),e("pane_"+b).style.display="",m=b)};this.toggle_default_pane=
function(){"log"!=m&&(B(m),e("pane_log").style.display="",m=m="log")};this.toggle_magic_pane=function(){"skill"==m?this.toggle_pane("magic"):"magic"==m?this.toggle_pane("skill"):this.toggle_pane(default_magic_pane)};this.toggle_skill_pane=function(){this.toggle_pane("skill")};this.toggle_item_pane=function(){this.toggle_pane("item")};var D="attack",H=0,F=0;this.set_mode=function(b){D=D==b&&"magic"!=b?"attack":b};this.reset_skill=function(){F=H=0;this.set_selected_subaction(void 0)};this.set_hostile_skill=
function(b){F=F==b?0:b};this.set_friendly_skill=function(b){F==b?(H=0,this.touch_and_go()):F=b};this.hover_target=function(b){if(void 0==v){var k=common.findPosWithScroll(b),t=common.findPosWithScroll(e("battle_right"));k[0]-=t[0];k[1]-=t[1];l.style.left=k[0]-7+"px";l.style.top=k[1]+b.offsetHeight/2-3+"px";r.style.left=k[0]+b.offsetWidth+2+"px";r.style.top=k[1]+b.offsetHeight/2-3+"px";l.style.visibility="visible";r.style.visibility="visible"}};this.unhover_target=function(){void 0==v&&(l.removeAttribute("style"),
r.removeAttribute("style"))};this.commit_target=function(b){n||void 0!=v||(H=v=b,this.touch_and_go())};var G=void 0,J=void 0,I=void 0;this.touch_and_go=function(){n||void 0!=f||(G=D,J=H,I=F,f=new XMLHttpRequest,api_call(f,{type:"battle",method:"action",token:battle_token,mode:D,target:H,skill:F},this.process_action))};this.recast=function(){n||void 0==G||(D=G,H=J,F=I,this.touch_and_go())};for(var L=0,O=!1,M="pane_completion pane_effects pane_action pane_vitals pane_quickbar table_skills table_magic pane_item pane_monster".split(" "),
Q=[],P=0;P<M.length;P++){var R=M[P];Q[R]=e(R)}this.process_action=function(){var b=api_response(f);if(0!=b){if(void 0!=b.error)this.battle_continue();else if(void 0!=b.reload)this.battle_continue();else{for(var k=0;k<M.length;k++){var t=M[k];void 0!=b[t]&&(Q[t].innerHTML=b[t])}has_debug&&(e("debugpane").innerHTML=b.debugpane);if(void 0!=b.textlog){t=e("textlog");t.insertRow(0).insertCell(0).className="tls";var z=b.textlog.length;for(k=0;k<z;k++){var C=t.insertRow(0).insertCell(0);C.className="tl"+
(void 0!=b.textlog[k].c?b.textlog[k].c:"");C.innerHTML=b.textlog[k].t}for(L+=z;100<L;)t.deleteRow(-1),--L}void 0==b.pane_completion?(e("pane_completion").innerHTML="",n=!1):n=!0;e("expbar").style.width=b.exp+"px";1234==b.exp?(O=!0,e("expbar").src=IMG_URL+"bar_yellow.png"):O&&(O=!1,e("expbar").src=IMG_URL+"bar_blue.png");do_healthflash=b.healthflash;v=void 0;battle.unhover_target();battle.reset_skill();battle.set_mode("attack");a=1;l.style.opacity=a;r.style.opacity=a;battle.toggle_default_pane();g[0]=
void 0;g[1]=void 0;battle.clear_infopane();battle.clear_actions()}f=void 0}};var S=!1;this.battle_continue=function(){S||(S=!0,document.location+="")};this.set_selected_subaction=function(b,k){void 0==b?(u=void 0,common.text_unselect()):u==k?this.set_selected_subaction(void 0):common.text_select(b)};var N=0;this.start_flash_loop=function(){setInterval(function(){a=common.decimalround(Math.min(1,Math.max(0,a+.07*y)),2);if(0==a||1==a)y*=-1;void 0!=v&&(l.style.opacity=a,r.style.opacity=a);do_healthflash?
(N=Math.floor(80+150*a),e(vital_prefix+"vbh").style.backgroundColor="rgb("+N+",50,50)"):0!=N&&(e(vital_prefix+"vbh").style.backgroundColor="",N=0);for(var b=0,k;k=e("effect_expire_"+ ++b);)k.style.opacity=.8-a/2},20)};document.onkeydown=function(b){b=b||window.event;if(b.target)var k=b.target;else b.srcElement&&(k=b.srcElement);3==k.nodeType&&(k=k.parentNode);if("INPUT"!=k.tagName&&"TEXTAREA"!=k.tagName){k=b.keyCode?b.keyCode:b.which;var t=String.fromCharCode(k),z=void 0,C=void 0,A=-1;switch(k){case 48:case 96:A=
0;break;case 49:case 97:A=1;break;case 50:case 98:A=2;break;case 51:case 99:A=3;break;case 52:case 100:A=4;break;case 53:case 101:A=5;break;case 54:case 102:A=6;break;case 55:case 103:A=7;break;case 56:case 104:A=8;break;case 57:case 105:A=9}var E=!1;if(b.altKey){if(0<=A&&10>A){0==A&&(A=10);E=!0;var K=e("qb"+A);K&&(K.onmouseover(),K.onclick())}}else{if(13==k||32==k)z="btcp";else if(-1<A)z="mkey_"+A;else if(112<=k&&123>=k||"G"==t||"P"==t)"item"!=m&&(z="ckey_items"),C="G"==t||"P"==t?"ikey_p":b.ctrlKey?
"ikey_n"+(k-111):b.shiftKey?"ikey_s"+(k-111):"ikey_"+(k-111);else if(!b.ctrlKey&&!b.shiftKey)switch(t){case "Q":z="ckey_attack";break;case "W":z="ckey_skill";break;case "E":z="ckey_items";break;case "S":z="ckey_spirit";break;case "D":z="ckey_defend";break;case "F":z="ckey_focus";break;case "R":z="recast"}if(z||C)E=!0;if(z)if("recast"==z)battle.recast();else if(K=e(z))K.onclick();if(C&&(K=e(C)))K.onclick()}if(E)return b.cancelBubble=!0,b.returnValue=!1,b.stopPropagation&&(b.stopPropagation(),b.preventDefault()),
!1}};this.clear_infopane();this.start_flash_loop();this.set_infopane("Battle Time")}function at_show_aux(h,g){h=e(h);g=e(g);for(var d="x"==g.at_position?h.offsetWidth+0:0;h;h=h.offsetParent)d+=h.offsetLeft;g.style.position="absolute";g.style.top="27px";g.style.left=d+"px";g.style.visibility="visible"}function at_show(){p=e(this.at_parent);c=e(this.at_child);at_show_aux(p.id,c.id)}function at_hide(){c=e(this.at_child);e(c.id).style.visibility="hidden"}
function at_click(){p=e(this.at_parent);c=e(this.at_child);"visible"!=c.style.visibility?at_show_aux(p.id,c.id):c.style.visibility="hidden";return!1}
function at_attach(h,g,d,m,q){p=e(h);c=e(g);p.at_parent=p.id;c.at_parent=p.id;p.at_child=c.id;c.at_child=c.id;p.at_position=m;c.at_position=m;c.style.position="absolute";c.style.visibility="hidden";switch(d){case "click":p.onclick=at_click;p.onmouseout=at_hide;c.onmouseover=at_show;c.onmouseout=at_hide;break;case "hover":p.onmouseover=at_show,p.onmouseout=at_hide,c.onmouseover=at_show,c.onmouseout=at_hide}};

View file

@ -0,0 +1,188 @@
:root{scrollbar-width:thin;scrollbar-color:#5C0D1169 transparent}
body{font-size:8pt;font-family:verdana;color:#5C0D11;background:#E3E0D1;padding:2px;margin:0;text-align:center}
div{margin:0;padding:0;scrollbar-width:thin;scrollbar-color:#5C0D1169 transparent}
a:link,a:visited,a:active{color:#5C0D11}
a:hover{color:#9B4E03}
p{padding:3px 1px;margin:1px}
hr{border:0;border-top:1px solid #5C0D11}
.emsg {color:#FF5555;font-weight:bold}
.c{clear:both}
.v{font-family:verdana;font-size:11pt;font-weight:bold}
input,textarea{outline:none}
input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
input[type=number]{-moz-appearance:textfield}
input[type="submit"],input[type="button"],button{font-family:verdana;font-size:9pt;font-weight:bold;color:#5C0D11BB;background:#EDEADA;border:2px solid #5C0D11;border-radius:14px;margin:2px 3px;padding:4px 9px}
input[type="submit"]:enabled:hover,input[type="submit"]:enabled:focus,input[type="button"]:enabled:hover,input[type="button"]:enabled:focus,button:enabled:hover,button:enabled:focus{color:#9B4E03;border-color:#9B4E03;background:#EEEDE5;cursor:pointer}
input[type="submit"]:enabled:active,input[type="submit"]:enabled:active,button:enabled:active{background:radial-gradient(#DFDACC,#F3F0E0);border-color:#9B4E03;cursor:pointer}
input[type="submit"]:disabled,input[type="button"]:disabled,button:disabled{color:#C2A8A4;border-color:#C2A8A4;background:#EDEADA}
input[type="text"],input[type="password"],input[type="number"],textarea,select,option{font-size:10pt;border-radius:5px;color:#5C0D11;background:#EDEADA;border:1px solid #5C0D11;margin:4px 0 0 0;padding:3px}
input[type="text"]:enabled:hover:not([readonly]),input[type="password"]:enabled:hover:not([readonly]),input[type="number"]:enabled:hover:not([readonly]),textarea:enabled:hover:not([readonly]),select:enabled:hover:not([readonly]){background:#F2EFDF}
input[type="text"]:enabled:focus:not([readonly]),input[type="password"]:enabled:focus:not([readonly]),input[type="number"]:enabled:focus:not([readonly]),textarea:enabled:focus:not([readonly]),select:enabled:focus:not([readonly]){color:#9B4E03;background:#F2EFDF}
input[type="text"]:disabled,input[type="password"]:disabled,input[type="number"]:disabled,textarea:disabled,select:disabled{color:#C2A8A4;background:#EDEADA;border-color:#C2A8A4}
img{border:0;margin:0;padding:0}
img[onclick],div[onclick]{cursor:pointer}
table{border-collapse:collapse}
.nosel{user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;cursor:default}
.lc,.lr{display:block;position:relative;padding:0 0 0 30px;margin:0;vertical-align:middle;height:24px;line-height:24px}
.lc:not([data-disabled]),.lr:not([data-disabled]),.lc:not([data-disabled]) *,.lr:not([data-disabled]) *{cursor:pointer}
.lc>input,.lr>input{position:absolute !important;opacity:0;width:1px;height:1px}
.lc:hover input:enabled ~ span,.lr:hover input:enabled ~ span,.lc input:enabled:focus ~ span,.lr input:enabled:focus ~ span{background-color:#F3F0E0 !important;border-color:#977273 !important}
.lc input:disabled ~ span,.lr input:disabled ~ span{border-color:#DBD4D3 !important}
.lc input:disabled ~ span::after,.lr input:disabled ~ span::after{border-color:#B5AEAD !important}
.lc>input:checked ~ span:after,.lr>input:checked ~ span:after{display:block}
.lc>span{position:absolute;top:0;left:0;height:20px;width:20px;background-color:#EDEADA;border:2px solid #B5A4A4;border-radius:3px}
.lc>span:after{content:"";position:absolute;display:none;left:6px;top:2px;width:5px;height:10px;border:solid #5C0D12;border-width:0 3px 3px 0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}
.lr>span{position:absolute;top:0;left:0;height:20px;width:20px;background-color:#EDEADA;border:2px solid #B5A4A4;border-radius:50%}
.lr>span:after{content:"";position:absolute;display:none;top:5px;left:5px;width:10px;height:10px;border-radius:50%;background:#5C0D12}
/* common global */
#csp{background:#EDEBDF;border:1px solid #5C0D12;width:1236px;height:702px;position:relative}
#mainpane{width:1228px;height:670px;padding:2px 0 2px 8px;overflow:hidden}
/* message box */
#messagebox_outer{position:absolute;z-index:99;top:0;left:0;width:100%;height:100%;background-color:#EDEBDFCC;backdrop-filter:blur(1px);cursor:pointer}
#messagebox_inner{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);display:flex;justify-content:center;flex-flow:column nowrap;border-radius:5px;min-width:500px;max-width:1150px;min-height:200px;max-height:600px;background:#EDEBDF;border:2px solid #5C0D11;font-size:10pt;font-weight:bold;font-family:verdana;overflow:hidden;overflow-y:auto;padding:10px 20px 20px}
#messagebox_inner>p{white-space:nowrap}
.messagebox_error{color:#FF2323}
/* fonts and font colors */
.fal{text-align:left}
.fac{text-align:center}
.far{text-align:right}
.fcb{color:#5C0D11}
.fcy{color:#FCFF00}
.fcg{color:#8A8A8A}
.fcr{color:#CB000A}
.fca{color:#0030CB}
.fc{display:flex;flex-direction:row;align-items:center;justify-content:center}
.fl{display:flex;flex-direction:row;align-items:center;justify-content:left}
.fr{display:flex;flex-direction:row;align-items:center;justify-content:right}
.f2b,.f2g,.f2r,.f2y,.f2a{height:10px}
.f4b,.f4g,.f4r,.f4y,.f4a{height:12px}
.f2b>div,.f2g>div,.f2r>div,.f2y>div,.f2a>div{height:10px;background-color:transparent}
.f4b>div,.f4g>div,.f4r>div,.f4y>div,.f4a>div{height:12px;background-color:transparent}
.f2b>div{background-image:url(/y/font/10b.png)}
.f2g>div{background-image:url(/y/font/10g.png)}
.f2r>div{background-image:url(/y/font/10r.png)}
.f2y>div{background-image:url(/y/font/10y.png)}
.f2a>div{background-image:url(/y/font/10a.png)}
.f4b>div{background-image:url(/y/font/12b.png)}
.f4g>div{background-image:url(/y/font/12g.png)}
.f4r>div{background-image:url(/y/font/12r.png)}
.f4y>div{background-image:url(/y/font/12y.png)}
.f4a>div{background-image:url(/y/font/12a.png)}
.c20{width:9px;background-position:0 -0px}
.c21{width:5px;background-position:0 -10px}
.c22{width:10px;background-position:0 -20px}
.c23{width:10px;background-position:0 -30px}
.c24{width:10px;background-position:0 -40px}
.c25{width:10px;background-position:0 -50px}
.c26{width:10px;background-position:0 -60px}
.c27{width:10px;background-position:0 -70px}
.c28{width:9px;background-position:0 -80px}
.c29{width:9px;background-position:0 -90px}
.c2a{width:4px;background-position:0 -100px}
.c2b{width:4px;background-position:0 -110px}
.c2c{width:5px;background-position:0 -120px}
.c2d{width:10px;background-position:0 -130px}
.c2e{width:11px;background-position:0 -140px}
.c2f{width:8px;background-position:0 -150px}
.c2g{width:8px;background-position:0 -160px}
.c2h{width:8px;background-position:0 -170px}
.c2i{width:11px;background-position:0 -180px}
.c2j{width:11px;background-position:0 -190px}
.c2k{width:4px;background-position:0 -200px}
.c2l{width:4px;background-position:0 -210px}
.c2m{width:4px;background-position:0 -220px}
.c2n{width:4px;background-position:0 -230px}
.c2o{width:6px;background-position:0 -240px}
.c2p{width:6px;background-position:0 -250px}
.c2q{width:6px;background-position:0 -260px}
.c2r{width:6px;background-position:0 -270px}
.c2s{width:8px;background-position:0 -280px}
.c39{width:4px;background-position:0 -390px}
.c3a{width:11px;background-position:0 -400px}
.c3b{width:9px;background-position:0 -410px}
.c3c{width:9px;background-position:0 -420px}
.c3d{width:9px;background-position:0 -430px}
.c3e{width:8px;background-position:0 -440px}
.c3f{width:8px;background-position:0 -450px}
.c3g{width:9px;background-position:0 -460px}
.c3h{width:10px;background-position:0 -470px}
.c3i{width:4px;background-position:0 -480px}
.c3j{width:6px;background-position:0 -490px}
.c3k{width:10px;background-position:0 -500px}
.c3l{width:6px;background-position:0 -510px}
.c3m{width:13px;background-position:0 -520px}
.c3n{width:9px;background-position:0 -530px}
.c3o{width:9px;background-position:0 -540px}
.c3p{width:10px;background-position:0 -550px}
.c3q{width:10px;background-position:0 -560px}
.c3r{width:11px;background-position:0 -570px}
.c3s{width:10px;background-position:0 -580px}
.c3t{width:8px;background-position:0 -590px}
.c3u{width:10px;background-position:0 -600px}
.c3v{width:11px;background-position:0 -610px}
.c3w{width:14px;background-position:0 -620px}
.c3x{width:11px;background-position:0 -630px}
.c3y{width:10px;background-position:0 -640px}
.c3z{width:10px;background-position:0 -650px}
.c40{width:10px;background-position:0 -0px}
.c41{width:6px;background-position:0 -12px}
.c42{width:11px;background-position:0 -24px}
.c43{width:11px;background-position:0 -36px}
.c44{width:11px;background-position:0 -48px}
.c45{width:11px;background-position:0 -60px}
.c46{width:11px;background-position:0 -72px}
.c47{width:11px;background-position:0 -84px}
.c48{width:10px;background-position:0 -96px}
.c49{width:10px;background-position:0 -108px}
.c4a{width:5px;background-position:0 -120px}
.c4b{width:5px;background-position:0 -132px}
.c4c{width:6px;background-position:0 -144px}
.c4d{width:11px;background-position:0 -156px}
.c4e{width:12px;background-position:0 -168px}
.c4f{width:9px;background-position:0 -180px}
.c4g{width:9px;background-position:0 -192px}
.c4h{width:9px;background-position:0 -204px}
.c4i{width:12px;background-position:0 -216px}
.c4j{width:12px;background-position:0 -228px}
.c4k{width:5px;background-position:0 -240px}
.c4l{width:5px;background-position:0 -252px}
.c4m{width:5px;background-position:0 -264px}
.c4n{width:5px;background-position:0 -276px}
.c4o{width:7px;background-position:0 -288px}
.c4p{width:7px;background-position:0 -300px}
.c4q{width:7px;background-position:0 -312px}
.c4r{width:7px;background-position:0 -324px}
.c4s{width:9px;background-position:0 -336px}
.c59{width:5px;background-position:0 -468px}
.c5a{width:12px;background-position:0 -480px}
.c5b{width:10px;background-position:0 -492px}
.c5c{width:10px;background-position:0 -504px}
.c5d{width:10px;background-position:0 -516px}
.c5e{width:9px;background-position:0 -528px}
.c5f{width:9px;background-position:0 -540px}
.c5g{width:10px;background-position:0 -552px}
.c5h{width:11px;background-position:0 -564px}
.c5i{width:5px;background-position:0 -576px}
.c5j{width:7px;background-position:0 -588px}
.c5k{width:11px;background-position:0 -600px}
.c5l{width:7px;background-position:0 -612px}
.c5m{width:15px;background-position:0 -624px}
.c5n{width:10px;background-position:0 -636px}
.c5o{width:10px;background-position:0 -648px}
.c5p{width:11px;background-position:0 -660px}
.c5q{width:11px;background-position:0 -672px}
.c5r{width:12px;background-position:0 -684px}
.c5s{width:12px;background-position:0 -696px}
.c5t{width:9px;background-position:0 -708px}
.c5u{width:11px;background-position:0 -720px}
.c5v{width:12px;background-position:0 -732px}
.c5w{width:16px;background-position:0 -744px}
.c5x{width:12px;background-position:0 -756px}
.c5y{width:11px;background-position:0 -768px}
.c5z{width:11px;background-position:0 -780px}

View file

@ -0,0 +1,665 @@
tr[onclick]{cursor:pointer}
td[onclick]{cursor:pointer}
input[type="checkbox"]{position:relative;top:1px}
/* navbar */
#navbar{height:23px;border-bottom:1px solid #5C0D11;padding:3px 0 0 25px}
#navbar>div{float:left;width:150px;height:21px;text-align:left;margin-left:10px}
#navbar>div>div:first-child{height:21px}
.nc{text-align:left;position:absolute;visibility:hidden;background:#EDEBDF;z-index:99;opacity:0.95;width:180px;margin:-3px 0 0}
.nc>div{border:1px solid #5C0D11;border-top:0;margin:2px 0 0}
.nc>div>div{height:12px;padding:8px 3px 5px;background:#EDEBDF}
.nc>div>div:hover{background:#F2EFDF}
#stamina_readout{cursor:default}
#stamina_readout>div:nth-child(1){width:20px;float:left;position:relative;top:-3px;left:-3px;font-size:12pt;padding-left:15px}
#stamina_readout>div:nth-child(2){width:110px;padding-top:5px;float:left}
#stamina_readout>div:nth-child(3){width:25px;padding-left:5px;float:left}
#stamina_restore{width:180px}
#stamina_restore>div>div:first-child{padding:10px 0 10px 5px !important}
#stamina_restore img{width:135px;height:15px;padding-left:6px}
#level_readout{padding:5px 2px 0 0}
#level_details,#world_text{background:transparent !important;font-size:10pt;font-weight:bold;font-family:verdana;text-align:center}
#level_details>div{width:340px;margin-left:-90px;background:#EDEBDF;opacity:0.99;padding:5px 0 !important;height:48px}
#level_details>div>div:hover{background:inherit !important}
#world_readout{padding:5px 2px 0 0}
#world_text>div{width:250px;margin-left:-30px;background:#EDEBDF;opacity:0.99;padding:5px 0 !important}
#mail_img{padding:0 4px}
#nav_mail{padding-top:4px;float:right !important;width:44px !important}
#nav_mail>div:nth-child(1){float:left;width:20px}
#nav_mail>div:nth-child(2){float:left;width:24px}
/* filter bar */
#filterbar{padding:5px 15px;font-size:14px;font-family:verdana;font-weight:bold;display:flex;flex-direction:row;align-items:center;user-select:none}
#filterbar>a{flex-grow:1;text-decoration:none}
#filterbar>a>div{border-radius:9px 9px 0px 0px}
.cfb{padding:5px 1px;border-top:1px solid #EDEBDF;border-bottom:1px solid #5C0D11}
.cfb:hover{color:#9B4E03;}
.cfbs{padding:5px 0;border-top:1px solid #EDEBD !importantF;border:1px solid #5C0D11;border-bottom:1px solid #EDEBDF}
/* forge */
#forge_outer{width:1066px;height:600px;padding-top:4px;position:relative;margin:auto}
/* common non-battle screens */
#networth{position:absolute;top:675px;left:0px;height:19px;padding:3px;border:1px solid #5C0D12;border-bottom:0;border-left:0;font-size:10pt;font-weight:bold;font-family:verdana}
/* scrollpane */
.csps{height:19px;width:99%}
.csps>img{margin:2px}
.csps>img:first-child{float:left}
.csps>img:last-child{float:right}
.cspp{clear:both;overflow:hidden}
/* equip/char shared */
#eqch_outer{height:650px;text-align:center;padding-top:4px;position:relative}
#eqch_left{width:840px;height:648px;text-align:center;float:left;position:relative}
#eqch_stats{width:375px;height:748px;float:left;position:relative}
#stats_scrollable{height:641px;padding:0 10px 5px;overflow-y:scroll;scrollbar-gutter:stable;border:2px ridge #5C0D12;border-right:0;margin-top:3px;border-radius:9px 0 0 9px}
#stats_scrollable td:nth-child(1){text-align:right;padding-left:15px;padding-right:3px;min-width:40px}
#stats_scrollable td:nth-child(2){text-align:left}
#stats_scrollable table{margin-bottom:8px}
.spc{padding:10px 0 3px 10px;width:320px}
/* character */
#persona_outer{width:530px;text-align:center;padding-top:40px;margin:auto}
#persona_outer img{padding-top:2px}
#persona_outer select{font-family:verdana;font-size:11pt;font-weight:bold;width:280px;margin:auto}
#persona_outer select>option{font-family:verdana;font-size:10pt;font-weight:bold;width:280px}
#persona_select{margin:auto;height:28px}
#persona_select>div:nth-child(1){float:left;width:150px;padding-top:8px;height:20px}
#persona_select>div:nth-child(2){float:left;width:300px}
#persona_select>div:nth-child(3){float:left;width:75px;padding-top:4px}
#persona_new{margin:10px auto 0}
#persona_used{margin:10px auto 0;width:300px;height:10px}
#attr_outer{width:624px;text-align:center;padding-top:40px;margin:auto}
#attr_outer>div:first-child{height:12px}
#attr_table{border-top:1px solid #5C0D11;margin:auto}
#attr_table img{padding-top:2px}
#attr_table>tbody>tr>td{height:16px}
#attr_table>tbody>tr>td:nth-child(1){width:100px}
#attr_table>tbody>tr>td:nth-child(2){width:50px}
#attr_table>tbody>tr>td:nth-child(3){width:35px;padding-left:6px}
#attr_table>tbody>tr>td:nth-child(4){width:45px}
#attr_table>tbody>tr>td:nth-child(5){width:40px;text-align:right}
#attr_table>tbody>tr>td:nth-child(6){width:40px;padding:2px 5px 0 0}
#attr_table>tbody>tr>td:nth-child(7){width:40px;text-align:left}
#attr_table>tbody>tr>td:nth-child(8){width:160px}
#attr_table>tbody>tr:last-child>td:nth-child(2){width:auto;text-align:center}
#attr_table>tbody>tr:last-child>td:nth-child(3){width:auto;padding:0}
#pabonus{width:624px;margin:10px auto 0}
#prof_outer{width:524px;text-align:center;padding-top:40px;margin:auto}
#prof_outer>div{width:260px;float:left;height:150px}
#prof_outer>div>div{height:12px}
#prof_outer table{border-top:1px solid #5C0D11;margin:auto;height:135px}
#prof_outer table>tbody>tr>td:nth-child(1){width:150px;height:18px}
#prof_outer table>tbody>tr>td:nth-child(2){width:80px;height:18px}
/* itemlist */
.itemlist{font-family:verdana;font-size:9pt;font-weight:bold;text-align:right}
.itemlist>tbody>tr:first-child>td{padding-top:5px}
.itemlist>tbody>tr>td:first-child{width:300px !important;padding-left:5px}
.itemlist>tbody>tr>td:last-child{width:50px}
.itemlist>tbody>tr>td>div{padding:1px 5px 5px 18px;float:right}
.itemlist>tbody>tr>td>div[onclick]:not([style]):hover{opacity:0.6;color:#0030CB !important}
.it{padding-top:7px}
/* item inventory */
#item_outer{width:1066px;margin:auto;height:650px;padding-top:4px;position:relative}
#item_left{width:354px;height:648px;float:left;position:relative}
#item_right{width:650px;height:648px;float:left;position:relative;margin-left:50px}
#item_left>div:first-child,#item_right>div:first-child{height:20px;padding:5px 3px}
#item_list{height:620px;padding:0 3px}
#item_slots{height:620px;padding:0 2px;font-family:verdana;font-size:9pt;font-weight:bold}
#item_slots>div{float:left;width:320px}
.sa{width:300px;height:40px;margin:2px auto;clear:both;text-align:left;position:relative}
.sa>div:first-child{float:left;height:20px;width:24px;padding:13px 22px 8px 2px;text-align:right}
.sa>div:last-child{float:left;min-width:120px;height:40px}
.sa>div:last-child>div{min-width:120px;height:20px;padding:10px 0}
.sa>div:last-child>div:hover{text-decoration:line-through;color:#C2A8A4}
.sd>div:last-child>div{color:#C2A8A4}
.ss,.ss:hover{opacity:0.6;color:#0030CB !important;text-decoration:none !important}
/* item shop */
#itshop_outer{width:800px;height:620px;padding-top:4px;margin:auto}
.itshop_pane{width:400px;height:540px;float:left;position:relative;z-index:3}
.itshop_pane>div:first-child{width:350px;height:20px;position:absolute;top:5px;left:13px}
.itshop_pane>div:last-child{width:400px;height:520px;position:absolute;top:0px;left:0px}
#itshop_touter{clear:both;width:320px;height:60px;margin:auto;padding-top:8px}
#itshop_t1{padding-top:2px;height:20px;display:flex;flex-flow:row nowrap;justify-content:center}
#itshop_t1>div{margin:auto}
#itshop_t1>input{margin:auto;font-family:verdana;font-size:10pt;font-weight:bold;text-align:right;padding:1px 2px 2px;background:#F2EFDF !important;border:1px solid #9B4E03 !important;color:#5C0D11 !important}
#itshop_t1>input:nth-child(1),#itshop_t1>input:nth-child(3){width:75px}
#itshop_t1>input:nth-child(6){width:100px}
#itshop_t1>div:nth-child(2),#itshop_t1>div:nth-child(5){padding:4px 10px 0;width:25px}
#itshop_t1>div:nth-child(4),#itshop_t1>div:nth-child(7){padding:5px 2px 0 5px;width:10px}
#itshop_t2{padding:9px 10px 0 0;height:15px;display:flex;flex-flow:row nowrap;justify-content:center}
#itshop_t2>div{margin:auto;font-weight:bold;padding:2px}
#itshop_t2>div:nth-child(1){width:20px}
#itshop_t2>div:nth-child(2){width:30px}
#itshop_t2>div:nth-child(3){width:35px}
#itshop_t2>div:nth-child(4){width:45px}
#itshop_t2>div:nth-child(5){width:50px}
#itshop_t3{padding-top:11px}
/* equiplist */
.equiplist{font-family:verdana;font-size:9pt;font-weight:bold;text-align:left}
.eqp{clear:both;position:relative;height:22px;width:540px}
.eqp>div:last-child{padding:1px 5px 5px 0;float:left;position:absolute;top:0px;left:20px}
.eqp>div:last-child:not([onclick]){color:#C2A8A4}
.eqp>div:last-child[onclick]:not([data-locked="1"]):not([style]):hover{opacity:0.6;color:#0030CB !important}
.eqp>div:last-child[data-locked="1"]{cursor:default !important}
.tp{margin-top:7px}
.tp>div:first-child>img{top:8px}
/* equipment stat readout */
.showequip{margin:10px auto 0;width:420px;min-height:300px}
.showequip>div{margin:3px auto 0;text-align:center}
.showequip>div:first-child{border-bottom:1px solid #A47C78;font-size:10pt;font-weight:bold;padding:2px 0 4px}
.showequip>div:first-child>div:nth-child(2){font-size:9pt;font-weight:normal;padding:3px 0 2px}
.showequip a{text-decoration:none}
#equip_extended{margin:10px auto 0;border:1px solid #5C0D11;background:#EDEBDF;width:320px;height:400px;padding:3px}
#equip_extended>div:last-child{margin:7px auto 2px;text-align:center}
#equip_extended>div:last-child>div{font-weight:bold}
.eq>div{margin:1px auto;padding:1px;text-align:center;min-height:17px}
.eq span,.ep span{font-weight:bold}
.eq div[title],.ep div[title]{cursor:help}
.eqt,.eqr{font-size:110%;font-weight:bold}
.eqc{font-weight:bold}
.eqs{color:red}
.ex{display:grid;grid-template-columns:repeat(2,1fr);gap:2px 5px;text-align:center;justify-items:center;border-top:1px solid #A47C78;padding-top:2px;text-align:right !important}
.ex>div{width:165px;height:18px}
.ex>div>div:nth-child(1){float:left;width:99px;padding:2px;white-space:nowrap}
.ex>div>div:nth-child(2){float:left;width:45px;padding:2px 0 2px 2px}
.ex>div>div:nth-child(3){float:left;width:6px;padding:2px}
.ep>div:first-child{font-weight:bold;margin:4px auto 0 !important;width:320px !important;grid-column:1/-1}
.ep>div{width:115px;height:18px}
.ep>div>div:nth-child(1){float:left;width:60px;padding:2px;white-space:nowrap;text-align:right}
.ep>div>div:nth-child(2){float:left;width:45px;padding:2px 0 2px 2px;text-align:left}
.ep{display:grid;gap:2px 5px;justify-items:center}
.ep1{grid-template-columns:repeat(1,1fr)}
.ep2{grid-template-columns:repeat(2,1fr)}
.ep3{grid-template-columns:repeat(3,1fr)}
#eu>span{white-space:nowrap;color:red}
#ep>span{white-space:nowrap;color:blue}
#ee>span{white-space:nowrap;color:purple}
.fbr{flex-basis:100%;height:0 !important}
/* equip popup */
#popup_box{visibility:hidden;border:1px solid #5C0D11;background:#EDEBDF;opacity:0.95;text-align:left;padding:3px;z-index:5;position:absolute}
#popup_box>div:nth-child(1){text-align:center;font-weight:bold;padding-bottom:3px;margin-bottom:5px;font-size:120%;border-bottom:1px solid #A47C78}
#popup_box>div:nth-child(2){text-align:left;margin-bottom:5px}
#popup_box>div:nth-child(3){font-weight:bold}
/* ability */
#ability_outer{width:1066px;text-align:center;padding:4px 0 0 5px;position:relative;margin:auto}
#ability_top{width:99%;margin:10px auto 0;height:130px;position:relative}
#ability_top>div{position:absolute}
#ability_top>div:nth-child(1){height:32px;top:0px;left:6px}
#ability_top>div:nth-child(2){height:32px;top:42px;left:6px}
#ability_top>div:nth-child(3){height:32px;width:145px;top:84px;left:474px}
#ability_top>div:nth-child(4){height:30px;width:200px;left:10px;top:102px}
#ability_top>div:nth-child(5){height:30px;width:200px;left:190px;top:102px}
#ability_top>div:nth-child(6){height:30px;width:100px;left:370px;top:99px}
#ability_bot{width:100%;margin:auto;height:500px;clear:both}
#ability_treelist{float:left;width:145px;height:488px;padding-top:5px;border-right:1px solid #5C0D12}
#ability_treelist>div{height:31px}
#ability_treepane{float:left;width:906px;height:500px;padding:10px 0 0 10px}
#ability_treepane>div{position:relative;clear:both;padding:5px 0 0}
#ability_treepane>div>div{float:left}
#ability_treepane>div>div:nth-child(1){width:184px;padding-top:17px}
#ability_treepane>div>div:nth-child(2){width:48px;margin-left:5px}
#ability_treepane>div>div:nth-child(3){width:500px;margin-left:-3px;padding-top:6px}
#ability_treepane>div>div:nth-child(3)>div{float:left;height:30px}
#ability_treepane>div>div:nth-child(4){width:100px;padding-top:16px}
#ability_treepane>div>div:nth-child(5){width:60px;margin-left:8px;padding-top:13px}
#ability_info{position:absolute;visibility:hidden;left:400px;top:155px;width:680px;height:280px;background:#F2EFDF;border:1px solid #5C0D12;z-index:1;overflow:hidden}
#ability_info>div:nth-child(1){text-align:center;font-weight:bold;font-size:110%;margin:3px auto 0}
#ability_info>div:nth-child(2){margin:4px auto 6px}
#ability_info>div:nth-child(3){display:flex;flex-flow:row nowrap;justify-content:center}
#ability_info>div:nth-child(3)>div:first-child{border-right:1px solid #5C0D11}
#ability_info>div:nth-child(3)>div{flex:1;min-width:335px;height:250px;overflow:hidden}
#ability_info>div:nth-child(3)>div>div:first-child{margin:2px auto 2px;font-weight:bold;border-bottom:1px solid #5C0D11}
#ability_info>div:nth-child(3)>div>div:last-child{margin-top:6px}
#ability_info>div:nth-child(3)>div>div:last-child>div{margin-top:6px}
.ability_slotbar>div{float:left;width:44px;height:46px;position:relative;z-index:3;margin-left:8px}
.ability_slotbox>div{width:44px;height:46px;position:relative;z-index:3}
.ability_slotbar>div>div,div.ability_slotbox>div>div{opacity:1.0;width:34px;height:36px;position:absolute;top:3px;left:5px;z-index:4}
.aw1>div{width:500px}
.aw2>div{width:250px}
.aw3>div{width:166px}
.aw5>div{width:100px}
.aw7>div{width:71px}
.aw10>div{width:50px}
/* lottery */
#lottery_eqname{margin:5px auto 0;width:440px;font-family:verdana;font-size:10pt;font-weight:bold}
#lottery_eqstat{margin:10px auto 0;border:1px solid #5C0D11;background:#EDEBDF;width:420px;height:320px;opacity:0.9;text-align:left;padding:3px}
/* monster lab */
#monster_outer{width:1066px;height:650px;padding-top:4px;position:relative;margin:auto;font-family:verdana;font-size:10pt;font-weight:bold}
#monster_nav{width:1000px;height:32px;margin:auto}
#monster_nav>div:first-child,#monster_nav>div:last-child{width:100px;padding-top:9px;float:left}
#monster_nav>div:nth-child(2){width:795px;padding-top:8px;float:left}
#monster_head{width:1066px;padding-top:4px;}
.msl{border:2px ridge #5C0D12;width:996px;height:26px;margin:2px auto}
.msl:hover{background:#F2EFDF}
.msl>div:nth-child(1){float:left;width:25px;padding:8px 10px 0 0}
.msl>div:nth-child(2){float:left;width:300px;padding:8px 0 0 0}
.msl>div:nth-child(3){float:right;width:90px;padding:8px 0 0 6px}
.msl>div:nth-child(4){float:right;width:100px;padding:8px 0 0 0}
.msl>div:nth-child(5)>div{background-image:url(/y/monster/hungerbar.png)}
.msl>div:nth-child(6)>div{background-image:url(/y/monster/moralebar.png)}
.msn{float:right;width:200px;height:20px;position:relative}
.msn>div{position:absolute;top:2px;left:0px;z-index:2;height:22px;width:200px}
.msn>div>img{border:0;position:absolute;top:7px;left:64px;height:8px}
#monster_list{width:1076px;height:565px;margin:auto}
#monster_actions{width:1000px;margin:auto;font-size:10pt;font-family:verdana;font-weight:bold;display:flex;flex-flow:row nowrap;justify-content:center}
#monster_actions>div{width:300px;height:70px;margin:auto}
#monster_actions>div>div{margin:2px auto}
#monster_actions>div:nth-child(2)>div:last-child{padding-top:12px}
#monsterstats_outer{width:1066px;height:660px;padding-top:4px}
#monsterstats_rename{width:900px;padding-top:10px;height:10px;margin:auto}
#monsterstats_left{width:800px;float:left;padding-top:20px}
#monsterstats_top>div{width:200px;height:180px;float:left;margin:0 23px}
#monsterstats_top>div:first-child{display:flex;flex-flow:column nowrap;justify-content:center;align-items:center}
#monsterstats_top>div:first-child>div{padding-bottom:20px}
#monsterstats_rendel{height:16px;padding:0 !important}
#monsterstats_rendel>img:first-child{padding:0 5px 0 0}
#monsterstats_rendel>img:last-child{padding:0 0 0 5px}
.mcr>div{width:200px;height:12px;margin:0 auto 5px;border-bottom:1px solid #5C0D11}
.mcr>table{width:200px;height:160px;margin:auto}
.mcr>table>tbody>tr>td:nth-child(1){width:50px;height:18px;text-align:left}
.mcr>table>tbody>tr>td:nth-child(2){width:50px;height:18px;text-align:left}
.mcr>table>tbody>tr>td:nth-child(3){width:70px;height:18px}
#monsterstats_right{width:200px;float:right;margin-right:65px;padding-top:20px}
#monsterstats_right>div:first-child{width:200px;height:12px;margin:auto;border-bottom:1px solid #5C0D11;padding-bottom:1px}
.mst{width:195px;height:17px;padding-top:8px}
.mst>div:first-child{width:140px;float:left}
.mst>div:last-child{width:55px;float:left}
#upgrade_text{width:800px;padding-top:28px;margin:auto;height:14px;clear:both}
#monsterstats_chaos{width:800px;height:340px;margin:26px auto 0 20px}
#chaosupg{text-align:left;margin:auto}
#chaosupg>tbody>tr>td:nth-child(1){width:120px;padding:2px 10px 0 0}
#chaosupg>tbody>tr>td:nth-child(2){width:160px;padding:2px 0 0}
#chaosupg>tbody>tr>td:nth-child(3){width:20px;padding:3px 6px 0 0}
#chaosupg>tbody>tr>td:nth-child(4){width:400px;padding:0 0 1px}
.mcu0,.mcu1,.mcu2{float:left;width:8px;height:15px;background-repeat:no-repeat}
.mcu0{background-image:url(/y/monster/upg0.png)}
.mcu1{background-image:url(/y/monster/upg1.png)}
.mcu2{background-image:url(/y/monster/upg2.png)}
#monsterskills{text-align:left;margin:20px auto 10px}
#monsterskills th{border-bottom:1px solid #5C0D11}
#monsterskills>tbody>tr>td:nth-child(1){width:200px;height:20px}
#monsterskills>tbody>tr>td:nth-child(1)>input{border-color:#C2A8A4;font-size:11pt;font-weight:bold;width:190px;height:17px;margin-right:5px}
#monsterskills>tbody>tr>td:nth-child(3){width:125px;height:30px}
#monsterskills>tbody>tr>td:nth-child(2),#monsterskills>tbody>tr>td:nth-child(4){width:125px;height:30px;padding-top:5px}
#monsterskills>tbody>tr>td:nth-child(5),#monsterskills>tbody>tr>td:nth-child(6){width:75px;height:30px;padding-top:5px}
.msp{position:relative}
.msp>div:first-child{position:absolute;height:25px;top:-12px;border:1px solid #9B4E03;background:#F2EFDF;z-index:2}
.msp>div:first-child>div{width:125px;height:25px;float:left;padding-top:6px}
.msp>div:last-child{width:125px;height:25px;position:absolute;top:-5px}
#monstercreate_outer{width:808px;height:650px;padding-top:4px;position:relative;margin:auto;font-family:verdana;font-size:10pt;font-weight:bold}
#monstercreate_left{width:254px;height:640px;float:left}
#monstercreate_left>div{width:200px;height:20px;text-align:right;padding-top:28px}
#monstercreate_right{width:554px;height:640px;float:left}
#monstercreate_info{width:554px;text-align:left;padding-top:25px;height:370px}
#monstercreate_info>ul{margin:4px 0}
#monstercreate_stats{width:480px;padding-top:20px;padding-left:30px; height:140px}
#monstercreate_stats>div{width:158px;float:left;height:138px}
#monstercreate_stats>div>div:first-child{width:158px;margin:auto;height:12px;border-bottom:1px solid #9B4E03}
#monstercreate_stats>div:nth-child(1)>table{width:150px}
#monstercreate_stats>div:nth-child(2)>table{width:100px}
#monstercreate_stats>div:nth-child(3)>table{width:135px}
.mcs{margin:auto;padding-top:5px}
.mcs>tbody>tr>td{height:16px}
.mcs>tbody>tr>td:last-child{width:40px}
#monstercreate_patk{width:480px;padding:20px 0 0 30px;height:50px}
#monstercreate_patk>div:first-child{height:12px}
#monstercreate_patk>div:last-child{margin:auto;padding-top:10px}
#monstercreate_patk>div:last-child>div{float:left;width:90px}
/* training */
#train_outer{margin:25px auto 0}
#train_progress{text-align:center;width:465px;margin:auto}
#train_progress>div:nth-child(1)>div{float:left;height:20px}
#train_progress>div:nth-child(1)>div:nth-child(1){width:25px;text-align:right;padding:3px}
#train_progress>div:nth-child(1)>div:nth-child(2){width:400px;background-color:#E3E0D1;border:1px solid #5C0D12;text-align:left}
#train_progress>div:nth-child(1)>div:nth-child(3){width:25px;text-align:left;padding:3px}
#train_progress>div:nth-child(3){font-weight:bold;padding-top:6px}
#train_progbar{height:20px}
#train_progcnt{font-weight:bold}
#train_table{text-align:left;margin:15px auto 0;height:500px}
#train_table td{border-top:1px solid #5C0D11;border-bottom:1px solid #5C0D11}
#train_table>tbody>tr>td:nth-child(1){width:160px}
#train_table>tbody>tr>td:nth-child(2){width:300px;padding:0 5px 0 20px}
#train_table>tbody>tr>td:nth-child(3){width:120px}
#train_table>tbody>tr>td:nth-child(4){width:60px}
#train_table>tbody>tr>td:nth-child(5){width:35px}
#train_table>tbody>tr>td:nth-child(6){width:10px}
#train_table>tbody>tr>td:nth-child(7){width:35px}
#train_table>tbody>tr>td:nth-child(8){width:80px;text-align:center}
/* settings */
#settings_outer{height:668px;overflow:auto;font-size:9pt}
#settings_outer>div{width:650px;text-align:justify;margin:auto}
.settings_block{padding-top:20px;clear:both}
.settings_block>div:first-child{width:400px;height:12px}
.settings_block p{padding:2px 5px}
#settings_apply{padding-top:10px;text-align:center}
#settings_challenge,#settings_title{margin:10px auto 5px}
#settings_challenge td,#settings_title td{border-top:1px solid #5C0D11;border-bottom:1px solid #5C0D11;height:27px}
#settings_challenge>tbody>tr>td:nth-child(1){width:150px}
#settings_challenge>tbody>tr>td:nth-child(2){width:100px}
#settings_challenge>tbody>tr>td:nth-child(3){width:250px}
#settings_challenge>tbody>tr>td:nth-child(4){width:25px}
#settings_title>tbody>tr>td:nth-child(1){width:200px}
#settings_title>tbody>tr>td:nth-child(2){width:300px}
#settings_title>tbody>tr>td:nth-child(3){width:25px}
#settings_cfont{padding-left:30px}
#settings_quickbar{position:relative}
#settings_quickbar>table{width:260px;float:left;margin-left:40px}
#settings_autocast{margin-left:20px}
#settings_autosalvage{margin-left:20px}
#settings_autosalvage td,#settings_autocast td,#settings_quickbar td{padding:4px}
#settings_autosalvage td:first-child,#settings_autocast td:first-child,#settings_quickbar td:first-child{text-align:right;padding:4px 5px 0 0}
/* shrine */
#shrine_outer{width:910px;height:660px;padding-top:4px;margin:auto}
#shrine_left{width:404px;height:640px;float:left}
#shrine_left>div:first-child{height:20px;padding-top:10px}
#shrine_left>div:last-child{height:620px}
#shrine_right{width:504px;height:640px;float:left;font-family:verdana;font-size:10pt;font-weight:bold}
#shrine_right>div:first-child{padding:50px 0 10px 30px;text-align:left}
#shrine_right>div:last-child{padding:10px 0 0}
#accept_equip{padding:10px}
#accept_equip>div{padding:7px}
/* mooglemail */
#mmail_outer{width:1220px;height:650px;padding-top:10px;margin:auto}
#mmail_outer>div:first-child{height:20px;margin:2px auto 10px}
#mmail_left{width:604px;height:625px;float:left}
#mmail_left>table{margin:15px auto 5px}
#mmail_left>table>tbody>tr>td:first-child{text-align:right;width:100px;padding-top:3px}
#mmail_left>table input{border-color:#C2A8A4;height:17px;width:496px;font-family:verdana;font-size:10pt;font-weight:bold}
#mmail_left>textarea{border-color:#C2A8A4;width:585px;height:500px;font-family:verdana;font-size:10pt;font-weight:bold}
#mmail_showbuttons{height:20px;padding-top:8px}
#mmail_right{width:563px;height:625px;float:left;padding:5px 0 0 30px}
#mmail_attachpanes{height:585px;font-family:verdana;font-size:10pt;font-weight:bold}
#mmail_attachpanes input{font-family:verdana;font-size:10pt;font-weight:bold;width:100px;text-align:right}
#mmail_attachitem,#mmail_attachequip{height:570px;position:relative}
#mmail_attachequip>div:nth-child(1),#mmail_attachitem>div:nth-child(1){height:20px;width:450px;position:absolute;top:5px;left:50px}
#mmail_attachequip>div:nth-child(2){height:550px;width:550px;position:absolute;top:0px;left:0px}
#mmail_attachitem>div:nth-child(2){height:520px;width:550px;position:absolute;top:0px;left:0px}
#mmail_attachitem>div:nth-child(3){height:25px;width:550px;position:absolute;top:535px;left:0px}
#mmail_attachitem>div:nth-child(3)>img{position:relative;top:2px}
#mmail_attachinfo{text-align:justify}
#mmail_attachcount{width:540px;padding-top:10px;height:20px !important}
#mmail_attachremove{width:540px;text-align:center;padding-top:3px}
#mmail_attachlist{padding-top:5px;width:540px}
#mmail_attachlist>div{height:42px;display:flex;flex-flow:row nowrap;justify-content:center;align-items:center}
#mmail_currentcod{width:540px;height:20px;padding-top:20px}
#mmail_setcod{width:540px;height:20px;text-align:center;padding-left:40px}
#mmail_setcod>img{position:relative;top:2px}
#mmail_attachlist>div>div{cursor:default}
#mmail_attachlist>div>div:first-child{margin:auto;width:360px;padding:0 0 0 80px;text-align:center}
#mmail_attachlist>div>div:last-child{margin:auto;height:15px;width:80px;padding:1px 10px 0}
#mmail_attachcredits,#mmail_attachhath{padding-top:25px}
#mmail_attachcredits>div,#mmail_attachhath>div{height:30px}
#mmail_attachcredits img,#mmail_attachhath img{position:relative;top:2px}
#mmail_attachbuttons{height:20px;margin:15px auto 5px}
#mmail_attachhelp{padding:10px 30px}
#mmail_attachhelp>p{padding:5px 2px}
#mmail_fin{width:604px;height:625px;float:left;padding-top:215px}
#mmail_fin>div{height:30px}
#mmail_outerlist{height:580px}
#mmail_list{text-align:left;margin:25px auto 0;width:1000px}
#mmail_list>tbody>tr>th{border-bottom:1px solid #5C0D11;height:20px}
#mmail_list>tbody>tr>td{border-top:1px solid #5C0D11;border-bottom:1px solid #5C0D11;height:24px;font-size:10pt;font-weight:bold}
#mmail_list>tbody>tr>td:nth-child(1){width:150px}
#mmail_list>tbody>tr>td:nth-child(3){width:130px}
#mmail_list>tbody>tr>td:nth-child(4){width:120px}
#mmail_list>tbody>tr[onclick]:hover{background:#F2EFDF}
#mmail_nnm{padding-top:20px;border:0 !important}
#mmail_pager{height:20px;width:1000px;margin:auto;font:bold 12px verdana}
#mmail_pager>div:first-child{float:left;width:80px}
#mmail_pager>div:last-child{float:right;width:80px}
#mmail_pager>div>a{text-decoration:none}
#mmail_pager>div>span{color:#C2A8A4}
/* battleinit */
#arena_list{margin:20px auto 0px}
#arena_list>tbody>tr>td{height:33px;border-top:1px solid #5C0D11;border-bottom:1px solid #5C0D11;position:relative}
#arena_list>tbody>tr>td>div{height:20px}
#arena_list>tbody>tr>td>div:first-child,#grindfest>div>div:first-child{z-index:1}
#arena_list>tbody>tr>td>div:last-child,#grindfest>div>div:last-child{z-index:2}
#arena_list>tbody>tr>th{padding-bottom:6px}
#arena_list>tbody>tr>th:nth-child(1){width:375px}
#arena_list>tbody>tr>th:nth-child(2){width:120px}
#arena_list>tbody>tr>th:nth-child(3){width:95px}
#arena_list>tbody>tr>th:nth-child(4){width:85px}
#arena_list>tbody>tr>th:nth-child(5){width:90px}
#arena_list>tbody>tr>th:nth-child(6){width:115px}
#arena_list>tbody>tr>th:nth-child(7){width:117px}
#arena_list>tbody>tr>th:nth-child(8){width:90px}
#arena_tokens{margin:20px auto 0;width:500px;height:12px}
#grindfest{margin:200px auto 0;width:730px}
#grindfest>div{position:relative;width:233px;margin:5px auto}
#grindfest>div>img{position:absolute;top:2px;left:0px;width:233px;height:20px}
#itemworld_outer{width:1066px;height:660px;padding-top:10px;margin:auto}
#itemworld_left{width:604px;height:540px;float:left}
#itemworld_left>div{width:598px;height:580px}
#itemworld_right{width:460px;height:540px;float:left;text-align:justify}
#itemworld_right>div:first-child{padding:50px 20px 30px 10px}
#itemworld_right>div:last-child{text-align:center;padding-top:10px}
#towerstart{width:520px;margin:160px auto 0}
#towerstart>p{padding:5px 0}
#towerstart>div{padding:5px 0}
/* market */
#market_outer{display:flex;flex-direction:row;align-items:stretch;justify-content:start;flex-wrap:nowrap;height:100%}
#market_left,#market_itemlist,#market_itempage,#market_itemfilter{user-select:none}
#market_left{display:flex;flex-direction:column;align-items:stretch;justify-content:start;flex-wrap:nowrap}
#market_left>div,#market_left>a>div{border-right:1px solid #5C0D11}
#market_left>div:last-of-type{flex-grow:1}
#market_left a,#market_right a{text-decoration:none}
#market_right{display:flex;flex-direction:column;align-items:stretch;justify-content:start;flex-wrap:nowrap;flex-grow:1}
#market_xfer{text-align:center;font-size:10pt;white-space:nowrap;padding:10px 10px 20px 0}
#market_xfer>form>div{margin:5px auto}
#market_xfer>form>div:nth-child(2){padding-left:5px;margin-bottom:9px}
#market_xfer input[type="submit"]{width:120px}
#market_xfer input[type="text"]{width:105px;font-size:12pt;font-weight:bold;text-align:right;border-radius:5px;margin-left:8px}
.credit_balance{margin-top:10px}
.credit_balance>div:last-child{padding:3px 0 5px}
.market_tab{padding:15px 5px;font-weight:bold;font-size:14px;font-family:verdana;cursor:pointer;border-radius:9px 0 0 9px;border:1px solid transparent}
.market_tab:hover{color:#9B4E03}
.market_cur{border:1px solid #5C0D11;border-right:1px solid transparent !important}
#market_itemlist{flex-grow:1;flex-shrink:1;overflow:auto}
#market_itemlist>table{min-width:800px;text-align:right;margin:auto;font-family:verdana;font-size:10pt;font-weight:bold;border-collapse:separate;border-spacing:0}
#market_itemlist tr:hover:not(:first-child),.market_itemorders tr[onclick]:hover{color:#9B4E03;background:linear-gradient(to right,#605A5A00 0%, #605A5A0A 5%, #605A5A0A 95%,#605A5A00 100%)}
#market_itemlist th{border-bottom:1px solid #5C0D11;padding:10px 0 10px 20px;position:sticky;top:0;background:#EDEBDF}
#market_itemlist th:first-child{min-width:200px}
#market_itemlist td{height:30px;border-bottom:1px solid #5C0D1136}
#market_itemlist td:nth-child(2), #market_itemlist td:nth-child(3){padding-right:20px}
#market_itemlist td:last-child,#market_itemlist th:last-child{padding-right:20px}
#market_itemlist td:not(:first-child){font-weight:normal}
#market_itemlist>p{font-size:9pt;font-style:italic;padding:10px}
#market_itemlist tr[data-orderdisabled="1"]{color:#e63e3e}
#market_itemfilter{padding:5px 20px;display:flex;flex-direction:row;align-items:center;justify-content:center;font-weight:bold;font-size:10pt}
#market_itemfilter>div{padding:0 20px}
#market_itempage{display:flex;flex-direction:column;align-items:stretch;justify-content:start;flex-wrap:nowrap;flex-grow:1;font-weight:bold}
#market_itempage>div:nth-child(4){padding:10px 0 5px;font-size:10pt;font-family:verdana}
#market_itempage>div:first-child,#market_itempage>div:last-child{padding:15px 0;font-size:10pt;font-family:verdana}
#market_itemheader{display:flex;flex-direction:row;align-items:center;justify-content:center}
#market_itemheader>div:nth-child(2){width:400px}
#market_iteminfo{padding:0 0 15px;font-weight:normal;font-size:9pt}
#market_iteminfo span{font-weight:bold}
#market_itembody{flex-grow:1;display:flex;flex-direction:row;align-items:stretch;justify-content:space-around;flex-wrap:nowrap}
#market_itemsell,#market_itembuy{display:flex;flex-direction:column;align-items:stretch;justify-content:start}
#market_itemhistory{display:flex;flex-direction:column;align-items:stretch;justify-content:start;flex-wrap:nowrap;font-size:9pt}
#market_itemhistory td,#market_itemhistory th{padding:4px 6px}
#market_itemhistory td{text-align:right;height:16px}
#market_itemhistory th{text-align:center;border-bottom:1px solid #5C0D1136}
#market_itemhistory td:not(:first-child){font-weight:normal}
#market_itemhistory p{font-weight:normal;font-style:italic;font-size:8pt;padding:6px}
#market_itemhistory>div:not(:first-child){padding-top:3px}
#buyorder_update[data-orderdisabled="1"]:enabled{color:#e63e3e;border-color:#e63e3e}
#buyorder_update[data-orderdisabled="1"]:disabled{color:#ec9999;border-color:#ec9999}
.market_placeorder{margin:10px;font-size:10pt}
.market_placeorder span{font-weight:bold}
.market_placeorder td{padding:5px 2px;min-width:50px}
.market_placeorder td:nth-child(1){padding-top:6px;text-align:right}
.market_placeorder td:nth-child(3){padding-top:6px;text-align:left}
.market_placeorder td:nth-child(2){text-align:center}
.market_placeorder tr:nth-child(3) td,.market_placeorder tr:nth-child(4) td,.market_placeorder tr:nth-child(5) td{text-align:center;padding:7px 0 2px}
.market_placeorder input[type=number],.market_placeorder input[type=text]{width:70px;height:18px;border-width:1px 0;padding:2px 4px;margin:0;border-radius:0;text-align:right;vertical-align:top}
.market_placeorder input[type=button]{width:24px;height:24px;border-width:1px;margin:0}
.market_placeorder input[type=button]:nth-child(1){border-radius:50% 0 0 50%;padding:0 0 0 2px}
.market_placeorder input[type=button]:nth-child(3){border-radius:0 50% 50% 0;padding:0 2px 0 0}
.market_itemorders{padding-top:10px}
.market_itemorders p{font-weight:normal;font-style:italic;padding:6px}
.market_itemorders table{min-width:100px;margin:5px auto 0;font-weight:normal;font-size:9pt;font-weight:bold}
.market_itemorders th{padding:4px 8px;text-align:right;border-bottom:1px solid #5C0D1136}
.market_itemorders td{padding:8px;text-align:right}
.market_itemorders tr[data-orderconflict="1"]{color:#e63e3e}
.market_itemorders tr[data-orderconflict="1"]:hover{color:#ce3131}
.market_itemorders tr[data-orderactive="1"]{font-style:italic}
.market_itemorders tr[data-orderinsufficient="1"]{font-weight:normal}
.market_itemorders span,#market_itemhistory span,#market_tradelog span{opacity:0.3}
#market_recent{margin:8px auto 0}
#market_recent td>div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:left;max-width:100px}
#market_recent td>div>span,#market_tradelog td:nth-child(2)>span{font-style:italic}
#market_price{margin:8px auto}
#market_accountlog{overflow:auto}
#market_accountlog table,#market_tradelog table{margin:0 auto;text-align:left;font-size:9pt}
#market_accountlog td,#market_tradelog td{padding:3px 5px}
#market_accountlog th,#market_tradelog th{padding:5px 5px 3px;position:sticky;top:0;background:#EDEBDF}
#market_accountlog td:nth-child(1),#market_tradelog td:nth-child(1){font-weight:bold}
#market_accountlog td:nth-child(2),#market_accountlog td:nth-child(3){text-align:right}
#market_accountlog th:nth-child(2),#market_accountlog th:nth-child(3){text-align:center}
#market_tradelog_top,#market_tradelog_bot{font-weight:bold;font-size:10pt;font-family:verdana;padding:5px}
#market_tradelog{flex-grow:1;flex-shrink:1;overflow:auto}
#market_tradelog td:nth-last-child(1),#market_tradelog td:nth-last-child(2),#market_tradelog td:nth-last-child(3){text-align:right}
#market_tradelog th:nth-last-child(1),#market_tradelog th:nth-last-child(2),#market_tradelog th:nth-last-child(3){text-align:center}
/* equipment */
#eqsh{height:20px;text-align:center;padding-top:10px}
#eqsl{height:20px;margin:auto;position:relative}
#eqsl>div{float:left}
#eqsb{height:608px;overflow:auto;position:relative}
.eqb{width:650px;height:20px;margin:4px auto;padding:8px 0 14px;clear:both;text-align:left;position:relative;border:1px solid #5C0D11;border-radius:9px;user-select:none}
.eqb:not(.eqdisabled):hover{background:#F2EFDF;border:1px solid #9B4E03}
.eqb>div{clear:both;width:650px;margin:auto;text-align:center;font-size:10pt;font-weight:bold}
.eqb>div:last-child{padding-top:2px}
.eqempty{color:#9C9C9C}
.eqdisabled{border-color:#9C9C9C !important;color:#9C9C9C !important}
.eqselected{border:2px solid !important;padding:4px 0 !important}
.eqtplabel td{padding-left:10px !important;font-style:italic}
/* armory */
#armory_outer{display:flex;flex-direction:row;align-items:stretch;justify-content:start;flex-wrap:nowrap;height:100%;user-select:none}
#armory_left{display:flex;flex-direction:column;align-items:stretch;justify-content:start;flex-wrap:nowrap;padding-top:50px}
#armory_left>div,#armory_left>a>div{border-right:1px solid #5C0D11}
#armory_left>div:last-of-type{flex-grow:1}
#armory_left a,#armory_right a{text-decoration:none}
#armory_right{display:flex;flex-direction:column;align-items:stretch;justify-content:start;flex-wrap:nowrap;flex-grow:1}
.armory_tab{padding:15px 5px;font-weight:bold;font-size:14px;font-family:verdana;cursor:pointer;border-radius:9px 0 0 9px;border:1px solid transparent}
.armory_tab:hover{color:#9B4E03}
.armory_cur{border:1px solid #5C0D11;border-right:1px solid transparent !important}
#equipselect_outer{display:flex;flex-direction:row;align-items:stretch;justify-content:start;flex-wrap:nowrap;height:630px;width:100%}
#equipselect_left{padding:10px 20px;background:#EDEBDF;flex:1;display:flex;flex-direction:column;align-items:stretch}
#equiplist{overflow-y:scroll;scrollbar-gutter:stable;flex:1;padding-right:5px}
#equiplist tr[data-eqprotect]{opacity:0.5}
#equipselect_left table{width:100%;background:#EDEBDF}
#equipselect_left td,#equipselect_left th{padding:6px 2px;text-align:left}
#equipselect_left th{font-style:italic;font-weight:normal;font-size:9pt}
#equipselect_left td{font-size:10pt;font-weight:bold;border-top:1px solid #5C0D1136;border-bottom:1px solid #5C0D1136}
#equipselect_left tr:not(.eqselall):not(.eqtplabel):hover,tr[data-hover="1"]{color:#9B4E03;background:linear-gradient(to right,#605A5A00 0%, #605A5A0A 5%, #605A5A0A 95%,#605A5A00 100%)}
#equipselect_left td:not(:first-child){text-align:right;padding-right:5px}
#equipselect_right{width:440px;display:flex;flex-direction:column;align-items:stretch;justify-content:start;flex-wrap:nowrap}
#eqback{font-weight:bold;text-align:left;font-size:9pt;margin:0 0 8px 2px}
#equipinfo{flex:1}
#equipblurb{text-align:justify;font-size:10pt;padding:0 10px 0 3px}
#equipblurb table{margin:10px 0 0 20px}
#equipblurb td{padding:3px;text-align:right}
#equipblurb td:not(:first-child){font-weight:bold}
#equipblurb a{font-weight:bold}
#equipaction{padding-bottom:7px}
#equipaction label{text-align:left;margin:5px 0 5px 15px;font-weight:bold;font-size:9pt}
#equipaction p{font-weight:bold;font-size:9pt}
#equipaction td:first-child{font-weight:bold;text-align:right}
#equipaction td[data-inactive="1"]{filter:saturate(0);opacity:0.5}
.eqaction{width:250px;margin:auto}
.eqorganize{margin:auto}
.eqorganize td{min-width:54px}
.eqorganize span{font-size:12pt}
.eqmodify td:first-child{font-size:12pt}
#equipsubmit{margin:10px auto 5px}
#itemlist{margin:5px auto;font-size:9pt;font-weight:bold;overflow-y:scroll;scrollbar-gutter:stable;flex-shrink:1}
#itemlist>table{margin:auto}
#itemlist th,.eqils td{padding:2px;text-align:center}
.eqilm td{padding:2px;text-align:left}
.eqilm td:first-child{min-width:40px;text-align:right;padding-left:0}
.eqilm td:last-child{min-width:50px}
#eqcredits{margin:auto}
#eqcredits td{width:100px;font-weight:bold;font-size:9pt}
#eqcredits td:nth-child(2){width:120px;text-align:center}
#eqcredits td:nth-child(3){text-align:left}
#equipmodify_outer{display:flex;flex-direction:row;align-items:stretch;justify-content:start;flex-wrap:nowrap;height:630px;width:100%}
#equipmodify_left{padding:10px 20px;flex:1}
#equipmodify_left>p{font-weight:bold;font-size:9pt}
#equipmodify_middle{padding:10px 20px;flex:1;display:flex;flex-direction:column;align-items:stretch;justify-content:start;flex-wrap:nowrap}
#equipmodify_middle>div{flex:1}
#equipmodify_right{width:440px;display:flex;flex-direction:column;align-items:stretch;justify-content:start;flex-wrap:nowrap}
#equipmodify_right button{width:165px;margin:5px;white-space:nowrap}
#equipmodify_right table{margin:auto}
#charmslots{margin:-7px 0 -1px}
.eqcharm{width:300px;height:52px;margin:9px auto;padding:6px 1px 5px;border:1px solid #5C0D11;border-radius:9px;user-select:none}
.eqcharm:not(.eqdisabled):hover{background:#F2EFDF;border:1px solid #9B4E03}
.eqcharm>div{text-align:center;font-size:10pt;font-weight:bold}
.eqcharm>div:last-child{padding-top:2px}
.eqcharm p{padding:1px}
.eqcharm table{margin:2px auto 0;text-align:center;font-size:10pt;font-weight:bold;width:280px}
.eqcharm td:first-child{text-align:left;padding-left:50px}
.eqcharm td:last-child{text-align:right;padding-right:50px}
.chsel{border:2px solid !important;padding:5px 0 4px !important}
.chdmg{text-decoration:line-through}
.eqce{color:#9C9C9C;margin-top:7px}
#equpgrade>p,#eqbaserolls>p{font-weight:bold;font-size:9pt}
#equpgrade>p:first-child,#eqbaserolls>p:first-child{font-size:10pt}
#equpgrade>button,#eqbaserolls>button{width:175px;margin:5px}
.upgrmats,#eqbaserolls>table{margin:auto}
.upgrmats td,#eqbaserolls td{font-size:9pt;padding:3px 2px;text-align:left}
.upgrmats td:first-child,#eqbaserolls td:first-child{text-align:right}
.eqred{color:#FF0000}
#confirm_body .upgrmats{font-weight:bold}
#eqbaserolls td:last-child{text-align:left;padding-right:5px;font-weight:bold}
#confirm_outer{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#EDEBDFCC;z-index:9999;display:flex;flex-flow:column;justify-content:center;align-items:center;backdrop-filter:blur(1px)}
#confirm_inner{background:#EDEBDF;border:2px solid;border-radius:9px}
#confirm_inner>div{width:500px;padding:5px;text-align:center}
#confirm_header{display:flex;flex-flow:row;justify-content:start;border-bottom:1px solid}
#confirm_header>div:first-child{text-align:left;flex-grow:1;font-size:12pt;padding-top:3px}
#confirm_header>div:last-child{width:30px;text-align:right;font-size:14pt;padding-right:5px}
#confirm_body{font-size:10pt}
#confirm_body>input[type="text"]{width:95%;margin:5px 0}
#confirm_body>button{margin:10px}
#confirm_body>table{margin:auto}
#confirm_body label{position:relative;left:3px;margin:0 10px}
#eqselcharm{overflow-y:scroll;scrollbar-gutter:stable}
#eqselcharm table,#eqselpouch table{width:290px}
#eqselcharm td,#eqselpouch td{font-size:10pt;font-weight:bold;text-align:left;padding:5px 0}
#eqselcharm td:last-child,#eqselpouch td:last-child{text-align:right}
#eqselpouch{flex:0 !important}
#equipmodify_outer tr[data-disabled]{color:#9C9C9C !important;border-color:#9C9C9C !important}
#setcharm{margin-bottom:0}
#cdreason{font-weight:bold;padding:0;margin:0 0 3px}
#charmats td:first-child,#iwinfo td:first-child{text-align:right;padding-right:5px}
#charmats td:last-child{text-align:left}
#iwinfo{margin:0 auto 5px !important}
#iwinfo td{padding:3px}
#iwinfo td:last-child{text-align:left;font-weight:bold}
#armory_repaircosts{font-weight:bold;margin:0 auto 3px !important}
#armory_repaircosts td{padding:3px}
#fuseinfo{margin:3px auto 0 !important}
#fuseinfo td:nth-child(1){text-align:right}
#fuseinfo td:nth-child(2){padding:1px 2px 1px 5px}
#fuseinfo td:nth-child(3){font-weight:bold;padding:1px 5px 1px 2px}
#fuseinfo td:nth-child(4){text-align:left}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 690 B

View file

@ -1,7 +1,7 @@
// ==UserScript==
// @name HV Unified
// @namespace hvunified
// @version 0.14.8
// @version 0.14.9
// @description HV Unified — battle automation, guidance, and UI enhancements for HentaiVerse
// @author GaboGG + Hermes
// @match *://*.hentaiverse.org/*
@ -17,7 +17,7 @@
// CONFIG — default settings
// ═══════════════════════════════════════════════════════════════════════
const VERSION = '0.14.8';
const VERSION = '0.14.9';
const CFG = {
// — Battle automation
@ -3245,150 +3245,260 @@ function enhanceArmory() {
// GEAR SCRAPER — capture full equipment details for analysis
// ═══════════════════════════════════════════════════════════════════════
// Usage:
// 1. Visit Character page (?ss=ch) — scrapes equipped gear with all stats
// 2. Visit Armory pages (?ss=am) — scrapes inventory items
// 3. Data saved to localStorage['hvunified_geardb']
// 4. Query with: getGearDB() to read the full database
// 1. Visit Character Equipment page (?s=Character&ss=eq) — equipped gear
// 2. Visit Armory page (?s=Bazaar&ss=am) — inventory listing
// 3. Visit Modify page (?s=Bazaar&ss=am&screen=modify&eqids[]=ID) — full stats
// 4. Data saved to localStorage['hvunified_geardb']
// 5. Query with: HV.gear() or HV.gearSummary()
const GEAR_DB_KEY = SP + 'geardb';
// ── Public API ──
function getGearDB() {
try { return JSON.parse(localStorage[GEAR_DB_KEY] || '[]'); } catch (e) { return []; }
}
function saveGearDB(db) {
try { localStorage[GEAR_DB_KEY] = JSON.stringify(db); } catch (e) {}
}
function logGearSummary() {
const db = getGearDB();
const equipped = db.filter(e => e.source === 'character');
const armory = db.filter(e => e.source === 'armory');
console.log(`%c[HV] 📦 Gear DB: ${db.length} total (${equipped.length} equipped, ${armory.length} armory)`, 'color:#0f0');
equipped.forEach(item => {
console.log(` 🗡 ${item.name} | ID: ${item.id} | ${item.slotType || ''}`);
});
armory.forEach(item => {
console.log(` 📦 ${item.name} | ID: ${item.id} | ${item.category || ''}`);
});
}
// ── Scrape character page: equipped gear with full stats ──
// The HV character page (?ss=ch) shows each equipped item with:
// - Name, quality, prefix, suffix
// - Stats in the green/blue stat table
// - Potency, durability, level requirements
function scrapeCharacterGear() {
// ── Parse the tooltip popup box for full item stats ──
// The #popup_box div appears on hover with a detailed stat breakdown:
// <div class="eq">
// <div class="eqt">Light Armor & Level 115 & Tradeable</div>
// <div class="eqr">Condition: 55% & Energy: N/A</div>
// <div class="eqc">Burden: 7.1 & Interference: 2.1</div>
// <div class="ex">...</div>
// <div class="ep ep3">Primary Attributes</div>
// </div>
function parseTooltipPopup() {
const popup = document.getElementById('popup_box');
if (!popup) return null;
const text = popup.textContent || '';
// Extract item name (first div child text, before nested eq)
const nameDiv = popup.querySelector(':scope > div:first-child');
const name = nameDiv ? (nameDiv.textContent || '').trim() : '';
const eq = popup.querySelector('.eq');
if (!eq) return null;
const stats = {};
// Type line: "Light Armor Level 115 Tradeable"
const eqt = eq.querySelector('.eqt');
if (eqt) {
const eqtText = eqt.textContent || '';
const typeMatch = eqtText.match(/^([A-Za-z\s]+?)(?:\s{2,}|$)/);
if (typeMatch) stats.type = typeMatch[1].trim();
const lvMatch = eqtText.match(/Level\s*(\d+)/i);
if (lvMatch) stats.level = lvMatch[1];
const tradeMatch = eqtText.match(/(Tradeable|Soulbound|Blessed)/);
if (tradeMatch) stats.bind = tradeMatch[1];
}
// Condition / Energy
const eqr = eq.querySelector('.eqr');
if (eqr) {
const condMatch = (eqr.textContent || '').match(/Condition:\s*(\d+)%/i);
if (condMatch) stats.condition = condMatch[1];
const engMatch = (eqr.textContent || '').match(/Energy:\s*([^\s]+)/i);
if (engMatch) stats.energy = engMatch[1];
}
// Burden / Interference
const eqc = eq.querySelector('.eqc');
if (eqc) {
const burMatch = (eqc.textContent || '').match(/Burden:\s*([\d.]+)/i);
if (burMatch) stats.burden = burMatch[1];
const intMatch = (eqc.textContent || '').match(/Interference:\s*([\d.]+)/i);
if (intMatch) stats.interference = intMatch[1];
}
// Stats from .ex (main stat block)
const ex = eq.querySelector('.ex');
if (ex) {
ex.querySelectorAll(':scope > div').forEach(stat => {
const label = stat.querySelector(':scope > div:first-child');
const value = stat.querySelector(':scope > div:nth-child(2) span, :scope > div:nth-child(2)');
if (label && value) {
const key = (label.textContent || '').trim().replace(/[^A-Za-z\s]/g, '').trim();
const val = (value.textContent || '').trim();
if (key && val) stats[key] = val;
}
});
}
// Extra stat groups (.ep)
eq.querySelectorAll('.ep').forEach(group => {
const groupTitle = group.querySelector(':scope > div:first-child');
const groupName = groupTitle ? (groupTitle.textContent || '').trim() : '';
group.querySelectorAll(':scope > div:not(:first-child)').forEach(stat => {
const label = stat.querySelector(':scope > div:first-child');
const value = stat.querySelector(':scope > div:nth-child(2) span, :scope > div:nth-child(2)');
if (label && value) {
const key = (label.textContent || '').trim().replace(/[^A-Za-z\s]/g, '').trim();
const val = (value.textContent || '').trim();
if (key && val) stats[key] = val;
}
});
});
return { name, stats };
}
// ── Scrape Character Equipment page (?s=Character&ss=eq) ──
// DOM structure:
// #eqsb > .eqb (equipment slots)
// .eqb div: "Exquisite Estoc of Slaughter" (name)
// .eqb onmouseover="equips.set(ITEM_ID,'slot_pane',...)" (ID)
// #popup_box (tooltip with full stats, populated by hovering)
function scrapeCharacterEquip() {
const scraped = [];
// Each equipment slot on the character page has class 'eqp' inside the
// character display table
const eqSlots = $$('.eqp, .eqslot, .equipped-item');
// Read each equipment slot in #eqsb
const slots = document.querySelectorAll('#eqsb > .eqb');
eqSlots.forEach(slot => {
// Try to find the item name from the tooltip trigger
const link = slot.querySelector('a[onmouseover*="inv_tooltip"]') ||
slot.querySelector('[onmouseover*="inv_tooltip"]');
if (!link) return;
const omo = link.getAttribute('onmouseover') || '';
// Extract item ID from tooltip call: inv_tooltip('ITEM_ID')
const idMatch = omo.match(/inv_tooltip\s*\(\s*['"](\d+)['"]/);
slots.forEach(slot => {
// Get item ID from onmouseover
const omo = slot.getAttribute('onmouseover') || slot.querySelector('[onmouseover]')?.getAttribute('onmouseover') || '';
const idMatch = omo.match(/equips\.set\((\d+)/);
const itemId = idMatch ? idMatch[1] : '';
// Extract name from the alt/title text
const name = (link.getAttribute('title') || link.getAttribute('alt') || '').trim();
// Get item name from the child div (text node)
const nameDiv = slot.querySelector(':scope > div:not([class])') || slot.querySelector('div');
const name = nameDiv ? (nameDiv.textContent || '').trim() : '';
// Extract stat block from the adjacent table/div
// Stats are in a grey table showing: ADB, Damage, Crit, etc.
const statEl = slot.querySelector('.eqstatblock, .item-stats, .gry, table.gry');
const stats = statEl ? parseStatBlock(statEl.textContent || '') : {};
// Check if slot is disabled
const disabled = slot.classList.contains('eqdisabled');
// Durability
const durEl = slot.querySelector('[class*="dur"], [class*="durability"]');
const durability = durEl ? (durEl.textContent || '').trim() : '';
// Potency / Item World level
const potEl = slot.querySelector('[class*="potency"], [class*="iw"]');
const potency = potEl ? (potEl.textContent || '').trim() : '';
// Slot type (weapon, armor, etc.) from parent container
const slotParent = slot.closest('tr, div, td');
const slotType = slotParent ? (slotParent.className || '') : '';
// Level requirement
const lvEl = slot.querySelector('[class*="req"], [class*="level"]');
const levelReq = lvEl ? (lvEl.textContent || '').match(/\d+/) : null;
// Determine slot type from parent structure
const slotType = '';
scraped.push({
id: itemId,
name: name,
slotType: slotType,
stats: stats,
durability: durability,
potency: potency,
levelReq: levelReq ? parseInt(levelReq[0]) : 0,
disabled: disabled,
source: 'character',
scrapedAt: Date.now(),
});
});
// If we found character gear, merge or replace
// Read the popup box for the currently-displayed tooltip
const tooltip = parseTooltipPopup();
// Merge tooltip stats with the matching item
if (tooltip && tooltip.name) {
const matchIdx = scraped.findIndex(s => tooltip.name.includes(s.name) || s.name.includes(tooltip.name));
if (matchIdx >= 0) {
scraped[matchIdx].stats = tooltip.stats;
} else if (scraped.length > 0) {
// If no match, attach to first item as extra info
scraped[0].tooltipStats = tooltip.stats;
}
}
if (scraped.length > 0) {
const db = getGearDB();
// Remove old character entries with same IDs
const filtered = db.filter(e => !(e.source === 'character' && scraped.some(s => s.id === e.id)));
const filtered = db.filter(e => !(e.source === 'character'));
saveGearDB([...filtered, ...scraped]);
console.log(`%c[HV] Gear: scraped ${scraped.length} equipped items from character page`, 'color:#0f0');
console.log(`%c[HV] Gear: scraped ${scraped.length} equipped items (${scraped.filter(s => s.stats).length} with tooltip stats)`, 'color:#0f0');
}
return scraped;
}
// ── Scrape armory inventory page ──
function scrapeArmoryInventory() {
// ── Scrape Armory Organize page (?s=Bazaar&ss=am&screen=organize) ──
// DOM structure:
// #equiplist > table > tbody > tr
// tr.eqtplabel: category name
// tr[onmouseover]: equipment row with:
// onmouseover="hover_equip(ITEM_ID)"
// input[name="eqids[]"] value="ITEM_ID"
// label text: item name
// #equipinfo > .showequip > .eq: tooltip for selected item
function scrapeArmory() {
const scraped = [];
const equipList = document.getElementById('equiplist');
if (!equipList) return scraped;
let currentCategory = '';
$$('tr', equipList).forEach(row => {
if (row.className === 'eqtplabel') {
const rows = equipList.querySelectorAll('table tr');
rows.forEach(row => {
// Category header
if (row.classList.contains('eqtplabel')) {
currentCategory = (row.textContent || '').trim();
return;
}
const cb = row.querySelector('input[name="eqids[]"]');
if (!cb) return;
// Skip select-all header row
if (row.classList.contains('eqselall')) return;
const id = cb.value;
// Item ID from onmouseover
const omo = row.getAttribute('onmouseover') || '';
const idMatch = omo.match(/hover_equip\((\d+)\)/);
const itemId = idMatch ? idMatch[1] : '';
// Item name from label
const label = row.querySelector('label');
const rawName = label ? (label.textContent || '').trim() : '';
// Parse name into quality + base name
const equipped = rawName.includes('🗡');
const locked = rawName.includes('🔒');
const pinned = rawName.includes('📌');
const stored = rawName.includes('📦');
const cleanName = rawName.replace(/[🗡🔒📌📦🛡\s]/g, '').trim();
// Try to parse potency info from adjacent cells
const cells = row.querySelectorAll('td');
let potency = '';
let durability = '';
if (cells.length >= 3) {
potency = (cells[cells.length - 2].textContent || '').trim();
durability = (cells[cells.length - 1].textContent || '').trim();
let name = label ? (label.textContent || '').trim() : '';
// Strip checkbox indicator
const cb = label ? label.querySelector('input') : null;
if (cb) {
name = (label.textContent || '').replace(cb.outerHTML, '').trim();
}
// Checkbox value as fallback ID
const checkbox = row.querySelector('input[name="eqids[]"]');
const cbId = checkbox ? checkbox.value : '';
if (!name && !itemId) return;
scraped.push({
id: id,
name: cleanName,
id: itemId || cbId,
name: name || 'Unknown',
category: currentCategory,
equipped: equipped,
locked: locked,
pinned: pinned,
stored: stored,
potency: potency,
durability: durability,
source: 'armory',
scrapedAt: Date.now(),
});
});
// Read the right-side info pane for the currently-hovered item's stats
const equipInfo = document.getElementById('equipinfo');
if (equipInfo) {
const showEquip = equipInfo.querySelector('.showequip');
if (showEquip) {
const link = showEquip.querySelector('a');
const infoName = link ? (link.textContent || '').trim() : '';
const eq = showEquip.querySelector('.eq');
if (eq) {
const infoText = eq.textContent || '';
// Find matching item and attach raw stats
const matchIdx = scraped.findIndex(s => infoName.includes(s.name) || s.name.includes(infoName));
if (matchIdx >= 0) {
scraped[matchIdx].infoText = infoText;
// Parse condition
const condMatch = infoText.match(/Condition:\s*(\d+)%/i);
if (condMatch) scraped[matchIdx].condition = parseInt(condMatch[1]);
}
}
}
}
if (scraped.length > 0) {
const db = getGearDB();
// Remove old armory entries
const filtered = db.filter(e => e.source !== 'armory');
saveGearDB([...filtered, ...scraped]);
console.log(`%c[HV] Gear: scraped ${scraped.length} armory items`, 'color:#0f0');
@ -3396,27 +3506,76 @@ function scrapeArmoryInventory() {
return scraped;
}
// ── Scrape equipment modify detail page (full stats) ──
// The Modify page (?ss=am&eq=modify&eqid=XXXX) shows one item with ALL details
// ── Trigger hover on each character slot to populate tooltip ──
// HV's equips.set(id, 'slot_pane', w, h) populates #popup_box with stats.
// We call it for each item in sequence to capture all tooltips.
function triggerAllTooltips() {
const slots = document.querySelectorAll('#eqsb > .eqb');
const results = [];
slots.forEach(slot => {
const omo = slot.getAttribute('onmouseover') || '';
const idMatch = omo.match(/equips\.set\((\d+)/);
if (idMatch && typeof equips !== 'undefined' && equips.set) {
// Trigger the tooltip
equips.set(parseInt(idMatch[1]), 'slot_pane', 250, 130);
// Read the popup
const tooltip = parseTooltipPopup();
if (tooltip && tooltip.name) {
results.push(tooltip);
}
}
});
return results;
}
// ── Auto-detect and scrape current page ──
function autoScrapeGear() {
const url = window.location.href || '';
// Character equipment page
if (url.includes('ss=eq')) {
// Trigger tooltips for all items to populate popup_box
const tooltips = triggerAllTooltips();
// Then scrape
return scrapeCharacterEquip();
}
// Character summary page — try reading the slots
if (url.includes('ss=ch')) {
return scrapeCharacterEquip();
}
// Armory pages
if (url.includes('ss=am')) {
if (url.includes('screen=modify')) {
return scrapeModifyDetail();
}
return scrapeArmory();
}
return [];
}
// ── Scrape equipment modify detail page ──
function scrapeModifyDetail() {
// This page shows detailed stat tables. Parse the main stat block.
const mainPane = document.getElementById('mainpane');
if (!mainPane) return null;
const text = mainPane.textContent || '';
const nameEl = mainPane.querySelector('h2, h3, .itemname, .eqname');
const name = nameEl ? (nameEl.textContent || '').trim() : '';
// Extract item ID from URL
const idMatch = window.location.href.match(/eqid[=/](\d+)/);
// Try to get item ID from URL
const idMatch = window.location.href.match(/eqids?\[\]=(\d+)/);
const itemId = idMatch ? idMatch[1] : '';
// Find the stat table (grey bordered table with stat rows)
const statTables = mainPane.querySelectorAll('table.gry, table[class*="stat"]');
// Item name from the page title area
const nameEl = mainPane.querySelector('h3, .itemname, .eqname');
const name = nameEl ? (nameEl.textContent || '').trim() : '';
// Read all stat tables
const stats = {};
statTables.forEach(tbl => {
const rows = tbl.querySelectorAll('tr');
rows.forEach(row => {
mainPane.querySelectorAll('table.gry, table.grl').forEach(tbl => {
tbl.querySelectorAll('tr').forEach(row => {
const cells = row.querySelectorAll('td');
if (cells.length >= 2) {
const key = (cells[0].textContent || '').trim().replace(':', '');
@ -3426,103 +3585,32 @@ function scrapeModifyDetail() {
});
});
// Durability
const durMatch = text.match(/Durability:\s*(\d+\s*\/\s*\d+)/i);
// Potency
const potMatch = text.match(/(?:Potency|Item World):\s*([^\n]+)/i);
const text = mainPane.textContent || '';
const durMatch = text.match(/Durability:\s*(\d+)\s*\/\s*(\d+)/i);
const potMatch = text.match(/(?:Potency|Item World)\s*:\s*([^\n<]+)/i);
const item = {
id: itemId,
name: name,
stats: stats,
durability: durMatch ? durMatch[1] : '',
durability: durMatch ? `${durMatch[1]}/${durMatch[2]}` : '',
potency: potMatch ? potMatch[1].trim() : '',
source: 'modify',
scrapedAt: Date.now(),
};
// Save or update
if (item.id) {
const db = getGearDB();
const idx = db.findIndex(e => e.id === item.id && e.source === 'modify');
if (idx >= 0) {
db[idx] = item;
} else {
db.push(item);
}
if (idx >= 0) db[idx] = item;
else db.push(item);
saveGearDB(db);
console.log(`%c[HV] Gear: scraped modify detail for ${name}`, 'color:#0f0');
console.log(`%c[HV] Gear: scraped modify detail for ${item.name || itemId}`, 'color:#0f0');
}
return item;
}
// ── Auto-detect and scrape current page ──
function autoScrapeGear() {
const url = window.location.href || '';
const ss = url.match(/ss=(\w+)/);
if (url.includes('ss=ch')) {
return scrapeCharacterGear();
}
if (url.includes('ss=am')) {
if (url.includes('eq=modify')) {
return scrapeModifyDetail();
}
return scrapeArmoryInventory();
}
return [];
}
// ── Stat block parser ──
// The character page stats look like: "ADB +X | Damage X-Y | Crit X%"
function parseStatBlock(text) {
const stats = {};
// Find common stat patterns
const patterns = [
{ key: 'adb', re: /ADB\s*[+:]\s*([\d.]+)/i },
{ key: 'damage', re: /Damage\s*[+:]?\s*(\d+\s*-\s*\d+)/i },
{ key: 'critChance', re: /(?:Crit(?:ical)?\s*(?:Chance|Rate)?|CTH)\s*[+:]?\s*([\d.]+)%?/i },
{ key: 'critDamage', re: /(?:Crit\s*Damage|CDB)\s*[+:]?\s*([\d.]+)%?/i },
{ key: 'attackSpeed', re: /(?:Attack\s*Speed|Speed)\s*[+:]?\s*([\d.]+)%?/i },
{ key: 'parry', re: /Parry\s*[+:]?\s*([\d.]+)%?/i },
{ key: 'evade', re: /Evade\s*[+:]?\s*([\d.]+)%?/i },
{ key: 'block', re: /Block\s*[+:]?\s*([\d.]+)%?/i },
{ key: 'physMit', re: /(?:Physical\s*(?:Mitigation|Resist)|PMit)\s*[+:]?\s*([\d.]+)%?/i },
{ key: 'magMit', re: /(?:Magical\s*(?:Mitigation|Resist)|MMit)\s*[+:]?\s*([\d.]+)%?/i },
{ key: 'str', re: /\bSTR\s*[+:]?\s*([\d.]+)/i },
{ key: 'dex', re: /\bDEX\s*[+:]?\s*([\d.]+)/i },
{ key: 'end', re: /\bEND\s*[+:]?\s*([\d.]+)/i },
{ key: 'agi', re: /\bAGI\s*[+:]?\s*([\d.]+)/i },
{ key: 'wis', re: /\bWIS\s*[+:]?\s*([\d.]+)/i },
{ key: 'int', re: /\bINT\s*[+:]?\s*([\d.]+)/i },
{ key: 'burden', re: /Burden\s*[+:]?\s*([\d.]+)/i },
{ key: 'interference', re: /Interference\s*[+:]?\s*([\d.]+)/i },
];
patterns.forEach(p => {
const m = text.match(p.re);
if (m) stats[p.key] = m[1].trim();
});
return stats;
}
// ── Quick summary for console ──
function logGearSummary() {
const db = getGearDB();
const equipped = db.filter(e => e.source === 'character');
const armory = db.filter(e => e.source === 'armory');
console.log(`%c[HV] 📦 Gear DB: ${db.length} total (${equipped.length} equipped, ${armory.length} armory)`, 'color:#0f0');
equipped.forEach(item => {
const name = item.name || 'unknown';
const adb = item.stats?.adb || '?';
console.log(` 🗡 ${name} | ADB: +${adb} | ${item.durability || ''}`);
});
}
// ═══════════════════════════════════════════════════════════════════════
// BATTLE LOGGER — saves raw battle log lines to localStorage in real time
// ═══════════════════════════════════════════════════════════════════════
@ -3926,8 +4014,14 @@ function initializeBattle() {
}
// Auto-scrape gear data on character/armory pages
if (STATE.page === 'character' || STATE.page === 'armory' || window.location.href.includes('ss=ch') || window.location.href.includes('ss=am')) {
setTimeout(autoScrapeGear, 500); // wait for page to render
if (window.location.href.includes('ss=eq')) {
// Character equipment page: trigger tooltip popups for full stats
setTimeout(() => {
triggerAllTooltips(); // populate popup_box for each item
setTimeout(autoScrapeGear, 300); // then scrape
}, 500);
} else if (window.location.href.includes('ss=ch') || window.location.href.includes('ss=am')) {
setTimeout(autoScrapeGear, 500);
}
STATE.battleInitialized = true;

View file

@ -1,7 +1,7 @@
// ==UserScript==
// @name HV Unified
// @namespace hvunified
// @version 0.14.8
// @version 0.14.9
// @description HV Unified — battle automation, guidance, and UI enhancements for HentaiVerse
// @author GaboGG + Hermes
// @match *://*.hentaiverse.org/*
@ -17,7 +17,7 @@
// CONFIG — default settings
// ═══════════════════════════════════════════════════════════════════════
const VERSION = '0.14.8';
const VERSION = '0.14.9';
const CFG = {
// — Battle automation
@ -3245,150 +3245,260 @@ function enhanceArmory() {
// GEAR SCRAPER — capture full equipment details for analysis
// ═══════════════════════════════════════════════════════════════════════
// Usage:
// 1. Visit Character page (?ss=ch) — scrapes equipped gear with all stats
// 2. Visit Armory pages (?ss=am) — scrapes inventory items
// 3. Data saved to localStorage['hvunified_geardb']
// 4. Query with: getGearDB() to read the full database
// 1. Visit Character Equipment page (?s=Character&ss=eq) — equipped gear
// 2. Visit Armory page (?s=Bazaar&ss=am) — inventory listing
// 3. Visit Modify page (?s=Bazaar&ss=am&screen=modify&eqids[]=ID) — full stats
// 4. Data saved to localStorage['hvunified_geardb']
// 5. Query with: HV.gear() or HV.gearSummary()
const GEAR_DB_KEY = SP + 'geardb';
// ── Public API ──
function getGearDB() {
try { return JSON.parse(localStorage[GEAR_DB_KEY] || '[]'); } catch (e) { return []; }
}
function saveGearDB(db) {
try { localStorage[GEAR_DB_KEY] = JSON.stringify(db); } catch (e) {}
}
function logGearSummary() {
const db = getGearDB();
const equipped = db.filter(e => e.source === 'character');
const armory = db.filter(e => e.source === 'armory');
console.log(`%c[HV] 📦 Gear DB: ${db.length} total (${equipped.length} equipped, ${armory.length} armory)`, 'color:#0f0');
equipped.forEach(item => {
console.log(` 🗡 ${item.name} | ID: ${item.id} | ${item.slotType || ''}`);
});
armory.forEach(item => {
console.log(` 📦 ${item.name} | ID: ${item.id} | ${item.category || ''}`);
});
}
// ── Scrape character page: equipped gear with full stats ──
// The HV character page (?ss=ch) shows each equipped item with:
// - Name, quality, prefix, suffix
// - Stats in the green/blue stat table
// - Potency, durability, level requirements
function scrapeCharacterGear() {
// ── Parse the tooltip popup box for full item stats ──
// The #popup_box div appears on hover with a detailed stat breakdown:
// <div class="eq">
// <div class="eqt">Light Armor & Level 115 & Tradeable</div>
// <div class="eqr">Condition: 55% & Energy: N/A</div>
// <div class="eqc">Burden: 7.1 & Interference: 2.1</div>
// <div class="ex">...</div>
// <div class="ep ep3">Primary Attributes</div>
// </div>
function parseTooltipPopup() {
const popup = document.getElementById('popup_box');
if (!popup) return null;
const text = popup.textContent || '';
// Extract item name (first div child text, before nested eq)
const nameDiv = popup.querySelector(':scope > div:first-child');
const name = nameDiv ? (nameDiv.textContent || '').trim() : '';
const eq = popup.querySelector('.eq');
if (!eq) return null;
const stats = {};
// Type line: "Light Armor Level 115 Tradeable"
const eqt = eq.querySelector('.eqt');
if (eqt) {
const eqtText = eqt.textContent || '';
const typeMatch = eqtText.match(/^([A-Za-z\s]+?)(?:\s{2,}|$)/);
if (typeMatch) stats.type = typeMatch[1].trim();
const lvMatch = eqtText.match(/Level\s*(\d+)/i);
if (lvMatch) stats.level = lvMatch[1];
const tradeMatch = eqtText.match(/(Tradeable|Soulbound|Blessed)/);
if (tradeMatch) stats.bind = tradeMatch[1];
}
// Condition / Energy
const eqr = eq.querySelector('.eqr');
if (eqr) {
const condMatch = (eqr.textContent || '').match(/Condition:\s*(\d+)%/i);
if (condMatch) stats.condition = condMatch[1];
const engMatch = (eqr.textContent || '').match(/Energy:\s*([^\s]+)/i);
if (engMatch) stats.energy = engMatch[1];
}
// Burden / Interference
const eqc = eq.querySelector('.eqc');
if (eqc) {
const burMatch = (eqc.textContent || '').match(/Burden:\s*([\d.]+)/i);
if (burMatch) stats.burden = burMatch[1];
const intMatch = (eqc.textContent || '').match(/Interference:\s*([\d.]+)/i);
if (intMatch) stats.interference = intMatch[1];
}
// Stats from .ex (main stat block)
const ex = eq.querySelector('.ex');
if (ex) {
ex.querySelectorAll(':scope > div').forEach(stat => {
const label = stat.querySelector(':scope > div:first-child');
const value = stat.querySelector(':scope > div:nth-child(2) span, :scope > div:nth-child(2)');
if (label && value) {
const key = (label.textContent || '').trim().replace(/[^A-Za-z\s]/g, '').trim();
const val = (value.textContent || '').trim();
if (key && val) stats[key] = val;
}
});
}
// Extra stat groups (.ep)
eq.querySelectorAll('.ep').forEach(group => {
const groupTitle = group.querySelector(':scope > div:first-child');
const groupName = groupTitle ? (groupTitle.textContent || '').trim() : '';
group.querySelectorAll(':scope > div:not(:first-child)').forEach(stat => {
const label = stat.querySelector(':scope > div:first-child');
const value = stat.querySelector(':scope > div:nth-child(2) span, :scope > div:nth-child(2)');
if (label && value) {
const key = (label.textContent || '').trim().replace(/[^A-Za-z\s]/g, '').trim();
const val = (value.textContent || '').trim();
if (key && val) stats[key] = val;
}
});
});
return { name, stats };
}
// ── Scrape Character Equipment page (?s=Character&ss=eq) ──
// DOM structure:
// #eqsb > .eqb (equipment slots)
// .eqb div: "Exquisite Estoc of Slaughter" (name)
// .eqb onmouseover="equips.set(ITEM_ID,'slot_pane',...)" (ID)
// #popup_box (tooltip with full stats, populated by hovering)
function scrapeCharacterEquip() {
const scraped = [];
// Each equipment slot on the character page has class 'eqp' inside the
// character display table
const eqSlots = $$('.eqp, .eqslot, .equipped-item');
// Read each equipment slot in #eqsb
const slots = document.querySelectorAll('#eqsb > .eqb');
eqSlots.forEach(slot => {
// Try to find the item name from the tooltip trigger
const link = slot.querySelector('a[onmouseover*="inv_tooltip"]') ||
slot.querySelector('[onmouseover*="inv_tooltip"]');
if (!link) return;
const omo = link.getAttribute('onmouseover') || '';
// Extract item ID from tooltip call: inv_tooltip('ITEM_ID')
const idMatch = omo.match(/inv_tooltip\s*\(\s*['"](\d+)['"]/);
slots.forEach(slot => {
// Get item ID from onmouseover
const omo = slot.getAttribute('onmouseover') || slot.querySelector('[onmouseover]')?.getAttribute('onmouseover') || '';
const idMatch = omo.match(/equips\.set\((\d+)/);
const itemId = idMatch ? idMatch[1] : '';
// Extract name from the alt/title text
const name = (link.getAttribute('title') || link.getAttribute('alt') || '').trim();
// Get item name from the child div (text node)
const nameDiv = slot.querySelector(':scope > div:not([class])') || slot.querySelector('div');
const name = nameDiv ? (nameDiv.textContent || '').trim() : '';
// Extract stat block from the adjacent table/div
// Stats are in a grey table showing: ADB, Damage, Crit, etc.
const statEl = slot.querySelector('.eqstatblock, .item-stats, .gry, table.gry');
const stats = statEl ? parseStatBlock(statEl.textContent || '') : {};
// Check if slot is disabled
const disabled = slot.classList.contains('eqdisabled');
// Durability
const durEl = slot.querySelector('[class*="dur"], [class*="durability"]');
const durability = durEl ? (durEl.textContent || '').trim() : '';
// Potency / Item World level
const potEl = slot.querySelector('[class*="potency"], [class*="iw"]');
const potency = potEl ? (potEl.textContent || '').trim() : '';
// Slot type (weapon, armor, etc.) from parent container
const slotParent = slot.closest('tr, div, td');
const slotType = slotParent ? (slotParent.className || '') : '';
// Level requirement
const lvEl = slot.querySelector('[class*="req"], [class*="level"]');
const levelReq = lvEl ? (lvEl.textContent || '').match(/\d+/) : null;
// Determine slot type from parent structure
const slotType = '';
scraped.push({
id: itemId,
name: name,
slotType: slotType,
stats: stats,
durability: durability,
potency: potency,
levelReq: levelReq ? parseInt(levelReq[0]) : 0,
disabled: disabled,
source: 'character',
scrapedAt: Date.now(),
});
});
// If we found character gear, merge or replace
// Read the popup box for the currently-displayed tooltip
const tooltip = parseTooltipPopup();
// Merge tooltip stats with the matching item
if (tooltip && tooltip.name) {
const matchIdx = scraped.findIndex(s => tooltip.name.includes(s.name) || s.name.includes(tooltip.name));
if (matchIdx >= 0) {
scraped[matchIdx].stats = tooltip.stats;
} else if (scraped.length > 0) {
// If no match, attach to first item as extra info
scraped[0].tooltipStats = tooltip.stats;
}
}
if (scraped.length > 0) {
const db = getGearDB();
// Remove old character entries with same IDs
const filtered = db.filter(e => !(e.source === 'character' && scraped.some(s => s.id === e.id)));
const filtered = db.filter(e => !(e.source === 'character'));
saveGearDB([...filtered, ...scraped]);
console.log(`%c[HV] Gear: scraped ${scraped.length} equipped items from character page`, 'color:#0f0');
console.log(`%c[HV] Gear: scraped ${scraped.length} equipped items (${scraped.filter(s => s.stats).length} with tooltip stats)`, 'color:#0f0');
}
return scraped;
}
// ── Scrape armory inventory page ──
function scrapeArmoryInventory() {
// ── Scrape Armory Organize page (?s=Bazaar&ss=am&screen=organize) ──
// DOM structure:
// #equiplist > table > tbody > tr
// tr.eqtplabel: category name
// tr[onmouseover]: equipment row with:
// onmouseover="hover_equip(ITEM_ID)"
// input[name="eqids[]"] value="ITEM_ID"
// label text: item name
// #equipinfo > .showequip > .eq: tooltip for selected item
function scrapeArmory() {
const scraped = [];
const equipList = document.getElementById('equiplist');
if (!equipList) return scraped;
let currentCategory = '';
$$('tr', equipList).forEach(row => {
if (row.className === 'eqtplabel') {
const rows = equipList.querySelectorAll('table tr');
rows.forEach(row => {
// Category header
if (row.classList.contains('eqtplabel')) {
currentCategory = (row.textContent || '').trim();
return;
}
const cb = row.querySelector('input[name="eqids[]"]');
if (!cb) return;
// Skip select-all header row
if (row.classList.contains('eqselall')) return;
const id = cb.value;
// Item ID from onmouseover
const omo = row.getAttribute('onmouseover') || '';
const idMatch = omo.match(/hover_equip\((\d+)\)/);
const itemId = idMatch ? idMatch[1] : '';
// Item name from label
const label = row.querySelector('label');
const rawName = label ? (label.textContent || '').trim() : '';
// Parse name into quality + base name
const equipped = rawName.includes('🗡');
const locked = rawName.includes('🔒');
const pinned = rawName.includes('📌');
const stored = rawName.includes('📦');
const cleanName = rawName.replace(/[🗡🔒📌📦🛡\s]/g, '').trim();
// Try to parse potency info from adjacent cells
const cells = row.querySelectorAll('td');
let potency = '';
let durability = '';
if (cells.length >= 3) {
potency = (cells[cells.length - 2].textContent || '').trim();
durability = (cells[cells.length - 1].textContent || '').trim();
let name = label ? (label.textContent || '').trim() : '';
// Strip checkbox indicator
const cb = label ? label.querySelector('input') : null;
if (cb) {
name = (label.textContent || '').replace(cb.outerHTML, '').trim();
}
// Checkbox value as fallback ID
const checkbox = row.querySelector('input[name="eqids[]"]');
const cbId = checkbox ? checkbox.value : '';
if (!name && !itemId) return;
scraped.push({
id: id,
name: cleanName,
id: itemId || cbId,
name: name || 'Unknown',
category: currentCategory,
equipped: equipped,
locked: locked,
pinned: pinned,
stored: stored,
potency: potency,
durability: durability,
source: 'armory',
scrapedAt: Date.now(),
});
});
// Read the right-side info pane for the currently-hovered item's stats
const equipInfo = document.getElementById('equipinfo');
if (equipInfo) {
const showEquip = equipInfo.querySelector('.showequip');
if (showEquip) {
const link = showEquip.querySelector('a');
const infoName = link ? (link.textContent || '').trim() : '';
const eq = showEquip.querySelector('.eq');
if (eq) {
const infoText = eq.textContent || '';
// Find matching item and attach raw stats
const matchIdx = scraped.findIndex(s => infoName.includes(s.name) || s.name.includes(infoName));
if (matchIdx >= 0) {
scraped[matchIdx].infoText = infoText;
// Parse condition
const condMatch = infoText.match(/Condition:\s*(\d+)%/i);
if (condMatch) scraped[matchIdx].condition = parseInt(condMatch[1]);
}
}
}
}
if (scraped.length > 0) {
const db = getGearDB();
// Remove old armory entries
const filtered = db.filter(e => e.source !== 'armory');
saveGearDB([...filtered, ...scraped]);
console.log(`%c[HV] Gear: scraped ${scraped.length} armory items`, 'color:#0f0');
@ -3396,27 +3506,76 @@ function scrapeArmoryInventory() {
return scraped;
}
// ── Scrape equipment modify detail page (full stats) ──
// The Modify page (?ss=am&eq=modify&eqid=XXXX) shows one item with ALL details
// ── Trigger hover on each character slot to populate tooltip ──
// HV's equips.set(id, 'slot_pane', w, h) populates #popup_box with stats.
// We call it for each item in sequence to capture all tooltips.
function triggerAllTooltips() {
const slots = document.querySelectorAll('#eqsb > .eqb');
const results = [];
slots.forEach(slot => {
const omo = slot.getAttribute('onmouseover') || '';
const idMatch = omo.match(/equips\.set\((\d+)/);
if (idMatch && typeof equips !== 'undefined' && equips.set) {
// Trigger the tooltip
equips.set(parseInt(idMatch[1]), 'slot_pane', 250, 130);
// Read the popup
const tooltip = parseTooltipPopup();
if (tooltip && tooltip.name) {
results.push(tooltip);
}
}
});
return results;
}
// ── Auto-detect and scrape current page ──
function autoScrapeGear() {
const url = window.location.href || '';
// Character equipment page
if (url.includes('ss=eq')) {
// Trigger tooltips for all items to populate popup_box
const tooltips = triggerAllTooltips();
// Then scrape
return scrapeCharacterEquip();
}
// Character summary page — try reading the slots
if (url.includes('ss=ch')) {
return scrapeCharacterEquip();
}
// Armory pages
if (url.includes('ss=am')) {
if (url.includes('screen=modify')) {
return scrapeModifyDetail();
}
return scrapeArmory();
}
return [];
}
// ── Scrape equipment modify detail page ──
function scrapeModifyDetail() {
// This page shows detailed stat tables. Parse the main stat block.
const mainPane = document.getElementById('mainpane');
if (!mainPane) return null;
const text = mainPane.textContent || '';
const nameEl = mainPane.querySelector('h2, h3, .itemname, .eqname');
const name = nameEl ? (nameEl.textContent || '').trim() : '';
// Extract item ID from URL
const idMatch = window.location.href.match(/eqid[=/](\d+)/);
// Try to get item ID from URL
const idMatch = window.location.href.match(/eqids?\[\]=(\d+)/);
const itemId = idMatch ? idMatch[1] : '';
// Find the stat table (grey bordered table with stat rows)
const statTables = mainPane.querySelectorAll('table.gry, table[class*="stat"]');
// Item name from the page title area
const nameEl = mainPane.querySelector('h3, .itemname, .eqname');
const name = nameEl ? (nameEl.textContent || '').trim() : '';
// Read all stat tables
const stats = {};
statTables.forEach(tbl => {
const rows = tbl.querySelectorAll('tr');
rows.forEach(row => {
mainPane.querySelectorAll('table.gry, table.grl').forEach(tbl => {
tbl.querySelectorAll('tr').forEach(row => {
const cells = row.querySelectorAll('td');
if (cells.length >= 2) {
const key = (cells[0].textContent || '').trim().replace(':', '');
@ -3426,103 +3585,32 @@ function scrapeModifyDetail() {
});
});
// Durability
const durMatch = text.match(/Durability:\s*(\d+\s*\/\s*\d+)/i);
// Potency
const potMatch = text.match(/(?:Potency|Item World):\s*([^\n]+)/i);
const text = mainPane.textContent || '';
const durMatch = text.match(/Durability:\s*(\d+)\s*\/\s*(\d+)/i);
const potMatch = text.match(/(?:Potency|Item World)\s*:\s*([^\n<]+)/i);
const item = {
id: itemId,
name: name,
stats: stats,
durability: durMatch ? durMatch[1] : '',
durability: durMatch ? `${durMatch[1]}/${durMatch[2]}` : '',
potency: potMatch ? potMatch[1].trim() : '',
source: 'modify',
scrapedAt: Date.now(),
};
// Save or update
if (item.id) {
const db = getGearDB();
const idx = db.findIndex(e => e.id === item.id && e.source === 'modify');
if (idx >= 0) {
db[idx] = item;
} else {
db.push(item);
}
if (idx >= 0) db[idx] = item;
else db.push(item);
saveGearDB(db);
console.log(`%c[HV] Gear: scraped modify detail for ${name}`, 'color:#0f0');
console.log(`%c[HV] Gear: scraped modify detail for ${item.name || itemId}`, 'color:#0f0');
}
return item;
}
// ── Auto-detect and scrape current page ──
function autoScrapeGear() {
const url = window.location.href || '';
const ss = url.match(/ss=(\w+)/);
if (url.includes('ss=ch')) {
return scrapeCharacterGear();
}
if (url.includes('ss=am')) {
if (url.includes('eq=modify')) {
return scrapeModifyDetail();
}
return scrapeArmoryInventory();
}
return [];
}
// ── Stat block parser ──
// The character page stats look like: "ADB +X | Damage X-Y | Crit X%"
function parseStatBlock(text) {
const stats = {};
// Find common stat patterns
const patterns = [
{ key: 'adb', re: /ADB\s*[+:]\s*([\d.]+)/i },
{ key: 'damage', re: /Damage\s*[+:]?\s*(\d+\s*-\s*\d+)/i },
{ key: 'critChance', re: /(?:Crit(?:ical)?\s*(?:Chance|Rate)?|CTH)\s*[+:]?\s*([\d.]+)%?/i },
{ key: 'critDamage', re: /(?:Crit\s*Damage|CDB)\s*[+:]?\s*([\d.]+)%?/i },
{ key: 'attackSpeed', re: /(?:Attack\s*Speed|Speed)\s*[+:]?\s*([\d.]+)%?/i },
{ key: 'parry', re: /Parry\s*[+:]?\s*([\d.]+)%?/i },
{ key: 'evade', re: /Evade\s*[+:]?\s*([\d.]+)%?/i },
{ key: 'block', re: /Block\s*[+:]?\s*([\d.]+)%?/i },
{ key: 'physMit', re: /(?:Physical\s*(?:Mitigation|Resist)|PMit)\s*[+:]?\s*([\d.]+)%?/i },
{ key: 'magMit', re: /(?:Magical\s*(?:Mitigation|Resist)|MMit)\s*[+:]?\s*([\d.]+)%?/i },
{ key: 'str', re: /\bSTR\s*[+:]?\s*([\d.]+)/i },
{ key: 'dex', re: /\bDEX\s*[+:]?\s*([\d.]+)/i },
{ key: 'end', re: /\bEND\s*[+:]?\s*([\d.]+)/i },
{ key: 'agi', re: /\bAGI\s*[+:]?\s*([\d.]+)/i },
{ key: 'wis', re: /\bWIS\s*[+:]?\s*([\d.]+)/i },
{ key: 'int', re: /\bINT\s*[+:]?\s*([\d.]+)/i },
{ key: 'burden', re: /Burden\s*[+:]?\s*([\d.]+)/i },
{ key: 'interference', re: /Interference\s*[+:]?\s*([\d.]+)/i },
];
patterns.forEach(p => {
const m = text.match(p.re);
if (m) stats[p.key] = m[1].trim();
});
return stats;
}
// ── Quick summary for console ──
function logGearSummary() {
const db = getGearDB();
const equipped = db.filter(e => e.source === 'character');
const armory = db.filter(e => e.source === 'armory');
console.log(`%c[HV] 📦 Gear DB: ${db.length} total (${equipped.length} equipped, ${armory.length} armory)`, 'color:#0f0');
equipped.forEach(item => {
const name = item.name || 'unknown';
const adb = item.stats?.adb || '?';
console.log(` 🗡 ${name} | ADB: +${adb} | ${item.durability || ''}`);
});
}
// ═══════════════════════════════════════════════════════════════════════
// BATTLE LOGGER — saves raw battle log lines to localStorage in real time
// ═══════════════════════════════════════════════════════════════════════
@ -3926,8 +4014,14 @@ function initializeBattle() {
}
// Auto-scrape gear data on character/armory pages
if (STATE.page === 'character' || STATE.page === 'armory' || window.location.href.includes('ss=ch') || window.location.href.includes('ss=am')) {
setTimeout(autoScrapeGear, 500); // wait for page to render
if (window.location.href.includes('ss=eq')) {
// Character equipment page: trigger tooltip popups for full stats
setTimeout(() => {
triggerAllTooltips(); // populate popup_box for each item
setTimeout(autoScrapeGear, 300); // then scrape
}, 500);
} else if (window.location.href.includes('ss=ch') || window.location.href.includes('ss=am')) {
setTimeout(autoScrapeGear, 500);
}
STATE.battleInitialized = true;

View file

@ -2,7 +2,7 @@
// CONFIG — default settings
// ═══════════════════════════════════════════════════════════════════════
const VERSION = '0.14.8';
const VERSION = '0.14.9';
const CFG = {
// — Battle automation

View file

@ -2,150 +2,260 @@
// GEAR SCRAPER — capture full equipment details for analysis
// ═══════════════════════════════════════════════════════════════════════
// Usage:
// 1. Visit Character page (?ss=ch) — scrapes equipped gear with all stats
// 2. Visit Armory pages (?ss=am) — scrapes inventory items
// 3. Data saved to localStorage['hvunified_geardb']
// 4. Query with: getGearDB() to read the full database
// 1. Visit Character Equipment page (?s=Character&ss=eq) — equipped gear
// 2. Visit Armory page (?s=Bazaar&ss=am) — inventory listing
// 3. Visit Modify page (?s=Bazaar&ss=am&screen=modify&eqids[]=ID) — full stats
// 4. Data saved to localStorage['hvunified_geardb']
// 5. Query with: HV.gear() or HV.gearSummary()
const GEAR_DB_KEY = SP + 'geardb';
// ── Public API ──
function getGearDB() {
try { return JSON.parse(localStorage[GEAR_DB_KEY] || '[]'); } catch (e) { return []; }
}
function saveGearDB(db) {
try { localStorage[GEAR_DB_KEY] = JSON.stringify(db); } catch (e) {}
}
function logGearSummary() {
const db = getGearDB();
const equipped = db.filter(e => e.source === 'character');
const armory = db.filter(e => e.source === 'armory');
console.log(`%c[HV] 📦 Gear DB: ${db.length} total (${equipped.length} equipped, ${armory.length} armory)`, 'color:#0f0');
equipped.forEach(item => {
console.log(` 🗡 ${item.name} | ID: ${item.id} | ${item.slotType || ''}`);
});
armory.forEach(item => {
console.log(` 📦 ${item.name} | ID: ${item.id} | ${item.category || ''}`);
});
}
// ── Scrape character page: equipped gear with full stats ──
// The HV character page (?ss=ch) shows each equipped item with:
// - Name, quality, prefix, suffix
// - Stats in the green/blue stat table
// - Potency, durability, level requirements
function scrapeCharacterGear() {
// ── Parse the tooltip popup box for full item stats ──
// The #popup_box div appears on hover with a detailed stat breakdown:
// <div class="eq">
// <div class="eqt">Light Armor & Level 115 & Tradeable</div>
// <div class="eqr">Condition: 55% & Energy: N/A</div>
// <div class="eqc">Burden: 7.1 & Interference: 2.1</div>
// <div class="ex">...</div>
// <div class="ep ep3">Primary Attributes</div>
// </div>
function parseTooltipPopup() {
const popup = document.getElementById('popup_box');
if (!popup) return null;
const text = popup.textContent || '';
// Extract item name (first div child text, before nested eq)
const nameDiv = popup.querySelector(':scope > div:first-child');
const name = nameDiv ? (nameDiv.textContent || '').trim() : '';
const eq = popup.querySelector('.eq');
if (!eq) return null;
const stats = {};
// Type line: "Light Armor Level 115 Tradeable"
const eqt = eq.querySelector('.eqt');
if (eqt) {
const eqtText = eqt.textContent || '';
const typeMatch = eqtText.match(/^([A-Za-z\s]+?)(?:\s{2,}|$)/);
if (typeMatch) stats.type = typeMatch[1].trim();
const lvMatch = eqtText.match(/Level\s*(\d+)/i);
if (lvMatch) stats.level = lvMatch[1];
const tradeMatch = eqtText.match(/(Tradeable|Soulbound|Blessed)/);
if (tradeMatch) stats.bind = tradeMatch[1];
}
// Condition / Energy
const eqr = eq.querySelector('.eqr');
if (eqr) {
const condMatch = (eqr.textContent || '').match(/Condition:\s*(\d+)%/i);
if (condMatch) stats.condition = condMatch[1];
const engMatch = (eqr.textContent || '').match(/Energy:\s*([^\s]+)/i);
if (engMatch) stats.energy = engMatch[1];
}
// Burden / Interference
const eqc = eq.querySelector('.eqc');
if (eqc) {
const burMatch = (eqc.textContent || '').match(/Burden:\s*([\d.]+)/i);
if (burMatch) stats.burden = burMatch[1];
const intMatch = (eqc.textContent || '').match(/Interference:\s*([\d.]+)/i);
if (intMatch) stats.interference = intMatch[1];
}
// Stats from .ex (main stat block)
const ex = eq.querySelector('.ex');
if (ex) {
ex.querySelectorAll(':scope > div').forEach(stat => {
const label = stat.querySelector(':scope > div:first-child');
const value = stat.querySelector(':scope > div:nth-child(2) span, :scope > div:nth-child(2)');
if (label && value) {
const key = (label.textContent || '').trim().replace(/[^A-Za-z\s]/g, '').trim();
const val = (value.textContent || '').trim();
if (key && val) stats[key] = val;
}
});
}
// Extra stat groups (.ep)
eq.querySelectorAll('.ep').forEach(group => {
const groupTitle = group.querySelector(':scope > div:first-child');
const groupName = groupTitle ? (groupTitle.textContent || '').trim() : '';
group.querySelectorAll(':scope > div:not(:first-child)').forEach(stat => {
const label = stat.querySelector(':scope > div:first-child');
const value = stat.querySelector(':scope > div:nth-child(2) span, :scope > div:nth-child(2)');
if (label && value) {
const key = (label.textContent || '').trim().replace(/[^A-Za-z\s]/g, '').trim();
const val = (value.textContent || '').trim();
if (key && val) stats[key] = val;
}
});
});
return { name, stats };
}
// ── Scrape Character Equipment page (?s=Character&ss=eq) ──
// DOM structure:
// #eqsb > .eqb (equipment slots)
// .eqb div: "Exquisite Estoc of Slaughter" (name)
// .eqb onmouseover="equips.set(ITEM_ID,'slot_pane',...)" (ID)
// #popup_box (tooltip with full stats, populated by hovering)
function scrapeCharacterEquip() {
const scraped = [];
// Each equipment slot on the character page has class 'eqp' inside the
// character display table
const eqSlots = $$('.eqp, .eqslot, .equipped-item');
// Read each equipment slot in #eqsb
const slots = document.querySelectorAll('#eqsb > .eqb');
eqSlots.forEach(slot => {
// Try to find the item name from the tooltip trigger
const link = slot.querySelector('a[onmouseover*="inv_tooltip"]') ||
slot.querySelector('[onmouseover*="inv_tooltip"]');
if (!link) return;
const omo = link.getAttribute('onmouseover') || '';
// Extract item ID from tooltip call: inv_tooltip('ITEM_ID')
const idMatch = omo.match(/inv_tooltip\s*\(\s*['"](\d+)['"]/);
slots.forEach(slot => {
// Get item ID from onmouseover
const omo = slot.getAttribute('onmouseover') || slot.querySelector('[onmouseover]')?.getAttribute('onmouseover') || '';
const idMatch = omo.match(/equips\.set\((\d+)/);
const itemId = idMatch ? idMatch[1] : '';
// Extract name from the alt/title text
const name = (link.getAttribute('title') || link.getAttribute('alt') || '').trim();
// Get item name from the child div (text node)
const nameDiv = slot.querySelector(':scope > div:not([class])') || slot.querySelector('div');
const name = nameDiv ? (nameDiv.textContent || '').trim() : '';
// Extract stat block from the adjacent table/div
// Stats are in a grey table showing: ADB, Damage, Crit, etc.
const statEl = slot.querySelector('.eqstatblock, .item-stats, .gry, table.gry');
const stats = statEl ? parseStatBlock(statEl.textContent || '') : {};
// Check if slot is disabled
const disabled = slot.classList.contains('eqdisabled');
// Durability
const durEl = slot.querySelector('[class*="dur"], [class*="durability"]');
const durability = durEl ? (durEl.textContent || '').trim() : '';
// Potency / Item World level
const potEl = slot.querySelector('[class*="potency"], [class*="iw"]');
const potency = potEl ? (potEl.textContent || '').trim() : '';
// Slot type (weapon, armor, etc.) from parent container
const slotParent = slot.closest('tr, div, td');
const slotType = slotParent ? (slotParent.className || '') : '';
// Level requirement
const lvEl = slot.querySelector('[class*="req"], [class*="level"]');
const levelReq = lvEl ? (lvEl.textContent || '').match(/\d+/) : null;
// Determine slot type from parent structure
const slotType = '';
scraped.push({
id: itemId,
name: name,
slotType: slotType,
stats: stats,
durability: durability,
potency: potency,
levelReq: levelReq ? parseInt(levelReq[0]) : 0,
disabled: disabled,
source: 'character',
scrapedAt: Date.now(),
});
});
// If we found character gear, merge or replace
// Read the popup box for the currently-displayed tooltip
const tooltip = parseTooltipPopup();
// Merge tooltip stats with the matching item
if (tooltip && tooltip.name) {
const matchIdx = scraped.findIndex(s => tooltip.name.includes(s.name) || s.name.includes(tooltip.name));
if (matchIdx >= 0) {
scraped[matchIdx].stats = tooltip.stats;
} else if (scraped.length > 0) {
// If no match, attach to first item as extra info
scraped[0].tooltipStats = tooltip.stats;
}
}
if (scraped.length > 0) {
const db = getGearDB();
// Remove old character entries with same IDs
const filtered = db.filter(e => !(e.source === 'character' && scraped.some(s => s.id === e.id)));
const filtered = db.filter(e => !(e.source === 'character'));
saveGearDB([...filtered, ...scraped]);
console.log(`%c[HV] Gear: scraped ${scraped.length} equipped items from character page`, 'color:#0f0');
console.log(`%c[HV] Gear: scraped ${scraped.length} equipped items (${scraped.filter(s => s.stats).length} with tooltip stats)`, 'color:#0f0');
}
return scraped;
}
// ── Scrape armory inventory page ──
function scrapeArmoryInventory() {
// ── Scrape Armory Organize page (?s=Bazaar&ss=am&screen=organize) ──
// DOM structure:
// #equiplist > table > tbody > tr
// tr.eqtplabel: category name
// tr[onmouseover]: equipment row with:
// onmouseover="hover_equip(ITEM_ID)"
// input[name="eqids[]"] value="ITEM_ID"
// label text: item name
// #equipinfo > .showequip > .eq: tooltip for selected item
function scrapeArmory() {
const scraped = [];
const equipList = document.getElementById('equiplist');
if (!equipList) return scraped;
let currentCategory = '';
$$('tr', equipList).forEach(row => {
if (row.className === 'eqtplabel') {
const rows = equipList.querySelectorAll('table tr');
rows.forEach(row => {
// Category header
if (row.classList.contains('eqtplabel')) {
currentCategory = (row.textContent || '').trim();
return;
}
const cb = row.querySelector('input[name="eqids[]"]');
if (!cb) return;
// Skip select-all header row
if (row.classList.contains('eqselall')) return;
const id = cb.value;
// Item ID from onmouseover
const omo = row.getAttribute('onmouseover') || '';
const idMatch = omo.match(/hover_equip\((\d+)\)/);
const itemId = idMatch ? idMatch[1] : '';
// Item name from label
const label = row.querySelector('label');
const rawName = label ? (label.textContent || '').trim() : '';
// Parse name into quality + base name
const equipped = rawName.includes('🗡');
const locked = rawName.includes('🔒');
const pinned = rawName.includes('📌');
const stored = rawName.includes('📦');
const cleanName = rawName.replace(/[🗡🔒📌📦🛡\s]/g, '').trim();
// Try to parse potency info from adjacent cells
const cells = row.querySelectorAll('td');
let potency = '';
let durability = '';
if (cells.length >= 3) {
potency = (cells[cells.length - 2].textContent || '').trim();
durability = (cells[cells.length - 1].textContent || '').trim();
let name = label ? (label.textContent || '').trim() : '';
// Strip checkbox indicator
const cb = label ? label.querySelector('input') : null;
if (cb) {
name = (label.textContent || '').replace(cb.outerHTML, '').trim();
}
// Checkbox value as fallback ID
const checkbox = row.querySelector('input[name="eqids[]"]');
const cbId = checkbox ? checkbox.value : '';
if (!name && !itemId) return;
scraped.push({
id: id,
name: cleanName,
id: itemId || cbId,
name: name || 'Unknown',
category: currentCategory,
equipped: equipped,
locked: locked,
pinned: pinned,
stored: stored,
potency: potency,
durability: durability,
source: 'armory',
scrapedAt: Date.now(),
});
});
// Read the right-side info pane for the currently-hovered item's stats
const equipInfo = document.getElementById('equipinfo');
if (equipInfo) {
const showEquip = equipInfo.querySelector('.showequip');
if (showEquip) {
const link = showEquip.querySelector('a');
const infoName = link ? (link.textContent || '').trim() : '';
const eq = showEquip.querySelector('.eq');
if (eq) {
const infoText = eq.textContent || '';
// Find matching item and attach raw stats
const matchIdx = scraped.findIndex(s => infoName.includes(s.name) || s.name.includes(infoName));
if (matchIdx >= 0) {
scraped[matchIdx].infoText = infoText;
// Parse condition
const condMatch = infoText.match(/Condition:\s*(\d+)%/i);
if (condMatch) scraped[matchIdx].condition = parseInt(condMatch[1]);
}
}
}
}
if (scraped.length > 0) {
const db = getGearDB();
// Remove old armory entries
const filtered = db.filter(e => e.source !== 'armory');
saveGearDB([...filtered, ...scraped]);
console.log(`%c[HV] Gear: scraped ${scraped.length} armory items`, 'color:#0f0');
@ -153,27 +263,76 @@ function scrapeArmoryInventory() {
return scraped;
}
// ── Scrape equipment modify detail page (full stats) ──
// The Modify page (?ss=am&eq=modify&eqid=XXXX) shows one item with ALL details
// ── Trigger hover on each character slot to populate tooltip ──
// HV's equips.set(id, 'slot_pane', w, h) populates #popup_box with stats.
// We call it for each item in sequence to capture all tooltips.
function triggerAllTooltips() {
const slots = document.querySelectorAll('#eqsb > .eqb');
const results = [];
slots.forEach(slot => {
const omo = slot.getAttribute('onmouseover') || '';
const idMatch = omo.match(/equips\.set\((\d+)/);
if (idMatch && typeof equips !== 'undefined' && equips.set) {
// Trigger the tooltip
equips.set(parseInt(idMatch[1]), 'slot_pane', 250, 130);
// Read the popup
const tooltip = parseTooltipPopup();
if (tooltip && tooltip.name) {
results.push(tooltip);
}
}
});
return results;
}
// ── Auto-detect and scrape current page ──
function autoScrapeGear() {
const url = window.location.href || '';
// Character equipment page
if (url.includes('ss=eq')) {
// Trigger tooltips for all items to populate popup_box
const tooltips = triggerAllTooltips();
// Then scrape
return scrapeCharacterEquip();
}
// Character summary page — try reading the slots
if (url.includes('ss=ch')) {
return scrapeCharacterEquip();
}
// Armory pages
if (url.includes('ss=am')) {
if (url.includes('screen=modify')) {
return scrapeModifyDetail();
}
return scrapeArmory();
}
return [];
}
// ── Scrape equipment modify detail page ──
function scrapeModifyDetail() {
// This page shows detailed stat tables. Parse the main stat block.
const mainPane = document.getElementById('mainpane');
if (!mainPane) return null;
const text = mainPane.textContent || '';
const nameEl = mainPane.querySelector('h2, h3, .itemname, .eqname');
const name = nameEl ? (nameEl.textContent || '').trim() : '';
// Extract item ID from URL
const idMatch = window.location.href.match(/eqid[=/](\d+)/);
// Try to get item ID from URL
const idMatch = window.location.href.match(/eqids?\[\]=(\d+)/);
const itemId = idMatch ? idMatch[1] : '';
// Find the stat table (grey bordered table with stat rows)
const statTables = mainPane.querySelectorAll('table.gry, table[class*="stat"]');
// Item name from the page title area
const nameEl = mainPane.querySelector('h3, .itemname, .eqname');
const name = nameEl ? (nameEl.textContent || '').trim() : '';
// Read all stat tables
const stats = {};
statTables.forEach(tbl => {
const rows = tbl.querySelectorAll('tr');
rows.forEach(row => {
mainPane.querySelectorAll('table.gry, table.grl').forEach(tbl => {
tbl.querySelectorAll('tr').forEach(row => {
const cells = row.querySelectorAll('td');
if (cells.length >= 2) {
const key = (cells[0].textContent || '').trim().replace(':', '');
@ -183,99 +342,28 @@ function scrapeModifyDetail() {
});
});
// Durability
const durMatch = text.match(/Durability:\s*(\d+\s*\/\s*\d+)/i);
// Potency
const potMatch = text.match(/(?:Potency|Item World):\s*([^\n]+)/i);
const text = mainPane.textContent || '';
const durMatch = text.match(/Durability:\s*(\d+)\s*\/\s*(\d+)/i);
const potMatch = text.match(/(?:Potency|Item World)\s*:\s*([^\n<]+)/i);
const item = {
id: itemId,
name: name,
stats: stats,
durability: durMatch ? durMatch[1] : '',
durability: durMatch ? `${durMatch[1]}/${durMatch[2]}` : '',
potency: potMatch ? potMatch[1].trim() : '',
source: 'modify',
scrapedAt: Date.now(),
};
// Save or update
if (item.id) {
const db = getGearDB();
const idx = db.findIndex(e => e.id === item.id && e.source === 'modify');
if (idx >= 0) {
db[idx] = item;
} else {
db.push(item);
}
if (idx >= 0) db[idx] = item;
else db.push(item);
saveGearDB(db);
console.log(`%c[HV] Gear: scraped modify detail for ${name}`, 'color:#0f0');
console.log(`%c[HV] Gear: scraped modify detail for ${item.name || itemId}`, 'color:#0f0');
}
return item;
}
// ── Auto-detect and scrape current page ──
function autoScrapeGear() {
const url = window.location.href || '';
const ss = url.match(/ss=(\w+)/);
if (url.includes('ss=ch')) {
return scrapeCharacterGear();
}
if (url.includes('ss=am')) {
if (url.includes('eq=modify')) {
return scrapeModifyDetail();
}
return scrapeArmoryInventory();
}
return [];
}
// ── Stat block parser ──
// The character page stats look like: "ADB +X | Damage X-Y | Crit X%"
function parseStatBlock(text) {
const stats = {};
// Find common stat patterns
const patterns = [
{ key: 'adb', re: /ADB\s*[+:]\s*([\d.]+)/i },
{ key: 'damage', re: /Damage\s*[+:]?\s*(\d+\s*-\s*\d+)/i },
{ key: 'critChance', re: /(?:Crit(?:ical)?\s*(?:Chance|Rate)?|CTH)\s*[+:]?\s*([\d.]+)%?/i },
{ key: 'critDamage', re: /(?:Crit\s*Damage|CDB)\s*[+:]?\s*([\d.]+)%?/i },
{ key: 'attackSpeed', re: /(?:Attack\s*Speed|Speed)\s*[+:]?\s*([\d.]+)%?/i },
{ key: 'parry', re: /Parry\s*[+:]?\s*([\d.]+)%?/i },
{ key: 'evade', re: /Evade\s*[+:]?\s*([\d.]+)%?/i },
{ key: 'block', re: /Block\s*[+:]?\s*([\d.]+)%?/i },
{ key: 'physMit', re: /(?:Physical\s*(?:Mitigation|Resist)|PMit)\s*[+:]?\s*([\d.]+)%?/i },
{ key: 'magMit', re: /(?:Magical\s*(?:Mitigation|Resist)|MMit)\s*[+:]?\s*([\d.]+)%?/i },
{ key: 'str', re: /\bSTR\s*[+:]?\s*([\d.]+)/i },
{ key: 'dex', re: /\bDEX\s*[+:]?\s*([\d.]+)/i },
{ key: 'end', re: /\bEND\s*[+:]?\s*([\d.]+)/i },
{ key: 'agi', re: /\bAGI\s*[+:]?\s*([\d.]+)/i },
{ key: 'wis', re: /\bWIS\s*[+:]?\s*([\d.]+)/i },
{ key: 'int', re: /\bINT\s*[+:]?\s*([\d.]+)/i },
{ key: 'burden', re: /Burden\s*[+:]?\s*([\d.]+)/i },
{ key: 'interference', re: /Interference\s*[+:]?\s*([\d.]+)/i },
];
patterns.forEach(p => {
const m = text.match(p.re);
if (m) stats[p.key] = m[1].trim();
});
return stats;
}
// ── Quick summary for console ──
function logGearSummary() {
const db = getGearDB();
const equipped = db.filter(e => e.source === 'character');
const armory = db.filter(e => e.source === 'armory');
console.log(`%c[HV] 📦 Gear DB: ${db.length} total (${equipped.length} equipped, ${armory.length} armory)`, 'color:#0f0');
equipped.forEach(item => {
const name = item.name || 'unknown';
const adb = item.stats?.adb || '?';
console.log(` 🗡 ${name} | ADB: +${adb} | ${item.durability || ''}`);
});
}

View file

@ -1,7 +1,7 @@
// ==UserScript==
// @name HV Unified
// @namespace hvunified
// @version 0.14.8
// @version 0.14.9
// @description HV Unified — battle automation, guidance, and UI enhancements for HentaiVerse
// @author GaboGG + Hermes
// @match *://*.hentaiverse.org/*

View file

@ -103,8 +103,14 @@ function initializeBattle() {
}
// Auto-scrape gear data on character/armory pages
if (STATE.page === 'character' || STATE.page === 'armory' || window.location.href.includes('ss=ch') || window.location.href.includes('ss=am')) {
setTimeout(autoScrapeGear, 500); // wait for page to render
if (window.location.href.includes('ss=eq')) {
// Character equipment page: trigger tooltip popups for full stats
setTimeout(() => {
triggerAllTooltips(); // populate popup_box for each item
setTimeout(autoScrapeGear, 300); // then scrape
}, 500);
} else if (window.location.href.includes('ss=ch') || window.location.href.includes('ss=am')) {
setTimeout(autoScrapeGear, 500);
}
STATE.battleInitialized = true;