Ticket #3403: 3403.patch
File 3403.patch, 40.8 KB (added by , 9 years ago) |
---|
-
binaries/data/mods/public/art/textures/ui/global/charts/dot.blue.png
Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
-
binaries/data/mods/public/art/textures/ui/global/charts/dot.green.png
Property changes on: binaries/data/mods/public/art/textures/ui/global/charts/dot.blue.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
-
binaries/data/mods/public/art/textures/ui/global/charts/dot.grey.png
Property changes on: binaries/data/mods/public/art/textures/ui/global/charts/dot.green.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
-
binaries/data/mods/public/art/textures/ui/global/charts/dot.lightgray.png
Property changes on: binaries/data/mods/public/art/textures/ui/global/charts/dot.grey.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
-
binaries/data/mods/public/art/textures/ui/global/charts/dot.orange.png
Property changes on: binaries/data/mods/public/art/textures/ui/global/charts/dot.lightgray.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
-
binaries/data/mods/public/art/textures/ui/global/charts/dot.pink.png
Property changes on: binaries/data/mods/public/art/textures/ui/global/charts/dot.orange.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
-
binaries/data/mods/public/art/textures/ui/global/charts/dot.red.png
Property changes on: binaries/data/mods/public/art/textures/ui/global/charts/dot.pink.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
-
binaries/data/mods/public/art/textures/ui/global/charts/dot.turquois.png
Property changes on: binaries/data/mods/public/art/textures/ui/global/charts/dot.red.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
-
binaries/data/mods/public/art/textures/ui/global/charts/dot.yellow.png
Property changes on: binaries/data/mods/public/art/textures/ui/global/charts/dot.turquois.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
-
binaries/data/mods/public/art/textures/ui/global/charts/dot.blue.png
Property changes on: binaries/data/mods/public/art/textures/ui/global/charts/dot.yellow.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
-
binaries/data/mods/public/art/textures/ui/global/charts/dot.green.png
Property changes on: binaries/data/mods/public/art/textures/ui/global/charts/dot.blue.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
-
binaries/data/mods/public/art/textures/ui/global/charts/dot.grey.png
Property changes on: binaries/data/mods/public/art/textures/ui/global/charts/dot.green.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
-
binaries/data/mods/public/art/textures/ui/global/charts/dot.lightgray.png
Property changes on: binaries/data/mods/public/art/textures/ui/global/charts/dot.grey.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
-
binaries/data/mods/public/art/textures/ui/global/charts/dot.orange.png
Property changes on: binaries/data/mods/public/art/textures/ui/global/charts/dot.lightgray.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
-
binaries/data/mods/public/art/textures/ui/global/charts/dot.pink.png
Property changes on: binaries/data/mods/public/art/textures/ui/global/charts/dot.orange.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
-
binaries/data/mods/public/art/textures/ui/global/charts/dot.red.png
Property changes on: binaries/data/mods/public/art/textures/ui/global/charts/dot.pink.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
-
binaries/data/mods/public/art/textures/ui/global/charts/dot.turquois.png
Property changes on: binaries/data/mods/public/art/textures/ui/global/charts/dot.red.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
-
binaries/data/mods/public/art/textures/ui/global/charts/dot.yellow.png
Property changes on: binaries/data/mods/public/art/textures/ui/global/charts/dot.turquois.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
-
binaries/data/mods/public/gui/common/chart_sprites.xml
Property changes on: binaries/data/mods/public/art/textures/ui/global/charts/dot.yellow.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property
1 <?xml version="1.0" encoding="utf-8"?> 2 3 <sprites> 4 5 <!-- 6 ========================================== 7 Chart Bullets 8 ========================================== 9 --> 10 11 <!-- deactivated --> 12 <sprite name="chartDotP0"> 13 <image texture="global/charts/dot.grey.png" size="0 0 100% 100%"/> 14 </sprite> 15 16 <!-- activated --> 17 <sprite name="chartDotP1"> 18 <image texture="global/charts/dot.blue.png" size="0 0 100% 100%"/> 19 </sprite> 20 21 <sprite name="chartDotP2"> 22 <image texture="global/charts/dot.red.png" size="0 0 100% 100%"/> 23 </sprite> 24 25 <sprite name="chartDotP3"> 26 <image texture="global/charts/dot.green.png" size="0 0 100% 100%"/> 27 </sprite> 28 29 <sprite name="chartDotP4"> 30 <image texture="global/charts/dot.yellow.png" size="0 0 100% 100%"/> 31 </sprite> 32 33 <sprite name="chartDotP5"> 34 <image texture="global/charts/dot.turquois.png" size="0 0 100% 100%"/> 35 </sprite> 36 37 <sprite name="chartDotP6"> 38 <image texture="global/charts/dot.pink.png" size="0 0 100% 100%"/> 39 </sprite> 40 41 <sprite name="chartDotP7"> 42 <image texture="global/charts/dot.orange.png" size="0 0 100% 100%"/> 43 </sprite> 44 45 <sprite name="chartDotP8"> 46 <image texture="global/charts/dot.lightgray.png" size="0 0 100% 100%"/> 47 </sprite> 48 49 <!-- decoration --> 50 <sprite name="chartLineWhite"> 51 <image backcolor="white" size="0 0 100% 100%"/> 52 </sprite> 53 54 <sprite name="chartLineGray"> 55 <image backcolor="gray" size="0 0 100% 100%"/> 56 </sprite> 57 58 </sprites> -
binaries/data/mods/public/gui/common/functions_repeat_positioning.js
1 /* 2 DESCRIPTION : Functions related to positioning UI elements 3 NOTES : 4 */ 5 6 /** 7 * Horizontally spaces same-width objects repeated with the `<repeat>` tag 8 * @param basename The base name of the object, such as "object[n]" or "object[a]_sub[b]" 9 * @param splitvar The var identifying the repeat count, without the square brackets 10 * @param margin The gap, in px, between the repeated objects 11 * @return The number of elements affected 12 */ 13 function horizSpaceRepeatedObjects (basename, splitvar="n", margin=0) 14 { 15 basename = basename.split("["+splitvar+"]", 2); 16 for (let c = 0;;) 17 { 18 let objObj = Engine.GetGUIObjectByName(basename.join("["+ c +"]")); 19 if (!objObj) 20 return c; 21 22 let objSize = objObj.size; 23 let objWidth = objSize.right - objSize.left; 24 objSize.left = c * (objWidth + margin) + margin; 25 objSize.right = ++c * (objWidth + margin); 26 objObj.size = objSize; 27 } 28 } 29 30 /** 31 * Horizontally fit objects repeated with the `<repeat>` tag within a parent object 32 * @param basename The base name of the object, such as "object[n]" or "object[a]_sub[b]" 33 * @param splitvar The var identifying the repeat count, without the square brackets 34 * @param margin The gap, in px, between the repeated objects 35 * @param limit The number of elements to fit 36 * @return The number of elements affected 37 */ 38 function horizFitRepeatedObjects (basename, splitvar="n", margin=0, limit=0) 39 { 40 basename = basename.split("["+splitvar+"]", 2); 41 42 var objObj; 43 if (limit == 0) 44 do 45 objObj = Engine.GetGUIObjectByName(basename.join("["+ ++limit +"]")); 46 while (objObj !== undefined) 47 48 for (let c = 0; c < limit; ++c) 49 { 50 objObj = Engine.GetGUIObjectByName(basename.join("["+ c +"]")); 51 let objSize = objObj.size; 52 objSize.rleft = c * (100/limit); 53 objSize.rright = (c+1) * (100/limit); 54 objSize.right = -margin; 55 objObj.size = objSize; 56 } 57 58 return limit; 59 } 60 61 /** 62 * Vertically spaces same-height objects repeated with the `<repeat>` tag 63 * @param basename The base name of the object, such as "object[n]" or "object[a]_sub[b]" 64 * @param splitvar The var identifying the repeat count, without the square brackets 65 * @param margin The gap, in px, between the repeated objects 66 * @return The number of elements affected 67 */ 68 function vertiSpaceRepeatedObjects (basename, splitvar="n", margin=0) 69 { 70 basename = basename.split("["+splitvar+"]", 2); 71 for (let c=0;;) 72 { 73 let objObj = Engine.GetGUIObjectByName(basename.join("["+ c +"]")); 74 if (!objObj) 75 return c; 76 77 let objSize = objObj.size; 78 let objHeight = objSize.bottom - objSize.top; 79 objSize.top = c * (objHeight + margin) + margin; 80 objSize.bottom = ++c * (objHeight + margin); 81 objObj.size = objSize; 82 } 83 } 84 85 /** 86 * Hide all repeated elements after a certain index 87 * @param prefix The part of the element name preceeding the index 88 * @param idx The index from which to start 89 * @param prefix The part of the element name after the index 90 */ 91 function hideRemaining(prefix, idx, suffix) 92 { 93 for (;; ++idx) 94 { 95 let obj = Engine.GetGUIObjectByName(prefix+idx+suffix); 96 if (!obj) 97 break; 98 obj.hidden = true; 99 } 100 } -
binaries/data/mods/public/gui/page_summary.xml
8 8 9 9 <include>summary/summary.xml</include> 10 10 <include>summary/sprites.xml</include> 11 12 <include>common/chart_sprites.xml</include> 11 13 </page> -
binaries/data/mods/public/gui/summary/charts.js
1 /* globals Engine, horizSpaceRepeatedObjects, translate */ 2 3 var Charts = (function() { 4 5 "use strict"; 6 7 const DOTS = 110, HEIGHT = 470, DEBUG = 1, VERSION = "0.1.19a"; 8 9 /* Define member variables */ 10 var m_CurrMetric = 1; 11 var m_MatchLength; 12 var m_Metrics = [ 13 { "id": "buildings", "name": "Buildings" }, 14 { "id": "units", "name": "Units" }, 15 { "id": "food", "name": "Food" }, 16 { "id": "wood", "name": "Wood" }, 17 { "id": "stone", "name": "Stone" }, 18 { "id": "metal", "name": "Metal" }, 19 { "id": "explored", "name": "Explored" }, 20 { "id": "mapControl", "name": "Territory" }, 21 ]; 22 var m_Players = []; 23 24 /* ...and a shorthand */ 25 var $ = Engine.GetGUIObjectByName; 26 27 function deb () {if (DEBUG > 0){print(fmt.apply(null, arguments));}} 28 function tab (s, l) {l=l||8;s=new Array(l+1).join(" ")+s;return s.substr(s.length-l);} 29 function fmt () {var a=Array.prototype.slice.apply(arguments),s=a[0].split("%s"),p=a.slice(1).concat([""]),c=0;return s.map(function(t){return t + p[c++];}).join('');} 30 31 function getIdxFromName (name) { return +name.substring(name.indexOf("[")+1, name.indexOf("]")); } 32 33 function interpolate(data, points) 34 { 35 // http://www.hevi.info/2012/03/interpolating-and-array-to-fit-another-size/ 36 37 var newData = []; 38 var factor = (data.length - 1) / (points -1); 39 40 function linear(p1, p2, px) {return p1 + (p2 - p1) * px;} 41 42 newData[0] = data[0]; 43 newData[points -1] = data[data.length -1]; 44 45 for (let i=1; i<points-1; ++i){ 46 let tmp = i * factor; 47 let point = ~~tmp; 48 newData[i] = linear(data[point], data[point+1], tmp - point); 49 } 50 51 return newData; 52 } 53 54 function init(dataGame) 55 { 56 var maxPlayers = dataGame.playerStates.length; 57 m_MatchLength = Object.keys(dataGame.playerStates[1].chartData).length - 1; 58 59 deb("init: m_Players: %s, stamps: %s\n", maxPlayers -1, m_MatchLength); 60 61 // add common attributes to m_Metrics object 62 for (let m of m_Metrics) 63 { 64 m.points = {}; 65 m.min = 1e10; 66 m.max = 0; 67 } 68 69 // setup internal player object 70 for (let p=0; p<maxPlayers; ++p) 71 m_Players[p] = { 72 "visible": false, 73 "color": g_GameData.players[p].color 74 }; 75 76 // setup menu options 77 horizSpaceRepeatedObjects("chartMenu[m]", "m"); 78 var m = 0; 79 for (m in m_Metrics) 80 $("chartMenu["+m+"]_text").caption = translate(m_Metrics[m].name); 81 hideRemaining("chartMenu[", ++m, "]"); 82 83 // setup players' dots 84 horizSpaceRepeatedObjects("chartPlayer[p]", "p"); 85 for (let p=0; p<8; ++p) 86 { 87 // player dots 88 $("chartPlayerDot[" + p + "]").sprite = "chartDotP" + (p+1); 89 $("chartPlayerText[" + p + "]").caption = (p+1); 90 91 // data dots 92 horizSpaceRepeatedObjects("chartDot[" + p + "][d]", "d"); 93 for (let d=0;; ++d) 94 { 95 let objObj = $("chartDot[" + p + "][" + d + "]"); 96 if (!objObj) 97 break; 98 objObj.sprite = "chartDotP"+(p+1); 99 objObj.hidden = "true"; 100 } 101 } 102 103 // resample data to available amount of DOTS 104 for (let p=1; p<maxPlayers; ++p) 105 { 106 m_Players[p].visible = true; 107 for (let metricData of m_Metrics) 108 { 109 let chartData = dataGame.playerStates[p].chartData; 110 let data = Object.keys(chartData).map(stamp => chartData[stamp][metricData.id]); 111 // deb("init: p: %s, m: %s, data: %s\n", p, m, data); 112 metricData.points[p] = {}; 113 data = interpolate(data, DOTS); 114 // deb("init: p: %s, m: %s, data: %s\n", p, m, data); 115 metricData.points[p] = data; 116 } 117 } 118 119 // determine max/min 120 for (let metricData of m_Metrics) 121 { 122 123 let maxAll = metricData.max; 124 let minAll = metricData.min; 125 for (let p=1; p<maxPlayers; p++) 126 { 127 let minData = Math.min.apply(Math, metricData.points[p]); 128 minAll = minData < minAll ? minData : minAll; 129 let maxData = Math.max.apply(Math, metricData.points[p]); 130 maxAll = maxData > maxAll ? maxData : maxAll; 131 } 132 metricData.max = maxAll; 133 metricData.min = minAll; 134 deb("init: min: %s, max: %s, metric: %s\n", tab(~~minAll, 4), tab(~~maxAll, 6), metricData.id); 135 } 136 137 // scale data to GUI 138 for (let metricData of m_Metrics) 139 for (let p=1; p<maxPlayers; p++) 140 for (let d=0; d<DOTS; d++) 141 metricData.points[p][d] = HEIGHT * metricData.points[p][d] / metricData.max; 142 } 143 144 function togglePlayer(player) 145 { 146 var sprite = $("chartPlayerDot[" + (player-1) +"]"); 147 148 m_Players[player].visible = !m_Players[player].visible; 149 sprite.sprite = m_Players[player].visible ? "chartDotP" + player : "chartDotP0"; 150 showMetric(m_CurrMetric); 151 } 152 153 function showTicks() 154 { 155 var metric = m_Metrics[m_CurrMetric].id; 156 var ySuffix = (["explored", "mapControl"].indexOf(metric) > -1) ? "%" : ""; 157 158 $("chartTickTextYMax").caption = ~~m_Metrics[m_CurrMetric].max + ySuffix; 159 $("chartTickTextYHalf").caption = ~~(m_Metrics[m_CurrMetric].max / 2) + ySuffix; 160 $("chartTickTextXMax").caption = m_MatchLength + " min"; 161 $("chartTickTextXHalf").caption = ~~(m_MatchLength / 2) + " min"; 162 } 163 164 function showMetric(metric) 165 { 166 m_CurrMetric = metric; 167 168 // highlight current metric's text 169 for (let m in m_Metrics) 170 $("chartMenu["+m+"]_text").textcolor = "180 180 180"; 171 $("chartMenu["+metric+"]_text").textcolor = "255 255 255"; 172 173 deb("\n====> showMetric: %s (%s), min: %s, max: %s\n", m_Metrics[metric].id, metric, m_Metrics[metric].min, m_Metrics[metric].max); 174 175 var p; 176 for (p in m_Players) 177 { 178 if (+p === 0) 179 continue; 180 181 let player = m_Players[p]; 182 183 // data dots 184 if (m_Metrics[metric].points[p]) 185 { 186 let data = m_Metrics[metric].points[p]; 187 if (DEBUG) 188 { 189 let min = +Math.min.apply(Math, data); 190 let max = +Math.max.apply(Math, data); 191 deb("p: %s, vis: %s, len: %s, min: %s, max: %s\n", p, player.visible, data.length, min, max); 192 } 193 194 for (let i = 0; i < DOTS; i++) 195 { 196 let dot = $("chartDot[" +(p-1)+ "][" +i+ "]"); 197 dot.hidden = true; 198 199 if (player.visible) 200 { 201 let newSize = dot.size; 202 newSize.top = HEIGHT - data[i]; 203 newSize.bottom = newSize.top + 8; 204 dot.size = newSize; 205 dot.hidden = false; 206 } 207 } 208 } 209 } 210 hideRemaining("chartPlayer[", p, "]"); 211 212 showTicks(); 213 } 214 215 return { 216 action: function(metric, player, data) { 217 218 deb("\n====> Charts.action: %s, %s, %s\n", metric, player, data); 219 220 if (!metric && !player){init(data); showMetric(0); return;} 221 if ( metric && !player){showMetric(metric -1); return;} 222 if (!metric && player){togglePlayer(player); return;} 223 224 }, 225 "togglePlayer": function(elem_name) 226 { 227 if (!elem_name) 228 return; 229 togglePlayer(getIdxFromName(elem_name)+1); 230 }, 231 "changeMetric": function(elem_name) 232 { 233 if (!elem_name) 234 return; 235 showMetric(getIdxFromName(elem_name)); 236 } 237 }; 238 239 }()); 240 -
binaries/data/mods/public/gui/summary/summary.js
42 42 */ 43 43 function selectPanel(panelNumber) 44 44 { 45 var panelNames = [ 'scorePanel', 'buildingsPanel', 'unitsPanel', 'resourcesPanel', 'marketPanel', 'miscPanel' ];45 var panelNames = [ 'scorePanel', 'buildingsPanel', 'unitsPanel', 'resourcesPanel', 'marketPanel', 'miscPanel', 'chartPanel' ]; 46 46 47 47 function adjustTabDividers(tabSize) 48 48 { … … 60 60 Engine.GetGUIObjectByName(panelNames[panelNumber] + 'Button').sprite = "ForegroundTab"; 61 61 adjustTabDividers(Engine.GetGUIObjectByName(panelNames[panelNumber] + 'Button').size); 62 62 63 updatePanelData(panelsData[panelNumber]); 63 if (panelNumber<6){ 64 updatePanelData(panelsData[panelNumber]); 65 Engine.GetGUIObjectByName("generalPanel").hidden = false; 66 Engine.GetGUIObjectByName("chartPanel").hidden = true; 67 } else { 68 Engine.GetGUIObjectByName("generalPanel").hidden = true; 69 Engine.GetGUIObjectByName("chartPanel").hidden = false; 70 } 64 71 } 65 72 66 73 function updatePanelData(panelInfo) … … 122 129 updateCountersPlayer(playerState, panelInfo.counters, playerCounterValue); 123 130 } 124 131 // Update team counters 125 var teamCounterFn = panelInfo.teamCounterFn ;132 var teamCounterFn = panelInfo.teamCounterFn 126 133 if (g_Teams && teamCounterFn) 127 134 teamCounterFn(panelInfo.counters); 128 135 } … … 135 142 // Map 136 143 var mapDisplayType = translate("Scenario"); 137 144 145 // Initialize Charts 146 Charts.action(null, null, data); 147 138 148 Engine.GetGUIObjectByName("timeElapsed").caption = sprintf(translate("Game time elapsed: %(time)s"), { time: timeToString(data.timeElapsed) }); 139 149 140 150 Engine.GetGUIObjectByName("summaryText").caption = data.gameResult; -
binaries/data/mods/public/gui/summary/summary.xml
9 9 <objects> 10 10 <script file="gui/common/functions_global_object.js"/> 11 11 <script file="gui/common/functions_civinfo.js"/> 12 <script file="gui/common/functions_repeat_positioning.js"/> 12 13 <script file="gui/common/functions_utility.js"/> 13 14 <script file="gui/common/settings.js"/> 14 15 <script file="gui/summary/counters.js"/> 15 16 <script file="gui/summary/layout.js"/> 16 17 <script file="gui/summary/summary.js"/> 18 <script file="gui/summary/charts.js"/> 17 19 18 20 <object type="image" 19 21 style="ModernWindow" … … 99 101 </object> 100 102 </object> 101 103 104 <object name="chartPanelButton" type="button" sprite="BackgroundTab" size="762 92 880 120"> 105 <action on="Press">selectPanel(6);</action> 106 <object type="text" style="ModernLabelText" ghost="true"> 107 <translatableAttribute id="caption">Charts</translatableAttribute> 108 </object> 109 </object> 110 102 111 <object name="generalPanel" type="image" sprite="ForegroundBody" size="20 120 100%-20 100%-54"> 103 112 <object size="0 0 100% 100%-50"> 104 113 <object name="playerNameHeading" type="text" style="ModernLeftTabLabelText"> … … 121 130 <repeat count="8" var="n"> 122 131 <object type="image" name="playerBoxt[i][n]" size="10 0 10 30" hidden="true"> 123 132 <object name="playerColorBoxt[i][n]" type="image" size="10 4 30 24"/> 124 <object name="playerNamet[i][n]" type="text" size="40 2 208 100%" style="ModernLeftLabelText" 133 <object name="playerNamet[i][n]" type="text" size="40 2 208 100%" style="ModernLeftLabelText"/> 125 134 <object name="civIcont[i][n]" type="image" size="208 0 240 32"/> 126 135 <repeat var="x" count="8"> 127 136 <object name="valueDataTeam[i][n][x]" type="text" style="ModernTabLabelText"> … … 155 164 </object> 156 165 </object> 157 166 167 <!-- Charts Panel --> 168 <object name="chartPanel" type="image" sprite="ForegroundBody" size="20 120 100%-20 100%-58" hidden="true"> 169 170 <object size="0 0 100% 100%-30"> 171 172 <!-- Menu --> 173 <object size="45 24 100%-45 40"> 174 <repeat count="8"> 175 <object name="chartMenu[n]" type="button" size="0 0 80 100%"> 176 <action on="Press">Charts.changeMetric(this.name);</action> 177 <object name="chartMenu[n]_text" type="text" style="ModernLabelText" ghost="true"/> 178 </object> 179 </repeat> 180 </object> 181 182 <!-- Menu Line --> 183 <object name="chartLineHeader" type="image" sprite="chartLineWhite" size="40 42 100%-40 43"/> 184 185 <!-- Players --> 186 <object name="chartPlayer" type="text" style="ModernLabelText" size="600 46 680 66" textcolor="200 200 200">Player:</object> 187 188 <object size="670 46 700 66"> 189 <repeat count="8"> 190 <object name="chartPlayer[n]" type="button" size="0 0 30 20"> 191 <object name="chartPlayerDot[n]" type="image" sprite="chartDotP1" size="0 6 8 14"/> 192 <object name="chartPlayerText[n]" type="text" style="ModernLabelText" ghost="true" textcolor="200 200 200">1</object> 193 <action on="press">Charts.togglePlayer(this.name);</action> 194 </object> 195 </repeat> 196 </object> 197 198 <!-- X/Y Axis --> 199 <object name="chartLineAxisX" type="image" sprite="chartLineGray" size="30 540 960 541"/> 200 <object name="chartLineAxisY" type="image" sprite="chartLineGray" size="50 63 51 560"/> 201 202 <!-- Y Axis Ticks --> 203 <object name="chartTickAxisYMax" type="image" sprite="chartLineGray" size="40 70 50 72"/> 204 <object name="chartTickAxisYHalf" type="image" sprite="chartLineGray" size="40 300 50 302"/> 205 <object name="chartTickTextYMax" type="text" style="ModernLabelText" text_align = "right" size="5 75 45 90">100</object> 206 <object name="chartTickTextYHalf" type="text" style="ModernLabelText" text_align = "right" size="5 305 45 320">50</object> 207 208 <!-- X Axis Ticks --> 209 <object name="chartTickAxisXMax" type="image" sprite="chartLineGray" size="922 540 924 550"/> 210 <object name="chartTickAxisXHalf" type="image" sprite="chartLineGray" size="475 540 477 550"/> 211 <object name="chartTickTextXMax" type="text" style="ModernLabelText" text_align = "right" size="850 540 914 560">100 min</object> 212 <object name="chartTickTextXHalf" type="text" style="ModernLabelText" text_align = "right" size="405 540 469 560">50 min</object> 213 214 <!-- Dots --> 215 <object size="50-4 71-4 100% 100%"> 216 <repeat var="p" count="8"> 217 <object> 218 <repeat var="d" count="110"> 219 <object name="chartDot[p][d]" type="image" sprite="chartDotP0" size="0 0 8 8"/> 220 </repeat> 221 </object> 222 </repeat> 223 </object> 224 225 </object> 226 </object> 227 <!-- End Charts panel --> 228 158 229 <object type="button" style="ModernButtonRed" size="100%-160 100%-48 100%-20 100%-20"> 159 230 <translatableAttribute id="caption">Continue</translatableAttribute> 160 231 <action on="Press"><![CDATA[ 161 if ( g_GameData.isReplay)232 if (!Engine.HasXmppClient()) 162 233 { 163 Engine.SwitchGuiPage("page_replaymenu.xml");164 }165 else if (!Engine.HasXmppClient())166 {167 234 Engine.SwitchGuiPage("page_pregame.xml"); 168 235 } 169 236 else -
binaries/data/mods/public/simulation/components/ChartsTracker.js
1 2 // Updates every minute (60000) 3 const UPDATE_TIMER_INTERVAL = 60000, VERSION = "0.1.19a"; 4 5 function ChartsTracker() {} 6 7 ChartsTracker.prototype.Schema = "<a:component type='system'/><empty/>"; 8 9 ChartsTracker.prototype.GetChartData = function() 10 { 11 return this.chartData; 12 }; 13 14 ChartsTracker.prototype.Init = function() 15 { 16 var cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer); 17 this.updateTimer = cmpTimer.SetInterval(this.entity, IID_ChartsTracker, "updateData", 0, UPDATE_TIMER_INTERVAL, {}); 18 this.timeStamp = -1; 19 this.chartData = {}; 20 }; 21 22 ChartsTracker.prototype.updateData = function() 23 { 24 // Get player + range + stats manager 25 var cmpPlayer = Engine.QueryInterface(this.entity, IID_Player); 26 var id = cmpPlayer.GetPlayerID(); 27 var mapExplored = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager).GetPercentMapExplored(cmpPlayer.GetPlayerID()); 28 var mapControlled = Engine.QueryInterface(SYSTEM_ENTITY, IID_TerritoryManager).GetTerritoryPercentage(cmpPlayer.GetPlayerID()); 29 var resourceCount = cmpPlayer.GetResourceCounts(); 30 var statistics = Engine.QueryInterface(this.entity, IID_StatisticsTracker).GetStatistics(); 31 32 ++this.timeStamp; 33 34 this.chartData[this.timeStamp.toString()] = { 35 'mapControl': mapControlled, 36 'explored': mapExplored, 37 'food': resourceCount.food, 38 'wood': resourceCount.wood, 39 'stone': resourceCount.stone, 40 'metal': resourceCount.metal, 41 'units': cmpPlayer.GetPopulationCount(), 42 'buildings': statistics.buildingsConstructed.total - statistics.buildingsLost.total 43 }; 44 45 // print ("CHARTS: updateData: p: " + id + "/" + this.timeStamp + " : " + uneval(this.chartData[this.timeStamp + ""]) + "\n"); 46 }; 47 48 Engine.RegisterComponentType(IID_ChartsTracker, "ChartsTracker", ChartsTracker); -
binaries/data/mods/public/simulation/components/GuiInterface.js
55 55 }; 56 56 57 57 var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager); 58 var n umPlayers= cmpPlayerManager.GetNumPlayers();59 for (var i = 0; i < n umPlayers; ++i)58 var n = cmpPlayerManager.GetNumPlayers(); 59 for (var i = 0; i < n; ++i) 60 60 { 61 61 var playerEnt = cmpPlayerManager.GetPlayerByID(i); 62 62 var cmpPlayerEntityLimits = Engine.QueryInterface(playerEnt, IID_EntityLimits); … … 80 80 var mutualAllies = []; 81 81 var neutrals = []; 82 82 var enemies = []; 83 for (var j = 0; j < n umPlayers; ++j)83 for (var j = 0; j < n; ++j) 84 84 { 85 85 allies[j] = cmpPlayer.IsAlly(j); 86 86 mutualAllies[j] = cmpPlayer.IsMutualAlly(j); … … 148 148 ret.barterPrices = cmpBarter.GetPrices(); 149 149 150 150 // Add basic statistics to each player 151 for (var i = 0; i < numPlayers; ++i) 151 var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager); 152 var n = cmpPlayerManager.GetNumPlayers(); 153 for (var i = 0; i < n; ++i) 152 154 { 153 155 var playerEnt = cmpPlayerManager.GetPlayerByID(i); 154 156 var cmpPlayerStatisticsTracker = Engine.QueryInterface(playerEnt, IID_StatisticsTracker); … … 176 178 for (var i = 0; i < n; ++i) 177 179 { 178 180 var playerEnt = cmpPlayerManager.GetPlayerByID(i); 181 179 182 var cmpPlayerStatisticsTracker = Engine.QueryInterface(playerEnt, IID_StatisticsTracker); 180 183 if (cmpPlayerStatisticsTracker) 181 184 ret.players[i].statistics = cmpPlayerStatisticsTracker.GetStatistics(); 185 186 var cmpPlayerChartsTracker = Engine.QueryInterface(playerEnt, IID_ChartsTracker); 187 if (cmpPlayerChartsTracker) 188 ret.players[i].chartData = cmpPlayerChartsTracker.GetChartData(); 182 189 } 183 190 184 191 return ret; … … 491 498 ret.armour = cmpArmour.GetArmourStrengths(); 492 499 } 493 500 494 var cmpAuras = Engine.QueryInterface(ent, IID_Auras) ;501 var cmpAuras = Engine.QueryInterface(ent, IID_Auras) 495 502 if (cmpAuras) 496 503 { 497 504 ret.auras = cmpAuras.GetDescriptions(); … … 686 693 // Used to show a red square over GUI elements you can't yet afford. 687 694 GuiInterface.prototype.GetNeededResources = function(player, amounts) 688 695 { 689 return QueryPlayerIDInterface(player).GetNeededResources(amounts); 696 var cmpPlayer = QueryPlayerIDInterface(player, IID_Player); 697 return cmpPlayer.GetNeededResources(amounts); 690 698 }; 691 699 692 700 /** … … 711 719 notification.players.push(i); 712 720 } 713 721 this.timeNotifications.push(notification); 714 this.timeNotifications.sort(function (n1, n2){return n2.endTime - n1.endTime ;});722 this.timeNotifications.sort(function (n1, n2){return n2.endTime - n1.endTime}); 715 723 716 724 cmpTimer.SetTimeout(this.entity, IID_GuiInterface, "DeleteTimeNotification", duration, this.timeNotificationID); 717 725 … … 884 892 885 893 for (let ent of affectedEnts) 886 894 { 887 let cmpStatusBars = Engine.QueryInterface(ent, IID_StatusBars) ;895 let cmpStatusBars = Engine.QueryInterface(ent, IID_StatusBars) 888 896 if (cmpStatusBars) 889 897 cmpStatusBars.RegenerateSprites(); 890 898 } … … 989 997 "parameters": {}, 990 998 "translateMessage": false, 991 999 "translateParameters": [], 992 } ;1000 } 993 1001 994 1002 // See if we're changing template 995 1003 if (!this.placementEntity || this.placementEntity[0] != cmd.template) … … 1844 1852 return { "landTrader": landTrader, "shipTrader": shipTrader }; 1845 1853 }; 1846 1854 1847 GuiInterface.prototype.GetTradingGoods = function(player )1855 GuiInterface.prototype.GetTradingGoods = function(player, tradingGoods) 1848 1856 { 1849 return QueryPlayerIDInterface(player).GetTradingGoods(); 1857 var cmpPlayer = QueryPlayerIDInterface(player, IID_Player); 1858 return cmpPlayer.GetTradingGoods(); 1850 1859 }; 1851 1860 1852 1861 GuiInterface.prototype.OnGlobalEntityRenamed = function(msg) -
binaries/data/mods/public/simulation/components/interfaces/ChartsTracker.js
1 Engine.RegisterInterface("ChartsTracker"); -
binaries/data/mods/public/simulation/templates/special/player.xml
13 13 <AlertnessPeaceThreshold>0</AlertnessPeaceThreshold> 14 14 <AlertnessMax>8</AlertnessMax> 15 15 </BattleDetection> 16 <ChartsTracker/> 16 17 <EntityLimits> 17 18 <Limits> 18 19 <CivilCentre>1</CivilCentre>