1 /*************************************************************************** 2 buildinglayer.h - description 3 ------------------- 4 begin : september 20th, 2003 5 copyright : (C) 2003-2008 by Duong Khang NGUYEN 6 email : neoneurone @ gmail com 7 8 $Id: buildinglayer.h 375 2008-10-28 14:47:15Z neoneurone $ 9 ***************************************************************************/ 10 11 /*************************************************************************** 12 * * 13 * This program is free software; you can redistribute it and/or modify * 14 * it under the terms of the GNU General Public License as published by * 15 * the Free Software Foundation; either version 2 of the License, or * 16 * any later version. * 17 * * 18 ***************************************************************************/ 19 20 #ifndef _OPENCITY_BUILDINGLAYER_H_ 21 #define _OPENCITY_BUILDINGLAYER_H_ 1 22 23 #include "main.h" 24 #include "layer.h" 25 26 27 class City; 28 29 30 //======================================================================== 31 /** This class contains all the buildings added by the player 32 */ 33 class BuildingLayer : public Layer { 34 public: 35 //constructor, should not be used. Call the constructor with parameters instead. 36 //BuildingLayer(); 37 38 virtual ~BuildingLayer(); //dtor 39 40 BuildingLayer( const City & rcCity ); //ctor with parameters 41 42 43 //======================================================================== 44 /** Save the data to the specified fstream 45 \param rfs A reference to a file stream which is ready for writing 46 \see Persistence 47 */ 48 void 49 SaveTo( std::fstream& rfs ); 50 51 52 //======================================================================== 53 /** Load the data from the specified stream 54 \param rfs A reference to a file stream which is ready for reading 55 \see Persistence 56 */ 57 void 58 LoadFrom( std::fstream& rfs ); 59 60 61 //======================================================================== 62 /** Is the specified area constructive ? 63 Can we build the specified structure on it ? 64 \param W1,W2 = OpenGL Ox 65 \param L1,L2 = OpenGL Oz 66 \param enumStructCode = The code of the structure that we're going to build 67 \return True or False 68 */ 69 const bool 70 IsConstructive( 71 uint W1, uint L1, 72 uint W2, uint L2, 73 const OPENCITY_STRUCTURE_CODE & enumStructCode ) const; 74 75 76 //======================================================================== 77 /** see "layer.h" for more informations 78 \sa Layer::BuildPreview() 79 */ 80 const OPENCITY_ERR_CODE 81 BuildPreview( 82 const uint & W, 83 const uint & L, 84 const OPENCITY_STRUCTURE_CODE & enumStructCode, 85 OPENCITY_GRAPHIC_CODE & enumGraphicCode ) const; 86 87 88 //======================================================================== 89 /** see "layer.h" for more informations 90 \see Layer 91 */ 92 const OPENCITY_ERR_CODE 93 BuildStructure( 94 const uint & W1, 95 const uint & L1, 96 const uint & W2, 97 const uint & L2, 98 const OPENCITY_STRUCTURE_CODE & enumStructCode, 99 uint& rCost ); 100 101 102 //======================================================================== 103 /** Find the main structure WL coordinates of the given structure pointer 104 \param pstruct The structure pointer to search for 105 \param w,l The WL coordinates of pstruct 106 \return True if found, false otherwise 107 */ 108 const bool 109 GetMainWL ( 110 const Structure* const pstruct, 111 uint & w, 112 uint & l 113 ) const; 114 115 116 //======================================================================== 117 /** Resize the surface used by the structure to the new surface thanks to 118 its new GraphicCode. 119 \param w,l = The structure's map coordinates 120 \param oldGC = The old graphic code of the structure 121 */ 122 const OPENCITY_ERR_CODE 123 ResizeStructure( 124 const uint & w, 125 const uint & l, 126 const OPENCITY_GRAPHIC_CODE & oldGC ); 127 128 129 //======================================================================== 130 /** Destroy all the structures built on the specified surface 131 \param W1,W2 = OpenGL Ox 132 \param L1,L2 = OpenGL Oz 133 \param rCost = the cost needed to clean up the specified surface 134 \return Error code 135 */ 136 const OPENCITY_ERR_CODE 137 DestroyStructure( 138 uint W1, uint L1, 139 uint W2, uint L2, 140 uint& rCost ); 141 142 143 //======================================================================== 144 /** Returns a pointer to a structure indexed by its linear index. The 145 linear index of a structure is calculated by this formula: 146 index = W + (H * city width) 147 \param cuiLinearIndex = linear index of the structure to retrieve 148 \return A pointer to a structure if it exists NULL otherwise 149 */ 150 Structure* 151 GetLinearStructure( const uint cuiLinearIndex ) const; 152 153 154 Structure* 155 GetStructure( 156 const uint & w, 157 const uint & l ) const; 158 159 160 Structure* 161 GetRandomStructure( 162 uint & w, 163 uint & l, 164 const OPENCITY_STRUCTURE_CODE & enumStructCode = OC_STRUCTURE_UNDEFINED ) const; 165 166 167 const uint 168 GetNumberStructure() const; 169 170 171 //======================================================================== 172 /** Set all the structures contained by this layer to the specified status. 173 \param status = The new status of the structures 174 */ 175 void 176 StructureSet( const OC_BYTE& status ); 177 178 179 //======================================================================== 180 /** Unset the specified status of all the structures contained 181 by this layer. 182 \param status = The status of the structures to be unset 183 */ 184 void 185 StructureUnset( const OC_BYTE& status ); 186 187 188 //======================================================================== 189 /** see "layer.h" for more informations 190 */ 191 const bool 192 ContainStructure( 193 const uint & W1, 194 const uint & L1, 195 const uint & W2, 196 const uint & L2, 197 const OPENCITY_STRUCTURE_CODE & enumStructCode ) const; 198 199 200 //======================================================================== 201 /** see "layer.h" for more informations 202 */ 203 const bool 204 ContainStructureOnly( 205 const uint & W1, 206 const uint & L1, 207 const uint & W2, 208 const uint & L2, 209 const OPENCITY_STRUCTURE_CODE & enumStructCode ) const; 210 211 212 //======================================================================== 213 /** see "layer.h" for more informations 214 */ 215 GUIContainer* const 216 QueryStructure( 217 const uint & w, 218 const uint & l ) const; 219 220 221 //======================================================================== 222 // Inherited methods from UI 223 //======================================================================== 224 void Keyboard( const SDL_KeyboardEvent& rcEvent ); 225 void MouseMotion( const SDL_MouseMotionEvent& rcEvent ); 226 void MouseButton( const SDL_MouseButtonEvent& rcEvent ); 227 void Expose( const SDL_ExposeEvent& rcEvent ); 228 void Resize( const SDL_ResizeEvent& rcEvent ); 229 230 231 private: 232 /** All the buildings are here */ 233 Structure** _tabpStructure; 234 235 236 237 238 239 /*=====================================================================*/ 240 /* PRIVATE METHODS */ 241 /*=====================================================================*/ 242 const bool 243 _IsPathConstructive( 244 const uint & w, 245 const uint & h, 246 const OPENCITY_STRUCTURE_CODE & enumStructCode ) const; 247 248 249 //======================================================================== 250 /** Called internally by other methods, don't touch it 251 */ 252 const OPENCITY_ERR_CODE 253 _BuildPathStructure( 254 uint W1, uint L1, 255 uint W2, uint L2, 256 const OPENCITY_STRUCTURE_CODE & enumStructCode, 257 uint& rCost ); 258 259 260 //======================================================================== 261 /** Build a path structure at the specified coordinates 262 \note If there's already a structure at the specified coordinates, this 263 method returns without generating any error 264 \param w,h The coordinates 265 \param linearIndex The index of the structure in the structure array 266 \param enumStructCode The structure code (=STRUCTURE_ROAD) 267 \param rCost The cost of the construction 268 */ 269 void 270 _BuildPathStructure( 271 const uint & w, 272 const uint & h, 273 const uint & linearIndex, 274 const OPENCITY_STRUCTURE_CODE & enumStructCode, 275 uint& rCost ); 276 277 278 const OPENCITY_ERR_CODE 279 _BuildRCIStructure( 280 uint W1, uint L1, 281 uint W2, uint L2, 282 const OPENCITY_STRUCTURE_CODE & enumStructCode, 283 uint& rCost ); 284 285 286 const OPENCITY_ERR_CODE 287 _BuildFloraStructure( 288 uint W1, uint L1, 289 uint W2, uint L2, 290 const OPENCITY_STRUCTURE_CODE & enumStructCode, 291 uint& rCost ); 292 293 294 const OPENCITY_ERR_CODE 295 _BuildWEGStructure( 296 uint W1, uint L1, 297 const OPENCITY_STRUCTURE_CODE & enumStructCode, 298 uint& rCost ); 299 300 301 void 302 _BuildWEGStructure( 303 uint W1, uint L1, 304 uint W2, uint L2, 305 const OPENCITY_STRUCTURE_CODE & enumStructCode, 306 uint& rCost ); 307 308 309 //======================================================================== 310 /** Fast load a structure at the specified coordinates. If the 311 structure is bigger than 1x1, then extra structures part will be built 312 automatically. There is not any "Constructive" test. 313 \note If there's already a structure at the specified coordinates, this 314 method returns without generating any error 315 \param w1,l1 The structure upper-left map coordinates 316 \param pStruct The pointer to the structure which will be deleted 317 automatically when the program ends 318 */ 319 void 320 _LoadStructure( 321 const uint & w1, 322 const uint & l1, 323 Structure* pStruct ); 324 325 326 //======================================================================== 327 /** Destroy the structure built at the specified coordinates 328 \param w = OpenGL Ox 329 \param l = OpenGL Oz 330 \param rCost = the cost needed to clean up the specified cell 331 \return Error code 332 */ 333 const OPENCITY_ERR_CODE 334 _DestroyStructure( 335 const uint & w, 336 const uint & l, 337 uint& rCost ); 338 339 340 const OPENCITY_ERR_CODE 341 _DestroyPathStructure( 342 uint w, uint l, 343 const OPENCITY_STRUCTURE_CODE & enumStructCode ); 344 }; 345 346 #endif 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372