diff --git a/main.js b/main.js index f3939458..02b12969 100644 --- a/main.js +++ b/main.js @@ -181,27 +181,35 @@ window.NOMINATIM = 'http://nominatim.openstreetmap.org/search?format=json&limit= // INGRESS CONSTANTS ///////////////////////////////////////////////// // http://decodeingress.me/2012/11/18/ingress-portal-levels-and-link-range/ -var RESO_NRG = [0, 1000, 1500, 2000, 2500, 3000, 4000, 5000, 6000]; -var MAX_XM_PER_LEVEL = [0, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000]; -var MIN_AP_FOR_LEVEL = [0, 10000, 30000, 70000, 150000, 300000, 600000, 1200000]; -var HACK_RANGE = 40; // in meters, max. distance from portal to be able to access it -var OCTANTS = ['E', 'NE', 'N', 'NW', 'W', 'SW', 'S', 'SE']; -var DESTROY_RESONATOR = 75; //AP for destroying portal -var DESTROY_LINK = 187; //AP for destroying link -var DESTROY_FIELD = 750; //AP for destroying field -var CAPTURE_PORTAL = 500; //AP for capturing a portal -var DEPLOY_RESONATOR = 125; //AP for deploying a resonator -var COMPLETION_BONUS = 250; //AP for deploying all resonators on portal +window.RESO_NRG = [0, 1000, 1500, 2000, 2500, 3000, 4000, 5000, 6000]; +window.MAX_XM_PER_LEVEL = [0, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000]; +window.MIN_AP_FOR_LEVEL = [0, 10000, 30000, 70000, 150000, 300000, 600000, 1200000]; +window.HACK_RANGE = 40; // in meters, max. distance from portal to be able to access it +window.OCTANTS = ['E', 'NE', 'N', 'NW', 'W', 'SW', 'S', 'SE']; +window.DESTROY_RESONATOR = 75; //AP for destroying portal +window.DESTROY_LINK = 187; //AP for destroying link +window.DESTROY_FIELD = 750; //AP for destroying field +window.CAPTURE_PORTAL = 500; //AP for capturing a portal +window.DEPLOY_RESONATOR = 125; //AP for deploying a resonator +window.COMPLETION_BONUS = 250; //AP for deploying all resonators on portal // OTHER MORE-OR-LESS CONSTANTS ////////////////////////////////////// -var TEAM_NONE = 0, TEAM_RES = 1, TEAM_ENL = 2; -var TEAM_TO_CSS = ['none', 'res', 'enl']; -var TYPE_UNKNOWN = 0, TYPE_PORTAL = 1, TYPE_LINK = 2, TYPE_FIELD = 3, TYPE_PLAYER = 4, TYPE_CHAT = 5, TYPE_RESONATOR = 6; +window.TEAM_NONE = 0; +window.TEAM_RES = 1; +window.TEAM_ENL = 2; +window.TEAM_TO_CSS = ['none', 'res', 'enl']; +window.TYPE_UNKNOWN = 0; +window.TYPE_PORTAL = 1; +window.TYPE_LINK = 2; +window.TYPE_FIELD = 3; +window.TYPE_PLAYER = 4; +window.TYPE_CHAT = 5; +window.TYPE_RESONATOR = 6; -var SLOT_TO_LAT = [0, Math.sqrt(2)/2, 1, Math.sqrt(2)/2, 0, -Math.sqrt(2)/2, -1, -Math.sqrt(2)/2]; -var SLOT_TO_LNG = [1, Math.sqrt(2)/2, 0, -Math.sqrt(2)/2, -1, -Math.sqrt(2)/2, 0, Math.sqrt(2)/2]; -var EARTH_RADIUS=6378137; -var DEG2RAD = Math.PI / 180; +window.SLOT_TO_LAT = [0, Math.sqrt(2)/2, 1, Math.sqrt(2)/2, 0, -Math.sqrt(2)/2, -1, -Math.sqrt(2)/2]; +window.SLOT_TO_LNG = [1, Math.sqrt(2)/2, 0, -Math.sqrt(2)/2, -1, -Math.sqrt(2)/2, 0, Math.sqrt(2)/2]; +window.EARTH_RADIUS=6378137; +window.DEG2RAD = Math.PI / 180; // STORAGE /////////////////////////////////////////////////////////// // global variables used for storage. Most likely READ ONLY. Proper diff --git a/plugins/compute-ap-stats.user.js b/plugins/compute-ap-stats.user.js new file mode 100644 index 00000000..5d9a335f --- /dev/null +++ b/plugins/compute-ap-stats.user.js @@ -0,0 +1,132 @@ +// ==UserScript== +// @id iitc-plugin-compute-ap-stats@breunigs +// @name iitc: Compute AP statistics +// @version 0.1 +// @namespace https://github.com/breunigs/ingress-intel-total-conversion +// @updateURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/compute_AP_stats.user.js +// @downloadURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/compute_AP_stats.user.js +// @description Tries to determine overal AP stats for the current zoom +// @include http://www.ingress.com/intel* +// @match http://www.ingress.com/intel* +// ==/UserScript== + +function wrapper() { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + + +// PLUGIN START //////////////////////////////////////////////////////// + +// use own namespace for plugin +window.plugin.compAPStats = function() {}; + +window.plugin.compAPStats.setupCallback = function() { + $('#toolbox').append('Compute AP Stats '); +} + +window.plugin.compAPStats.compAPStats = function() { + + var totalAP_RES = 0; + var totalAP_ENL = 0; + + var allResEdges = new Array(); + var allResFields = new Array(); + var allEnlEdges = new Array(); + var allEnlFields = new Array(); + + + // Grab every portal in the viewable area and compute individual AP stats (ignoring links and fields for now) + $.each(window.portals, function(ind, portal) { + var d = portal.options.details + var resoCount = 0; + + // see how many resonators the portal has + $.each(d.resonatorArray.resonators, function(ind, reso) { + if(!reso) return true; + resoCount += 1; + }); + + // sum up the AP for the resonators, and any bonus + var resoAp = resoCount * DESTROY_RESONATOR; + var portalSum = resoAp + CAPTURE_PORTAL + 8*DEPLOY_RESONATOR + COMPLETION_BONUS; + + // Team1 is a Res portal, Team2 is a Enl portal + if ( getTeam(d) === TEAM_ENL ) { + totalAP_RES += portalSum; + + $.each(d.portalV2.linkedEdges, function(ind,edge) { + if(!edge) return true; + allEnlEdges.push(edge.edgeGuid); + }); + + $.each(d.portalV2.linkedFields, function(ind,field) { + if(!field) return true; + allEnlFields.push(field); + }); + } + else if ( getTeam(d) === TEAM_RES ) { + totalAP_ENL += portalSum; + + $.each(d.portalV2.linkedEdges, function(ind,edge) { + if(!edge) return true; + allResEdges.push(edge.edgeGuid); + }); + + $.each(d.portalV2.linkedFields, function(ind,field) { + if(!field) return true; + allResFields.push(field); + }); + } + else { + // it's a neutral portal, potential for both teams. by definition no fields or edges + totalAP_ENL += portalSum; + totalAP_RES += portalSum; + } + }); + + // Compute team field AP + allResFields = $.unique(allResFields); + totalAP_ENL += (allResFields.length * DESTROY_FIELD); + allEnlFields = $.unique(allEnlFields); + totalAP_RES += (allEnlFields.length * DESTROY_FIELD); + + // Compute team Link AP + allResEdges = $.unique(allResEdges); + totalAP_ENL += (allResEdges.length * DESTROY_LINK); + allEnlEdges = $.unique(allEnlEdges); + totalAP_RES += (allEnlEdges.length * DESTROY_LINK); + + return [totalAP_RES, totalAP_ENL]; +} + +window.plugin.compAPStats.guess = function() { + var res = window.plugin.compAPStats.compAPStats(); + var totalAP_RES = res[0]; + var totalAP_ENL = res[1]; + + var s = 'Calculated AP gain potential:\n\n'; + s += 'Available Resistance AP: \t' + digits(totalAP_RES) + '\n'; + s += 'Available Enlightened AP: \t' + digits(totalAP_ENL) + '\n'; + + alert(s); +} + +var setup = function() { + window.plugin.compAPStats.setupCallback(); +} + +// PLUGIN END ////////////////////////////////////////////////////////// + +if(window.iitcLoaded && typeof setup === 'function') { + setup(); +} else { + if(window.bootPlugins) + window.bootPlugins.push(setup); + else + window.bootPlugins = [setup]; +} +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +script.appendChild(document.createTextNode('('+ wrapper +')();')); +(document.body || document.head || document.documentElement).appendChild(script); diff --git a/plugins/compute_AP_stats.user.js b/plugins/compute_AP_stats.user.js deleted file mode 100644 index b87a6bd9..00000000 --- a/plugins/compute_AP_stats.user.js +++ /dev/null @@ -1,132 +0,0 @@ -// ==UserScript== -// @id iitc-plugin-compute-ap-stats@breunigs -// @name iitc: Compute AP statistics -// @version 0.1 -// @namespace https://github.com/breunigs/ingress-intel-total-conversion -// @updateURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/compute_AP_stats.user.js -// @downloadURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/compute_AP_stats.user.js -// @description Tries to determine overal AP stats for the current zoom -// @include http://www.ingress.com/intel* -// @match http://www.ingress.com/intel* -// ==/UserScript== - -function wrapper() { -// ensure plugin framework is there, even if iitc is not yet loaded -if(typeof window.plugin !== 'function') window.plugin = function() {}; - - -// PLUGIN START //////////////////////////////////////////////////////// - -// use own namespace for plugin -window.plugin.compAPStats = function() {}; - -window.plugin.compAPStats.setupCallback = function() { - $('#toolbox').append('Compute AP Stats '); -} - -window.plugin.compAPStats.compAPStats = function() { - var DESTROY_RESONATOR = 75; //AP for destroying portal - var DESTROY_LINK = 187; //AP for destroying link - var DESTROY_FIELD = 750; //AP for destroying field - var CAPTURE_PORTAL = 500; //AP for capturing a portal - var DEPLOY_RESONATOR = 125; //AP for deploying a resonator - var COMPLETION_BONUS = 250; //AP for deploying all resonators on portal - - var totalAP_RES = 0; - var totalAP_ENL = 0; - - //Grab every portal in the viewable area and compute individual AP stats - $.each(window.portals, function(ind, portal) { - var d = portal.options.details - var resoCount = 0; - - //This code lovingly copied and chopped from parent plugin func getDestroyAP(); - /////////////////////////////////////////////////////////////////////////// - $.each(d.resonatorArray.resonators, function(ind, reso) { - if(!reso) return true; - resoCount += 1; - }); - - //We'll count fields/links below so we don't duplicate AP - //var linkCount = d.portalV2.linkedEdges ? d.portalV2.linkedEdges.length : 0; - //var fieldCount = d.portalV2.linkedFields ? d.portalV2.linkedFields.length : 0; - - var resoAp = resoCount * DESTROY_RESONATOR; - //var linkAp = linkCount * DESTROY_LINK; - //var fieldAp = fieldCount * DESTROY_FIELD; - var sum = resoAp + CAPTURE_PORTAL + 8*DEPLOY_RESONATOR + COMPLETION_BONUS; - /////////////////////////////////////////////////////////////////////////// - - //Team1 is a Res portal, Team2 is a Enl portal - if ( getTeam(d) == 1 ) - totalAP_ENL += sum; - else if ( getTeam(d) == 2 ) - totalAP_RES += sum; - else { //it's a neutral portal, potential for both teams - totalAP_ENL += sum; - totalAP_RES += sum; - } - }); - - //Compute team field AP - $.each(window.fields, function(ind, field) { - //This is a hack that extrapolates the team based on the fill color of a field - //Yes, I know it's painful. We'd have an easier time if they would embed the - //filed details in the leaflet object like they do for portals. - var color = field.options.fillColor; //pukes out a string *sigh* - var team = 0; - - if( color == '#0088FF' ) //color is RES - totalAP_ENL += DESTROY_FIELD; - else if( color == '#03FE03' ) //color is Enl - totalAP_RES += DESTROY_FIELD; - }); - - //Compute team Link AP - $.each(window.links, function(ind, link) { - //This is a hack that extrapolates the team based on the fill color of a link - //Yes, I know it's painful. We'd have an easier time if they would embed the - //filed details in the leaflet object like they do for portals. - var color = link.options.color; //pukes out a string *sigh* - - var team = 0; - - if( color == '#0088FF' ) //color is RES - totalAP_ENL += DESTROY_LINK; - else if( color == '#03FE03' ) //color is Enl - totalAP_RES += DESTROY_LINK; - }); - - return [totalAP_RES, totalAP_ENL]; -} - -window.plugin.compAPStats.guess = function() { - var totalAP_RES = window.plugin.compAPStats.compAPStats()[0]; - var totalAP_ENL = window.plugin.compAPStats.compAPStats()[1]; - - var s = 'Total AP for viewable area:\n\n'; - s += 'Possible Resistance AP: ' + totalAP_RES + '\n'; - s += 'Possible Enlightened AP: ' + totalAP_ENL + '\n'; - - alert(s); -} - -var setup = function() { - window.plugin.compAPStats.setupCallback(); -} - -// PLUGIN END ////////////////////////////////////////////////////////// - -if(window.iitcLoaded && typeof setup === 'function') { - setup(); -} else { - if(window.bootPlugins) - window.bootPlugins.push(setup); - else - window.bootPlugins = [setup]; -} -} // wrapper end -// inject code into site context -var script = document.createElement('script'); -script.appendChild(document.createTextNode('('+ wrapper +')();')); -(document.body || document.head || document.documentElement).appendChild(script);