2 * This file is part of OpenTTD.
3 * 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.
4 * 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.
5 * 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/>.
8 /** @file newgrf_storage.cpp Functionality related to the temporary and persistent storage arrays for NewGRFs. */
11 #include "newgrf_storage.h"
12 #include "core/pool_func.hpp"
13 #include "core/endian_func.hpp"
16 #include "safeguards.h"
18 PersistentStoragePool
_persistent_storage_pool("PersistentStorage");
19 INSTANTIATE_POOL_METHODS(PersistentStorage
)
21 /** The changed storage arrays */
22 static std::set
<BasePersistentStorageArray
*> *_changed_storage_arrays
= new std::set
<BasePersistentStorageArray
*>;
24 bool BasePersistentStorageArray::gameloop
;
25 bool BasePersistentStorageArray::command
;
26 bool BasePersistentStorageArray::testmode
;
29 * Remove references to use.
31 BasePersistentStorageArray::~BasePersistentStorageArray()
33 _changed_storage_arrays
->erase(this);
37 * Add the changed storage array to the list of changed arrays.
38 * This is done so we only have to revert/save the changed
39 * arrays, which saves quite a few clears, etc. after callbacks.
40 * @param storage the array that has changed
42 void AddChangedPersistentStorage(BasePersistentStorageArray
*storage
)
44 _changed_storage_arrays
->insert(storage
);
48 * Clear temporary changes made since the last call to SwitchMode, and
49 * set whether subsequent changes shall be persistent or temporary.
51 * @param mode Mode switch affecting temporary/persistent changes.
52 * @param ignore_prev_mode Disable some sanity checks for exceptional call circumstances.
54 /* static */ void BasePersistentStorageArray::SwitchMode(PersistentStorageMode mode
, [[maybe_unused
]] bool ignore_prev_mode
)
57 case PSM_ENTER_GAMELOOP
:
58 assert(ignore_prev_mode
|| !gameloop
);
59 assert(!command
&& !testmode
);
63 case PSM_LEAVE_GAMELOOP
:
64 assert(ignore_prev_mode
|| gameloop
);
65 assert(!command
&& !testmode
);
69 case PSM_ENTER_COMMAND
:
70 assert((ignore_prev_mode
|| !command
) && !testmode
);
74 case PSM_LEAVE_COMMAND
:
75 assert(ignore_prev_mode
|| command
);
79 case PSM_ENTER_TESTMODE
:
80 assert(!command
&& (ignore_prev_mode
|| !testmode
));
84 case PSM_LEAVE_TESTMODE
:
85 assert(ignore_prev_mode
|| testmode
);
89 default: NOT_REACHED();
92 /* Discard all temporary changes */
93 for (auto &it
: *_changed_storage_arrays
) {
94 Debug(desync
, 2, "warning: discarding persistent storage changes: Feature {}, GrfID {:08X}, Tile {}", it
->feature
, BSWAP32(it
->grfid
), it
->tile
);
97 _changed_storage_arrays
->clear();