home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional / OS2PRO194.ISO / os2 / games / gi / gi.c next >
C/C++ Source or Header  |  1993-11-08  |  6KB  |  211 lines

  1. /*--------------------------------------------------------------------------*/
  2. /*                                                                          */
  3. /*   Module        : Game-Interface                                         */
  4. /*                                                                          */
  5. /*   Version       : V1.00                                                  */
  6. /*                                                                          */
  7. /*   Date          : 18.04.93                                               */
  8. /*                                                                          */
  9. /*   Written       : RF                                                     */
  10. /*                                                                          */
  11. /*     Revision History :
  12.  
  13.     20.05.93    RF  Konzept geändert
  14.     26.05.93    RF  Direction und Buttons getrennt
  15.     06.07.93    RF  Diagonal eingebaut
  16.     02.11.93    RF    Threshold wird erst geholt, wenn er gebraucht wird
  17.     07.11.93    RF    Mode() wird gar nicht gebraucht !
  18.     08.11.93    RF    div. Änderungen am Interface
  19.                                                                             */
  20. /*--------------------------------------------------------------------------*/
  21. #define INCL_DOSMODULEMGR
  22. #define INCL_PM
  23. #include <os2.h>
  24. #pragma hdrstop
  25.  
  26. #define GI_DEFINE
  27. #include <gi.h>
  28. #include <stdio.h>
  29. #include <stdlib.h>
  30. #include <string.h>
  31. #include <alloc.h>
  32.  
  33. static char     *header = "Game-Interface Config-File V1.00\32";
  34. static char        filename[256];
  35.  
  36. /*--------------------------------------------------------------------------*/
  37. unsigned _export InitFip (FUNCINFOP fi)        // internal use only
  38.     {
  39.     int     i;
  40.  
  41.     if (DosLoadModule (NULL, 0L, fi->file, &fi->hand) || !fi->hand)
  42.         return (error = EMODULE);
  43.  
  44.     if (DosQueryProcAddr (fi->hand, 0L, funcname[0], (PFN *)&fi->GetDataSize))
  45.         return (EINITFUNC);
  46.  
  47.     for (i=0; i<4; i++)
  48.         {
  49.         if (DosQueryProcAddr (fi->hand, 0L, funcname[i+1], (PFN *)&fi->func[i]))
  50.             return (EINITFUNC);
  51.         }
  52.     if (DosQueryProcAddr (fi->hand, 0L, funcname[5], (PFN *)&fi->Direction))
  53.         return (EINITFUNC);
  54.  
  55.     if (!fi->data)  // noch keine Daten alloziert
  56.         {
  57.         fi->datasize = fi->GetDataSize ();
  58.         fi->data = malloc (fi->datasize);
  59.         if (!fi->data)
  60.             return (error = ENOMEM);
  61.         memset (fi->data, 0, fi->datasize);
  62.         }
  63.     error = fi->func[0] ((char __far16 *)fi->data);    // Init
  64.     if (error)
  65.         return (error);
  66.  
  67.     fi->func[1](&fi->name[2]);                              // Get Name of Strategy
  68.  
  69.     return (error = NOERR);
  70.     }
  71. /*--------------------------------------------------------------------------*/
  72. void _export DelFip (unsigned i)        // internal use only
  73.     {
  74.     for (; i<numplayer; i++)
  75.         fip[i] = fip[i+1];
  76.     numplayer--;
  77.     }
  78. /*--------------------------------------------------------------------------*/
  79. unsigned _export GIInitialize ()
  80.     {
  81.     int         i;
  82.     FILE        *f;
  83.     char        head[50], *fn;
  84.  
  85.     error = NOERR;
  86.     strcpy (filename, GI_CONFIGNAME);
  87.     f = fopen (filename, "rb");            // Zuerst im Cur-Dir suchen
  88.     if (!f)
  89.         {
  90.         fn = getenv (GI_ENVNAME);    // und dann std-environment
  91.         if (fn)
  92.             strcpy (filename, fn);
  93.  
  94.         if (!fn || (f=fopen (filename, "rb"))==NULL)
  95.             {
  96.             numplayer=0;
  97.             return (error = ENOTFOUND);
  98.             }
  99.         }
  100.  
  101.     // Test header
  102.     fread (head, strlen(header), 1, f);
  103.     if (memcmp (head, header, strlen(header)))
  104.         {
  105.         fclose (f);
  106.         return (error = EBADFILETYPE);
  107.         }
  108.  
  109.     fread (&numplayer, sizeof (unsigned), 1, f);
  110.     for (i=0; i<numplayer; i++)
  111.         {
  112.         fip[i] = (FUNCINFOP)malloc (sizeof (FUNCINFO));
  113.         if (!fip[i])
  114.             return (error = ENOMEM);
  115.  
  116.         fread (fip[i]->file, sizeof (char), 100, f);
  117.         fread (&fip[i]->datasize, sizeof (unsigned), 1, f);
  118.         fip[i]->data = malloc (fip[i]->datasize);
  119.         if (!fip[i]->data)
  120.             return (error = ENOMEM);
  121.  
  122.         fread (fip[i]->data, fip[i]->datasize, 1, f);
  123.  
  124.         if (InitFip (fip[i]))
  125.             return (error);
  126.         }
  127.  
  128.     fclose (f);
  129.  
  130.     return (error);
  131.     }
  132. /*--------------------------------------------------------------------------*/
  133. unsigned _export Save ()    // internal use only ! (giconfig.exe)
  134.     {
  135.     FILE    *f;
  136.     int     i;
  137.  
  138.     f = fopen (filename, "wb");
  139.     if (!f)
  140.         return (error = EOPEN);
  141.  
  142.     fwrite (header, strlen(header), 1, f);
  143.     fwrite (&numplayer, sizeof (unsigned), 1, f);
  144.     for (i=0; i<numplayer; i++)
  145.         {
  146.         fwrite (fip[i]->file, sizeof (char), 100, f);
  147.         fwrite (&fip[i]->datasize, sizeof (unsigned), 1, f);
  148.         fwrite (fip[i]->data, fip[i]->datasize, 1, f);
  149.         }
  150.     fclose (f);
  151.  
  152.     return (error = NOERR);
  153.     }
  154. /*--------------------------------------------------------------------------*/
  155. unsigned _export GIGetDirection (PLAYERINFOP pi)
  156.     {
  157.     char    m, mm;
  158.     int     i, mi=-1, mii=-1, th;
  159.  
  160.     if (!pi || pi->player > numplayer)
  161.         return (error = EBADARG);
  162.  
  163.     error = fip[pi->player]->Direction ((char __far16 *)fip[pi->player]->data,
  164.                                         (char __far16 *)pi);
  165.     if (error)
  166.         return (error);
  167.  
  168.     th = fip[pi->player]->func[3] ((char __far16 *)fip[pi->player]->data);
  169.  
  170.     if (pi->analog)
  171.         m = mm = 0;
  172.     else
  173.         m = mm = th;
  174.     for (i=0; i<4; i++)
  175.         {
  176.         if (m <= pi->dir[i])
  177.             {
  178.             mm = m;             // max wird zu backup
  179.             m = pi->dir[i];     // neues max setzen
  180.  
  181.             mii= mi;            // letzer Index wird zum 2. letzten Index
  182.             mi = i;             // neuer Index des max
  183.             }
  184.         else if (mm <= pi->dir[i])  // kein neues max, aber vielleicht neus backup?
  185.             {
  186.             mm = pi->dir[i];    // backup setzen
  187.             mii= i;             // index für backup
  188.             }
  189.         }
  190.     pi->direction = mi;
  191.     pi->diagonal = mii;
  192.  
  193.     pi->buttons = 0;
  194.     if (pi->dir[4])
  195.         pi->buttons = DIRBUT1;
  196.     if (pi->dir[5])
  197.         pi->buttons |= DIRBUT2;
  198.  
  199.     return (0);
  200.     }
  201. /*--------------------------------------------------------------------------*/
  202. unsigned _export GIGetThreshold (unsigned fiidx)    // Nur für interne Zwecke !!
  203.     {
  204.     if (fiidx <= numplayer)
  205.         return (fip[fiidx]->func[3] ((char __far16 *)fip[fiidx]->data));
  206.     return (0);
  207.     }
  208. /*--------------------------------------------------------------------------*/
  209.  
  210.  
  211.