TBTR: Template replacements now also apply to child groups

pull/132/head
Jonathan G Rennison 4 years ago
parent ff6288139e
commit ee6d808578

@ -6152,6 +6152,7 @@ STR_TMPL_WARNING_FREE_WAGON :{RED}Free Chain
STR_TMPL_WARNING_VEH_UNAVAILABLE :{RED}Train not buildable: vehicle unavailable!
STR_TMPL_GROUP_USES_TEMPLATE :{BLACK}Template in use: {NUM}
STR_TMP_TEMPLATE_IN_USE :Template is in use
STR_TMP_TEMPLATE_FROM_PARENT_GROUP :Using template from parent group
STR_TMPL_GROUP_NUM_TRAINS :{BLACK}{NUM}
STR_TMPL_CREATEGUI_TITLE :{WHITE}Create/Edit Template Vehicle
STR_TMPL_MAINGUI_DEFINEDGROUPS :{BLACK}Defined Groups for Company

@ -602,11 +602,14 @@ public:
StringID str = STR_GROUP_NAME;
DrawString(left + ScaleGUITrad(30 + this->indents[i] * 10), right, text_y, str, TC_BLACK);
const TemplateID tid = GetTemplateIDByGroupID(g_id);
const TemplateID tid = GetTemplateIDByGroupIDRecursive(g_id);
const TemplateID tid_self = GetTemplateIDByGroupID(g_id);
/* Draw the template in use for this group, if there is one */
short template_in_use = FindTemplateIndex(tid);
if (template_in_use >= 0) {
if (tid != INVALID_TEMPLATE && tid_self == INVALID_TEMPLATE) {
DrawString (left, right, text_y, STR_TMP_TEMPLATE_FROM_PARENT_GROUP, TC_SILVER, SA_HOR_CENTER);
} else if (template_in_use >= 0) {
SetDParam(0, template_in_use);
DrawString (left, right, text_y, STR_TMPL_GROUP_USES_TEMPLATE, TC_BLACK, SA_HOR_CENTER);
} else if (tid != INVALID_TEMPLATE) { /* If there isn't a template applied from the current group, check if there is one for another rail type */

@ -159,6 +159,18 @@ TemplateID GetTemplateIDByGroupID(GroupID gid)
return iter->second;
}
TemplateID GetTemplateIDByGroupIDRecursive(GroupID gid)
{
while (gid != INVALID_GROUP) {
auto iter = _template_replacement_index.find(gid);
if (iter != _template_replacement_index.end()) return iter->second;
const Group *g = Group::GetIfValid(gid);
if (g == nullptr) break;
gid = Group::Get(gid)->parent;
}
return INVALID_TEMPLATE;
}
bool IssueTemplateReplacement(GroupID gid, TemplateID tid)
{
TemplateReplacement *tr = GetTemplateReplacementByGroupID(gid);

@ -201,6 +201,7 @@ struct TemplateReplacement : TemplateReplacementPool::PoolItem<&_template_replac
TemplateReplacement* GetTemplateReplacementByGroupID(GroupID);
TemplateID GetTemplateIDByGroupID(GroupID);
TemplateID GetTemplateIDByGroupIDRecursive(GroupID);
bool IssueTemplateReplacement(GroupID, TemplateID);
short DeleteTemplateReplacementsByGroupID(GroupID);

@ -208,6 +208,12 @@ TemplateVehicle* GetTemplateVehicleByGroupID(GroupID gid) {
return tid != INVALID_TEMPLATE ? TemplateVehicle::GetIfValid(tid) : nullptr;
}
TemplateVehicle* GetTemplateVehicleByGroupIDRecursive(GroupID gid) {
if (gid >= NEW_GROUP) return nullptr;
const TemplateID tid = GetTemplateIDByGroupIDRecursive(gid);
return tid != INVALID_TEMPLATE ? TemplateVehicle::GetIfValid(tid) : nullptr;
}
/**
* Check a template consist whether it contains any engine of the given railtype
*/

@ -38,6 +38,7 @@ void tbtr_debug_pvt(const Train*);
#endif
TemplateVehicle* GetTemplateVehicleByGroupID(GroupID);
TemplateVehicle* GetTemplateVehicleByGroupIDRecursive(GroupID);
bool ChainContainsVehicle(Train*, Train*);
Train* ChainContainsEngine(EngineID, Train*);
Train* DepotContainsEngine(TileIndex, EngineID, Train*);

@ -5494,7 +5494,7 @@ CommandCost CmdTemplateReplaceVehicle(TileIndex tile, DoCommandFlag flags, uint3
Train *new_chain = nullptr;
Train *remainder_chain = nullptr;
Train *tmp_chain = nullptr;
TemplateVehicle *tv = GetTemplateVehicleByGroupID(incoming->group_id);
TemplateVehicle *tv = GetTemplateVehicleByGroupIDRecursive(incoming->group_id);
if (tv == nullptr) {
if (leaveDepot) incoming->vehstatus &= ~VS_STOPPED;
return CMD_ERROR;

@ -248,7 +248,7 @@ bool Vehicle::NeedsServicing() const
}
if (this->type == VEH_TRAIN) {
TemplateVehicle *tv = GetTemplateVehicleByGroupID(this->group_id);
TemplateVehicle *tv = GetTemplateVehicleByGroupIDRecursive(this->group_id);
if (tv != nullptr) {
if (tv->IsReplaceOldOnly() && !this->NeedsAutorenewing(c, false)) return false;
Money needed_money = c->settings.engine_renew_money;
@ -1092,7 +1092,7 @@ void Vehicle::PreCleanPool()
void VehicleEnteredDepotThisTick(Vehicle *v)
{
/* Template Replacement Setup stuff */
if (GetTemplateIDByGroupID(v->group_id) != INVALID_TEMPLATE) {
if (GetTemplateIDByGroupIDRecursive(v->group_id) != INVALID_TEMPLATE) {
/* Vehicle should stop in the depot if it was in 'stopping' state */
_vehicles_to_templatereplace.insert(v->index);
}

Loading…
Cancel
Save