labelmaps_sl.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00012 #include "../stdafx.h"
00013 #include "../station_map.h"
00014 #include "../tunnelbridge_map.h"
00015
00016 #include "saveload.h"
00017
00018 static SmallVector<RailTypeLabel, RAILTYPE_END> _railtype_list;
00019
00025 static bool NeedRailTypeConversion()
00026 {
00027 for (uint i = 0; i < _railtype_list.Length(); i++) {
00028 if ((RailType)i < RAILTYPE_END) {
00029 const RailtypeInfo *rti = GetRailTypeInfo((RailType)i);
00030 if (rti->label != _railtype_list[i]) return true;
00031 } else {
00032 if (_railtype_list[i] != 0) return true;
00033 }
00034 }
00035
00036
00037 return false;
00038 }
00039
00040 void AfterLoadLabelMaps()
00041 {
00042 if (NeedRailTypeConversion()) {
00043 SmallVector<RailType, RAILTYPE_END> railtype_conversion_map;
00044
00045 for (uint i = 0; i < _railtype_list.Length(); i++) {
00046 RailType r = GetRailTypeByLabel(_railtype_list[i]);
00047 if (r == INVALID_RAILTYPE) r = RAILTYPE_BEGIN;
00048
00049 *railtype_conversion_map.Append() = r;
00050 }
00051
00052 for (TileIndex t = 0; t < MapSize(); t++) {
00053 switch (GetTileType(t)) {
00054 case MP_RAILWAY:
00055 SetRailType(t, railtype_conversion_map[GetRailType(t)]);
00056 break;
00057
00058 case MP_ROAD:
00059 if (IsLevelCrossing(t)) {
00060 SetRailType(t, railtype_conversion_map[GetRailType(t)]);
00061 }
00062 break;
00063
00064 case MP_STATION:
00065 if (HasStationRail(t)) {
00066 SetRailType(t, railtype_conversion_map[GetRailType(t)]);
00067 }
00068 break;
00069
00070 case MP_TUNNELBRIDGE:
00071 if (GetTunnelBridgeTransportType(t) == TRANSPORT_RAIL) {
00072 SetRailType(t, railtype_conversion_map[GetRailType(t)]);
00073 }
00074 break;
00075
00076 default:
00077 break;
00078 }
00079 }
00080 }
00081
00082 _railtype_list.Clear();
00083 }
00084
00086 struct LabelObject {
00087 uint32 label;
00088 };
00089
00090 static const SaveLoad _label_object_desc[] = {
00091 SLE_VAR(LabelObject, label, SLE_UINT32),
00092 SLE_END(),
00093 };
00094
00095 static void Save_RAIL()
00096 {
00097 LabelObject lo;
00098
00099 for (RailType r = RAILTYPE_BEGIN; r != RAILTYPE_END; r++) {
00100 lo.label = GetRailTypeInfo(r)->label;
00101
00102 SlSetArrayIndex(r);
00103 SlObject(&lo, _label_object_desc);
00104 }
00105 }
00106
00107 static void Load_RAIL()
00108 {
00109 _railtype_list.Clear();
00110
00111 LabelObject lo;
00112 int index;
00113
00114 while ((index = SlIterateArray()) != -1) {
00115 SlObject(&lo, _label_object_desc);
00116 *_railtype_list.Append() = (RailTypeLabel)lo.label;
00117 }
00118 }
00119
00120 extern const ChunkHandler _labelmaps_chunk_handlers[] = {
00121 { 'RAIL', Save_RAIL, Load_RAIL, NULL, CH_ARRAY | CH_LAST},
00122 };
00123