labelmaps_sl.cpp

Go to the documentation of this file.
00001 /* $Id: labelmaps_sl.cpp 17693 2009-10-04 17:16:41Z rubidium $ */
00002 
00003 /*
00004  * This file is part of OpenTTD.
00005  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
00006  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00007  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
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   /* No rail type conversion is necessary */
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 

Generated on Sat Apr 17 23:24:52 2010 for OpenTTD by  doxygen 1.6.1