/* 
Copyright notice:

This is mine.  I'm only letting you use it.  Period.  Feel free to rip off
any of the code you see fit, but have the courtesy to give me credit.
Otherwise great hairy beasties will rip your eyes out and eat your flesh
when you least expect it.

Jonny Goldman <jonathan@think.com>

Wed May  8 1991
*/

/* main.c -- create our windows and initialize things. */

#define MAIN
#include "vaders.h"
#include <X11/Xaw/Form.h>
#ifndef X11R3
#include <X11/Xaw/Label.h>
#else
#include <X11/IntrinsicP.h>
#include <X11/Label.h>
#endif
static int width, height;		/* Size of window. */
#ifdef SVR4
#define srandom		srand
#endif

#ifdef XFILESEARCHPATH
static void AddPathToSearchPath();
#endif

static XrmOptionDescRec table[] = {
    {"-debug",	"*debug",	XrmoptionNoArg,	NULL},
};

static XtResource resources[] = {
    {XtNwidth, XtCWidth, XtRInt, sizeof(int),
	 (Cardinal)&width, XtRImmediate, (caddr_t) VWIDTH},
    {XtNheight, XtCHeight, XtRInt, sizeof(int),
	 (Cardinal)&height, XtRImmediate, (caddr_t) VHEIGHT},
    {"debug", "Debug", XtRBoolean, sizeof(Boolean),
	 (Cardinal)&debug, XtRString, "off"},
    {"font", "Font", XtRString, sizeof(String),
	 (Cardinal)&vaderfont, XtRString, (String)"9x15"},
    {"scale", "Scale", XtRInt, sizeof(int),
	 (Cardinal)&scale, XtRImmediate, (caddr_t) 2},
    {"basewait", "BaseWait", XtRInt, sizeof(int),
	 (Cardinal)&basewait, XtRImmediate, (caddr_t) 10},
    {"vaderwait", "VaderWait", XtRInt, sizeof(int),
	 (Cardinal)&vaderwait, XtRImmediate, (caddr_t) 300},
    {"spacerwait", "SpacerWait", XtRInt, sizeof(int),
	 (Cardinal)&spacerwait, XtRImmediate, (caddr_t) 50},
    {"shotwait", "ShotWait", XtRInt, sizeof(int),
	 (Cardinal)&shotwait, XtRImmediate, (caddr_t) 10},
    {"vshotwait", "VshotWait", XtRInt, sizeof(int),
	 (Cardinal)&vshotwait, XtRImmediate, (caddr_t) 30},
    {"basecolor", "BaseColor", XtRPixel, sizeof(Pixel),
	 (Cardinal)&basepixel, XtRString, "cyan"},
    {"spacercolor", "SpacerColor", XtRPixel, sizeof(Pixel),
	 (Cardinal)&spacerpixel, XtRString, "gray"},
    {"buildingcolor", "BuildingColor", XtRPixel, sizeof(Pixel),
	 (Cardinal)&buildingpixel, XtRString, "yellow"},
    {"vader1color", "Vader1Color", XtRPixel, sizeof(Pixel),
	 (Cardinal)&vader1pixel, XtRString, "blue"},
    {"vader2color", "Vader2Color", XtRPixel, sizeof(Pixel),
	 (Cardinal)&vader2pixel, XtRString, "green"},
    {"vader3color", "Vader3Color", XtRPixel, sizeof(Pixel),
	 (Cardinal)&vader3pixel, XtRString, "red"},
    {"shotcolor", "ShotColor", XtRPixel, sizeof(Pixel),
	 (Cardinal)&shotpixel, XtRString, "lavender"},
    {"vshotcolor", "VshotColor", XtRPixel, sizeof(Pixel),
	 (Cardinal)&vshotpixel, XtRString, "orange"},
    {"scorecolor", "ScoreColor", XtRPixel, sizeof(Pixel),
	 (Cardinal)&scorepixel, XtRString, "white"},
    {"maxshots", "MaxShots", XtRInt, sizeof(int),
	 (Cardinal) &maxshots, XtRImmediate, (caddr_t) 1},
    {"maxvshots", "MaxVshots", XtRInt, sizeof(int),
	 (Cardinal) &maxvshots, XtRImmediate, (caddr_t) 6},
    {"defaultfore", "DefaultFore", XtRPixel, sizeof(Pixel),
	 (Cardinal) &defaultfore, XtRString, "white"},
    {"defaultback", "DefaultBack", XtRPixel, sizeof(Pixel),
	 (Cardinal) &defaultback, XtRString, "black"},
};


/*ARGSUSED*/
static void CvtStringToFloat(args, num_args, fromVal, toVal)
ArgList args;
Cardinal num_args;
XrmValue    *fromVal;
XrmValue    *toVal;
{
    static float  i;

    if (sscanf((char *)fromVal->addr, "%f", &i) == 1) {
	toVal->size = sizeof(float);
	toVal->addr = (caddr_t) &i;
    } else {
	toVal->size = 0;
	toVal->addr = NULL;
    }
}

static void AddResource(r, p)
char *r;
Pixel *p;
{
    XrmValue value;
    XrmDatabase db = XtDatabase(dpy);
    value.size = sizeof(Pixel);
    value.addr = (caddr_t) p;
    XrmPutResource(&db, r, XtRPixel, &value);
}

Widget
MakeCommandButton(box, name, function, vlink, hlink, data)
Widget box, vlink, hlink;
char *name;
XtCallbackProc function;
caddr_t data;
{
  Widget w;
  Arg args[10];
  Cardinal numargs;

  numargs = 0;
  if(vlink != NULL) {
    XtSetArg(args[numargs], XtNfromVert, vlink); numargs++;
  }
  if(hlink != NULL) {
    XtSetArg(args[numargs], XtNfromHoriz, hlink); numargs++;
  }
  w = XtCreateManagedWidget(name, commandWidgetClass, box, args, numargs);
  if (function != NULL)
    XtAddCallback(w, XtNcallback, function, data);
  return w;
}

main(argc, argv)
Cardinal argc;
char **argv;
{
  static Arg args[10];
  int n;
  Widget form, button;
  extern WidgetClass labelwidgetclass;

  me_image = NULL;

  srandom(time(0));
#ifdef XFILESEARCHPATH
  AddPathToSearchPath(XFILESEARCHPATH);
#endif
  toplevel = XtInitialize(argv[0], "Vaders", table, XtNumber(table),
			  &argc, argv);
  dpy = XtDisplay(toplevel);
  XtAddConverter(XtRString, XtRFloat, CvtStringToFloat, NULL, 0);
  XtGetApplicationResources(toplevel, (caddr_t) NULL, 
			    resources, XtNumber(resources),
			    NULL, (Cardinal) 0);
  AddResource("*background", &defaultback);
  if (DisplayCells(dpy, DefaultScreen(dpy)) <= 2)
    {
      basepixel = defaultfore;
      buildingpixel = defaultfore;
      vader1pixel = defaultfore;
      vader2pixel = defaultfore;
      vader3pixel = defaultfore;
      shotpixel = defaultfore;
      vshotpixel = defaultfore;
      scorepixel = defaultfore;
    }
  if (scale<1) scale = 1;
  if (scale>2) scale = 2;
  width = scale*VWIDTH;
  height = scale*VHEIGHT;

  form = XtCreateManagedWidget ("form", formWidgetClass,
				toplevel, NULL, 0);

  n = 0;
  XtSetArg (args[n], XtNleft, XtChainLeft); n++;
  XtSetArg (args[n], XtNright, XtChainLeft); n++;
  XtSetArg (args[n], XtNtop, XtChainTop); n++;
  XtSetArg (args[n], XtNbottom, XtChainTop); n++;
  XtSetArg (args[n], XtNwidth, width); n++;
  XtSetArg (args[n], XtNheight, height); n++;
  
  gamewidget = (VadersWidget)
    XtCreateManagedWidget("field", vadersWidgetClass, form, args, n);

  n = 0;
  XtSetArg (args[n], XtNleft, XtChainLeft); n++;
  XtSetArg (args[n], XtNright, XtChainLeft); n++;
  XtSetArg (args[n], XtNtop, XtChainTop); n++;
  XtSetArg (args[n], XtNbottom, XtChainTop); n++;
  XtSetArg (args[n], XtNfromHoriz, gamewidget); n++;
  XtSetArg (args[n], XtNhorizDistance, 5); n++;
  XtSetArg (args[n], XtNwidth, scale*IWIDTH); n++;
  XtSetArg (args[n], XtNheight, height/2); n++;
  
  labelwidget = (VadersWidget)
    XtCreateManagedWidget("label", vadersWidgetClass, form, args, n);

  pausebutton = MakeCommandButton(form, "pause", Pause, labelwidget, gamewidget, NULL);
  XtSetArg(args[0], XtNlabel, " Start");
  XtSetArg(args[1], XtNforeground, defaultfore);
  XtSetArg(args[2], XtNbackground, defaultback);
  XtSetArg(args[3], XtNborderColor, defaultfore);
  XtSetValues(pausebutton, args, 4);
  button = MakeCommandButton(form, "quit", Quit, pausebutton, gamewidget, NULL);
  XtSetArg(args[0], XtNlabel, " Quit ");
  XtSetArg(args[1], XtNforeground, defaultfore);
  XtSetArg(args[2], XtNbackground, defaultback);
  XtSetArg(args[3], XtNborderColor, defaultfore);
  XtSetValues(button, args, 4);
  infobutton = MakeCommandButton(form, "info", ShowInfo, button, gamewidget, NULL);
  XtSetArg(args[0], XtNlabel, " Info ");
  XtSetArg(args[1], XtNforeground, defaultfore);
  XtSetArg(args[2], XtNbackground, defaultback);
  XtSetArg(args[3], XtNborderColor, defaultfore);
  XtSetValues(infobutton, args, 4);

  XtRealizeWidget(toplevel);
  ResetGame();
  XtMainLoop();
}

#ifdef XFILESEARCHPATH
static void
AddPathToSearchPath(path)
char *path;
{
     char *old, *new;
     extern char *getenv();
     
     old = getenv("XFILESEARCHPATH");
     if (old) {
#if defined(mips) || defined(hpux) || defined(sun)
	  /* +1 for =, +2 for :, +3 for null */
	  new = XtMalloc((Cardinal) (strlen("XFILESEARCHPATH") +
				     strlen(old) +
				     strlen(path) + 3));
	  (void) strcpy(new, "XFILESEARCHPATH");
	  (void) strcat(new, "=");
	  (void) strcat(new, old);
	  (void) strcat(new, ":");
	  (void) strcat(new, path);
	  putenv(new);
#else
	  /* +1 for colon, +2 for null */
	  new = XtMalloc((Cardinal) (strlen(old) + strlen(path) + 2));
	  (void) strcpy(new, old);
	  (void) strcat(new, ":");
	  (void) strcat(new, path);
	  setenv("XFILESEARCHPATH", new, 1);
#endif
     }
     else {
#if defined(mips) || defined(hpux) || defined(sun)
	  new = XtMalloc((Cardinal) (strlen("XFILESEARCHPATH") +
				     strlen(path) + 2));
	  (void) strcpy(new, "XFILESEARCHPATH");
	  (void) strcat(new, "=");
	  (void) strcat(new, path);
	  putenv(new);
#else
	  setenv("XFILESEARCHPATH", path, 1);
#endif
     }
}
#endif

#ifdef sparc
XShapeCombineMask()
{}

XShapeQueryExtension()
{}
#endif
