/*
 * JMH App Template  (C) 1995 Software Sculptors
 *                   All Rights Under Copyright Reserved
 *
 * Version 1.0
 *
 * Written using SAS/C 6.55
 * Using Magic User Interface (MUI) by Stefan Stuntz
 *
 * By John M. Haubrich, Jr.
 *
 */

/*****************************************************************/
/**  MUST CHANGE APPLICATION-SPECIFIC DATA IN JMH_Startup()     **/
/*****************************************************************/

#include "common.h"


/**
 **   S T A T I C   V A R I A B L E S  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 **/
static struct TextAttr moosefont = {   "moose.font",6,0,0   };


/**
 **   G L O B A L   V A R I A B L E S  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 **/
extern struct MyGlobals MG;
extern UBYTE  GL_szFault[256];

extern struct DosBase       *DosBase;
extern struct IntuitionBase *IntuitionBase;
extern struct Library       *DiskfontBase;
extern struct Library       *GadToolsBase;
extern struct GfxBase       *GfxBase;
extern struct Library       *WorkbenchBase;
extern struct Library       *AslBase;
extern struct Library       *IconBase;
extern struct Library       *MUIMasterBase;
extern struct Library       *UtilityBase;
extern struct Library       *DataTypesBase;


/**
 **   P R O T O T Y P E S    -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 **/
void  JMH_About( void );
LONG  JMH_Error( char *, APTR, BOOL, char *, char *, LONG );
void  JMH_InitVars( void );
void  JMH_Quit( char * );
void  JMH_Startup( int, char ** );


/**
 **   S U B R O U T I N E S  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 **/
//
// JMH_About(): show program info, basename, author, free memory, etc...
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void JMH_About( void )
{
   char  *pszVersion, *pszAuth, *pszCopyright, *pszBase, *pszDescrip;
   char   szAbout[1024];
   ULONG  ulChipFree, ulFastFree;


   get( MG.App, MUIA_Application_Version,     &pszVersion );
   get( MG.App, MUIA_Application_Author,      &pszAuth );
   get( MG.App, MUIA_Application_Copyright,   &pszCopyright );
   get( MG.App, MUIA_Application_Base,        &pszBase );
   get( MG.App, MUIA_Application_Description, &pszDescrip );

   ulChipFree = AvailMem( MEMF_CHIP );
   ulFastFree = AvailMem( MEMF_FAST );

   sprintf( szAbout, "\33c\33b%s\n\33c%s\n\33c%s\n\n\33c%s %s\n\n%s\n\n\
Graphics memory: %lu\nOther memory: %lu\n\nUsing Magic User Interface (MUI) by Stefan Stuntz",
                     pszVersion+6,
                     pszAuth,
                     pszCopyright,
                     "BASENAME:",
                     pszBase,
                     pszDescrip,
                     ulChipFree,
                     ulFastFree
          );

   MUI_Request( MG.App, NULL, 0, NULL, "*OK", szAbout, NULL );
}

//
// JMH_Error(): error routine that also provides help
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LONG JMH_Error( char *pszMsg, APTR pWindowObj, BOOL fARexx,
                char *pszHelpFile, char *pszHelpNode, LONG lHelpLine )
{
   LONG l;


   if ( fARexx )
   {
      set( MG.App, MUIA_Application_RexxMsg, pszMsg );
   }
   else
   {
redisplay:
      l = MUI_Request( MG.App, pWindowObj, 0, NULL, "*OK|Help", pszMsg, NULL );
      if ( l == 0 )
      {
         if ( pszHelpFile && pszHelpNode )
         {
            DoMethod( MG.App, MUIM_Application_ShowHelp, pWindowObj,
                      pszHelpFile, pszHelpNode, lHelpLine );
         }
         else
         {
            MUI_Request( MG.App, pWindowObj, 0, NULL, "*OK", "No help is available for this topic.", NULL );
         }
         goto redisplay;
      }
   }
   return( l );
}

//
// JMH_InitVars(): initialize variables to default values
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VOID JMH_InitVars()
{
   //
   // initialize variables...
   // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   GL_szFault[0] = 0;
   MG.mooseptr   = NULL;

   //
   // init window objects to NULL
   // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   MG.WIN_Main    = NULL;
   MG.WIN_Hidden  = NULL;
   MG.WIN_Cards   = NULL;
   MG.WIN_Victory = NULL;

   //
   // open libraries
   // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   DosBase = (struct DosBase *)OpenLibrary( "dos.library", 39L );
   if ( !DosBase ) JMH_Quit("Cannot open dos.library 39+");

   IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",39L);
   if (!IntuitionBase) JMH_Quit("Cannot open intuition.library 39+");

   DiskfontBase = (struct Library *)OpenLibrary("diskfont.library", 39L);
   if (!DiskfontBase) JMH_Quit("Cannot open diskfont.library 39+");

   GadToolsBase = (struct Library *)OpenLibrary("gadtools.library", 39L);
   if (!GadToolsBase) JMH_Quit("Cannot open gadtools.library 39+");

   GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",39L);
   if (!GfxBase) JMH_Quit("Cannot open graphics.library 39+");

   WorkbenchBase = (struct Library *)
      OpenLibrary("workbench.library",39L);
   if (!WorkbenchBase) JMH_Quit("Cannot open workbench.library 39+");

   AslBase = OpenLibrary("asl.library",39L);
   if (!AslBase) JMH_Quit("Cannot open asl.library 39+");

   IconBase = (struct Library *)OpenLibrary("icon.library",39L);
   if (!IconBase) JMH_Quit("Cannot open icon.library 39+");

   UtilityBase = (struct Library *)OpenLibrary("utility.library",39L);
   if (!UtilityBase) JMH_Quit("Cannot open utility.library 39+" );

   DataTypesBase = (struct Library *)OpenLibrary("datatypes.library",39L);
   if (!DataTypesBase) JMH_Quit("Cannot open datatypes.library 39+" );

   MUIMasterBase = OpenLibrary(MUIMASTER_NAME, MUIMASTER_VMIN);
   if (!MUIMasterBase)
   {
      printf("Cannot open muimaster.library" );
      JMH_Quit( NULL );
   }
}

//
// JMH_Quit(): close down everything we've opened and JMH_Quit
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void JMH_Quit( char *t )
{
   char  szQuitBuf[256+20];


   if (t)
   {
      sprintf( szQuitBuf, "%s\nExiting...", t );
      MUI_Request( MG.App, NULL, 0, NULL, "*OK", szQuitBuf, NULL );
   }

   // free moose font
   if ( MG.mooseptr )
   {
      CloseFont( MG.mooseptr );
   }

   // free sound objects
   fnFreeSound( MG.SOUND_Ack           );
   fnFreeSound( MG.SOUND_Nak           );
   fnFreeSound( MG.SOUND_Player[0]     );
   fnFreeSound( MG.SOUND_Player[1]     );
   fnFreeSound( MG.SOUND_Player[2]     );
   fnFreeSound( MG.SOUND_Player[3]     );
   fnFreeSound( MG.SOUND_Player[4]     );
   fnFreeSound( MG.SOUND_Player[5]     );
   fnFreeSound( MG.SOUND_Fighting      );
   fnFreeSound( MG.SOUND_AttackerWins  );
   fnFreeSound( MG.SOUND_DefenderWins  );
   fnFreeSound( MG.SOUND_Agent         );
   fnFreeSound( MG.SOUND_Admiral       );
   fnFreeSound( MG.SOUND_Troops        );
   fnFreeSound( MG.SOUND_FortBonus     );
   fnFreeSound( MG.SOUND_General       );
   fnFreeSound( MG.SOUND_FortDestroyed );
   fnFreeSound( MG.SOUND_DeclareWinner );

   // free app object
   if ( MG.App )        MUI_DisposeObject( MG.App );

   // free disk object (icon)
   if ( MG.dobj_App )   FreeDiskObject( MG.dobj_App );

   if (MUIMasterBase)   CloseLibrary(MUIMasterBase);
   if (DataTypesBase)   CloseLibrary(DataTypesBase);
   if (UtilityBase)     CloseLibrary(UtilityBase);
   if (IconBase)        CloseLibrary(IconBase);
   if (AslBase)         CloseLibrary(AslBase);
   if (WorkbenchBase)   CloseLibrary(WorkbenchBase);
   if (GfxBase)         CloseLibrary((struct Library *)GfxBase);
   if (GadToolsBase)    CloseLibrary(GadToolsBase);
   if (DiskfontBase)    CloseLibrary(DiskfontBase);
   if (IntuitionBase)   CloseLibrary((struct Library *)IntuitionBase);
   if (DosBase)         CloseLibrary((struct Library *)DosBase);

   exit(0);
}

//
// JMH_Startup(): handle arguments, setup environment, init vars/GUI...
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void JMH_Startup( int argc, char *argv[] )
{
   static char       *programname = "MagicMoney";
   static char        programpath[512];
   BPTR               tmplock;
   struct WBStartup  *WBenchMsg   = NULL;


   JMH_InitVars();

   if (argc)
   {
      GetProgramName( programpath, 512 );
   }
   else
   {
      WBenchMsg   = (struct WBStartup *)argv;
      programname = WBenchMsg->sm_ArgList->wa_Name;

      tmplock  = Lock( programname, ACCESS_READ );
      NameFromLock( tmplock, programpath, 256 );
      UnLock( tmplock );
   }

   // get real program name
   programname = FilePart( programpath );

   // try to get disk object
   MG.dobj_App = GetDiskObject( programpath );

   // open moose font
   MG.mooseptr = OpenDiskFont( &moosefont );

   //
   // set up the MUI application object
   // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   MG.App = ApplicationObject,
      MUIA_Application_Title      , "SteelFortress",
      MUIA_Application_Version    , "$VER: SteelFortress 3.0 (25.7.96)",
      MUIA_Application_Copyright  , "(C) 1996  John M Haubrich Jr",
      MUIA_Application_Author     , "John M Haubrich Jr",
      MUIA_Application_Description, "Strategy game of conquest.",
      MUIA_Application_Base       , "STEELFORT",
      MUIA_Application_DiskObject , MG.dobj_App,
      MUIA_Application_HelpFile   , "PROGDIR:SteelFortress.guide",
      End;

   if ( !MG.App )
      JMH_Quit( "Failed to create Application." );
}
