Files
@ r24498:e9114d9ab04a
Branch filter:
Location: cpp/openttd-patchpack/source/src/newgrf_engine.h - annotation
r24498:e9114d9ab04a
5.8 KiB
text/x-c
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.
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r9111:983de9c5a848 r6348:a905c3e6d8fa r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r8100:d1eb5523ede7 r12223:61e25b018cba r13104:9e66a110a842 r14248:a9050881acd7 r14248:a9050881acd7 r14248:a9050881acd7 r19736:e9409fb52532 r19736:e9409fb52532 r19738:837a139219f0 r19736:e9409fb52532 r19738:837a139219f0 r19738:837a139219f0 r19738:837a139219f0 r19736:e9409fb52532 r22756:8ffd1846f871 r22756:8ffd1846f871 r22756:8ffd1846f871 r22756:8ffd1846f871 r22756:8ffd1846f871 r22756:8ffd1846f871 r22756:8ffd1846f871 r22756:8ffd1846f871 r22756:8ffd1846f871 r22756:8ffd1846f871 r22756:8ffd1846f871 r19736:e9409fb52532 r19736:e9409fb52532 r19736:e9409fb52532 r23497:a0ab44ebd2fa r23497:a0ab44ebd2fa r23497:a0ab44ebd2fa r19736:e9409fb52532 r19736:e9409fb52532 r19738:837a139219f0 r19736:e9409fb52532 r21299:8973364c4b52 r21299:8973364c4b52 r21299:8973364c4b52 r21299:8973364c4b52 r21299:8973364c4b52 r21299:8973364c4b52 r21299:8973364c4b52 r21299:8973364c4b52 r19738:837a139219f0 r19738:837a139219f0 r19736:e9409fb52532 r19738:837a139219f0 r19738:837a139219f0 r19736:e9409fb52532 r21299:8973364c4b52 r19736:e9409fb52532 r19736:e9409fb52532 r23497:a0ab44ebd2fa r19736:e9409fb52532 r23497:a0ab44ebd2fa r24069:49625df81342 r24069:49625df81342 r24069:49625df81342 r19736:e9409fb52532 r5475:3f5cd13d1b63 r15173:a59afd6301a6 r19415:bed87a3f22a9 r15173:a59afd6301a6 r5475:3f5cd13d1b63 r22459:c1921e75ce89 r22459:c1921e75ce89 r8198:888b30c1c93b r8198:888b30c1c93b r5475:3f5cd13d1b63 r22459:c1921e75ce89 r22459:c1921e75ce89 r22459:c1921e75ce89 r23607:36c15679007d r22459:c1921e75ce89 r22459:c1921e75ce89 r22459:c1921e75ce89 r23607:36c15679007d r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r7327:28855024ff6c r7327:28855024ff6c r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r6490:ba88f1f6bfd1 r6490:ba88f1f6bfd1 r13104:9e66a110a842 r23607:36c15679007d r6490:ba88f1f6bfd1 r6248:b940b09d7ab8 r7856:0efa92967a55 r6348:a905c3e6d8fa r7856:0efa92967a55 r6348:a905c3e6d8fa r7856:0efa92967a55 r6348:a905c3e6d8fa r7856:0efa92967a55 r7803:21a2033d0bf7 r7856:0efa92967a55 r6248:b940b09d7ab8 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r9070:e059c65164f3 r5475:3f5cd13d1b63 r19404:b33cb27be7af r9672:31eaac85a9e4 r5475:3f5cd13d1b63 r9073:d7dbfc1998b4 r9073:d7dbfc1998b4 r5475:3f5cd13d1b63 | /*
* 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_engine.h Functions for NewGRF engines. */
#ifndef NEWGRF_ENGINE_H
#define NEWGRF_ENGINE_H
#include "direction_type.h"
#include "newgrf_callbacks.h"
#include "newgrf_properties.h"
#include "vehicle_type.h"
#include "engine_type.h"
#include "gfx_type.h"
#include "newgrf_spritegroup.h"
/** Resolver for a vehicle scope. */
struct VehicleScopeResolver : public ScopeResolver {
const struct Vehicle *v; ///< The vehicle being resolved.
EngineID self_type; ///< Type of the vehicle.
bool info_view; ///< Indicates if the item is being drawn in an info window.
/**
* Scope resolver of a single vehicle.
* @param ro Surrounding resolver.
* @param engine_type Engine type
* @param v %Vehicle being resolved.
* @param info_view Indicates if the item is being drawn in an info window.
*/
VehicleScopeResolver(ResolverObject &ro, EngineID engine_type, const Vehicle *v, bool info_view)
: ScopeResolver(ro), v(v), self_type(engine_type), info_view(info_view)
{
}
void SetVehicle(const Vehicle *v) { this->v = v; }
uint32 GetRandomBits() const override;
uint32 GetVariable(byte variable, uint32 parameter, bool *available) const override;
uint32 GetTriggers() const override;
};
/** Resolver for a vehicle (chain) */
struct VehicleResolverObject : public ResolverObject {
/** Application of 'wagon overrides'. */
enum WagonOverride {
WO_NONE, //!< Resolve no wagon overrides.
WO_UNCACHED, //!< Resolve wagon overrides.
WO_CACHED, //!< Resolve wagon overrides using TrainCache::cached_override.
WO_SELF, //!< Resolve self-override (helicopter rotors and such).
};
VehicleScopeResolver self_scope; ///< Scope resolver for the indicated vehicle.
VehicleScopeResolver parent_scope; ///< Scope resolver for its parent vehicle.
VehicleScopeResolver relative_scope; ///< Scope resolver for an other vehicle in the chain.
byte cached_relative_count; ///< Relative position of the other vehicle.
VehicleResolverObject(EngineID engine_type, const Vehicle *v, WagonOverride wagon_override, bool info_view = false,
CallbackID callback = CBID_NO_CALLBACK, uint32 callback_param1 = 0, uint32 callback_param2 = 0);
ScopeResolver *GetScope(VarSpriteGroupScope scope = VSG_SCOPE_SELF, byte relative = 0) override;
const SpriteGroup *ResolveReal(const RealSpriteGroup *group) const override;
GrfSpecFeature GetFeature() const override;
uint32 GetDebugID() const override;
};
static const uint TRAININFO_DEFAULT_VEHICLE_WIDTH = 29;
static const uint ROADVEHINFO_DEFAULT_VEHICLE_WIDTH = 32;
static const uint VEHICLEINFO_FULL_VEHICLE_WIDTH = 32;
struct VehicleSpriteSeq;
void SetWagonOverrideSprites(EngineID engine, CargoID cargo, const struct SpriteGroup *group, EngineID *train_id, uint trains);
const SpriteGroup *GetWagonOverrideSpriteSet(EngineID engine, CargoID cargo, EngineID overriding_engine);
void SetCustomEngineSprites(EngineID engine, byte cargo, const struct SpriteGroup *group);
void GetCustomEngineSprite(EngineID engine, const Vehicle *v, Direction direction, EngineImageType image_type, VehicleSpriteSeq *result);
#define GetCustomVehicleSprite(v, direction, image_type, result) GetCustomEngineSprite(v->engine_type, v, direction, image_type, result)
#define GetCustomVehicleIcon(et, direction, image_type, result) GetCustomEngineSprite(et, nullptr, direction, image_type, result)
void GetRotorOverrideSprite(EngineID engine, const struct Aircraft *v, bool info_view, EngineImageType image_type, VehicleSpriteSeq *result);
#define GetCustomRotorSprite(v, i, image_type, result) GetRotorOverrideSprite(v->engine_type, v, i, image_type, result)
#define GetCustomRotorIcon(et, image_type, result) GetRotorOverrideSprite(et, nullptr, true, image_type, result)
/* Forward declaration of GRFFile, to avoid unnecessary inclusion of newgrf.h
* elsewhere... */
struct GRFFile;
void SetEngineGRF(EngineID engine, const struct GRFFile *file);
uint16 GetVehicleCallback(CallbackID callback, uint32 param1, uint32 param2, EngineID engine, const Vehicle *v);
uint16 GetVehicleCallbackParent(CallbackID callback, uint32 param1, uint32 param2, EngineID engine, const Vehicle *v, const Vehicle *parent);
bool UsesWagonOverride(const Vehicle *v);
/* Handler to Evaluate callback 36. If the callback fails (i.e. most of the
* time) orig_value is returned */
uint GetVehicleProperty(const Vehicle *v, PropertyID property, uint orig_value);
uint GetEngineProperty(EngineID engine, PropertyID property, uint orig_value, const Vehicle *v = nullptr);
enum VehicleTrigger {
VEHICLE_TRIGGER_NEW_CARGO = 0x01,
/* Externally triggered only for the first vehicle in chain */
VEHICLE_TRIGGER_DEPOT = 0x02,
/* Externally triggered only for the first vehicle in chain, only if whole chain is empty */
VEHICLE_TRIGGER_EMPTY = 0x04,
/* Not triggered externally (called for the whole chain if we got NEW_CARGO) */
VEHICLE_TRIGGER_ANY_NEW_CARGO = 0x08,
/* Externally triggered for each vehicle in chain */
VEHICLE_TRIGGER_CALLBACK_32 = 0x10,
};
void TriggerVehicle(Vehicle *veh, VehicleTrigger trigger);
void UnloadWagonOverrides(Engine *e);
void AlterVehicleListOrder(EngineID engine, uint target);
void CommitVehicleListOrderChanges();
EngineID GetNewEngineID(const GRFFile *file, VehicleType type, uint16 internal_id);
#endif /* NEWGRF_ENGINE_H */
|