Files
@ r11930:314dbf13f3bf
Branch filter:
Location: cpp/openttd-patchpack/source/src/saveload/labelmaps_sl.cpp - annotation
r11930:314dbf13f3bf
2.8 KiB
text/x-c
(svn r16338) -Codechange: split loading of references to two phases
In the first phase, indexes are stored. In the second phase, indexes are checked for validity and converted to pointers
In the first phase, indexes are stored. In the second phase, indexes are checked for validity and converted to pointers
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11436:cdab05954fbf r11930:314dbf13f3bf r11436:cdab05954fbf r11436:cdab05954fbf | /* $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, NULL, CH_ARRAY | CH_LAST},
};
|