peter1138@6691: /* $Id$ */ peter1138@6691: peter1138@6691: #include "stdafx.h" peter1138@6691: #include "openttd.h" peter1138@6709: #include "debug.h" peter1138@6691: #include "cargotype.h" peter1138@6691: #include "newgrf.h" peter1138@6691: #include "newgrf_callbacks.h" peter1138@6691: #include "newgrf_spritegroup.h" peter1138@6691: #include "newgrf_cargo.h" peter1138@6691: peter1138@6691: peter1138@6691: static uint32 CargoGetRandomBits(const ResolverObject *object) peter1138@6691: { peter1138@6691: return 0; peter1138@6691: } peter1138@6691: peter1138@6691: peter1138@6691: static uint32 CargoGetTriggers(const ResolverObject *object) peter1138@6691: { peter1138@6691: return 0; peter1138@6691: } peter1138@6691: peter1138@6691: peter1138@6691: static void CargoSetTriggers(const ResolverObject *object, int triggers) peter1138@6691: { peter1138@6691: return; peter1138@6691: } peter1138@6691: peter1138@6691: peter1138@6691: static uint32 CargoGetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available) peter1138@6691: { peter1138@6709: DEBUG(grf, 1, "Unhandled cargo property 0x%X", variable); peter1138@6709: peter1138@6691: *available = false; peter1138@6691: return 0; peter1138@6691: } peter1138@6691: peter1138@6691: peter1138@6691: static const SpriteGroup *CargoResolveReal(const ResolverObject *object, const SpriteGroup *group) peter1138@6691: { peter1138@7153: /* Cargo action 2s should always have only 1 "loaded" state, but some peter1138@7153: * times things don't follow the spec... */ peter1138@7153: if (group->g.real.num_loaded > 0) return group->g.real.loaded[0]; peter1138@7153: if (group->g.real.num_loading > 0) return group->g.real.loading[0]; peter1138@6691: peter1138@7153: return NULL; peter1138@6691: } peter1138@6691: peter1138@6691: peter1138@6691: static void NewCargoResolver(ResolverObject *res, const CargoSpec *cs) peter1138@6691: { peter1138@6691: res->GetRandomBits = &CargoGetRandomBits; peter1138@6691: res->GetTriggers = &CargoGetTriggers; peter1138@6691: res->SetTriggers = &CargoSetTriggers; peter1138@6691: res->GetVariable = &CargoGetVariable; peter1138@6691: res->ResolveReal = &CargoResolveReal; peter1138@6691: peter1138@6691: res->u.cargo.cs = cs; peter1138@6691: rubidium@7823: res->callback = CBID_NO_CALLBACK; peter1138@6691: res->callback_param1 = 0; peter1138@6691: res->callback_param2 = 0; peter1138@6691: res->last_value = 0; peter1138@6691: res->trigger = 0; peter1138@6691: res->reseed = 0; glx@9252: res->count = 0; peter1138@6691: } peter1138@6691: peter1138@6691: peter1138@6691: SpriteID GetCustomCargoSprite(const CargoSpec *cs) peter1138@6691: { peter1138@6691: const SpriteGroup *group; peter1138@6691: ResolverObject object; peter1138@6691: peter1138@6691: NewCargoResolver(&object, cs); peter1138@6691: peter1138@6691: group = Resolve(cs->group, &object); peter1138@6691: if (group == NULL || group->type != SGT_RESULT) return 0; peter1138@6691: peter1138@6691: return group->g.result.sprite; peter1138@6691: } peter1138@6691: peter1138@6691: rubidium@7823: uint16 GetCargoCallback(CallbackID callback, uint32 param1, uint32 param2, const CargoSpec *cs) peter1138@6691: { peter1138@6691: ResolverObject object; peter1138@6691: const SpriteGroup *group; peter1138@6691: peter1138@6691: NewCargoResolver(&object, cs); peter1138@6691: object.callback = callback; peter1138@6691: object.callback_param1 = param1; peter1138@6691: object.callback_param2 = param2; peter1138@6691: peter1138@6691: group = Resolve(cs->group, &object); peter1138@6691: if (group == NULL || group->type != SGT_CALLBACK) return CALLBACK_FAILED; peter1138@6691: peter1138@6691: return group->g.callback.result; peter1138@6691: } peter1138@6956: peter1138@6956: glx@8213: CargoID GetCargoTranslation(uint8 cargo, const GRFFile *grffile, bool usebit) peter1138@6956: { peter1138@6956: /* Pre-version 7 uses the 'climate dependent' ID, i.e. cargo is the cargo ID */ glx@8213: if (grffile->grf_version < 7) { glx@8213: if (!usebit) return cargo; glx@8213: /* Else the cargo value is a 'climate independent' 'bitnum' */ skidd13@8424: if (HasBit(_cargo_mask, cargo)) return GetCargoIDByBitnum(cargo); glx@8213: } else { glx@8213: /* If the GRF contains a translation table (and the cargo is in bounds) glx@8213: * then get the cargo ID for the label */ glx@8213: if (cargo < grffile->cargo_max) return GetCargoIDByLabel(grffile->cargo_list[cargo]); glx@8213: } glx@8213: return CT_INVALID; peter1138@6956: } rubidium@7695: rubidium@7695: uint8 GetReverseCargoTranslation(CargoID cargo, const GRFFile *grffile) rubidium@7695: { frosch@9060: /* Note: All grf versions use CargoBit here. Pre-version 7 do NOT use the 'climate dependent' ID. */ rubidium@7695: const CargoSpec *cs = GetCargo(cargo); rubidium@7695: rubidium@7695: /* If the GRF contains a translation table (and the cargo is in the table) rubidium@7695: * then get the cargo ID for the label */ rubidium@7695: for (uint i = 0; i < grffile->cargo_max; i++) { rubidium@7695: if (cs->label == grffile->cargo_list[i]) return i; rubidium@7695: } rubidium@7695: rubidium@7695: /* No matching label was found, so we return the 'climate independent' 'bitnum' */ rubidium@7695: return cs->bitnum;; rubidium@7695: }