Ticket #3436: 3436_singMulti_filter_v5.patch

File 3436_singMulti_filter_v5.patch, 10.8 KB (added by Imarok, 8 years ago)

Add a filter for rated games

  • binaries/data/mods/public/gui/replaymenu/replay_actions.js

     
    1111    let populationFilter = Engine.GetGUIObjectByName("populationFilter");
    1212    let durationFilter = Engine.GetGUIObjectByName("durationFilter");
    1313    let compatibilityFilter = Engine.GetGUIObjectByName("compatibilityFilter");
     14    let singleplayerFilter = Engine.GetGUIObjectByName("singleplayerFilter");
     15    let victoryConFilter = Engine.GetGUIObjectByName("victoryConditionFilter");
     16    let ratedGamesFilter = Engine.GetGUIObjectByName("ratedGamesFilter");
    1417
    1518    return {
    1619        "directory": selectedDirectory,
     
    2326            "mapSize": mapSizeFilter.list_data[mapSizeFilter.selected],
    2427            "popCap": populationFilter.list_data[populationFilter.selected],
    2528            "duration": durationFilter.list_data[durationFilter.selected],
    26             "compatibility": compatibilityFilter.checked
     29            "compatibility": compatibilityFilter.checked,
     30            "singleplayer": singleplayerFilter.list_data[singleplayerFilter.selected],
     31            "victoryCondition": victoryConFilter.list_data[victoryConFilter.selected],
     32            "ratedGames": ratedGamesFilter.selected
    2733        }
    2834    };
    2935}
  • binaries/data/mods/public/gui/replaymenu/replay_filters.js

     
    3333    initMapNameFilter(filters && filters.mapName);
    3434    initPopCapFilter(filters && filters.popCap);
    3535    initDurationFilter(filters && filters.duration);
     36    initSingleplayerFilter(filters && filters.singleplayer);
     37    initVictoryConditionFilter(filters && filters.victoryCondition);
     38    initRatedGamesFilter(filters && filters.ratedGames);
    3639}
    3740
    3841/**
     
    133136        durationFilter.selected = 0;
    134137}
    135138
     139function initSingleplayerFilter(singleplayer)
     140{
     141    let singleplayerFilter = Engine.GetGUIObjectByName("singleplayerFilter");
     142    singleplayerFilter.list = [translateWithContext("gamemode", "Any"), translate("Single Player"), translate("Multiplayer")];
     143    singleplayerFilter.list_data = ["", "Singleplayer", "Multiplayer"];
     144
     145    if (singleplayer)
     146        singleplayerFilter.selected = singleplayerFilter.list_data.indexOf(singleplayer);
     147
     148    if (singleplayerFilter.selected < 0 || singleplayerFilter.selected >= singleplayerFilter.list.length)
     149        singleplayerFilter.selected = 0;
     150}
     151
     152function initVictoryConditionFilter(victoryCondition)
     153{
     154    let victoryConditionFilter = Engine.GetGUIObjectByName("victoryConditionFilter");
     155    victoryConditionFilter.list = [translateWithContext("victory condition", "Any")].concat(g_VictoryConditions.map(victoryCondition => translateVictoryCondition(victoryCondition)));
     156    victoryConditionFilter.list_data = [""].concat(g_VictoryConditions);
     157
     158    if (victoryCondition)
     159        victoryConditionFilter.selected = victoryConditionFilter.list_data.indexOf(victoryCondition);
     160
     161    if (victoryConditionFilter.selected < 0 || victoryConditionFilter.selected >= victoryConditionFilter.list.length)
     162        victoryConditionFilter.selected = 0;
     163}
     164
     165function initRatedGamesFilter(ratedGames)
     166{
     167    let ratedGamesFilter = Engine.GetGUIObjectByName("ratedGamesFilter");
     168    ratedGamesFilter.list = [translateWithContext("rated game", "Any"), translate("Rated Games"), translate("No Rated Games")];
     169    ratedGamesFilter.list_data = ["", "rated", "not rated"];
     170
     171    if (ratedGames)
     172        ratedGamesFilter.selected = ratedGamesFilter.list_data.indexOf(ratedGames);
     173
     174    if (ratedGamesFilter.selected < 0 || ratedGamesFilter.selected >= ratedGamesFilter.list.length)
     175        ratedGamesFilter.selected = 0;
     176}
     177
    136178/**
    137179 * Initializes g_ReplaysFiltered with replays that are not filtered out and sort it.
    138180 */
     
    193235    if (compatibilityFilter.checked && !isReplayCompatible(replay))
    194236        return false;
    195237
     238    // Filter by multiplayer/singleplayer
     239    let singleplayerFilter = Engine.GetGUIObjectByName("singleplayerFilter");
     240    if (singleplayerFilter.selected > 0 &&
     241        (singleplayerFilter.selected == 1 && replay.isMultiplayer ||
     242         singleplayerFilter.selected == 2 && !replay.isMultiplayer))
     243        return false;
     244
     245    // Filter by victory condition
     246    let victoryConditionFilter = Engine.GetGUIObjectByName("victoryConditionFilter");
     247    if (victoryConditionFilter.selected > 0 && replay.attribs.settings.GameType != victoryConditionFilter.list_data[victoryConditionFilter.selected])
     248        return false;
     249   
     250    // Filter by rated
     251    let ratedGamesFilter = Engine.GetGUIObjectByName("ratedGamesFilter");
     252    if(ratedGamesFilter.selected > 0 &&
     253        (ratedGamesFilter.selected == 1 && !replay.attribs.settings.RatingEnabled ||
     254         ratedGamesFilter.selected == 2 && replay.attribs.settings.RatingEnabled))
     255        return false
     256
    196257    // Filter date/time (select a month)
    197     var dateTimeFilter = Engine.GetGUIObjectByName("dateTimeFilter");
     258    let dateTimeFilter = Engine.GetGUIObjectByName("dateTimeFilter");
    198259    if (dateTimeFilter.selected > 0 && getReplayMonth(replay) != dateTimeFilter.list_data[dateTimeFilter.selected])
    199260        return false;
    200261
    201262    // Filter by playernames
    202     var playersFilter = Engine.GetGUIObjectByName("playersFilter");
    203     var keywords = playersFilter.caption.toLowerCase().split(" ");
     263    let playersFilter = Engine.GetGUIObjectByName("playersFilter");
     264    let keywords = playersFilter.caption.toLowerCase().split(" ");
    204265    if (keywords.length)
    205266    {
    206267        // We just check if all typed words are somewhere in the playerlist of that replay
     
    210271    }
    211272
    212273    // Filter by map name
    213     var mapNameFilter = Engine.GetGUIObjectByName("mapNameFilter");
     274    let mapNameFilter = Engine.GetGUIObjectByName("mapNameFilter");
    214275    if (mapNameFilter.selected > 0 && getReplayMapName(replay) != mapNameFilter.list_data[mapNameFilter.selected])
    215276        return false;
    216277
    217278    // Filter by map size
    218     var mapSizeFilter = Engine.GetGUIObjectByName("mapSizeFilter");
     279    let mapSizeFilter = Engine.GetGUIObjectByName("mapSizeFilter");
    219280    if (mapSizeFilter.selected > 0 && replay.attribs.settings.Size != mapSizeFilter.list_data[mapSizeFilter.selected])
    220281        return false;
    221282
    222283    // Filter by population capacity
    223     var populationFilter = Engine.GetGUIObjectByName("populationFilter");
     284    let populationFilter = Engine.GetGUIObjectByName("populationFilter");
    224285    if (populationFilter.selected > 0 && replay.attribs.settings.PopulationCap != populationFilter.list_data[populationFilter.selected])
    225286        return false;
    226287
    227288    // Filter by game duration
    228     var durationFilter = Engine.GetGUIObjectByName("durationFilter");
     289    let durationFilter = Engine.GetGUIObjectByName("durationFilter");
    229290    if (durationFilter.selected > 0)
    230291    {
    231292        let interval = g_DurationFilterIntervals[durationFilter.selected];
  • binaries/data/mods/public/gui/replaymenu/replay_menu.js

     
    3434var g_MapNames = [];
    3535
    3636/**
     37 * Sorted list of the victory conditions occuring in the replays
     38 */
     39var g_VictoryConditions = [];
     40
     41/**
    3742 * Directory name of the currently selected replay. Used to restore the selection after changing filters.
    3843 */
    3944var g_SelectedReplayDirectory = "";
     
    6267
    6368/**
    6469 * Store the list of replays loaded in C++ in g_Replays.
    65  * Check timestamp and compatibility and extract g_Playernames, g_MapNames.
     70 * Check timestamp and compatibility and extract g_Playernames, g_MapNames, g_VictoryConditions.
    6671 * Restore selected filters and item.
    6772 */
    6873function loadReplays(replaySelectionData)
     
    7580    g_Playernames = [];
    7681    for (let replay of g_Replays)
    7782    {
     83        let nonAIPlayers = 0;
    7884        // Use time saved in file, otherwise file mod date
    7985        replay.timestamp = replay.attribs.timestamp ? +replay.attribs.timestamp : +replay.filemod_timestamp-replay.duration;
    8086
     
    8793        if (g_MapNames.indexOf(replay.attribs.settings.Name) == -1 && replay.attribs.settings.Name != "")
    8894            g_MapNames.push(replay.attribs.settings.Name);
    8995
     96        // Extract victory conditions
     97        if (g_VictoryConditions.indexOf(replay.attribs.settings.GameType) == -1 && replay.attribs.settings.GameType != "")
     98            g_VictoryConditions.push(replay.attribs.settings.GameType);
     99
    90100        // Extract playernames
    91101        for (let playerData of replay.attribs.settings.PlayerData)
    92102        {
     
    101111
    102112            if (g_Playernames.indexOf(playername) == -1)
    103113                g_Playernames.push(playername);
     114            ++nonAIPlayers;
    104115        }
     116        replay.isMultiplayer = nonAIPlayers > 1;
    105117    }
    106118    g_MapNames.sort();
     119    g_VictoryConditions.sort();
    107120
    108121    // Reload filters (since they depend on g_Replays and its derivatives)
    109122    initFilters(replaySelectionData && replaySelectionData.filters);
  • binaries/data/mods/public/gui/replaymenu/replay_menu.xml

     
    110110                <translatableAttribute id="caption">Filter compatible replays</translatableAttribute>
    111111            </object>
    112112
     113            <!-- Singleplayer Multiplayer Filter -->
     114            <object name="singleplayerFilter" type="dropdown" style="ModernDropDown" size="0 30 100% 55" font="sans-bold-13">
     115                    <action on="SelectionChange">displayReplayList();</action>
     116            </object>
     117
     118            <!-- Victory Condition Filter -->
     119            <object name="victoryConditionFilter" type="dropdown" style="ModernDropDown" size="0 60 100% 85" font="sans-bold-13">
     120                    <action on="SelectionChange">displayReplayList();</action>
     121            </object>
     122
     123            <!-- Rated Games Filter -->
     124            <object name="ratedGamesFilter" type="dropdown" style="ModernDropDown" size="0 90 100% 115" font="sans-bold-13">
     125                    <action on="SelectionChange">displayReplayList();</action>
     126            </object>
     127
    113128            <!-- Placeholder to show if no replay is selected -->
    114             <object name="replayInfoEmpty" size="0 30 100% 100%-60" type="image" sprite="ModernDarkBoxGold" hidden="false">
     129            <object name="replayInfoEmpty" size="0 120 100% 100%-60" type="image" sprite="ModernDarkBoxGold" hidden="false">
    115130                <object name="logo" size="50%-110 40 50%+110 140" type="image" sprite="logo"/>
    116131                <object name="subjectBox" type="image" sprite="ModernDarkBoxWhite" size="3% 180 97% 99%">
    117132                    <object name="subject" size="5 5 100%-5 100%-5" type="text" style="ModernText" text_align="center"/>
     
    119134            </object>
    120135
    121136            <!--  -->
    122             <object name="replayInfo" size="0 30 100% 100%-60" type="image" sprite="ModernDarkBoxGold" hidden="true">
     137            <object name="replayInfo" size="0 120 100% 100%-60" type="image" sprite="ModernDarkBoxGold" hidden="true">
    123138
    124139                <!-- Map Name Label -->
    125140                <object name="sgMapName" size="0 5 100% 20" type="text" style="ModernLabelText"/>