00001 00008 #include <config.h> 00009 00010 #include <zakdef.h> 00011 #if defined(PALM) 00012 #include <StringMgr.h> 00013 #include <unix_stdio.h> 00014 #else 00015 #include <stdio.h> 00016 #endif 00017 #include <mem_compat.h> 00018 #include <logging.h> 00019 #include <locking.h> 00020 #include <ui.h> 00021 #include <stack.h> 00022 #include <globals.h> 00023 00024 #define MILLION 1000000 00025 00034 stat_to_value statvalues[] = { 00035 { st_cashflow, bc_cashflow }, 00036 { st_pollution, bc_pollution }, 00037 { st_crime, bc_crime }, 00038 { st_residential, bc_value_residential }, 00039 { st_commercial, bc_value_commercial }, 00040 { st_industrial, bc_value_industrial }, 00041 { st_tail, 0 } 00042 }; 00043 00045 GameStruct game; 00047 vGameStruct vgame; 00048 00050 vGameVisuals visuals; 00051 00053 void *worldPtr; 00055 void *flagPtr; 00056 00058 void *growablePtr; 00059 00061 AppConfig_t gameConfig = { 00062 CONFIG_VERSION, 00063 DEFAULT_APPCONFIG 00064 }; 00065 00067 static UInt16 needchange; 00068 00073 void 00074 addGraphicUpdate(graphicupdate_t entity) 00075 { 00076 if (entity != gu_all) 00077 needchange |= (UInt16)entity; 00078 else 00079 needchange = ~(UInt16)0; 00080 } 00081 00086 void 00087 removeGraphicUpdate(graphicupdate_t entity) 00088 { 00089 needchange &= ~((UInt16)entity); 00090 } 00091 00097 UInt8 00098 checkGraphicUpdate(graphicupdate_t entity) 00099 { 00100 return ((UInt8)(needchange & entity ? 1 : 0)); 00101 } 00102 00107 UInt8 00108 checkAnyGraphicUpdate(void) 00109 { 00110 return ((UInt8)(needchange ? 1 : 0)); 00111 } 00112 00116 void 00117 clearGraphicUpdate(void) 00118 { 00119 needchange = 0; 00120 } 00121 00128 char * 00129 getDate(char *temp) 00130 { 00131 char month[10]; 00132 00133 sprintf(temp, "%s %ld", getMonthString( 00134 (UInt16)(getMonthsElapsed() % 12), 00135 month, (UInt16)9), 00136 (long)((getMonthsElapsed() / 12) + 2000)); 00137 return ((char *)temp); 00138 } 00139 00150 void * 00151 getIndexOf(char *ary, Int16 addit, Int16 key) 00152 { 00153 while (*(Int16 *)ary) { 00154 if (key == *(Int16 *)ary) 00155 return (ary); 00156 ary += addit; 00157 } 00158 return (NULL); 00159 } 00160 00165 UInt8 00166 getDisasterLevel(void) 00167 { 00168 return ((UInt8)(GG.diff_disaster & 0xF)); 00169 } 00170 00175 void 00176 setDisasterLevel(UInt8 value) 00177 { 00178 GG.diff_disaster &= 0xf0; 00179 GG.diff_disaster |= (UInt8)(value & 0x0f); 00180 } 00181 00186 UInt8 00187 getDifficultyLevel(void) 00188 { 00189 return ((UInt8)((GG.diff_disaster >> 4) & 0x0f)); 00190 } 00191 00196 void 00197 setDifficultyLevel(UInt8 value) 00198 { 00199 GG.diff_disaster &= (UInt8)0x0f; 00200 GG.diff_disaster |= (UInt8)((value & 0x0f) << 4); 00201 } 00202 00211 Int16 00212 ResizeWorld(UInt32 size) 00213 { 00214 WriteLog("Resize World = %ld\n", (long)size); 00215 LockZone(lz_world); 00216 LockZone(lz_flags); 00217 worldPtr = gRealloc(worldPtr, size); 00218 flagPtr = gRealloc(flagPtr, size); 00219 00220 if (worldPtr == NULL) { 00221 UISystemErrorNotify(seOutOfMemory); 00222 WriteLog("realloc failed - resizeworld\n"); 00223 return (0); 00224 } 00225 if (flagPtr == NULL) { 00226 UISystemErrorNotify(seOutOfMemory); 00227 WriteLog("realloc failed - resizeworldflags\n"); 00228 return (0); 00229 } 00230 00231 gMemSet(worldPtr, (Int32)size, 0); 00232 gMemSet(flagPtr, (Int32)size, 0); 00233 UnlockZone(lz_world); 00234 UnlockZone(lz_flags); 00235 return (1); 00236 } 00237 00242 Int16 00243 InitWorld(void) 00244 { 00245 return (1); 00246 } 00247 00253 welem_t 00254 getWorld(UInt32 pos) 00255 { 00256 if (pos > MapMul()) 00257 return (0); 00258 00259 return (((welem_t *)worldPtr)[pos]); 00260 } 00261 00267 void 00268 setWorld(UInt32 pos, welem_t value) 00269 { 00270 if (pos > MapMul()) 00271 return; 00272 00273 ((welem_t *)worldPtr)[pos] = value; 00274 } 00275 00282 void 00283 setWorldAndFlag(UInt32 pos, welem_t value, selem_t status) 00284 { 00285 if (pos > MapMul()) 00286 return; 00287 00288 ((welem_t *)worldPtr)[pos] = value; 00289 ((selem_t *)flagPtr)[pos] = status; 00290 } 00291 00297 selem_t 00298 getWorldFlags(UInt32 pos) 00299 { 00300 if (pos > MapMul()) 00301 return (0); 00302 return (((selem_t *)flagPtr)[pos]); 00303 } 00304 00310 void 00311 setWorldFlags(UInt32 pos, selem_t value) 00312 { 00313 if (pos > MapMul()) 00314 return; 00315 ((selem_t *)flagPtr)[pos] = value; 00316 } 00317 00323 void 00324 andWorldFlags(UInt32 pos, selem_t value) 00325 { 00326 if (pos > MapMul()) 00327 return; 00328 ((selem_t *)flagPtr)[pos] &= value; 00329 } 00330 00336 void 00337 orWorldFlags(UInt32 pos, selem_t value) 00338 { 00339 if (pos > MapMul()) 00340 return; 00341 ((selem_t *)flagPtr)[pos] |= value; 00342 } 00343 00350 void 00351 getWorldAndFlag(UInt32 pos, welem_t *world, selem_t *flag) 00352 { 00353 if (pos > MapMul()) 00354 return; 00355 *world = ((welem_t *)worldPtr)[pos]; 00356 *flag = ((selem_t *)flagPtr)[pos]; 00357 } 00358 00362 void 00363 PurgeWorld(void) 00364 { 00365 ReleaseZone(lz_world); 00366 ReleaseZone(lz_flags); 00367 } 00368 00377 UInt32 00378 scaleNumber(UInt32 old_value, Char *scale) 00379 { 00380 const char si_scale[] = " KMBTQ"; 00381 const char *at_scale = si_scale; 00382 while (old_value > MILLION) { 00383 at_scale++; 00384 old_value /= 1000; 00385 } 00386 *scale = *at_scale; 00387 return (old_value); 00388 } 00389 00397 void 00398 setGameBit(gamestatusbit_t bit, UInt8 value) 00399 { 00400 GG.gas_bits &= (~bit & 0xff); 00401 if (value) GG.gas_bits |= bit; 00402 } 00403 00409 UInt8 00410 getGameBit(gamestatusbit_t bit) 00411 { 00412 return (GG.gas_bits & bit); 00413 }