source: abuse/branches/pd/macabuse/src/macgame.c @ 161

Last change on this file since 161 was 49, checked in by Sam Hocevar, 15 years ago
  • Imported original public domain release, for future reference.
  • Property svn:keywords set to Id
File size: 11.1 KB
Line 
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
40int MacCont,MacPlay;
41extern Rect *gRect;
42
43FILE *open_FILE(char *filename, char *mode);
44
45void 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
70extern int PixMode;
71extern int dev;
72extern int start_edit;
73extern int start_running;
74extern int disable_autolight;
75
76void 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
158class CMacKeyConfig
159{
160protected:
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       
279public:
280        void RunDialog();
281};
282static CMacKeyConfig MacKeyConfig;
283
284void 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
304void 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
327void 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
420void 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
438void MacKeyConfigMenu()
439{
440  MacKeyConfig.RunDialog();
441}
442
443void 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
464void 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
483void MacKeyEvent(char key,short modifiers)
484{
485  if ((modifiers & cmdKey) != 0)
486    MacMenuCommand(MenuKey(key));
487}
488
489void 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
509int 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}
Note: See TracBrowser for help on using the repository browser.