Adventure of Chaos helper

helper for AOC

  1. // ==UserScript==
  2. // @name Adventure of Chaos helper
  3. // @namespace http://www.x4code.com
  4. // @version 1.9
  5. // @author Manro & feiyu
  6. // @match http://www.x4code.com/game/*
  7. // @grant none
  8. // @description helper for AOC
  9. // ==/UserScript==
  10.  
  11.  
  12.  
  13. //impl script
  14. !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);
  15.  
  16.  
  17. (function($) {
  18. $.fn.tips = function(options) {
  19. var opts = $.extend({}, $.fn.showinfo.defaults, options);
  20. if ($("#ToolsTip").size() == 0) $('<div id="ToolsTip"></div>').hide().appendTo('body');
  21. var $ToolsTip = $("#ToolsTip");
  22. this.bind('mouseover mousemove mouseout', function(event) {
  23. var TarData = $(this).attr('title') || $(this).data('title');
  24. $(this).removeAttr('title');
  25. $(this).data('title',TarData);
  26. switch (event.type){
  27. case 'mousemove':
  28. var top = event.pageY + 12,
  29. left = event.pageX + 12;
  30. if ($ToolsTip.innerHeight() + top + 12 > $(document).height()) top = $(document).height() - $ToolsTip.innerHeight() - 20;
  31. $ToolsTip.css({top: top, left: left}).show();
  32. case 'mouseover':
  33. $ToolsTip.html(TarData);
  34. break;
  35. case 'mouseout':
  36. $ToolsTip.removeClass().removeData().empty().hide();
  37. break;
  38. }
  39. });
  40. }
  41.  
  42. $.fn.showinfo = function(options) {
  43. var opts = $.extend({}, $.fn.showinfo.defaults, options);
  44. if ($("#InfoTip").size() == 0) {
  45. // $('<div id="InfoTip"></div>').hide().appendTo('body');
  46. $('<div id="InfoTip" class="iteminfo self"></div>').hide().appendTo('body');
  47. }
  48. if ($('[infotip]').size() == 0) {
  49. $('<div id="InfoTip" infotip></div>').hide().appendTo('body');
  50. // $('<div id="InfoTip" class="iteminfo self"></div>').hide().appendTo('body');
  51. }
  52. var $InfoTip = $("#InfoTip");
  53. var $InfoTip2 = $('[infotip]').css({
  54. 'position': 'absolute',
  55. 'padding': '2px',
  56. 'z-index': '10000',
  57. 'border-radius': '4px',
  58. 'border-width': '3px',
  59. 'border-style': 'ridge',
  60. 'min-width': '160px',
  61. 'max-width': '200px',
  62. 'padding': '5px 10px',
  63. 'font': '12px/18px Tahoma, Arial, sans-serif',
  64. });
  65.  
  66.  
  67. this.bind('mouseover mouseout mousemove', function(event) {
  68. var equips = $('#equips button').map(function(index, elem) {
  69. return $(elem).data('info');
  70. });
  71. var TarData = $(this).data('info');
  72.  
  73.  
  74. var showCompare = this.tagName != 'BUTTON';
  75. var compareData = null;
  76. var tarType = TarData.type.substr(0,1);
  77. for (var i = 0; i < equips.length; i++) {
  78. var equip = equips[i];
  79. if (equip.type.substr(0,1) == tarType) {
  80. compareData =equip;
  81. break;
  82. }
  83. }
  84.  
  85. var showid = '_';
  86. if (TarData.eid) showid += TarData.eid+"_";
  87. if (TarData.tid) showid += TarData.tid;
  88. switch (event.type){
  89. case 'mousemove':
  90. var top = event.pageY + 12,
  91. left = event.pageX + 12;
  92. if ($InfoTip.innerHeight() + top + 12 > $(document).height()) top = $(document).height() - $InfoTip.innerHeight() - 12;
  93. if ($InfoTip.innerWidth() + left + 12 > $(document).width()) left = event.pageX - $InfoTip.innerWidth() - 12;
  94. $InfoTip.css({top: top, left: left}).show();
  95. if (showCompare && compareData) {
  96. $InfoTip2.css({top: top, left: left+$InfoTip.innerWidth()+ 5}).show();
  97. }
  98. if ($InfoTip.data('show') == showid) { return false; }
  99. $InfoTip.data('show',showid);
  100. case 'mouseover':
  101. // console.log(TarData.pz);
  102. $InfoTip.addClass('pz'+TarData.epz);
  103. var TipData = $.fn.showinfo.ext(TarData,showCompare&&compareData?compareData:null);
  104. $InfoTip.html(TipData);
  105.  
  106. if (showCompare) {
  107. $InfoTip2.addClass('pz'+compareData.epz);
  108. var TipData2 = $.fn.showinfo.ext(compareData);
  109. $InfoTip2.html(TipData2);
  110. }
  111. break;
  112. case 'mouseout':
  113. $InfoTip.removeClass().removeData().empty().hide().addClass('iteminfo');
  114. $InfoTip2.removeClass().removeData().empty().hide().addClass('iteminfo self');
  115. break;
  116. }
  117. });
  118. }
  119. $.fn.showinfo.ext = function(v,compare) {
  120. var rtHtml = v.lv > 0 ? "<span class='lv'>Lv:"+v.lv+"</span>":"";
  121. rtHtml += "<h3>"+v.name;
  122. if (v.qlv > 0) { rtHtml += " +"+v.qlv; };
  123. rtHtml += "</h3>";
  124. var info = v.info ? $.parseJSON(v.info) : {};
  125. var addinfo = v.addinfo ? $.parseJSON(v.addinfo) : {};
  126. var compreAddinfo = null;
  127. if (compare) {
  128. compreAddinfo = compare.addinfo ? $.parseJSON(compare.addinfo) : null;
  129. }
  130. var colorkey = [];
  131. if (Object.keys(addinfo).length){
  132. for(var key in addinfo){
  133. if(info.hasOwnProperty(key)) {
  134. info[key] = info[key] + addinfo[key];
  135. colorkey[key] = 1;
  136. }
  137. }
  138. }
  139. rtHtml += "<p>";
  140. if (v.rank != 0 && v.rank) rtHtml += "["+$.fn.showinfo.rankstr(v.rank)+"] ";
  141. rtHtml += '['+$.fn.showinfo.typestr(v.type)+'] ';
  142. if (v.job != 0) rtHtml += "["+$.fn.showinfo.jobstr(v.job)+"]";
  143. rtHtml += "</p>";
  144. if (info.att_min+info.att_max > 0) {
  145. rtHtml += "攻击力:<b>";
  146. rtHtml += colorkey.att_min ? "<i>"+info.att_min+"</i> - " : info.att_min + " - ";
  147. rtHtml += colorkey.att_max ? "<i>"+info.att_max+"</i></b>" : info.att_max+"</b>";
  148. };
  149. if (info.att_min) { delete info.att_min; }
  150. if (info.att_max) { delete info.att_max; }
  151. // console.log(info.length);
  152. if (Object.keys(info).length){
  153. rtHtml += "<ul class='info'>";
  154. for(var key in info){
  155. // console.log(key+' : '+info[key]);
  156. var tags = $.fn.showinfo.extinfo(key);
  157. rtHtml += "<li>"+tags[0]+":<b>";
  158. rtHtml += colorkey[key] ? "<i>"+info[key]+tags[1]+"</i></b></li>" : info[key]+tags[1]+"</b></li>";
  159. }
  160. rtHtml += "</ul>"
  161. }
  162. if (Object.keys(addinfo).length){
  163. rtHtml += "<ul class='addinfo'>[附加属性]";
  164. for(var key in addinfo){
  165. // console.log(key+' : '+info[key]);
  166. var tags = $.fn.showinfo.extinfo(key);
  167. var compareString = '';
  168. if (compreAddinfo && compreAddinfo.hasOwnProperty(key)) {
  169. compareString = parseInt(addinfo[key]) - parseInt(compreAddinfo[key]);
  170. }
  171. rtHtml += (key == v.ckey) ? '<li class="c">':"<li>";
  172. rtHtml += tags[0]+":"+addinfo[key]+tags[1];
  173. rtHtml += "<span class='pull-right'>"+compareString+"</span></li>";
  174. }
  175. rtHtml += "</ul>"
  176. }
  177. rtHtml += v.num ? "<p>数量:"+v.num+"</p>" : "";
  178. rtHtml += v.about ? "<p><q>"+v.about+"</q></p>" : "";
  179. // if (v.eid) { rtHtml += "<p>"+v.eid+"</p>" };
  180. return rtHtml;
  181. }
  182. $.fn.showinfo.extinfo = function(key){
  183. var data = {
  184. 'hp' : ['生命值',''],
  185. 'pow' : ['强度',''],
  186. 'dex' : ['敏捷',''],
  187. 'con' : ['体质',''],
  188. 'att_min' : ['最小攻击',''],
  189. 'att_max' : ['最大攻击',''],
  190. 'def' : ['防御',''],
  191. 'eva' : ['闪避机率',' %'],
  192. 'arm' : ['护甲',''],
  193. 'dmgeff' : ['伤害减免',' %'],
  194. 'hit' : ['命中机率',' %'],
  195. 'cri' : ['暴击机率',' %'],
  196. 'cridmg' : ['暴击伤害',' %'],
  197. 'rec' : ['恢复',' %'],
  198. 'add_hp' : ['生命值',' %'],
  199. 'add_att' : ['攻击力',' %'],
  200. 'add_def' : ['防御增强',' %'],
  201. 'add_eva' : ['闪避机率',' %'],
  202. 'add_arm' : ['护甲增强',' %'],
  203. 'add_dmgeff' : ['伤害减免',' %'],
  204. 'add_hit' : ['命中机率',' %'],
  205. 'add_cri' : ['暴击机率',' %'],
  206. 'add_cridmg' : ['暴击伤害',' %'],
  207. 'add_rec' : ['恢复',' %'],
  208. };
  209. return data[key];
  210. }
  211. $.fn.showinfo.typestr = function(type){
  212. var data = {
  213. "_1" : "普通武器",
  214. "_2" : "普通防具",
  215. "_3" : "戒指",
  216. "_4" : "护符",
  217. "_5" : "材料",
  218. "_11" : "剑",
  219. "_12" : "匕首",
  220. "_13" : "锤",
  221. "_14" : "弓",
  222. "_15" : "弩",
  223. "_16" : "斧",
  224. "_17" : "法杖",
  225. "_18" : "魔杖",
  226. "_19" : "权杖",
  227. "_21" : "轻甲",
  228. "_22" : "中甲",
  229. "_23" : "重甲",
  230. "_50" : "材料"
  231. };
  232. return data['_'+type];
  233. }
  234. $.fn.showinfo.rankstr = function(type){ // 难度装备
  235. var data = {
  236. "_0" : "",
  237. "_1" : "困难",
  238. "_2" : "专家",
  239. "_3" : "大师",
  240. "_4" : "苦痛I",
  241. "_5" : "苦痛II",
  242. "_6" : "苦痛III",
  243. "_7" : "苦痛IV",
  244. "_8" : "苦痛V",
  245. "_9" : "苦痛VI"
  246. };
  247. return data['_'+type];
  248. }
  249. $.fn.showinfo.jobstr = function(jid){
  250. var data = {
  251. '_0' : '冒险者',
  252. '_1' : '护卫', '_2' : '信徒', '_3' : '学徒',
  253. '_11' : '骑士', '_12' : '斗士', '_21' : '牧师', '_22' : '魔法师', '_31' : '斥候', '_32' : '猎人',
  254. '_111' : '领主', '_112' : '至尊骑士','_121' : '战狂', '_122' : '圣武士',
  255. '_211' : '主教', '_212' : '贤者', '_221' : '巫师', '_222' : '先知',
  256. '_311' : '刺客', '_312' : '侠盗', '_321' : '游侠', '_322' : '神射手'
  257. };
  258. return data['_'+jid];
  259. }
  260. // 插件的defaults
  261. $.fn.showinfo.defaults = {
  262. };
  263.  
  264. // 闭包结束
  265. })(jQuery);
  266. /********************装备比较结束**************************/
  267.  
  268. window.showmain = function(type){
  269. $('.col-main > div').hide();
  270. if (type == 'fight') {
  271. showleft('rolestats');
  272. $('.window-fight').show();
  273. var fixheight = $('#enemys').innerHeight() > $('#friends').innerHeight() ?
  274. $('#enemys').innerHeight() : $('#friends').innerHeight();
  275. $('.battlelog').height(476 - fixheight);
  276. }else{
  277. $('.window-other').empty().append('<span class="boxloading"><img src="src/image/load2.gif" /> <br />载入中...</span>').show();
  278. $.get('box/'+type, function(result) {
  279. $('.window-other').empty().html(result);
  280. $('*[title]').tips();
  281. if (type == 'item') {
  282. attachItemEnhance('#bag');
  283. }
  284. });
  285.  
  286. }
  287. };
  288.  
  289. // 打开银行
  290. function openbank() {
  291. $('#bank').removeClass('hidden');
  292. $('#bag').css('height','49%');
  293. $('#bag .items').css('height','160');
  294. $('#bank').empty().append('<span class="boxloading"><img src="src/image/load2.gif" /> <br />载入中...</span>').show();
  295. $.get(base_url+'box/bank', function(data) {
  296. $('#bank').html(data);
  297. $('*[title]').tips();
  298. $('.box-checkbox, .equip').showinfo();
  299. });
  300. }
  301. //仓库功能;
  302. window.usebank = function(type) {
  303. if ($('#bank').hasClass('hidden')) {
  304. $('#bank').removeClass('hidden');
  305. $('#bag').css('height','49%');
  306. $('#bag .items').css('height','160');
  307. $('#bank').empty().append('<span class="boxloading"><img src="src/image/load2.gif" /> <br />载入中...</span>').show();
  308. $.get(base_url+'box/bank', function(data) {
  309. $('#bank').html(data);
  310. bankfun(type);
  311. $('*[title]').tips();
  312. $('.box-checkbox, .equip').showinfo();
  313. });
  314. }else{
  315. bankfun(type);
  316. }
  317. };
  318.  
  319. /************************ fight ********************/
  320. window.battlesetup = function() {
  321. showmain('fight');
  322. if (window.battenow) {
  323. window.battenow = false;
  324. $('input[name=btype]').removeAttr('disabled');
  325. $('#battlebtn').removeClass('btn-danger').addClass('btn-primary').addClass('disabled');
  326. var Num = 15;
  327. $('#battlebtn').text('[ '+Num+' ]');
  328. var timer = setInterval(function() {
  329. Num --;
  330. $('#battlebtn').text('[ '+Num+' ]').addClass('disabled');
  331. if (Num <= 0) {
  332. clearInterval(timer);
  333. $('#battlebtn').text('开始战斗').removeClass('disabled');
  334. };
  335. }, 1000);
  336. }else{
  337. BattleInfo.init();
  338. window.battenow = true;
  339. battle();
  340. $('#battlebtn').removeClass('btn-primary').addClass('btn-danger').addClass('disabled');
  341. var Num = 15;
  342. $('#battlebtn').text('[ '+Num+' ]');
  343. var timer = setInterval(function() {
  344. Num --;
  345. $('#battlebtn').text('[ '+Num+' ]').addClass('disabled');
  346. if (Num <= 0) {
  347. clearInterval(timer);
  348. $('#battlebtn').text('停止战斗').removeClass('disabled');
  349. if (!window.battenow) $('#battlebtn').text('开始战斗').removeClass('btn-danger').addClass('btn-primary');
  350. }
  351. }, 1000);
  352. }
  353. };
  354. window.battle = function(){
  355. //保存自动出售设置
  356. if(window.localStorage){
  357. localStorage["s11"] = $('#autosell1').prop("checked") ? 1 : 0;
  358. localStorage["s22"] = $('#autosell2').prop("checked") ? 1 : 0;
  359. localStorage["s33"] = $('#autosell3').prop("checked") ? 1 : 0;
  360. localStorage["bty"] = $('#battletype input:checked').val();
  361. }
  362. if (!battenow) return false;
  363. var autosell1 = $('#autosell1').prop('checked') ? 1 : 0;
  364. var autosell2 = $('#autosell2').prop('checked') ? 1 : 0;
  365. var autosell3 = $('#autosell3').prop('checked') ? 1 : 0;
  366. var fighttype = $('#battletype input:checked').val();
  367. $.ajax({
  368. url : base_url+'fight/battle',
  369. data : {'t':fighttype,'s1':autosell1,'s2':autosell2,'s3':autosell3},
  370. type : "POST",
  371. dataType : 'text',
  372. timeout : 3000,
  373. success:function(data){
  374. if (data=='非法请求') {
  375. setTimeout(function(){ battle(); }, 2000);
  376. }else{
  377. checkBattle(data);
  378. BattleInfo.resolve(data);
  379. }
  380. },
  381. complete : function(XMLHttpRequest,status){
  382. var error = '';
  383. if (status=='timeout') {
  384. error = '连接服务器超时..';
  385. }else if (status == 'error') {
  386. error = '服务器暂时无响应..';
  387. }else if (status == 'success') {
  388. game_err = 0;
  389. }
  390. if (error) {
  391. game_err ++;
  392. // if (game_err > 50) window.location.reload();
  393. viewLog({text:'<span class="text-red">'+error+'</span>'},5000,function(){ battle(); });
  394. };
  395. }
  396. });
  397. }
  398.  
  399. window.BattleInfo = {
  400. data:{},
  401. init:function() {
  402. this.data = {
  403. startTime: new Date(),
  404. winCount:0,
  405. battleCount:0,
  406. teamInfo:{}
  407. };
  408. var $container = $('<div id="battleInfoContainer"><div class="tableContainer"></div><span>战斗统计</span></div>').appendTo('body');
  409.  
  410. },
  411. resolve:function(data) {
  412. var SDATA = {
  413. "_9001" : {"n":"冷血"},
  414. "_9002" : {"n":"狡诈"},
  415. "_9003" : {"n":"傲慢"},
  416. "_9004" : {"n":"凶残"},
  417. "_9005" : {"n":"贪婪"},
  418. "_9006" : {"n":"仁爱"},
  419. "_9007" : {"n":"热情"},
  420. "_9008" : {"n":"谦和"},
  421. "_9009" : {"n":"慷慨"},
  422. "_9010" : {"n":"公正"},
  423. "_0" : {"n":"攻击"},
  424. "_1000" : {"n":"猛击"},
  425. "_1001" : {"n":"英勇打击"},
  426. "_2001" : {"n":"魔法弹"},
  427. "_3001" : {"n":"二连击"},
  428. "_1101" : {"n":"惩罚"},
  429. "_1102" : {"n":"英勇信念"},
  430. "_1103" : {"n":"嘲讽"},
  431. "_1201" : {"n":"顺劈斩"},
  432. "_1202" : {"n":"压制"},
  433. "_1203" : {"n":"战斗怒吼"},
  434. "_2101" : {"n":"祈祷圣言"},
  435. "_2102" : {"n":"祝福圣言"},
  436. "_2103" : {"n":"治疗祷言"},
  437. "_2201" : {"n":"冰球术"},
  438. "_2202" : {"n":"火球术"},
  439. "_2203" : {"n":"魔法驱散"},
  440. "_3101" : {"n":"潜伏"},
  441. "_3102" : {"n":"下毒"},
  442. "_3103" : {"n":"侦测透析"},
  443. "_3201" : {"n":"陷阱"},
  444. "_3202" : {"n":"钉刺"},
  445. "_3203" : {"n":"标记"},
  446. "_1111" : {"n":"风暴打击"},
  447. "_1112" : {"n":"突击"},
  448. "_1113" : {"n":"盘石之甲"},
  449. "_1114" : {"n":"斩杀"},
  450. "_1121" : {"n":"奉献"},
  451. "_1122" : {"n":"最终审判"},
  452. "_1123" : {"n":"生命礼赞"},
  453. "_1124" : {"n":"反击风暴"},
  454. "_1211" : {"n":"痛击"},
  455. "_1212" : {"n":"狂暴之心"},
  456. "_1213" : {"n":"狂暴打击"},
  457. "_1214" : {"n":"飓风冲撞"},
  458. "_1221" : {"n":"旋风斩"},
  459. "_1222" : {"n":"忘却痛苦"},
  460. "_1223" : {"n":"切割之刃"},
  461. "_1224" : {"n":"胁迫"},
  462. "_2111" : {"n":"心灵风暴"},
  463. "_2112" : {"n":"迷惑"},
  464. "_2113" : {"n":"神恩感化"},
  465. "_2114" : {"n":"神迹回复"},
  466. "_2121" : {"n":"高阶祈祷术"},
  467. "_2122" : {"n":"治愈之手"},
  468. "_2123" : {"n":"神圣意志"},
  469. "_2124" : {"n":"护佑"},
  470. "_2211" : {"n":"群体变形"},
  471. "_2212" : {"n":"流星火雨"},
  472. "_2213" : {"n":"冰风暴"},
  473. "_2214" : {"n":"眩目之光"},
  474. "_2221" : {"n":"引雷术"},
  475. "_2222" : {"n":"知己知彼"},
  476. "_2223" : {"n":"狂风骤雨"},
  477. "_2224" : {"n":"闪避圣言"},
  478. "_3111" : {"n":"疾步风"},
  479. "_3112" : {"n":"刀扇"},
  480. "_3113" : {"n":"黑暗之刃"},
  481. "_3114" : {"n":"背刺"},
  482. "_3121" : {"n":"无敌斩"},
  483. "_3122" : {"n":"肾击"},
  484. "_3123" : {"n":"新星之毒"},
  485. "_3124" : {"n":"挑寡"},
  486. "_3211" : {"n":"万兽奔袭"},
  487. "_3212" : {"n":"洞悉弱点"},
  488. "_3213" : {"n":"急速飞弹"},
  489. "_3214" : {"n":"瞄准射击"},
  490. "_3221" : {"n":"急速射击"},
  491. "_3222" : {"n":"多重射击"},
  492. "_3223" : {"n":"箭雨"},
  493. "_3224" : {"n":"凝神"},
  494. "_321" : {"n":"冻结箭矢"},
  495. "_221" : {"n":"霜冻之心"},
  496. "_312" : {"n":"濒死本能"},
  497. "_212" : {"n":"生命回溯"}
  498. };
  499. var GDATA = {
  500. "_111" : {"n":"队伍光环技:列阵 技能发动!友方全体攻击+15%,暴击+5%,爆伤+50%"},
  501. "_112" : {"n":"队伍光环技:传道 技能发动!敌方全体防御力-15%,伤害减免-10%"},
  502. "_121" : {"n":"队伍光环技:恐吓 技能发动!敌方全体攻击-15%,暴击-5%,命中-5%"},
  503. "_122" : {"n":"队伍光环技:谨慎 技能发动!友方全体伤害减免+8%,闪避+5%,命中+5%"},
  504. "_211" : {"n":"队伍光环技:生命祝福 技能发动!友方生命值上限+50%,伤害减免+5%"},
  505. "_222" : {"n":"队伍光环技:预言术 技能发动!敌方全体生命值上限-10%,防御力-30%"},
  506. };
  507. var TDATA = {
  508.  
  509. "_111" : {"n":"醒悟(特质)"},
  510. "_112" : {"n":"虔诚之心(特质)"},
  511. "_121" : {"n":"暴怒特质(特质)"},
  512. "_122" : {"n":"全力以赴(特质)"},
  513. "_211" : {"n":"渐隐术(特质)"},
  514. "_212" : {"n":"生命回溯(特质)"},
  515. "_221" : {"n":"霜冻之心(特质)"},
  516. "_222" : {"n":"怜悯之心(特质)"},
  517. "_311" : {"n":"精准直觉(特质)"},
  518. "_312" : {"n":"濒死本能(特质)"},
  519. "_321" : {"n":"冻结箭矢(特质)"},
  520. "_322" : {"n":"分裂箭矢(特质)"}
  521. };
  522. var GameLog = $.parseJSON(data);
  523. if ($.isArray(GameLog.p)) {
  524. console.log('123213213'+GameLog.p);
  525. for (var i = 0; i < GameLog.p.length; i++) {
  526. var role = GameLog.p[i];
  527. if (!this.data.teamInfo['p'+i]) {
  528. this.data.teamInfo['p'+i] = this.getNewRole();
  529. }
  530. this.data.teamInfo['p'+i].lv= role.v;
  531. this.data.teamInfo['p'+i].name= role.n;
  532. }
  533. }
  534.  
  535. if (GameLog.exp && $.isArray(GameLog.exp)) {
  536. for (var j = 0; j < GameLog.exp.length; j++) {
  537. var expObj = GameLog.exp[j];
  538. this.data.teamInfo[expObj[0]].exp += expObj[1];
  539. }
  540. }
  541. if (GameLog.gold && $.isArray(GameLog.gold)) {
  542. for (var k = 0; k < GameLog.gold.length; k++) {
  543. var goldObj = GameLog.gold[k];
  544. this.data.teamInfo[goldObj[0]].gold += goldObj[1];
  545. }
  546. }
  547. if (GameLog.log) {
  548. this.data.battleCount ++;
  549. for (var l = 0; l < GameLog.log.length; l++) {
  550. var TempLog = GameLog.log[l];
  551. var temp = TempLog[0].split('|');
  552. if (temp[0].indexOf('p') != -1) {
  553. var pid = temp[0];
  554. var skillName = SDATA['_'+temp[1]].n;
  555. this.data.teamInfo[pid].skillCount +=1;
  556. if (temp[2] != '') {
  557. var skilltz = TDATA['_'+temp[2]].n
  558. if (this.data.teamInfo[pid].skills[skilltz]) {
  559. this.data.teamInfo[pid].skills[skilltz] +=1;
  560. }else{
  561. this.data.teamInfo[pid].skills[skilltz] = 1;
  562. }
  563. }
  564. if (this.data.teamInfo[pid].skills[skillName]) {
  565. this.data.teamInfo[pid].skills[skillName] +=1;
  566. }else{
  567. this.data.teamInfo[pid].skills[skillName] = 1;
  568. }
  569. for(var m in TempLog[1]){
  570. var hitLog = TempLog[1][m];
  571. if (hitLog instanceof Array && hitLog[1].length >0) {
  572. this.data.teamInfo[pid].hitCount++;
  573. var hitInfos = hitLog[1].split('|');
  574. if (hitInfos[0] == '1') {
  575. this.data.teamInfo[pid].rightHitCount ++;
  576. }
  577. else if(hitInfos[0] == 'h'){this.data.teamInfo[pid].rightHitCount ++;}
  578. if (hitInfos[1] == '1') {
  579. this.data.teamInfo[pid].criCount ++;
  580. }
  581. }
  582.  
  583. }
  584.  
  585.  
  586.  
  587. }
  588. }
  589. }
  590. if (GameLog.flag == 'win') {
  591. this.data.winCount++;
  592. }
  593. this.render();
  594. },
  595. render:function() {
  596. $("#battleInfoContainer .tableContainer").html(tmpl(this.template,[this.data]));
  597. },
  598. getNewRole: function() {
  599. return {
  600. name:'',
  601. lv:'',
  602. exp:0,
  603. gold:0,
  604. skills:{},
  605. skillCount: 0,
  606. hitCount:0,
  607. rightHitCount:0,
  608. criCount:0,
  609. };
  610. },
  611. toFix: function(value) {
  612. return value.toFixed(2);
  613. },
  614. valuePerHour: function(value, startTime) {
  615. var factor = 60 * 60 / (new Date() - startTime) * 1000;
  616. return (value * factor).toFixed(2);
  617. },
  618. template:'{% for(var i=0; i<o.length;i++){ %}'+
  619. '<table border="1" style="border-collapse:collapse">'+
  620. '<tr>'+
  621. '<td>开始时间:</td>'+
  622. '<td>{%=o[i].startTime.toLocaleString()%}</td>'+
  623. '</tr>'+
  624. '<tr>'+
  625. '<td>持续时间:</td>'+
  626. '<td>{%=BattleInfo.toFix((new Date() - o[i].startTime)/1000) %} 秒</td>'+
  627. '</tr>'+
  628. '<tr>'+
  629. '<td>胜场|总场|胜率</td>'+
  630. '<td>{%=o[i].winCount%}|{%=o[i].battleCount%}|{%=BattleInfo.toFix(o[i].winCount/o[i].battleCount*100)%}%</td>'+
  631. '</tr>'+
  632. '{% for(var k in o[i].teamInfo) { var role = o[i].teamInfo[k];%}'+
  633. '<tr>'+
  634. '<td colspan="2">'+
  635. '<table border="0" width="100%" style="border-collapse:collapse;">'+
  636. '<tr>'+
  637. '<td>角色名:</td>'+
  638. '<td>{%=role.name%}</td>'+
  639. '</tr>'+
  640. '</tr>'+
  641. '<td>Lv:</td>'+
  642. '<td>{%=role.lv%}</td>'+
  643. '</tr>'+
  644. '<tr>'+
  645. '<td>获得经验:</td>'+
  646. '<td>{%=role.exp%}</td>'+
  647. '</tr>'+
  648. '</tr>'+
  649. '<td>经验/小时:</td>'+
  650. '<td>{%=BattleInfo.valuePerHour(role.exp,o[i].startTime)%}</td>'+
  651. '</tr>'+
  652. '<tr>'+
  653. '<td>获得gold:</td>'+
  654. '<td>{%=role.gold%}</td>'+
  655. '</tr>'+
  656. '</tr>'+
  657. '<td>gold/小时:</td>'+
  658. '<td>{%=BattleInfo.valuePerHour(role.gold,o[i].startTime)%}</td>'+
  659. '</tr>'+
  660. '<tr>'+
  661. '<td>命中率:</td>'+
  662. '<td>{%=BattleInfo.toFix(role.rightHitCount/role.hitCount*100)%}%</td>'+
  663. '</tr>'+
  664. '</tr>'+
  665. '<td>暴击率:</td>'+
  666. '<td>{%=BattleInfo.toFix(role.criCount/role.hitCount*100)%}%</td>'+
  667. '</tr>'+
  668. '<tr>'+
  669. '<td>技能:</td>'+
  670. '<td>'+
  671. '{% var skills = role.skills;%}'+
  672. '<table width="100%" style="border-collapse:collapse;">'+
  673. '{% for(var j in skills){ %}'+
  674. '<tr>'+
  675. '<td>'+
  676. '{%=j%}'+
  677. '</td>'+
  678. '<td>'+
  679. '{%=skills[j]%} ({%=BattleInfo.toFix(skills[j]/role.skillCount*100)%}%)'+
  680. '</td>'+
  681. '</tr>'+
  682. '{% } %}'+
  683. '</table>'+
  684. '</td>'+
  685. '</tr>'+
  686. '</table>'+
  687. '</td>'+
  688. '</tr>'+
  689. '{% }%}'+
  690. '</table>'+
  691. '{% } %}',
  692.  
  693. };
  694.  
  695. //styles
  696. function addGlobalStyle(css) {
  697. var head, style;
  698. head = document.getElementsByTagName('head')[0];
  699. if (!head) { return; }
  700. style = document.createElement('style');
  701. style.type = 'text/css';
  702. style.innerHTML = css;
  703. head.appendChild(style);
  704. }
  705.  
  706.  
  707.  
  708. addGlobalStyle("\
  709. #battleInfoContainer{\
  710. position:absolute;\
  711. top:0;\
  712. left:0;\
  713. z-index:100;\
  714. padding:10px;\
  715. background-color:#fff;\
  716. transform: translate(-100%,0);\
  717. transition: 300ms;\
  718. }\
  719. #battleInfoContainer:hover{\
  720. transform: translate(0,0);\
  721. }\
  722. #battleInfoContainer span{\
  723. color:#fff;\
  724. background-color:#049fd9;\
  725. position: absolute;\
  726. top: 0px;\
  727. padding:5px 0px;\
  728. width:20px;\
  729. right: -20px;\
  730. text-align:center;\
  731. display:inline-block;\
  732. }\
  733. .gamewindow{\
  734. width:1000px;\
  735. }\
  736. ");