Ticket #3670: 3670_reqTooltips.patch

File 3670_reqTooltips.patch, 3.8 KB (added by s0600204, 7 years ago)

Patch that takes into account #3993/#4263 tech reqs work. Does not strip out old requirementsTooltip property from tech templates (for now) so as to make it easier to compare old vs new in game.

  • 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..d9aa631a4 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                    requiredTechs.push("\"" + getEntityNames(GetTechnologyData(tech)) + "\"");
     166
     167            if (requiredTechs.length)
     168                requirementTexts.push(sprintf(translatePlural("%(techNames)s technology", "%(techNames)s technologies", requiredTechs.length), {
     169                    "techNames": requiredTechs.join(translate(" & "))
     170                }));
     171        }
     172
     173        if (req.entities)
     174        {
     175            let requiredEnts = [];
     176            for (let entity of req.entities)
     177            {
     178                let current = 0;
     179                switch (entity.check)
     180                {
     181                case "count":
     182                    current = GetSimState().players[player].classCounts[entity.class] || 0;
     183                    break;
     184
     185                case "variants":
     186                    current = GetSimState().players[player].typeCountsByClass[entity.class] ?
     187                        Object.keys(GetSimState().players[player].typeCountsByClass[entity.class]).length : 0;
     188                    break;
     189                }
     190
     191                let remaining = entity.number - current;
     192                if (remaining < 1)
     193                    continue;
     194
     195                requiredEnts.push(sprintf(translatePlural("%(number)s entity of class \"%(class)s\" (%(remaining)s remaining)", "%(number)s entities of class \"%(class)s\" (%(remaining)s remaining)", entity.number), {
     196                    "number": entity.number,
     197                    "class": entity.class,
     198                    "remaining": remaining,
     199                }));
     200            }
     201            if (requiredEnts.length)
     202                requirementTexts.push(requiredEnts.join(translate(" and ")));
     203        }
     204
     205        optionalTexts.push(requirementTexts.join(" and "));
     206    }
    147207
     208    return sprintf(translate("Requires %(requirementTexts)s"), {
     209            "requirementTexts": optionalTexts.join(translate("; or "))
     210        });
     211}