btmux/autom4te.cache/
btmux/doc/.svn/
btmux/event/.svn/
btmux/game/.svn/
btmux/game/bin/.svn/
btmux/game/data/.svn/
btmux/game/logs/.svn/
btmux/game/maps/
btmux/game/maps/.svn/
btmux/game/maps/.svn/prop-base/
btmux/game/maps/.svn/props/
btmux/game/maps/.svn/text-base/
btmux/game/maps/.svn/wcprops/
btmux/game/mechs/
btmux/game/mechs/.svn/
btmux/game/mechs/.svn/prop-base/
btmux/game/mechs/.svn/props/
btmux/game/mechs/.svn/text-base/
btmux/game/mechs/.svn/wcprops/
btmux/game/text/.svn/
btmux/include/.svn/
btmux/misc/
btmux/misc/.svn/
btmux/misc/.svn/prop-base/
btmux/misc/.svn/props/
btmux/misc/.svn/text-base/
btmux/misc/.svn/wcprops/
btmux/python/
btmux/python/.svn/
btmux/python/.svn/prop-base/
btmux/python/.svn/props/
btmux/python/.svn/text-base/
btmux/python/.svn/wcprops/
btmux/src/.svn/prop-base/
btmux/src/.svn/props/
btmux/src/.svn/text-base/
btmux/src/.svn/wcprops/
btmux/src/hcode/.svn/
btmux/src/hcode/btech/
btmux/src/hcode/btech/.svn/
btmux/src/hcode/btech/.svn/prop-base/
btmux/src/hcode/btech/.svn/props/
btmux/src/hcode/btech/.svn/text-base/
btmux/src/hcode/btech/.svn/wcprops/
btmux/src/hcode/include/.svn/
/*
 * $Id: map.weather.c,v 1.1.1.1 2005/01/11 21:18:10 kstevens Exp $
 *
 * Author: Cord Awtry <kipsta@bs-interactive.com>
 *
 *  Copyright (c) 2002 Cord Awtry
 *       All rights reserved
 */

#include "mech.h"
#include "p.mech.utils.h"
#include "p.mech.ice.h"
#include "p.map.build.functions.h"

int validateWeatherConditions(int curConditions)
{
    int conditions = curConditions;

    if (conditions & WEATHER_PRECIP) {
	if (conditions & WEATHER_HEAVY_PRECIP)
	    conditions &= ~WEATHER_PRECIP;
    }

    return conditions;
}

int calcWeatherEffects(MAP * map)
{
    int effects = 0;
    int weather = map->weather;
    char temp = map->temp;
    short windspeed = map->windspeed;

    if (windspeed > 60)
	effects = EFFECT_HIGH_WINDS;
    else if (windspeed >= 30)
	effects = EFFECT_WINDS;

    if (weather & WEATHER_HEAVY_PRECIP) {
	if (temp <= 0) {
	    if (effects & EFFECT_HIGH_WINDS) {
		effects &= ~EFFECT_HIGH_WINDS;
		effects |= EFFECT_BLIZZARD;
	    } else
		effects |= EFFECT_HEAVY_SNOW;
	} else
	    effects |= EFFECT_HEAVY_RAIN;
    } else if (weather & WEATHER_PRECIP) {
	if (temp <= 0)
	    effects |= EFFECT_SNOW;
	else
	    effects |= EFFECT_RAIN;
    }

    if (weather & WEATHER_FOG)
	effects |= EFFECT_FOG;

    if (weather & WEATHER_BLOWING_SAND)
	effects |= EFFECT_BLOWING_SAND;

    return effects;
}

int calcWeatherGunEffects(MAP * map, int weapindx)
{
    int gunMods = 0;
    int weapType = MechWeapons[weapindx].type;

    if (MapEffectRain(map)) {
	gunMods += 1;
    } else if (MapEffectRain(map)) {
	gunMods += 1;
    }

    if (MapEffectBlizzard(map)) {
	gunMods += ((weapType == TAMMO) ? 2 : 1);
    } else if (MapEffectHvySnow(map)) {
	gunMods += 1;
    }

    if (MapEffectFog(map)) {
	gunMods += ((weapType == TBEAM) ? 1 : 0);
    }

    if (MapEffectSand(map)) {
	gunMods += ((weapType == TAMMO) ? 1 : 2);
    }

    if (MapEffectHighWinds(map) & !MapEffectBlizzard(map)) {
	gunMods += ((weapType == TAMMO) ? 2 : 0);
    }

    if (MapEffectWinds(map)) {
	gunMods += ((weapType == TAMMO) ? 1 : 0);
    }

    return gunMods;
}

int calcWeatherPilotEffects(MECH * mech)
{
    MAP *map = FindObjectsData(mech->mapindex);
    int onTheGround = 1;
    int mod = 0;

    if (!map)
	return 0;

    onTheGround = (!Jumping(mech) &&
	(MechZ(mech) <= Elevation(map, MechX(mech), MechY(mech))));

    if (onTheGround) {
	if ((MapEffectHvyRain(map) || MapEffectHvySnow(map) ||
		MapEffectHighWinds(map) || MapEffectBlizzard(map)))
	    mod += 1;

	if (MechMove(mech) != MOVE_HOVER) {
	    if (HexHasDeepSnow(map, MechX(mech), MechY(mech)))
		mod += 1;

	    if (HexHasMud(map, MechX(mech), MechY(mech)))
		mod += 1;

	    if (HexHasRapids(map, MechX(mech), MechY(mech)))
		mod += 2;
	}

	return mod;
    }

    return 0;
}

void setWeatherHeatEffects(MAP * map, MECH * mech)
{
    if (MapEffectHvyRain(map))
	MechMinusHeat(mech) -= 2.;
    else if (MapEffectRain(map))
	MechMinusHeat(mech) -= 1.;

    if (MapEffectBlizzard(map))
	MechMinusHeat(mech) -= 2.;
    else if (MapEffectHvySnow(map))
	MechMinusHeat(mech) -= 1.;

    if (MapTemperature(map) < -30 || MapTemperature(map) > 50) {
	if (MapTemperature(map) < -30)
	    MechMinusHeat(mech) += (-30 - MapTemperature(map) + 9) / 10;
	else
	    MechMinusHeat(mech) -= (MapTemperature(map) - 50 + 9) / 10;
    }

    if (HexHasDeepSnow(map, MechX(mech), MechY(mech))) {
	if (FindLegHeatSinks(mech) > 0)
	    MechMinusHeat(mech) -= 1.;
    }
}

void meltSnowAndIce(MAP * map, int x, int y, int depth, int emit,
    int makeSteam)
{
    int data = 0;
    int layers = 0, oldLayers = 0;
    int snowDone = 0;
    int steamLength = 0;

    if (!map)
	return;

    if (depth <= 0)
	return;

    oldLayers = GetHexLayers(map, x, y);
    layers = oldLayers;
    data = GetHexLayerData(map, x, y);

    if ((layers & HEXLAYER_SNOW) || (layers & HEXLAYER_DEEP_SNOW)) {
	data = MAX(0, data - depth);
	steamLength = abs(data - GetHexLayerData(map, x, y));

	if (data == 0)
	    layers &= ~(HEXLAYER_SNOW | HEXLAYER_DEEP_SNOW);
	else if (data <= 1000) {
	    layers |= HEXLAYER_SNOW;
	    layers &= ~HEXLAYER_DEEP_SNOW;
	} else {
	    layers |= HEXLAYER_DEEP_SNOW;
	    layers &= ~HEXLAYER_SNOW;
	}

	SetHexLayers(map, x, y, layers);
	SetHexLayerData(map, x, y, data);

	if (emit) {
	    if (layers & HEXLAYER_DEEP_SNOW)
		snowDone = 1;

	    if (!snowDone && !((layers & HEXLAYER_SNOW) ||
		    (layers & HEXLAYER_DEEP_SNOW))) {
		HexLOSBroadcast(map, x, y,
		    "%ch%cgThe snow in $h melts to nothingness!%cn");
		snowDone = 1;
	    }

	    if (!snowDone && ((oldLayers & HEXLAYER_DEEP_SNOW) &&
		    (!(layers & HEXLAYER_DEEP_SNOW)))) {
		HexLOSBroadcast(map, x, y,
		    "%ch%cgThe snow in $h visibly melts!%cn");
		snowDone = 1;
	    }
	}
    }

    if (IsIceHex(map, x, y)) {
	if (depth >= (Elevation(map, x, y) * 200)) {
	    if (emit)
		HexLOSBroadcast(map, x, y, "The ice at $h breaks apart!");

	    breakIceAndSplashUnits(map, NULL, x, y,
		"goes swimming as ice breaks!");
	    steamLength = (Elevation(map, x, y) * 200);
	}
    }

    if ((steamLength > 0) && makeSteam) {
	if (steamLength > 90)
	    steamLength = 90 + Number(0, steamLength / 20);

	add_decoration(map, x, y, TYPE_SMOKE, SMOKE, steamLength);
    }
}

void growSnow(MAP * map, int lowDepth, int highDepth)
{
    int i, j;
    char terrain;
    int layer, layerData;
    int depth = 0;
    int sign = 1;
    int low, high;

    if ((lowDepth == 0) && (highDepth == 0))
	return;

    low = MIN(abs(lowDepth), abs(highDepth));
    high = MAX(abs(lowDepth), abs(highDepth));

    if ((lowDepth < 0) || (highDepth < 0))
	sign = -1;

    for (i = 0; i < map->map_width; i++) {
	for (j = 0; j < map->map_height; j++) {
	    terrain = GetHexTerrain(map, i, j);

	    switch (terrain) {
	    case BRIDGE:
	    case FIRE:
	    case WATER:
	    case ICE:
		continue;
		break;
	    }

	    depth = Number(low, high) * sign;

	    if (depth == 0)
		continue;

	    layerData = GetHexLayerData(map, i, j);

	    if (depth < 0) {
		if (!(HexHasSnow(map, i, j) || HexHasDeepSnow(map, i, j)))
		    continue;
	    } else {
		if (!(HexHasSnow(map, i, j) && HexHasDeepSnow(map, i, j)))
		    SetHexLayers(map, i, j, HEXLAYER_SNOW);
	    }

	    SetHexLayerData(map, i, j, (layerData + depth));
	    validateSnowDepth(map, i, j);
	}
    }

}