/***********************************************************
* Artsoft Retro-Game Library *
*----------------------------------------------------------*
-* (c) 1994-2000 Artsoft Entertainment *
+* (c) 1994-2001 Artsoft Entertainment *
* Holger Schemel *
* Detmolder Strasse 189 *
* 33604 Bielefeld *
#if defined(PLATFORM_MSDOS)
#include "sound.h"
+#include "joystick.h"
#include "misc.h"
+#include "setup.h"
#include "pcx.h"
#define AllegroDefaultScreen() (display->screens[display->default_screen])
/*
extern int playing_sounds;
-extern struct SoundControl playlist[MAX_SOUNDS_PLAYING];
+extern struct SoundControl playlist[NUM_MIXER_CHANNELS];
extern struct SoundControl emptySoundControl;
*/
static boolean allegro_init_audio()
{
- reserve_voices(MAX_SOUNDS_PLAYING, 0);
+ reserve_voices(NUM_MIXER_CHANNELS, 0);
if (install_sound(DIGI_AUTODETECT, MIDI_NONE, NULL) == -1)
if (install_sound(DIGI_SB, MIDI_NONE, NULL) == -1)
}
}
-void XMapWindow(Display *display, Window window)
-{
- int x, y;
- unsigned int width, height;
- boolean mouse_off;
-
- x = AllegroDefaultScreen().x;
- y = AllegroDefaultScreen().y;
- width = AllegroDefaultScreen().width;
- height = AllegroDefaultScreen().height;
-
- mouse_off = hide_mouse(display, x, y, width, height);
- blit((BITMAP *)window, video_bitmap, 0, 0, x, y, width, height);
-
- if (mouse_off)
- unhide_mouse(display);
-}
-
-static unsigned long AllocColorCell(int r, int g, int b)
+Pixel AllegroAllocColorCell(int r, int g, int b)
{
byte pixel_mapping = 0;
int i;
if (global_colormap_entries_used < MAX_COLORS)
global_colormap_entries_used++;
+ i = global_colormap_entries_used - 1;
+
global_colormap[i].r = r;
global_colormap[i].g = g;
global_colormap[i].b = b;
+ set_palette(global_colormap);
+
pixel_mapping = i;
}
return pixel_mapping;
}
+void XMapWindow(Display *display, Window window)
+{
+ int x, y;
+ unsigned int width, height;
+ boolean mouse_off;
+
+ x = AllegroDefaultScreen().x;
+ y = AllegroDefaultScreen().y;
+ width = AllegroDefaultScreen().width;
+ height = AllegroDefaultScreen().height;
+
+ mouse_off = hide_mouse(display, x, y, width, height);
+ blit((BITMAP *)window, video_bitmap, 0, 0, x, y, width, height);
+
+ if (mouse_off)
+ unhide_mouse(display);
+}
+
Display *XOpenDisplay(char *display_name)
{
Screen *screen;
Display *display;
BITMAP *mouse_bitmap = NULL;
+ char *mouse_filename =getCustomImageFilename(program.msdos_pointer_filename);
- mouse_bitmap = Read_PCX_to_AllegroBitmap(program.msdos_pointer_filename);
- if (mouse_bitmap == NULL)
+ if ((mouse_bitmap = Read_PCX_to_AllegroBitmap(mouse_filename)) == NULL)
return NULL;
screen = malloc(sizeof(Screen));
screen[0].cmap = 0;
screen[0].root = 0;
-#if 0
- screen[0].white_pixel = 0xFF;
- screen[0].black_pixel = 0x00;
-#else
- screen[0].white_pixel = AllocColorCell(0xFFFF, 0xFFFF, 0xFFFF);
- screen[0].black_pixel = AllocColorCell(0x0000, 0x0000, 0x0000);
-#endif
+ screen[0].white_pixel = AllegroAllocColorCell(0xFFFF, 0xFFFF, 0xFFFF);
+ screen[0].black_pixel = AllegroAllocColorCell(0x0000, 0x0000, 0x0000);
screen[0].video_bitmap = NULL;
display->default_screen = 0;
byte *src_ptr = image->data;
byte pixel_mapping[MAX_COLORS];
unsigned int depth = 8;
-
-#if 0
- int i, j, x, y;
-#else
int i, x, y;
-#endif
+
+ if (image->type == IMAGETYPE_TRUECOLOR && depth == 8)
+ Error(ERR_EXIT, "cannot handle true-color images on 8-bit display");
/* allocate new allegro bitmap structure */
if ((bitmap = create_bitmap_ex(depth, image->width, image->height)) == NULL)
/* try to use existing colors from the global colormap */
for (i=0; i<MAX_COLORS; i++)
{
-
-#if 0
- int r, g, b;
-#endif
-
if (!image->rgb.color_used[i])
continue;
-
-#if 0
- r = image->rgb.red[i] >> 10;
- g = image->rgb.green[i] >> 10;
- b = image->rgb.blue[i] >> 10;
-
- for (j=0; j<global_colormap_entries_used; j++)
- {
- if (r == global_colormap[j].r &&
- g == global_colormap[j].g &&
- b == global_colormap[j].b) /* color found */
- {
- pixel_mapping[i] = j;
- break;
- }
- }
-
- if (j == global_colormap_entries_used) /* color not found */
- {
- if (global_colormap_entries_used < MAX_COLORS)
- global_colormap_entries_used++;
-
- global_colormap[j].r = r;
- global_colormap[j].g = g;
- global_colormap[j].b = b;
-
- pixel_mapping[i] = j;
- }
-#else
- pixel_mapping[i] = AllocColorCell(image->rgb.red[i],
- image->rgb.green[i],
- image->rgb.blue[i]);
-#endif
-
+ pixel_mapping[i] = AllegroAllocColorCell(image->rgb.red[i],
+ image->rgb.green[i],
+ image->rgb.blue[i]);
}
/* copy bitmap data */
return errno_pcx;
*pixmap = (Pixmap)bitmap;
- *pixmap_mask = (Pixmap)bitmap;
+
+ /* pixmap_mask will never be used in Allegro (which uses masked_blit()),
+ so use non-NULL dummy pointer to empty Pixmap */
+ *pixmap_mask = (Pixmap)DUMMY_MASK;
return PCX_Success;
}
keyboard_auto_repeat = FALSE;
}
-Bool MSDOSOpenAudio(void)
+void AllegroDrawLine(Drawable d, int from_x, int from_y, int to_x, int to_y,
+ Pixel color)
+{
+ boolean mouse_off = FALSE;
+
+ if ((BITMAP *)d == video_bitmap)
+ {
+ int dx = AllegroDefaultScreen().x;
+ int dy = AllegroDefaultScreen().y;
+ int x1, y1, x2, y2;
+
+ from_x += dx;
+ from_y += dy;
+ to_x += dx;
+ to_y += dy;
+
+ x1 = (from_x < to_x ? from_x : to_x);
+ y1 = (from_y < to_y ? from_y : to_y);
+ x2 = (from_x < to_x ? to_x : from_x);
+ y2 = (from_y < to_y ? to_y : from_y);
+
+ freeze_mouse_flag = TRUE;
+ mouse_off = hide_mouse(display, x1, y1, x2 - x1 + 1, y2 - y1 + 1);
+ }
+
+ line((BITMAP *)d, from_x, from_y, to_x, to_y, color);
+
+ if (mouse_off)
+ unhide_mouse(display);
+
+ freeze_mouse_flag = FALSE;
+}
+
+Pixel AllegroGetPixel(Drawable d, int x, int y)
{
- return allegro_init_audio();
+ return getpixel((BITMAP *)d, x, y);
+}
+
+void MSDOSOpenAudio(void)
+{
+ if (allegro_init_audio())
+ {
+ audio.sound_available = TRUE;
+ audio.music_available = TRUE;
+ audio.loops_available = TRUE;
+ audio.sound_enabled = TRUE;
+
+ audio.num_channels = NUM_MIXER_CHANNELS;
+ audio.music_channel = MUSIC_CHANNEL;
+ audio.first_sound_channel = FIRST_SOUND_CHANNEL;
+
+ Mixer_InitChannels();
+ }
}
void MSDOSCloseAudio(void)
Error(ERR_WARN, "networking not supported in DOS version");
}
+
+/* ========================================================================= */
+/* joystick functions */
+/* ========================================================================= */
+
+void MSDOSInitJoysticks()
+{
+ int i;
+
+ /* start from scratch */
+ remove_joystick();
+
+ /* try to access two joysticks; if that fails, try to access just one */
+ if (install_joystick(JOY_TYPE_2PADS) == 0 ||
+ install_joystick(JOY_TYPE_AUTODETECT) == 0)
+ joystick.status = JOYSTICK_ACTIVATED;
+
+ for (i=0; i<MAX_PLAYERS; i++)
+ {
+ char *device_name = setup.input[i].joy.device_name;
+ int joystick_nr = getJoystickNrFromDeviceName(device_name);
+
+ if (joystick_nr >= num_joysticks)
+ joystick_nr = -1;
+
+ /* misuse joystick file descriptor variable to store joystick number */
+ joystick.fd[i] = joystick_nr;
+ }
+}
+
+boolean MSDOSReadJoystick(int nr, int *x, int *y, boolean *b1, boolean *b2)
+{
+ /* the allegro global variable 'num_joysticks' contains the number
+ of joysticks found at initialization under MS-DOS / Windows */
+
+ if (nr < 0 || nr >= num_joysticks)
+ return FALSE;
+
+ poll_joystick();
+
+ if (x != NULL)
+ *x = joy[nr].stick[0].axis[0].pos;
+ if (y != NULL)
+ *y = joy[nr].stick[0].axis[1].pos;
+
+ if (b1 != NULL)
+ *b1 = joy[nr].button[0].b;
+ if (b2 != NULL)
+ *b2 = joy[nr].button[1].b;
+
+ return TRUE;
+}
+
#endif /* PLATFORM_MSDOS */