wileymud-1.187b/
wileymud-1.187b/attic/
wileymud-1.187b/attic/bin/
wileymud-1.187b/attic/lib/
wileymud-1.187b/attic/lib/adm/
wileymud-1.187b/attic/lib/man/
wileymud-1.187b/attic/lib/new-wld/
wileymud-1.187b/attic/lib/new-wld/default/
wileymud-1.187b/attic/lib/old/
wileymud-1.187b/attic/lib/wld/
wileymud-1.187b/attic/public_html/
wileymud-1.187b/attic/public_html/gfx/
wileymud-1.187b/attic/src/bin/
wileymud-1.187b/attic/src/etc/
wileymud-1.187b/attic/src/libauth-4.0-p5/
wileymud-1.187b/attic/src/sedna/
wileymud-1.187b/backups/
wileymud-1.187b/bin/
wileymud-1.187b/docs/
wileymud-1.187b/etc/
wileymud-1.187b/lib/
wileymud-1.187b/lib/adm/
wileymud-1.187b/lib/boards/
wileymud-1.187b/lib/log/
wileymud-1.187b/lib/man/
wileymud-1.187b/lib/ply/
wileymud-1.187b/lib/ply/a/
wileymud-1.187b/lib/ply/b/
wileymud-1.187b/lib/ply/c/
wileymud-1.187b/lib/ply/d/
wileymud-1.187b/lib/ply/g/
wileymud-1.187b/lib/ply/k/
wileymud-1.187b/lib/ply/m/
wileymud-1.187b/lib/ply/s/
wileymud-1.187b/lib/ply/t/
wileymud-1.187b/public_html/gfx/
wileymud-1.187b/src/bin/
wileymud-1.187b/src/convert/attic/
wileymud-1.187b/src/convert/obj/
wileymud-1.187b/src/convert/perl/
wileymud-1.187b/src/convert/perl/MudConvert/
wileymud-1.187b/src/convert/perl/MudConvert/DUMP/
wileymud-1.187b/src/convert/perl/MudConvert/Report/
wileymud-1.187b/src/convert/perl/MudConvert/WileyMUD/
wileymud-1.187b/src/convert/perl/output/
wileymud-1.187b/src/convert/perl/output/DUMP/
wileymud-1.187b/src/convert/perl/output/Report/
wileymud-1.187b/src/convert/perl/output/WileyMUD/
wileymud-1.187b/src/etc/
wileymud-1.187b/src/etc/init.d/
wileymud-1.187b/src/etc/rc.d/
wileymud-1.187b/src/etc/rc.d/init.d/
wileymud-1.187b/src/lib/
wileymud-1.187b/src/lib/adm/
wileymud-1.187b/src/lib/boards/
wileymud-1.187b/src/lib/log/
wileymud-1.187b/src/lib/man/
wileymud-1.187b/src/lib/ply/
wileymud-1.187b/src/lib/ply/a/
wileymud-1.187b/src/lib/ply/b/
wileymud-1.187b/src/lib/ply/c/
wileymud-1.187b/src/lib/ply/d/
wileymud-1.187b/src/lib/ply/e/
wileymud-1.187b/src/lib/ply/f/
wileymud-1.187b/src/lib/ply/g/
wileymud-1.187b/src/lib/ply/h/
wileymud-1.187b/src/lib/ply/i/
wileymud-1.187b/src/lib/ply/j/
wileymud-1.187b/src/lib/ply/k/
wileymud-1.187b/src/lib/ply/l/
wileymud-1.187b/src/lib/ply/m/
wileymud-1.187b/src/lib/ply/n/
wileymud-1.187b/src/lib/ply/o/
wileymud-1.187b/src/lib/ply/p/
wileymud-1.187b/src/lib/ply/q/
wileymud-1.187b/src/lib/ply/r/
wileymud-1.187b/src/lib/ply/s/
wileymud-1.187b/src/lib/ply/t/
wileymud-1.187b/src/lib/ply/u/
wileymud-1.187b/src/lib/ply/v/
wileymud-1.187b/src/lib/ply/w/
wileymud-1.187b/src/lib/ply/x/
wileymud-1.187b/src/lib/ply/y/
wileymud-1.187b/src/lib/ply/z/
wileymud-1.187b/src/obj/
wileymud-1.187b/src/utils/
wileymud-1.187b/src/utils/mobmaker/
/*
 * file: weather.c , Weather and time module              Part of DIKUMUD
 * Usage: Performing the clock and the weather
 * Copyright (C) 1990, 1991 - see 'license.doc' for complete information.
 */

#include <stdio.h>
#include <stdlib.h>
/* #include <unistd.h> */
#include <sys/types.h>
#include <time.h>
#include <string.h>

#include "global.h"
#include "bug.h"
#include "utils.h"
#include "comm.h"
#include "handler.h"
#include "interpreter.h"
#include "db.h"
#define _WEATHER_C
#include "weather.h"

const char                             *moon_names[] = {
    "new",
    "waxing cresent",
    "waxing half",
    "waxing gibbus",
    "full",
    "waning gibbus",
    "waning half",
    "waning cresent"
};

void weather_and_time(int mode)
{
    if (DEBUG > 3)
	log_info("called %s with %d", __PRETTY_FUNCTION__, mode);

    another_hour(mode);
    if (mode)
	weather_change();
    if (time_info.hours == TIME_NOON || time_info.hours == TIME_MIDNIGHT)
	update_time_and_weather();
}

void another_hour(int mode)
{
    if (DEBUG > 2)
	log_info("called %s with %d", __PRETTY_FUNCTION__, mode);

    time_info.hours++;
    if (time_info.hours >= HOURS_PER_MUD_DAY) {
	time_info.hours = 0;
	time_info.day++;
	weather_info.moon++;
	if (weather_info.moon > MAX_MOON_PHASES)
	    weather_info.moon = 1;

	if (time_info.day >= DAYS_PER_MUD_MONTH) {
	    time_info.day = 0;
	    time_info.month++;
	    GetMonth(time_info.month);

	    if (time_info.month >= MONTHS_PER_MUD_YEAR) {
		time_info.month = 0;
		time_info.year++;
	    }
	}
    }
    if (mode) {
	switch (time_info.hours) {
	    case 0:
		oprintf("The moon rises high overhead.\r\n");
		break;
	    case 4:
		oprintf("The moon sets.\r\n");
		break;
	    case 6:
		weather_info.sunlight = SUN_RISE;
		oprintf("The sun rises in the east.\r\n");
		break;
	    case 7:
		weather_info.sunlight = SUN_LIGHT;
		oprintf("The day has begun.\r\n");
		break;
	    case 12:
		oprintf("It is noon.\r\n");
		break;
	    case 18:
		weather_info.sunlight = SUN_SET;
		oprintf("The sun slowly disappears in the west.\r\n");
		break;
	    case 19:
		weather_info.sunlight = SUN_DARK;
		oprintf("The night has begun.\r\n");
		break;
	    case 21:
		oprintf("A %s moon rises in the eastern sky.\r\n",
			moon_names[(weather_info.moon - 1) / 4]);
		break;
	    default:
		break;
	}
    }
}

void weather_change(void)
{
    int                                     diff = 0;
    int                                     change = 0;

    if (DEBUG > 2)
	log_info("called %s with no arguments", __PRETTY_FUNCTION__);

    if ((time_info.month >= 9) && (time_info.month <= 16))
	diff = (weather_info.pressure > 985 ? -2 : 2);
    else
	diff = (weather_info.pressure > 1015 ? -2 : 2);

    weather_info.change += (dice(1, 4) * diff + dice(2, 6) - dice(2, 6));
    weather_info.change = MIN(weather_info.change, 12);
    weather_info.change = MAX(weather_info.change, -12);
    weather_info.pressure += weather_info.change;
    weather_info.pressure = MIN(weather_info.pressure, 1040);
    weather_info.pressure = MAX(weather_info.pressure, 960);
    change = 0;

    switch (weather_info.sky) {
	case SKY_CLOUDLESS:
	    {
		if (weather_info.pressure < 990)
		    change = 1;
		else if (weather_info.pressure < 1010)
		    if (dice(1, 4) == 1)
			change = 1;
		break;
	    }
	case SKY_CLOUDY:
	    {
		if (weather_info.pressure < 970)
		    change = 2;
		else if (weather_info.pressure < 990)
		    if (dice(1, 4) == 1)
			change = 2;
		    else
			change = 0;
		else if (weather_info.pressure > 1030)
		    if (dice(1, 4) == 1)
			change = 3;
	    }
	    break;
	case SKY_RAINING:
	    {
		if (weather_info.pressure < 970)
		    if (dice(1, 4) == 1)
			change = 4;
		    else
			change = 0;
		else if (weather_info.pressure > 1030)
		    change = 5;
		else if (weather_info.pressure > 1010)
		    if (dice(1, 4) == 1)
			change = 5;
	    }
	    break;
	case SKY_LIGHTNING:
	    {
		if (weather_info.pressure > 1010)
		    change = 6;
		else if (weather_info.pressure > 990)
		    if (dice(1, 4) == 1)
			change = 6;
	    }
	    break;
	default:
	    {
		change = 0;
		weather_info.sky = SKY_CLOUDLESS;
	    }
	    break;
    }
    ChangeWeather(change);
}

void ChangeWeather(int change)
{
    if (DEBUG > 2)
	log_info("called %s with %d", __PRETTY_FUNCTION__, change);

    if (change < 0)
	change = 0;
    if (change > 7)
	change = 6;

    switch (change) {
	case 0:
	    break;
	case 1:
	    {
		oprintf("The sky is getting cloudy.\r\n");
		weather_info.sky = SKY_CLOUDY;
		break;
	    }
	case 2:
	    {
		if ((time_info.month > 3) && (time_info.month < 14))
		    oprintf("It starts to rain.\r\n");
		else
		    oprintf("It starts to drizzle. \r\n");
		weather_info.sky = SKY_RAINING;
		break;
	    }
	case 3:
	    {
		oprintf("The clouds disappear.\r\n");
		weather_info.sky = SKY_CLOUDLESS;
		break;
	    }
	case 4:
	    {
		if ((time_info.month > 3) && (time_info.month < 14))
		    oprintf("You are caught in lightning storm.\r\n");
		else
		    oprintf("You are caught in a layer of fog. \r\n");
		weather_info.sky = SKY_LIGHTNING;
		break;
	    }
	case 5:
	    {
		if ((time_info.month > 3) && (time_info.month < 14))
		    oprintf("The rain has stopped.\r\n");
		else
		    oprintf("The drizzle has stopped. \r\n");
		weather_info.sky = SKY_CLOUDY;
		break;
	    }
	case 6:
	    {
		if ((time_info.month > 3) && (time_info.month < 14))
		    oprintf("The lightning has gone, but it is still raining.\r\n");
		else
		    oprintf("The fog has lifted, but it is still drizzling.\r\n");
		weather_info.sky = SKY_RAINING;
		break;
	    }
	default:
	    break;
    }
}

void GetMonth(int month)
{
    if (DEBUG > 2)
	log_info("called %s with %d", __PRETTY_FUNCTION__, month);

    if (month < 0)
	return;

    switch (month) {
	case 0:
	case 1:
	    oprintf(" It is bitterly cold outside\r\n");
	    break;
	case 2:
	    oprintf(" It is very cold \r\n");
	    break;
	case 3:
	case 4:
	    oprintf(" It is chilly outside \r\n");
	    break;
	case 5:
	    oprintf(" The flowers start to bloom \r\n");
	    break;
	case 6:
	case 7:
	case 8:
	case 9:
	case 10:
	case 11:
	    oprintf(" It is warm and humid. \r\n");
	    break;
	case 12:
	    oprintf(" It starts to get a little windy \r\n");
	    break;
	case 13:
	    oprintf(" The air is getting chilly \r\n");
	    break;
	case 14:
	    oprintf(" The leaves start to change colors. \r\n");
	    break;
	case 15:
	    oprintf(" It starts to get cold \r\n");
	    break;
	case 16:
	case 17:
	    oprintf(" It is bitterly cold outside \r\n");
	    break;
    }
}

void reset_weather(void)
{
    if (DEBUG > 3)
	log_info("called %s with no arguments", __PRETTY_FUNCTION__);

    weather_info.pressure = 960;
    weather_info.change = 0;
    weather_info.sky = SKY_CLOUDLESS;
    weather_info.wind_speed = 0;
    weather_info.wind_direction = WIND_DEAD;
}

void reset_time(void)
{
    FILE                                   *f1 = NULL;
    char                                    buf[80] = "\0\0\0\0\0\0\0";
    long                                    beginning_of_time = 650336715;	/* Fri Aug 10 21:05:15 1990 */
    long                                    current_time = 0L;

    if (DEBUG > 2)
	log_info("called %s with no arguments", __PRETTY_FUNCTION__);

    /*
     * struct time_info_data mud_time_passed(time_t t2, time_t t1); 
     */

    if (!(f1 = fopen(TIME_FILE, "r"))) {
	log_info("Reset Time: Time file does not exist!\n");
	time_info = mud_time_passed(time(0), beginning_of_time);
	reset_weather();
    } else {
	fgets(buf, 80, f1);
	fscanf(f1, "%ld\n", &current_time);
	fscanf(f1, "%d\n", &time_info.hours);
	fscanf(f1, "%d\n", &time_info.day);
	fscanf(f1, "%d\n", &time_info.month);
	fscanf(f1, "%d\n", &time_info.year);
	fgets(buf, 80, f1);
	fscanf(f1, "%d\n", &weather_info.pressure);
	fscanf(f1, "%d\n", &weather_info.change);
	fscanf(f1, "%d\n", &weather_info.sky);
	fscanf(f1, "%d\n", &weather_info.sunlight);
	fscanf(f1, "%d\n", &weather_info.wind_speed);
	fscanf(f1, "%d\n", &weather_info.wind_direction);
	fscanf(f1, "%d\n", &weather_info.moon);
	FCLOSE(f1);
    }

    weather_and_time(1);

    log_info("   Current Gametime: %dH %dD %dM %dY.",
	     time_info.hours, time_info.day, time_info.month, time_info.year);
}

void update_time_and_weather(void)
{
    FILE                                   *f1 = NULL;
    long                                    current_time = 0L;

    if (DEBUG > 2)
	log_info("called %s with no arguments", __PRETTY_FUNCTION__);

    if (!(f1 = fopen(TIME_FILE, "w"))) {
	log_error("update time");
	return;
    }
    current_time = time(0);
    log_info("Time update.");
    fprintf(f1, "# Time -last,hours,day,month,year\n");
    fprintf(f1, "%ld\n", current_time);
    fprintf(f1, "%d\n", time_info.hours);
    fprintf(f1, "%d\n", time_info.day);
    fprintf(f1, "%d\n", time_info.month);
    fprintf(f1, "%d\n", time_info.year);
    log_info("Weather update.");
    fprintf(f1, "# Weather -pressure,change,sky,sunlight,windspeed,direction\n");
    fprintf(f1, "%d\n", weather_info.pressure);
    fprintf(f1, "%d\n", weather_info.change);
    fprintf(f1, "%d\n", weather_info.sky);
    fprintf(f1, "%d\n", weather_info.sunlight);
    fprintf(f1, "%d\n", weather_info.wind_speed);
    fprintf(f1, "%d\n", weather_info.wind_direction);
    fprintf(f1, "%d\n", weather_info.moon);
    FCLOSE(f1);
}