#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>
#include "mud.h"
#define NUM_DAYS 35
/* Match this to the number of days per month; this is the moon cycle */
#define NUM_MONTHS 17
/* Match this to the number of months defined in month_name[]. */
#define MAP_WIDTH 72
#define MAP_HEIGHT 8
/* Should be the string length and number of the constants below.*/
const char * star_map[] =
{
" C. C. g*",
" O: R* G* G. W* W. W. C. C. Y* Y. Y. ",
" O*. c. W.W. W. C. Y..Y. ",
"O.O. O. c. G..G. W: B* Y.",
" O. c. c. W. W. r* Y.",
" O.c. c. G. P.. W. p. Y. Y: ",
" c. G* P. P. p. p: Y. Y. ",
" b* P.: P* p.p: "
};
/****************** CONSTELLATIONS and STARS *****************************
Cygnus Mars Orion Dragon Cassiopeia Venus
Ursa Ninor Mercurius Pluto
Uranus Leo Crown Raptor
*************************************************************************/
const char * sun_map[] =
{
"\\`|'/",
"- O -",
"/.|.\\"
};
const char * moon_map[] =
{
" @@@ ",
"@@@@@",
" @@@ "
};
void look_sky ( CHAR_DATA * ch )
{
static char buf[MAX_STRING_LENGTH];
static char buf2[4];
int starpos, sunpos, moonpos, moonphase, i, linenum, precip;
pager_printf_color(ch,"You gaze up towards the heavens and see:\n\r");
precip = (ch->in_room->area->weather->precip + 3*weath_unit - 1)/
weath_unit;
if (precip > 1)
{
send_to_char("There are some clouds in the sky so you cannot see anything else.\n\r", ch);
return;
}
sunpos = (MAP_WIDTH * (24 - time_info.hour) / 24);
moonpos = (sunpos + time_info.day * MAP_WIDTH / NUM_DAYS) % MAP_WIDTH;
if ((moonphase = ((((MAP_WIDTH + moonpos - sunpos ) % MAP_WIDTH ) +
(MAP_WIDTH/16)) * 8 ) / MAP_WIDTH)
> 4) moonphase -= 8;
starpos = (sunpos + MAP_WIDTH * time_info.month / NUM_MONTHS) % MAP_WIDTH;
/* The left end of the star_map will be straight overhead at midnight during
month 0 */
for ( linenum = 0; linenum < MAP_HEIGHT; linenum++ )
{
if ((time_info.hour >= 6 && time_info.hour <= 18) &&
(linenum < 3 || linenum >= 6))
continue;
sprintf(buf," ");
/* for ( i = MAP_WIDTH/4; i <= 3*MAP_WIDTH/4; i++)*/
for ( i = 1; i <= MAP_WIDTH; i++)
{
/* plot moon on top of anything else...unless new moon & no eclipse */
if ((time_info.hour >= 6 && time_info.hour <= 18) /* daytime? */
&& (moonpos >= MAP_WIDTH/4 - 2) && (moonpos <= 3*MAP_WIDTH/4 + 2) /* in sky? */
&& ( i >= moonpos - 2 ) && (i <= moonpos + 2) /* is this pixel near moon? */
&& ((sunpos == moonpos && time_info.hour == 12) || moonphase != 0 ) /*no eclipse*/
&& (moon_map[linenum-3][i+2-moonpos] == '@'))
{
if ((moonphase < 0 && i - 2 - moonpos >= moonphase) ||
(moonphase > 0 && i + 2 - moonpos <= moonphase))
strcat(buf,"&W@");
else
strcat(buf," ");
}
else
if ((linenum >= 3) && (linenum < 6) && /* nighttime */
(moonpos >= MAP_WIDTH/4 - 2) && (moonpos <= 3*MAP_WIDTH/4 + 2) /* in sky? */
&& ( i >= moonpos - 2 ) && (i <= moonpos + 2) /* is this pixel near moon? */
&& (moon_map[linenum-3][i+2-moonpos] == '@'))
{
if ((moonphase < 0 && i - 2 - moonpos >= moonphase) ||
(moonphase > 0 && i + 2 - moonpos <= moonphase))
strcat(buf,"&W@");
else
strcat(buf," ");
}
else /* plot sun or stars */
{
if (time_info.hour>=6 && time_info.hour<=18) /* daytime */
{
if ( i >= sunpos - 2 && i <= sunpos + 2 )
{
sprintf(buf2,"&Y%c",sun_map[linenum-3][i+2-sunpos]);
strcat(buf,buf2);
}
else
strcat(buf," ");
}
else
{
switch (star_map[linenum][(MAP_WIDTH + i - starpos)%MAP_WIDTH])
{
default : strcat(buf," "); break;
case ':' : strcat(buf,":"); break;
case '.' : strcat(buf,"."); break;
case '*' : strcat(buf,"*"); break;
case 'G' : strcat(buf,"&G "); break;
case 'g' : strcat(buf,"&g "); break;
case 'R' : strcat(buf,"&R "); break;
case 'r' : strcat(buf,"&r "); break;
case 'C' : strcat(buf,"&C "); break;
case 'O' : strcat(buf,"&O "); break;
case 'B' : strcat(buf,"&B "); break;
case 'P' : strcat(buf,"&P "); break;
case 'W' : strcat(buf,"&W "); break;
case 'b' : strcat(buf,"&b "); break;
case 'p' : strcat(buf,"&p "); break;
case 'Y' : strcat(buf,"&Y "); break;
case 'c' : strcat(buf,"&c "); break;
}
}
}
}
strcat(buf,"\n\r");
pager_printf_color(ch,buf);
}
}