Ticket #3670: 3670_reqTooltips_v1-1.patch

File 3670_reqTooltips_v1-1.patch, 6.2 KB (added by s0600204, 7 years ago)

Attempt at improving styling of resultant requirements string over last patch, and take into account pair techs

  • binaries/data/mods/public/globalscripts/Templates.js

    diff --git a/binaries/data/mods/public/globalscripts/Templates.js b/binaries/data/mods/public/globalscripts/Templates.js
    index db54ca469..a782518d7 100644
    a b function GetTechnologyDataHelper(template, civ, resources)  
    376376
    377377    ret.description = template.description;
    378378
     379    if (template.top)
     380        ret.pair = [template.top, template.bottom];
     381
    379382    return ret;
    380383}
    381384
  • binaries/data/mods/public/gui/common/tooltips.js

    diff --git a/binaries/data/mods/public/gui/common/tooltips.js b/binaries/data/mods/public/gui/common/tooltips.js
    index 460c52061..00f28471d 100644
    a b const g_TooltipTextFormats = {  
    22    "unit": ['[font="sans-10"][color="orange"]', '[/color][/font]'],
    33    "header": ['[font="sans-bold-13"]', '[/font]'],
    44    "body": ['[font="sans-13"]', '[/font]'],
    5     "comma": ['[font="sans-12"]', '[/font]']
     5    "comma": ['[font="sans-12"]', '[/font]'],
     6    "emphasis": ['[font="sans-bold-13"]', '[/font]']
    67};
    78
    89const g_AttackTypes = {
    function commaFont(text)  
    4243    return g_TooltipTextFormats.comma[0] + text + g_TooltipTextFormats.comma[1];
    4344}
    4445
     46function emphasisFont(text)
     47{
     48    return g_TooltipTextFormats.emphasis[0] + text + g_TooltipTextFormats.emphasis[1];
     49}
     50
    4551function getEntityTooltip(template)
    4652{
    4753    if (!template.tooltip)
    function getRequiredTechnologyTooltip(technologyEnabled, requiredTechnology, civ  
    465471        return "";
    466472
    467473    return sprintf(translate("Requires %(technology)s"), {
    468         "technology": getEntityNames(GetTechnologyData(requiredTechnology, civ))
     474        "technology": emphasisFont(getEntityNames(GetTechnologyData(requiredTechnology, civ)))
    469475    });
    470476}
    471477
  • binaries/data/mods/public/gui/session/selection_panels.js

    diff --git a/binaries/data/mods/public/gui/session/selection_panels.js b/binaries/data/mods/public/gui/session/selection_panels.js
    index 74789e0cd..6d2e2e820 100644
    a b g_SelectionPanels.Research = {  
    830830            if (!requirementsPassed)
    831831            {
    832832                let tip = template.requirementsTooltip;
    833                 let reqs = template.reqs;
    834                 for (let req of reqs)
    835                 {
    836                     if (!req.entities)
    837                         continue;
    838 
    839                     let entityCounts = [];
    840                     for (let entity of req.entities)
    841                     {
    842                         let current = 0;
    843                         switch (entity.check)
    844                         {
    845                         case "count":
    846                             current = playerState.classCounts[entity.class] || 0;
    847                             break;
    848 
    849                         case "variants":
    850                             current = playerState.typeCountsByClass[entity.class] ?
    851                                 Object.keys(playerState.typeCountsByClass[entity.class]).length : 0;
    852                             break;
    853                         }
    854 
    855                         let remaining = entity.number - current;
    856                         if (remaining < 1)
    857                             continue;
    858 
    859                         entityCounts.push(sprintf(translatePlural("%(number)s entity of class %(class)s", "%(number)s entities of class %(class)s", remaining), {
    860                             "number": remaining,
    861                             "class": entity.class
    862                         }));
    863                     }
    864 
    865                     tip += " " + sprintf(translate("Remaining: %(entityCounts)s"), {
    866                         "entityCounts": entityCounts.join(translate(", "))
    867                     });
    868                 }
     833                tip += "\n" + deriveTechRequirementsTooltip(template.reqs, player);
    869834                tooltips.push(tip);
    870835            }
    871836            tooltips.push(getNeededResourcesTooltip(neededResources));
  • binaries/data/mods/public/gui/session/selection_panels_helpers.js

    diff --git a/binaries/data/mods/public/gui/session/selection_panels_helpers.js b/binaries/data/mods/public/gui/session/selection_panels_helpers.js
    index 6b9f507d6..bf1aa4011 100644
    a b function formatBatchTrainingString(buildingsCountToTrainFullBatch, fullBatchSize  
    144144    }) + "[/font]";
    145145}
    146146
     147/**
     148 *
     149 * @param reqs {array} Civ-specific requirements
     150 */
     151function deriveTechRequirementsTooltip(reqs, player)
     152{
     153    let optionalTexts = [];
     154
     155    for (let req of reqs)
     156    {
     157        let requirementTexts = [];
     158
     159        if (req.techs)
     160        {
     161            let requiredTechs = [];
     162
     163            for (let tech of req.techs)
     164                if (!GetSimState().players[player].researchedTechs[tech])
     165                {
     166                    if (tech.slice(0, 4) == "pair")
     167                    {
     168                        let pair = GetTechnologyData(tech).pair;
     169                        requiredTechs.push(sprintf(translate("%(firstTechOfPair)s or %(secondTechOfPair)s"), {
     170                            "firstTechOfPair": emphasisFont(getEntityNames(GetTechnologyData(pair[0]))),
     171                            "secondTechOfPair": emphasisFont(getEntityNames(GetTechnologyData(pair[1])))
     172                        }));
     173                    }
     174                    else
     175                        requiredTechs.push(emphasisFont(getEntityNames(GetTechnologyData(tech))));
     176                }
     177
     178            if (requiredTechs.length)
     179            {
     180                if (requiredTechs.length == 1)
     181                    requirementTexts.push(requiredTechs[0]);
     182                else
     183                    requirementTexts.push(sprintf(translate("%(listOfTechs)s and %(lastTechInList)s"), {
     184                        // Translation: This comma is used for separating first to penultimate elements in the list
     185                        "listOfTechs": requiredTechs.slice(0,-1).join(translate(", ")),
     186                        "lastTechInList": requiredTechs.slice(-1)
     187                    }));
     188            }
     189        }
     190
     191        if (req.entities)
     192        {
     193            let requiredEnts = [];
     194            for (let entity of req.entities)
     195            {
     196                let current = 0;
     197                switch (entity.check)
     198                {
     199                case "count":
     200                    current = GetSimState().players[player].classCounts[entity.class] || 0;
     201                    break;
     202
     203                case "variants":
     204                    current = GetSimState().players[player].typeCountsByClass[entity.class] ?
     205                        Object.keys(GetSimState().players[player].typeCountsByClass[entity.class]).length : 0;
     206                    break;
     207                }
     208
     209                let remaining = entity.number - current;
     210                if (remaining < 1)
     211                    continue;
     212
     213                requiredEnts.push(sprintf(translatePlural(
     214                    "%(number)s unit or structure of class %(class)s (%(remaining)s remaining)",
     215                    "%(number)s units or structures of class %(class)s (%(remaining)s remaining)",
     216                    entity.number
     217                ), {
     218                    "number": entity.number,
     219                    "class": emphasisFont(entity.class),
     220                    "remaining": remaining,
     221                }));
     222            }
     223            if (requiredEnts.length)
     224                requirementTexts.push(requiredEnts.join(translate(" and ")));
     225        }
     226
     227        optionalTexts.push(requirementTexts.join(" and "));
     228    }
    147229
     230    return sprintf(translate("Requires %(requirementTexts)s"), {
     231            "requirementTexts": optionalTexts.join(translate("; or "))
     232        });
     233}