Ticket #3403: 3403.patch

File 3403.patch, 40.8 KB (added by Stan, 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 */
     13function 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 */
     38function 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 */
     68function 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 */
     91function 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

     
    88
    99    <include>summary/summary.xml</include>
    1010    <include>summary/sprites.xml</include>
     11
     12    <include>common/chart_sprites.xml</include>
    1113</page>
  • binaries/data/mods/public/gui/summary/charts.js

     
     1/* globals Engine, horizSpaceRepeatedObjects, translate */
     2
     3var 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

     
    4242 */
    4343function selectPanel(panelNumber)
    4444{
    45     var panelNames = [ 'scorePanel', 'buildingsPanel', 'unitsPanel', 'resourcesPanel', 'marketPanel', 'miscPanel'];
     45    var panelNames = [ 'scorePanel', 'buildingsPanel', 'unitsPanel', 'resourcesPanel', 'marketPanel', 'miscPanel', 'chartPanel' ];
    4646
    4747    function adjustTabDividers(tabSize)
    4848    {
     
    6060    Engine.GetGUIObjectByName(panelNames[panelNumber] + 'Button').sprite = "ForegroundTab";
    6161    adjustTabDividers(Engine.GetGUIObjectByName(panelNames[panelNumber] + 'Button').size);
    6262
    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    }
    6471}
    6572
    6673function updatePanelData(panelInfo)
     
    122129        updateCountersPlayer(playerState, panelInfo.counters, playerCounterValue);
    123130    }
    124131    // Update team counters
    125     var teamCounterFn = panelInfo.teamCounterFn;
     132    var teamCounterFn = panelInfo.teamCounterFn
    126133    if (g_Teams && teamCounterFn)
    127134        teamCounterFn(panelInfo.counters);
    128135}
     
    135142    // Map
    136143    var mapDisplayType = translate("Scenario");
    137144
     145    // Initialize Charts
     146    Charts.action(null, null, data);
     147
    138148    Engine.GetGUIObjectByName("timeElapsed").caption = sprintf(translate("Game time elapsed: %(time)s"), { time: timeToString(data.timeElapsed) });
    139149
    140150    Engine.GetGUIObjectByName("summaryText").caption = data.gameResult;
  • binaries/data/mods/public/gui/summary/summary.xml

     
    99<objects>
    1010    <script file="gui/common/functions_global_object.js"/>
    1111    <script file="gui/common/functions_civinfo.js"/>
     12    <script file="gui/common/functions_repeat_positioning.js"/>
    1213    <script file="gui/common/functions_utility.js"/>
    1314    <script file="gui/common/settings.js"/>
    1415    <script file="gui/summary/counters.js"/>
    1516    <script file="gui/summary/layout.js"/>
    1617    <script file="gui/summary/summary.js"/>
     18    <script file="gui/summary/charts.js"/>
    1719
    1820    <object type="image"
    1921        style="ModernWindow"
     
    99101            </object>
    100102        </object>
    101103
     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
    102111        <object name="generalPanel" type="image" sprite="ForegroundBody" size="20 120 100%-20 100%-54">
    103112            <object size="0 0 100% 100%-50">
    104113                <object name="playerNameHeading" type="text" style="ModernLeftTabLabelText">
     
    121130                        <repeat count="8" var="n">
    122131                            <object type="image" name="playerBoxt[i][n]" size="10 0 10 30" hidden="true">
    123132                                <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"/>
    125134                                <object name="civIcont[i][n]" type="image" size="208 0 240 32"/>
    126135                                <repeat var="x" count="8">
    127136                                    <object name="valueDataTeam[i][n][x]" type="text" style="ModernTabLabelText">
     
    155164            </object>
    156165        </object>
    157166
     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
    158229        <object type="button" style="ModernButtonRed" size="100%-160 100%-48 100%-20 100%-20">
    159230            <translatableAttribute id="caption">Continue</translatableAttribute>
    160231            <action on="Press"><![CDATA[
    161                 if (g_GameData.isReplay)
     232                if (!Engine.HasXmppClient())
    162233                {
    163                     Engine.SwitchGuiPage("page_replaymenu.xml");
    164                 }
    165                 else if (!Engine.HasXmppClient())
    166                 {
    167234                    Engine.SwitchGuiPage("page_pregame.xml");
    168235                }
    169236                else
  • binaries/data/mods/public/simulation/components/ChartsTracker.js

     
     1
     2// Updates every minute (60000)
     3const UPDATE_TIMER_INTERVAL = 60000, VERSION = "0.1.19a";
     4
     5function ChartsTracker() {}
     6
     7ChartsTracker.prototype.Schema = "<a:component type='system'/><empty/>";
     8
     9ChartsTracker.prototype.GetChartData = function()
     10{
     11    return this.chartData;
     12};
     13   
     14ChartsTracker.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
     22ChartsTracker.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
     48Engine.RegisterComponentType(IID_ChartsTracker, "ChartsTracker", ChartsTracker);
  • binaries/data/mods/public/simulation/components/GuiInterface.js

     
    5555    };
    5656
    5757    var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
    58     var numPlayers = cmpPlayerManager.GetNumPlayers();
    59     for (var i = 0; i < numPlayers; ++i)
     58    var n = cmpPlayerManager.GetNumPlayers();
     59    for (var i = 0; i < n; ++i)
    6060    {
    6161        var playerEnt = cmpPlayerManager.GetPlayerByID(i);
    6262        var cmpPlayerEntityLimits = Engine.QueryInterface(playerEnt, IID_EntityLimits);
     
    8080        var mutualAllies = [];
    8181        var neutrals = [];
    8282        var enemies = [];
    83         for (var j = 0; j < numPlayers; ++j)
     83        for (var j = 0; j < n; ++j)
    8484        {
    8585            allies[j] = cmpPlayer.IsAlly(j);
    8686            mutualAllies[j] = cmpPlayer.IsMutualAlly(j);
     
    148148    ret.barterPrices = cmpBarter.GetPrices();
    149149
    150150    // 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)
    152154    {
    153155        var playerEnt = cmpPlayerManager.GetPlayerByID(i);
    154156        var cmpPlayerStatisticsTracker = Engine.QueryInterface(playerEnt, IID_StatisticsTracker);
     
    176178    for (var i = 0; i < n; ++i)
    177179    {
    178180        var playerEnt = cmpPlayerManager.GetPlayerByID(i);
     181
    179182        var cmpPlayerStatisticsTracker = Engine.QueryInterface(playerEnt, IID_StatisticsTracker);
    180183        if (cmpPlayerStatisticsTracker)
    181184            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();
    182189    }
    183190
    184191    return ret;
     
    491498        ret.armour = cmpArmour.GetArmourStrengths();
    492499    }
    493500
    494     var cmpAuras = Engine.QueryInterface(ent, IID_Auras);
     501    var cmpAuras = Engine.QueryInterface(ent, IID_Auras)
    495502    if (cmpAuras)
    496503    {
    497504        ret.auras = cmpAuras.GetDescriptions();
     
    686693// Used to show a red square over GUI elements you can't yet afford.
    687694GuiInterface.prototype.GetNeededResources = function(player, amounts)
    688695{
    689     return QueryPlayerIDInterface(player).GetNeededResources(amounts);
     696    var cmpPlayer = QueryPlayerIDInterface(player, IID_Player);
     697    return cmpPlayer.GetNeededResources(amounts);
    690698};
    691699
    692700/**
     
    711719            notification.players.push(i);
    712720    }
    713721    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});
    715723
    716724    cmpTimer.SetTimeout(this.entity, IID_GuiInterface, "DeleteTimeNotification", duration, this.timeNotificationID);
    717725
     
    884892
    885893    for (let ent of affectedEnts)
    886894    {
    887         let cmpStatusBars = Engine.QueryInterface(ent, IID_StatusBars);
     895        let cmpStatusBars = Engine.QueryInterface(ent, IID_StatusBars)
    888896        if (cmpStatusBars)
    889897            cmpStatusBars.RegenerateSprites();
    890898    }
     
    989997        "parameters": {},
    990998        "translateMessage": false,
    991999        "translateParameters": [],
    992     };
     1000    }
    9931001
    9941002    // See if we're changing template
    9951003    if (!this.placementEntity || this.placementEntity[0] != cmd.template)
     
    18441852    return { "landTrader": landTrader, "shipTrader": shipTrader };
    18451853};
    18461854
    1847 GuiInterface.prototype.GetTradingGoods = function(player)
     1855GuiInterface.prototype.GetTradingGoods = function(player, tradingGoods)
    18481856{
    1849     return QueryPlayerIDInterface(player).GetTradingGoods();
     1857    var cmpPlayer = QueryPlayerIDInterface(player, IID_Player);
     1858    return cmpPlayer.GetTradingGoods();
    18501859};
    18511860
    18521861GuiInterface.prototype.OnGlobalEntityRenamed = function(msg)
  • binaries/data/mods/public/simulation/components/interfaces/ChartsTracker.js

     
     1Engine.RegisterInterface("ChartsTracker");
  • binaries/data/mods/public/simulation/templates/special/player.xml

     
    1313    <AlertnessPeaceThreshold>0</AlertnessPeaceThreshold>
    1414    <AlertnessMax>8</AlertnessMax>
    1515  </BattleDetection>
     16  <ChartsTracker/>
    1617  <EntityLimits>
    1718    <Limits>
    1819      <CivilCentre>1</CivilCentre>