179 lines
4.2 KiB
C
179 lines
4.2 KiB
C
|
/* ************************************************************************
|
||
|
* File: weather.c Part of CircleMUD *
|
||
|
* Usage: functions handling time and the weather *
|
||
|
* *
|
||
|
* All rights reserved. See license.doc for complete information. *
|
||
|
* *
|
||
|
* Copyright (C) 1993, 94 by the Trustees of the Johns Hopkins University *
|
||
|
* CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. *
|
||
|
************************************************************************ */
|
||
|
|
||
|
#include "conf.h"
|
||
|
#include "sysdep.h"
|
||
|
|
||
|
|
||
|
#include "structs.h"
|
||
|
#include "utils.h"
|
||
|
#include "comm.h"
|
||
|
#include "handler.h"
|
||
|
#include "interpreter.h"
|
||
|
#include "db.h"
|
||
|
|
||
|
extern struct time_info_data time_info;
|
||
|
|
||
|
void weather_and_time(int mode);
|
||
|
void another_hour(int mode);
|
||
|
void weather_change(void);
|
||
|
|
||
|
|
||
|
void weather_and_time(int mode)
|
||
|
{
|
||
|
another_hour(mode);
|
||
|
if (mode)
|
||
|
weather_change();
|
||
|
}
|
||
|
|
||
|
|
||
|
void another_hour(int mode)
|
||
|
{
|
||
|
time_info.hours++;
|
||
|
|
||
|
if (mode) {
|
||
|
switch (time_info.hours) {
|
||
|
case 5:
|
||
|
weather_info.sunlight = SUN_RISE;
|
||
|
send_to_outdoor("The sun rises in the east.\r\n");
|
||
|
break;
|
||
|
case 6:
|
||
|
weather_info.sunlight = SUN_LIGHT;
|
||
|
send_to_outdoor("The day has begun.\r\n");
|
||
|
break;
|
||
|
case 21:
|
||
|
weather_info.sunlight = SUN_SET;
|
||
|
send_to_outdoor("The sun slowly disappears in the west.\r\n");
|
||
|
break;
|
||
|
case 22:
|
||
|
weather_info.sunlight = SUN_DARK;
|
||
|
send_to_outdoor("The night has begun.\r\n");
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
if (time_info.hours > 23) { /* Changed by HHS due to bug ??? */
|
||
|
time_info.hours -= 24;
|
||
|
time_info.day++;
|
||
|
|
||
|
if (time_info.day > 34) {
|
||
|
time_info.day = 0;
|
||
|
time_info.month++;
|
||
|
|
||
|
if (time_info.month > 16) {
|
||
|
time_info.month = 0;
|
||
|
time_info.year++;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void weather_change(void)
|
||
|
{
|
||
|
int diff, change;
|
||
|
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;
|
||
|
}
|
||
|
|
||
|
switch (change) {
|
||
|
case 0:
|
||
|
break;
|
||
|
case 1:
|
||
|
send_to_outdoor("The sky starts to get cloudy.\r\n");
|
||
|
weather_info.sky = SKY_CLOUDY;
|
||
|
break;
|
||
|
case 2:
|
||
|
send_to_outdoor("It starts to rain.\r\n");
|
||
|
weather_info.sky = SKY_RAINING;
|
||
|
break;
|
||
|
case 3:
|
||
|
send_to_outdoor("The clouds disappear.\r\n");
|
||
|
weather_info.sky = SKY_CLOUDLESS;
|
||
|
break;
|
||
|
case 4:
|
||
|
send_to_outdoor("Lightning starts to show in the sky.\r\n");
|
||
|
weather_info.sky = SKY_LIGHTNING;
|
||
|
break;
|
||
|
case 5:
|
||
|
send_to_outdoor("The rain stops.\r\n");
|
||
|
weather_info.sky = SKY_CLOUDY;
|
||
|
break;
|
||
|
case 6:
|
||
|
send_to_outdoor("The lightning stops.\r\n");
|
||
|
weather_info.sky = SKY_RAINING;
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
}
|