Files @ r24498:e9114d9ab04a
Branch filter:

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

Patric Stout
Fix #6468: don't store version of AIs-started-via-console in name

You can do: "startai myai.3", which starts version 3 of "myai".
This is very useful for testing save/load code between different
versions of your AI.

However, when using this syntax, the AI got saved as "myai.3" as
name of the AI, instead of "myai". This caused several problems,
like indicating to the user the AI could not be found, but still
load the AI. But in all cases, the AI never got the chance to
load the saved data, making the whole reason this exists pointless.

By splitting the name and version already in the console command,
the code becomes simpler and AIs started this way now follow the
normal flow after initialization.
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r9111:983de9c5a848
r9111:983de9c5a848
r6365:410001496130
r6383:09891b2cc6e4
r6365:410001496130
r6365:410001496130
r21383:942c32fb8b0e
r21383:942c32fb8b0e
r19738:837a139219f0
r19726:fb3262da438d
r24069:49625df81342
r24069:49625df81342
r19726:fb3262da438d
r6365:410001496130
r23497:a0ab44ebd2fa
r24069:49625df81342
r24069:49625df81342
r24069:49625df81342
r19726:fb3262da438d
r6383:09891b2cc6e4
r19726:fb3262da438d
r6365:410001496130
r6657:0c1322cba91d
r6657:0c1322cba91d
r11985:d8202dea2203
r11985:d8202dea2203
r6365:410001496130
r23607:36c15679007d
r6365:410001496130
r6365:410001496130
r24069:49625df81342
r24069:49625df81342
r24069:49625df81342
r24069:49625df81342
r24069:49625df81342
r24069:49625df81342
r24069:49625df81342
r24069:49625df81342
r24069:49625df81342
r24069:49625df81342
r19738:837a139219f0
r19738:837a139219f0
r19738:837a139219f0
r19738:837a139219f0
r19738:837a139219f0
r19738:837a139219f0
r19738:837a139219f0
r19726:fb3262da438d
r24069:49625df81342
r6365:410001496130
r21299:8973364c4b52
r6365:410001496130
r6365:410001496130
r19738:837a139219f0
r19738:837a139219f0
r19738:837a139219f0
r19738:837a139219f0
r19738:837a139219f0
r6365:410001496130
r6365:410001496130
r19726:fb3262da438d
r21299:8973364c4b52
r23607:36c15679007d
r6365:410001496130
r11985:d8202dea2203
r6365:410001496130
r6365:410001496130
r6365:410001496130
r7327:28855024ff6c
r6365:410001496130
r19726:fb3262da438d
r21299:8973364c4b52
r6365:410001496130
r6460:74b53af67ae0
r19046:7fa5045a9a14
r19046:7fa5045a9a14
r19046:7fa5045a9a14
r19046:7fa5045a9a14
r19046:7fa5045a9a14
r19046:7fa5045a9a14
r19046:7fa5045a9a14
r19046:7fa5045a9a14
r19046:7fa5045a9a14
r7717:a88200b1847a
r6460:74b53af67ae0
r19049:47de46c9ad63
r19049:47de46c9ad63
r19049:47de46c9ad63
r19049:47de46c9ad63
r19049:47de46c9ad63
r23520:20bbc807b0eb
r19049:47de46c9ad63
r19049:47de46c9ad63
r23520:20bbc807b0eb
r19049:47de46c9ad63
r7717:a88200b1847a
r19046:7fa5045a9a14
r7717:a88200b1847a
r7717:a88200b1847a
r6460:74b53af67ae0
/*
 * 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_cargo.cpp Implementation of NewGRF cargoes. */

#include "stdafx.h"
#include "debug.h"
#include "newgrf_spritegroup.h"

#include "safeguards.h"

/** Resolver of cargo. */
struct CargoResolverObject : public ResolverObject {
	const CargoSpec *cargospec;

	CargoResolverObject(const CargoSpec *cs, CallbackID callback = CBID_NO_CALLBACK, uint32 callback_param1 = 0, uint32 callback_param2 = 0);

	const SpriteGroup *ResolveReal(const RealSpriteGroup *group) const override;

	GrfSpecFeature GetFeature() const override;
	uint32 GetDebugID() const override;
};

/* virtual */ const SpriteGroup *CargoResolverObject::ResolveReal(const RealSpriteGroup *group) const
{
	/* Cargo action 2s should always have only 1 "loaded" state, but some
	 * times things don't follow the spec... */
	if (group->num_loaded > 0) return group->loaded[0];
	if (group->num_loading > 0) return group->loading[0];

	return nullptr;
}

GrfSpecFeature CargoResolverObject::GetFeature() const
{
	return GSF_CARGOES;
}

uint32 CargoResolverObject::GetDebugID() const
{
	return this->cargospec->label;
}

/**
 * Constructor of the cargo resolver.
 * @param cs Cargo being resolved.
 * @param callback Callback ID.
 * @param callback_param1 First parameter (var 10) of the callback.
 * @param callback_param2 Second parameter (var 18) of the callback.
 */
CargoResolverObject::CargoResolverObject(const CargoSpec *cs, CallbackID callback, uint32 callback_param1, uint32 callback_param2)
		: ResolverObject(cs->grffile, callback, callback_param1, callback_param2), cargospec(cs)
{
	this->root_spritegroup = cs->group;
}

/**
 * Get the custom sprite for the given cargo type.
 * @param cs Cargo being queried.
 * @return Custom sprite to draw, or \c 0 if not available.
 */
SpriteID GetCustomCargoSprite(const CargoSpec *cs)
{
	CargoResolverObject object(cs);
	const SpriteGroup *group = object.Resolve();
	if (group == nullptr) return 0;

	return group->GetResult();
}


uint16 GetCargoCallback(CallbackID callback, uint32 param1, uint32 param2, const CargoSpec *cs)
{
	CargoResolverObject object(cs, callback, param1, param2);
	return object.ResolveCallback();
}

/**
 * Translate a GRF-local cargo slot/bitnum into a CargoID.
 * @param cargo   GRF-local cargo slot/bitnum.
 * @param grffile Originating GRF file.
 * @param usebit  Defines the meaning of \a cargo for GRF version < 7.
 *                If true, then \a cargo is a bitnum. If false, then \a cargo is a cargoslot.
 *                For GRF version >= 7 \a cargo is always a translated cargo bit.
 * @return CargoID or CT_INVALID if the cargo is not available.
 */
CargoID GetCargoTranslation(uint8 cargo, const GRFFile *grffile, bool usebit)
{
	/* Pre-version 7 uses the 'climate dependent' ID in callbacks and properties, i.e. cargo is the cargo ID */
	if (grffile->grf_version < 7 && !usebit) return cargo;

	/* Other cases use (possibly translated) cargobits */

	if (grffile->cargo_list.size() > 0) {
		/* ...and the cargo is in bounds, then get the cargo ID for
		 * the label */
		if (cargo < grffile->cargo_list.size()) return GetCargoIDByLabel(grffile->cargo_list[cargo]);
	} else {
		/* Else the cargo value is a 'climate independent' 'bitnum' */
		return GetCargoIDByBitnum(cargo);
	}
	return CT_INVALID;
}