Changeset View
Changeset View
Standalone View
Standalone View
binaries/data/mods/public/gui/reference/viewer/ViewerPage.js
- This file was added.
/** | |||||
* This class represents the Template Viewer GUI page. | |||||
*/ | |||||
class ViewerPage extends ReferencePage | |||||
{ | |||||
constructor(data) | |||||
{ | |||||
super(); | |||||
this.currentTemplate = undefined; | |||||
this.guiElements = { | |||||
"entityName": Engine.GetGUIObjectByName("entityName"), | |||||
"entityIcon": Engine.GetGUIObjectByName("entityIcon"), | |||||
"entityStats": Engine.GetGUIObjectByName("entityStats"), | |||||
"entityInfo": Engine.GetGUIObjectByName("entityInfo"), | |||||
"entityRankGlyph": Engine.GetGUIObjectByName("entityRankGlyph"), | |||||
}; | |||||
elexis: prototype const | |||||
let closeButton = new CloseButton(this); | |||||
} | |||||
selectTemplate(data) | |||||
{ | |||||
if (!data || !data.templateName) | |||||
{ | |||||
error("Viewer: No template provided"); | |||||
this.closePage(); | |||||
return; | |||||
} | |||||
let templateName = removeFiltersFromTemplateName(data.templateName); | |||||
let isTech = TechnologyTemplateExists(templateName); | |||||
// Attempt to get the civ code from the template, or, if | |||||
// it's a technology, from the researcher's template. | |||||
if (!isTech) | |||||
{ | |||||
// Catch and redirect if template is a non-promotion variant of | |||||
// another (ie. units/{civ}_support_female_citizen_house). | |||||
templateName = this.TemplateLoader.getBaseTemplateName(templateName, this.TemplateLoader.DefaultCiv); | |||||
this.setActiveCiv(this.TemplateLoader.loadEntityTemplate(templateName, this.TemplateLoader.DefaultCiv).Identity.Civ); | |||||
} | |||||
if (this.activeCiv == this.TemplateLoader.DefaultCiv && data.civ) | |||||
this.setActiveCiv(data.civ); | |||||
this.currentTemplate = isTech ? this.TemplateParser.getTechnology(templateName, this.activeCiv) : this.TemplateParser.getEntity(templateName, this.activeCiv); | |||||
if (!this.currentTemplate) | |||||
{ | |||||
error("Viewer: unable to recognize or load template (" + templateName + ")"); | |||||
this.closePage(); | |||||
return; | |||||
} | |||||
// Here we compile lists of the names of all the entities that can build/train/research this template, | |||||
// and the entities and technologies that this template can build/train/research. | |||||
// We do that here, so we don't do it later in the tooltip callback functions, as that would be messier. | |||||
if (this.activeCiv != this.TemplateLoader.DefaultCiv) | |||||
{ | |||||
let templateLists = this.TemplateLister.getTemplateLists(this.activeCiv); | |||||
let builders = templateLists.structures.get(this.currentTemplate.name.internal); | |||||
if (builders && builders.length) | |||||
this.currentTemplate.builtByListOfNames = builders.map(builder => getEntityNames(this.TemplateParser.getEntity(builder, this.activeCiv))); | |||||
let trainers = templateLists.units.get(this.currentTemplate.name.internal); | |||||
if (trainers && trainers.length) | |||||
this.currentTemplate.trainedByListOfNames = trainers.map(trainer => getEntityNames(this.TemplateParser.getEntity(trainer, this.activeCiv))); | |||||
let researchers = templateLists.techs.get(this.currentTemplate.name.internal); | |||||
if (researchers && researchers.length) | |||||
this.currentTemplate.researchedByListOfNames = researchers.map(researcher => getEntityNames(this.TemplateParser.getEntity(researcher, this.activeCiv))); | |||||
} | |||||
if (this.currentTemplate.builder && this.currentTemplate.builder.length) | |||||
this.currentTemplate.buildListOfNames = this.currentTemplate.builder.map(prod => getEntityNames(this.TemplateParser.getEntity(prod, this.activeCiv))); | |||||
if (this.currentTemplate.production) | |||||
{ | |||||
if (this.currentTemplate.production.units && this.currentTemplate.production.units.length) | |||||
this.currentTemplate.trainListOfNames = this.currentTemplate.production.units.map(prod => getEntityNames(this.TemplateParser.getEntity(prod, this.activeCiv))); | |||||
if (this.currentTemplate.production.techs && this.currentTemplate.production.techs.length) | |||||
{ | |||||
this.currentTemplate.researchListOfNames = []; | |||||
for (let tech of this.currentTemplate.production.techs) | |||||
{ | |||||
let techTemplate = this.TemplateParser.getTechnology(tech, this.activeCiv); | |||||
if (techTemplate.reqs) | |||||
this.currentTemplate.researchListOfNames.push(getEntityNames(techTemplate)); | |||||
} | |||||
} | |||||
} | |||||
if (this.currentTemplate.upgrades) | |||||
this.currentTemplate.upgradeListOfNames = this.currentTemplate.upgrades.map(upgrade => | |||||
getEntityNames(upgrade.name ? upgrade : this.TemplateParser.getEntity(upgrade.entity, this.activeCiv)) | |||||
); | |||||
this.draw(); | |||||
} | |||||
/** | |||||
* Populate the UI elements. | |||||
*/ | |||||
draw() | |||||
{ | |||||
this.guiElements.entityName.caption = getEntityNamesFormatted(this.currentTemplate); | |||||
let entityIcon = this.guiElements.entityIcon; | |||||
entityIcon.sprite = "stretched:" + this.IconPath + this.currentTemplate.icon; | |||||
let entityStats = this.guiElements.entityStats; | |||||
entityStats.caption = this.constructor.buildText(this.currentTemplate, this.StatsFunctions); | |||||
let infoSize = this.guiElements.entityInfo.size; | |||||
// The magic '8' below provides a gap between the bottom of the icon, and the start of the info text. | |||||
Done Inline Actions(maybe prototype property for the path to split data from code, doesnt matter) elexis: (maybe prototype property for the path to split data from code, doesnt matter) | |||||
infoSize.top = Math.max(entityIcon.size.bottom + 8, entityStats.size.top + entityStats.getTextSize().height); | |||||
this.guiElements.entityInfo.size = infoSize; | |||||
this.guiElements.entityInfo.caption = this.constructor.buildText(this.currentTemplate, this.InfoFunctions, "\n\n"); | |||||
if (this.currentTemplate.promotion) | |||||
this.guiElements.entityRankGlyph.sprite = "stretched:" + this.RankIconPath + this.currentTemplate.promotion.current_rank + ".png"; | |||||
this.guiElements.entityRankGlyph.hidden = !this.currentTemplate.promotion; | |||||
} | |||||
closePage() | |||||
{ | |||||
Engine.PopGuiPage({ "civ": this.activeCiv, "page": "page_viewer.xml" }); | |||||
} | |||||
} | |||||
/** | |||||
* The result of these functions appear to the right of the entity icon | |||||
* on the page. | |||||
*/ | |||||
ViewerPage.prototype.StatsFunctions = [getEntityCostTooltip].concat(ReferencePage.prototype.StatsFunctions); | |||||
/** | |||||
* Used to display textual information and the build/train lists of the | |||||
* template being displayed. | |||||
* | |||||
* At present, these are drawn in the main body of the page. | |||||
* | |||||
* The functions listed can be found in gui/common/tooltips.js or | |||||
* gui/reference/common/tooltips.js | |||||
*/ | |||||
ViewerPage.prototype.InfoFunctions = [ | |||||
getEntityTooltip, | |||||
getHistoryTooltip, | |||||
getDescriptionTooltip, | |||||
getAurasTooltip, | |||||
getVisibleEntityClassesFormatted, | |||||
getBuiltByText, | |||||
getTrainedByText, | |||||
getResearchedByText, | |||||
getBuildText, | |||||
getTrainText, | |||||
getResearchText, | |||||
getUpgradeText | |||||
]; | |||||
ViewerPage.prototype.CloseButtonTooltip = | |||||
translate("%(hotkey)s: Close Template Viewer"); | |||||
ViewerPage.prototype.RankIconPath = "session/icons/ranks/"; |
Wildfire Games · Phabricator
prototype const