1 /*************************************************************************** 2 property.h - description 3 ------------------- 4 begin : january 28th, 2007 5 copyright : (C) 2007 by Duong Khang NGUYEN 6 email : neoneurone @ gmail com 7 8 $Id: property.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_PROPERTY_H_ 21 #define _OPENCITY_PROPERTY_H_ 1 22 23 #include "main.h" 24 25 #include <climits> // INT_MAX 26 27 // Useful enumerations 28 #include "opencity_direction.h" 29 #include "opencity_structure_type.h" 30 31 32 // Object's properties XPath expressions 33 #define OC_METADATA_PROPERTY_NODE "/object/property" 34 #define OC_METADATA_COST_NODE "/object/property/cost" 35 36 #define OC_METADATA_NEED_R_NODE "/object/property/r/need" 37 #define OC_METADATA_PROVIDE_R_NODE "/object/property/r/provide" 38 #define OC_METADATA_NEED_C_NODE "/object/property/c/need" 39 #define OC_METADATA_PROVIDE_C_NODE "/object/property/c/provide" 40 #define OC_METADATA_NEED_I_NODE "/object/property/i/need" 41 #define OC_METADATA_PROVIDE_I_NODE "/object/property/i/provide" 42 #define OC_METADATA_NEED_W_NODE "/object/property/w/need" 43 #define OC_METADATA_PROVIDE_W_NODE "/object/property/w/provide" 44 #define OC_METADATA_NEED_E_NODE "/object/property/e/need" 45 #define OC_METADATA_PROVIDE_E_NODE "/object/property/e/provide" 46 #define OC_METADATA_NEED_G_NODE "/object/property/g/need" 47 #define OC_METADATA_PROVIDE_G_NODE "/object/property/g/provide" 48 49 #define OC_METADATA_NEED_T_NODE "/object/property/t/need" 50 #define OC_METADATA_PROVIDE_T_NODE "/object/property/t/provide" 51 #define OC_METADATA_NEED_NATURE_NODE "/object/property/nature/need" 52 #define OC_METADATA_PROVIDE_NATURE_NODE "/object/property/nature/provide" 53 54 #define OC_METADATA_STRUCTURE_TYPE_ATTRIBUTE "/object/property/@type" 55 #define OC_METADATA_INHABITANT_ATTRIBUTE "/object/property/@inhabitant" 56 #define OC_METADATA_RADIUS_ATTRIBUTE "/object/property/@radius" 57 #define OC_METADATA_WORKER_ATTRIBUTE "/object/property/@worker" 58 #define OC_METADATA_DIRECTION_ATTRIBUTE "/object/property/direction/@value" 59 60 #define OC_METADATA_MODEL_NODE "/object/model" 61 62 63 enum OPENCITY_DIRECTION; 64 enum OPENCITY_STRUCTURE_TYPE; 65 66 67 //======================================================================== 68 /** A simple min/max type */ 69 class MinMax 70 { 71 public: 72 int iMin, iMax; 73 MinMax(int min,int max)74 MinMax( int min, int max): 75 iMin(min), iMax(max) 76 {} 77 }; 78 79 80 //======================================================================== 81 /** Each "need", "provide" property is limited by its min and max values. 82 */ 83 class NeedProvide 84 { 85 public: 86 MinMax mmNeed, mmProvide; 87 NeedProvide()88 NeedProvide(): 89 mmNeed(0, INT_MAX), mmProvide(0, 0) 90 {} 91 }; 92 93 94 //======================================================================== 95 /** The properties of each building (structure) in OpenCity are 96 encapsulated in this structure. 97 */ 98 class Property 99 { 100 public: 101 /** The financial aspects of the object 102 */ 103 uint uiBuildCost, uiDestroyCost, uiSupportCost, uiIncome; 104 105 /** The need/provide properties 106 */ 107 NeedProvide sResidence, sCommerce, sIndustry; 108 NeedProvide sWater, sElectricity, sGas; 109 NeedProvide sTraffic, sNature; 110 111 /** The dimensions of the model 112 */ 113 uint uiWidth, uiLength; 114 float fHeight; 115 116 /** The generated number of inhabitant, worker and the radius of the influence 117 upon the other objects 118 */ 119 uint uiInhabitant, uiWorker, uiRadius; 120 121 /** The OpenCity type of the object. This type is used for un/serialization 122 */ 123 OPENCITY_STRUCTURE_TYPE eStructureType; 124 125 /** The directions to which the object is connected to. 126 */ 127 OPENCITY_DIRECTION eDirection; 128 129 130 //======================================================================== 131 /** Default ctor. Initialize all the member variables with their default 132 values. 133 */ Property()134 Property(): 135 uiBuildCost(0), uiDestroyCost(0), uiSupportCost(0), uiIncome(0), 136 uiWidth(0), uiLength(0), 137 fHeight(0), 138 uiInhabitant(0), uiWorker(0), uiRadius(0), 139 eStructureType(OC_TYPE_UNDEFINED), 140 eDirection(OC_DIR_UNDEFINED) 141 { 142 //OPENCITY_DEBUG( "ctor" ); 143 } 144 ~Property()145 ~Property() 146 { 147 //OPENCITY_DEBUG( "dtor" ); 148 } 149 150 151 /** Load the property XML file from mass storage 152 \return The pointer loaded property object 153 */ 154 static Property* 155 LoadProperties( string filename ); 156 157 158 //======================================================================== 159 // Private methods 160 //======================================================================== 161 static const OPENCITY_DIRECTION 162 _Str2Direction(const string& rcstrDir); 163 164 165 static const OPENCITY_STRUCTURE_TYPE 166 _Str2Type(const string& rcstrType); 167 }; 168 169 #endif 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202