Plugin AP List: New function - Simulating the AP change of other portals when a portal is destroyed. Change: Show counts of Resonators, Links, Control Fields of a portal in enemy portal AP breakdown.
This commit is contained in:
parent
c5012c2d3b
commit
afb8c78a05
@ -1,11 +1,11 @@
|
|||||||
// ==UserScript==
|
// ==UserScript==
|
||||||
// @id iitc-plugin-ap-list@xelio
|
// @id iitc-plugin-ap-list@xelio
|
||||||
// @name iitc: AP List
|
// @name iitc: AP List
|
||||||
// @version 0.3
|
// @version 0.4
|
||||||
// @namespace https://github.com/breunigs/ingress-intel-total-conversion
|
// @namespace https://github.com/breunigs/ingress-intel-total-conversion
|
||||||
// @updateURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/ap-list.user.js
|
// @updateURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/ap-list.user.js
|
||||||
// @downloadURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/ap-list.user.js
|
// @downloadURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/ap-list.user.js
|
||||||
// @description List top 10 portals by AP of either faction. Hover over AP will show breakdown of AP. Click on portal name will select the portal. Double click on portal name will zoom to and select portal. Portals before zooming in will be cached and count in top portal. They will be cleared if you click the "↻ R" or move out of the area.
|
// @description List top 10 portals by AP of either faction. Other functions and controls please refer to the Userguide. (https://github.com/breunigs/ingress-intel-total-conversion/wiki/Userguide-%28Main-Vanilla-IITC%29#wiki-pluginsAPListUserGuide)
|
||||||
// @include https://www.ingress.com/intel*
|
// @include https://www.ingress.com/intel*
|
||||||
// @match https://www.ingress.com/intel*
|
// @match https://www.ingress.com/intel*
|
||||||
// ==/UserScript==
|
// ==/UserScript==
|
||||||
@ -36,6 +36,8 @@ window.plugin.apList.useCachedPortals = false;
|
|||||||
window.plugin.apList.cacheBounds;
|
window.plugin.apList.cacheBounds;
|
||||||
window.plugin.apList.cacheActiveZoomLevel;
|
window.plugin.apList.cacheActiveZoomLevel;
|
||||||
|
|
||||||
|
window.plugin.apList.destroyPortalsGuid = new Array();
|
||||||
|
|
||||||
|
|
||||||
window.plugin.apList.handleUpdate = function() {
|
window.plugin.apList.handleUpdate = function() {
|
||||||
if(!requests.isLastRequest('getThinnedEntitiesV2')) return;
|
if(!requests.isLastRequest('getThinnedEntitiesV2')) return;
|
||||||
@ -45,22 +47,66 @@ window.plugin.apList.handleUpdate = function() {
|
|||||||
|
|
||||||
// Generate html table from top portals
|
// Generate html table from top portals
|
||||||
window.plugin.apList.updatePortalTable = function(side) {
|
window.plugin.apList.updatePortalTable = function(side) {
|
||||||
|
var displayEnemy = (plugin.apList.displaySide === window.plugin.apList.SIDE_ENEMY);
|
||||||
|
|
||||||
var content = '<table style="width: 100%; table-layout:fixed">';
|
var content = '<table style="width: 100%; table-layout:fixed">';
|
||||||
for(var i = 0; i < plugin.apList.topMaxCount; i++) {
|
for(var i = 0; i < plugin.apList.topMaxCount; i++) {
|
||||||
var portal = plugin.apList.sortedPortals[side][i];
|
var portal = plugin.apList.sortedPortals[side][i];
|
||||||
content += '<tr>'
|
content += '<tr>';
|
||||||
+ '<td style="width: 85%; overflow:hidden; white-space:nowrap">'
|
// Only enemy portal list will display destroy checkbox
|
||||||
+ (portal ? plugin.apList.getPortalLink(portal) : ' ')
|
if(displayEnemy) {
|
||||||
+ '</td>'
|
content += '<td style="width: 5%; height: 1px">'
|
||||||
+ '<td>'
|
+ (portal ? plugin.apList.getPortalDestroyCheckbox(portal) : ' ')
|
||||||
+ (portal ? plugin.apList.getPortalApText(portal) : ' ')
|
+ '</td>';
|
||||||
+ '</td>'
|
}
|
||||||
+ '</tr>';
|
content += '<td style="width: ' + (displayEnemy ? '80%' : '85%')
|
||||||
|
+ '; overflow:hidden; white-space:nowrap">'
|
||||||
|
+ (portal ? plugin.apList.getPortalLink(portal) : ' ')
|
||||||
|
+ '</td>'
|
||||||
|
+ '<td>'
|
||||||
|
+ (portal ? plugin.apList.getPortalApText(portal) : ' ')
|
||||||
|
+ '</td>'
|
||||||
|
+ '</tr>';
|
||||||
}
|
}
|
||||||
content += "</table>";
|
content += "</table>";
|
||||||
$('div#ap-list-table').html(content);
|
$('div#ap-list-table').html(content);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
window.plugin.apList.getPortalDestroyCheckbox = function(portal) {
|
||||||
|
// Change background color to border color if portal selected for destroy
|
||||||
|
var style = 'width: 10px; height: 10px; border: 1px solid rgb(32, 168, 177); margin: 0 auto; '
|
||||||
|
+ (plugin.apList.destroyPortalIndex(portal.guid) >= 0
|
||||||
|
? 'background-color: rgb(32, 168, 177);'
|
||||||
|
: '');
|
||||||
|
var onClick = 'window.plugin.apList.destroyPortal(\'' + portal.guid + '\');';
|
||||||
|
// 3 div for centering checkbox horizontally and vertically,
|
||||||
|
// click event on outest div for people with not so good aiming
|
||||||
|
var div = '<div style="display: table; height: 100%; width: 100%;" onclick="' + onClick + '">'
|
||||||
|
+ '<div style="display: table-cell; vertical-align: middle;">'
|
||||||
|
+ '<div style="' + style + '"/>'
|
||||||
|
+ '</div>'
|
||||||
|
+ '</div>';
|
||||||
|
return div;
|
||||||
|
}
|
||||||
|
|
||||||
|
window.plugin.apList.destroyPortal = function(guid) {
|
||||||
|
// Add to destroyPortalsGuid if not yet added, remove if already added
|
||||||
|
var portalIndex = plugin.apList.destroyPortalIndex(guid);
|
||||||
|
if(portalIndex >= 0) {
|
||||||
|
plugin.apList.destroyPortalsGuid.splice(portalIndex, 1);
|
||||||
|
} else {
|
||||||
|
plugin.apList.destroyPortalsGuid.push(guid);
|
||||||
|
}
|
||||||
|
|
||||||
|
plugin.apList.updateSortedPortals();
|
||||||
|
plugin.apList.updatePortalTable(plugin.apList.displaySide);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the index of portal in destroyPortalsGuid
|
||||||
|
window.plugin.apList.destroyPortalIndex = function(guid) {
|
||||||
|
return $.inArray(guid, plugin.apList.destroyPortalsGuid);
|
||||||
|
}
|
||||||
|
|
||||||
// Combine title and test
|
// Combine title and test
|
||||||
window.plugin.apList.getPortalApText = function(portal) {
|
window.plugin.apList.getPortalApText = function(portal) {
|
||||||
var title = plugin.apList.getPortalApTitle(portal);
|
var title = plugin.apList.getPortalApTitle(portal);
|
||||||
@ -83,6 +129,7 @@ window.plugin.apList.getPortalApTitle = function(portal) {
|
|||||||
t += 'Sum: ' + digits(playerApGain.totalAp) + ' AP';
|
t += 'Sum: ' + digits(playerApGain.totalAp) + ' AP';
|
||||||
} else {
|
} else {
|
||||||
t = 'Destroy & Capture:\n'
|
t = 'Destroy & Capture:\n'
|
||||||
|
+ 'R:' + playerApGain.resoCount + ' L:' + playerApGain.linkCount + ' CF:' + playerApGain.fieldCount + '\n'
|
||||||
+ 'Destroy AP\t=\t' + digits(playerApGain.destroyAp) + '\n'
|
+ 'Destroy AP\t=\t' + digits(playerApGain.destroyAp) + '\n'
|
||||||
+ 'Capture AP\t=\t' + digits(playerApGain.captureAp) + '\n'
|
+ 'Capture AP\t=\t' + digits(playerApGain.captureAp) + '\n'
|
||||||
+ 'Sum: ' + digits(playerApGain.totalAp) + ' AP';
|
+ 'Sum: ' + digits(playerApGain.totalAp) + ' AP';
|
||||||
@ -99,9 +146,13 @@ window.plugin.apList.getPortalLink = function(portal) {
|
|||||||
var jsDoubleClick = 'window.zoomToAndShowPortal(\''+portal.guid+'\', ['+latlng+']);return false';
|
var jsDoubleClick = 'window.zoomToAndShowPortal(\''+portal.guid+'\', ['+latlng+']);return false';
|
||||||
var perma = 'https://ingress.com/intel?latE6='+portal.locationE6.latE6
|
var perma = 'https://ingress.com/intel?latE6='+portal.locationE6.latE6
|
||||||
+'&lngE6='+portal.locationE6.lngE6+'&z=17&pguid='+portal.guid;
|
+'&lngE6='+portal.locationE6.lngE6+'&z=17&pguid='+portal.guid;
|
||||||
|
var style = plugin.apList.destroyPortalIndex(portal.guid) >= 0
|
||||||
|
? 'font-style:italic'
|
||||||
|
: '';
|
||||||
//Use Jquery to create the link, which escape characters in TITLE and ADDRESS of portal
|
//Use Jquery to create the link, which escape characters in TITLE and ADDRESS of portal
|
||||||
var a = $('<a>',{
|
var a = $('<a>',{
|
||||||
"class": 'help',
|
"class": 'help',
|
||||||
|
style: style,
|
||||||
text: portal.portalV2.descriptiveText.TITLE,
|
text: portal.portalV2.descriptiveText.TITLE,
|
||||||
title: portal.portalV2.descriptiveText.ADDRESS,
|
title: portal.portalV2.descriptiveText.ADDRESS,
|
||||||
href: perma,
|
href: perma,
|
||||||
@ -155,6 +206,81 @@ window.plugin.apList.updateSortedPortals = function() {
|
|||||||
return b.playerApGain.totalAp - a.playerApGain.totalAp;
|
return b.playerApGain.totalAp - a.playerApGain.totalAp;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Modify sortedPortals if any portal selected for destroy
|
||||||
|
if(plugin.apList.destroyPortalsGuid.length > 0) {
|
||||||
|
plugin.apList.handleDestroyPortal()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function will make AP gain of field and link only count once if
|
||||||
|
// one of the connected portal is selected for destroy
|
||||||
|
window.plugin.apList.handleDestroyPortal = function() {
|
||||||
|
var enemy = window.plugin.apList.SIDE_ENEMY;
|
||||||
|
var destroyedLinks = {};
|
||||||
|
var destroyedFields = {};
|
||||||
|
|
||||||
|
// Clean up portal selected for destroy, remove from destroyPortalsGuid
|
||||||
|
// if portal not exist or change to friendly side
|
||||||
|
plugin.apList.destroyPortalsGuid = $.grep(plugin.apList.destroyPortalsGuid, function(portalGuid,ind) {
|
||||||
|
var portal = plugin.apList.cachedPortals[portalGuid];
|
||||||
|
if(!portal || plugin.apList.portalSide(portal) !== enemy) return false;
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Loop through portals from highest AP to lowest AP, matching links and fields to the
|
||||||
|
// portal only if the portal is selected for destroy and have highest AP.
|
||||||
|
// Matching info stores in "destroyedLinks" and "destroyedFields"
|
||||||
|
$.each(plugin.apList.sortedPortals[enemy], function(ind, portal) {
|
||||||
|
if(plugin.apList.destroyPortalIndex(portal.guid) < 0) return true;
|
||||||
|
|
||||||
|
$.each(portal.portalV2.linkedEdges || [], function(ind,link) {
|
||||||
|
// Skip if the link already matched with a portal
|
||||||
|
if(destroyedLinks[link.edgeGuid]) return true;
|
||||||
|
belongTo = {portalGuid: portal.guid};
|
||||||
|
destroyedLinks[link.edgeGuid] = belongTo;
|
||||||
|
});
|
||||||
|
$.each(portal.portalV2.linkedFields || [], function(ind,field) {
|
||||||
|
// Skip if the field already matched with a portal
|
||||||
|
if(destroyedFields[field]) return true;
|
||||||
|
belongTo = {portalGuid: portal.guid};
|
||||||
|
destroyedFields[field] = belongTo;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Remove the link and field which was matched with another portal
|
||||||
|
var getApGainFunc = plugin.apList.playerApGainFunc[enemy];
|
||||||
|
$.each(plugin.apList.sortedPortals[enemy], function(ind, portal) {
|
||||||
|
// Filter out links which was matched with another portal
|
||||||
|
var newLinkedEdges = $.grep(portal.portalV2.linkedEdges || [], function(link,ind) {
|
||||||
|
if(!destroyedLinks[link.edgeGuid]) return true;
|
||||||
|
return (destroyedLinks[link.edgeGuid].portalGuid === portal.guid);
|
||||||
|
});
|
||||||
|
// Filter out fields which was matched with another portal
|
||||||
|
var newLinkedFields = $.grep(portal.portalV2.linkedFields || [], function(field,ind) {
|
||||||
|
if(!destroyedFields[field]) return true;
|
||||||
|
return (destroyedFields[field].portalGuid === portal.guid);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Skip modifying portal if no link and field changed
|
||||||
|
if(newLinkedEdges.length === (portal.portalV2.linkedEdges || []).length
|
||||||
|
&& newLinkedFields.length === (portal.portalV2.linkedFields || []).length)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// Clone the portal to avoid modifying original data in cachedPortal
|
||||||
|
var newPortal = $.extend(true, {}, portal);
|
||||||
|
// Assign new links and fields and calculate new playerApGain
|
||||||
|
if(portal.portalV2.linkedEdges) newPortal.portalV2.linkedEdges = newLinkedEdges;
|
||||||
|
if(portal.portalV2.linkedFields) newPortal.portalV2.linkedFields = newLinkedFields;
|
||||||
|
newPortal.playerApGain = getApGainFunc(newPortal);
|
||||||
|
|
||||||
|
plugin.apList.sortedPortals[enemy][ind] = newPortal;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Sorting portals with updated AP
|
||||||
|
plugin.apList.sortedPortals[enemy].sort(function(a, b) {
|
||||||
|
return b.playerApGain.totalAp - a.playerApGain.totalAp;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
window.plugin.apList.enableCache = function() {
|
window.plugin.apList.enableCache = function() {
|
||||||
@ -271,7 +397,10 @@ window.plugin.apList.getAttackApGain = function(d) {
|
|||||||
return {
|
return {
|
||||||
totalAp: totalAp,
|
totalAp: totalAp,
|
||||||
destroyAp: destroyAp,
|
destroyAp: destroyAp,
|
||||||
captureAp: captureAp
|
captureAp: captureAp,
|
||||||
|
resoCount: resoCount,
|
||||||
|
linkCount: linkCount,
|
||||||
|
fieldCount: fieldCount
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user