00001 /* $Id: newgrf_storage.cpp 26371 2014-02-23 22:03:08Z frosch $ */ 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 "newgrf_storage.h" 00014 #include "core/pool_func.hpp" 00015 #include "core/endian_func.hpp" 00016 #include "debug.h" 00017 #include <set> 00018 00019 PersistentStoragePool _persistent_storage_pool("PersistentStorage"); 00020 INSTANTIATE_POOL_METHODS(PersistentStorage) 00021 00022 00023 static std::set<BasePersistentStorageArray*> *_changed_storage_arrays = new std::set<BasePersistentStorageArray*>; 00024 00025 bool BasePersistentStorageArray::gameloop; 00026 bool BasePersistentStorageArray::command; 00027 bool BasePersistentStorageArray::testmode; 00028 00032 BasePersistentStorageArray::~BasePersistentStorageArray() 00033 { 00034 _changed_storage_arrays->erase(this); 00035 } 00036 00043 void AddChangedPersistentStorage(BasePersistentStorageArray *storage) 00044 { 00045 _changed_storage_arrays->insert(storage); 00046 } 00047 00055 /* static */ void BasePersistentStorageArray::SwitchMode(PersistentStorageMode mode, bool ignore_prev_mode) 00056 { 00057 switch (mode) { 00058 case PSM_ENTER_GAMELOOP: 00059 assert(ignore_prev_mode || !gameloop); 00060 assert(!command && !testmode); 00061 gameloop = true; 00062 break; 00063 00064 case PSM_LEAVE_GAMELOOP: 00065 assert(ignore_prev_mode || gameloop); 00066 assert(!command && !testmode); 00067 gameloop = false; 00068 break; 00069 00070 case PSM_ENTER_COMMAND: 00071 assert((ignore_prev_mode || !command) && !testmode); 00072 command = true; 00073 break; 00074 00075 case PSM_LEAVE_COMMAND: 00076 assert(ignore_prev_mode || command); 00077 command = false; 00078 break; 00079 00080 case PSM_ENTER_TESTMODE: 00081 assert(!command && (ignore_prev_mode || !testmode)); 00082 testmode = true; 00083 break; 00084 00085 case PSM_LEAVE_TESTMODE: 00086 assert(ignore_prev_mode || testmode); 00087 testmode = false; 00088 break; 00089 00090 default: NOT_REACHED(); 00091 } 00092 00093 /* Discard all temporary changes */ 00094 for (std::set<BasePersistentStorageArray*>::iterator it = _changed_storage_arrays->begin(); it != _changed_storage_arrays->end(); it++) { 00095 DEBUG(desync, 1, "Discarding persistent storage changes: Feature %d, GrfID %08X, Tile %d", (*it)->feature, BSWAP32((*it)->grfid), (*it)->tile); 00096 (*it)->ClearChanges(); 00097 } 00098 _changed_storage_arrays->clear(); 00099 }