src/hcode/btech/map.weather.c

Go to the documentation of this file.
00001 
00002 /*
00003  * $Id: map.weather.c,v 1.1.1.1 2005/01/11 21:18:10 kstevens Exp $
00004  *
00005  * Author: Cord Awtry <kipsta@bs-interactive.com>
00006  *
00007  *  Copyright (c) 2002 Cord Awtry
00008  *       All rights reserved
00009  */
00010 
00011 #include "mech.h"
00012 #include "p.mech.utils.h"
00013 #include "p.mech.ice.h"
00014 #include "p.map.build.functions.h"
00015 
00016 int validateWeatherConditions(int curConditions)
00017 {
00018         int conditions = curConditions;
00019 
00020         if(conditions & WEATHER_PRECIP) {
00021                 if(conditions & WEATHER_HEAVY_PRECIP)
00022                         conditions &= ~WEATHER_PRECIP;
00023         }
00024 
00025         return conditions;
00026 }
00027 
00028 int calcWeatherEffects(MAP * map)
00029 {
00030         int effects = 0;
00031         int weather = map->weather;
00032         char temp = map->temp;
00033         short windspeed = map->windspeed;
00034 
00035         if(windspeed > 60)
00036                 effects = EFFECT_HIGH_WINDS;
00037         else if(windspeed >= 30)
00038                 effects = EFFECT_WINDS;
00039 
00040         if(weather & WEATHER_HEAVY_PRECIP) {
00041                 if(temp <= 0) {
00042                         if(effects & EFFECT_HIGH_WINDS) {
00043                                 effects &= ~EFFECT_HIGH_WINDS;
00044                                 effects |= EFFECT_BLIZZARD;
00045                         } else
00046                                 effects |= EFFECT_HEAVY_SNOW;
00047                 } else
00048                         effects |= EFFECT_HEAVY_RAIN;
00049         } else if(weather & WEATHER_PRECIP) {
00050                 if(temp <= 0)
00051                         effects |= EFFECT_SNOW;
00052                 else
00053                         effects |= EFFECT_RAIN;
00054         }
00055 
00056         if(weather & WEATHER_FOG)
00057                 effects |= EFFECT_FOG;
00058 
00059         if(weather & WEATHER_BLOWING_SAND)
00060                 effects |= EFFECT_BLOWING_SAND;
00061 
00062         return effects;
00063 }
00064 
00065 int calcWeatherGunEffects(MAP * map, int weapindx)
00066 {
00067         int gunMods = 0;
00068         int weapType = MechWeapons[weapindx].type;
00069 
00070         if(MapEffectRain(map)) {
00071                 gunMods += 1;
00072         } else if(MapEffectRain(map)) {
00073                 gunMods += 1;
00074         }
00075 
00076         if(MapEffectBlizzard(map)) {
00077                 gunMods += ((weapType == TAMMO) ? 2 : 1);
00078         } else if(MapEffectHvySnow(map)) {
00079                 gunMods += 1;
00080         }
00081 
00082         if(MapEffectFog(map)) {
00083                 gunMods += ((weapType == TBEAM) ? 1 : 0);
00084         }
00085 
00086         if(MapEffectSand(map)) {
00087                 gunMods += ((weapType == TAMMO) ? 1 : 2);
00088         }
00089 
00090         if(MapEffectHighWinds(map) & !MapEffectBlizzard(map)) {
00091                 gunMods += ((weapType == TAMMO) ? 2 : 0);
00092         }
00093 
00094         if(MapEffectWinds(map)) {
00095                 gunMods += ((weapType == TAMMO) ? 1 : 0);
00096         }
00097 
00098         return gunMods;
00099 }
00100 
00101 int calcWeatherPilotEffects(MECH * mech)
00102 {
00103         MAP *map = FindObjectsData(mech->mapindex);
00104         int onTheGround = 1;
00105         int mod = 0;
00106 
00107         if(!map)
00108                 return 0;
00109 
00110         onTheGround = (!Jumping(mech) &&
00111                                    (MechZ(mech) <= Elevation(map, MechX(mech), MechY(mech))));
00112 
00113         if(onTheGround) {
00114                 if((MapEffectHvyRain(map) || MapEffectHvySnow(map) ||
00115                         MapEffectHighWinds(map) || MapEffectBlizzard(map)))
00116                         mod += 1;
00117 
00118                 if(MechMove(mech) != MOVE_HOVER) {
00119                         if(HexHasDeepSnow(map, MechX(mech), MechY(mech)))
00120                                 mod += 1;
00121 
00122                         if(HexHasMud(map, MechX(mech), MechY(mech)))
00123                                 mod += 1;
00124 
00125                         if(HexHasRapids(map, MechX(mech), MechY(mech)))
00126                                 mod += 2;
00127                 }
00128 
00129                 return mod;
00130         }
00131 
00132         return 0;
00133 }
00134 
00135 void setWeatherHeatEffects(MAP * map, MECH * mech)
00136 {
00137         if(MapEffectHvyRain(map))
00138                 MechMinusHeat(mech) -= 2.;
00139         else if(MapEffectRain(map))
00140                 MechMinusHeat(mech) -= 1.;
00141 
00142         if(MapEffectBlizzard(map))
00143                 MechMinusHeat(mech) -= 2.;
00144         else if(MapEffectHvySnow(map))
00145                 MechMinusHeat(mech) -= 1.;
00146 
00147         if(MapTemperature(map) < -30 || MapTemperature(map) > 50) {
00148                 if(MapTemperature(map) < -30)
00149                         MechMinusHeat(mech) += (-30 - MapTemperature(map) + 9) / 10;
00150                 else
00151                         MechMinusHeat(mech) -= (MapTemperature(map) - 50 + 9) / 10;
00152         }
00153 
00154         if(HexHasDeepSnow(map, MechX(mech), MechY(mech))) {
00155                 if(FindLegHeatSinks(mech) > 0)
00156                         MechMinusHeat(mech) -= 1.;
00157         }
00158 }
00159 
00160 void meltSnowAndIce(MAP * map, int x, int y, int depth, int emit,
00161                                         int makeSteam)
00162 {
00163         int data = 0;
00164         int layers = 0, oldLayers = 0;
00165         int snowDone = 0;
00166         int steamLength = 0;
00167 
00168         if(!map)
00169                 return;
00170 
00171         if(depth <= 0)
00172                 return;
00173 
00174         oldLayers = GetHexLayers(map, x, y);
00175         layers = oldLayers;
00176         data = GetHexLayerData(map, x, y);
00177 
00178         if((layers & HEXLAYER_SNOW) || (layers & HEXLAYER_DEEP_SNOW)) {
00179                 data = MAX(0, data - depth);
00180                 steamLength = abs(data - GetHexLayerData(map, x, y));
00181 
00182                 if(data == 0)
00183                         layers &= ~(HEXLAYER_SNOW | HEXLAYER_DEEP_SNOW);
00184                 else if(data <= 1000) {
00185                         layers |= HEXLAYER_SNOW;
00186                         layers &= ~HEXLAYER_DEEP_SNOW;
00187                 } else {
00188                         layers |= HEXLAYER_DEEP_SNOW;
00189                         layers &= ~HEXLAYER_SNOW;
00190                 }
00191 
00192                 SetHexLayers(map, x, y, layers);
00193                 SetHexLayerData(map, x, y, data);
00194 
00195                 if(emit) {
00196                         if(layers & HEXLAYER_DEEP_SNOW)
00197                                 snowDone = 1;
00198 
00199                         if(!snowDone && !((layers & HEXLAYER_SNOW) ||
00200                                                           (layers & HEXLAYER_DEEP_SNOW))) {
00201                                 HexLOSBroadcast(map, x, y,
00202                                                                 "%ch%cgThe snow in $h melts to nothingness!%cn");
00203                                 snowDone = 1;
00204                         }
00205 
00206                         if(!snowDone && ((oldLayers & HEXLAYER_DEEP_SNOW) &&
00207                                                          (!(layers & HEXLAYER_DEEP_SNOW)))) {
00208                                 HexLOSBroadcast(map, x, y,
00209                                                                 "%ch%cgThe snow in $h visibly melts!%cn");
00210                                 snowDone = 1;
00211                         }
00212                 }
00213         }
00214 
00215         if(IsIceHex(map, x, y)) {
00216                 if(depth >= (Elevation(map, x, y) * 200)) {
00217                         if(emit)
00218                                 HexLOSBroadcast(map, x, y, "The ice at $h breaks apart!");
00219 
00220                         breakIceAndSplashUnits(map, NULL, x, y,
00221                                                                    "goes swimming as ice breaks!");
00222                         steamLength = (Elevation(map, x, y) * 200);
00223                 }
00224         }
00225 
00226         if((steamLength > 0) && makeSteam) {
00227                 if(steamLength > 90)
00228                         steamLength = 90 + Number(0, steamLength / 20);
00229 
00230                 add_decoration(map, x, y, TYPE_SMOKE, SMOKE, steamLength);
00231         }
00232 }
00233 
00234 void growSnow(MAP * map, int lowDepth, int highDepth)
00235 {
00236         int i, j;
00237         char terrain;
00238         int layer, layerData;
00239         int depth = 0;
00240         int sign = 1;
00241         int low, high;
00242 
00243         if((lowDepth == 0) && (highDepth == 0))
00244                 return;
00245 
00246         low = MIN(abs(lowDepth), abs(highDepth));
00247         high = MAX(abs(lowDepth), abs(highDepth));
00248 
00249         if((lowDepth < 0) || (highDepth < 0))
00250                 sign = -1;
00251 
00252         for(i = 0; i < map->map_width; i++) {
00253                 for(j = 0; j < map->map_height; j++) {
00254                         terrain = GetHexTerrain(map, i, j);
00255 
00256                         switch (terrain) {
00257                         case BRIDGE:
00258                         case FIRE:
00259                         case WATER:
00260                         case ICE:
00261                                 continue;
00262                                 break;
00263                         }
00264 
00265                         depth = Number(low, high) * sign;
00266 
00267                         if(depth == 0)
00268                                 continue;
00269 
00270                         layerData = GetHexLayerData(map, i, j);
00271 
00272                         if(depth < 0) {
00273                                 if(!(HexHasSnow(map, i, j) || HexHasDeepSnow(map, i, j)))
00274                                         continue;
00275                         } else {
00276                                 if(!(HexHasSnow(map, i, j) && HexHasDeepSnow(map, i, j)))
00277                                         SetHexLayers(map, i, j, HEXLAYER_SNOW);
00278                         }
00279 
00280                         SetHexLayerData(map, i, j, (layerData + depth));
00281                         validateSnowDepth(map, i, j);
00282                 }
00283         }
00284 
00285 }

Generated on Mon May 28 04:25:21 2007 for BattletechMUX by  doxygen 1.4.7