mirror of https://github.com/OpenTTD/OpenTTD.git
(svn r25358) -Codechange: save and load link graph jobs and the schedule
This commit is contained in:
parent
575cabe90a
commit
3d0a0e8e48
|
@ -2790,6 +2790,8 @@ bool AfterLoadGame()
|
||||||
InitializeWindowsAndCaches();
|
InitializeWindowsAndCaches();
|
||||||
/* Restore the signals */
|
/* Restore the signals */
|
||||||
ResetSignalHandlers();
|
ResetSignalHandlers();
|
||||||
|
|
||||||
|
AfterLoadLinkGraphs();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,12 +11,16 @@
|
||||||
|
|
||||||
#include "../stdafx.h"
|
#include "../stdafx.h"
|
||||||
#include "../linkgraph/linkgraph.h"
|
#include "../linkgraph/linkgraph.h"
|
||||||
|
#include "../linkgraph/linkgraphjob.h"
|
||||||
|
#include "../linkgraph/linkgraphschedule.h"
|
||||||
#include "../settings_internal.h"
|
#include "../settings_internal.h"
|
||||||
#include "saveload.h"
|
#include "saveload.h"
|
||||||
|
|
||||||
typedef LinkGraph::BaseNode Node;
|
typedef LinkGraph::BaseNode Node;
|
||||||
typedef LinkGraph::BaseEdge Edge;
|
typedef LinkGraph::BaseEdge Edge;
|
||||||
|
|
||||||
|
const SettingDesc *GetSettingDescription(uint index);
|
||||||
|
|
||||||
static uint _num_nodes;
|
static uint _num_nodes;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -34,6 +38,69 @@ const SaveLoad *GetLinkGraphDesc()
|
||||||
return link_graph_desc;
|
return link_graph_desc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a SaveLoad array for a link graph job. The settings struct is derived from
|
||||||
|
* the global settings saveload array. The exact entries are calculated when the function
|
||||||
|
* is called the first time.
|
||||||
|
* It's necessary to keep a copy of the settings for each link graph job so that you can
|
||||||
|
* change the settings while in-game and still not mess with current link graph runs.
|
||||||
|
* Of course the settings have to be saved and loaded, too, to avoid desyncs.
|
||||||
|
* @return Array of SaveLoad structs.
|
||||||
|
*/
|
||||||
|
const SaveLoad *GetLinkGraphJobDesc()
|
||||||
|
{
|
||||||
|
static SmallVector<SaveLoad, 16> saveloads;
|
||||||
|
static const char *prefix = "linkgraph.";
|
||||||
|
|
||||||
|
/* Build the SaveLoad array on first call and don't touch it later on */
|
||||||
|
if (saveloads.Length() == 0) {
|
||||||
|
size_t offset_gamesettings = cpp_offsetof(GameSettings, linkgraph);
|
||||||
|
size_t offset_component = cpp_offsetof(LinkGraphJob, settings);
|
||||||
|
|
||||||
|
size_t prefixlen = strlen(prefix);
|
||||||
|
|
||||||
|
int setting = 0;
|
||||||
|
const SettingDesc *desc = GetSettingDescription(setting);
|
||||||
|
while (desc->save.cmd != SL_END) {
|
||||||
|
if (desc->desc.name != NULL && strncmp(desc->desc.name, prefix, prefixlen) == 0) {
|
||||||
|
SaveLoad sl = desc->save;
|
||||||
|
char *&address = reinterpret_cast<char *&>(sl.address);
|
||||||
|
address -= offset_gamesettings;
|
||||||
|
address += offset_component;
|
||||||
|
*(saveloads.Append()) = sl;
|
||||||
|
}
|
||||||
|
desc = GetSettingDescription(++setting);
|
||||||
|
}
|
||||||
|
|
||||||
|
const SaveLoad job_desc[] = {
|
||||||
|
SLE_VAR(LinkGraphJob, join_date, SLE_UINT32),
|
||||||
|
SLE_VAR(LinkGraphJob, link_graph.index, SLE_UINT16),
|
||||||
|
SLE_END()
|
||||||
|
};
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
do {
|
||||||
|
*(saveloads.Append()) = job_desc[i++];
|
||||||
|
} while (saveloads[saveloads.Length() - 1].cmd != SL_END);
|
||||||
|
}
|
||||||
|
|
||||||
|
return &saveloads[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a SaveLoad array for the link graph schedule.
|
||||||
|
* @return SaveLoad array for the link graph schedule.
|
||||||
|
*/
|
||||||
|
const SaveLoad *GetLinkGraphScheduleDesc()
|
||||||
|
{
|
||||||
|
static const SaveLoad schedule_desc[] = {
|
||||||
|
SLE_LST(LinkGraphSchedule, schedule, REF_LINK_GRAPH),
|
||||||
|
SLE_LST(LinkGraphSchedule, running, REF_LINK_GRAPH_JOB),
|
||||||
|
SLE_END()
|
||||||
|
};
|
||||||
|
return schedule_desc;
|
||||||
|
}
|
||||||
|
|
||||||
/* Edges and nodes are saved in the correct order, so we don't need to save their IDs. */
|
/* Edges and nodes are saved in the correct order, so we don't need to save their IDs. */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -75,6 +142,18 @@ void SaveLoad_LinkGraph(LinkGraph &lg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save a link graph job.
|
||||||
|
* @param lgj LinkGraphJob to be saved.
|
||||||
|
*/
|
||||||
|
static void DoSave_LGRJ(LinkGraphJob *lgj)
|
||||||
|
{
|
||||||
|
SlObject(lgj, GetLinkGraphJobDesc());
|
||||||
|
_num_nodes = lgj->Size();
|
||||||
|
SlObject(const_cast<LinkGraph *>(&lgj->Graph()), GetLinkGraphDesc());
|
||||||
|
SaveLoad_LinkGraph(const_cast<LinkGraph &>(lgj->Graph()));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Save a link graph.
|
* Save a link graph.
|
||||||
* @param lg LinkGraph to be saved.
|
* @param lg LinkGraph to be saved.
|
||||||
|
@ -104,6 +183,43 @@ static void Load_LGRP()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load all link graph jobs.
|
||||||
|
*/
|
||||||
|
static void Load_LGRJ()
|
||||||
|
{
|
||||||
|
int index;
|
||||||
|
while ((index = SlIterateArray()) != -1) {
|
||||||
|
if (!LinkGraphJob::CanAllocateItem()) {
|
||||||
|
/* Impossible as they have been present in previous game. */
|
||||||
|
NOT_REACHED();
|
||||||
|
}
|
||||||
|
LinkGraphJob *lgj = new (index) LinkGraphJob();
|
||||||
|
SlObject(lgj, GetLinkGraphJobDesc());
|
||||||
|
LinkGraph &lg = const_cast<LinkGraph &>(lgj->Graph());
|
||||||
|
SlObject(&lg, GetLinkGraphDesc());
|
||||||
|
lg.Init(_num_nodes);
|
||||||
|
SaveLoad_LinkGraph(lg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load the link graph schedule.
|
||||||
|
*/
|
||||||
|
static void Load_LGRS()
|
||||||
|
{
|
||||||
|
SlObject(LinkGraphSchedule::Instance(), GetLinkGraphScheduleDesc());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Spawn the threads for running link graph calculations.
|
||||||
|
* Has to be done after loading as the cargo classes might have changed.
|
||||||
|
*/
|
||||||
|
void AfterLoadLinkGraphs()
|
||||||
|
{
|
||||||
|
LinkGraphSchedule::Instance()->SpawnAll();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Save all link graphs.
|
* Save all link graphs.
|
||||||
*/
|
*/
|
||||||
|
@ -116,6 +232,36 @@ static void Save_LGRP()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save all link graph jobs.
|
||||||
|
*/
|
||||||
|
static void Save_LGRJ()
|
||||||
|
{
|
||||||
|
LinkGraphJob *lgj;
|
||||||
|
FOR_ALL_LINK_GRAPH_JOBS(lgj) {
|
||||||
|
SlSetArrayIndex(lgj->index);
|
||||||
|
SlAutolength((AutolengthProc*)DoSave_LGRJ, lgj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save the link graph schedule.
|
||||||
|
*/
|
||||||
|
static void Save_LGRS()
|
||||||
|
{
|
||||||
|
SlObject(LinkGraphSchedule::Instance(), GetLinkGraphScheduleDesc());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Substitute pointers in link graph schedule.
|
||||||
|
*/
|
||||||
|
static void Ptrs_LGRS()
|
||||||
|
{
|
||||||
|
SlObject(LinkGraphSchedule::Instance(), GetLinkGraphScheduleDesc());
|
||||||
|
}
|
||||||
|
|
||||||
extern const ChunkHandler _linkgraph_chunk_handlers[] = {
|
extern const ChunkHandler _linkgraph_chunk_handlers[] = {
|
||||||
{ 'LGRP', Save_LGRP, Load_LGRP, NULL, NULL, CH_ARRAY | CH_LAST }
|
{ 'LGRP', Save_LGRP, Load_LGRP, NULL, NULL, CH_ARRAY },
|
||||||
|
{ 'LGRJ', Save_LGRJ, Load_LGRJ, NULL, NULL, CH_ARRAY },
|
||||||
|
{ 'LGRS', Save_LGRS, Load_LGRS, Ptrs_LGRS, NULL, CH_LAST }
|
||||||
};
|
};
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include "../autoreplace_base.h"
|
#include "../autoreplace_base.h"
|
||||||
#include "../roadstop_base.h"
|
#include "../roadstop_base.h"
|
||||||
#include "../linkgraph/linkgraph.h"
|
#include "../linkgraph/linkgraph.h"
|
||||||
|
#include "../linkgraph/linkgraphjob.h"
|
||||||
#include "../statusbar_gui.h"
|
#include "../statusbar_gui.h"
|
||||||
#include "../fileio_func.h"
|
#include "../fileio_func.h"
|
||||||
#include "../gamelog.h"
|
#include "../gamelog.h"
|
||||||
|
@ -1223,6 +1224,7 @@ static size_t ReferenceToInt(const void *obj, SLRefType rt)
|
||||||
case REF_ORDERLIST: return ((const OrderList*)obj)->index + 1;
|
case REF_ORDERLIST: return ((const OrderList*)obj)->index + 1;
|
||||||
case REF_STORAGE: return ((const PersistentStorage*)obj)->index + 1;
|
case REF_STORAGE: return ((const PersistentStorage*)obj)->index + 1;
|
||||||
case REF_LINK_GRAPH: return ((const LinkGraph*)obj)->index + 1;
|
case REF_LINK_GRAPH: return ((const LinkGraph*)obj)->index + 1;
|
||||||
|
case REF_LINK_GRAPH_JOB: return ((const LinkGraphJob*)obj)->index + 1;
|
||||||
default: NOT_REACHED();
|
default: NOT_REACHED();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1300,6 +1302,10 @@ static void *IntToReference(size_t index, SLRefType rt)
|
||||||
if (LinkGraph::IsValidID(index)) return LinkGraph::Get(index);
|
if (LinkGraph::IsValidID(index)) return LinkGraph::Get(index);
|
||||||
SlErrorCorrupt("Referencing invalid LinkGraph");
|
SlErrorCorrupt("Referencing invalid LinkGraph");
|
||||||
|
|
||||||
|
case REF_LINK_GRAPH_JOB:
|
||||||
|
if (LinkGraphJob::IsValidID(index)) return LinkGraphJob::Get(index);
|
||||||
|
SlErrorCorrupt("Referencing invalid LinkGraphJob");
|
||||||
|
|
||||||
default: NOT_REACHED();
|
default: NOT_REACHED();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1714,7 +1714,7 @@ void DeleteGRFPresetFromConfig(const char *config_name)
|
||||||
delete ini;
|
delete ini;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const SettingDesc *GetSettingDescription(uint index)
|
const SettingDesc *GetSettingDescription(uint index)
|
||||||
{
|
{
|
||||||
if (index >= lengthof(_settings)) return NULL;
|
if (index >= lengthof(_settings)) return NULL;
|
||||||
return &_settings[index];
|
return &_settings[index];
|
||||||
|
|
Loading…
Reference in New Issue