industrytype.h

Go to the documentation of this file.
00001 /* $Id$ */
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 #ifndef INDUSTRYTYPE_H
00013 #define INDUSTRYTYPE_H
00014 
00015 #include "economy_type.h"
00016 #include "map_type.h"
00017 #include "slope_type.h"
00018 #include "industry_type.h"
00019 #include "landscape_type.h"
00020 #include "strings_type.h"
00021 #include "cargo_type.h"
00022 #include "newgrf_animation_type.h"
00023 #include "newgrf_commons.h"
00024 
00025 enum IndustryCleanupType {
00026   CLEAN_RANDOMSOUNDS,    
00027   CLEAN_TILELAYOUT,      
00028 };
00029 
00031 enum IndustryLifeType {
00032   INDUSTRYLIFE_BLACK_HOLE =      0, 
00033   INDUSTRYLIFE_EXTRACTIVE = 1 << 0, 
00034   INDUSTRYLIFE_ORGANIC    = 1 << 1, 
00035   INDUSTRYLIFE_PROCESSING = 1 << 2, 
00036 };
00037 
00042 enum CheckProc {
00043   CHECK_NOTHING,    
00044   CHECK_FOREST,     
00045   CHECK_REFINERY,   
00046   CHECK_FARM,       
00047   CHECK_PLANTATION, 
00048   CHECK_WATER,      
00049   CHECK_LUMBERMILL, 
00050   CHECK_BUBBLEGEN,  
00051   CHECK_OIL_RIG,    
00052   CHECK_END,        
00053 };
00054 
00056 enum IndustryConstructionType {
00057   ICT_UNKNOWN,          
00058   ICT_NORMAL_GAMEPLAY,  
00059   ICT_MAP_GENERATION,   
00060   ICT_SCENARIO_EDITOR   
00061 };
00062 
00064 enum IndustryBehaviour {
00065   INDUSTRYBEH_NONE                  =      0,
00066   INDUSTRYBEH_PLANT_FIELDS          = 1 << 0,  
00067   INDUSTRYBEH_CUT_TREES             = 1 << 1,  
00068   INDUSTRYBEH_BUILT_ONWATER         = 1 << 2,  
00069   INDUSTRYBEH_TOWN1200_MORE         = 1 << 3,  
00070   INDUSTRYBEH_ONLY_INTOWN           = 1 << 4,  
00071   INDUSTRYBEH_ONLY_NEARTOWN         = 1 << 5,  
00072   INDUSTRYBEH_PLANT_ON_BUILT        = 1 << 6,  
00073   INDUSTRYBEH_DONT_INCR_PROD        = 1 << 7,  
00074   INDUSTRYBEH_BEFORE_1950           = 1 << 8,  
00075   INDUSTRYBEH_AFTER_1960            = 1 << 9,  
00076   INDUSTRYBEH_AI_AIRSHIP_ROUTES     = 1 << 10, 
00077   INDUSTRYBEH_AIRPLANE_ATTACKS      = 1 << 11, 
00078   INDUSTRYBEH_CHOPPER_ATTACKS       = 1 << 12, 
00079   INDUSTRYBEH_CAN_SUBSIDENCE        = 1 << 13, 
00080   /* The following flags are only used for newindustries and do no represent any normal behaviour */
00081   INDUSTRYBEH_PROD_MULTI_HNDLING    = 1 << 14, 
00082   INDUSTRYBEH_PRODCALLBACK_RANDOM   = 1 << 15, 
00083   INDUSTRYBEH_NOBUILT_MAPCREATION   = 1 << 16, 
00084   INDUSTRYBEH_CANCLOSE_LASTINSTANCE = 1 << 17, 
00085 };
00086 DECLARE_ENUM_AS_BIT_SET(IndustryBehaviour)
00087 
00088 
00089 enum IndustryTileSpecialFlags {
00090   INDTILE_SPECIAL_NONE                  = 0,
00091   INDTILE_SPECIAL_NEXTFRAME_RANDOMBITS  = 1 << 0, 
00092 };
00093 DECLARE_ENUM_AS_BIT_SET(IndustryTileSpecialFlags)
00094 
00095 struct IndustryTileTable {
00096   TileIndexDiffC ti;
00097   IndustryGfx gfx;
00098 };
00099 
00103 struct IndustrySpec {
00104   const IndustryTileTable * const *table;
00105   byte num_table;                       
00106   uint8 cost_multiplier;                
00107   uint32 removal_cost_multiplier;       
00108   uint32 prospecting_chance;            
00109   IndustryType conflicting[3];          
00110   byte check_proc;                      
00111   CargoID produced_cargo[2];
00112   byte production_rate[2];
00113   byte minimal_cargo;                   
00114 
00115   CargoID accepts_cargo[3];             
00116   uint16 input_cargo_multiplier[3][2];  
00117   IndustryLifeType life_type;           
00118   byte climate_availability;            
00119   IndustryBehaviour behaviour;           
00120   byte map_colour;                      
00121   StringID name;                        
00122   StringID new_industry_text;           
00123   StringID closure_text;                
00124   StringID production_up_text;          
00125   StringID production_down_text;        
00126   StringID station_name;                
00127   byte appear_ingame[NUM_LANDSCAPE];    
00128   byte appear_creation[NUM_LANDSCAPE];  
00129   uint8 number_of_sounds;               
00130   const uint8 *random_sounds;           
00131   /* Newgrf data */
00132   uint16 callback_mask;                 
00133   uint8 cleanup_flag;                   
00134   bool enabled;                         
00135   GRFFileProps grf_prop;                
00136 
00137   bool IsRawIndustry() const;
00138   Money GetConstructionCost() const;
00139   Money GetRemovalCost() const;
00140   bool UsesSmoothEconomy() const;
00141 };
00142 
00146 struct IndustryTileSpec {
00147   CargoID accepts_cargo[3];             
00148   uint8 acceptance[3];                  
00149   Slope slopes_refused;                 
00150   byte anim_production;                 
00151   byte anim_next;                       
00152   bool anim_state;                      
00153 
00154   /* Newgrf data */
00155   uint8 callback_mask;                  
00156   AnimationInfo animation;              
00157   IndustryTileSpecialFlags special_flags; 
00158   bool enabled;                         
00159   GRFFileProps grf_prop;                
00160 };
00161 
00162 /* industry_cmd.cpp*/
00163 const IndustrySpec *GetIndustrySpec(IndustryType thistype);    
00164 const IndustryTileSpec *GetIndustryTileSpec(IndustryGfx gfx);  
00165 void ResetIndustries();
00166 
00167 /* writable arrays of specs */
00168 extern IndustrySpec _industry_specs[NUM_INDUSTRYTYPES];
00169 extern IndustryTileSpec _industry_tile_specs[NUM_INDUSTRYTILES];
00170 
00171 /* industry_gui.cpp */
00172 void SortIndustryTypes();
00173 /* Industry types sorted alphabetically by name. */
00174 extern IndustryType _sorted_industry_types[NUM_INDUSTRYTYPES];
00175 
00181 static inline IndustryGfx GetTranslatedIndustryTileID(IndustryGfx gfx)
00182 {
00183   /* the 0xFF should be GFX_WATERTILE_SPECIALCHECK but for reasons of include mess,
00184    * we'll simplify the writing.
00185    * Basically, the first test is required since the GFX_WATERTILE_SPECIALCHECK value
00186    * will never be assigned as a tile index and is only required in order to do some
00187    * tests while building the industry (as in WATER REQUIRED */
00188   if (gfx != 0xFF) {
00189     assert(gfx < INVALID_INDUSTRYTILE);
00190     const IndustryTileSpec *it = &_industry_tile_specs[gfx];
00191     return it->grf_prop.override == INVALID_INDUSTRYTILE ? gfx : it->grf_prop.override;
00192   } else {
00193     return gfx;
00194   }
00195 }
00196 
00197 static const uint8 IT_INVALID = 255;
00198 
00199 #endif /* INDUSTRYTYPE_H */