您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Greasy Fork is available in English.
Tournament Tab
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greasyfork.icu/scripts/399272/787107/TournTab.js
/*********************************** Tournament Tab ***********************************/ // @tabversion 20171116 Tabs.Tournament = { tabOrder: 1100, tabLabel: 'Tournament', myDiv: null, displayTimer: null, Options : { TourneyTroopType: 2, TourneyBoardType: 1, TournamentLines: 5, }, init: function (div) { var t = Tabs.Tournament; t.myDiv = div; if (!Options.TournamentOptions) { Options.TournamentOptions = t.Options; } else { for (var y in t.Options) { if (!Options.TournamentOptions.hasOwnProperty(y)) { Options.TournamentOptions[y] = t.Options[y]; } } } t.tourneyPos = 0; uWExportFunction('ptSetTourneyPos', Tabs.Tournament.SetTourneyPos); var params = uW.Object.clone(uW.g_ajaxparams); params.format = 2; params.tournyPos = 0; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getTOMLeaderboard.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if(rslt.endDate>uW.unixtime()) { var elem = ById("bttcTournament"); elem.setAttribute("style","color:#f00"); } }, },true); }, SetTourneyPos : function (tab) { var t = Tabs.Tournament; t.tourneyPos = tab; t.paintTournament(); }, hide: function () { var t = Tabs.Tournament; clearTimeout(t.displayTimer); }, show: function () { var t = Tabs.Tournament; clearTimeout(t.displayTimer); var m = '<div class=divHeader align=center>'+tx('TOURNAMENT')+'</div><div id=BTHeaderDiv> </div>'; m += '<DIV class=divHeader align=center>'+tx('POPULATION AND PRODUCTION INFORMATION')+'</div><div id=BTPopDiv> </div>'; m += '<div id=BTDetailDiv style="max-height:535px; overflow-y:scroll" align="center"> </div><br>'; t.myDiv.innerHTML = m; t.paintPopulation(); t.paintTournament(); t.displayTimer = setTimeout(t.paintTournament, 240000); }, expand: function (lg) { var t = Tabs.Tournament; if (ById('BOTourneyPM').value == "Maximize") { ById('BOTourneyPM').value = "Minimize"; Options.TournamentOptions.TournamentLines = lg; } else { ById('BOTourneyPM').value = "Maximize"; Options.TournamentOptions.TournamentLines = 5; } saveOptions(); t.paintTournament(); }, leadertoggle: function () { var t = Tabs.Tournament; if (Options.TournamentOptions.TourneyBoardType == 1) { Options.TournamentOptions.TourneyBoardType = 2; } else { Options.TournamentOptions.TourneyBoardType = 1; } saveOptions(); t.paintTournament(); }, paintPopulation: function () { var t = Tabs.Tournament; var mhtl = "<table width=100% class=xtab><tr><td> </td>"; for (var i = 0; i < Cities.numCities; i++) { mhtl += "<TD align=center valign=bottom width=60px><B>" + Cities.cities[i].name + "</B></TD>"; } mhtl += "</tr><tr class=oddRow><td>"; mhtl += '<SELECT id="TTroopsPerHr">'; for (var y in uW.unitnamedesctranslated) { if (!uW.cm.BarracksUnitsTypeMap.isUnitType(y.substr(3), "rare")) { if (y.substr(3) == Options.TournamentOptions.TourneyTroopType) { mhtl += '<option selected value="' + y.substr(3) + '">' + uW.unitnamedesctranslated[y][0] + '</option>'; } else { mhtl += '<option value="' + y.substr(3) + '">' + uW.unitnamedesctranslated[y][0] + '</option>'; } // if (y.substr(3) > 4) break; // only 1 pop per troop makes sense here } } mhtl += '</select>'; mhtl += " "+tx('/h')+"</td>"; var temps = []; for (var i = 0; i < Cities.numCities; i++) { temps[i] = (3600 / (getTrainTime(Options.TournamentOptions.TourneyTroopType,100000,Cities.cities[i].id)/100000)); if (temps[i]!= 'Infinity' && !isNaN(temps[i])) { mhtl += "<td align=right><div class=xtabBorder>" + addCommas(parseInt(temps[i])) + "</div></td>"; } else { mhtl += "<td align=right><div class=xtabBorder>n/a</div></td>"; } } mhtl += '</tr><tr class=evenRow><td>'+TroopImage(Options.TournamentOptions.TourneyTroopType,'width:20px;height:20px;vertical-align:middle;')+' '+tx('Might Gain/h')+'</td>'; var mght = []; for (var i = 0; i < Cities.numCities; i++) { cityID = 'city' + Cities.cities[i].id; mght[i] = temps[i]*uW.unitstats["unt"+Options.TournamentOptions.TourneyTroopType][6]; mhtl += "<td align=right><div class=xtabBorder>" + addCommas(parseInt(mght[i])) + "</div></td>"; } mhtl += '</tr><tr class=oddRow><td><img height=18 src="'+IMGURL+'population_40.png" title="Population Usage"> '+tx('Population Usage/h')+'</td>'; var temps2 = []; for (var i = 0; i < Cities.numCities; i++) { cityID = 'city' + Cities.cities[i].id; temps2[i] = temps[i]*uW.unitcost["unt"+Options.TournamentOptions.TourneyTroopType][6]; mhtl += "<td align=right><div class=xtabBorder>" + addCommas(parseInt(temps2[i])) + "</div></td>"; } mhtl += '</tr><tr class=evenRow><td><img height=18 src="'+IMGURL+'population_40.png" title="Population Growth"> '+tx('Population Growth/h')+'</td>'; var pop = []; for (var i = 0; i < Cities.numCities; i++) { cityID = 'city' + Cities.cities[i].id; pop[i] = parseIntNan(Seed.citystats[cityID]["pop"][1]) / 2; mhtl += "<td align=right><div class=xtabBorder>" + addCommas(parseInt(pop[i])) + "</div></td>"; } mhtl += "</tr><tr><td><b>"+tx('Difference')+"</b></td>"; var diff = 0; for (var i = 0; i < Cities.numCities; i++) { diff = parseIntNan(pop[i]) - parseIntNan(temps2[i]); var bonc = ""; if (diff < 0) bonc = "whiteOnRed"; mhtl += "<td align=right><div class='xtabBorder "+bonc+"'><b>"+addCommas(parseInt(diff))+"</b></div></td>"; } mhtl += '</tr><tr><td><img height=18 src="'+IMGURL+'happiness.png title=Happiness> '+tx('happiness')+'</td>'; for (var i = 0; i < Cities.numCities; i++) { cityID = 'city' + Cities.cities[i].id; var bon = parseInt(Seed.citystats[cityID]["pop"][2]); var bonc = "whiteOnRed"; if (bon > 99) bonc = "whiteOnGreen"; mhtl += "<td align=center><div class='xtabBorder "+bonc+"'><b>"+bon+"%</div></td>"; } var now = unixTime(); mhtl += "</tr><tr><td><b>"+tx('Queue')+"</b></td>"; for (var i = 0; i < Cities.numCities; i++) { cityID = 'city' + Cities.cities[i].id; var totTime = 0; var q = Seed.queue_unt[cityID]; if (q != null && q.length > 0) totTime = q[q.length - 1][3] - now; if (totTime < 0) totTime = 0; var bonc = ""; if (totTime < 3600) bonc = "whiteOnRed"; mhtl += "<td align=center><div class='xtabBorder "+bonc+"'><b>"+timestr(totTime)+"</div></td>"; } mhtl += "</tr></table><br>"; ById('BTPopDiv').innerHTML = mhtl; ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); ChangeOption('TournamentOptions','TTroopsPerHr','TourneyTroopType',t.paintPopulation); }, paintTournament : function () { var t = Tabs.Tournament; ById('BTDetailDiv').innerHTML = "<div align=center>"+tx('Loading')+"...</div>"; var params = uW.Object.clone(uW.g_ajaxparams); params.format = 2; params.tournyPos = t.tourneyPos; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getTOMLeaderboard.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { var prevs = []; for (var s = 0; s < 4; s++) { w = rslt["previous" + s]; if (w && w > -1) { prevs.push(uW.formatDateByUnixTime(w)); } } if (!rslt.data) { var m = "<div><br><center><b>"+tx('No Active Tournaments')+"!</b></center></div>"; for (var s = 0; s < prevs.length; s++) { m += "<div><br><center><b><a class=xlink onclick='ptSetTourneyPos(" + s + 1 + ")'>"+tx('Show Tournament that ended on')+" " + prevs[s] + "</a></b></center></div>"; } m += '<br>'; ById('BTHeaderDiv').innerHTML = m; ById('BTDetailDiv').innerHTML = tx("No Results"); ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); } else { // rslt.data var m = ""; if (t.tourneyPos != 0) { m += "<div><br><center><b><a class=xlink onclick='ptSetTourneyPos(0)'>"+tx('Show Current Tournament (if any)')+"</a></b></center></div>"; } for (var s = 0; s < prevs.length; s++) { if (t.tourneyPos != (s + 1)) { m += "<div><br><center><b><a class=xlink onclick='ptSetTourneyPos(" + s + 1 + ")'>"+tx('Show Tournament that ended on')+" " + prevs[s] + "</a></b></center></div>"; } } m += '<br>'; ById('BTHeaderDiv').innerHTML = m; ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); var n = ''; if (rslt.name) { n += "<div class=divHeader align=center>" + rslt.name.toUpperCase() + "</div>"; } else { n += "<div class=divHeader align=center>" + uW.g_js_strings.commonstr.tournament.toUpperCase() + "</div>"; } if (rslt.description) { n += "<div align=center>" + rslt.description + "<br> </div>"; } n += "<div>"; if (rslt.startDate && rslt.endDate) { var startTime = rslt.startDate; var endTime = rslt.endDate; var now = parseInt(new Date().getTime() / 1000); n += "<table width=98% align=center class=xtab><tr><td width=40%><b>"+tx('Starts')+"</td><td width=40%><b>"+tx('Ends')+"</td><td align=right width=20%><b>"+tx('Time Left')+"</td></tr>"; dt = new Date(); dt.setTime(startTime * 1000); dtf = new Date(); dtf.setTime(endTime * 1000); var remain = endTime - now; n += "<tr><td>"+formatUnixTime(rslt.startDate)+"</td><td>"+formatUnixTime(rslt.endDate); if (remain > 0) { n += "</td><td align=right>" + timestr(remain, 1) + "</td></tr></table>"; } else { n += "</td><td align=right>"+tx('ENDED')+"!</td></tr></table>"; } n +="<br>"; } if ((Options.TournamentOptions.TourneyBoardType == 2) && rslt.worldPlayer) { n += '<center>'; n += '<table class=xtab width="98%" cellpadding="0" cellspacing="0" border="0"><tr><td width="25%"><b>'+rslt.worldPlayer.name||tx('Your Stats'); n += '</b></td><td align=center>'; if (rslt.type == 25) { n += uW.g_js_strings.modal_tourny_changetab.glorygained+': '; } else { n += uW.g_js_strings.modal_tourny_changetab.mightgained+': '; } n += addCommas(rslt.worldPlayer.contestValue||0); n += '</td><td width="25%" align=right>'; n += uW.g_js_strings.commonstr.ranking+': '+(rslt.worldPlayer.ranking||'N/A')+' ('+rslt.bracketName+')'; n += '</td></tr></table></center><br>'; } else { if (rslt.player) { n += '<center>'; n += '<table class=xtab width="98%" cellpadding="0" cellspacing="0" border="0"><tr><td width="25%"><b>'+rslt.player.name||tx('Your Stats'); n += '</b></td><td align=center>'; if (rslt.type == 25) { n += uW.g_js_strings.modal_tourny_changetab.glorygained+': '; } else { n += uW.g_js_strings.modal_tourny_changetab.mightgained+': '; } n += addCommas(rslt.player.contestValue||0); n += '</td><td width="25%" align=right>'; n += uW.g_js_strings.commonstr.ranking+': '+(rslt.player.ranking||'N/A')+' ('+uW.g_js_strings.modal_tourny_changetab.domainLeaders.replace("%1$s", uW.domainName)+')'; n += '</td></tr></table></center><br>'; } } if ((Options.TournamentOptions.TourneyBoardType != 2) || !rslt.worldData) { tourneystats = rslt.data; allititle = uW.g_js_strings.commonstr.alliance; brackettitle = uW.g_js_strings.modal_tourny_changetab.domainLeaders.replace("%1$s", uW.domainName); Options.TournamentOptions.TourneyBoardType = 1; saveOptions(); } else { tourneystats = rslt.worldData; allititle = tx('Server'); brackettitle = rslt.bracketName; } n += '<center>'; n += '<table class=xtab width="98%" cellpadding="0" cellspacing="0" border="0"><tr><td width="25%"><input type=button id=BTLeaders value="-"></td><td align=center>'; if (rslt.lastUpdated && (t.tourneyPos == 0)) { var now = parseInt(new Date().getTime() / 1000); var lastUpdated = convertTime(new Date(rslt.lastUpdated.replace(" ","T")+"Z")); var updated = now - lastUpdated; n += "<div>"+tx('Last updated')+" " + timestr(updated, 1) + " "+tx('ago')+".</div>"; } n += '</td><td width="25%" align=right><input type=button id=BOTourneyPM value="-">'; var TitleColour = 'rgba('+HEXtoRGB(Options.Colors.PanelText).r+','+HEXtoRGB(Options.Colors.PanelText).g+','+HEXtoRGB(Options.Colors.PanelText).b+',0.5)'; n += '</td></tr></table><div style="color:'+TitleColour+';font-size:14px;"><b>'; if (Options.TournamentOptions.TourneyBoardType != 2) { n += uW.g_js_strings.modal_tourny_changetab.domainLeaders.replace("%1$s", uW.domainName); } else { n += rslt.bracketName; } n += '</b></div>'; n += "<table cellSpacing=0 width=90% height=0%><tr>"; if (rslt.type == 24 && rslt.subType=="A") { // alliance? n += "<td class=xtabHD>"+uW.g_js_strings.commonstr.ranking+"</td><td class=xtabHD>"+uW.g_js_strings.commonstr.chancellor+"</td><td class=xtabHD>"+allititle+"</td><td class=xtabHD>"+uW.g_js_strings.modal_tourny_changetab.mightgained+"</td><td class=xtabHD>"+uW.g_js_strings.modal_tourny_changetab.rewardperplayer+"</td>"; } else { n += "<td class=xtabHD>"+uW.g_js_strings.commonstr.ranking+"</td><td class=xtabHD>"+uW.g_js_strings.commonstr.player+"</td><td class=xtabHD>"+allititle+"</td><td class=xtabHD>"; if (rslt.type == 24) { n += uW.g_js_strings.modal_tourny_changetab.mightgained; } else { if (rslt.type == 25) { n += uW.g_js_strings.modal_tourny_changetab.glorygained; } else { n += rslt.contestcategory; } } n += "</td><td class=xtabHD>"+uW.g_js_strings.commonstr.reward+"</td>"; } n += "</tr>"; var nb = tourneystats.length; var YourScore = rslt.player.contestValue||0; for (var i = 0; i < Options.TournamentOptions.TournamentLines; i++) { if (tourneystats[i] == null) break; var row = tourneystats[i]; var rewardString = " "; if (row.itemType) { rewardString = row.itemCount + " "; if (row.itemType == 0) { rewardString += uW.g_js_strings.commonstr.gems; } else { rewardString += uW.itemlist["i" + row.itemType].name; } } var rowcol = ""; if (rslt.type == 24 && rslt.subType=="A") { //Alliance Tournament if (getMyAlliance()[1] == row.alliance) { rowcol = "whiteOnGreen"; } } else { if (uW.tvuid == row.userId) { rowcol = "whiteOnGreen"; } } if (i % 2 == 1) { n += "<tr class=oddRow>"; } else { n += "<tr class=evenRow>"; } n += "<td class='xtab "+rowcol+"'><b>"+row.ranking+"</b></td><td class='xtab "+rowcol+"'>"+row.name+"</td><td class='xtab "+rowcol+"'>"+(row.alliance || "---")+"</td><td class='xtab "+rowcol+"'>"+addCommas(row.contestValue); if (YourScore > 0) { var ScoreDiff = parseInt(row.contestValue - YourScore); if (ScoreDiff > 0) { n += " (+" + addCommas(ScoreDiff) + ")"; } if (ScoreDiff < 0) { n += " (" + addCommas(ScoreDiff) + ")"; } } n += "</td><td class='xtab "+rowcol + "'>"+rewardString+"</td></tr>"; } if (rslt.type != 24 || rslt.subType!="A") { for (var i = Options.TournamentOptions.TournamentLines; i < tourneystats.length; i++) { if (tourneystats[i] == null) break; var row = tourneystats[i]; var rowcol = "whiteOnGreen"; if (uW.tvuid == row.userId) { var rewardString = " "; if (row.itemType) { rewardString = row.itemCount + " "; if (row.itemType == 0) { rewardString += uW.g_js_strings.commonstr.gems; } else { rewardString += uW.itemlist["i" + row.itemType].name; } } n += "<tr><td class='xtab "+rowcol+"'><b>"+row.ranking+"</b></td><td class='xtab "+rowcol+"'>"+row.name+"</td><td class='xtab "+rowcol+"'>"+(row.alliance || "---")+"</td><td class='xtab "+rowcol+"'>"+addCommas(row.contestValue)+"</td><td class='xtab "+rowcol+"'>"+rewardString+"</td></tr>"; } } } n += "</table></div>"; ById('BTDetailDiv').innerHTML = n; ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); ById('BOTourneyPM').addEventListener('click', function () { var lg = tourneystats.length; t.expand(lg); }, false); if (Options.TournamentOptions.TournamentLines == 5) { ById('BOTourneyPM').value = tx("Maximize"); } else { ById('BOTourneyPM').value = tx("Minimize"); Options.TournamentOptions.TournamentLines = tourneystats.length; } if (Options.TournamentOptions.TourneyBoardType != 2) { ById('BTLeaders').value = rslt.bracketName; } else { ById('BTLeaders').value = tx("Show Your Bracket")+" (" + uW.g_js_strings.modal_tourny_changetab.domainLeaders.replace("%1$s", uW.domainName) + ")"; } if (!rslt.worldData) { ById('BTLeaders').style.display = 'none'; } ById('BTLeaders').addEventListener('click', function () { t.leadertoggle(); }, false); } } else { ById('BTDetailDiv').innerHTML = "<div align=center>"+tx('No Information')+"</div>"; ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); } }, onFailure: function () { ById('BTDetailDiv').innerHTML = "<div align=center>"+tx('Error Reading Tournament Information')+"</div>"; ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); } },true); }, }