home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / ABUSESRC.ZIP / AbuseSrc / macabuse / src / macgame.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-05-20  |  11.6 KB  |  536 lines

  1. #include <string.h>
  2. #include <stdio.h>
  3. #include "dprint.hpp"
  4. #include "keys.hpp"
  5. #include "id.hpp"
  6. #include "macgame.hpp"
  7. #include "mackeys.hpp"
  8. #include "clisp.hpp"
  9. #include "lisp.hpp"
  10.  
  11. #define APPLEMENU_ID            128
  12. #define ABOUT_ITEM                1
  13. #define ABOUTBOX_ID                128
  14.  
  15. #define GAMEMENU_ID                129
  16. #define    PLAY_ITEM                    1
  17. #define PREFERENCES_ITEM    2
  18. #define   PREFERENCES_ID        128
  19. #define     EDITMODE_ITEM            5
  20. #define     DOUBLEPIXEL_ITEM    7
  21. #define     SCANLINE_ITEM            8
  22. #define     SINGLEPIXEL_ITEM    9
  23. #define     PDEFAULT_BUT            3
  24. #define     PREVERT_BUT                2
  25. #define     POK_BUT                        1
  26. #define KEYCONFIG_ITEM        3
  27. #define     KEYCONFIG_ID            129
  28. #define     UPKEY_ITEM                13
  29. #define     LEFTKEY_ITEM            14
  30. #define     RIGHTKEY_ITEM            15
  31. #define     DOWNKEY_ITEM            16
  32. #define     SPECIALKEY_ITEM        17
  33. #define     SWILEFTKEY_ITEM        18
  34. #define     SWIRIGHTKEY_ITEM    19
  35. #define     KDEFAULT_BUT            3
  36. #define     KREVERT_BUT                2
  37. #define     KOK_BUT                        1
  38. #define QUIT_ITEM                    5
  39.  
  40. int MacCont,MacPlay;
  41. extern Rect *gRect;
  42.  
  43. FILE *open_FILE(char *filename, char *mode);
  44.  
  45. void HIG_PositionDialog( ResType dialogType, short id)
  46. {
  47.   Handle theTemplate; // Handle to resource template
  48.   Rect        *theRect;   // Bounding box of dialog
  49.   short       left;       // Left side of centered rect   
  50.   short       top;        // Top side of centered rect        
  51.   
  52.  
  53.   theTemplate = GetResource(dialogType, id);
  54.   theRect = (Rect*) *theTemplate;
  55.   
  56.   left = (gRect->right - 
  57.           (theRect->right - theRect->left)) / 2;
  58.  
  59.   top = (gRect->bottom - 
  60.           (theRect->bottom - theRect->top)) / 3;
  61.  
  62.   top = (top > GetMBarHeight() + 1) ? top : GetMBarHeight() + 1;
  63.  
  64.   theRect->right += left - theRect->left;
  65.   theRect->left = left;
  66.   theRect->bottom += top - theRect->top;
  67.   theRect->top = top;
  68. }
  69.  
  70. extern int PixMode;
  71. extern int dev;
  72. extern int start_edit;
  73. extern int start_running;
  74. extern int disable_autolight;
  75.  
  76. void MacPreferences()
  77. {
  78.     DialogPtr dlg;
  79.     short item;
  80.     int cont;
  81.     int emode, dmode;
  82.     short t;
  83.     ControlHandle h;
  84.     Rect r;
  85.     
  86.     HIG_PositionDialog( 'DLOG', PREFERENCES_ID);
  87.     dlg = GetNewDialog(PREFERENCES_ID,0,(WindowPtr)-1);
  88.     SetDialogDefaultItem(dlg,POK_BUT);
  89.     
  90.     cont = 1;
  91.     emode = 0;
  92.     dmode = 0;
  93.     
  94.     // Draw current dialog settings    
  95.     GetDialogItem(dlg,EDITMODE_ITEM,&t,(Handle*)&h,&r);
  96.     SetControlValue(h,emode);
  97.     for (int i=0; i<4; i++)
  98.     {
  99.         GetDialogItem(dlg,DOUBLEPIXEL_ITEM+i,&t,(Handle*)&h,&r);
  100.         SetControlValue(h,i==dmode);
  101.     }
  102.  
  103.     while (cont)
  104.     {
  105.         ModalDialog(0,&item);
  106.         switch (item)
  107.         {
  108.             case EDITMODE_ITEM:
  109.                 emode = !emode;
  110.                 GetDialogItem(dlg,EDITMODE_ITEM,&t,(Handle*)&h,&r);
  111.                 SetControlValue(h,emode);
  112.                 break;
  113.             case DOUBLEPIXEL_ITEM:
  114.             case SCANLINE_ITEM:
  115.             case SINGLEPIXEL_ITEM:
  116.                 GetDialogItem(dlg,DOUBLEPIXEL_ITEM+dmode,&t,(Handle*)&h,&r);
  117.                 SetControlValue(h,0);
  118.                 dmode = item - DOUBLEPIXEL_ITEM;
  119.                 GetDialogItem(dlg,DOUBLEPIXEL_ITEM+dmode,&t,(Handle*)&h,&r);
  120.                 SetControlValue(h,1);
  121.                 break;
  122.             case PDEFAULT_BUT:
  123.             case PREVERT_BUT:
  124.                 if (item == PDEFAULT_BUT)
  125.                 {
  126.                     emode = 0;
  127.                     dmode = 0;
  128.                 }
  129.                 else
  130.                 {
  131.                 }
  132.                 GetDialogItem(dlg,EDITMODE_ITEM,&t,(Handle*)&h,&r);
  133.                 SetControlValue(h,emode);
  134.                 for (int i=0; i<4; i++)
  135.                 {
  136.                     GetDialogItem(dlg,DOUBLEPIXEL_ITEM+i,&t,(Handle*)&h,&r);
  137.                     SetControlValue(h,i==dmode);
  138.                 }
  139.                 break;
  140.             case POK_BUT:
  141.                 cont = 0;
  142.                 break;
  143.         }
  144.     }
  145.     DisposeDialog(dlg);
  146.  
  147.     if (emode)
  148.     {
  149.         dev|=EDIT_MODE;    
  150.         start_edit=1;
  151.         start_running=1;
  152.         disable_autolight=1;
  153.     }
  154.  
  155.     PixMode = 3 - dmode;
  156. }
  157.  
  158. class CMacKeyConfig
  159. {
  160. protected:
  161.     DialogPtr dlg;
  162.     short tsel;
  163.     int revert_key[7];
  164.     int key[7];
  165.  
  166.     void LoadDefaults()
  167.     {
  168.       key[0] = JK_LEFT;
  169.       key[1] = JK_RIGHT;
  170.       key[2] = JK_UP;
  171.       key[3] = JK_DOWN;
  172.       key[4] = '0';
  173.       key[5] = JK_CTRL_L;
  174.       key[6] = '1';
  175.     }
  176.  
  177.     void ReenterKeys()
  178.     {
  179.         Str255 name;
  180.         short t;
  181.         ControlHandle h;
  182.         Rect r;
  183.  
  184.         for (int i=0; i<7; i++)
  185.         {
  186.             GetDialogItem(dlg,i + UPKEY_ITEM,&t,(Handle*)&h,&r);
  187.             key_name(key[i],(char*)&name[1]);
  188.             name[0] = strlen((char*)&name[1]);
  189.             SetDialogItemText((Handle)h, name);
  190.         }
  191.         SelectDialogItemText(dlg,tsel + UPKEY_ITEM,0,32767);
  192.     }
  193.     
  194.     void SetKey(int newkey)
  195.     {
  196.         Str255 name;
  197.         short t;
  198.         ControlHandle h;
  199.         Rect r;
  200.  
  201.         key[tsel] = newkey;
  202.         GetDialogItem(dlg,tsel + UPKEY_ITEM,&t,(Handle*)&h,&r);
  203.         key_name(newkey,(char*)&name[1]);
  204.         name[0] = strlen((char*)&name[1]);
  205.         SetDialogItemText((Handle)h, name);
  206.         if (++tsel>=7)
  207.             tsel = 0;
  208.         SelectDialogItemText(dlg,tsel + UPKEY_ITEM,0,32767);
  209.     }
  210.     
  211.     void LoadKeys();
  212.     
  213.     void WriteKeys();
  214.     
  215.     void ProcessKey(int key)
  216.     {
  217.       switch ((key & keyCodeMask)>>8)
  218.       {
  219.           case 0x7d :     SetKey(JK_DOWN); break;
  220.         case 0x7e :      SetKey(JK_UP);  break;
  221.         case 0x7b :     SetKey(JK_LEFT);  break;
  222.         case 0x7c :     SetKey(JK_RIGHT);  break;
  223.         /*
  224.         case XK_Control_L :     SetKey(JK_CTRL_L);  break;
  225.         case XK_Control_R :     SetKey(JK_CTRL_R);  break;
  226.         case XK_Alt_L :         SetKey(JK_ALT_L);  break;
  227.         case XK_Alt_R :         SetKey(JK_ALT_R);  break;
  228.         case XK_Shift_L :     SetKey(JK_SHIFT_L);  break;
  229.         case XK_Shift_R :     SetKey(JK_SHIFT_R);  break;
  230.         */
  231.         case 0x47 :     SetKey(JK_NUM_LOCK);  break;
  232.         case 0x73 :     SetKey(JK_HOME);  break;
  233.         case 0x77 :     SetKey(JK_END);  break;
  234.         case 0x33 :        SetKey(JK_BACKSPACE);  break;
  235.         case 0x30 :        SetKey(JK_TAB);  break;
  236.         case 0x4c :        SetKey(JK_ENTER);  break;
  237.         case 0x39 :        SetKey(JK_CAPS);  break;
  238.           case 0x35 :        SetKey(JK_ESC);  break;
  239.            case 0x71 :   SetKey(JK_F1); break;
  240.         case 0x78 :   SetKey(JK_F2);break;
  241.         case 0x63 :   SetKey(JK_F3); break;
  242.         case 0x76 :   SetKey(JK_F4); break;
  243.         case 0x60 :   SetKey(JK_F5); break;
  244.         case 0x61 :   SetKey(JK_F6); break;
  245.         case 0x62 :   SetKey(JK_F7); break;
  246.         case 0x64 :   SetKey(JK_F8); break;
  247.         case 0x65 :   SetKey(JK_F9); break;
  248.         case 0x6d :   SetKey(JK_F10); break;
  249.             case 0x67 :   SetKey(JK_INSERT); break;
  250.             case 0x74 :   SetKey(JK_PAGEUP); break;
  251.             case 0x79 :   SetKey(JK_PAGEDOWN); break;
  252.             
  253.         default :
  254.                 SetKey(key & charCodeMask);
  255.       }
  256.     }
  257.     
  258.     void ProcessModifiers()
  259.     {
  260.         unsigned char km[16];
  261.         char modstat[8];
  262.         char stat;
  263.         int keyed;
  264.  
  265.         // Get key status of modifiers
  266.         GetKeys((unsigned long*)&km);
  267.         keyed = -1;
  268.         for (int i=0; i<MAC_LAST-MAC_COMMAND; i++) {
  269.             stat = (km[ (i+MAC_COMMAND) >> 3 ] >> ((i+MAC_COMMAND) & 7)) & 1;
  270.             if (stat && !modstat[i])
  271.                 keyed = i;
  272.             modstat[i] = stat;
  273.         }
  274.         
  275.         if (keyed >= 0)
  276.             SetKey(mac_map[keyed]);
  277.     }
  278.     
  279. public:
  280.     void RunDialog();
  281. };
  282. static CMacKeyConfig MacKeyConfig;
  283.  
  284. void CMacKeyConfig::LoadKeys()
  285. {
  286.   FILE *fp=open_FILE("mackeys.lsp","rb");
  287.     if (fp)
  288.     {
  289.         char st[256];
  290.         fgets(st,255,fp);
  291.         sscanf(st+17,"%d %d %d %d %d %d %d",
  292.                      &key[1],&key[2],&key[0],&key[3],&key[5],&key[6],&key[4] );
  293.         fclose(fp);
  294.     }     
  295.   else 
  296.   {
  297.       dprintf("Unable to read to file gamma.lsp\n");
  298.       LoadDefaults();
  299.     }
  300.     for (int i=0; i<7; i++)
  301.         revert_key[i] = key[i];
  302. }
  303.  
  304. void CMacKeyConfig::WriteKeys()
  305. {
  306.   FILE *fp=open_FILE("mackeys.lsp","wb");
  307.   if (fp)
  308.   {
  309.         fprintf(fp,"(setq key_list '( %d %d %d %d %d %d %d ))\n",
  310.                                 key[1], key[2], key[0], key[3], key[5], key[6], key[4] );
  311.                                 
  312.       set_symbol_number(l_left_key, key[1]);
  313.       set_symbol_number(l_right_key, key[2]);
  314.       set_symbol_number(l_up_key, key[0]);
  315.       set_symbol_number(l_down_key, key[3]);
  316.       set_symbol_number(l_weapon_left_key, key[5]);
  317.       set_symbol_number(l_weapon_right_key, key[6]);
  318.       set_symbol_number(l_special_key, key[4]);
  319.                                 
  320.         fclose(fp);
  321.   } 
  322.   else
  323.       dprintf("Unable to write to file mackeys.lsp\n");
  324. }
  325.     
  326.  
  327. void CMacKeyConfig::RunDialog()
  328. {
  329.     GrafPtr savePort;
  330.     short item;
  331.     int cont;
  332.     EventRecord ev;
  333.     short t;
  334.     ControlHandle h;
  335.     Rect r;
  336.  
  337.     LoadKeys();
  338.     
  339.     HIG_PositionDialog( 'DLOG', KEYCONFIG_ID);
  340.     dlg = GetNewDialog(KEYCONFIG_ID,0,(WindowPtr)-1);
  341.     
  342.     GetPort( &savePort );
  343.     SetPort( dlg );
  344.     
  345.     SetDialogDefaultItem(dlg,KOK_BUT);
  346.     UpdateDialog(dlg,dlg->visRgn);
  347.  
  348.     tsel = 0;
  349.     ReenterKeys();
  350.     
  351.     cont = 1;
  352.     while (cont)
  353.     {
  354.         if (GetNextEvent(everyEvent,&ev))
  355.         {
  356.             switch (ev.what)
  357.             {
  358.             case mouseDown:
  359.                 GlobalToLocal(&ev.where);
  360.                 item = FindDialogItem(dlg, ev.where) + 1;
  361.                 switch (item)
  362.                 {
  363.                     case UPKEY_ITEM:
  364.                     case LEFTKEY_ITEM:
  365.                     case RIGHTKEY_ITEM:
  366.                     case DOWNKEY_ITEM:
  367.                     case SPECIALKEY_ITEM:
  368.                     case SWILEFTKEY_ITEM:
  369.                     case SWIRIGHTKEY_ITEM:
  370.                         // Key box selection
  371.                         tsel = item - UPKEY_ITEM;
  372.                         SelectDialogItemText(dlg,item,0,32767);
  373.                         break;
  374.                     case KDEFAULT_BUT:
  375.                         // reset keys to default
  376.                         GetDialogItem(dlg,item,&t,(Handle*)&h,&r);
  377.                         if (TrackControl(h,ev.where,0))
  378.                         {
  379.                             LoadDefaults();
  380.                             ReenterKeys();
  381.                         }
  382.                         break;
  383.                     case KREVERT_BUT:
  384.                         // revert keys to previous
  385.                         GetDialogItem(dlg,item,&t,(Handle*)&h,&r);
  386.                         if (TrackControl(h,ev.where,0))
  387.                         {
  388.                             for (int i=0; i<7; i++)
  389.                                 key[i] = revert_key[i];
  390.                             ReenterKeys();
  391.                         }
  392.                         break;
  393.                     case KOK_BUT:
  394.                         // OK were done
  395.                         GetDialogItem(dlg,item,&t,(Handle*)&h,&r);
  396.                         if (TrackControl(h,ev.where,0))
  397.                             cont = 0;
  398.                         break;
  399.                 } // end switch (item)
  400.                 break;
  401.             case keyDown:
  402.                 ProcessKey(ev.message);
  403.                 break;
  404.             case updateEvt:
  405.                 BeginUpdate(dlg);
  406.                 UpdtDialog(dlg,dlg->visRgn);
  407.                 EndUpdate(dlg);
  408.                 break;
  409.             } // end switch (ev.what)
  410.         } // end if
  411.         
  412.         ProcessModifiers();
  413.     }
  414.     SetPort( savePort );
  415.     DisposeDialog(dlg);
  416.     
  417.     WriteKeys();
  418. }
  419.  
  420. void MacAppleMenuCommand(short menuItem)
  421. {
  422.   Str255 deskAccName;
  423.  
  424.   switch (menuItem)
  425.   {
  426.     case ABOUT_ITEM:
  427.         HIG_PositionDialog( 'ALRT', ABOUTBOX_ID);
  428.         Alert(ABOUTBOX_ID, NULL);
  429.         break;
  430.     
  431.     default:
  432.       GetItem(GetMHandle(APPLEMENU_ID), menuItem,deskAccName);
  433.       OpenDeskAcc(deskAccName);
  434.       break;
  435.   }
  436. }
  437.  
  438. void MacKeyConfigMenu()
  439. {
  440.   MacKeyConfig.RunDialog();
  441. }
  442.  
  443. void MacGameMenuCommand(short menuItem)
  444. {
  445.   switch (menuItem)
  446.   {
  447.       case PLAY_ITEM:
  448.             MacCont = 0;
  449.             MacPlay = 1;
  450.           break;
  451.       case PREFERENCES_ITEM:
  452.           MacPreferences();
  453.           break;
  454.       case KEYCONFIG_ITEM:
  455.           MacKeyConfigMenu();
  456.           break;
  457.     case QUIT_ITEM:
  458.             MacCont = 0;
  459.             MacPlay = 0;
  460.       break;
  461.   }
  462. }
  463.  
  464. void MacMenuCommand(long menuItem_Id)
  465. {
  466.   short menuId = HiWord(menuItem_Id);
  467.   short menuItem = LoWord(menuItem_Id);
  468.  
  469.   switch (menuId)
  470.   {
  471.     case APPLEMENU_ID:
  472.       MacAppleMenuCommand(menuItem);
  473.       break;
  474.  
  475.     case GAMEMENU_ID:
  476.       MacGameMenuCommand(menuItem);
  477.       break;
  478.   }
  479.  
  480.   HiliteMenu(0);
  481. }
  482.  
  483. void MacKeyEvent(char key,short modifiers)
  484. {
  485.   if ((modifiers & cmdKey) != 0)
  486.     MacMenuCommand(MenuKey(key));
  487. }
  488.  
  489. void MacMouseEvent(const EventRecord * eventPtr)
  490. {
  491.   WindowPtr whichWindow;
  492.   short partCode;
  493.  
  494.   // find out where the user clicked
  495.   partCode = FindWindow(eventPtr->where, &whichWindow);
  496.  
  497.   switch(partCode)
  498.   {
  499.     case inMenuBar:
  500.       MacMenuCommand(MenuSelect(eventPtr->where));
  501.         break;
  502.         
  503.     case inSysWindow:       
  504.       SystemClick(eventPtr, whichWindow);
  505.         break;
  506.   }
  507. }
  508.  
  509. int MacMenu()
  510. {
  511.   EventRecord event;
  512.   
  513.   // make sure app is supposed to be running.
  514.   MacCont = 1;
  515.   MacPlay = 0;
  516.   while(MacCont)
  517.   {
  518.       SystemTask();
  519.       if (GetNextEvent(everyEvent,&event))
  520.         switch(event.what)
  521.         {
  522.           case mouseDown:         
  523.             MacMouseEvent(&event);
  524.               break;
  525.                           
  526.           case keyDown:
  527.           case autoKey:
  528.             MacKeyEvent((char)(event.message &charCodeMask),event.modifiers);
  529.               break;
  530.           
  531.         }
  532.     }
  533.     
  534.     return MacPlay;
  535. }
  536.