1 /***********************************************************
2 * Rocks'n'Diamonds -- McDuffin Strikes Back! *
3 *----------------------------------------------------------*
4 * ©1995 Artsoft Development *
6 * 33659 Bielefeld-Senne *
7 * Telefon: (0521) 493245 *
8 * eMail: aeglos@valinor.owl.de *
9 * aeglos@uni-paderborn.de *
10 * q99492@pbhrzx.uni-paderborn.de *
11 *----------------------------------------------------------*
13 ***********************************************************/
24 DECLARE_GFX_DRIVER_LIST(GFX_DRIVER_VBEAF GFX_DRIVER_VESA2L GFX_DRIVER_VESA1)
25 DECLARE_COLOR_DEPTH_LIST(COLOR_DEPTH_8)
26 DECLARE_DIGI_DRIVER_LIST(DIGI_DRIVER_SB)
27 DECLARE_MIDI_DRIVER_LIST()
28 DECLARE_JOYSTICK_DRIVER_LIST(JOYSTICK_DRIVER_STANDARD)
30 static int key_buffer[OSD_MAX_KEY];
31 static XEvent event_buffer[MAX_EVENT_BUFFER];
32 static int pending_events;
33 static boolean joystick_event;
34 static boolean mouse_installed = FALSE;
35 static int last_mouse_pos;
36 static int last_mouse_b;
37 static int last_joystick_state;
38 static BITMAP* video_bitmap;
40 static RGB global_colormap[MAX_COLORS];
41 static int global_colormap_entries_used = 0;
43 boolean wait_for_vsync;
45 extern int playing_sounds;
46 extern struct SoundControl playlist[MAX_SOUNDS_PLAYING];
47 extern struct SoundControl emptySoundControl;
49 static BITMAP *Read_PCX_to_AllegroBitmap(char *);
51 static void allegro_drivers()
55 for (i=0; i<MAX_EVENT_BUFFER; i++)
56 event_buffer[i].type = 0;
57 for(i=0; i<OSD_MAX_KEY; i++)
58 key_buffer[i] = KeyReleaseMask;
59 last_mouse_pos = mouse_pos;
68 if (install_mouse() > 0)
69 mouse_installed = TRUE;
70 install_joystick(JOY_TYPE_2PADS);
72 load_joystick_data(JOYSTICK_FILENAME);
73 last_joystick_state = 0;
74 joystick_event = FALSE;
76 reserve_voices(MAX_SOUNDS_PLAYING, 0);
77 if (install_sound(DIGI_AUTODETECT, MIDI_NONE, "ROCKS.SND") == -1)
78 if (install_sound(DIGI_SB, MIDI_NONE, NULL) == -1)
79 sound_status = SOUND_OFF;
82 static boolean hide_mouse(Display *display, int x, int y,
83 unsigned int width, unsigned int height)
85 if (mouse_x + display->mouse_ptr->w < x || mouse_x > x + width)
87 if (mouse_y + display->mouse_ptr->h < y || mouse_y > y + height)
95 static void unhide_mouse(Display *display)
98 show_mouse(video_bitmap);
101 static int get_joystick_state()
106 int joystick_nr = 0; /* CHANGE THIS! */
111 if (joy[joystick_nr].stick[0].axis[0].d1)
113 if (joy[joystick_nr].stick[0].axis[0].d2)
115 if (joy[joystick_nr].stick[0].axis[1].d1)
117 if (joy[joystick_nr].stick[0].axis[1].d2)
119 if (joy[joystick_nr].button[0].b)
120 state |= JOY_BUTTON_1;
124 case (JOY_DOWN | JOY_LEFT):
130 case (JOY_DOWN | JOY_RIGHT):
139 case (JOY_UP | JOY_LEFT):
145 case (JOY_UP | JOY_RIGHT):
149 case (JOY_DOWN | JOY_BUTTON_1):
152 case (JOY_LEFT | JOY_BUTTON_1):
155 case (JOY_RIGHT | JOY_BUTTON_1):
158 case (JOY_UP | JOY_BUTTON_1):
169 unsigned char get_ascii(KeySym key)
173 case OSD_KEY_Q: return 'Q';
174 case OSD_KEY_W: return 'W';
175 case OSD_KEY_E: return 'E';
176 case OSD_KEY_R: return 'R';
177 case OSD_KEY_T: return 'T';
178 case OSD_KEY_Y: return 'Y';
179 case OSD_KEY_U: return 'U';
180 case OSD_KEY_I: return 'I';
181 case OSD_KEY_O: return 'O';
182 case OSD_KEY_P: return 'P';
183 case OSD_KEY_A: return 'A';
184 case OSD_KEY_S: return 'S';
185 case OSD_KEY_D: return 'D';
186 case OSD_KEY_F: return 'F';
187 case OSD_KEY_G: return 'G';
188 case OSD_KEY_H: return 'H';
189 case OSD_KEY_J: return 'J';
190 case OSD_KEY_K: return 'K';
191 case OSD_KEY_L: return 'L';
192 case OSD_KEY_Z: return 'Z';
193 case OSD_KEY_X: return 'X';
194 case OSD_KEY_C: return 'C';
195 case OSD_KEY_V: return 'V';
196 case OSD_KEY_B: return 'B';
197 case OSD_KEY_N: return 'N';
198 case OSD_KEY_M: return 'M';
199 case OSD_KEY_1: return '1';
200 case OSD_KEY_2: return '2';
201 case OSD_KEY_3: return '3';
202 case OSD_KEY_4: return '4';
203 case OSD_KEY_5: return '5';
204 case OSD_KEY_6: return '6';
205 case OSD_KEY_7: return '7';
206 case OSD_KEY_8: return '8';
207 case OSD_KEY_9: return '9';
208 case OSD_KEY_0: return '0';
209 case OSD_KEY_SPACE: return ' ';
215 static long osd_key_pressed(int keycode)
217 if (keycode == OSD_KEY_RCONTROL)
218 keycode = KEY_RCONTROL;
219 if (keycode == OSD_KEY_ALTGR)
225 return KeyReleaseMask;
228 void XMapWindow(Display *display, Window window)
231 unsigned int width, height;
234 x = display->screens[display->default_screen].x;
235 y = display->screens[display->default_screen].y;
236 width = display->screens[display->default_screen].width;
237 height = display->screens[display->default_screen].height;
239 mouse_off = hide_mouse(display, x, y, width, height);
240 blit((BITMAP *)window, video_bitmap, 0, 0, x, y, width, height);
243 unhide_mouse(display);
246 Display *XOpenDisplay(char *display_name)
250 BITMAP *mouse_bitmap = NULL;
252 screen = malloc(sizeof(Screen));
253 display = malloc(sizeof(Display));
255 if ((mouse_bitmap = Read_PCX_to_AllegroBitmap(MOUSE_PCX_FILENAME)) == NULL)
260 screen[0].white_pixel = 0xFF;
261 screen[0].black_pixel = 0x00;
262 screen[0].video_bitmap = NULL;
264 display->default_screen = 0;
265 display->screens = screen;
266 display->mouse_ptr = mouse_bitmap;
272 /* force Windows 95 to switch to fullscreen mode */
273 set_gfx_mode(GFX_AUTODETECT, 320, 200, 0, 0);
275 set_gfx_mode(GFX_AUTODETECT, XRES, YRES, 0, 0);
280 Window XCreateSimpleWindow(Display *display, Window parent, int x, int y,
281 unsigned int width, unsigned int height,
282 unsigned int border_width, unsigned long border,
283 unsigned long background)
285 video_bitmap = create_video_bitmap(XRES, YRES);
286 clear_to_color(video_bitmap, background);
288 display->screens[display->default_screen].video_bitmap = video_bitmap;
289 display->screens[display->default_screen].x = x;
290 display->screens[display->default_screen].y = y;
291 display->screens[display->default_screen].width = XRES;
292 display->screens[display->default_screen].height = YRES;
294 set_mouse_sprite(display->mouse_ptr);
295 set_mouse_range(display->screens[display->default_screen].x + 1,
296 display->screens[display->default_screen].y + 1,
297 display->screens[display->default_screen].x + WIN_XSIZE + 1,
298 display->screens[display->default_screen].y + WIN_YSIZE + 1);
300 show_video_bitmap(video_bitmap);
302 return (Window)video_bitmap;
305 Status XStringListToTextProperty(char **list, int count,
306 XTextProperty *text_prop_return)
312 string = malloc(strlen(list[0] + 1));
313 strcpy(string, list[0]);
314 text_prop_return->value = (unsigned char *)string;
318 text_prop_return = NULL;
323 void XFree(void *data)
329 GC XCreateGC(Display *display, Drawable d, unsigned long value_mask,
333 gcv = malloc(sizeof(XGCValues));
334 gcv->foreground = values->foreground;
335 gcv->background = values->background;
336 gcv->graphics_exposures = values->graphics_exposures;
337 gcv->clip_mask = values->clip_mask;
338 gcv->clip_x_origin = values->clip_x_origin;
339 gcv->clip_y_origin = values->clip_y_origin;
340 gcv->value_mask = value_mask;
344 void XSetClipMask(Display *display, GC gc, Pixmap pixmap)
346 XGCValues *gcv = (XGCValues *)gc;
348 gcv->clip_mask = pixmap;
349 gcv->value_mask |= GCClipMask;
352 void XSetClipOrigin(Display *display, GC gc, int x, int y)
354 XGCValues *gcv = (XGCValues *)gc;
356 gcv->clip_x_origin = x;
357 gcv->clip_x_origin = y;
360 void XFillRectangle(Display *display, Drawable d, GC gc, int x, int y,
361 unsigned int width, unsigned int height)
363 boolean mouse_off = FALSE;
365 if ((BITMAP *)d == video_bitmap)
367 x += display->screens[display->default_screen].x;
368 y += display->screens[display->default_screen].y;
369 freeze_mouse_flag = TRUE;
370 mouse_off = hide_mouse(display, x, y, width, height);
373 rectfill((BITMAP *)d, x, y, x + width, y + height,
374 ((XGCValues *)gc)->foreground);
377 unhide_mouse(display);
379 freeze_mouse_flag = FALSE;
382 Pixmap XCreatePixmap(Display *display, Drawable d, unsigned int width,
383 unsigned int height, unsigned int depth)
385 BITMAP *bitmap = NULL;
387 if (gfx_capabilities & GFX_HW_VRAM_BLIT &&
388 width == FXSIZE && height == FYSIZE)
389 bitmap = create_video_bitmap(width, height);
392 bitmap = create_bitmap(width, height);
394 return (Pixmap)bitmap;
397 void XSync(Display *display, Bool discard_events)
399 wait_for_vsync = TRUE;
402 inline void XCopyArea(Display *display, Drawable src, Drawable dest, GC gc,
403 int src_x, int src_y,
404 unsigned int width, unsigned int height,
405 int dest_x, int dest_y)
407 boolean mouse_off = FALSE;
409 if ((BITMAP *)src == video_bitmap)
411 src_x += display->screens[display->default_screen].x;
412 src_y += display->screens[display->default_screen].y;
415 if ((BITMAP *)dest == video_bitmap)
417 dest_x += display->screens[display->default_screen].x;
418 dest_y += display->screens[display->default_screen].y;
419 freeze_mouse_flag = TRUE;
420 mouse_off = hide_mouse(display, dest_x, dest_y, width, height);
425 wait_for_vsync = FALSE;
429 if (((XGCValues *)gc)->value_mask & GCClipMask)
430 masked_blit((BITMAP *)src, (BITMAP *)dest, src_x, src_y, dest_x, dest_y,
433 blit((BITMAP *)src, (BITMAP *)dest, src_x, src_y, dest_x, dest_y,
437 unhide_mouse(display);
439 freeze_mouse_flag = FALSE;
442 static BITMAP *Image_to_AllegroBitmap(Image *image)
445 byte *src_ptr = image->data;
446 byte pixel_mapping[MAX_COLORS];
447 unsigned int depth = 8;
450 /* allocate new allegro bitmap structure */
451 if ((bitmap = create_bitmap_ex(depth, image->width, image->height)) == NULL)
456 /* try to use existing colors from the global colormap */
457 for (i=0; i<MAX_COLORS; i++)
461 if (!image->rgb.color_used[i])
464 r = image->rgb.red[i] >> 10;
465 g = image->rgb.green[i] >> 10;
466 b = image->rgb.blue[i] >> 10;
468 for (j=0; j<global_colormap_entries_used; j++)
470 if (r == global_colormap[j].r &&
471 g == global_colormap[j].g &&
472 b == global_colormap[j].b) /* color found */
474 pixel_mapping[i] = j;
479 if (j == global_colormap_entries_used) /* color not found */
481 if (global_colormap_entries_used < MAX_COLORS)
482 global_colormap_entries_used++;
484 global_colormap[j].r = r;
485 global_colormap[j].g = g;
486 global_colormap[j].b = b;
488 pixel_mapping[i] = j;
492 /* copy bitmap data */
493 for (y=0; y<image->height; y++)
494 for (x=0; x<image->width; x++)
495 putpixel(bitmap, x, y, pixel_mapping[*src_ptr++]);
500 static BITMAP *Read_PCX_to_AllegroBitmap(char *filename)
505 /* read the graphic file in PCX format to internal image structure */
506 if ((image = Read_PCX_to_Image(filename)) == NULL)
509 /* convert internal image structure to allegro bitmap structure */
510 if ((bitmap = Image_to_AllegroBitmap(image)) == NULL)
513 set_pallete(global_colormap);
518 int Read_PCX_to_Pixmap(Display *display, Window window, GC gc, char *filename,
519 Pixmap *pixmap, Pixmap *pixmap_mask)
523 if ((bitmap = Read_PCX_to_AllegroBitmap(filename)) == NULL)
524 return PCX_FileInvalid;
526 *pixmap = (Pixmap)bitmap;
527 *pixmap_mask = (Pixmap)bitmap;
532 int XpmReadFileToPixmap(Display *display, Drawable d, char *filename,
533 Pixmap *pixmap_return, Pixmap *shapemask_return,
534 XpmAttributes *attributes)
538 if ((bitmap = Read_PCX_to_AllegroBitmap(filename)) == NULL)
539 return XpmOpenFailed;
541 *pixmap_return = (Pixmap)bitmap;
546 int XReadBitmapFile(Display *display, Drawable d, char *filename,
547 unsigned int *width_return, unsigned int *height_return,
548 Pixmap *bitmap_return,
549 int *x_hot_return, int *y_hot_return)
553 if ((bitmap = Read_PCX_to_AllegroBitmap(filename)) == NULL)
554 return BitmapOpenFailed;
556 *width_return = bitmap->w;
557 *height_return = bitmap->h;
560 *bitmap_return = (Pixmap)bitmap;
562 return BitmapSuccess;
565 void XFreePixmap(Display *display, Pixmap pixmap)
567 if (pixmap != DUMMY_MASK &&
568 (is_memory_bitmap((BITMAP *)pixmap) ||
569 is_screen_bitmap((BITMAP *)pixmap)))
570 destroy_bitmap((BITMAP *)pixmap);
573 void XFreeGC(Display *display, GC gc)
577 gcv = (XGCValues *)gc;
582 void XCloseDisplay(Display *display)
584 BITMAP *bitmap = video_bitmap;
586 if (is_screen_bitmap(bitmap))
587 destroy_bitmap(bitmap);
588 if (display->screens)
589 free(display->screens);
594 void XNextEvent(Display *display, XEvent *event_return)
596 while (!pending_events)
599 memcpy(event_return, &event_buffer[pending_events], sizeof(XEvent));
603 int XPending(Display *display)
606 static boolean joy_button_2 = FALSE;
609 int joystick_nr = 0; /* CHANGE THIS! */
613 XButtonEvent *xbutton;
614 XMotionEvent *xmotion;
616 /* joystick event (simulating keyboard event) */
618 state = get_joystick_state();
620 if (joy[joystick_nr].button[1].b && !joy_button_2)
623 xkey = (XKeyEvent *)&event_buffer[pending_events];
624 xkey->type = KeyPress;
628 else if (!joy[joystick_nr].button[1].b && joy_button_2)
631 xkey = (XKeyEvent *)&event_buffer[pending_events];
632 xkey->type = KeyRelease;
634 joy_button_2 = FALSE;
637 if (state && !joystick_event)
640 xkey = (XKeyEvent *)&event_buffer[pending_events];
641 xkey->type = KeyPress;
643 joystick_event = TRUE;
644 last_joystick_state = state;
646 else if ((state != last_joystick_state) && joystick_event)
649 xkey = (XKeyEvent *)&event_buffer[pending_events];
650 xkey->type = KeyRelease;
651 xkey->state = last_joystick_state;
652 joystick_event = FALSE;
657 for(i=0; i<OSD_MAX_KEY+1 && pending_events<MAX_EVENT_BUFFER; i++)
659 state = osd_key_pressed(i);
661 if (state != key_buffer[i])
663 key_buffer[i] = state;
665 xkey = (XKeyEvent *)&event_buffer[pending_events];
666 xkey->type = (state & KeyPressMask ? KeyPress : KeyRelease);
671 /* mouse motion event */
673 if (mouse_pos != last_mouse_pos && mouse_b != last_mouse_b)
675 last_mouse_pos = mouse_pos;
677 xmotion = (XMotionEvent *)&event_buffer[pending_events];
678 xmotion->type = MotionNotify;
679 xmotion->x = mouse_x - display->screens[display->default_screen].x;
680 xmotion->y = mouse_y - display->screens[display->default_screen].y;
689 /* mouse button event */
691 if (mouse_b != last_mouse_b)
695 if ((last_mouse_b & i) != (mouse_b & i))
698 xbutton = (XButtonEvent *)&event_buffer[pending_events];
699 xbutton->type = (mouse_b & i ? ButtonPress : ButtonRelease);
701 xbutton->x = mouse_x - display->screens[display->default_screen].x;
702 xbutton->y = mouse_y - display->screens[display->default_screen].y;
705 last_mouse_b = mouse_b;
708 return pending_events;
711 KeySym XLookupKeysym(XKeyEvent *key_event, int index)
713 return key_event->state;
716 void sound_handler(struct SoundControl snd_ctrl)
720 if (snd_ctrl.fade_sound)
725 for(i=0; i<MAX_SOUNDS_PLAYING; i++)
726 if ((snd_ctrl.stop_all_sounds || playlist[i].nr == snd_ctrl.nr) &&
727 !playlist[i].fade_sound)
729 playlist[i].fade_sound = TRUE;
730 if (voice_check(playlist[i].voice))
731 voice_ramp_volume(playlist[i].voice, 1000, 0);
732 playlist[i].loop = PSND_NO_LOOP;
735 else if (snd_ctrl.stop_all_sounds)
739 SoundServer_StopAllSounds();
741 else if (snd_ctrl.stop_sound)
745 SoundServer_StopSound(snd_ctrl.nr);
748 for(i=0; i<MAX_SOUNDS_PLAYING; i++)
750 if (!playlist[i].active || playlist[i].loop)
753 playlist[i].playingpos = voice_get_position(playlist[i].voice);
754 playlist[i].volume = voice_get_volume(playlist[i].voice);
755 if (playlist[i].playingpos == -1 || !playlist[i].volume)
757 deallocate_voice(playlist[i].voice);
758 playlist[i] = emptySoundControl;
764 SoundServer_InsertNewSound(snd_ctrl);
767 void NetworkServer(int port, int serveronly)
769 printf("Sorry, networking not supported in DOS version.\n");