diff --git a/code/map_data.js b/code/map_data.js index 196a975e..3fbddbef 100644 --- a/code/map_data.js +++ b/code/map_data.js @@ -70,6 +70,7 @@ window.handleDataResponse = function(data, textStatus, jqXHR) { // https://github.com/Leaflet/Leaflet/issues/185 var ppp = []; var p2f = {}; + PRL.resetOrInit(); $.each(m, function(qk, val) { $.each(val.deletedGameEntityGuids, function(ind, guid) { if(getTypeByGuid(guid) === TYPE_FIELD && window.fields[guid] !== undefined) { @@ -98,7 +99,7 @@ window.handleDataResponse = function(data, textStatus, jqXHR) { ) return; - + PRL.pushPortal(ent); ppp.push(ent); // delay portal render } else if(ent[2].edge !== undefined) { renderLink(ent); @@ -147,6 +148,7 @@ window.handleDataResponse = function(data, textStatus, jqXHR) { if(portalUpdateAvailable) renderPortalDetails(selectedPortal); resolvePlayerNames(); + renderUpdateStatus(); } // removes entities that are still handled by Leaflet, although they diff --git a/code/utils_misc.js b/code/utils_misc.js index 1f640e78..c4e9cdc7 100644 --- a/code/utils_misc.js +++ b/code/utils_misc.js @@ -2,6 +2,60 @@ // UTILS + MISC /////////////////////////////////////////////////////// +// PRL - Portal Render Limit +window.PRL = function() {} + +window.PRL.resetOrInit = function () { + PRL.initialized = true; + PRL.minLevel = -1; + PRL.minLevelSet = false; + PRL.newPortalsPerLevel = new Array(MAX_PORTAL_LEVEL+1); + for(var i = 0; i <= MAX_PORTAL_LEVEL; i++) { + PRL.newPortalsPerLevel[i] = 0; + } +} + +window.PRL.pushPortal = function(ent) { + var portalGuid = ent[0]; + var portalLevel = parseInt(getPortalLevel(ent[2])); + var layerGroup = portalsLayers[portalLevel]; + + if(findEntityInLeaflet(layerGroup, window.portals, ent[0])) return; + PRL.newPortalsPerLevel[portalLevel]++; +} + +window.PRL.getMinLevel = function() { + if(!PRL.initialized) return -1; + if(!PRL.minLevelSet) PRL.setMinLevel(); + return PRL.minLevel; +} + +window.PRL.setMinLevel = function() { + var totalPortalsCount = 0; + PRL.minLevel = MAX_PORTAL_LEVEL + 1; + + // Find the min portal level under render limit + while(PRL.minLevel > 0) { + var oldPortalCount = layerGroupLength(portalsLayers[PRL.minLevel - 1]); + totalPortalsCount += oldPortalCount + PRL.newPortalsPerLevel[PRL.minLevel - 1]; + if(totalPortalsCount >= MAX_DRAWN_PORTALS) + break; + PRL.minLevel--; + } + + // If render limit reached at max portal level, still let portal at max level render + if(PRL.minLevel === MAX_PORTAL_LEVEL + 1) PRL.minLevel = MAX_PORTAL_LEVEL; + PRL.minLevelSet = true; +} + +window.layerGroupLength = function(layerGroup) { + var layersCount = 0; + var layers = layerGroup._layers; + if (layers) + layersCount = Object.keys(layers).length; + return layersCount; +} + // retrieves parameter from the URL?query=string. window.getURLParam = function(param) { var v = document.URL; @@ -152,7 +206,11 @@ window.getMinPortalLevel = function() { var z = map.getZoom(); if(z >= 16) return 0; var conv = ['impossible', 8,7,7,6,6,5,5,4,4,3,3,2,2,1,1]; - return conv[z]; + var minLevelByRenderLimit = PRL.getMinLevel(); + var result = minLevelByRenderLimit > conv[z] + ? minLevelByRenderLimit + : conv[z]; + return result; } // returns number of pixels left to scroll down before reaching the diff --git a/main.js b/main.js index 4523e8b4..97cf6a52 100644 --- a/main.js +++ b/main.js @@ -186,6 +186,7 @@ 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 +window.MAX_PORTAL_LEVEL = 8; // OTHER MORE-OR-LESS CONSTANTS ////////////////////////////////////// window.TEAM_NONE = 0;