/* LORD OF HOSTS - openclose.c --- Öffnen und Schließen von Libs - Fenster... */

#include "Lord.h"

struct MsgPort    *MPort;
struct IOStdReq   *IOReq;
ULONG             JoyMouseData;
struct Screen     *MyScreen;
struct Window     *MyWindow;
struct RastPort   *RP;
struct ViewPort   *VP;
struct BitMap     *BM,PiecesBM;
struct IntuitionBase *IntuitionBase;
struct GfxBase    *GfxBase;
struct ReqLib     *ReqBase;
struct TextFont   *MyFont;
struct Process    *MyProcess;
APTR              OldErrorWindow;
extern struct ReqFileRequester MyFileReqStruct;

UWORD MyColorMap[16] = {
	0x006,0xFFF,0xE00,0x800,0xF77,0xFCA,0xD61,0xFFF,
	0xF91,0x46F,0xFC0,0x0F0,0x333,0x222,0x555,0x000
};

struct TextAttr TheFont =
{
   (UBYTE *)"topaz.font",
   TOPAZ_EIGHTY,
   FS_NORMAL,
   FPF_ROMFONT
};

struct NewScreen TheScreen =
{
   0, 0, 320, 200, 4,
   0, 1, NULL,
   CUSTOMSCREEN|SCREENBEHIND,
   &TheFont,
   (UBYTE *)"LORD OF HOSTS © 1991 Tim Pietzcker",
   NULL,NULL
};

struct NewWindow TheWindow =
{
   0, 0, 320, 200, 0, 1,
   MOUSEBUTTONS|MENUPICK,
   ACTIVATE|SMART_REFRESH|BACKDROP|BORDERLESS,
   NULL, NULL, NULL, NULL, NULL,
   0, 0, 0, 0,
   CUSTOMSCREEN
};

/* Menü Special */
#define M_SUBW1 (8*4 + LOWCHECKWIDTH)
#define M_SUBW2 (8*14 + LOWCHECKWIDTH)
#define M_WIDTH3 (8*23 + LOWCOMMWIDTH)

struct IntuiText on_t =
{  0, 1, JAM1, LOWCHECKWIDTH, 1, &TheFont, (UBYTE *)"An", NULL};
struct IntuiText off_t =
{  0, 1, JAM1, LOWCHECKWIDTH, 1, &TheFont, (UBYTE *)"Aus", NULL};

struct IntuiText nohelp_t =
{  0, 1, JAM1, LOWCHECKWIDTH, 1, &TheFont, (UBYTE *)"Keine Hilfe", NULL};
struct IntuiText showknown_t =
{  0, 1, JAM1, LOWCHECKWIDTH, 1, &TheFont, (UBYTE *)"Zeige Bekanntes", NULL};
struct IntuiText showall_t =
{  0, 1, JAM1, LOWCHECKWIDTH, 1, &TheFont, (UBYTE *)"Zeige alles", NULL};

struct IntuiText explain_t =
{  0, 1, JAM1, 0, 1, &TheFont, (UBYTE *)"Zug-Fehler erklären", NULL};
struct IntuiText switch_t =
{  0, 1, JAM1, 0, 1, &TheFont, (UBYTE *)"Seitenwechsel", NULL};
struct IntuiText setspeed_t =
{  0, 1, JAM1, 0, 1, &TheFont, (UBYTE *)"JoyMouse Speed...", NULL};
struct IntuiText joymouse_t =
{  0, 1, JAM1, 0, 1, &TheFont, (UBYTE *)"JoyMouse", NULL};
struct IntuiText mode2_t =
{  0, 1, JAM1, 0, 1, &TheFont, (UBYTE *)"Spieler 2 Hilfsmodus", NULL};
struct IntuiText mode1_t =
{  0, 1, JAM1, 0, 1, &TheFont, (UBYTE *)"Spieler 1 Hilfsmodus", NULL};
struct IntuiText redo_t =
{  0, 1, JAM1, 0, 1, &TheFont, (UBYTE *)"Nachspielen", NULL};
struct IntuiText undo_t =
{  0, 1, JAM1, 0, 1, &TheFont, (UBYTE *)"Zurücknehmen", NULL};

/* MenuSubItems */
struct MenuItem off_m =
{  NULL, 69, 10, M_SUBW1, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP|CHECKIT,
   0x0001, (APTR)&off_t, NULL, NULL, NULL, NULL };
struct MenuItem on_m =
{  &off_m, 69, 0, M_SUBW1, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP|CHECKIT|CHECKED,
   0x0002, (APTR)&on_t, NULL, NULL, NULL, NULL };

struct MenuItem showall1_m =
{  NULL, 69, 20, M_SUBW2, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP|CHECKIT,
   0x0003, (APTR)&showall_t, NULL, NULL, NULL, NULL };
struct MenuItem showknown1_m =
{  &showall1_m, 69, 10, M_SUBW2, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP|CHECKIT,
   0x0005, (APTR)&showknown_t, NULL, NULL, NULL, NULL };
struct MenuItem nohelp1_m =
{  &showknown1_m, 69, 0, M_SUBW2, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP|CHECKIT|
   CHECKED, 0x0006, (APTR)&nohelp_t, NULL, NULL, NULL, NULL };

struct MenuItem showall2_m =
{  NULL, 69, 20, M_SUBW2, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP|CHECKIT,
   0x0003, (APTR)&showall_t, NULL, NULL, NULL, NULL };
struct MenuItem showknown2_m =
{  &showall2_m, 69, 10, M_SUBW2, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP|CHECKIT,
   0x0005, (APTR)&showknown_t, NULL, NULL, NULL, NULL };
struct MenuItem nohelp2_m =
{  &showknown2_m, 69, 0, M_SUBW2, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP|CHECKIT|
   CHECKED, 0x0006, (APTR)&nohelp_t, NULL, NULL, NULL, NULL };

/* MenuItems */
struct MenuItem explain_m =
{  NULL, 0, 70, M_WIDTH3, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP|COMMSEQ, NULL,
   (APTR)&explain_t, NULL, (BYTE)'E', NULL, NULL };
struct MenuItem switch_m =
{  &explain_m, 0, 60, M_WIDTH3, 10, ITEMTEXT|HIGHCOMP, NULL,
   (APTR)&switch_t, NULL, NULL, NULL, NULL };
struct MenuItem setspeed_m =
{  &switch_m, 0, 50, M_WIDTH3, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP|COMMSEQ, NULL,
   (APTR)&setspeed_t, NULL, (BYTE)'J', NULL, NULL };
struct MenuItem joymouse_m =
{  &setspeed_m, 0, 40, M_WIDTH3, 10, ITEMTEXT|ITEMENABLED|HIGHBOX, NULL,
   (APTR)&joymouse_t, NULL, NULL, &on_m, NULL };
struct MenuItem mode2_m =
{  &joymouse_m, 0, 30, M_WIDTH3, 10, ITEMTEXT|ITEMENABLED|HIGHBOX, NULL,
   (APTR)&mode2_t, NULL, NULL, &nohelp2_m, NULL };
struct MenuItem mode1_m =
{  &mode2_m, 0, 20, M_WIDTH3, 10, ITEMTEXT|ITEMENABLED|HIGHBOX, NULL,
   (APTR)&mode1_t, NULL, NULL, &nohelp1_m, NULL };
struct MenuItem redo_m =
{  &mode1_m, 0, 10, M_WIDTH3, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP|COMMSEQ, NULL,
   (APTR)&redo_t, NULL, (BYTE)'N', NULL, NULL };
struct MenuItem undo_m =
{  &redo_m, 0, 0, M_WIDTH3, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP|COMMSEQ, NULL,
   (APTR)&undo_t, NULL, (BYTE)'Z', NULL, NULL };

/* Menü Board */
#define M_WIDTH2 (8*21 + LOWCHECKWIDTH)

struct IntuiText rnd2_t =
{  0, 1, JAM1, LOWCHECKWIDTH, 1, &TheFont, (UBYTE *)"Reiner Zufall", NULL};
struct IntuiText rnd1_t =
{  0, 1, JAM1, LOWCHECKWIDTH, 1, &TheFont, (UBYTE *)"Ausgewogener Zufall", NULL};
struct IntuiText std2_t =
{  0, 1, JAM1, LOWCHECKWIDTH, 1, &TheFont, (UBYTE *)"Standard Rotiert 90°", NULL};
struct IntuiText std1_t =
{  0, 1, JAM1, LOWCHECKWIDTH, 1, &TheFont, (UBYTE *)"Standard", NULL};

/* MenuItems */
struct MenuItem rnd2_m =
{  NULL, 0, 30, M_WIDTH2, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP|CHECKIT,
   0x0007, (APTR)&rnd2_t, NULL, NULL, NULL, NULL };
struct MenuItem rnd1_m =
{  &rnd2_m, 0, 20, M_WIDTH2, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP|CHECKIT,
   0x000B, (APTR)&rnd1_t, NULL, NULL, NULL, NULL };
struct MenuItem std2_m =
{  &rnd1_m, 0, 10, M_WIDTH2, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP|CHECKIT,
   0x000D, (APTR)&std2_t, NULL, NULL, NULL, NULL };
struct MenuItem std1_m =
{  &std2_m, 0, 0, M_WIDTH2, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP|CHECKED|CHECKIT,
   0x000E, (APTR)&std1_t, NULL, NULL, NULL, NULL };

/* Menü Game */
#define M_WIDTH1 (8*20 + LOWCOMMWIDTH)

struct IntuiText quit_t =
{  0, 1, JAM1, 0, 1, &TheFont, (UBYTE *)"Ende", NULL};
struct IntuiText about_t =
{  0, 1, JAM1, 0, 1, &TheFont, (UBYTE *)"Infos", NULL};
struct IntuiText rules_t =
{  0, 1, JAM1, 0, 1, &TheFont, (UBYTE *)"Regeln...", NULL};
struct IntuiText save_t =
{  0, 1, JAM1, 0, 1, &TheFont, (UBYTE *)"Spiel speichern...", NULL};
struct IntuiText load_t =
{  0, 1, JAM1, 0, 1, &TheFont, (UBYTE *)"Spiel laden...", NULL};
struct IntuiText begin_t =
{  0, 1, JAM1, 0, 1, &TheFont, (UBYTE *)"Spiel beginnen", NULL};

/* MenuItems */
struct MenuItem quit_m =
{  NULL, 0, 50, M_WIDTH1, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP|COMMSEQ, NULL,
   (APTR)&quit_t, NULL, (BYTE)'Q', NULL, NULL };
struct MenuItem about_m =
{  &quit_m, 0, 40, M_WIDTH1, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP|COMMSEQ, NULL,
   (APTR)&about_t, NULL, (BYTE)'I', NULL, NULL };
struct MenuItem rules_m =
{  &about_m, 0, 30, M_WIDTH1, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP|COMMSEQ, NULL,
   (APTR)&rules_t, NULL, (BYTE)'?', NULL, NULL };
struct MenuItem save_m =
{  &rules_m, 0, 20, M_WIDTH1, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP|COMMSEQ, NULL,
   (APTR)&save_t, NULL, (BYTE)'S', NULL, NULL };
struct MenuItem load_m =
{  &save_m, 0, 10, M_WIDTH1, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP|COMMSEQ, NULL,
   (APTR)&load_t, NULL, (BYTE)'L', NULL, NULL };
struct MenuItem begin_m =
{  &load_m, 0, 0, M_WIDTH1, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP|COMMSEQ, NULL,
   (APTR)&begin_t, NULL, (BYTE)'B', NULL, NULL };

/* Gesamt (Haupt-) Menü */
struct Menu special_m =
{  NULL, 4*23, 0, 4*16, 10, MENUENABLED, (BYTE *)"Spezial", &undo_m };
struct Menu board_m =
{  &special_m, 4*12-1, 0, 4*11+1, 10, MENUENABLED, (BYTE *)"Brett", &std1_m };
struct Menu game_m =
{  &board_m, 2, 0, 4*11+1, 10, MENUENABLED, (BYTE *)"Spiel", &begin_m };

void errorstop(char *message)
{
   puts(message);
   Delay(100);
   close_all();
}

void open_all(void)
{
   int i,j; long sec,mic;
   if (!(IntuitionBase = OpenLibrary("intuition.library",0)))
      errorstop("No intuition.library!");
   if (!(GfxBase = OpenLibrary("graphics.library",0)))
      errorstop("No graphics.library!");
   if (!(ReqBase = OpenLibrary("req.library",REQVERSION)))
      errorstop("req.library fehlt!\n Entweder mitgelieferte req.library in"
                " LIBS: kopieren oder\n Assign LIBS: \"\" vor dem Laden von"
                " Lord Of Hosts durchführen!");
   if (!(MPort = CreatePort("Shogun Port",0))) errorstop("Kein Message Port!");
   if (!(IOReq = CreateStdIO(MPort))) errorstop("Kein StdIORequest!");
   if (OpenDevice("input.device",0,(struct IORequest *)IOReq,0))
      errorstop("Kein input.device!");
   JoyMouseData=SPEED;
   if (!(MyScreen = OpenScreen(&TheScreen))) errorstop("Kein Screen!");
   VP = &(MyScreen->ViewPort);
   TheWindow.Screen = MyScreen;
   if (!(MyWindow = OpenWindow(&TheWindow))) errorstop("Kein Window!");
   RP = MyWindow->RPort;
   BM = RP->BitMap;        /* BitMap, in der die Spielsteine bewegt werden */
   InitBitMap(&PiecesBM,4,21,21);  /* 4 Planes, 21*21 Pixel */
   for (i=0;i<4;++i)
      if (!(PiecesBM.Planes[i]=AllocRaster(21,21)))
         errorstop("Kein BitMap Memory!");
   LoadRGB4(VP,MyColorMap,16);
   if (!(MyFont = OpenFont(&TheFont))) errorstop("Kein font topaz.8!");
   SetFont(RP,MyFont);
   CurrentTime(&sec,&mic);   /* Zufallsgenerator setzen */
   srand((unsigned int)sec);
   SetMenuStrip(MyWindow, &game_m);
	MyProcess = (struct Process *)FindTask(NULL);
	OldErrorWindow = MyProcess->pr_WindowPtr;
	MyProcess->pr_WindowPtr = (APTR)MyWindow;
}

void close_all(void)
{
   int i;
   if (ReqBase) PurgeFiles(&MyFileReqStruct); /* Speicher vom Filerequester */
   if (MyFont) CloseFont(MyFont);
   for (i=0;i<4;++i)
      if (PiecesBM.Planes[i])
         FreeRaster(PiecesBM.Planes[i],21,21);
   if (MyWindow)
   {
   	MyProcess->pr_WindowPtr = OldErrorWindow;
      ClearMenuStrip(MyWindow);
      CloseWindow(MyWindow);
   }
   if (MyScreen) CloseScreen(MyScreen);
   if (IOReq)
   {
      CloseDevice((struct IORequest *)IOReq);
      DeleteStdIO(IOReq);
   }
   if (MPort) DeletePort(MPort);
   if (ReqBase) CloseLibrary(ReqBase);
   if (GfxBase) CloseLibrary(GfxBase);
   if (IntuitionBase) CloseLibrary(IntuitionBase);
   exit(0);
}
