00001
00002
00003
00004
00005
00006
00007
00008
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 }