Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00012 #include "stdafx.h"
00013 #include "debug.h"
00014 #include "newgrf.h"
00015 #include "newgrf_spritegroup.h"
00016 #include "core/bitmath_func.hpp"
00017
00018 static uint32 CargoGetRandomBits(const ResolverObject *object)
00019 {
00020 return 0;
00021 }
00022
00023
00024 static uint32 CargoGetTriggers(const ResolverObject *object)
00025 {
00026 return 0;
00027 }
00028
00029
00030 static void CargoSetTriggers(const ResolverObject *object, int triggers)
00031 {
00032 return;
00033 }
00034
00035
00036 static uint32 CargoGetVariable(const ResolverObject *object, byte variable, uint32 parameter, bool *available)
00037 {
00038 DEBUG(grf, 1, "Unhandled cargo variable 0x%X", variable);
00039
00040 *available = false;
00041 return UINT_MAX;
00042 }
00043
00044
00045 static const SpriteGroup *CargoResolveReal(const ResolverObject *object, const RealSpriteGroup *group)
00046 {
00047
00048
00049 if (group->num_loaded > 0) return group->loaded[0];
00050 if (group->num_loading > 0) return group->loading[0];
00051
00052 return NULL;
00053 }
00054
00055
00056 static void NewCargoResolver(ResolverObject *res, const CargoSpec *cs)
00057 {
00058 res->GetRandomBits = &CargoGetRandomBits;
00059 res->GetTriggers = &CargoGetTriggers;
00060 res->SetTriggers = &CargoSetTriggers;
00061 res->GetVariable = &CargoGetVariable;
00062 res->ResolveReal = &CargoResolveReal;
00063
00064 res->u.cargo.cs = cs;
00065
00066 res->callback = CBID_NO_CALLBACK;
00067 res->callback_param1 = 0;
00068 res->callback_param2 = 0;
00069 res->ResetState();
00070
00071 res->grffile = cs->grffile;
00072 }
00073
00074
00075 SpriteID GetCustomCargoSprite(const CargoSpec *cs)
00076 {
00077 const SpriteGroup *group;
00078 ResolverObject object;
00079
00080 NewCargoResolver(&object, cs);
00081
00082 group = SpriteGroup::Resolve(cs->group, &object);
00083 if (group == NULL) return 0;
00084
00085 return group->GetResult();
00086 }
00087
00088
00089 uint16 GetCargoCallback(CallbackID callback, uint32 param1, uint32 param2, const CargoSpec *cs)
00090 {
00091 ResolverObject object;
00092 const SpriteGroup *group;
00093
00094 NewCargoResolver(&object, cs);
00095 object.callback = callback;
00096 object.callback_param1 = param1;
00097 object.callback_param2 = param2;
00098
00099 group = SpriteGroup::Resolve(cs->group, &object);
00100 if (group == NULL) return CALLBACK_FAILED;
00101
00102 return group->GetCallbackResult();
00103 }
00104
00105
00106 CargoID GetCargoTranslation(uint8 cargo, const GRFFile *grffile, bool usebit)
00107 {
00108
00109 if (grffile->grf_version < 7) {
00110 if (!usebit) return cargo;
00111
00112 if (HasBit(_cargo_mask, cargo)) return GetCargoIDByBitnum(cargo);
00113 } else {
00114
00115 if (grffile->cargo_max > 0) {
00116
00117
00118 if (cargo < grffile->cargo_max) return GetCargoIDByLabel(grffile->cargo_list[cargo]);
00119 } else {
00120
00121 if (HasBit(_cargo_mask, cargo)) return GetCargoIDByBitnum(cargo);
00122 }
00123 }
00124 return CT_INVALID;
00125 }
00126
00127 uint8 GetReverseCargoTranslation(CargoID cargo, const GRFFile *grffile)
00128 {
00129
00130 const CargoSpec *cs = CargoSpec::Get(cargo);
00131
00132
00133
00134 for (uint i = 0; i < grffile->cargo_max; i++) {
00135 if (cs->label == grffile->cargo_list[i]) return i;
00136 }
00137
00138
00139 return cs->bitnum;
00140 }