/* * 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", ¤t_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); }