cargotype.cpp
Go to the documentation of this file.00001
00002
00005 #include "stdafx.h"
00006 #include "newgrf_cargo.h"
00007 #include "cargotype.h"
00008 #include "core/bitmath_func.hpp"
00009
00010 #include "table/sprites.h"
00011 #include "table/strings.h"
00012 #include "table/cargo_const.h"
00013
00014 CargoSpec _cargo[NUM_CARGO];
00015
00016 static const byte INVALID_CARGO = 0xFF;
00017
00018
00019 uint32 _cargo_mask;
00020
00021
00022 void SetupCargoForClimate(LandscapeID l)
00023 {
00024 assert(l < lengthof(_default_climate_cargo));
00025
00026
00027 memset(_cargo, 0, sizeof(_cargo));
00028 for (CargoID i = 0; i < lengthof(_cargo); i++) _cargo[i].bitnum = INVALID_CARGO;
00029
00030 _cargo_mask = 0;
00031
00032 for (CargoID i = 0; i < lengthof(_default_climate_cargo[l]); i++) {
00033 CargoLabel cl = _default_climate_cargo[l][i];
00034
00035
00036 if (cl < lengthof(_default_cargo)) {
00037
00038 _cargo[i] = _default_cargo[cl];
00039 if (_cargo[i].bitnum != INVALID_CARGO) SetBit(_cargo_mask, i);
00040 continue;
00041 }
00042
00043
00044
00045 for (uint j = 0; j < lengthof(_default_cargo); j++) {
00046 if (_default_cargo[j].label == cl) {
00047 _cargo[i] = _default_cargo[j];
00048
00049
00050 SetBit(_cargo_mask, i);
00051 break;
00052 }
00053 }
00054 }
00055 }
00056
00057
00058 const CargoSpec *GetCargo(CargoID c)
00059 {
00060 assert(c < lengthof(_cargo));
00061 return &_cargo[c];
00062 }
00063
00064
00065 bool CargoSpec::IsValid() const
00066 {
00067 return bitnum != INVALID_CARGO;
00068 }
00069
00070
00071 CargoID GetCargoIDByLabel(CargoLabel cl)
00072 {
00073 for (CargoID c = 0; c < lengthof(_cargo); c++) {
00074 if (_cargo[c].bitnum == INVALID_CARGO) continue;
00075 if (_cargo[c].label == cl) return c;
00076 }
00077
00078
00079 return CT_INVALID;
00080 }
00081
00082
00087 CargoID GetCargoIDByBitnum(uint8 bitnum)
00088 {
00089 if (bitnum == INVALID_CARGO) return CT_INVALID;
00090
00091 for (CargoID c = 0; c < lengthof(_cargo); c++) {
00092 if (_cargo[c].bitnum == bitnum) return c;
00093 }
00094
00095
00096 return CT_INVALID;
00097 }
00098