X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fbuttons.c;h=6471e75e6fa2bbfd79b3517b156c87f36c6b9d8e;hb=40a487dcc5d3028343ff9123a72b8b3839a42861;hp=7b0279ee183b98f1f8bde950d5a4082839125351;hpb=a5a03e15b395ba1942c180d1cd0d3a4f43b87f56;p=rocksndiamonds.git diff --git a/src/buttons.c b/src/buttons.c index 7b0279ee..6471e75e 100644 --- a/src/buttons.c +++ b/src/buttons.c @@ -1,13 +1,12 @@ /*********************************************************** * Rocks'n'Diamonds -- McDuffin Strikes Back! * *----------------------------------------------------------* -* ©1995 Artsoft Development * -* Holger Schemel * -* 33659 Bielefeld-Senne * -* Telefon: (0521) 493245 * -* eMail: aeglos@valinor.owl.de * -* aeglos@uni-paderborn.de * -* q99492@pbhrzx.uni-paderborn.de * +* (c) 1995-98 Artsoft Entertainment * +* Holger Schemel * +* Oststrasse 11a * +* 33604 Bielefeld * +* phone: ++49 +521 290471 * +* email: aeglos@valinor.owl.de * *----------------------------------------------------------* * buttons.c * ***********************************************************/ @@ -223,34 +222,119 @@ void DrawGameButton(unsigned long state) redraw_mask |= REDRAW_DOOR_1; } -void DrawChooseButton(unsigned long state) +void DrawYesNoButton(unsigned long state, int mode) { - int pos, cx = DOOR_GFX_PAGEX4, cy = 0; + Drawable dest_drawto; + int dest_xoffset, dest_yoffset; + int xpos, cx = DOOR_GFX_PAGEX4; + + if (mode == DB_INIT) + { + dest_drawto = pix[PIX_DB_DOOR]; + dest_xoffset = DOOR_GFX_PAGEX1; + dest_yoffset = 0; + } + else + { + dest_drawto = drawto; + dest_xoffset = DX; + dest_yoffset = DY; + } - pos = (state & BUTTON_OK ? OK_BUTTON_XPOS : NO_BUTTON_XPOS); + xpos = (state & BUTTON_OK ? OK_BUTTON_XPOS : NO_BUTTON_XPOS); if (state & BUTTON_PRESSED) cx = DOOR_GFX_PAGEX3; - XCopyArea(display,pix[PIX_DOOR],drawto,gc, - cx + pos,cy + OK_BUTTON_GFX_YPOS, - OK_BUTTON_XSIZE,OK_BUTTON_YSIZE, - DX + pos,DY + OK_BUTTON_YPOS); + XCopyArea(display, pix[PIX_DOOR], dest_drawto, gc, + cx + xpos, OK_BUTTON_GFX_YPOS, + OK_BUTTON_XSIZE, OK_BUTTON_YSIZE, + dest_xoffset + xpos, dest_yoffset + OK_BUTTON_YPOS); + + redraw_mask |= REDRAW_DOOR_1; +} + +void DrawConfirmButton(unsigned long state, int mode) +{ + Drawable dest_drawto; + int dest_xoffset, dest_yoffset; + int cx = DOOR_GFX_PAGEX4; + + if (mode == DB_INIT) + { + dest_drawto = pix[PIX_DB_DOOR]; + dest_xoffset = DOOR_GFX_PAGEX1; + dest_yoffset = 0; + } + else + { + dest_drawto = drawto; + dest_xoffset = DX; + dest_yoffset = DY; + } + + if (state & BUTTON_PRESSED) + cx = DOOR_GFX_PAGEX3; + + XCopyArea(display, pix[PIX_DOOR], dest_drawto, gc, + cx + CONFIRM_BUTTON_XPOS, CONFIRM_BUTTON_GFX_YPOS, + CONFIRM_BUTTON_XSIZE, CONFIRM_BUTTON_YSIZE, + dest_xoffset + CONFIRM_BUTTON_XPOS, + dest_yoffset + CONFIRM_BUTTON_YPOS); redraw_mask |= REDRAW_DOOR_1; } -void DrawConfirmButton(unsigned long state) +void DrawPlayerButton(unsigned long state, int mode) { + Drawable dest_drawto; + int dest_xoffset, dest_yoffset; + int graphic; + int graphic_offset = (PLAYER_BUTTON_XSIZE - TILEX/2)/2; + int xpos, ypos; int cx = DOOR_GFX_PAGEX4, cy = 0; + if (mode == DB_INIT) + { + dest_drawto = pix[PIX_DB_DOOR]; + dest_xoffset = DOOR_GFX_PAGEX1; + dest_yoffset = 0; + } + else + { + dest_drawto = drawto; + dest_xoffset = DX; + dest_yoffset = DY; + } + + if (state & BUTTON_PLAYER_1) + graphic = GFX_SPIELER1; + else if (state & BUTTON_PLAYER_2) + graphic = GFX_SPIELER2; + else if (state & BUTTON_PLAYER_3) + graphic = GFX_SPIELER3; + else if (state & BUTTON_PLAYER_4) + graphic = GFX_SPIELER4; + + xpos = (state & BUTTON_PLAYER_1 || state & BUTTON_PLAYER_3 ? + PLAYER_BUTTON_1_XPOS : PLAYER_BUTTON_2_XPOS); + ypos = (state & BUTTON_PLAYER_1 || state & BUTTON_PLAYER_2 ? + PLAYER_BUTTON_1_YPOS : PLAYER_BUTTON_3_YPOS); + if (state & BUTTON_PRESSED) + { cx = DOOR_GFX_PAGEX3; + graphic_offset += 1; + } - XCopyArea(display,pix[PIX_DOOR],drawto,gc, - cx + CONFIRM_BUTTON_XPOS,cy + CONFIRM_BUTTON_GFX_YPOS, - CONFIRM_BUTTON_XSIZE,CONFIRM_BUTTON_YSIZE, - DX + CONFIRM_BUTTON_XPOS,DY + CONFIRM_BUTTON_YPOS); + XCopyArea(display, pix[PIX_DOOR], dest_drawto, gc, + cx + PLAYER_BUTTON_GFX_XPOS, cy + PLAYER_BUTTON_GFX_YPOS, + PLAYER_BUTTON_XSIZE, PLAYER_BUTTON_YSIZE, + dest_xoffset + xpos, dest_yoffset + ypos); + DrawMiniGraphicExt(dest_drawto,gc, + dest_xoffset + xpos + graphic_offset, + dest_yoffset + ypos + graphic_offset, + graphic); redraw_mask |= REDRAW_DOOR_1; } @@ -408,12 +492,12 @@ void DrawElemButton(int button_nr, int button_state) XCopyArea(display,pix[PIX_DOOR],drawto,gc, from_x,from_y, size_x,size_y, to_x,to_y); - DrawMiniGraphicExtHiRes(drawto,gc, - DX+ED_BUTTON_ELEM_XPOS+3+shift + - (elem_pos % MAX_ELEM_X)*ED_BUTTON_ELEM_XSIZE, - DY+ED_BUTTON_ELEM_YPOS+3-shift + - (elem_pos / MAX_ELEM_X)*ED_BUTTON_ELEM_YSIZE, - graphic); + DrawMiniGraphicExt(drawto,gc, + DX+ED_BUTTON_ELEM_XPOS+3+shift + + (elem_pos % MAX_ELEM_X)*ED_BUTTON_ELEM_XSIZE, + DY+ED_BUTTON_ELEM_YPOS+3-shift + + (elem_pos / MAX_ELEM_X)*ED_BUTTON_ELEM_YSIZE, + graphic); } redraw_mask |= REDRAW_DOOR_1; @@ -451,7 +535,7 @@ int CheckVideoButtons(int mx, int my, int button) { int return_code = 0; static int choice = -1; - static BOOL pressed = FALSE; + static boolean pressed = FALSE; static int video_button[5] = { VIDEO_PRESS_EJECT_ON, @@ -511,12 +595,12 @@ int CheckSoundButtons(int mx, int my, int button) { int return_code = 0; static int choice = -1; - static BOOL pressed = FALSE; + static boolean pressed = FALSE; int sound_state[3]; - sound_state[0] = BUTTON_SOUND_MUSIC | (BUTTON_ON * sound_music_on); - sound_state[1] = BUTTON_SOUND_LOOPS | (BUTTON_ON * sound_loops_on); - sound_state[2] = BUTTON_SOUND_SIMPLE | (BUTTON_ON * sound_simple_on); + sound_state[0] = BUTTON_SOUND_MUSIC | (BUTTON_ON * setup.sound_music); + sound_state[1] = BUTTON_SOUND_LOOPS | (BUTTON_ON * setup.sound_loops); + sound_state[2] = BUTTON_SOUND_SIMPLE | (BUTTON_ON * setup.sound_simple); if (button) { @@ -568,7 +652,7 @@ int CheckGameButtons(int mx, int my, int button) { int return_code = 0; static int choice = -1; - static BOOL pressed = FALSE; + static boolean pressed = FALSE; int game_state[3] = { BUTTON_GAME_STOP, @@ -622,12 +706,12 @@ int CheckGameButtons(int mx, int my, int button) return(return_code); } -int CheckChooseButtons(int mx, int my, int button) +int CheckYesNoButtons(int mx, int my, int button) { int return_code = 0; static int choice = -1; - static BOOL pressed = FALSE; - static int choose_button[5] = + static boolean pressed = FALSE; + static int yesno_button[5] = { BUTTON_OK, BUTTON_NO @@ -637,33 +721,33 @@ int CheckChooseButtons(int mx, int my, int button) { if (!motion_status) /* Maustaste neu gedrückt */ { - if (ON_CHOOSE_BUTTON(mx,my)) + if (ON_YESNO_BUTTON(mx,my)) { - choice = CHOOSE_BUTTON(mx); + choice = YESNO_BUTTON(mx); pressed = TRUE; - DrawChooseButton(choose_button[choice] | BUTTON_PRESSED); + DrawYesNoButton(yesno_button[choice] | BUTTON_PRESSED, DB_NORMAL); } } else /* Mausbewegung bei gedrückter Maustaste */ { - if ((!ON_CHOOSE_BUTTON(mx,my) || CHOOSE_BUTTON(mx)!=choice) && + if ((!ON_YESNO_BUTTON(mx,my) || YESNO_BUTTON(mx)!=choice) && choice>=0 && pressed) { pressed = FALSE; - DrawChooseButton(choose_button[choice] | BUTTON_RELEASED); + DrawYesNoButton(yesno_button[choice] | BUTTON_RELEASED, DB_NORMAL); } - else if (ON_CHOOSE_BUTTON(mx,my) &&CHOOSE_BUTTON(mx)==choice && !pressed) + else if (ON_YESNO_BUTTON(mx,my) && YESNO_BUTTON(mx)==choice && !pressed) { pressed = TRUE; - DrawChooseButton(choose_button[choice] | BUTTON_PRESSED); + DrawYesNoButton(yesno_button[choice] | BUTTON_PRESSED, DB_NORMAL); } } } else /* Maustaste wieder losgelassen */ { - if (ON_CHOOSE_BUTTON(mx,my) && CHOOSE_BUTTON(mx)==choice && pressed) + if (ON_YESNO_BUTTON(mx,my) && YESNO_BUTTON(mx)==choice && pressed) { - DrawChooseButton(choose_button[choice] | BUTTON_RELEASED); + DrawYesNoButton(yesno_button[choice] | BUTTON_RELEASED, DB_NORMAL); return_code = choice+1; choice = -1; pressed = FALSE; @@ -683,7 +767,7 @@ int CheckConfirmButton(int mx, int my, int button) { int return_code = 0; static int choice = -1; - static BOOL pressed = FALSE; + static boolean pressed = FALSE; if (button) { @@ -693,7 +777,7 @@ int CheckConfirmButton(int mx, int my, int button) { choice = 0; pressed = TRUE; - DrawConfirmButton(BUTTON_PRESSED); + DrawConfirmButton(BUTTON_PRESSED, DB_NORMAL); } } else /* Mausbewegung bei gedrückter Maustaste */ @@ -701,12 +785,12 @@ int CheckConfirmButton(int mx, int my, int button) if (!ON_CONFIRM_BUTTON(mx,my) && choice>=0 && pressed) { pressed = FALSE; - DrawConfirmButton(BUTTON_RELEASED); + DrawConfirmButton(BUTTON_RELEASED, DB_NORMAL); } else if (ON_CONFIRM_BUTTON(mx,my) && !pressed) { pressed = TRUE; - DrawConfirmButton(BUTTON_PRESSED); + DrawConfirmButton(BUTTON_PRESSED, DB_NORMAL); } } } @@ -714,7 +798,7 @@ int CheckConfirmButton(int mx, int my, int button) { if (ON_CONFIRM_BUTTON(mx,my) && pressed) { - DrawConfirmButton(BUTTON_RELEASED); + DrawConfirmButton(BUTTON_RELEASED, DB_NORMAL); return_code = BUTTON_CONFIRM; choice = -1; pressed = FALSE; @@ -730,13 +814,72 @@ int CheckConfirmButton(int mx, int my, int button) return(return_code); } +int CheckPlayerButtons(int mx, int my, int button) +{ + int return_code = 0; + static int choice = -1; + static boolean pressed = FALSE; + int player_state[4] = + { + BUTTON_PLAYER_1, + BUTTON_PLAYER_2, + BUTTON_PLAYER_3, + BUTTON_PLAYER_4 + }; + + if (button) + { + if (!motion_status) /* Maustaste neu gedrückt */ + { + if (ON_PLAYER_BUTTON(mx,my)) + { + choice = PLAYER_BUTTON(mx,my); + pressed = TRUE; + DrawPlayerButton(player_state[choice] | BUTTON_PRESSED, DB_NORMAL); + } + } + else /* Mausbewegung bei gedrückter Maustaste */ + { + if ((!ON_PLAYER_BUTTON(mx,my) || PLAYER_BUTTON(mx,my)!=choice) && + choice>=0 && pressed) + { + pressed = FALSE; + DrawPlayerButton(player_state[choice] | BUTTON_RELEASED, DB_NORMAL); + } + else if (ON_PLAYER_BUTTON(mx,my) && PLAYER_BUTTON(mx,my)==choice && !pressed) + { + pressed = TRUE; + DrawPlayerButton(player_state[choice] | BUTTON_PRESSED, DB_NORMAL); + } + } + } + else /* Maustaste wieder losgelassen */ + { + if (ON_PLAYER_BUTTON(mx,my) && PLAYER_BUTTON(mx,my)==choice && pressed) + { + DrawPlayerButton(player_state[choice] | BUTTON_RELEASED, DB_NORMAL); + return_code = player_state[choice]; + choice = -1; + pressed = FALSE; + } + else + { + choice = -1; + pressed = FALSE; + } + } + + BackToFront(); + return(return_code); +} + /* several buttons in the level editor */ int CheckEditButtons(int mx, int my, int button) { int return_code = 0; static int choice = -1; - static BOOL pressed = FALSE; + static boolean pressed = FALSE; static int edit_button[6] = { ED_BUTTON_CTRL, @@ -806,7 +949,7 @@ int CheckCtrlButtons(int mx, int my, int button) { int return_code = 0; static int choice = -1; - static BOOL pressed = FALSE; + static boolean pressed = FALSE; static int ctrl_button[4] = { ED_BUTTON_EDIT, @@ -865,7 +1008,7 @@ int CheckElemButtons(int mx, int my, int button) { int return_code = -1; static int choice = -1; - static BOOL pressed = FALSE; + static boolean pressed = FALSE; if (button) { @@ -926,7 +1069,7 @@ int CheckCountButtons(int mx, int my, int button) { int return_code = -1; static int choice = -1; - static BOOL pressed = FALSE; + static boolean pressed = FALSE; if (button) {