# cargotype.cpp

Go to the documentation of this file.

    00001 /* $Id: cargotype.cpp 18413 2009-12-05 21:39:28Z alberth $ */
    00002
    00003 /*
    00004  * This file is part of OpenTTD.
    00005  * 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.
    00006  * 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.
    00007  * 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/>.
    00008  */
    00009
    00012 #include "stdafx.h"
    00013 #include "cargotype.h"
    00014 #include "core/bitmath_func.hpp"
    00015 #include "newgrf_cargo.h"
    00016
    00017 #include "table/sprites.h"
    00018 #include "table/strings.h"
    00019 #include "table/cargo_const.h"
    00020
    00021 CargoSpec CargoSpec::array[NUM_CARGO];
    00022
    00026 uint32 _cargo_mask;
    00027
    00031 void SetupCargoForClimate(LandscapeID l)
    00032 {
    00033   assert(l < lengthof(_default_climate_cargo));
    00034
    00035   /* Reset and disable all cargo types */
    00036   memset(CargoSpec::array, 0, sizeof(CargoSpec::array));
    00037   for (CargoID i = 0; i < lengthof(CargoSpec::array); i++) CargoSpec::Get(i)->bitnum = INVALID_CARGO;
    00038
    00039   _cargo_mask = 0;
    00040
    00041   for (CargoID i = 0; i < lengthof(_default_climate_cargo[l]); i++) {
    00042     CargoLabel cl = _default_climate_cargo[l][i];
    00043
    00044     /* Bzzt: check if cl is just an index into the cargo table */
    00045     if (cl < lengthof(_default_cargo)) {
    00046       /* Copy the indexed cargo */
    00047       CargoSpec *cargo = CargoSpec::Get(i);
    00048       *cargo = _default_cargo[cl];
    00049       if (cargo->bitnum != INVALID_CARGO) SetBit(_cargo_mask, i);
    00050       continue;
    00051     }
    00052
    00053     /* Loop through each of the default cargo types to see if
    00054      * the label matches */
    00055     for (uint j = 0; j < lengthof(_default_cargo); j++) {
    00056       if (_default_cargo[j].label == cl) {
    00057         *CargoSpec::Get(i) = _default_cargo[j];
    00058
    00059         /* Populate the available cargo mask */
    00060         SetBit(_cargo_mask, i);
    00061         break;
    00062       }
    00063     }
    00064   }
    00065 }
    00066
    00071 CargoID GetCargoIDByLabel(CargoLabel cl)
    00072 {
    00073   const CargoSpec *cs;
    00074   FOR_ALL_CARGOSPECS(cs) {
    00075     if (cs->label == cl) return cs->Index();
    00076   }
    00077
    00078   /* No matching label was found, so it is invalid */
    00079   return CT_INVALID;
    00080 }
    00081
    00082
    00087 CargoID GetCargoIDByBitnum(uint8 bitnum)
    00088 {
    00089   if (bitnum == INVALID_CARGO) return CT_INVALID;
    00090
    00091   const CargoSpec *cs;
    00092   FOR_ALL_CARGOSPECS(cs) {
    00093     if (cs->bitnum == bitnum) return cs->Index();
    00094   }
    00095
    00096   /* No matching label was found, so it is invalid */
    00097   return CT_INVALID;
    00098 }
    00099
    00103 SpriteID CargoSpec::GetCargoIcon() const
    00104 {
    00105   SpriteID sprite = this->sprite;
    00106   if (sprite == 0xFFFF) {
    00107     /* A value of 0xFFFF indicates we should draw a custom icon */
    00108     sprite = GetCustomCargoSprite(this);
    00109   }
    00110
    00111   if (sprite == 0) sprite = SPR_CARGO_GOODS;
    00112
    00113   return sprite;
    00114 }
    00115