#include "kernel.h"
#include "locations.h"
#include "stdinc.h"
CALENDAR calendar;
int temp_seed;
char old_weather;
static void _update_calendar (void);
static Boolean cold_weather (int loc);
static Boolean night_weather (void);
static void advance_weather (void);
static void announce_weather (void);
static void tell_weather (int user);
char *Weather[] =
{
"sunny",
"rainy",
"cloudy",
"clearing",
"stormy"
};
char *c_seasons[] =
{
"spring",
"summer",
"autumn",
"winter"
};
char *c_modifiers[] =
{
"an early-",
"a ",
"a late-"
};
char *c_day[] =
{
"morning",
"day",
"afternoon",
"evening",
"night"
};
void init_calendar (void)
{
calendar.season = 0;
calendar.daytime = 0;
calendar.daycount = 0;
calendar.modifier = 1;
}
void update_calendar (void)
{
_update_calendar ();
compute_environment ();
}
static void _update_calendar (void)
{
/* start with day, work up to season */
#ifdef MALLOC_DEBUG
mnem_writestats ();
#endif
if (calendar.daytime != NIGHT)
{
calendar.daytime++;
}
else
{
calendar.daytime = MORNING; /* new day */
}
switch (calendar.daytime)
{
case MORNING:
broad_realtime ("The &+Bsky&* &+Wlightens&* as the &+Ysun&* rises slowly in the east.\n");
break;
case EVENING:
broad_realtime ("The &+Ysun&* begins to sink below the western &+Rhorizon.&*\n");
break;
case NIGHT:
broad_realtime ("The &+Ysun&* sets and &+Ldarkness&* befalls the realm.\n");
break;
default:;
}
if (calendar.daytime)
{
return;
}
/* day has ended.. make a new random seed */
temp_seed = 0;
if (randperc () < 50)
{
temp_seed += randperc () % 7;
}
else
{
temp_seed -= randperc () % 7;
}
if (calendar.daycount != MONTH_DAYCOUNT)
{
calendar.daycount++;
}
else
{
calendar.daycount = 0;
}
if (calendar.daycount)
{
return;
}
/* 1 modifier has ended */
if (calendar.modifier != LATE_SEASON)
{
calendar.modifier++;
}
else
{
calendar.modifier = EARLY_SEASON;
}
if (calendar.modifier)
{
return;
}
/* one season has ended */
if (calendar.season != WINTER)
{
calendar.season++;
}
else
{
calendar.season = SPRING;
}
switch (calendar.season)
{
case WINTER:
broad_realtime ("A brisk wind cuts through you as &+WW&+Bi&+Wn&+Bt&+We&+Br&* arrives.\n");
break;
case SUMMER:
broad_realtime ("The &+YSummer Solstice&* arrives as the days seem longer.\n");
break;
case SPRING:
broad_realtime ("The air fills with the songs of birds as &+GSpring&* "
"arrives.\n");
break;
case AUTUMN:
broad_realtime ("The air cools and the leaves change colour as &+yA&+ru&+yt&+ru&+ym&+rn&* "
"arrives.\n");
break;
}
if (calendar.season)
{
return;
}
/* one year done! */
calendar.season = SPRING;
calendar.daytime = MORNING;
calendar.daycount = 0;
calendar.modifier = EARLY_SEASON;
}
void compute_environment (void)
{
int temp;
Boolean sign = False;
temp = 0;
if (randperc () < 50)
{
sign = True;
}
if (calendar.daytime == NIGHT)
{
calendar.light = False;
}
else
{
calendar.light = True;
}
/* using celsius temperatures */
switch (calendar.season)
{
case SPRING:
switch (calendar.modifier)
{
case EARLY_SEASON:
temp = SPRING_E_SEASON;
break;
case MID_SEASON:
temp = SPRING_M_SEASON;
break;
case LATE_SEASON:
temp = SPRING_L_SEASON;
break;
}
break;
case SUMMER:
switch (calendar.modifier)
{
case EARLY_SEASON:
temp = SUMMER_E_SEASON;
break;
case MID_SEASON:
temp = SUMMER_M_SEASON;
break;
case LATE_SEASON:
temp = SUMMER_L_SEASON;
break;
}
break;
case AUTUMN:
switch (calendar.modifier)
{
case EARLY_SEASON:
temp = AUTUMN_E_SEASON;
break;
case MID_SEASON:
temp = AUTUMN_M_SEASON;
break;
case LATE_SEASON:
temp = AUTUMN_L_SEASON;
break;
}
break;
case WINTER:
switch (calendar.modifier)
{
case EARLY_SEASON:
temp = WINTER_E_SEASON;
break;
case MID_SEASON:
temp = WINTER_M_SEASON;
break;
case LATE_SEASON:
temp = WINTER_L_SEASON;
break;
}
break;
}
/* adjust for time of day */
switch (calendar.daytime)
{
case MORNING:
temp T_MORNING;
break;
case DAY:
temp T_DAY;
break;
case AFTERNOON:
temp T_AFTERNOON;
break;
case EVENING:
break;
case NIGHT:
temp T_NIGHT;
break;
}
temp += temp_seed;
/* if it is raining, change temp a bit */
if (the_world->w_weather == RAIN || the_world->w_weather == STORMY)
{
temp T_RAIN;
}
calendar.temp = temp;
}
/* change calendar settings */
void calendarcom (void)
{
register int t;
if (plev (mynum) < LVL_ARCHWIZARD)
{
erreval ();
return;
}
if (EMPTY (item1))
{
bprintf ("Usage: calendar [newsetting]\n");
return;
}
/* change weather */
for (t = SPRING; t != (WINTER + 1); t++)
if (strncasecmp (Weather[t], item1, strlen (item1)) == 0)
{
the_world->w_weather = t;
send_msg (DEST_ALL, MODE_QUIET | MODE_COLOR, LVL_APPREN,
LVL_MAX, NOBODY, NOBODY,
"[%s has changed weather to %s]\n",
pname (mynum), Weather[t]);
compute_environment ();
return;
}
/* change season */
for (t = SPRING; t != (WINTER + 1); t++)
if (strncasecmp (c_seasons[t], item1, strlen (item1)) == 0)
{
calendar.season = t;
sendf (DEST_ALL, "Season changed to %s.\n", c_seasons[t]);
send_msg (DEST_ALL, MODE_QUIET | MODE_COLOR, LVL_APPREN,
LVL_MAX, NOBODY, NOBODY,
"[%s has changed season to %s]\n",
pname (mynum), c_seasons[t]);
compute_environment ();
return;
}
/* change daytime */
for (t = MORNING; t != (NIGHT + 1); t++)
if (strncasecmp (c_day[t], item1, strlen (item1)) == 0)
{
calendar.daytime = t;
sendf (DEST_ALL, "Daytime changed to %s.\n", c_day[t]);
send_msg (DEST_ALL, MODE_QUIET | MODE_COLOR, LVL_APPREN,
LVL_MAX, NOBODY, NOBODY,
"[%s has changed daytime to %s]\n",
pname (mynum), c_day[t]);
compute_environment ();
return;
}
bprintf ("Don't know how to modify that in the calendar.\n");
return;
}
/* send a message to anyone subject to RealTime */
void broad_realtime (char *txt)
{
register int t;
for (t = 0; t < max_players; t++)
{
/*
if (EMPTY (pname (t)))
{
continue;
}
Bad bad bad!
*/
if(!is_in_game(t)) continue;
if (!ltstflg (ploc (t), LFL_REALTIME) || ststflg (t, SFL_QUIET))
{
continue;
}
sendf (t, txt);
}
return;
}
void weather (void)
{
advance_weather ();
announce_weather ();
}
static void advance_weather (void)
{
int t;
old_weather = the_world->w_weather;
switch (old_weather)
{
case SUNNY:
if (randperc () < 50)
return; /* more sunny */
the_world->w_weather = CLOUDY; /* clouds */
break;
case CLOUDY:
t = randperc ();
if (t < 15)
return; /* more rain */
if (t < 40)
{
the_world->w_weather = STORMY; /* storm */
}
else
{
the_world->w_weather = RAINY; /* rain */
}
break;
case RAINY:
if (randperc () > 60)
{
return; /* more rain */
}
the_world->w_weather = CLEARING; /* clearing */
break;
case STORMY:
if (randperc () < 15)
{
return; /* more storm */
}
the_world->w_weather = CLEARING; /* clearing */
break;
case CLEARING:
t = randperc ();
if (t < 20)
{
return; /* more clearing */
if (t < 60)
{
the_world->w_weather = RAINY; /* rain */
}
else
{
the_world->w_weather = SUNNY; /* sunny */
}
}
}
}
/* sends a message to all users (calls tell_weather) */
static void announce_weather ()
{
register int t;
if (the_world->w_weather == old_weather)
{
return; /* no change */
}
for (t = 0; t < max_players; t++)
{
if (is_in_game (t))
{
tell_weather (t);
}
}
}
/* sends the weather to a particular user */
static void tell_weather (int user)
{
if (!ltstflg (ploc (user), LFL_OUTDOORS) || ststflg (user, SFL_QUIET))
{
return;
}
switch (the_world->w_weather)
{
case SUNNY:
sendf (user, "The world around you &+Wbrightens&* a bit as the %s comes out "
"of the clouds.\n",
night_weather ()? "&+Ymoon&*" : "&+Ysun&*");
break;
case RAINY:
if (cold_weather (ploc (user)))
{
sendf (user, "A few light &+Ws&+wn&+Wo&+ww&* &+Wf&+wl&+Wu&+wr&+Wr&+wi&+We&+ws&* tumble to the ground.\n");
}
else
{
sendf (user, "A light &+Crain&* falls gently upon the land.\n");
}
break;
case STORMY:
if (cold_weather (ploc (user)))
{
sendf (user, "You trudge onward through the heavy &+Ws&+wn&+Wo&+ww&+Ws&*.\n");
}
else
{
sendf (user, "There is a loud &+Rcrash&* as the sky fills with &+Wlightning&*.\n");
}
break;
case CLEARING:
sendf (user, "The &+Cc&+Wl&+Co&+Wu&+Cd&+Ws&* begin to dissipate%s.\n",
night_weather ()? ", revealing a stunning night sky" : "");
break;
case CLOUDY:
sendf (user, "&+LDark storm clouds&* begin to roll in.\n");
break;
}
}
char test_temp (void)
{
int t = ploc (mynum);
if (cold_weather (t))
{
return (ISCOLD);
}
return (ISNORMAL);
}
/* this function does not account for levels */
Boolean is_real_dark (void)
{
if (calendar.daytime == NIGHT)
{
return (True);
}
return (False);
}
static Boolean night_weather ()
{
if (calendar.daytime == 3 || calendar.daytime == 4)
{
return (True);
}
return (False);
}
/* Give a description of the weather when walking into a room. */
void show_weather ()
{
if (!ltstflg (ploc (mynum), LFL_OUTDOORS))
{
return;
}
switch (the_world->w_weather)
{
case RAIN:
if (cold_weather (ploc (mynum)))
{
bprintf ("&+WS&+wn&+Wo&+ww&* flurries are falling gently from the sky.\n");
}
else
{
bprintf ("A gentle &+Crain&* is falling, making the ground soft and muddy.\n");
}
break;
case STORMY:
if (cold_weather (ploc (mynum)))
{
bprintf ("You shiver as you trudge on through the &+Wblizzard&*.\n");
}
else
{
bprintf ("There are &+Lhuge, dark storm clouds&* in the sky above.\n");
}
break;
default:;
}
}
char *short_weather ()
{
int c = cold_weather (ploc (mynum));
switch (the_world->w_weather)
{
case RAINY:
return (c ? "It is &+Wsnowing&* and" : "It is &+Craining&* and");
break;
case STORMY:
return (c ? "You are in a &+Wblizzard&* and the weather is" :
"It is storming and the weather is");
break;
case SUNNY:
return ("The sky is &+Wclear&* and the weather is");
break;
case CLOUDY:
return ("The &+Csky&* is cloudy and the weather is");
break;
case CLEARING:
return ("The &+Csky&* is beginning to clear and the weather is");
break;
}
return("The weather just IS.");
}
char *wthr_type (int type)
{
static char b[20];
switch (type)
{
case 0:
sprintf (b, "&+Ysunny&*");
break;
case 1:
sprintf (b, "&+Crainy&*");
break;
case 2:
sprintf (b, "&+Ccloudy&*");
break;
case 3:
sprintf (b, "&+Wclearing&*");
break;
case 4:
sprintf (b, "&+Lstormy&*");
break;
}
return (b);
}
static Boolean cold_weather (int loc)
{
if ((xlflags (loc) & LFL_T_MASK) == LFL_COLD)
{
return (True);
}
/* if REALTIME and less than 4 deg celsius, it is cold */
if (ltstflg (loc, LFL_REALTIME) && calendar.temp < 4)
{
return (True);
}
return (False);
}
char *real_light_state (int loc)
{
static char b[15];
if (is_real_dark ())
{
sprintf (b, "&+LNightTime&*");
}
else
{
sprintf (b, "&+CDayLight&*");
}
return b;
}
char *real_temp_state (int loc)
{
static char b[15];
compute_environment ();
if ((xlflags (loc) & LFL_T_MASK) == LFL_COLD)
{
sprintf (b, "&+cVery Cold&*");
}
else if ((xlflags (loc) & LFL_T_MASK) == LFL_HOT)
{
sprintf (b, "&+RVery Hot&*");
}
else
{
if (calendar.temp > 30)
{
sprintf (b, "&+RVery Hot&*");
}
else if (calendar.temp > 24)
{
sprintf (b, "&+RHot&*");
}
else if (calendar.temp > 18)
{
sprintf (b, "&+yWarm&*");
}
else if (calendar.temp > 10)
{
sprintf (b, "&+CCool&*");
}
else if (calendar.temp > 5)
{
sprintf (b, "&+CCold&*");
}
else
{
sprintf (b, "&+cVery Cold&*");
}
}
return b;
}