Changeset - r11436:cdab05954fbf
[Not reviewed]
master
0 6 1
peter1138 - 15 years ago 2009-03-21 23:58:20
peter1138@openttd.org
(svn r15799) -Codechange: Save rail type label list to savegame and perform mapping on load if necessary.
7 files changed with 139 insertions and 0 deletions:
0 comments (0 inline, 0 general)
projects/openttd_vs80.vcproj
Show inline comments
 
@@ -2080,6 +2080,10 @@
 
				>
 
			</File>
 
			<File
 
				RelativePath=".\..\src\saveload\labelmaps_sl.cpp"
 
				>
 
			</File>
 
			<File
 
				RelativePath=".\..\src\saveload\map_sl.cpp"
 
				>
 
			</File>
projects/openttd_vs90.vcproj
Show inline comments
 
@@ -2077,6 +2077,10 @@
 
				>
 
			</File>
 
			<File
 
				RelativePath=".\..\src\saveload\labelmaps_sl.cpp"
 
				>
 
			</File>
 
			<File
 
				RelativePath=".\..\src\saveload\map_sl.cpp"
 
				>
 
			</File>
source.list
Show inline comments
 
@@ -469,6 +469,7 @@ saveload/engine_sl.cpp
 
saveload/gamelog_sl.cpp
 
saveload/group_sl.cpp
 
saveload/industry_sl.cpp
 
saveload/labelmaps_sl.cpp
 
saveload/map_sl.cpp
 
saveload/misc_sl.cpp
 
saveload/newgrf_sl.cpp
src/saveload/afterload.cpp
Show inline comments
 
@@ -1797,6 +1797,8 @@ bool AfterLoadGame()
 
		}
 
	}
 

	
 
	AfterLoadLabelMaps();
 

	
 
	GamelogPrintDebug(1);
 

	
 
	bool ret = InitializeWindowsAndCaches();
src/saveload/labelmaps_sl.cpp
Show inline comments
 
new file 100644
 
/* $Id$ */
 

	
 
/** @file labelmaps_sl.cpp Code handling saving and loading of rail type label mappings */
 

	
 
#include "../stdafx.h"
 
#include "../strings_type.h"
 
#include "../rail.h"
 
#include "../map_func.h"
 
#include "../tile_map.h"
 
#include "../rail_map.h"
 
#include "../road_map.h"
 
#include "../station_map.h"
 
#include "../tunnelbridge_map.h"
 
#include "../core/alloc_func.hpp"
 
#include "../core/smallvec_type.hpp"
 
#include "../settings_type.h"
 

	
 
#include "saveload.h"
 

	
 
static SmallVector<RailTypeLabel, RAILTYPE_END> _railtype_list;
 

	
 
/**
 
 * Test if any saved rail type labels are different to the currently loaded
 
 * rail types, which therefore requires conversion.
 
 * @return true if (and only if) conversion due to rail type changes is needed.
 
 */
 
static bool NeedRailTypeConversion()
 
{
 
	for (uint i = 0; i < _railtype_list.Length(); i++) {
 
		if ((RailType)i < RAILTYPE_END) {
 
			const RailtypeInfo *rti = GetRailTypeInfo((RailType)i);
 
			if (rti->label != _railtype_list[i]) return true;
 
		} else {
 
			if (_railtype_list[i] != 0) return true;
 
		}
 
	}
 

	
 
	/* No rail type conversion is necessary */
 
	return false;
 
}
 

	
 
void AfterLoadLabelMaps()
 
{
 
	if (NeedRailTypeConversion()) {
 
		SmallVector<RailType, RAILTYPE_END> railtype_conversion_map;
 

	
 
		for (uint i = 0; i < _railtype_list.Length(); i++) {
 
			RailType r = GetRailTypeByLabel(_railtype_list[i]);
 
			if (r == INVALID_RAILTYPE) r = RAILTYPE_BEGIN;
 

	
 
			*railtype_conversion_map.Append() = r;
 
		}
 

	
 
		for (TileIndex t = 0; t < MapSize(); t++) {
 
			switch (GetTileType(t)) {
 
				case MP_RAILWAY:
 
					SetRailType(t, railtype_conversion_map[GetRailType(t)]);
 
					break;
 

	
 
				case MP_ROAD:
 
					if (IsLevelCrossing(t)) {
 
						SetRailType(t, railtype_conversion_map[GetRailType(t)]);
 
					}
 
					break;
 

	
 
				case MP_STATION:
 
					if (IsRailwayStation(t)) {
 
						SetRailType(t, railtype_conversion_map[GetRailType(t)]);
 
					}
 
					break;
 

	
 
				case MP_TUNNELBRIDGE:
 
					if (GetTunnelBridgeTransportType(t) == TRANSPORT_RAIL) {
 
						SetRailType(t, railtype_conversion_map[GetRailType(t)]);
 
					}
 
					break;
 

	
 
				default:
 
					break;
 
			}
 
		}
 
	}
 

	
 
	_railtype_list.Clear();
 
}
 

	
 
/** Container for a label for SaveLoad system */
 
struct LabelObject {
 
	uint32 label;
 
};
 

	
 
static const SaveLoad _label_object_desc[] = {
 
	SLE_VAR(LabelObject, label, SLE_UINT32),
 
	SLE_END(),
 
};
 

	
 
static void Save_RAIL()
 
{
 
	LabelObject lo;
 

	
 
	for (RailType r = RAILTYPE_BEGIN; r != RAILTYPE_END; r++) {
 
		lo.label = GetRailTypeInfo(r)->label;
 

	
 
		SlSetArrayIndex(r);
 
		SlObject(&lo, _label_object_desc);
 
	}
 
}
 

	
 
static void Load_RAIL()
 
{
 
	_railtype_list.Clear();
 

	
 
	LabelObject lo;
 
	int index;
 

	
 
	while ((index = SlIterateArray()) != -1) {
 
		SlObject(&lo, _label_object_desc);
 
		*_railtype_list.Append() = (RailTypeLabel)lo.label;
 
	}
 
}
 

	
 
extern const ChunkHandler _labelmaps_chunk_handlers[] = {
 
	{ 'RAIL', Save_RAIL, Load_RAIL, CH_ARRAY | CH_LAST},
 
};
 

	
src/saveload/saveload.cpp
Show inline comments
 
@@ -1332,6 +1332,7 @@ extern const ChunkHandler _newgrf_chunk_
 
extern const ChunkHandler _group_chunk_handlers[];
 
extern const ChunkHandler _cargopacket_chunk_handlers[];
 
extern const ChunkHandler _autoreplace_chunk_handlers[];
 
extern const ChunkHandler _labelmaps_chunk_handlers[];
 

	
 
static const ChunkHandler * const _chunk_handlers[] = {
 
	_gamelog_chunk_handlers,
 
@@ -1358,6 +1359,7 @@ static const ChunkHandler * const _chunk
 
	_group_chunk_handlers,
 
	_cargopacket_chunk_handlers,
 
	_autoreplace_chunk_handlers,
 
	_labelmaps_chunk_handlers,
 
	NULL,
 
};
 

	
src/saveload/saveload_internal.h
Show inline comments
 
@@ -21,6 +21,7 @@ void FixOldWaypoints();
 
void AfterLoadWaypoints();
 
void AfterLoadVehicles(bool part_of_load);
 
void AfterLoadStations();
 
void AfterLoadLabelMaps();
 
void UpdateHousesAndTowns();
 

	
 
void UpdateOldAircraft();
0 comments (0 inline, 0 general)