#include "astro.h"

Obj2*   objlst[] =
{
       &osun,
       &omoon,
       &oshad,
       &omerc,
       &ovenus,
       &omars,
       &ojup,
       &osat,
       &ouran,
       &onept,
       &oplut,
       &ocomet,
       0,
};

struct  idata
{
       char*   name;
       char*   name1;
       void    (*obj)(void);
} idata[] =
{
       "The sun",      "sun",          fsun,
       "The moon",     "moon",         moon,
       "The shadow",   "shadow",       shad,
       "Mercury",      "mercury",      merc,
       "Venus",        "venus",        venus,
       "Mars",         "mars",         mars,
       "Jupiter",      "jupiter",      jup,
       "Saturn",       "saturn",       sat,
       "Uranus",       "uranus",       uran,
       "Neptune",      "neptune",      nept,
       "Pluto",        "pluto",        plut,
       "Comet",        "comet",        comet,
};

void
init(void)
{
       Obj2 *q;
       int i;

       glat = nlat - (692.74*radsec)*sin(2.*nlat)
                + (1.16*radsec)*sin(4.*nlat);
       erad = .99832707e0 + .00167644e0*cos(2.*nlat)
                - 0.352e-5*cos(4.*nlat)
                + 0.001e-5*cos(6.*nlat)
                + 0.1568e-6*elev;

       for(i=0; q=objlst[i]; i++) {
               q->name = idata[i].name;
               q->name1 = idata[i].name1;
               q->obj = idata[i].obj;
       }
       ostar.obj = fstar;
       ostar.name = "star";
}

void
setime(double d)
{
       double x, xm, ym, zm;

       eday = d + deltat/86400.;
       wlong = awlong + 15.*deltat*radsec;

       capt = eday/36524.220e0;
       capt2 = capt*capt;
       capt3 = capt*capt2;
       nutate();
       eday += .1;
       sun();
       srad = rad;
       xm = rad*cos(beta)*cos(lambda);
       ym = rad*cos(beta)*sin(lambda);
       zm = rad*sin(beta);
       eday -= .1;
       sun();
       xms = rad*cos(beta)*cos(lambda);
       yms = rad*cos(beta)*sin(lambda);
       zms = rad*sin(beta);
       x = .057756;
       xdot = x*(xm-xms);
       ydot = x*(ym-yms);
       zdot = x*(zm-zms);
}

void
setobj(Obj1 *op)
{
       Obj1 *p;

       p = op;
       p->ra = ra;
       p->decl2 = decl2;
       p->semi2 = semi2;
       p->az = az;
       p->el = el;
       p->mag = mag;
}

long    starsao = 0;

void
fstar(void)
{

       ra = ostar.point[0].ra;
       decl2 = ostar.point[0].decl2;
       semi2 = ostar.point[0].semi2;
       az = ostar.point[0].az;
       el = ostar.point[0].el;
       mag = ostar.point[0].mag;
}

void
fsun(void)
{

       beta = 0;
       rad = 0;
       lambda = 0;
       motion = 0;
       helio();
       geo();
       seday = eday;
       salph = alpha;
       sdelt = delta;
       mag = lmb2;
}

void
shad(void)
{

       if(seday != eday)
               fsun();
       if(meday != eday)
               moon();
       alpha = fmod(salph+pi, pipi);
       delta = -sdelt;
       hp = mhp;
       semi = 1.0183*mhp/radsec - 969.85/srad;
       geo();
}