TBTR: Fix palette recolouring of templates

Fix group overrides affecting template image when cloning vehicle
Update template when changing company colours

Update template images on demand instead of at load
This commit is contained in:
Jonathan G Rennison
2020-12-26 09:37:26 +00:00
parent 369c98e3e0
commit 78b06ddc40
13 changed files with 98 additions and 44 deletions

View File

@@ -19,6 +19,8 @@
#include "core/geometry_type.hpp"
#include "debug.h"
#include "zoom_func.h"
#include "core/backup_type.hpp"
#include "core/random_func.hpp"
#include "table/sprites.h"
#include "table/strings.h"
@@ -41,7 +43,7 @@
#include "safeguards.h"
Vehicle *vhead, *vtmp;
bool _template_vehicle_images_valid = false;
#ifdef _DEBUG
// debugging printing functions for convenience, usually called from gdb
@@ -125,8 +127,7 @@ void DrawTemplate(const TemplateVehicle *tv, int left, int right, int y)
int offset = 0;
while (t) {
PaletteID pal = GetEnginePalette(t->engine_type, _current_company);
t->sprite_seq.Draw(offset + t->image_dimensions.GetOffsetX(), t->image_dimensions.GetOffsetY() + ScaleGUITrad(10), pal, false);
t->sprite_seq.Draw(offset + t->image_dimensions.GetOffsetX(), t->image_dimensions.GetOffsetY() + ScaleGUITrad(10), t->colourmap, false);
offset += t->image_dimensions.GetDisplayImageWidth();
t = t->Next();
@@ -170,6 +171,7 @@ void SetupTemplateVehicleFromVirtual(TemplateVehicle *tmp, TemplateVehicle *prev
virt->GetImage(DIR_W, EIT_IN_DEPOT, &tmp->sprite_seq);
tmp->image_dimensions.SetFromTrain(virt);
tmp->colourmap = GetUncachedTrainPaletteIgnoringGroup(virt);
}
// create a full TemplateVehicle based train according to a virtual train
@@ -428,3 +430,43 @@ void TransferCargoForTrain(Train *old_veh, Train *new_head)
/* Update train weight etc., the old vehicle will be sold anyway */
new_head->ConsistChanged(CCF_LOADUNLOAD);
}
void UpdateAllTemplateVehicleImages()
{
SavedRandomSeeds saved_seeds;
SaveRandomSeeds(&saved_seeds);
for (TemplateVehicle *tv : TemplateVehicle::Iterate()) {
if (tv->Prev() == nullptr) {
Backup<CompanyID> cur_company(_current_company, tv->owner, FILE_LINE);
StringID err;
Train* t = VirtualTrainFromTemplateVehicle(tv, err, 0);
if (t != nullptr) {
int tv_len = 0;
for (TemplateVehicle *u = tv; u != nullptr; u = u->Next()) {
tv_len++;
}
int t_len = 0;
for (Train *u = t; u != nullptr; u = u->Next()) {
t_len++;
}
if (t_len == tv_len) {
Train *v = t;
for (TemplateVehicle *u = tv; u != nullptr; u = u->Next(), v = v->Next()) {
v->GetImage(DIR_W, EIT_IN_DEPOT, &u->sprite_seq);
u->image_dimensions.SetFromTrain(v);
u->colourmap = GetVehiclePalette(v);
}
} else {
DEBUG(misc, 0, "UpdateAllTemplateVehicleImages: vehicle count mismatch: %u, %u", t_len, tv_len);
}
delete t;
}
cur_company.Restore();
}
}
RestoreRandomSeeds(saved_seeds);
_template_vehicle_images_valid = true;
}