/**************************************************************************** * ___________.__ .__ * * \_ _____/| | ___.__. _____|__|__ __ _____ * * | __)_ | |< | |/ ___/ | | \/ \ * * | \| |_\___ |\___ \| | | / Y Y \ * * /_______ /|____/ ____/____ >__|____/|__|_| / * * \/ \/ \/ Engine \/ * * A SMAUG Derived Game Engine. * * ------------------------------------------------------------------------ * * Elysium Engine Copyright 1999-2010 by Steven Loar * * Elysium Engine Development Team: Kayle (Steven Loar), Katiara, Scoyn, * * and Mikon. * * ------------------------------------------------------------------------ * * [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame * * SMAUG 1.4 (C) 1994, 1995, 1996, 1998 by Derek Snider * * SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus, Scryn, Rennard, * * Swordbearer, Gorog, Grishnakh, Nivek, Tricops and Fireblade * * ------------------------------------------------------------------------ * * Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * ------------------------------------------------------------------------ * * Weather System Header * **************************************************************************** * Base Weather Model Copyright (c) 2007 Chris Jacobson * ****************************************************************************/ #include <string.h> #include <stdio.h> #include "h/mud.h" #include "h/key.h" #include "h/files.h" const char *const hemisphere_name[] = { "northern", "southern" }; const char *const climate_names[] = { "rainforest", "savanna", "desert", "steppe", "chapparal", "grasslands", "deciduous_forest", "taiga", "tundra", "alpine", "arctic" }; int get_hemisphere(char *type) { unsigned int x; for(x = 0; x < (sizeof(hemisphere_name) / sizeof(hemisphere_name[0])); x++) if(!str_cmp(type, hemisphere_name[x])) return x; return -1; } int get_climate(char *type) { unsigned int x; for(x = 0; x < (sizeof(climate_names) / sizeof(climate_names[0])); x++) if(!str_cmp(type, climate_names[x])) return x; return -1; } struct WeatherCell { int climate; // Climate flag for the cell int hemisphere; // Hemisphere flag for the cell int temperature; // Fahrenheit because I'm // American, by god int pressure; // 0..100 for now, later change to // // // // // // // // // barometric pressures int cloudcover; // 0..100, amount of clouds in the // // // // // // // // // sky int humidity; // 0+ int precipitation; // 0..100 int energy; // 0..100 Storm Energy, chance of // storm. /* * Instead of a wind direction we use an X/Y speed * It makes the math below much simpler this way. * Its not hard to determine a basic cardinal direction from this * If you want to, a good rule of thumb is that if one directional * speed is more than double that of the other, ignore it; that is * if you have speed X = 15 and speed Y = 3, the wind is obviously * to the east. If X = 15 and Y = 10, then its a south-east wind. */ int windSpeedX; // < 0 = west, > 0 = east int windSpeedY; // < 0 = north, > 0 = south }; /* * This is the Weather Map. It is a grid of cells representing X-mile square * areas of weather */ struct WeatherCell weatherMap[WEATHER_SIZE_X][WEATHER_SIZE_Y]; /* * This is the Weather Delta Map. It is used to accumulate changes to be * applied to the Weather Map. Why accumulate changes then apply them, rather * than just change the Weather Map as we go? * Because doing that can mean a change just made to a neighbor can * immediately cause ANOTHER change to a neighbor, causing things * to get out of control or causing cascading weather, propagating much * faster and unpredictably (in a BAD unpredictable way) * Instead, we determine all the changes that should occur based on the current * 'snapshot' of weather, than apply them all at once! */ struct WeatherCell weatherDelta[WEATHER_SIZE_X][WEATHER_SIZE_Y]; // Set everything up with random non-equal values to prevent equalibrium void InitializeWeatherMap(void) { int x, y; for(y = 0; y < WEATHER_SIZE_Y; y++) { for(x = 0; x < WEATHER_SIZE_X; x++) { struct WeatherCell *cell = &weatherMap[x][y]; cell->climate = number_range(0, 10); cell->hemisphere = number_range(0, 1); cell->temperature = number_range(-30, 100); cell->pressure = number_range(0, 100); cell->cloudcover = number_range(0, 100); cell->humidity = number_range(0, 100); cell->precipitation = number_range(0, 100); cell->windSpeedX = number_range(-100, 100); cell->windSpeedY = number_range(-100, 100); cell->energy = number_range(0, 100); } } } //Used to determine whether a field exceeds a certain number, see Weather messages for examples bool ExceedsThreshold(int initial, int delta, int threshold) { return ((initial < threshold) && (initial + delta >= threshold)); } //Used to determin whether a field drops below a certain point, see Weather messages for examples. bool DropsBelowThreshold(int initial, int delta, int threshold) { return ((initial >= threshold) && (initial + delta < threshold)); } //Send a message to a player in the area, assuming they are outside, and awake. void WeatherMessage(const char *txt, int x, int y) { AREA_DATA *pArea; DESCRIPTOR_DATA *d = NULL; for(pArea = first_area; pArea; pArea = pArea->next) { if(pArea->weatherx == x && pArea->weathery == y) { for(d = first_descriptor; d; d = d->next) { if(d->connected == CON_PLAYING) { if(d->character && (d->character->in_room->area == pArea) && IS_OUTSIDE(d->character) && !NO_WEATHER_SECT(d->character->in_room->sector_type) && IS_AWAKE(d->character) && !IS_BLIND(d->character)) send_to_char(txt, d->character); } } } } } // This is where we apply all the functions and determine what message to send. void ApplyDeltaChanges(void) { int x, y; for(y = 0; y < WEATHER_SIZE_Y; y++) { for(x = 0; x < WEATHER_SIZE_X; x++) { struct WeatherCell *cell = &weatherMap[x][y]; struct WeatherCell *delta = &weatherDelta[x][y]; if(isTorrentialDownpour(getPrecip(cell))) { if(DropsBelowThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&WThe rain turns to snow as it continues to come down blizzard-like.&D\r\n", x, y); else if(ExceedsThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&BThe blizzard turns to a cold rain as it continues to come in a torrential downpour.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 91)) if(isStormy(getEnergy(cell))) WeatherMessage("&BThe rain begins to increase in intensity falling heavily and quickly.&D\r\n&YThunder and lightning shake the ground and light up the sky.&D\r\n", x, y); else WeatherMessage("&BThe rain begins to increase in intensity falling heavily and quickly.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 91) && DropsBelowThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&WThe rain changes over to snow as the intensity increases, making a blinding white wall.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 91) && cell->temperature <= 32) WeatherMessage("&WThe heavy snow increases and freezes creating a blizzard.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 91) && ExceedsThreshold(cell->temperature, delta->temperature, 32)) if(isStormy(getEnergy(cell))) WeatherMessage("&BThe snow changes over to rain as it pounds down heavier.&D\r\n&YThunder and lightning begin to shake the gound and light up the sky.&D\r\n", x, y); else WeatherMessage("&BThe snow changes over to rain as it pounds down heavier.&D\r\n", x, y); else if(cell->temperature <= 32) WeatherMessage("&WThe snow falls down fast and steady creating a blizzard.&D\r\n", x, y); else if(isStormy(getEnergy(cell))) WeatherMessage("&BThe rain continues to pound the earth in a downpour.&D\r\n&YThunder and lightning boom and crackle and light up the sky.&D\r\n", x, y); else WeatherMessage("&BThe rain continues to pound the earth in a downpour.&D\r\n", x, y); } else if(isRainingCatsAndDogs(getPrecip(cell))) { if(DropsBelowThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&WThe heavy rain turns into a heavy snow.&D\r\n", x, y); else if(ExceedsThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&BThe heavy snow turns into a heavy rain.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 90)) if(isStormy(getEnergy(cell))) WeatherMessage("&BThe heavy, fierce rain eases a bit, but continues to drum down.&D\r\n&YThunder and lightling light up the sky and shake the earth.&D\r\n", x, y); else WeatherMessage("&BThe heavy, fierce rain eases a bit, but still continues to drum down.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 90) && DropsBelowThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&WAs the heavy, fierce rain lessens a bit, it changes over to a steady snow.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 90) && ExceedsThreshold(cell->temperature, delta->temperature, 32)) if(isStormy(getEnergy(cell))) WeatherMessage("&BThe snow lessens and changes to a heavy rain.&D\r\n&YThunder and lightning begin to shake the ground and light up the sky.&D\r\n", x, y); else WeatherMessage("&BThe snow lessens and changes to a heavy rain.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 90) && cell->temperature <= 32) WeatherMessage("&WThe intense snow lessens a little.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 80)) if(isStormy(getEnergy(cell))) WeatherMessage("&BThe rain increases in intensity.&D\r\n&YThunder and lightning begin to shake the ground and light up the sky.&D\r\n", x, y); else WeatherMessage("&BThe rain increases in intensity.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 80) && DropsBelowThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&WThe rain changes over to snow and begins to come down even harder.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 80) && cell->temperature <= 32) WeatherMessage("&WThe snows falls harder creating a wall of white.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 80) && ExceedsThreshold(cell->temperature, delta->temperature, 32)) if(isStormy(getEnergy(cell))) WeatherMessage("&BThe snow increases in intensity a bit and changes over to a heavy rain.&D\r\n&YThunder and lightning begin to shake the ground and light up the sky.&D\r\n", x, y); else WeatherMessage("&BThe snow increases in intensity a bit and changes over to a heavy rain.&D\r\n", x, y); else if(cell->temperature <= 32) WeatherMessage("&WThe snow comes down heavy creating a wall of white.&D\r\n", x, y); else if(isStormy(getEnergy(cell))) WeatherMessage("&BThe rain comes down in big, heavy droplets.&D\r\n&YThunder and lightning boom, crackle and light up the sky.&D\r\n", x, y); else WeatherMessage("&BThe rain comes down in big, heavy droplets.&D\r\n", x, y); } else if(isPouring(getPrecip(cell))) { if(DropsBelowThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&WThe intense rain changes over to a heavy snow.&D\r\n", x, y); else if(ExceedsThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&BThe heavy snow changes over to a pouring rain.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 80)) if(isStormy(getEnergy(cell))) WeatherMessage("&BThe heavy rain lessens a little.&D\r\n&YThunder and lightning boom, crackle, and light up the sky.&D\r\n", x, y); else WeatherMessage("&BThe heavy rain lessens but still continues to pour down.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 80) && DropsBelowThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&WThe rain lessens and turns to a heavy snow.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 80) && ExceedsThreshold(cell->temperature, delta->temperature, 32)) if(isStormy(getEnergy(cell))) WeatherMessage("&BThe wall of snow lessens as it turns to a pouring rain.&D\r\n", x, y); else WeatherMessage("&BThe wall of snow lessens as it turns to a pouring rain.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 80) && cell->temperature <= 32) WeatherMessage("&WThe intense snowfall lessens and continues coming down heavily.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 70)) if(isStormy(getEnergy(cell))) WeatherMessage("&BThe rain begins to pound down hard into a pouring rain.&D\r\n&YLightning flashes in the sky, accompanied shortly by booming thunder.&D\r\n", x, y); else WeatherMessage("&BThe steady rain begins to come down harder.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 70) && DropsBelowThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&WThe heavy rain increases in intensity and changes over to snow.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 70) && cell->temperature <= 32) WeatherMessage("&The snow begins to fall more heavily and coat the ground quickly.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 70) && ExceedsThreshold(cell->temperature, delta->temperature, 32)) if(isStormy(getEnergy(cell))) WeatherMessage("&BThe heavy snow changes over to rain and begins to pour down.&D\r\n&YLightning and thunder begin to light up the sky and shake the ground.&D\r\n", x, y); else WeatherMessage("&BThe heavy snow changes over to rain and begins to pour down.&D\r\n", x, y); else if(cell->temperature <= 32) WeatherMessage("&WThe snow comes down heavily.&D\r\n", x, y); else if(isStormy(getEnergy(cell))) WeatherMessage("&BThe rain pours down on the ground.&D\r\n&YLightning and thunder light up the sky and shake the ground.&D\r\n", x, y); else WeatherMessage("&BThe rain pours down on the ground.&D\r\n", x, y); } else if(isRaingingHeavily(getPrecip(cell))) { if(DropsBelowThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&WThe heavy rain changes over to a heavy snow.&D\r\n", x, y); else if(ExceedsThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&BThe steady snow changes over to a heavy rain.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 70)) if(isStormy(getEnergy(cell))) WeatherMessage("&BThe pouring rain lessens a little.&D\r\n&YLightning and thunder begin to light up the sky and shake the ground.&D\r\n", x, y); else WeatherMessage("&BThe pouring rain lessens a little.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 70) && DropsBelowThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&WThe pouring rain lessens but changes over to a steady snow.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 70) && ExceedsThreshold(cell->temperature, delta->temperature, 32)) if(isStormy(getEnergy(cell))) WeatherMessage("&BThe heavy snow changes over to a heavy rain.&D\r\n&YThunder cracks, and lightning flashes in the sky.&D\r\n", x, y); else WeatherMessage("&BThe heavy snow lessens a bit and changes over to a steady rain.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 70) && cell->temperature <= 32) WeatherMessage("&WThe heavy snow lessens a bit to a steady snow.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 60)) if(isStormy(getEnergy(cell))) WeatherMessage("&BThe pouring rain increases in intensity. Lightning and thunder begin to light up the sky and shake the ground.&D\r\n", x, y); else WeatherMessage("&BThe pouring rain begins to come down harder pounding the ground.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 60) && DropsBelowThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&WThe pouring rain begins to increase in intensity and change over to a heavy snow.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 60) && cell->temperature <= 32) WeatherMessage("&WThe heavy snow increases in intensity creating a blanket of white on the ground.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 60) && ExceedsThreshold(cell->temperature, delta->temperature, 32)) if(isStormy(getEnergy(cell))) WeatherMessage("&BThe steady snow changes over to an increasingly heavier rain.&D\r\n&YThunder and lightning shake the ground and light up the sky.&D\r\n", x, y); else WeatherMessage("&BThe steady snow changes over to an increasingly heavier rain.&D\r\n", x, y); else if(cell->temperature <= 32) WeatherMessage("&WSnow falls down heavily to the ground.&D\r\n", x, y); else if(isStormy(getEnergy(cell))) WeatherMessage("&BRain falls down heavily to the ground.&D\r\n&YThunder and lightning shake the ground and light up the sky.&D\r\n", x, y); else WeatherMessage("&BRain falls down heavily to the ground.&D\r\n", x, y); } else if(isDownpour(getPrecip(cell))) { if(DropsBelowThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&WThe pouring rain changes over to a thick snow.&D\r\n", x, y); else if(ExceedsThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&BThe steady snow changes over to rain and lessens a bit.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 60)) if(isStormy(getEnergy(cell))) WeatherMessage("&BThe heavy rain lessens a bit.&D\r\n&YThunder and lightning shake the ground and light up the sky.&D\r\n", x, y); else WeatherMessage("&BThe heavy rain lessens a bit.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 60) && DropsBelowThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&BThe heavy rain lessens a bit and changes over to snow covering the ground in a blanket of white.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 60) && ExceedsThreshold(cell->temperature, delta->temperature, 32)) if(isStormy(getEnergy(cell))) WeatherMessage("&BThe heavy snow lessens a bit as it changes over to a steady rain.&D\r\n&YLightning and thunder crackle, rattle, and light up the sky.&D\r\n", x, y); else WeatherMessage("&BThe heavy snow lessens a bit as it changes over to a steady rain.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 60) && cell->temperature <= 32) WeatherMessage("&WThe heavy snow eases a bit.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 50)) if(isStormy(getEnergy(cell))) WeatherMessage("&BThe heavy snow eases up a bit as it changes over to a steady rain.&D\r\n&YThunder and lightning shake the ground and light up the sky.&D\r\n", x, y); else WeatherMessage("&BThe heavy snow eases up a bit as it changes over to a steady rain.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 50) && DropsBelowThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&WThe steady rain picks up and changes over to a heavy, steady snow.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 50) && cell->temperature <= 32) WeatherMessage("&WThe steady snow picks up a bit creating a blanket of white on the ground.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 50) && ExceedsThreshold(cell->temperature, delta->temperature, 32)) if(isStormy(getEnergy(cell))) WeatherMessage("&BThe steady snow increases in intensity as it changes over to a pouring rain.&D\r\n&YLightning streaks accross the sky and thunder booms shaking the ground.&D\r\n", x, y); else WeatherMessage("&BThe steady snow increases in intensity as it changes over to a pouring rain.&D\r\n", x, y); else if(cell->temperature <= 32) WeatherMessage("&WSnow falls steadily down.&D\r\n", x, y); else if(isStormy(getEnergy(cell))) WeatherMessage("&BThe rain pours down.&D\r\n&YThunder and lightning shake the ground and light up the sky.&D\r\n", x, y); else WeatherMessage("&BThe rain pours down.&D\r\n", x, y); } else if(isRainingSteadily(getPrecip(cell))) { if(DropsBelowThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&WThe steady rain changes over to a steady snow.&D\r\n", x, y); else if(ExceedsThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&BThe steady snow changes over to a steady rain.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 50)) if(isStormy(getEnergy(cell))) WeatherMessage("&BThe intense rain eases a bit to a steady rain.&D\r\n&YLightning makes the sky glow while thunder booms constantly.&D\r\n", x, y); else WeatherMessage("&BThe intense rain eases a bit to a steady rain.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 50) && DropsBelowThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&WThe pouring rain lessens a bit and changes over to a steady snow.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 50) && ExceedsThreshold(cell->temperature, delta->temperature, 32)) if(isStormy(getEnergy(cell))) WeatherMessage("&BThe blanket of snow lessens a bit as it changes over to a steady rain.&D\r\n&YLightning lights up the sky and thunder shakes the ground.&D\r\n", x, y); else WeatherMessage("&BThe blanket of snow lessens a bit as it changes over to a steady rain.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 50) && cell->temperature <= 32) WeatherMessage("&WThe blanket of snow eases up a bit to a steady snow.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 40)) if(isStormy(getEnergy(cell))) WeatherMessage("&BThe rain picks up in intensity.&D\r\n&YThunder shakes the ground and lightning illuminates the sky.&D\r\n", x, y); else WeatherMessage("&BThe rain picks up in intensity.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 40) && DropsBelowThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&WThe rain picks up and changes over to a steady snow.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 40) && cell->temperature <= 32) WeatherMessage("&WThe snow picks up in intensity.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 40) && ExceedsThreshold(cell->temperature, delta->temperature, 32)) if(isStormy(getEnergy(cell))) WeatherMessage("&BThe snow picks up in intensity as it changes over to a steady rain.&D\r\n&YLightning and thunder illuminate the sky and make the ground shake.&D\r\n", x, y); else WeatherMessage("&BThe snow picks up a bit as it changes over to a steady rain.&D\r\n", x, y); else if(cell->temperature <= 32) WeatherMessage("&WThe snow falls steadily.&D\r\n", x, y); else if(isStormy(getEnergy(cell))) WeatherMessage("&BThe rain falls steadily.&D\r\n&YThunder and lightning shake the ground and light up the sky.&D\r\n", x, y); else WeatherMessage("&BThe rain falls steadily.&D\r\n", x, y); } else if(isRaining(getPrecip(cell))) { if(DropsBelowThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&WThe rain changes over to snow.&D\r\n", x, y); else if(ExceedsThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&BThe snow changes over to rain.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 40)) if(isStormy(getEnergy(cell))) WeatherMessage("&BThe steady rain eases up a bit.&D\r\n&YTightning and thunder illuminate the sky and shake the ground.&D\r\n", x, y); else WeatherMessage("&BThe steady rain eases up a bit.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 40) && DropsBelowThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&WThe steady rain eases a bit as it changes over to snow.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 40) && ExceedsThreshold(cell->temperature, delta->temperature, 32)) if(isStormy(getEnergy(cell))) WeatherMessage("&BThe steady snow eases a bit as it changes over to rain.&D\r\n&YThunder and lightning begin to shake the ground and illuminate the sky.&D\r\n", x, y); else WeatherMessage("&BThe steady snow eases up a bit as it changes over to rain.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 40) && cell->temperature <= 32) WeatherMessage("&WThe steady snow eases up a bit.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 30)) if(isStormy(getEnergy(cell))) WeatherMessage("&BThe light rain picks up a bit.&D\r\n&YLightning illuminates the sky.&D\r\n", x, y); else WeatherMessage("&BThe light rain picks up a bit.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 30) && DropsBelowThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&WThe light rain picks up a bit as it changes over to snow.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 30) && cell->temperature <= 32) WeatherMessage("&WThe light snow picks up a bit.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 30) && ExceedsThreshold(cell->temperature, delta->temperature, 32)) if(isStormy(getEnergy(cell))) WeatherMessage("&BThe light snow increases in intensity as it changes over to rain.&D\r\n&YThunder booms and shakes the ground.&D\r\n", x, y); else WeatherMessage("&BThe light snow increases in intensity as it changes over to rain.&D\r\n", x, y); else if(cell->temperature <= 32) WeatherMessage("&WSnow continues to fall from the sky.&D\r\n", x, y); else if(isStormy(getEnergy(cell))) WeatherMessage("&BRain continues to fall from the sky.&D\r\n&YThunder and lightning boom, crackle, and shake the ground.&D\r\n", x, y); else WeatherMessage("&BRain continues to fall from the sky.&D\r\n", x, y); } else if(isRainingLightly(getPrecip(cell))) { if(DropsBelowThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&WThe light rain changes over to a light snow.&D\r\n", x, y); else if(ExceedsThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&BThe light snow changes over to a light rain.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 30)) WeatherMessage("&BThe rain eases a bit creating a light rain falling.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 30) && DropsBelowThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&WThe rain eases a bit and changes over to a light snow.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 30) && ExceedsThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&BThe snow eases a bit as it changes over to a light rain.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 30) && cell->temperature <= 32) WeatherMessage("The snow eases up a bit to a light snow.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 20)) WeatherMessage("&BThe drizzle picks up a bit to a light rain.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 20) && DropsBelowThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&WThe drizzle picks up a bit and changes over to a light snow.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 20) && cell->temperature <= 32) WeatherMessage("&WThe flurries pick up a bit to a light snow.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 20) && ExceedsThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&BThe flurries pick up a bit and change over to a light rain.&D\r\n", x, y); else if(cell->temperature <= 32) WeatherMessage("&WThe light snow continues to fall gently on the ground.&D\r\n", x, y); else WeatherMessage("&BThe light rain continues to fall gently on the ground.&D\r\n", x, y); } else if(isDrizzling(getPrecip(cell))) { if(DropsBelowThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("WThe drizzle changes over to flurries.&D\r\n", x, y); else if(ExceedsThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&BThe flurries change over to a drizzling rain.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 20)) WeatherMessage("&BThe light rain eases up a bit to just a drizzle.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 20) && DropsBelowThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&WThe light rain eases up a bit and changes over to a few flurries.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 20) && ExceedsThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&BThe light snow eases up a bit and changes over to just a drizzle.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 20) && cell->temperature <= 32) WeatherMessage("&WThe light snow lessens to just a few flurries.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 10)) WeatherMessage("&BThe mist picks up a bit to a drizzling rain.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 10) && DropsBelowThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&WThe mist picks up a bit and changes over to some flurries.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 10) && cell->temperature <= 32) WeatherMessage("&WThe scattered flakes pick up a bit to some flurries.&D\r\n", x, y); else if(ExceedsThreshold(cell->precipitation, delta->precipitation, 10) && ExceedsThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&BThe few scattered flakes pick up and change over to a drizzling rain.&D\r\n", x, y); else if(cell->temperature <= 32) WeatherMessage("&WFlurries of snow fall to the ground.&D\r\n", x, y); else WeatherMessage("&BA light drizzling rain falls to the ground.&D\r\n", x, y); } else if(isMisting(getPrecip(cell))) { if(DropsBelowThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&WThe mist of rain changes over to a few scattered snowflakes.&D\r\n", x, y); else if(ExceedsThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&BThe few scattered snowflakes change over to a misting rain.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 10)) WeatherMessage("&BThe drizzle lessens down to a light mist.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 10) && DropsBelowThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&WThe drizzle lessens and changes over to just a few scattered snowflakes.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 10) && cell->temperature <= 32) WeatherMessage("&WThe flurries of snow lessen to just a few scattered snowflakes.&D\r\n", x, y); else if(DropsBelowThreshold(cell->precipitation, delta->precipitation, 10) && ExceedsThreshold(cell->temperature, delta->temperature, 32)) WeatherMessage("&BThe flurries of snow lessen and change over to a light mist.&D\r\n", x, y); else if(cell->temperature <= 32) WeatherMessage("&WA few scattered snowflakes fall to the ground.&D\r\n", x, y); else WeatherMessage("&BA light mist falls to the ground.&D\r\n", x, y); } else { if(isExtremelyCloudy(getCloudCover(cell))) { if(ExceedsThreshold(cell->cloudcover, delta->cloudcover, 80)) WeatherMessage("&wMore clouds roll in creating a blanket over the sky.&D\r\n", x, y); else WeatherMessage("&wClouds cover the sky like a blanket.&D\r\n", x, y); } else if(isModeratelyCloudy(getCloudCover(cell))) { if(ExceedsThreshold(cell->cloudcover, delta->cloudcover, 60)) WeatherMessage("&wThe sky begins to get more cloudy.&D\r\n", x, y); else if(DropsBelowThreshold(cell->cloudcover, delta->cloudcover, 80)) WeatherMessage("&wSome of the clouds begin to break.&D\r\n", x, y); else WeatherMessage("&wMany clouds cover the sky.&D\r\n", x, y); } else if(isPartlyCloudy(getCloudCover(cell))) { if(ExceedsThreshold(cell->cloudcover, delta->cloudcover, 40)) WeatherMessage("&wMore clouds roll in making it partly cloudy.&D\r\n", x, y); else if(DropsBelowThreshold(cell->cloudcover, delta->cloudcover, 60)) WeatherMessage("&wSome of the clouds move out clearing part of the sky.&D\r\n", x, y); else WeatherMessage("&wClouds cover part of the sky.&D\r\n", x, y); } else if(isCloudy(getCloudCover(cell))) { if(ExceedsThreshold(cell->cloudcover, delta->cloudcover, 20)) WeatherMessage("&wA few clouds begin to roll into the sky.&D\r\n", x, y); else if(DropsBelowThreshold(cell->cloudcover, delta->cloudcover, 40)) WeatherMessage("&wA few of the clouds begin to move out leaving only a few clouds left behind.&D\r\n", x, y); else WeatherMessage("&wA few clouds hover in the sky.&D\r\n", x, y); } else { if(DropsBelowThreshold(cell->cloudcover, delta->cloudcover, 20)) WeatherMessage("&wThe few remaining clouds begin to roll out.&D\r\n", x, y); else if(isSwelteringHeat(getTemp(cell))) { if(ExceedsThreshold(cell->temperature, delta->temperature, 90)) WeatherMessage("&OIt begins to warm up making the already intense heat almost unbearable.&D\r\n", x, y); else WeatherMessage("&OThe heat is almost unbearable.&D\r\n", x, y); } else if(isVeryHot(getTemp(cell))) { if(ExceedsThreshold(cell->temperature, delta->temperature, 80)) WeatherMessage("&OAs the temperature increases, the heat begins to become intense.&D\r\n", x, y); else if(DropsBelowThreshold(cell->temperature, delta->temperature, 90)) WeatherMessage("&OThe unbearable heat eases a bit.&D\r\n", x, y); else WeatherMessage("&OIt is very hot.&D\r\n", x, y); } else if(isHot(getTemp(cell))) { if(ExceedsThreshold(cell->temperature, delta->temperature, 70)) WeatherMessage("&OThe temperature rises making it quite hot.&D\r\n", x, y); else if(DropsBelowThreshold(cell->temperature, delta->temperature, 80)) WeatherMessage("&OThe temperature lessens slightly, making it a little more bearable.&D\r\n", x, y); else WeatherMessage("&OIt is hot.&D\r\n", x, y); } else if(isWarm(getTemp(cell))) { if(ExceedsThreshold(cell->temperature, delta->temperature, 60)) WeatherMessage("&OThe nice temperature heats up a little making it warm.&D\r\n", x, y); else if(DropsBelowThreshold(cell->temperature, delta->temperature, 70)) WeatherMessage("&OThe heat becomes a little less intense making it warm.&D\r\n", x, y); else WeatherMessage("&OIt is a little warm.&D\r\n", x, y); } else if(isTemperate(getTemp(cell))) { if(ExceedsThreshold(cell->temperature, delta->temperature, 50)) WeatherMessage("&OIt warms a little bit taking away the chill and making it nice and pleasant.&D\r\n", x, y); else if(DropsBelowThreshold(cell->temperature, delta->temperature, 60)) WeatherMessage("&OThe heat eases and makes it nice and pleasant.&D\r\n", x, y); else WeatherMessage("&OThe temperature is nice and pleasant.&D\r\n", x, y); } else if(isCool(getTemp(cell))) { if(ExceedsThreshold(cell->temperature, delta->temperature, 40)) WeatherMessage("&CThe chilly air warms up a bit leaving it cool.&D\r\n", x, y); else if(DropsBelowThreshold(cell->temperature, delta->temperature, 50)) WeatherMessage("&CThe temperature drops leaving it a little cool.&D\r\n", x, y); else WeatherMessage("&CThe temperature is cool.&D\r\n", x, y); } else if(isChilly(getTemp(cell))) { if(ExceedsThreshold(cell->temperature, delta->temperature, 30)) WeatherMessage("&CThe temperature rises a little bit but there is still a chill in the air.&D\r\n", x, y); else if(DropsBelowThreshold(cell->temperature, delta->temperature, 40)) WeatherMessage("&CThe temperature drops as the air takes on a chilly feel.&D\r\n", x, y); else WeatherMessage("&CIt is quite chilly.&D\r\n", x, y); } else if(isCold(getTemp(cell))) { if(ExceedsThreshold(cell->temperature, delta->temperature, 20)) WeatherMessage("&CThe frigid temperature warms up a tad making it chilly.&D\r\n", x, y); else if(DropsBelowThreshold(cell->temperature, delta->temperature, 30)) WeatherMessage("&CThe temperature drops making it cold.&D\r\n", x, y); else WeatherMessage("&CIt is cold.&D\r\n", x, y); } else if(isFrosty(getTemp(cell))) { if(ExceedsThreshold(cell->temperature, delta->temperature, 10)) WeatherMessage("&CThe freezing temperature warms up a bit leaving it frigid.&D\r\n", x, y); else if(DropsBelowThreshold(cell->temperature, delta->temperature, 20)) WeatherMessage("&The cold temperature drops making it frigid.&D\r\n", x, y); else WeatherMessage("&CThe temperate is very frigid.&D\r\n", x, y); } else if(isFreezing(getTemp(cell))) { if(ExceedsThreshold(cell->temperature, delta->temperature, 0)) WeatherMessage("&CThe freezing cold begins to warm up slightly.&D\r\n", x, y); else if(DropsBelowThreshold(cell->temperature, delta->temperature, 10)) WeatherMessage("&CThe frigid temperature drops making it freezing.&D\r\n", x, y); else WeatherMessage("&CIt is freezing cold.&D\r\n", x, y); } else if(isReallyCold(getTemp(cell))) { if(DropsBelowThreshold(cell->temperature, delta->temperature, 0)) WeatherMessage("&CThe temperature drops making the freezing cold worse.&D\r\n", x, y); else if(ExceedsThreshold(cell->temperature, delta->temperature, -10)) WeatherMessage("&CThe temperature warms up the very cold air a little.&D\r\n", x, y); else WeatherMessage("&CIt is really cold.&D\r\n", x, y); } else if(isVeryCold(getTemp(cell))) { if(DropsBelowThreshold(cell->temperature, delta->temperature, -10)) WeatherMessage("&CThe temperature drops making it all the more cold.&D\r\n", x, y); else if(ExceedsThreshold(cell->temperature, delta->temperature, -20)) WeatherMessage("&CThe temperature rises making the unbearable cold a little better.&D\r\n", x, y); else WeatherMessage("&CIt is very cold.&D\r\n", x, y); } else if(isExtremelyCold(getTemp(cell))) { if(DropsBelowThreshold(cell->temperature, delta->temperature, -20)) WeatherMessage("&CThe already very cold temperature drops making it unbearable.&D\r\n", x, y); else WeatherMessage("&CIt is unbearablly cold.&D\r\n", x, y); } } } // Here we actually apply the changes making sure they stay within specific // bounds cell->temperature = URANGE(-30, cell->temperature + delta->temperature, 100); cell->pressure = URANGE(0, cell->pressure + delta->pressure, 100); cell->cloudcover = URANGE(0, cell->cloudcover + delta->cloudcover, 100); cell->energy = URANGE(0, cell->energy + delta->energy, 100); cell->humidity = URANGE(0, cell->humidity + delta->humidity, 100); cell->precipitation = URANGE(0, cell->precipitation + delta->precipitation, 100); cell->windSpeedX = URANGE(-100, cell->windSpeedX + delta->windSpeedX, 100); cell->windSpeedY = URANGE(-100, cell->windSpeedY + delta->windSpeedY, 100); } } } void ClearWeatherDeltas(void) { // Clear delta map memset(weatherDelta, 0, sizeof(weatherDelta)); } void CalculateCellToCellChanges(void) { int x, y; int rand; /* * Randomly pick a cell to apply a random change to prevent equilibrium */ x = number_range(0, WEATHER_SIZE_X); y = number_range(0, WEATHER_SIZE_Y); struct WeatherCell *randcell = &weatherMap[x][y]; // Weather Cell rand = number_range(-10, 10); switch (dice(1, 8)) { case 1: randcell->cloudcover += rand; break; case 2: randcell->energy += rand; break; case 3: randcell->humidity += rand; break; case 4: randcell->precipitation += rand; break; case 5: randcell->pressure += rand; break; case 6: randcell->temperature += rand; break; case 7: randcell->windSpeedX += rand; break; case 8: randcell->windSpeedY += rand; break; } /* * Iterate over every cell and set up the changes * that will occur in that cell and it's neighbors * based on the weather */ for(y = 0; y < WEATHER_SIZE_Y; y++) { for(x = 0; x < WEATHER_SIZE_X; x++) { struct WeatherCell *cell = &weatherMap[x][y]; // Weather cell struct WeatherCell *delta = &weatherDelta[x][y]; // Where we // accumulate the // changes to apply /* * Here we force the system to take day/night into account * when determining temperature change. */ if((time_info.sunlight == SUN_RISE) || (time_info.sunlight == SUN_LIGHT)) delta->temperature += (number_range(-1, 2) + (((getCloudCover(cell) / 10) > 5) ? -1 : 1)); if((time_info.sunlight == SUN_SET) || (time_info.sunlight == SUN_DARK)) delta->temperature += (number_range(-2, 0) + (((getCloudCover(cell) / 10) < 5) ? 2 : -3)); // Precipitation drops humidity by 5% of precip level if(cell->precipitation > 40) delta->humidity -= (cell->precipitation / 20); else delta->humidity += number_range(0, 3); // Humidity and pressure can affect the precipitation level int humidityAndPressure = (cell->humidity + cell->pressure); if((humidityAndPressure / 2) >= 60) delta->precipitation += (cell->humidity / 10); else if((humidityAndPressure / 2) < 60 && (humidityAndPressure / 2) > 40) delta->precipitation += number_range(-2, 2); else if((humidityAndPressure / 2) <= 40) delta->precipitation -= (cell->humidity / 5); // Humidity and precipitation can affect the cloud cover int humidityAndPrecip = (cell->humidity + cell->precipitation); if((humidityAndPrecip / 2) >= 60) delta->cloudcover -= (cell->humidity / 10); else if((humidityAndPrecip / 2) < 60 && (humidityAndPrecip / 2) > 40) delta->cloudcover += number_range(-2, 2); else if((humidityAndPrecip / 2) <= 40) delta->cloudcover += (cell->humidity / 5); int totalPressure = cell->pressure; int numPressureCells = 1; // Changes applied based on what is going on in adjacent cells int dx, dy; for(dy = -1; dy <= 1; ++dy) { for(dx = -1; dx <= 1; ++dx) { int nx = x + dx; int ny = y + dy; // Skip THIS cell if(dx == 0 && dy == 0) continue; // Prevent array over/underruns if(nx < 0 || nx >= WEATHER_SIZE_X) continue; if(ny < 0 || ny >= WEATHER_SIZE_Y) continue; struct WeatherCell *neighborCell = &weatherMap[nx][ny]; struct WeatherCell *neighborDelta = &weatherDelta[nx][ny]; /* * We'll apply wind changes here * Wind speeds up in a given direction based on pressure * 1/4 of the pressure difference applied to wind speed * Wind should move from higher pressure to lower pressure * and some of our pressure difference should go with it! * If we are pressure 60, and they are pressure 40 * then with a difference of 20, lets make that a 4 mph * wind increase towards them! * So if they are west neighbor (dx < 0) */ int pressureDelta = cell->pressure - neighborCell->pressure; int windSpeedDelta = pressureDelta / 4; if(dx != 0) // Neighbor to east or west delta->windSpeedX += (windSpeedDelta * dx); // dx = -1 or 1 if(dy != 0) // Neighbor to north or south delta->windSpeedY += (windSpeedDelta * dy); // dy = -1 or 1 totalPressure += neighborCell->pressure; ++numPressureCells; // Now GIVE them a bit of temperature and humidity change // IF our wind is blowing towards them int temperatureDelta = (cell->temperature - neighborCell->temperature); temperatureDelta /= 16; int humidityDelta = cell->humidity - neighborCell->humidity; humidityDelta /= 16; if((cell->windSpeedX < 0 && dx < 0) || (cell->windSpeedX > 0 && dx > 0) || (cell->windSpeedY < 0 && dy < 0) || (cell->windSpeedY > 0 && dy > 0)) { neighborDelta->temperature += temperatureDelta; neighborDelta->humidity += humidityDelta; delta->temperature -= temperatureDelta; delta->humidity -= humidityDelta; } // Determine change in the energy of this particular Cell int energyDelta = number_range(-10, 10); delta->energy += energyDelta; } } // Subtract because if positive means we are higher delta->pressure = ((totalPressure / numPressureCells) - cell->pressure); /* * Precipitation should screw with pressure to keep the system from * reaching a balancing point. */ if(cell->precipitation >= 70) delta->pressure -= (cell->pressure / 2); else if(cell->precipitation < 70 && cell->precipitation > 30) delta->pressure += number_range(-5, 5); else if(cell->precipitation <= 30) delta->pressure += (cell->pressure / 2); } } } void EnforceClimateConditions(void) { int x, y; /* * This function is used to enforce certain conditions to be upheld * within cells. The cells should have a climate set to them, which * tells this function which conditions to enforce. Conditions are pretty * straight forward, and tend to mesh with climate conditions around * Earth. */ for(y = 0; y < WEATHER_SIZE_Y; y++) { for(x = 0; x < WEATHER_SIZE_X; x++) { struct WeatherCell *cell = &weatherMap[x][y]; // Weather cell struct WeatherCell *delta = &weatherDelta[x][y]; if(cell->climate == CLIMATE_RAINFOREST) { if(cell->temperature < 80) delta->temperature += 3; else if(cell->humidity < 50) delta->humidity += 2; } else if(cell->climate == CLIMATE_SAVANNA) { if(time_info.season == SEASON_WINTER && cell->hemisphere == HEMISPHERE_NORTH && cell->humidity > 0) delta->humidity += -5; else if(cell->temperature < 60) delta->temperature += 2; else if(time_info.season == SEASON_SUMMER && cell->hemisphere == HEMISPHERE_NORTH && cell->humidity < 50) delta->humidity += 5; else if(time_info.season == SEASON_SUMMER && cell->hemisphere == HEMISPHERE_SOUTH && cell->humidity > 0) delta->humidity += -5; else if(time_info.season == SEASON_WINTER && cell->hemisphere == HEMISPHERE_SOUTH && cell->humidity < 50) delta->humidity += 5; } else if(cell->climate == CLIMATE_DESERT) { if((time_info.sunlight == SUN_SET || time_info.sunlight == SUN_DARK) && cell->temperature > 30) delta->temperature += -5; else if((time_info.sunlight == SUN_RISE || time_info.sunlight == SUN_LIGHT) && cell->temperature < 64) delta->temperature += 2; else if(cell->humidity > 10) delta->humidity += -2; else if(cell->pressure < 50) delta->pressure += 2; } else if(cell->climate == CLIMATE_STEPPE) { if(time_info.season == SEASON_WINTER && cell->hemisphere == HEMISPHERE_NORTH && cell->temperature > 50) delta->temperature += -3; else if(time_info.season == SEASON_SUMMER && cell->hemisphere == HEMISPHERE_NORTH && cell->temperature < 50) delta->temperature += 2; else if(time_info.season == SEASON_SUMMER && cell->hemisphere == HEMISPHERE_SOUTH && cell->temperature > 50) delta->temperature += -3; else if(time_info.season == SEASON_WINTER && cell->hemisphere == HEMISPHERE_SOUTH && cell->temperature < 50) delta->temperature += 2; else if(cell->humidity > 60) delta->temperature += -2; else if(cell->humidity < 30) delta->temperature += 2; } else if(cell->climate == CLIMATE_CHAPPARAL) { if(time_info.season == SEASON_WINTER && cell->hemisphere == HEMISPHERE_NORTH && cell->temperature > 50) delta->temperature += -3; else if(time_info.season == SEASON_SUMMER && cell->hemisphere == HEMISPHERE_NORTH && cell->temperature < 75) delta->temperature += 2; else if(time_info.season == SEASON_SUMMER && cell->hemisphere == HEMISPHERE_NORTH && cell->humidity > 30) delta->humidity += -2; else if(time_info.season == SEASON_WINTER && cell->hemisphere == HEMISPHERE_NORTH && cell->humidity < 30) delta->humidity += 2; else if(time_info.season == SEASON_SUMMER && cell->hemisphere == HEMISPHERE_SOUTH && cell->temperature > 50) delta->temperature += -3; else if(time_info.season == SEASON_WINTER && cell->hemisphere == HEMISPHERE_SOUTH && cell->temperature < 75) delta->temperature += 2; else if(time_info.season == SEASON_WINTER && cell->hemisphere == HEMISPHERE_SOUTH && cell->humidity > 30) delta->humidity += -2; else if(time_info.season == SEASON_SUMMER && cell->hemisphere == HEMISPHERE_SOUTH && cell->humidity < 30) delta->humidity += 2; } else if(cell->climate == CLIMATE_GRASSLANDS) { if(time_info.season == SEASON_WINTER && cell->hemisphere == HEMISPHERE_NORTH && cell->temperature > 50) delta->temperature += -3; else if(time_info.season == SEASON_SUMMER && cell->hemisphere == HEMISPHERE_NORTH && cell->temperature < 75) delta->temperature += 2; else if(time_info.season == SEASON_SUMMER && cell->hemisphere == HEMISPHERE_NORTH && cell->humidity > 40) delta->humidity += -2; else if(time_info.season == SEASON_WINTER && cell->hemisphere == HEMISPHERE_NORTH && cell->humidity < 30) delta->humidity += 2; else if(time_info.season == SEASON_SUMMER && cell->hemisphere == HEMISPHERE_SOUTH && cell->temperature > 50) delta->temperature += -3; else if(time_info.season == SEASON_WINTER && cell->hemisphere == HEMISPHERE_SOUTH && cell->temperature < 75) delta->temperature += 2; else if(time_info.season == SEASON_WINTER && cell->hemisphere == HEMISPHERE_SOUTH && cell->humidity > 40) delta->humidity += -2; else if(time_info.season == SEASON_SUMMER && cell->hemisphere == HEMISPHERE_SOUTH && cell->humidity < 30) delta->humidity += 2; } else if(cell->climate == CLIMATE_DECIDUOUS) { if(time_info.season == SEASON_WINTER && cell->hemisphere == HEMISPHERE_NORTH && cell->temperature > 40) delta->temperature += -3; else if(time_info.season == SEASON_SUMMER && cell->hemisphere == HEMISPHERE_NORTH && cell->temperature < 65) delta->temperature += 2; else if(time_info.season == SEASON_SUMMER && cell->hemisphere == HEMISPHERE_SOUTH && cell->temperature > 40) delta->temperature += -3; else if(time_info.season == SEASON_WINTER && cell->hemisphere == HEMISPHERE_SOUTH && cell->temperature < 65) delta->temperature += 2; else if(cell->humidity < 30) delta->humidity += 2; } else if(cell->climate == CLIMATE_TAIGA) { if(time_info.season == SEASON_WINTER && cell->hemisphere == HEMISPHERE_NORTH && cell->temperature > 30) delta->temperature += -3; else if(time_info.season == SEASON_SUMMER && cell->hemisphere == HEMISPHERE_NORTH && cell->temperature < 40) delta->temperature += 2; else if(time_info.season == SEASON_SPRING && cell->hemisphere == HEMISPHERE_NORTH && cell->temperature > 30) delta->temperature += -2; else if(time_info.season == SEASON_FALL && cell->hemisphere == HEMISPHERE_NORTH && cell->temperature > 30) delta->temperature += -2; else if(time_info.season == SEASON_SUMMER && cell->hemisphere == HEMISPHERE_NORTH && cell->humidity < 50) delta->humidity += 2; else if(time_info.season == SEASON_SPRING && cell->hemisphere == HEMISPHERE_NORTH && cell->humidity > 20) delta->humidity += -2; else if(time_info.season == SEASON_WINTER && cell->hemisphere == HEMISPHERE_NORTH && cell->humidity > 20) delta->humidity += -2; else if(time_info.season == SEASON_FALL && cell->hemisphere == HEMISPHERE_NORTH && cell->humidity > 20) delta->humidity += -2; else if(time_info.season == SEASON_SUMMER && cell->hemisphere == HEMISPHERE_SOUTH && cell->temperature > 30) delta->temperature += -3; else if(time_info.season == SEASON_WINTER && cell->hemisphere == HEMISPHERE_SOUTH && cell->temperature < 40) delta->temperature += 2; else if(time_info.season == SEASON_FALL && cell->hemisphere == HEMISPHERE_SOUTH && cell->temperature > 30) delta->temperature += -2; else if(time_info.season == SEASON_SPRING && cell->hemisphere == HEMISPHERE_SOUTH && cell->temperature > 30) delta->temperature += -2; else if(time_info.season == SEASON_WINTER && cell->hemisphere == HEMISPHERE_SOUTH && cell->humidity < 50) delta->humidity += 2; else if(time_info.season == SEASON_FALL && cell->hemisphere == HEMISPHERE_SOUTH && cell->humidity > 20) delta->humidity += -2; else if(time_info.season == SEASON_SUMMER && cell->hemisphere == HEMISPHERE_SOUTH && cell->humidity > 20) delta->humidity += -2; else if(time_info.season == SEASON_SPRING && cell->hemisphere == HEMISPHERE_SOUTH && cell->humidity > 20) delta->humidity += -2; } else if(cell->climate == CLIMATE_TUNDRA) { if(time_info.season == SEASON_WINTER && cell->hemisphere == HEMISPHERE_NORTH && cell->temperature > 20) delta->temperature += -3; else if(time_info.season == SEASON_SUMMER && cell->hemisphere == HEMISPHERE_NORTH && cell->temperature < 50) delta->temperature += 2; else if(time_info.season == SEASON_SPRING && cell->hemisphere == HEMISPHERE_NORTH && cell->temperature > 25) delta->temperature += -2; else if(time_info.season == SEASON_FALL && cell->hemisphere == HEMISPHERE_NORTH && cell->temperature > 25) delta->temperature += -2; else if(time_info.season == SEASON_SUMMER && cell->hemisphere == HEMISPHERE_SOUTH && cell->temperature > 20) delta->temperature += -3; else if(time_info.season == SEASON_WINTER && cell->hemisphere == HEMISPHERE_SOUTH && cell->temperature < 50) delta->temperature += 2; else if(time_info.season == SEASON_FALL && cell->hemisphere == HEMISPHERE_SOUTH && cell->temperature > 25) delta->temperature += -2; else if(time_info.season == SEASON_SPRING && cell->hemisphere == HEMISPHERE_SOUTH && cell->temperature > 25) delta->temperature += -2; } else if(cell->climate == CLIMATE_ALPINE) { if(time_info.season == SEASON_WINTER && cell->hemisphere == HEMISPHERE_NORTH && cell->temperature > 20) delta->temperature += -3; else if(time_info.season == SEASON_SUMMER && cell->hemisphere == HEMISPHERE_NORTH && cell->temperature > 50) delta->temperature += -2; else if(time_info.season == SEASON_SPRING && cell->hemisphere == HEMISPHERE_NORTH && cell->temperature > 25) delta->temperature += -2; else if(time_info.season == SEASON_FALL && cell->hemisphere == HEMISPHERE_NORTH && cell->temperature > 25) delta->temperature += -2; else if(time_info.season == SEASON_SUMMER && cell->hemisphere == HEMISPHERE_SOUTH && cell->temperature > 20) delta->temperature += -3; else if(time_info.season == SEASON_WINTER && cell->hemisphere == HEMISPHERE_SOUTH && cell->temperature > 50) delta->temperature += -2; else if(time_info.season == SEASON_FALL && cell->hemisphere == HEMISPHERE_SOUTH && cell->temperature > 25) delta->temperature += -2; else if(time_info.season == SEASON_SPRING && cell->hemisphere == HEMISPHERE_SOUTH && cell->temperature > 25) delta->temperature += -2; } else if(cell->climate == CLIMATE_ARCTIC) { if(time_info.season == SEASON_WINTER && cell->hemisphere == HEMISPHERE_NORTH && cell->temperature > -10) delta->temperature += -3; else if(time_info.season == SEASON_WINTER && cell->hemisphere == HEMISPHERE_SOUTH && cell->temperature > -10) delta->temperature += 3; else if(time_info.season == SEASON_FALL && cell->hemisphere == HEMISPHERE_NORTH && cell->temperature > -10) delta->temperature += -3; else if(time_info.season == SEASON_FALL && cell->hemisphere == HEMISPHERE_SOUTH && cell->temperature > -10) delta->temperature += 3; else if(time_info.season == SEASON_SUMMER && cell->hemisphere == HEMISPHERE_NORTH && cell->temperature < -5) delta->temperature += 2; else if(time_info.season == SEASON_SUMMER && cell->hemisphere == HEMISPHERE_SOUTH && cell->temperature < -5) delta->temperature += -2; else if(time_info.season == SEASON_SUMMER && cell->hemisphere == HEMISPHERE_NORTH && cell->temperature > 10) delta->temperature += -2; else if(time_info.season == SEASON_SUMMER && cell->hemisphere == HEMISPHERE_SOUTH && cell->temperature > 10) delta->temperature += 2; else if(time_info.season == SEASON_SPRING && cell->hemisphere == HEMISPHERE_NORTH && cell->temperature < -5) delta->temperature += 2; else if(time_info.season == SEASON_SPRING && cell->hemisphere == HEMISPHERE_SOUTH && cell->temperature < -5) delta->temperature += -2; else if(time_info.season == SEASON_SPRING && cell->hemisphere == HEMISPHERE_NORTH && cell->temperature > 10) delta->temperature += -2; else if(time_info.season == SEASON_SPRING && cell->hemisphere == HEMISPHERE_SOUTH && cell->temperature > 10) delta->temperature += 2; if(time_info.season == SEASON_WINTER) delta->humidity += -1; else if(time_info.season == SEASON_FALL) delta->humidity += 1; else if(time_info.season == SEASON_SUMMER) delta->humidity += 2; else if(time_info.season == SEASON_SPRING) delta->humidity += -2; } } } } void UpdateWeather(void) { ClearWeatherDeltas(); CalculateCellToCellChanges(); EnforceClimateConditions(); ApplyDeltaChanges(); save_weathermap(); } void RandomizeCells(void) { int x, y; /* * This function came about because of the inexplicable ability * of the system, to find its way around anything I coded, and * still manage to completely throw itself off based on a single * value reaching the Max or Min for that value. * What this does: * Every night at midnight(as per the single call to this function * in time_update()) It will randomize the values in each cell, * based on hemisphere, climate, and season. */ for(y = 0; y < WEATHER_SIZE_Y; y++) { for(x = 0; x < WEATHER_SIZE_X; x++) { struct WeatherCell *cell = &weatherMap[x][y]; // Weather cell if(cell->hemisphere == HEMISPHERE_NORTH) { if(time_info.season == SEASON_SPRING) { if(cell->climate == CLIMATE_RAINFOREST) { cell->temperature = number_range(70, 90); cell->pressure = number_range(30, 60); cell->cloudcover = number_range(50, 70); cell->humidity = number_range(70, 100); cell->precipitation = number_range(70, 100); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_SAVANNA) { cell->temperature = number_range(60, 80); cell->pressure = number_range(30, 50); cell->cloudcover = number_range(20, 40); cell->humidity = number_range(60, 80); cell->precipitation = number_range(60, 80); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_DESERT) { cell->temperature = number_range(60, 80); cell->pressure = number_range(70, 90); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 10); cell->precipitation = number_range(0, 10); cell->windSpeedX = number_range(-10, 10); cell->windSpeedY = number_range(-10, 10); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_STEPPE) { cell->temperature = number_range(40, 70); cell->pressure = number_range(20, 40); cell->cloudcover = number_range(50, 70); cell->humidity = number_range(50, 70); cell->precipitation = number_range(50, 70); cell->windSpeedX = number_range(-30, 30); cell->windSpeedY = number_range(-30, 30); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_CHAPPARAL) { cell->temperature = number_range(60, 80); cell->pressure = number_range(50, 90); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 20); cell->precipitation = number_range(0, 20); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_GRASSLANDS) { cell->temperature = number_range(30, 50); cell->pressure = number_range(80, 100); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 20); cell->precipitation = number_range(0, 20); cell->windSpeedX = number_range(-40, 40); cell->windSpeedY = number_range(-40, 40); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_DECIDUOUS) { cell->temperature = number_range(45, 65); cell->pressure = number_range(20, 40); cell->cloudcover = number_range(40, 60); cell->humidity = number_range(40, 60); cell->precipitation = number_range(50, 70); cell->windSpeedX = number_range(-40, 40); cell->windSpeedY = number_range(-40, 40); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_TAIGA) { cell->temperature = number_range(0, 30); cell->pressure = number_range(80, 100); cell->cloudcover = number_range(0, 15); cell->humidity = number_range(0, 15); cell->precipitation = number_range(0, 15); cell->windSpeedX = number_range(-50, 50); cell->windSpeedY = number_range(-50, 50); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_TUNDRA) { cell->temperature = number_range(10, 40); cell->pressure = number_range(80, 100); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 20); cell->precipitation = number_range(0, 20); cell->windSpeedX = number_range(-60, 60); cell->windSpeedY = number_range(-60, 60); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_ALPINE) { cell->temperature = number_range(20, 50); cell->pressure = number_range(30, 50); cell->cloudcover = number_range(60, 80); cell->humidity = number_range(50, 70); cell->precipitation = number_range(50, 70); cell->windSpeedX = number_range(-60, 60); cell->windSpeedY = number_range(-60, 60); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_ARCTIC) { cell->temperature = number_range(0, 20); cell->pressure = number_range(85, 100); cell->cloudcover = number_range(0, 15); cell->humidity = number_range(0, 15); cell->precipitation = number_range(0, 15); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } } else if(time_info.season == SEASON_SUMMER) { if(cell->climate == CLIMATE_RAINFOREST) { cell->temperature = number_range(70, 90); cell->pressure = number_range(30, 60); cell->cloudcover = number_range(50, 70); cell->humidity = number_range(70, 100); cell->precipitation = number_range(70, 100); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_SAVANNA) { cell->temperature = number_range(60, 80); cell->pressure = number_range(30, 50); cell->cloudcover = number_range(20, 40); cell->humidity = number_range(60, 80); cell->precipitation = number_range(60, 80); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_DESERT) { cell->temperature = number_range(80, 100); cell->pressure = number_range(80, 100); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 10); cell->precipitation = number_range(0, 10); cell->windSpeedX = number_range(-10, 10); cell->windSpeedY = number_range(-10, 10); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_STEPPE) { cell->temperature = number_range(70, 90); cell->pressure = number_range(70, 90); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 20); cell->precipitation = number_range(0, 20); cell->windSpeedX = number_range(-30, 30); cell->windSpeedY = number_range(-30, 30); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_CHAPPARAL) { cell->temperature = number_range(80, 100); cell->pressure = number_range(50, 90); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 20); cell->precipitation = number_range(0, 20); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_GRASSLANDS) { cell->temperature = number_range(60, 80); cell->pressure = number_range(80, 100); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 20); cell->precipitation = number_range(0, 20); cell->windSpeedX = number_range(-40, 40); cell->windSpeedY = number_range(-40, 40); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_DECIDUOUS) { cell->temperature = number_range(65, 95); cell->pressure = number_range(60, 90); cell->cloudcover = number_range(10, 30); cell->humidity = number_range(10, 30); cell->precipitation = number_range(10, 30); cell->windSpeedX = number_range(-40, 40); cell->windSpeedY = number_range(-40, 40); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_TAIGA) { cell->temperature = number_range(30, 70); cell->pressure = number_range(40, 60); cell->cloudcover = number_range(20, 50); cell->humidity = number_range(20, 50); cell->precipitation = number_range(20, 50); cell->windSpeedX = number_range(-50, 50); cell->windSpeedY = number_range(-50, 50); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_TUNDRA) { cell->temperature = number_range(40, 70); cell->pressure = number_range(80, 100); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 20); cell->precipitation = number_range(0, 20); cell->windSpeedX = number_range(-60, 60); cell->windSpeedY = number_range(-60, 60); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_ALPINE) { cell->temperature = number_range(30, 60); cell->pressure = number_range(30, 50); cell->cloudcover = number_range(60, 80); cell->humidity = number_range(50, 70); cell->precipitation = number_range(50, 70); cell->windSpeedX = number_range(-60, 60); cell->windSpeedY = number_range(-60, 60); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_ARCTIC) { cell->temperature = number_range(-30, -10); cell->pressure = number_range(85, 100); cell->cloudcover = number_range(0, 15); cell->humidity = number_range(0, 15); cell->precipitation = number_range(0, 15); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } } else if(time_info.season == SEASON_FALL) { if(cell->climate == CLIMATE_RAINFOREST) { cell->temperature = number_range(70, 90); cell->pressure = number_range(30, 60); cell->cloudcover = number_range(50, 70); cell->humidity = number_range(70, 100); cell->precipitation = number_range(70, 100); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_SAVANNA) { cell->temperature = number_range(60, 80); cell->pressure = number_range(60, 80); cell->cloudcover = number_range(10, 30); cell->humidity = number_range(0, 20); cell->precipitation = number_range(0, 20); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_DESERT) { cell->temperature = number_range(60, 80); cell->pressure = number_range(70, 90); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 10); cell->precipitation = number_range(0, 10); cell->windSpeedX = number_range(-10, 10); cell->windSpeedY = number_range(-10, 10); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_STEPPE) { cell->temperature = number_range(40, 70); cell->pressure = number_range(20, 40); cell->cloudcover = number_range(50, 70); cell->humidity = number_range(50, 70); cell->precipitation = number_range(50, 70); cell->windSpeedX = number_range(-30, 30); cell->windSpeedY = number_range(-30, 30); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_CHAPPARAL) { cell->temperature = number_range(60, 80); cell->pressure = number_range(30, 70); cell->cloudcover = number_range(40, 60); cell->humidity = number_range(40, 60); cell->precipitation = number_range(20, 40); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_GRASSLANDS) { cell->temperature = number_range(30, 50); cell->pressure = number_range(80, 100); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 20); cell->precipitation = number_range(0, 20); cell->windSpeedX = number_range(-40, 40); cell->windSpeedY = number_range(-40, 40); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_DECIDUOUS) { cell->temperature = number_range(55, 75); cell->pressure = number_range(40, 60); cell->cloudcover = number_range(40, 60); cell->humidity = number_range(40, 60); cell->precipitation = number_range(40, 60); cell->windSpeedX = number_range(-40, 40); cell->windSpeedY = number_range(-40, 40); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_TAIGA) { cell->temperature = number_range(0, 30); cell->pressure = number_range(80, 100); cell->cloudcover = number_range(0, 15); cell->humidity = number_range(0, 15); cell->precipitation = number_range(0, 15); cell->windSpeedX = number_range(-50, 50); cell->windSpeedY = number_range(-50, 50); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_TUNDRA) { cell->temperature = number_range(10, 40); cell->pressure = number_range(40, 60); cell->cloudcover = number_range(20, 60); cell->humidity = number_range(20, 60); cell->precipitation = number_range(20, 60); cell->windSpeedX = number_range(-60, 60); cell->windSpeedY = number_range(-60, 60); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_ALPINE) { cell->temperature = number_range(20, 50); cell->pressure = number_range(30, 50); cell->cloudcover = number_range(60, 80); cell->humidity = number_range(50, 70); cell->precipitation = number_range(50, 70); cell->windSpeedX = number_range(-60, 60); cell->windSpeedY = number_range(-60, 60); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_ARCTIC) { cell->temperature = number_range(0, 20); cell->pressure = number_range(85, 100); cell->cloudcover = number_range(0, 15); cell->humidity = number_range(0, 15); cell->precipitation = number_range(0, 15); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } } else if(time_info.season == SEASON_WINTER) { if(cell->climate == CLIMATE_RAINFOREST) { cell->temperature = number_range(70, 90); cell->pressure = number_range(30, 60); cell->cloudcover = number_range(50, 70); cell->humidity = number_range(70, 100); cell->precipitation = number_range(70, 100); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_SAVANNA) { cell->temperature = number_range(60, 80); cell->pressure = number_range(60, 80); cell->cloudcover = number_range(10, 30); cell->humidity = number_range(0, 20); cell->precipitation = number_range(0, 20); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_DESERT) { cell->temperature = number_range(50, 70); cell->pressure = number_range(70, 90); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 10); cell->precipitation = number_range(0, 10); cell->windSpeedX = number_range(-10, 10); cell->windSpeedY = number_range(-10, 10); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_STEPPE) { cell->temperature = number_range(-10, 20); cell->pressure = number_range(70, 90); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 20); cell->precipitation = number_range(0, 20); cell->windSpeedX = number_range(-30, 30); cell->windSpeedY = number_range(-30, 30); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_CHAPPARAL) { cell->temperature = number_range(40, 60); cell->pressure = number_range(30, 60); cell->cloudcover = number_range(60, 80); cell->humidity = number_range(60, 80); cell->precipitation = number_range(40, 60); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_GRASSLANDS) { cell->temperature = number_range(-30, 0); cell->pressure = number_range(80, 100); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 20); cell->precipitation = number_range(0, 20); cell->windSpeedX = number_range(-40, 40); cell->windSpeedY = number_range(-40, 40); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_DECIDUOUS) { cell->temperature = number_range(10, 30); cell->pressure = number_range(40, 60); cell->cloudcover = number_range(40, 60); cell->humidity = number_range(40, 60); cell->precipitation = number_range(40, 60); cell->windSpeedX = number_range(-40, 40); cell->windSpeedY = number_range(-40, 40); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_TAIGA) { cell->temperature = number_range(-30, 0); cell->pressure = number_range(80, 100); cell->cloudcover = number_range(0, 15); cell->humidity = number_range(0, 15); cell->precipitation = number_range(0, 15); cell->windSpeedX = number_range(-50, 50); cell->windSpeedY = number_range(-50, 50); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_TUNDRA) { cell->temperature = number_range(-10, 20); cell->pressure = number_range(40, 60); cell->cloudcover = number_range(20, 60); cell->humidity = number_range(20, 60); cell->precipitation = number_range(20, 60); cell->windSpeedX = number_range(-60, 60); cell->windSpeedY = number_range(-60, 60); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_ALPINE) { cell->temperature = number_range(-30, 10); cell->pressure = number_range(30, 50); cell->cloudcover = number_range(60, 80); cell->humidity = number_range(50, 70); cell->precipitation = number_range(50, 70); cell->windSpeedX = number_range(-60, 60); cell->windSpeedY = number_range(-60, 60); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_ARCTIC) { cell->temperature = number_range(30, 60); cell->pressure = number_range(85, 100); cell->cloudcover = number_range(0, 15); cell->humidity = number_range(0, 15); cell->precipitation = number_range(0, 15); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } } } else { if(time_info.season == SEASON_SPRING) { if(cell->climate == CLIMATE_RAINFOREST) { cell->temperature = number_range(70, 90); cell->pressure = number_range(30, 60); cell->cloudcover = number_range(50, 70); cell->humidity = number_range(70, 100); cell->precipitation = number_range(70, 100); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_SAVANNA) { cell->temperature = number_range(60, 80); cell->pressure = number_range(60, 80); cell->cloudcover = number_range(10, 30); cell->humidity = number_range(0, 20); cell->precipitation = number_range(0, 20); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_DESERT) { cell->temperature = number_range(60, 80); cell->pressure = number_range(70, 90); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 10); cell->precipitation = number_range(0, 10); cell->windSpeedX = number_range(-10, 10); cell->windSpeedY = number_range(-10, 10); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_STEPPE) { cell->temperature = number_range(40, 70); cell->pressure = number_range(70, 90); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 20); cell->precipitation = number_range(0, 20); cell->windSpeedX = number_range(-30, 30); cell->windSpeedY = number_range(-30, 30); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_CHAPPARAL) { cell->temperature = number_range(60, 80); cell->pressure = number_range(30, 70); cell->cloudcover = number_range(40, 60); cell->humidity = number_range(40, 60); cell->precipitation = number_range(20, 40); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_GRASSLANDS) { cell->temperature = number_range(30, 50); cell->pressure = number_range(80, 100); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 20); cell->precipitation = number_range(0, 20); cell->windSpeedX = number_range(-40, 40); cell->windSpeedY = number_range(-40, 40); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_DECIDUOUS) { cell->temperature = number_range(55, 75); cell->pressure = number_range(40, 60); cell->cloudcover = number_range(40, 60); cell->humidity = number_range(40, 60); cell->precipitation = number_range(40, 60); cell->windSpeedX = number_range(-40, 40); cell->windSpeedY = number_range(-40, 40); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_TAIGA) { cell->temperature = number_range(0, 30); cell->pressure = number_range(80, 100); cell->cloudcover = number_range(0, 15); cell->humidity = number_range(0, 15); cell->precipitation = number_range(0, 15); cell->windSpeedX = number_range(-50, 50); cell->windSpeedY = number_range(-50, 50); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_TUNDRA) { cell->temperature = number_range(10, 40); cell->pressure = number_range(40, 60); cell->cloudcover = number_range(20, 60); cell->humidity = number_range(20, 60); cell->precipitation = number_range(20, 60); cell->windSpeedX = number_range(-60, 60); cell->windSpeedY = number_range(-60, 60); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_ALPINE) { cell->temperature = number_range(20, 50); cell->pressure = number_range(30, 50); cell->cloudcover = number_range(60, 80); cell->humidity = number_range(50, 70); cell->precipitation = number_range(50, 70); cell->windSpeedX = number_range(-60, 60); cell->windSpeedY = number_range(-60, 60); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_ARCTIC) { cell->temperature = number_range(0, 20); cell->pressure = number_range(85, 100); cell->cloudcover = number_range(0, 15); cell->humidity = number_range(0, 15); cell->precipitation = number_range(0, 15); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } } else if(time_info.season == SEASON_SUMMER) { if(cell->climate == CLIMATE_RAINFOREST) { cell->temperature = number_range(70, 90); cell->pressure = number_range(30, 60); cell->cloudcover = number_range(50, 70); cell->humidity = number_range(70, 100); cell->precipitation = number_range(70, 100); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_SAVANNA) { cell->temperature = number_range(60, 80); cell->pressure = number_range(60, 80); cell->cloudcover = number_range(10, 30); cell->humidity = number_range(0, 20); cell->precipitation = number_range(0, 20); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_DESERT) { cell->temperature = number_range(80, 100); cell->pressure = number_range(80, 100); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 10); cell->precipitation = number_range(0, 10); cell->windSpeedX = number_range(-10, 10); cell->windSpeedY = number_range(-10, 10); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_STEPPE) { cell->temperature = number_range(40, 60); cell->pressure = number_range(30, 60); cell->cloudcover = number_range(60, 80); cell->humidity = number_range(60, 80); cell->precipitation = number_range(40, 60); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_CHAPPARAL) { cell->temperature = number_range(60, 80); cell->pressure = number_range(50, 90); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 20); cell->precipitation = number_range(0, 20); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_GRASSLANDS) { cell->temperature = number_range(-30, 0); cell->pressure = number_range(80, 100); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 20); cell->precipitation = number_range(0, 20); cell->windSpeedX = number_range(-40, 40); cell->windSpeedY = number_range(-40, 40); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_DECIDUOUS) { cell->temperature = number_range(10, 30); cell->pressure = number_range(40, 60); cell->cloudcover = number_range(40, 60); cell->humidity = number_range(40, 60); cell->precipitation = number_range(40, 60); cell->windSpeedX = number_range(-40, 40); cell->windSpeedY = number_range(-40, 40); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_TAIGA) { cell->temperature = number_range(-30, 0); cell->pressure = number_range(80, 100); cell->cloudcover = number_range(0, 15); cell->humidity = number_range(0, 15); cell->precipitation = number_range(0, 15); cell->windSpeedX = number_range(-50, 50); cell->windSpeedY = number_range(-50, 50); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_TUNDRA) { cell->temperature = number_range(-10, 20); cell->pressure = number_range(40, 60); cell->cloudcover = number_range(20, 60); cell->humidity = number_range(20, 60); cell->precipitation = number_range(20, 60); cell->windSpeedX = number_range(-60, 60); cell->windSpeedY = number_range(-60, 60); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_ALPINE) { cell->temperature = number_range(-30, 10); cell->pressure = number_range(30, 50); cell->cloudcover = number_range(60, 80); cell->humidity = number_range(50, 70); cell->precipitation = number_range(50, 70); cell->windSpeedX = number_range(-60, 60); cell->windSpeedY = number_range(-60, 60); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_ARCTIC) { cell->temperature = number_range(30, 60); cell->pressure = number_range(85, 100); cell->cloudcover = number_range(0, 15); cell->humidity = number_range(0, 15); cell->precipitation = number_range(0, 15); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } } else if(time_info.season == SEASON_FALL) { if(cell->climate == CLIMATE_RAINFOREST) { cell->temperature = number_range(70, 90); cell->pressure = number_range(30, 60); cell->cloudcover = number_range(50, 70); cell->humidity = number_range(70, 100); cell->precipitation = number_range(70, 100); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_SAVANNA) { cell->temperature = number_range(60, 80); cell->pressure = number_range(30, 50); cell->cloudcover = number_range(20, 40); cell->humidity = number_range(60, 80); cell->precipitation = number_range(60, 80); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_DESERT) { cell->temperature = number_range(60, 80); cell->pressure = number_range(70, 90); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 10); cell->precipitation = number_range(0, 10); cell->windSpeedX = number_range(-10, 10); cell->windSpeedY = number_range(-10, 10); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_STEPPE) { cell->temperature = number_range(40, 70); cell->pressure = number_range(20, 40); cell->cloudcover = number_range(50, 70); cell->humidity = number_range(50, 70); cell->precipitation = number_range(50, 70); cell->windSpeedX = number_range(-30, 30); cell->windSpeedY = number_range(-30, 30); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_CHAPPARAL) { cell->temperature = number_range(-10, 20); cell->pressure = number_range(70, 90); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 20); cell->precipitation = number_range(0, 20); cell->windSpeedX = number_range(-30, 30); cell->windSpeedY = number_range(-30, 30); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_GRASSLANDS) { cell->temperature = number_range(30, 50); cell->pressure = number_range(80, 100); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 20); cell->precipitation = number_range(0, 20); cell->windSpeedX = number_range(-40, 40); cell->windSpeedY = number_range(-40, 40); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_DECIDUOUS) { cell->temperature = number_range(45, 65); cell->pressure = number_range(20, 40); cell->cloudcover = number_range(40, 60); cell->humidity = number_range(40, 60); cell->precipitation = number_range(50, 70); cell->windSpeedX = number_range(-40, 40); cell->windSpeedY = number_range(-40, 40); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_TAIGA) { cell->temperature = number_range(0, 30); cell->pressure = number_range(80, 100); cell->cloudcover = number_range(0, 15); cell->humidity = number_range(0, 15); cell->precipitation = number_range(0, 15); cell->windSpeedX = number_range(-50, 50); cell->windSpeedY = number_range(-50, 50); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_TUNDRA) { cell->temperature = number_range(10, 40); cell->pressure = number_range(80, 100); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 20); cell->precipitation = number_range(0, 20); cell->windSpeedX = number_range(-60, 60); cell->windSpeedY = number_range(-60, 60); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_ALPINE) { cell->temperature = number_range(20, 50); cell->pressure = number_range(30, 50); cell->cloudcover = number_range(60, 80); cell->humidity = number_range(50, 70); cell->precipitation = number_range(50, 70); cell->windSpeedX = number_range(-60, 60); cell->windSpeedY = number_range(-60, 60); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_ARCTIC) { cell->temperature = number_range(0, 20); cell->pressure = number_range(85, 100); cell->cloudcover = number_range(0, 15); cell->humidity = number_range(0, 15); cell->precipitation = number_range(0, 15); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } } else if(time_info.season == SEASON_WINTER) { if(cell->climate == CLIMATE_RAINFOREST) { cell->temperature = number_range(70, 90); cell->pressure = number_range(30, 60); cell->cloudcover = number_range(50, 70); cell->humidity = number_range(70, 100); cell->precipitation = number_range(70, 100); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_SAVANNA) { cell->temperature = number_range(60, 80); cell->pressure = number_range(30, 50); cell->cloudcover = number_range(20, 40); cell->humidity = number_range(60, 80); cell->precipitation = number_range(60, 80); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_DESERT) { cell->temperature = number_range(50, 70); cell->pressure = number_range(70, 90); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 10); cell->precipitation = number_range(0, 10); cell->windSpeedX = number_range(-10, 10); cell->windSpeedY = number_range(-10, 10); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_STEPPE) { cell->temperature = number_range(70, 90); cell->pressure = number_range(70, 90); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 20); cell->precipitation = number_range(0, 20); cell->windSpeedX = number_range(-30, 30); cell->windSpeedY = number_range(-30, 30); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_CHAPPARAL) { cell->temperature = number_range(80, 100); cell->pressure = number_range(50, 90); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 20); cell->precipitation = number_range(0, 20); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_GRASSLANDS) { cell->temperature = number_range(60, 80); cell->pressure = number_range(80, 100); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 20); cell->precipitation = number_range(0, 20); cell->windSpeedX = number_range(-40, 40); cell->windSpeedY = number_range(-40, 40); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_DECIDUOUS) { cell->temperature = number_range(65, 95); cell->pressure = number_range(60, 90); cell->cloudcover = number_range(10, 30); cell->humidity = number_range(10, 30); cell->precipitation = number_range(10, 30); cell->windSpeedX = number_range(-40, 40); cell->windSpeedY = number_range(-40, 40); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_TAIGA) { cell->temperature = number_range(30, 70); cell->pressure = number_range(40, 60); cell->cloudcover = number_range(20, 50); cell->humidity = number_range(20, 50); cell->precipitation = number_range(20, 50); cell->windSpeedX = number_range(-50, 50); cell->windSpeedY = number_range(-50, 50); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_TUNDRA) { cell->temperature = number_range(40, 70); cell->pressure = number_range(80, 100); cell->cloudcover = number_range(0, 20); cell->humidity = number_range(0, 20); cell->precipitation = number_range(0, 20); cell->windSpeedX = number_range(-60, 60); cell->windSpeedY = number_range(-60, 60); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_ALPINE) { cell->temperature = number_range(30, 60); cell->pressure = number_range(30, 50); cell->cloudcover = number_range(60, 80); cell->humidity = number_range(50, 70); cell->precipitation = number_range(50, 70); cell->windSpeedX = number_range(-60, 60); cell->windSpeedY = number_range(-60, 60); cell->energy = number_range(0, 100); } else if(cell->climate == CLIMATE_ARCTIC) { cell->temperature = number_range(-30, -10); cell->pressure = number_range(85, 100); cell->cloudcover = number_range(0, 15); cell->humidity = number_range(0, 15); cell->precipitation = number_range(0, 15); cell->windSpeedX = number_range(-20, 20); cell->windSpeedY = number_range(-20, 20); cell->energy = number_range(0, 100); } } } } } } const int weatherVersion = 1; int version; void save_weathermap(void) { int x, y; char filename[MIL]; FILE *fp; snprintf(filename, MIL, "%s%s", SYSTEM_DIR, WEATHER_FILE); if(!(fp = fopen(filename, "w"))) { bug("%s: fopen", __FUNCTION__); perror(filename); return; } fprintf(fp, "#VERSION %d\n\n", weatherVersion); for(y = 0; y < WEATHER_SIZE_Y; y++) { for(x = 0; x < WEATHER_SIZE_X; x++) { struct WeatherCell *cell = &weatherMap[x][y]; fprintf(fp, "#CELL %d %d\n", x, y); fprintf(fp, "Climate %s~\n", climate_names[cell->climate]); fprintf(fp, "Hemisphere %s~\n", hemisphere_name[cell->hemisphere]); fprintf(fp, "State %d %d %d %d %d %d %d %d\n", cell->cloudcover, cell->energy, cell->humidity, cell->precipitation, cell->pressure, cell->temperature, cell->windSpeedX, cell->windSpeedY); fprintf(fp, "End\n\n"); } } fprintf(fp, "\n#END\n\n"); fclose(fp); fp = NULL; return; } void fread_cell(FILE * fp, int x, int y) { bool fMatch = FALSE; struct WeatherCell *cell = &weatherMap[x][y]; for(;;) { const char *word = feof(fp) ? "End" : fread_word(fp); char flag[MAX_INPUT_LENGTH]; int value = 0; switch (UPPER(word[0])) { case '*': fread_to_eol(fp); break; case 'C': if(!str_cmp(word, "Climate")) { if(version >= 1) { char *climate = NULL; climate = fread_flagstring(fp); while(climate[0] != '\0') { climate = one_argument(climate, flag); value = get_climate(flag); if(value < 0 || value >= MAX_CLIMATE) bug("Unknown climate: %s", flag); else cell->climate = value; } fMatch = TRUE; break; } else cell->climate = fread_number(fp); fMatch = TRUE; } break; case 'E': if(!str_cmp(word, "End")) return; break; case 'H': if(!str_cmp(word, "Hemisphere")) { if(version >= 1) { char *hemisphere = NULL; hemisphere = fread_flagstring(fp); while(hemisphere[0] != '\0') { hemisphere = one_argument(hemisphere, flag); value = get_hemisphere(flag); if(value < 0 || value >= HEMISPHERE_MAX) bug("Unknown hemisphere: %s", flag); else cell->hemisphere = value; } fMatch = TRUE; break; } else cell->hemisphere = fread_number(fp); fMatch = TRUE; } break; case 'S': if(!str_cmp(word, "State")) { cell->cloudcover = fread_number(fp); cell->energy = fread_number(fp); cell->humidity = fread_number(fp); cell->precipitation = fread_number(fp); cell->pressure = fread_number(fp); cell->temperature = fread_number(fp); cell->windSpeedX = fread_number(fp); cell->windSpeedY = fread_number(fp); fMatch = TRUE; break; } break; } if(!fMatch) { bug("%s: no match for %s", __FUNCTION__, word); fread_to_eol(fp); } } } bool load_weathermap(void) { FILE *fp = NULL; char filename[256]; int x, y; version = 0; snprintf(filename, 256, "%s%s", SYSTEM_DIR, WEATHER_FILE); if(!(fp = fopen(filename, "r"))) { bug("load_weathermap(): cannot open %s for reading", filename); return FALSE; } for(;;) { char letter = fread_letter(fp); char *word; if(letter == '*') { fread_to_eol(fp); continue; } if(letter != '#') { bug("%s: # not found (%c)", __FUNCTION__, letter); return FALSE; } word = fread_word(fp); if(!str_cmp(word, "VERSION")) { version = fread_number(fp); continue; } if(!str_cmp(word, "CELL")) { x = fread_number(fp); y = fread_number(fp); fread_cell(fp, x, y); continue; } else if(!str_cmp(word, "END")) break; else { bug("%s: no match for %s", __FUNCTION__, word); continue; } } fclose(fp); fp = NULL; return TRUE; } /* * Weather Utility Functions * Designed to attempt to emulate encapsulation. */ struct WeatherCell *getWeatherCell(AREA_DATA *pArea) { return &weatherMap[pArea->weatherx][pArea->weathery]; } void IncreaseTemp(struct WeatherCell *cell, int change) { cell->temperature += change; } void DecreaseTemp(struct WeatherCell *cell, int change) { cell->temperature -= change; } void IncreasePrecip(struct WeatherCell *cell, int change) { cell->precipitation += change; } void DecreasePrecip(struct WeatherCell *cell, int change) { cell->precipitation -= change; } void IncreasePressure(struct WeatherCell *cell, int change) { cell->pressure += change; } void DecreasePressure(struct WeatherCell *cell, int change) { cell->pressure -= change; } void IncreaseEnergy(struct WeatherCell *cell, int change) { cell->energy += change; } void DecreaseEnergy(struct WeatherCell *cell, int change) { cell->energy -= change; } void IncreaseCloudCover(struct WeatherCell *cell, int change) { cell->cloudcover += change; } void DecreaseCloudCover(struct WeatherCell *cell, int change) { cell->cloudcover -= change; } void IncreaseHumidity(struct WeatherCell *cell, int change) { cell->humidity += change; } void DecreaseHumidity(struct WeatherCell *cell, int change) { cell->humidity -= change; } void IncreaseWindX(struct WeatherCell *cell, int change) { cell->windSpeedX += change; } void DecreaseWindX(struct WeatherCell *cell, int change) { cell->windSpeedX -= change; } void IncreaseWindY(struct WeatherCell *cell, int change) { cell->windSpeedY += change; } void DecreaseWindY(struct WeatherCell *cell, int change) { cell->windSpeedY -= change; } /* Cloud cover Information */ int getCloudCover(struct WeatherCell *cell) { return cell->cloudcover; } bool isExtremelyCloudy(int cloudCover) { if(cloudCover > 80) return TRUE; else return FALSE; } bool isModeratelyCloudy(int cloudCover) { if(cloudCover > 60 && cloudCover <= 80) return TRUE; else return FALSE; } bool isPartlyCloudy(int cloudCover) { if(cloudCover > 40 && cloudCover <= 60) return TRUE; else return FALSE; } bool isCloudy(int cloudCover) { if(cloudCover > 20 && cloudCover <= 40) return TRUE; else return FALSE; } /* Temperature Information */ int getTemp(struct WeatherCell *cell) { return cell->temperature; } bool isSwelteringHeat(int temp) { if(temp > 90) return TRUE; else return FALSE; } bool isVeryHot(int temp) { if(temp > 80 && temp <= 90) return TRUE; else return FALSE; } bool isHot(int temp) { if(temp > 70 && temp <= 80) return TRUE; else return FALSE; } bool isWarm(int temp) { if(temp > 60 && temp <= 70) return TRUE; else return FALSE; } bool isTemperate(int temp) { if(temp > 50 && temp <= 60) return TRUE; else return FALSE; } bool isCool(int temp) { if(temp > 40 && temp <= 50) return TRUE; else return FALSE; } bool isChilly(int temp) { if(temp > 30 && temp <= 40) return TRUE; else return FALSE; } bool isCold(int temp) { if(temp > 20 && temp <= 30) return TRUE; else return FALSE; } bool isFrosty(int temp) { if(temp > 10 && temp <= 20) return TRUE; else return FALSE; } bool isFreezing(int temp) { if(temp > 0 && temp <= 10) return TRUE; else return FALSE; } bool isReallyCold(int temp) { if(temp > -10 && temp <= 0) return TRUE; else return FALSE; } bool isVeryCold(int temp) { if(temp > -20 && temp <= -10) return TRUE; else return FALSE; } bool isExtremelyCold(int temp) { if(temp <= -20) return TRUE; else return FALSE; } /* Energy Information */ int getEnergy(struct WeatherCell *cell) { return cell->energy; } bool isStormy(int energy) { if(energy > 50) return TRUE; else return FALSE; } /* Pressure Information */ int getPressure(struct WeatherCell *cell) { return cell->pressure; } bool isHighPressure(int pressure) { if(pressure > 50) return TRUE; else return FALSE; } bool isLowPressure(int pressure) { if(pressure < 50) return TRUE; else return FALSE; } /* Humidity Information */ int getHumidity(struct WeatherCell *cell) { return cell->humidity; } bool isExtremelyHumid(int humidity) { if(humidity > 80) return TRUE; else return FALSE; } bool isModeratelyHumid(int humidity) { if(humidity > 60 && humidity < 80) return TRUE; else return FALSE; } bool isMinorlyHumid(int humidity) { if(humidity > 40 && humidity < 60) return TRUE; else return FALSE; } bool isHumid(int humidity) { if(humidity > 20 && humidity < 40) return TRUE; else return FALSE; } /* Precipitation Information */ int getPrecip(struct WeatherCell *cell) { return cell->precipitation; } bool isTorrentialDownpour(int precip) { if(precip > 90) return TRUE; else return FALSE; } bool isRainingCatsAndDogs(int precip) { if(precip > 80 && precip <= 90) return TRUE; else return FALSE; } bool isPouring(int precip) { if(precip > 70 && precip <= 80) return TRUE; else return FALSE; } bool isRaingingHeavily(int precip) { if(precip > 60 && precip <= 70) return TRUE; else return FALSE; } bool isDownpour(int precip) { if(precip > 50 && precip <= 60) return TRUE; else return FALSE; } bool isRainingSteadily(int precip) { if(precip > 40 && precip <= 50) return TRUE; else return FALSE; } bool isRaining(int precip) { if(precip > 30 && precip <= 40) return TRUE; else return FALSE; } bool isRainingLightly(int precip) { if(precip > 20 && precip <= 30) return TRUE; else return FALSE; } bool isDrizzling(int precip) { if(precip > 10 && precip <= 20) return TRUE; else return FALSE; } bool isMisting(int precip) { if(precip > 0 && precip <= 10) return TRUE; else return FALSE; } /* WindX Information */ int getWindX(struct WeatherCell *cell) { return cell->windSpeedX; } bool isCalmWindE(int windx) { if(windx > 0 && windx <= 10) return TRUE; else return FALSE; } bool isBreezyWindE(int windx) { if(windx > 10 && windx <= 20) return TRUE; else return FALSE; } bool isBlusteryWindE(int windx) { if(windx > 20 && windx <= 40) return TRUE; else return FALSE; } bool isWindyWindE(int windx) { if(windx > 40 && windx <= 60) return TRUE; else return FALSE; } bool isGustyWindE(int windx) { if(windx > 60 && windx <= 80) return TRUE; else return FALSE; } bool isGaleForceWindE(int windx) { if(windx > 80 && windx <= 100) return TRUE; else return FALSE; } bool isCalmWindW(int windx) { if(windx < 0 && windx >= -10) return TRUE; else return FALSE; } bool isBreezyWindW(int windx) { if(windx < -10 && windx >= -20) return TRUE; else return FALSE; } bool isBlusteryWindW(int windx) { if(windx < -20 && windx >= -40) return TRUE; else return FALSE; } bool isWindyWindW(int windx) { if(windx < -40 && windx >= -60) return TRUE; else return FALSE; } bool isGustyWindW(int windx) { if(windx < -60 && windx >= -80) return TRUE; else return FALSE; } bool isGaleForceWindW(int windx) { if(windx < -80 && windx >= -100) return TRUE; else return FALSE; } /* WindY Information */ int getWindY(struct WeatherCell *cell) { return cell->windSpeedY; } bool isCalmWindN(int windy) { if(windy > 0 && windy <= 10) return TRUE; else return FALSE; } bool isBreezyWindN(int windy) { if(windy > 10 && windy <= 20) return TRUE; else return FALSE; } bool isBlusteryWindN(int windy) { if(windy > 20 && windy <= 40) return TRUE; else return FALSE; } bool isWindyWindN(int windy) { if(windy > 40 && windy <= 60) return TRUE; else return FALSE; } bool isGustyWindN(int windy) { if(windy > 60 && windy <= 80) return TRUE; else return FALSE; } bool isGaleForceWindN(int windy) { if(windy > 80 && windy <= 100) return TRUE; else return FALSE; } bool isCalmWindS(int windy) { if(windy < 0 && windy >= -10) return TRUE; else return FALSE; } bool isBreezyWindS(int windy) { if(windy < -10 && windy >= -20) return TRUE; else return FALSE; } bool isBlusteryWindS(int windy) { if(windy < -20 && windy >= -40) return TRUE; else return FALSE; } bool isWindyWindS(int windy) { if(windy < -40 && windy >= -60) return TRUE; else return FALSE; } bool isGustyWindS(int windy) { if(windy < -60 && windy >= -80) return TRUE; else return FALSE; } bool isGaleForceWindS(int windy) { if(windy < -80 && windy >= -100) return TRUE; else return FALSE; } void do_setweather(CHAR_DATA *ch, char *argument) { char arg[MIL], arg2[MIL], arg3[MIL], arg4[MIL]; int value, x, y; argument = one_argument(argument, arg); argument = one_argument(argument, arg2); argument = one_argument(argument, arg3); argument = one_argument(argument, arg4); if(IS_NPC(ch)) { send_to_char("Mob's can't setweather.\r\n", ch); return; } if(!ch->desc) { send_to_char("Nice try, but You have no descriptor.\r\n", ch); return; } if(arg[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0') { send_to_char("Syntax: setweather <x> <y> <field> <value>\r\n", ch); send_to_char("\r\n", ch); send_to_char("Field being one of:\r\n", ch); send_to_char(" climate hemisphere\r\n", ch); send_to_char("Climate value being:\r\n", ch); send_to_char(" rainforest savanna desert steppe chapparal arctic\r\n", ch); send_to_char(" grasslands deciduous_forest taiga tundra alpine\r\n", ch); send_to_char(" See Help Climates for information on each.\r\n", ch); send_to_char("Hemisphere value being:\r\n", ch); send_to_char(" northern southern\r\n", ch); return; } x = atoi(arg); y = atoi(arg2); if(x < 0 || x > WEATHER_SIZE_X) { ch_printf(ch, "X value must be between 0 and %d.\r\n", WEATHER_SIZE_X); return; } if(y < 0 || y > WEATHER_SIZE_Y) { ch_printf(ch, "Y value must be between 0 and %d.\r\n", WEATHER_SIZE_Y); return; } struct WeatherCell *cell = &weatherMap[x][y]; if(!str_cmp(arg3, "climate")) { if(arg4[0] == '\0') { send_to_char("Usage: setweather <x> <y> climate <flag>\r\n", ch); return; } value = get_climate(arg4); if(value < 0 || value > MAX_CLIMATE) ch_printf(ch, "Unknown flag: %s\r\n", arg4); else { cell->climate = value; send_to_char("Cell Climate set.\r\n", ch); } return; } if(!str_cmp(arg3, "hemisphere")) { if(arg4[0] == '\0') { send_to_char("Usage: setweather <x> <y> hemisphere <flag>\r\n", ch); return; } value = get_hemisphere(arg4); if(value < 0 || value > HEMISPHERE_MAX) ch_printf(ch, "Unknown flag: %s\r\n", arg4); else { cell->hemisphere = value; send_to_char("Cell Hemisphere set.\r\n", ch); } return; } else { send_to_char("Syntax: setweather <x> <y> <field> <value>\r\n", ch); send_to_char("\r\n", ch); send_to_char("Field being one of:\r\n", ch); send_to_char(" climate hemisphere\r\n", ch); send_to_char("Climate value being:\r\n", ch); send_to_char(" rainforest savanna desert steppe chapparal arctic\r\n", ch); send_to_char(" grasslands deciduous_forest taiga tundra alpine\r\n", ch); send_to_char(" See Help Climates for information on each.\r\n", ch); send_to_char("Hemisphere value being:\r\n", ch); send_to_char(" northern southern\r\n", ch); return; } } void do_showweather(CHAR_DATA *ch, char *argument) { char arg[MIL], arg2[MIL]; int x, y; argument = one_argument(argument, arg); argument = one_argument(argument, arg2); if(IS_NPC(ch)) { send_to_char("Mob's can't showweather.\r\n", ch); return; } if(!ch->desc) { send_to_char("Nice try, but You have no descriptor.\r\n", ch); return; } if(arg[0] == '\0' || arg2[0] == '\0') { send_to_char("Syntax: showweather <x> <y>\r\n", ch); return; } x = atoi(arg); y = atoi(arg2); if(x < 0 || x > WEATHER_SIZE_X - 1) { ch_printf(ch, "X value must be between 0 and %d.\r\n", WEATHER_SIZE_X - 1); return; } if(y < 0 || y > WEATHER_SIZE_Y - 1) { ch_printf(ch, "Y value must be between 0 and %d.\r\n", WEATHER_SIZE_Y - 1); return; } struct WeatherCell *cell = &weatherMap[x][y]; ch_printf_color(ch, "Current Weather State for:\r\n"); ch_printf_color(ch, "&WCell (&w%d&W, &w%d&W)&D\r\n", x, y); ch_printf_color(ch, "&WClimate: &w%s&D\r\n", climate_names[cell->climate]); ch_printf_color(ch, "&WHemispere: &w%s&D\r\n", hemisphere_name[cell->hemisphere]); ch_printf_color(ch, "&WCloud Cover: &w%d&D\r\n", cell->cloudcover); ch_printf_color(ch, "&WEnergy: &w%d&D\r\n", cell->energy); ch_printf_color(ch, "&WTemperature: &w%d&D\r\n", cell->temperature); ch_printf_color(ch, "&WPressure: &w%d&D\r\n", cell->pressure); ch_printf_color(ch, "&WHumidity: &w%d&D\r\n", cell->humidity); ch_printf_color(ch, "&WPrecipitation: &w%d&D\r\n", cell->precipitation); ch_printf_color(ch, "&WWind Speed XAxis: &w%d&D\r\n", cell->windSpeedX); ch_printf_color(ch, "&WWind Speed YAxis: &w%d&D\r\n", cell->windSpeedY); } void do_weather(CHAR_DATA *ch, char *argument) { struct WeatherCell *cell = getWeatherCell(ch->in_room->area); if(IS_NPC(ch)) { send_to_char("Mob's can't check the weather.\r\n", ch); return; } if(!ch->desc) { send_to_char("Nice try, but You have no descriptor.\r\n", ch); return; } if(!IS_OUTSIDE(ch) && NO_WEATHER_SECT(ch->in_room->sector_type)) { send_to_char("You need to be outside to do that!\r\n", ch); return; } ch_printf_color(ch, "&wAs you check the weather around you, you notice:&D\r\n"); if(getPrecip(cell) > 0) { if(isTorrentialDownpour(getPrecip(cell))) { if(getTemp(cell) <= 32) ch_printf_color(ch, "&WThe snow is creating such a blizzard you can barely see!&D\r\n"); else ch_printf_color(ch, "&BThe rain is coming down in torrents!&D\r\n"); } else if(isRainingCatsAndDogs(getPrecip(cell))) { if(getTemp(cell) <= 32) ch_printf_color(ch, "&WThe snow is creating a near solid wall of white!&D\r\n"); else ch_printf_color(ch, "&BThe rain is coming down in big heavy drops!&D\r\n"); } else if(isPouring(getPrecip(cell))) { if(getTemp(cell) <= 32) ch_printf_color(ch, "&WThe snow is coming down hard.&D\r\n"); else ch_printf_color(ch, "&BThe rain is pouring down.&D\r\n"); } else if(isRaingingHeavily(getPrecip(cell))) { if(getTemp(cell) <= 32) ch_printf_color(ch, "&WThe snow falls heavily.&D\r\n"); else ch_printf_color(ch, "&BThe rain falls heavily.&D\r\n"); } else if(isDownpour(getPrecip(cell))) { if(getTemp(cell) <= 32) ch_printf_color(ch, "&WThe snow is coming down in heavy waves.&D\r\n"); else ch_printf_color(ch, "&BThe rain is coming down in sheets.&D\r\n"); } else if(isRainingSteadily(getPrecip(cell))) { if(getTemp(cell) <= 32) ch_printf_color(ch, "&WThe snow appears to be falling pretty steadily.&D\r\n"); else ch_printf_color(ch, "&BThe rain appears to be falling pretty steadily.&D\r\n"); } else if(isRaining(getPrecip(cell))) { if(getTemp(cell) <= 32) ch_printf_color(ch, "&WSnowflakes drift down from the heavens.&D\r\n"); else ch_printf_color(ch, "&BRain falls from the sky.&D\r\n"); } else if(isRainingLightly(getPrecip(cell))) { if(getTemp(cell) <= 32) ch_printf_color(ch, "&WA light snow falls around you.&D\r\n"); else ch_printf_color(ch, "&BA light rain patters on the ground around you.&D\r\n"); } else if(isDrizzling(getPrecip(cell))) { if(getTemp(cell) <= 32) ch_printf_color(ch, "&WSnow flurries about you.&D\r\n"); else ch_printf_color(ch, "&BA light drizzle seems to be falling.&D\r\n"); } else if(isMisting(getPrecip(cell))) { if(getTemp(cell) <= 32) ch_printf_color(ch, "&WA few scattered snowflakes can be seen.&D\r\n"); else ch_printf_color(ch, "&BA light mist appears to be falling.&D\r\n"); } } else ch_printf_color(ch, "&BThere doesn't appear to be any form of precipitation.&D\r\n"); if(getCloudCover(cell) > 0) { if(isExtremelyCloudy(getCloudCover(cell))) ch_printf_color(ch, "&wA blanket of clouds covers the sky.&D\r\n"); if(isModeratelyCloudy(getCloudCover(cell))) ch_printf_color(ch, "&wThere looks to be a good bit of clouds in the sky.&D\r\n"); if(isPartlyCloudy(getCloudCover(cell))) ch_printf_color(ch, "&wIt appears to be a partly cloudy sky.&D\r\n"); if(isCloudy(getCloudCover(cell))) ch_printf_color(ch, "&wThere are a few scattered clouds in the sky.&D\r\n"); } else ch_printf_color(ch, "&wThere don't appear to be any clouds in the sky.&D\r\n"); if(getHumidity(cell) > 0) { if(isExtremelyHumid(getHumidity(cell))) ch_printf_color(ch, "&cYour skin feels sickly sticky with the extreme humidity.&D\r\n"); else if(isModeratelyHumid(getHumidity(cell))) ch_printf_color(ch, "&cYou feel slightly sticky because of the moderate humidity.&D\r\n"); else if(isMinorlyHumid(getHumidity(cell))) ch_printf_color(ch, "&cThe stickyness of your skin is barely noticeable in the minor humidity.&D\r\n"); else if(isHumid(getHumidity(cell))) ch_printf_color(ch, "&cThe air feels perfect against your skin.&D\r\n"); else ch_printf_color(ch, "&cYou can't feel a difference in the humidity.&D\r\n"); } else ch_printf_color(ch, "&cThe air seems as if to suck the moisture from your skin.&D\r\n"); if(getWindX(cell) != 0 && getWindY(cell) != 0) { if(isCalmWindE(getWindX(cell)) && isCalmWindS(getWindY(cell))) ch_printf_color(ch, "&GA calm wind brushes your skin from the southeast.&D\r\n"); else if(isCalmWindE(getWindX(cell)) && isCalmWindN(getWindY(cell))) ch_printf_color(ch, "&GA calm wind brushes your skin from the northeast.&D\r\n"); else if(isBreezyWindE(getWindX(cell)) && isBreezyWindS(getWindY(cell))) ch_printf_color(ch, "&GA steady breeze emanates from the southeast.&D\r\n"); else if(isBreezyWindE(getWindX(cell)) && isBreezyWindN(getWindY(cell))) ch_printf_color(ch, "&GA steady breeze emanates from the northeast.&D\r\n"); else if(isBlusteryWindE(getWindX(cell)) && isBlusteryWindS(getWindY(cell))) ch_printf_color(ch, "&GA blustery wind blows from the southeast.&D\r\n"); else if(isBlusteryWindE(getWindX(cell)) && isBlusteryWindN(getWindY(cell))) ch_printf_color(ch, "&GA blustery wind blows from the northeast.&D\r\n"); else if(isWindyWindE(getWindX(cell)) && isWindyWindS(getWindY(cell))) ch_printf_color(ch, "&GA strong steady wind howls from the southeast.&D\r\n"); else if(isWindyWindE(getWindX(cell)) && isWindyWindN(getWindY(cell))) ch_printf_color(ch, "&GA strong steady wind howls from the northeast.&D\r\n"); else if(isGustyWindE(getWindX(cell)) && isGustyWindS(getWindY(cell))) ch_printf_color(ch, ">he wind seems to be coming in gusts from the southeast.&D\r\n"); else if(isGustyWindE(getWindX(cell)) && isGustyWindN(getWindY(cell))) ch_printf_color(ch, ">he wind seems to be coming in gusts from the northeast.&D\r\n"); else if(isGaleForceWindE(getWindX(cell)) && isGaleForceWindS(getWindY(cell))) ch_printf_color(ch, "&GA gale force wind is tearing through the air from the southeast.&D\r\n"); else if(isGaleForceWindE(getWindX(cell)) && isGaleForceWindN(getWindY(cell))) ch_printf_color(ch, "&GA gale force wind is tearing through the air from the northeast.&D\r\n"); else if(isCalmWindW(getWindX(cell)) && isCalmWindS(getWindY(cell))) ch_printf_color(ch, "&GA calm wind brushes your skin from the southwest.&D\r\n"); else if(isCalmWindW(getWindX(cell)) && isCalmWindN(getWindY(cell))) ch_printf_color(ch, "&GA calm wind brushes your skin from the northwest.&D\r\n"); else if(isBreezyWindW(getWindX(cell)) && isBreezyWindS(getWindY(cell))) ch_printf_color(ch, "&GA steady breeze emanates from the southwest.&D\r\n"); else if(isBreezyWindW(getWindX(cell)) && isBreezyWindN(getWindY(cell))) ch_printf_color(ch, "&GA steady breeze emanates from the northwest.&D\r\n"); else if(isBlusteryWindW(getWindX(cell)) && isBlusteryWindS(getWindY(cell))) ch_printf_color(ch, "&GA blustery wind blows from the southwest.&D\r\n"); else if(isBlusteryWindW(getWindX(cell)) && isBlusteryWindN(getWindY(cell))) ch_printf_color(ch, "&GA blustery wind blows from the northwest.&D\r\n"); else if(isWindyWindW(getWindX(cell)) && isWindyWindS(getWindY(cell))) ch_printf_color(ch, "&GA strong steady wind howls from the southwest.&D\r\n"); else if(isWindyWindW(getWindX(cell)) && isWindyWindN(getWindY(cell))) ch_printf_color(ch, "&GA strong steady wind howls from the northwest.&D\r\n"); else if(isGustyWindW(getWindX(cell)) && isGustyWindS(getWindY(cell))) ch_printf_color(ch, ">he wind seems to be coming in gusts from the southwest.&D\r\n"); else if(isGustyWindW(getWindX(cell)) && isGustyWindN(getWindY(cell))) ch_printf_color(ch, ">he wind seems to be coming in gusts from the northwest.&D\r\n"); else if(isGaleForceWindW(getWindX(cell)) && isGaleForceWindS(getWindY(cell))) ch_printf_color(ch, "&GA gale force wind is tearing through the air from the southwest.&D\r\n"); else if(isGaleForceWindW(getWindX(cell)) && isGaleForceWindN(getWindY(cell))) ch_printf_color(ch, "&GA gale force wind is tearing through the air from the northwest.&D\r\n"); else ch_printf_color(ch, ">he wind is blowing in such a chaotic manner, You can't tell where it's coming from!&D\r\n"); } else if(getWindX(cell) != 0 && getWindY(cell) == 0) { if(isCalmWindE(getWindY(cell))) ch_printf_color(ch, "&GA calm wind brushes your skin from the east.&D\r\n"); else if(isBreezyWindE(getWindX(cell))) ch_printf_color(ch, "&GA steady breeze emanates from the east.&D\r\n"); else if(isBlusteryWindE(getWindX(cell))) ch_printf_color(ch, "&GA blustery wind blows from the east.&D\r\n"); else if(isWindyWindE(getWindX(cell))) ch_printf_color(ch, "&GA strong steady wind howls from the east.&D\r\n"); else if(isGustyWindE(getWindX(cell))) ch_printf_color(ch, ">he wind seems to be coming in gusts from the east.&D\r\n"); else if(isGaleForceWindE(getWindX(cell))) ch_printf_color(ch, "&GA gale force wind is tearing through the air from the east.&D\r\n"); else if(isCalmWindW(getWindY(cell))) ch_printf_color(ch, "&GA calm wind brushes your skin from the west.&D\r\n"); else if(isBreezyWindW(getWindY(cell))) ch_printf_color(ch, "&GA steady breeze emanates from the west.&D\r\n"); else if(isBlusteryWindW(getWindY(cell))) ch_printf_color(ch, "&GA blustery wind blows from the west.&D\r\n"); else if(isWindyWindW(getWindY(cell))) ch_printf_color(ch, "&GA strong steady wind howls from the west.&D\r\n"); else if(isGustyWindW(getWindY(cell))) ch_printf_color(ch, ">he wind seems to be coming in gusts from the west.&D\r\n"); else if(isGaleForceWindW(getWindY(cell))) ch_printf_color(ch, "&GA gale force wind is tearing through the air from the west.&D\r\n"); } else if(getWindX(cell) == 0 && getWindY(cell) != 0) { if(isCalmWindS(getWindY(cell))) ch_printf_color(ch, "&GA calm wind brushes your skin from the south.&D\r\n"); else if(isBreezyWindS(getWindY(cell))) ch_printf_color(ch, "&GA steady breeze emanates from the south.&D\r\n"); else if(isBlusteryWindS(getWindY(cell))) ch_printf_color(ch, "&GA blustery wind blows from the south.&D\r\n"); else if(isWindyWindS(getWindY(cell))) ch_printf_color(ch, "&GA strong steady wind howls from the south.&D\r\n"); else if(isGustyWindS(getWindY(cell))) ch_printf_color(ch, ">he wind seems to be coming in gusts from the south.&D\r\n"); else if(isGaleForceWindS(getWindY(cell))) ch_printf_color(ch, "&GA gale force wind is tearing through the air from the south.&D\r\n"); else if(isCalmWindN(getWindY(cell))) ch_printf_color(ch, "&GA calm wind brushes your skin from the north.&D\r\n"); else if(isBreezyWindN(getWindY(cell))) ch_printf_color(ch, "&GA steady breeze emanates from the north.&D\r\n"); else if(isBlusteryWindN(getWindY(cell))) ch_printf_color(ch, "&GA blustery wind blows from the north.&D\r\n"); else if(isWindyWindN(getWindY(cell))) ch_printf_color(ch, "&GA strong steady wind howls from the north.&D\r\n"); else if(isGustyWindN(getWindY(cell))) ch_printf_color(ch, ">he wind seems to be coming in gusts from the north.&D\r\n"); else if(isGaleForceWindN(getWindY(cell))) ch_printf_color(ch, "&GA gale force wind is tearing through the air from the north.&D\r\n"); } else ch_printf_color(ch, ">here doesn't seem to be any wind.\r\n"); if(getTemp(cell) > -30 && getTemp(cell) < 100) { if(isSwelteringHeat(getTemp(cell))) ch_printf_color(ch, "&OThe heat is almost unbearable.&D\r\n"); else if(isVeryHot(getTemp(cell))) ch_printf_color(ch, "&OIt's very hot...&D\r\n"); else if(isHot(getTemp(cell))) ch_printf_color(ch, "&OIt's hot...&D\r\n"); else if(isWarm(getTemp(cell))) ch_printf_color(ch, "&OIt seems to be a bit warm.&D\r\n"); else if(isTemperate(getTemp(cell))) ch_printf_color(ch, "&OThe temperature feels just right.&D\r\n"); else if(isCool(getTemp(cell))) ch_printf_color(ch, "&CIt seems to be a bit cool.&D\r\n"); else if(isChilly(getTemp(cell))) ch_printf_color(ch, "&CIt seems a bit chilly.&D\r\n"); else if(isCold(getTemp(cell))) ch_printf_color(ch, "&CIt's cold.&D\r\n"); else if(isFrosty(getTemp(cell))) ch_printf_color(ch, "&CThere is visible frost around.&D\r\n"); else if(isFreezing(getTemp(cell))) ch_printf_color(ch, "&CYour breath seems to crystalize before your face.&D\r\n"); else if(isReallyCold(getTemp(cell))) ch_printf_color(ch, "&CIt's really cold...&D\r\n"); else if(isVeryCold(getTemp(cell))) ch_printf_color(ch, "&CYou think you see ice forming on your clothes.&D\r\n"); else if(isExtremelyCold(getTemp(cell))) ch_printf_color(ch, "&CYou feel ice clinging to your skin. Get inside!&D\r\n"); } }