Implemented -scaleup and -nosound options. Some fixes for first release.
[crow/jumpnbump.git] / sdl / interrpt.c
1 /*
2  * interrpt.c
3  * Copyright (C) 1998 Brainchild Design - http://brainchilddesign.com/
4  * 
5  * Copyright (C) 2001 tarzeau@space.ch
6  *
7  * Copyright (C) 2002 Florian Schulze - crow@icculus.org
8  *
9  * Portions of this code are from the MPEG software simulation group
10  * idct implementation. This code will be replaced with a new
11  * implementation soon.
12  *
13  * This file is part of Jump'n'Bump.
14  *
15  * Jump'n'Bump is free software; you can redistribute it and/or modify
16  * it under the terms of the GNU General Public License as published by
17  * the Free Software Foundation; either version 2 of the License, or
18  * (at your option) any later version.
19  *
20  * Jump'n'Bump is distributed in the hope that it will be useful,
21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23  * GNU General Public License for more details.
24  *
25  * You should have received a copy of the GNU General Public License
26  * along with this program; if not, write to the Free Software
27  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
28  */
29
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <time.h>
33 #ifndef _MSC_VER
34 #include <unistd.h>
35 #endif
36 #include "globals.h"
37
38 char keyb[256];
39 char last_keys[50];
40
41 unsigned char scancode2ascii[256] = {
42         0, 0, 49, 50, 51, 52, 53, 54, 55, 56,           /* 0-9 */
43         57, 48, 45, 0, 0, 0, 113, 119, 101, 114,        /* 10-19 */
44         116, 121, 117, 105, 111, 112, 0, 0, 0, 0,       /* 20-29 */
45         97, 115, 100, 102, 103, 104, 106, 107, 108, 0,  /* 30-39 */
46         0, 0, 0, 0, 122, 120, 99, 118, 98, 110,         /* 40-49 */
47         109, 44, 46, 47, 0, 0, 0, 32, 0, 0,             /* 50-59 */
48         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
49         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
50         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
51         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
52         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
53         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
54         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
55         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
57         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
58         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
59         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
60         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
61         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
62         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
63         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
64         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
65         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
66         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
67         0, 0, 0, 0, 0, 0
68 };
69
70 int hook_keyb_handler(void)
71 {
72         SDL_EnableUNICODE(1);
73         memset((void *) last_keys, 0, sizeof(last_keys));
74         return 0;
75
76 }
77
78
79 void remove_keyb_handler(void)
80 {
81 }
82
83
84 int key_pressed(int key)
85 {
86         return keyb[(unsigned char) key];
87 }
88
89 int addkey(unsigned int key)
90 {
91         int c1;
92
93         if (!(key & 0x8000)) {
94                 keyb[key & 0x7fff] = 1;
95                 for (c1 = 48; c1 > 0; c1--)
96                         last_keys[c1] = last_keys[c1 - 1];
97                 last_keys[0] = key & 0x7fff;
98         } else
99                 keyb[key & 0x7fff] = 0;
100         return 0;
101 }
102
103 int intr_sysupdate()
104 {
105         SDL_Event e;
106         int i = 0;
107         static Uint32 now, then = 0;
108
109         while (SDL_PollEvent(&e)) {
110                 switch (e.type) {
111                 case SDL_MOUSEBUTTONDOWN:
112                         break;
113                 case SDL_KEYDOWN:
114                 case SDL_KEYUP:
115                         switch (e.key.keysym.sym) {
116                         case SDLK_F12:
117                                 if (e.type == SDL_KEYDOWN) {
118                                         SDL_Quit();
119                                         exit(1);
120                                 }
121                                 break;
122                         case SDLK_F10:
123                                 if (e.type == SDL_KEYDOWN) {
124                                         fs_toggle();
125                                 }
126                                 break;
127                         case SDLK_ESCAPE:
128                                 if (e.type == SDL_KEYUP)
129                                         addkey(1 | 0x8000);
130                                 else
131                                         addkey(1 & 0x7f);
132                                 break;
133                         default:
134                                 e.key.keysym.sym &= 0x7f;
135                                 if (e.type == SDL_KEYUP)
136                                         e.key.keysym.sym |= 0x8000;
137                                 addkey(e.key.keysym.sym);
138
139                                 break;
140                         }
141                         break;
142                 default:
143                         break;
144                 }
145                 i++;
146         }
147         //SDL_Delay(4);
148         now = SDL_GetTicks();
149         if (!then)
150                 SDL_Delay(1);
151         else {
152                 then = (1000 / 60) - (now - then);
153                 if (then > 0 && then < 1000)
154                         SDL_Delay(then);
155         }
156         then = now;
157
158         return i;
159 }