You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
154 lines
4.0 KiB
C++
154 lines
4.0 KiB
C++
#include "../stdafx.h"
|
|
|
|
#include "../tbtr_template_vehicle.h"
|
|
#include "../tbtr_template_vehicle_func.h"
|
|
#include "../train.h"
|
|
#include "../company_base.h"
|
|
#include "../core/backup_type.hpp"
|
|
#include "../core/random_func.hpp"
|
|
|
|
#include "saveload.h"
|
|
|
|
const SaveLoad* GTD() {
|
|
|
|
static const SaveLoad _template_veh_desc[] = {
|
|
SLE_REF(TemplateVehicle, next, REF_TEMPLATE_VEHICLE),
|
|
|
|
SLE_VAR(TemplateVehicle, reuse_depot_vehicles, SLE_UINT8),
|
|
SLE_VAR(TemplateVehicle, keep_remaining_vehicles, SLE_UINT8),
|
|
SLE_VAR(TemplateVehicle, refit_as_template, SLE_UINT8),
|
|
|
|
SLE_VAR(TemplateVehicle, owner, SLE_UINT32),
|
|
SLE_VAR(TemplateVehicle, owner_b, SLE_UINT8),
|
|
|
|
SLE_VAR(TemplateVehicle, engine_type, SLE_UINT16),
|
|
SLE_VAR(TemplateVehicle, cargo_type, SLE_UINT8),
|
|
SLE_VAR(TemplateVehicle, cargo_cap, SLE_UINT16),
|
|
SLE_VAR(TemplateVehicle, cargo_subtype, SLE_UINT8),
|
|
|
|
SLE_VAR(TemplateVehicle, subtype, SLE_UINT8),
|
|
SLE_VAR(TemplateVehicle, railtype, SLE_UINT8),
|
|
|
|
SLE_VAR(TemplateVehicle, index, SLE_UINT32),
|
|
|
|
SLE_VAR(TemplateVehicle, real_consist_length, SLE_UINT16),
|
|
|
|
SLE_VAR(TemplateVehicle, max_speed, SLE_UINT16),
|
|
SLE_VAR(TemplateVehicle, power, SLE_UINT32),
|
|
SLE_VAR(TemplateVehicle, weight, SLE_UINT32),
|
|
SLE_VAR(TemplateVehicle, max_te, SLE_UINT32),
|
|
|
|
SLE_VAR(TemplateVehicle, spritenum, SLE_UINT8),
|
|
SLE_CONDVAR_X(TemplateVehicle, sprite_seq.seq[0].sprite, SLE_UINT32, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_TEMPLATE_REPLACEMENT, 0, 1)),
|
|
SLE_CONDVAR_X(TemplateVehicle, sprite_seq.count, SLE_UINT32, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_TEMPLATE_REPLACEMENT, 2)),
|
|
SLE_CONDARR_X(TemplateVehicle, sprite_seq.seq, SLE_UINT32, 8, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_TEMPLATE_REPLACEMENT, 2)),
|
|
SLE_VAR(TemplateVehicle, image_width, SLE_UINT32),
|
|
|
|
SLE_END()
|
|
};
|
|
|
|
static const SaveLoad * const _ret[] = {
|
|
_template_veh_desc,
|
|
};
|
|
|
|
return _ret[0];
|
|
}
|
|
|
|
static void Save_TMPLS()
|
|
{
|
|
TemplateVehicle *tv;
|
|
|
|
FOR_ALL_TEMPLATES(tv) {
|
|
SlSetArrayIndex(tv->index);
|
|
SlObject(tv, GTD());
|
|
}
|
|
}
|
|
|
|
static void Load_TMPLS()
|
|
{
|
|
int index;
|
|
|
|
while ((index = SlIterateArray()) != -1) {
|
|
TemplateVehicle *tv = new (index) TemplateVehicle(); //TODO:check with veh sl code
|
|
SlObject(tv, GTD());
|
|
}
|
|
}
|
|
|
|
static void Ptrs_TMPLS()
|
|
{
|
|
TemplateVehicle *tv;
|
|
FOR_ALL_TEMPLATES(tv) {
|
|
SlObject(tv, GTD());
|
|
}
|
|
}
|
|
|
|
void AfterLoadTemplateVehicles()
|
|
{
|
|
TemplateVehicle *tv;
|
|
|
|
FOR_ALL_TEMPLATES(tv) {
|
|
/* Reinstate the previous pointer */
|
|
if (tv->next != NULL) tv->next->previous = tv;
|
|
tv->first =NULL;
|
|
}
|
|
FOR_ALL_TEMPLATES(tv) {
|
|
/* Fill the first pointers */
|
|
if (tv->previous == NULL) {
|
|
for (TemplateVehicle *u = tv; u != NULL; u = u->Next()) {
|
|
u->first = tv;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void AfterLoadTemplateVehiclesUpdateImage()
|
|
{
|
|
TemplateVehicle *tv;
|
|
|
|
SavedRandomSeeds saved_seeds;
|
|
SaveRandomSeeds(&saved_seeds);
|
|
|
|
if (!SlXvIsFeaturePresent(XSLFI_TEMPLATE_REPLACEMENT, 3)) {
|
|
FOR_ALL_TEMPLATES(tv) {
|
|
if (tv->Prev() == NULL && !Company::IsValidID(tv->owner)) {
|
|
// clean up leftover template vehicles which no longer have a valid owner
|
|
delete tv;
|
|
}
|
|
}
|
|
}
|
|
|
|
FOR_ALL_TEMPLATES(tv) {
|
|
if (tv->Prev() == NULL) {
|
|
Backup<CompanyByte> cur_company(_current_company, tv->owner, FILE_LINE);
|
|
StringID err;
|
|
Train* t = VirtualTrainFromTemplateVehicle(tv, err);
|
|
if (t != NULL) {
|
|
int tv_len = 0;
|
|
for (TemplateVehicle *u = tv; u != NULL; u = u->Next()) {
|
|
tv_len++;
|
|
}
|
|
int t_len = 0;
|
|
for (Train *u = t; u != NULL; u = u->Next()) {
|
|
t_len++;
|
|
}
|
|
if (t_len == tv_len) {
|
|
Train *v = t;
|
|
for (TemplateVehicle *u = tv; u != NULL; u = u->Next(), v = v->Next()) {
|
|
u->spritenum = v->spritenum;
|
|
v->GetImage(DIR_W, EIT_PURCHASE, &u->sprite_seq);
|
|
u->image_width = v->GetDisplayImageWidth();
|
|
}
|
|
}
|
|
delete t;
|
|
}
|
|
cur_company.Restore();
|
|
}
|
|
}
|
|
|
|
RestoreRandomSeeds(saved_seeds);
|
|
}
|
|
|
|
extern const ChunkHandler _template_vehicle_chunk_handlers[] = {
|
|
{'TMPL', Save_TMPLS, Load_TMPLS, Ptrs_TMPLS, NULL, CH_ARRAY | CH_LAST},
|
|
};
|