Files @ r25958:603d75b53498
Branch filter:

Location: cpp/openttd-patchpack/source/src/newgrf_storage.cpp - annotation

Patric Stout
Doc: update multiplayer documentation with latest changes (#9552)

Although several places were fixed during the PR making the change,
not all made it in this document.

While at it, removed all kinds of Markdown warnings by an excessive
usage of spacebar in this document.
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r7609:2e734c4aad38
r7609:2e734c4aad38
r7609:2e734c4aad38
r7609:2e734c4aad38
r17772:ce3cc7016cdc
r21091:6d0d361e1c1e
r21091:6d0d361e1c1e
r7609:2e734c4aad38
r7609:2e734c4aad38
r21383:942c32fb8b0e
r21383:942c32fb8b0e
r17772:ce3cc7016cdc
r17772:ce3cc7016cdc
r17772:ce3cc7016cdc
r7609:2e734c4aad38
r21090:ad4f8144ed92
r7609:2e734c4aad38
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r17138:5078c9240593
r17757:164e7fe4eed4
r17757:164e7fe4eed4
r21090:ad4f8144ed92
r17757:164e7fe4eed4
r17788:3b2375f0c0c3
r17757:164e7fe4eed4
r17757:164e7fe4eed4
r17757:164e7fe4eed4
r17138:5078c9240593
r17138:5078c9240593
r17138:5078c9240593
r17138:5078c9240593
r17138:5078c9240593
r21090:ad4f8144ed92
r7609:2e734c4aad38
r17788:3b2375f0c0c3
r7609:2e734c4aad38
r7609:2e734c4aad38
r17138:5078c9240593
r21283:ba592c088a09
r21283:ba592c088a09
r17138:5078c9240593
r21283:ba592c088a09
r21283:ba592c088a09
r17138:5078c9240593
r21283:ba592c088a09
r7609:2e734c4aad38
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r21283:ba592c088a09
r7609:2e734c4aad38
r7609:2e734c4aad38
r21283:ba592c088a09
r21283:ba592c088a09
r25655:1030dcb7eb52
r21283:ba592c088a09
r21283:ba592c088a09
r17788:3b2375f0c0c3
r7609:2e734c4aad38
/*
 * This file is part of OpenTTD.
 * 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.
 * 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.
 * 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/>.
 */

/** @file newgrf_storage.cpp Functionality related to the temporary and persistent storage arrays for NewGRFs. */

#include "stdafx.h"
#include "newgrf_storage.h"
#include "core/pool_func.hpp"
#include "core/endian_func.hpp"
#include "debug.h"
#include <set>

#include "safeguards.h"

PersistentStoragePool _persistent_storage_pool("PersistentStorage");
INSTANTIATE_POOL_METHODS(PersistentStorage)

/** The changed storage arrays */
static std::set<BasePersistentStorageArray*> *_changed_storage_arrays = new std::set<BasePersistentStorageArray*>;

bool BasePersistentStorageArray::gameloop;
bool BasePersistentStorageArray::command;
bool BasePersistentStorageArray::testmode;

/**
 * Remove references to use.
 */
BasePersistentStorageArray::~BasePersistentStorageArray()
{
	_changed_storage_arrays->erase(this);
}

/**
 * Add the changed storage array to the list of changed arrays.
 * This is done so we only have to revert/save the changed
 * arrays, which saves quite a few clears, etc. after callbacks.
 * @param storage the array that has changed
 */
void AddChangedPersistentStorage(BasePersistentStorageArray *storage)
{
	_changed_storage_arrays->insert(storage);
}

/**
 * Clear temporary changes made since the last call to SwitchMode, and
 * set whether subsequent changes shall be persistent or temporary.
 *
 * @param mode Mode switch affecting temporary/persistent changes.
 * @param ignore_prev_mode Disable some sanity checks for exceptional call circumstances.
 */
/* static */ void BasePersistentStorageArray::SwitchMode(PersistentStorageMode mode, bool ignore_prev_mode)
{
	switch (mode) {
		case PSM_ENTER_GAMELOOP:
			assert(ignore_prev_mode || !gameloop);
			assert(!command && !testmode);
			gameloop = true;
			break;

		case PSM_LEAVE_GAMELOOP:
			assert(ignore_prev_mode || gameloop);
			assert(!command && !testmode);
			gameloop = false;
			break;

		case PSM_ENTER_COMMAND:
			assert((ignore_prev_mode || !command) && !testmode);
			command = true;
			break;

		case PSM_LEAVE_COMMAND:
			assert(ignore_prev_mode || command);
			command = false;
			break;

		case PSM_ENTER_TESTMODE:
			assert(!command && (ignore_prev_mode || !testmode));
			testmode = true;
			break;

		case PSM_LEAVE_TESTMODE:
			assert(ignore_prev_mode || testmode);
			testmode = false;
			break;

		default: NOT_REACHED();
	}

	/* Discard all temporary changes */
	for (std::set<BasePersistentStorageArray*>::iterator it = _changed_storage_arrays->begin(); it != _changed_storage_arrays->end(); it++) {
		Debug(desync, 1, "Discarding persistent storage changes: Feature {}, GrfID {:08X}, Tile {}", (*it)->feature, BSWAP32((*it)->grfid), (*it)->tile);
		(*it)->ClearChanges();
	}
	_changed_storage_arrays->clear();
}