Adventure of Chaos helper

helper for AOC

  1. // ==UserScript==
  2. // @name Adventure of Chaos helper
  3. // @namespace http://www.x4code.com
  4. // @version 1.6
  5. // @author Manro
  6. // @match http://cdn1.x4code.com/game/*
  7. // @match http://cdn2.x4code.com/game/*
  8. // @match http://cdn3.x4code.com/game/*
  9. // @match http://cdn4.x4code.com/game/*
  10. // @match http://cdn5.x4code.com/game/*
  11. // @match http://cdn6.x4code.com/game/*
  12. // @match http://www.x4code.com/game/*
  13. // @match http://112.74.129.222/game/*
  14. // @grant none
  15. // @description helper for AOC
  16. // ==/UserScript==
  17.  
  18.  
  19.  
  20. //impl script
  21. !function(a){"use strict";var b=function(a,c){var d=/[^\w\-\.:]/.test(a)?new Function(b.arg+",tmpl","var _e=tmpl.encode"+b.helper+",_s='"+a.replace(b.regexp,b.func)+"';return _s;"):b.cache[a]=b.cache[a]||b(b.load(a));return c?d(c,b):function(a){return d(a,b)}};b.cache={},b.load=function(a){return document.getElementById(a).innerHTML},b.regexp=/([\s'\\])(?!(?:[^{]|\{(?!%))*%\})|(?:\{%(=|#)([\s\S]+?)%\})|(\{%)|(%\})/g,b.func=function(a,b,c,d,e,f){return b?{"\n":"\\n","\r":"\\r"," ":"\\t"," ":" "}[b]||"\\"+b:c?"="===c?"'+_e("+d+")+'":"'+("+d+"==null?'':"+d+")+'":e?"';":f?"_s+='":void 0},b.encReg=/[<>&"'\x00]/g,b.encMap={"<":"&lt;",">":"&gt;","&":"&amp;",'"':"&quot;","'":"&#39;"},b.encode=function(a){return(null==a?"":""+a).replace(b.encReg,function(a){return b.encMap[a]||""})},b.arg="o",b.helper=",print=function(s,e){_s+=e?(s==null?'':s):_e(s);},include=function(s,d){_s+=tmpl(s,d);}","function"==typeof define&&define.amd?define(function(){return b}):a.tmpl=b}(this);
  22.  
  23.  
  24. (function($) {
  25. $.fn.tips = function(options) {
  26. var opts = $.extend({}, $.fn.showinfo.defaults, options);
  27. if ($("#ToolsTip").size() == 0) $('<div id="ToolsTip"></div>').hide().appendTo('body');
  28. var $ToolsTip = $("#ToolsTip");
  29. this.bind('mouseover mousemove mouseout', function(event) {
  30. var TarData = $(this).attr('title') || $(this).data('title');
  31. $(this).removeAttr('title');
  32. $(this).data('title',TarData);
  33. switch (event.type){
  34. case 'mousemove':
  35. var top = event.pageY + 12,
  36. left = event.pageX + 12;
  37. if ($ToolsTip.innerHeight() + top + 12 > $(document).height()) top = $(document).height() - $ToolsTip.innerHeight() - 20;
  38. $ToolsTip.css({top: top, left: left}).show();
  39. case 'mouseover':
  40. $ToolsTip.html(TarData);
  41. break;
  42. case 'mouseout':
  43. $ToolsTip.removeClass().removeData().empty().hide();
  44. break;
  45. }
  46. });
  47. }
  48.  
  49. $.fn.showinfo = function(options) {
  50. var opts = $.extend({}, $.fn.showinfo.defaults, options);
  51. if ($("#InfoTip").size() == 0) {
  52. $('<div id="InfoTip"></div>').hide().appendTo('body');
  53. }
  54. if ($('[infotip]').size() == 0) {
  55. $('<div id="InfoTip" infotip></div>').hide().appendTo('body');
  56. }
  57. var $InfoTip = $("#InfoTip");
  58. var $InfoTip2 = $('[infotip]').css({
  59. 'position': 'absolute',
  60. 'z-index': '10000',
  61. 'border-radius': '4px',
  62. 'border-width': '3px',
  63. 'border-style': 'ridge',
  64. 'min-width': '160px',
  65. 'max-width': '200px',
  66. 'padding': '5px 10px'
  67. });
  68.  
  69.  
  70. this.bind('mouseover mouseout mousemove', function(event) {
  71. var equips = $('#equips button').map(function(index, elem) {
  72. return $(elem).data('info');
  73. });
  74. var TarData = $(this).data('info');
  75.  
  76.  
  77. var showCompare = this.tagName != 'BUTTON';
  78. var compareData = null;
  79. var tarType = TarData.type.substr(0,1);
  80. for (var i = 0; i < equips.length; i++) {
  81. var equip = equips[i];
  82. if (equip.type.substr(0,1) == tarType) {
  83. compareData =equip;
  84. break;
  85. }
  86. }
  87.  
  88. var showid = '_';
  89. if (TarData.eid) showid += TarData.eid+"_";
  90. if (TarData.tid) showid += TarData.tid;
  91. switch (event.type){
  92. case 'mousemove':
  93. var top = event.pageY + 12,
  94. left = event.pageX + 12;
  95. if ($InfoTip.innerHeight() + top + 12 > $(document).height()) top = $(document).height() - $InfoTip.innerHeight() - 12;
  96. if ($InfoTip.innerWidth() + left + 12 > $(document).width()) left = event.pageX - $InfoTip.innerWidth() - 12;
  97. $InfoTip.css({top: top, left: left}).show();
  98. if (showCompare && compareData) {
  99. $InfoTip2.css({top: top, left: left+$InfoTip.innerWidth()+ 5}).show();
  100. }
  101. if ($InfoTip.data('show') == showid) { return false; }
  102. $InfoTip.data('show',showid);
  103. case 'mouseover':
  104. // console.log(TarData.pz);
  105. $InfoTip.addClass('pz'+TarData.epz);
  106. var TipData = $.fn.showinfo.ext(TarData,showCompare&&compareData?compareData:null);
  107. $InfoTip.html(TipData);
  108.  
  109. if (showCompare) {
  110. $InfoTip2.addClass('pz'+compareData.epz);
  111. var TipData2 = $.fn.showinfo.ext(compareData);
  112. $InfoTip2.html(TipData2);
  113. }
  114. break;
  115. case 'mouseout':
  116. $InfoTip.removeClass().removeData().empty().hide();
  117. $InfoTip2.removeClass().removeData().empty().hide();
  118. break;
  119. }
  120. });
  121. }
  122. $.fn.showinfo.ext = function(v,compare) {
  123. var rtHtml = v.lv > 0 ? "<span class='lv'>Lv:"+v.lv+"</span>":"";
  124. rtHtml += "<h3>"+v.name;
  125. if (v.qlv > 0) { rtHtml += " +"+v.qlv; };
  126. rtHtml += "</h3>";
  127. var info = v.info ? $.parseJSON(v.info) : {};
  128. var addinfo = v.addinfo ? $.parseJSON(v.addinfo) : {};
  129. var compreAddinfo = null;
  130. if (compare) {
  131. compreAddinfo = compare.addinfo ? $.parseJSON(compare.addinfo) : null;
  132. }
  133. var colorkey = [];
  134. if (Object.keys(addinfo).length){
  135. for(var key in addinfo){
  136. if(info.hasOwnProperty(key)) {
  137. info[key] = info[key] + addinfo[key];
  138. colorkey[key] = 1;
  139. }
  140. }
  141. }
  142. rtHtml += "<p>";
  143. if (v.rank != 0 && v.rank) rtHtml += "["+$.fn.showinfo.rankstr(v.rank)+"] ";
  144. rtHtml += '['+$.fn.showinfo.typestr(v.type)+'] ';
  145. if (v.job != 0) rtHtml += "["+$.fn.showinfo.jobstr(v.job)+"]";
  146. rtHtml += "</p>";
  147. if (info.att_min+info.att_max > 0) {
  148. rtHtml += "攻击力:<b>";
  149. rtHtml += colorkey.att_min ? "<i>"+info.att_min+"</i> - " : info.att_min + " - ";
  150. rtHtml += colorkey.att_max ? "<i>"+info.att_max+"</i></b>" : info.att_max+"</b>";
  151. };
  152. if (info.att_min) { delete info.att_min; }
  153. if (info.att_max) { delete info.att_max; }
  154. // console.log(info.length);
  155. if (Object.keys(info).length){
  156. rtHtml += "<ul class='info'>";
  157. for(var key in info){
  158. // console.log(key+' : '+info[key]);
  159. var tags = $.fn.showinfo.extinfo(key);
  160. rtHtml += "<li>"+tags[0]+":<b>";
  161. rtHtml += colorkey[key] ? "<i>"+info[key]+tags[1]+"</i></b></li>" : info[key]+tags[1]+"</b></li>";
  162. }
  163. rtHtml += "</ul>"
  164. }
  165. if (Object.keys(addinfo).length){
  166. rtHtml += "<ul class='addinfo'>[附加属性]";
  167. for(var key in addinfo){
  168. // console.log(key+' : '+info[key]);
  169. var tags = $.fn.showinfo.extinfo(key);
  170. var compareString = '';
  171. if (compreAddinfo && compreAddinfo.hasOwnProperty(key)) {
  172. compareString = parseInt(addinfo[key]) - parseInt(compreAddinfo[key]);
  173. }
  174. rtHtml += "<li>"+tags[0]+":"+addinfo[key]+tags[1]+"<span class='pull-right'>"+compareString+"</span></li>";
  175. }
  176. rtHtml += "</ul>"
  177. }
  178. rtHtml += v.num ? "<p>数量:"+v.num+"</p>" : "";
  179. rtHtml += v.about ? "<p><q>"+v.about+"</q></p>" : "";
  180. // if (v.eid) { rtHtml += "<p>"+v.eid+"</p>" };
  181. return rtHtml;
  182. }
  183. $.fn.showinfo.extinfo = function(key){
  184. var data = {
  185. 'hp' : ['生命值',''],
  186. 'pow' : ['强度',''],
  187. 'dex' : ['敏捷',''],
  188. 'con' : ['体质',''],
  189. 'att_min' : ['最小攻击',''],
  190. 'att_max' : ['最大攻击',''],
  191. 'def' : ['防御',''],
  192. 'eva' : ['闪避机率',' %'],
  193. 'arm' : ['护甲',''],
  194. 'dmgeff' : ['伤害减免',' %'],
  195. 'hit' : ['命中机率',' %'],
  196. 'cri' : ['暴击机率',' %'],
  197. 'cridmg' : ['暴击伤害',' %'],
  198. 'rec' : ['恢复',' %'],
  199. 'add_hp' : ['生命值',' %'],
  200. 'add_att' : ['攻击力',' %'],
  201. 'add_def' : ['防御增强',' %'],
  202. 'add_eva' : ['闪避机率',' %'],
  203. 'add_arm' : ['护甲增强',' %'],
  204. 'add_dmgeff' : ['伤害减免',' %'],
  205. 'add_hit' : ['命中机率',' %'],
  206. 'add_cri' : ['暴击机率',' %'],
  207. 'add_cridmg' : ['暴击伤害',' %'],
  208. 'add_rec' : ['恢复',' %'],
  209. };
  210. return data[key];
  211. }
  212. $.fn.showinfo.typestr = function(type){
  213. var data = {
  214. "_1" : "普通武器",
  215. "_2" : "普通防具",
  216. "_3" : "戒指",
  217. "_4" : "护符",
  218. "_5" : "材料",
  219. "_11" : "剑",
  220. "_12" : "匕首",
  221. "_13" : "锤",
  222. "_14" : "弓",
  223. "_15" : "弩",
  224. "_16" : "斧",
  225. "_17" : "法杖",
  226. "_18" : "魔杖",
  227. "_19" : "权杖",
  228. "_21" : "轻甲",
  229. "_22" : "中甲",
  230. "_23" : "重甲",
  231. "_50" : "材料"
  232. };
  233. return data['_'+type];
  234. }
  235. $.fn.showinfo.rankstr = function(type){ // 难度装备
  236. var data = {
  237. "_0" : "",
  238. "_1" : "困难",
  239. "_2" : "专家",
  240. "_3" : "大师",
  241. "_4" : "苦痛I",
  242. "_5" : "苦痛II",
  243. "_6" : "苦痛III",
  244. "_7" : "苦痛IV",
  245. "_8" : "苦痛V",
  246. "_9" : "苦痛VI"
  247. };
  248. return data['_'+type];
  249. }
  250. $.fn.showinfo.jobstr = function(jid){
  251. var data = {
  252. '_0' : '冒险者',
  253. '_1' : '护卫', '_2' : '信徒', '_3' : '学徒',
  254. '_11' : '骑士', '_12' : '斗士', '_21' : '牧师', '_22' : '魔法师', '_31' : '斥候', '_32' : '猎人',
  255. '_111' : '领主', '_112' : '至尊骑士','_121' : '战狂', '_122' : '圣武士',
  256. '_211' : '主教', '_212' : '贤者', '_221' : '巫师', '_222' : '先知',
  257. '_311' : '刺客', '_312' : '侠盗', '_321' : '游侠', '_322' : '神射手'
  258. };
  259. return data['_'+jid];
  260. }
  261. // 插件的defaults
  262. $.fn.showinfo.defaults = {
  263. };
  264.  
  265. // 闭包结束
  266. })(jQuery);
  267.  
  268.  
  269. window.showmain = function(type){
  270. $('.col-main > div').hide();
  271. if (type == 'fight') {
  272. showleft('rolestats');
  273. $('.window-fight').show();
  274. var fixheight = $('#enemys').innerHeight() > $('#friends').innerHeight() ?
  275. $('#enemys').innerHeight() : $('#friends').innerHeight();
  276. $('.battlelog').height(476 - fixheight);
  277. }else{
  278. $('.window-other').empty().append('<span class="boxloading"><img src="src/image/load2.gif" /> <br />载入中...</span>').show();
  279. $.get('box/'+type, function(result) {
  280. $('.window-other').empty().html(result);
  281. $('*[title]').tips();
  282. if (type == 'item') {
  283. attachItemEnhance('#bag');
  284. }
  285. });
  286.  
  287. }
  288. };
  289. var junkTypes = [1,2,14,16,18];
  290. window.showtype = function(fatherbox,type) {
  291. $(fatherbox+' .showtype button').removeClass('active');
  292. $(fatherbox+' .showtype button').eq(type).addClass('active');
  293. if ($(fatherbox+' .items label').size() == 0) { return false; };
  294. $(fatherbox+' .items label').hide();
  295. if (type == 0) {
  296. $(fatherbox+' .items label').show();
  297. }else if(type == 5){
  298. $(fatherbox+' .items label').each(function() {
  299. if( parseInt($(this).data('type').toString().substr(0,1)) >= 5 ) $(this).show();
  300. });
  301. }else if(type == 6){
  302. var jopitem = check_job_equip();
  303. // console.log(jopitem);
  304. if (!jopitem) return false;
  305. $(fatherbox+' .items label').each(function() {
  306. // console.log(jopitem.indexOf($(this).data('type')));
  307. if( jopitem.indexOf($(this).data('type')) >= 0 ) $(this).show();
  308. });
  309. }else if(type == 7){
  310. $(fatherbox+' .items label').each(function() {
  311. var type = $(this).data('type');
  312. if (type !='50') {
  313. if ($(this).data('pz') < 4) {
  314. $(this).show();
  315. }else if(junkTypes.indexOf(type) != -1){
  316. $(this).show();
  317. }
  318. }
  319.  
  320. });
  321. }else{
  322. $(fatherbox+' .items label').each(function() {
  323. if( $(this).data('type').toString().substr(0,1) == type ) $(this).show();
  324. });
  325. }
  326. };
  327.  
  328. // 排列
  329. window.relist = function relist(fatherbox,type){
  330. $(fatherbox+' .relist button').removeClass('active');
  331. $(fatherbox+' .relist button').eq(type).addClass('active');
  332. if ($(fatherbox+' .items label').size() == 0) { return false; };
  333. var lists = [];
  334. $(fatherbox+' .items label').each(function(index, el) {
  335. var info = $(el).data('info');
  336. if (!info.rank) {
  337. info.rank = '-1';
  338. }
  339. lists.push([$(el).data('lv'),$(el).data('pz'),info.rank,$(el)]);
  340. });
  341. lists.sort(function (a,b){return b[type] - a[type];});
  342. $(fatherbox+' .items').empty();
  343. for(var i in lists){
  344. $(fatherbox+' .items').append(lists[i][3]);
  345. }
  346. $('.box-checkbox, .equip').showinfo();
  347. }
  348.  
  349. function attachItemEnhance (id) {
  350. $(id+' .showtype').append('<button onclick="showtype(\''+id+'\',7);" class="btn btn-primary btn-xs" title="显示蓝色及以下,普通装备,弓,魔杖,斧">垃圾</button>');
  351. $(id+' .relist').append('<button onclick="relist(\''+id+'\',2);" class="btn btn-default btn-xs">难度</button>');
  352. }
  353.  
  354. //仓库功能;
  355. window.usebank = function(type) {
  356. if ($('#bank').hasClass('hidden')) {
  357. $('#bank').removeClass('hidden');
  358. $('#bag').css('height','49%');
  359. $('#bag .items').css('height','160');
  360. $('#bank').empty().append('<span class="boxloading"><img src="src/image/load2.gif" /> <br />载入中...</span>').show();
  361. $.get(base_url+'box/bank', function(data) {
  362. $('#bank').html(data);
  363. attachItemEnhance('#bank');
  364. bankfun(type);
  365. $('*[title]').tips();
  366. $('.box-checkbox, .equip').showinfo();
  367. });
  368. }else{
  369. bankfun(type);
  370. }
  371. };
  372.  
  373. /************************ fight ********************/
  374. window.battlesetup = function() {
  375. showmain('fight');
  376. if (window.battenow) {
  377. window.battenow = false;
  378. $('input[name=btype]').removeAttr('disabled');
  379. $('#battlebtn').removeClass('btn-danger').addClass('btn-primary').addClass('disabled');
  380. var Num = 15;
  381. $('#battlebtn').text('[ '+Num+' ]');
  382. var timer = setInterval(function() {
  383. Num --;
  384. $('#battlebtn').text('[ '+Num+' ]').addClass('disabled');
  385. if (Num <= 0) {
  386. clearInterval(timer);
  387. $('#battlebtn').text('开始战斗').removeClass('disabled');
  388. };
  389. }, 1000);
  390. }else{
  391. BattleInfo.init();
  392. window.battenow = true;
  393. battle();
  394. $('#battlebtn').removeClass('btn-primary').addClass('btn-danger').addClass('disabled');
  395. var Num = 15;
  396. $('#battlebtn').text('[ '+Num+' ]');
  397. var timer = setInterval(function() {
  398. Num --;
  399. $('#battlebtn').text('[ '+Num+' ]').addClass('disabled');
  400. if (Num <= 0) {
  401. clearInterval(timer);
  402. $('#battlebtn').text('停止战斗').removeClass('disabled');
  403. if (!window.battenow) $('#battlebtn').text('开始战斗').removeClass('btn-danger').addClass('btn-primary');
  404. }
  405. }, 1000);
  406. }
  407. };
  408. window.battle = function(){
  409. //保存自动出售设置
  410. if(window.localStorage){
  411. localStorage["s11"] = $('#autosell1').prop("checked") ? 1 : 0;
  412. localStorage["s22"] = $('#autosell2').prop("checked") ? 1 : 0;
  413. localStorage["s33"] = $('#autosell3').prop("checked") ? 1 : 0;
  414. localStorage["bty"] = $('#battletype input:checked').val();
  415. }
  416. if (!battenow) return false;
  417. var autosell1 = $('#autosell1').prop('checked') ? 1 : 0;
  418. var autosell2 = $('#autosell2').prop('checked') ? 1 : 0;
  419. var autosell3 = $('#autosell3').prop('checked') ? 1 : 0;
  420. var fighttype = $('#battletype input:checked').val();
  421. $.ajax({
  422. url : base_url+'fight/battle',
  423. data : {'t':fighttype,'s1':autosell1,'s2':autosell2,'s3':autosell3},
  424. type : "POST",
  425. dataType : 'text',
  426. timeout : 3000,
  427. success:function(data){
  428. if (data=='非法请求') {
  429. setTimeout(function(){ battle(); }, 2000);
  430. }else{
  431. checkBattle(data);
  432. BattleInfo.resolve(data);
  433. }
  434. },
  435. complete : function(XMLHttpRequest,status){
  436. var error = '';
  437. if (status=='timeout') {
  438. error = '连接服务器超时..';
  439. }else if (status == 'error') {
  440. error = '服务器暂时无响应..';
  441. }else if (status == 'success') {
  442. game_err = 0;
  443. }
  444. if (error) {
  445. game_err ++;
  446. // if (game_err > 50) window.location.reload();
  447. viewLog({text:'<span class="text-red">'+error+'</span>'},5000,function(){ battle(); });
  448. };
  449. }
  450. });
  451. }
  452.  
  453. window.BattleInfo = {
  454. data:{},
  455. init:function() {
  456. this.data = {
  457. startTime: new Date(),
  458. winCount:0,
  459. battleCount:0,
  460. teamInfo:{}
  461. };
  462. var $container = $('<div id="battleInfoContainer"><div class="tableContainer"></div><span>战斗统计</span></div>').appendTo('body');
  463.  
  464. },
  465. resolve:function(data) {
  466. var gamelog = $.parseJSON(data);
  467. if ($.isArray(gamelog.p)) {
  468. console.log('123213213'+gamelog.p);
  469. for (var i = 0; i < gamelog.p.length; i++) {
  470. var role = gamelog.p[i];
  471. if (!this.data.teamInfo['p'+i]) {
  472. this.data.teamInfo['p'+i] = this.getNewRole();
  473. }
  474. this.data.teamInfo['p'+i].lv= role.lv;
  475. this.data.teamInfo['p'+i].name= role.n;
  476. }
  477. }
  478.  
  479. if (gamelog.exp && $.isArray(gamelog.exp)) {
  480. for (var j = 0; j < gamelog.exp.length; j++) {
  481. var expObj = gamelog.exp[j];
  482. this.data.teamInfo[expObj[0]].exp += expObj[1];
  483. }
  484. }
  485. if (gamelog.gold && $.isArray(gamelog.gold)) {
  486. for (var k = 0; k < gamelog.gold.length; k++) {
  487. var goldObj = gamelog.gold[k];
  488. this.data.teamInfo[goldObj[0]].gold += goldObj[1];
  489. }
  490. }
  491. if (gamelog.log) {
  492. this.data.battleCount ++;
  493. for (var l = 0; l < gamelog.log.length; l++) {
  494. var tempLog = gamelog.log[l];
  495. if (tempLog[0].indexOf('p') != -1) {
  496. var pid = tempLog[0];
  497. var skillName = SDATA['_'+tempLog[1]].n;
  498. this.data.teamInfo[pid].skillCount +=1;
  499. if (this.data.teamInfo[pid].skills[skillName]) {
  500. this.data.teamInfo[pid].skills[skillName] +=1;
  501. }else{
  502. this.data.teamInfo[pid].skills[skillName] = 1;
  503. }
  504.  
  505. if (tempLog[2] && $.isArray(tempLog)) {
  506. for (var m = 0; m < tempLog[2].length; m++) {
  507. var hitLog = tempLog[2][m];
  508. if ($.isArray(hitLog) && hitLog[2].length >0) {
  509. this.data.teamInfo[pid].hitCount++;
  510. var hitInfos = hitLog[2].split('|');
  511. if (hitInfos[0] == '1') {
  512. this.data.teamInfo[pid].rightHitCount ++;
  513. }
  514. if (hitInfos[1] == '1') {
  515. this.data.teamInfo[pid].criCount ++;
  516. }
  517. }
  518. }
  519. }
  520.  
  521.  
  522. }
  523. }
  524. }
  525. if (gamelog.flag == 'win') {
  526. this.data.winCount++;
  527. }
  528. this.render();
  529. },
  530. render:function() {
  531. $("#battleInfoContainer .tableContainer").html(tmpl(this.template,[this.data]));
  532. },
  533. getNewRole: function() {
  534. return {
  535. name:'',
  536. lv:'',
  537. exp:0,
  538. gold:0,
  539. skills:{},
  540. skillCount: 0,
  541. hitCount:0,
  542. rightHitCount:0,
  543. criCount:0,
  544. };
  545. },
  546. toFix: function(value) {
  547. return value.toFixed(2);
  548. },
  549. valuePerHour: function(value, startTime) {
  550. var factor = 60 * 60 / (new Date() - startTime) * 1000;
  551. return (value * factor).toFixed(2);
  552. },
  553. template:'{% for(var i=0; i<o.length;i++){ %}'+
  554. '<table border="1" style="border-collapse:collapse">'+
  555. '<tr>'+
  556. '<td>开始时间:</td>'+
  557. '<td>{%=o[i].startTime.toLocaleString()%}</td>'+
  558. '</tr>'+
  559. '<tr>'+
  560. '<td>持续时间:</td>'+
  561. '<td>{%=BattleInfo.toFix((new Date() - o[i].startTime)/1000) %} 秒</td>'+
  562. '</tr>'+
  563. '<tr>'+
  564. '<td>胜场|总场|胜率</td>'+
  565. '<td>{%=o[i].winCount%}|{%=o[i].battleCount%}|{%=BattleInfo.toFix(o[i].winCount/o[i].battleCount*100)%}%</td>'+
  566. '</tr>'+
  567. '{% for(var k in o[i].teamInfo) { var role = o[i].teamInfo[k];%}'+
  568. '<tr>'+
  569. '<td colspan="2">'+
  570. '<table border="0" width="100%" style="border-collapse:collapse;">'+
  571. '<tr>'+
  572. '<td>角色名:</td>'+
  573. '<td>{%=role.name%}</td>'+
  574. '</tr>'+
  575. '</tr>'+
  576. '<td>Lv:</td>'+
  577. '<td>{%=role.lv%}</td>'+
  578. '</tr>'+
  579. '<tr>'+
  580. '<td>获得经验:</td>'+
  581. '<td>{%=role.exp%}</td>'+
  582. '</tr>'+
  583. '</tr>'+
  584. '<td>经验/小时:</td>'+
  585. '<td>{%=BattleInfo.valuePerHour(role.exp,o[i].startTime)%}</td>'+
  586. '</tr>'+
  587. '<tr>'+
  588. '<td>获得gold:</td>'+
  589. '<td>{%=role.gold%}</td>'+
  590. '</tr>'+
  591. '</tr>'+
  592. '<td>gold/小时:</td>'+
  593. '<td>{%=BattleInfo.valuePerHour(role.gold,o[i].startTime)%}</td>'+
  594. '</tr>'+
  595. '<tr>'+
  596. '<td>命中率:</td>'+
  597. '<td>{%=BattleInfo.toFix(role.rightHitCount/role.hitCount*100)%}%</td>'+
  598. '</tr>'+
  599. '</tr>'+
  600. '<td>暴击率:</td>'+
  601. '<td>{%=BattleInfo.toFix(role.criCount/role.hitCount*100)%}%</td>'+
  602. '</tr>'+
  603. '<tr>'+
  604. '<td>技能:</td>'+
  605. '<td>'+
  606. '{% var skills = role.skills;%}'+
  607. '<table width="100%" style="border-collapse:collapse;">'+
  608. '{% for(var j in skills){ %}'+
  609. '<tr>'+
  610. '<td>'+
  611. '{%=j%}'+
  612. '</td>'+
  613. '<td>'+
  614. '{%=skills[j]%} ({%=BattleInfo.toFix(skills[j]/role.skillCount*100)%}%)'+
  615. '</td>'+
  616. '</tr>'+
  617. '{% } %}'+
  618. '</table>'+
  619. '</td>'+
  620. '</tr>'+
  621. '</table>'+
  622. '</td>'+
  623. '</tr>'+
  624. '{% }%}'+
  625. '</table>'+
  626. '{% } %}',
  627.  
  628. };
  629.  
  630. //styles
  631. function addGlobalStyle(css) {
  632. var head, style;
  633. head = document.getElementsByTagName('head')[0];
  634. if (!head) { return; }
  635. style = document.createElement('style');
  636. style.type = 'text/css';
  637. style.innerHTML = css;
  638. head.appendChild(style);
  639. }
  640.  
  641.  
  642.  
  643. addGlobalStyle("\
  644. #battleInfoContainer{\
  645. position:absolute;\
  646. top:0;\
  647. left:0;\
  648. z-index:100;\
  649. padding:10px;\
  650. background-color:#fff;\
  651. transform: translate(-100%,0);\
  652. transition: 300ms;\
  653. }\
  654. #battleInfoContainer:hover{\
  655. transform: translate(0,0);\
  656. }\
  657. #battleInfoContainer span{\
  658. color:#fff;\
  659. background-color:#049fd9;\
  660. position: absolute;\
  661. top: 0px;\
  662. padding:5px 0px;\
  663. width:20px;\
  664. right: -20px;\
  665. text-align:center;\
  666. display:inline-block;\
  667. }\
  668. .gamewindow{\
  669. width:1000px;\
  670. }\
  671. ");