From: Holger Schemel Date: Thu, 20 May 2010 22:58:25 +0000 (+0200) Subject: rnd-20100521-1-src X-Git-Tag: 3.3.0.0^2~3 X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=commitdiff_plain;h=359536f46007d1b9148bed9c529056faa91b8aab rnd-20100521-1-src --- diff --git a/src/conftime.h b/src/conftime.h index 2dbe9d41..64f6d5a3 100644 --- a/src/conftime.h +++ b/src/conftime.h @@ -1 +1 @@ -#define COMPILE_DATE_STRING "2010-04-22 01:39" +#define COMPILE_DATE_STRING "2010-05-21 00:52" diff --git a/src/editor.c b/src/editor.c index 7f1ec19f..5752d742 100644 --- a/src/editor.c +++ b/src/editor.c @@ -8173,7 +8173,7 @@ static int PrintElementDescriptionFromFile(char *filename, int start_line) int max_lines_per_screen = (SYSIZE - pad_y) / font_height - 1; return DrawTextFile(sx, sy, filename, font_nr, max_chars_per_line, -1, - max_lines_per_screen, -1, TRUE, FALSE, FALSE); + max_lines_per_screen, 0, -1, TRUE, FALSE, FALSE); } static void DrawPropertiesInfo() diff --git a/src/engines.h b/src/engines.h index 42d64b54..8bd49cb8 100644 --- a/src/engines.h +++ b/src/engines.h @@ -34,6 +34,7 @@ extern int getGameFrameDelay_EM(int); extern void PlayLevelSound_EM(int, int, int, int); extern void InitGraphicInfo_EM(void); +extern void CheckSingleStepMode_EM(byte action[], int, boolean); void SetGfxAnimation_EM(struct GraphicInfo_EM *, int, int, int, int); void getGraphicSourceObjectExt_EM(struct GraphicInfo_EM *, int, int, int, int); @@ -48,6 +49,8 @@ void getGraphicSourcePlayerExt_EM(struct GraphicInfo_EM *, int, int, int); extern void SetBitmaps_SP(Bitmap **); #endif +void CheckSingleStepMode_SP(boolean); + void getGraphicSource_SP(struct GraphicInfo_SP *, int, int, int, int); int getGraphicInfo_Delay(int); boolean isNextAnimationFrame_SP(int, int); diff --git a/src/files.c b/src/files.c index 52589dff..d7ba3c93 100644 --- a/src/files.c +++ b/src/files.c @@ -10334,6 +10334,10 @@ void LoadMusicInfo() if (!music_info_listed(music_file_info, music->filename)) { *new = get_music_file_info(music->filename, i); +#if 0 + if (*new != NULL) + printf(":1: adding '%s' ['%s'] ...\n", (*new)->title, music->filename); +#endif if (*new != NULL) new = &(*new)->next; } @@ -10379,6 +10383,10 @@ void LoadMusicInfo() if (!music_info_listed(music_file_info, basename)) { *new = get_music_file_info(basename, MAP_NOCONF_MUSIC(num_music_noconf)); +#if 0 + if (*new != NULL) + printf(":2: adding '%s' ['%s'] ...\n", (*new)->title, basename); +#endif if (*new != NULL) new = &(*new)->next; } diff --git a/src/game_em/graphics.c b/src/game_em/graphics.c index d7640e77..5764e9e3 100644 --- a/src/game_em/graphics.c +++ b/src/game_em/graphics.c @@ -130,8 +130,23 @@ void BackToFront_EM(void) else { #if 1 - boolean half_shifted_x = (EVEN(SCR_FIELDX) && screen_x % TILEX); - boolean half_shifted_y = (EVEN(SCR_FIELDY) && screen_y % TILEY); +#if 1 + boolean half_shifted_x = (screen_x % TILEX != 0); + boolean half_shifted_y = (screen_y % TILEY != 0); +#else + boolean half_shifted_x = (EVEN(SCR_FIELDX) && screen_x % TILEX != 0); + boolean half_shifted_y = (EVEN(SCR_FIELDY) && screen_y % TILEY != 0); +#endif + +#if 0 +#if 1 + printf("::: %d, %d\n", EVEN(SCR_FIELDX), screen_x); +#else + half_shifted_x = TRUE; + half_shifted_y = FALSE; +#endif +#endif + int x1 = 0, x2 = SCR_FIELDX - (half_shifted_x ? 0 : 1); int y1 = 0, y2 = SCR_FIELDY - (half_shifted_y ? 0 : 1); int scroll_xoffset = (half_shifted_x ? TILEX / 2 : 0); @@ -254,7 +269,11 @@ static void DrawLevelField_EM(int x, int y, int sx, int sy, static void DrawLevelFieldCrumbled_EM(int x, int y, int sx, int sy, int crm, boolean draw_masked) { +#if 1 + struct GraphicInfo_EM *g; +#else struct GraphicInfo_EM *g = getObjectGraphic(x, y); +#endif int left = screen_x / TILEX; int top = screen_y / TILEY; int i; @@ -267,6 +286,10 @@ static void DrawLevelFieldCrumbled_EM(int x, int y, int sx, int sy, if (crm == 0) /* no crumbled edges for this tile */ return; +#if 1 + g = getObjectGraphic(x, y); +#endif + #if 0 if (x == 3 && y == 3 && frame == 0) printf("::: %d, %d\n", diff --git a/src/game_em/input.c b/src/game_em/input.c index cc703ba9..7447f4b1 100644 --- a/src/game_em/input.c +++ b/src/game_em/input.c @@ -91,6 +91,7 @@ void GameActions_EM(byte action[MAX_PLAYERS], boolean warp_mode) printf("::: %05d: %lu, %d\n", FrameCounter, RandomEM, frame); #endif +#if 0 game_animscreen(); #if 1 @@ -99,6 +100,7 @@ void GameActions_EM(byte action[MAX_PLAYERS], boolean warp_mode) #endif blitscreen(); +#endif #endif RandomEM = RandomEM * 129 + 1; @@ -124,6 +126,20 @@ void GameActions_EM(byte action[MAX_PLAYERS], boolean warp_mode) if (!warp_mode) /* do not redraw values in warp mode */ DrawGameDoorValues_EM(); } + + CheckSingleStepMode_EM(action, frame, game_em.any_player_moving); + +#if 1 + game_animscreen(); + +#if 1 +#if 0 + SyncDisplay(); +#endif + + blitscreen(); +#endif +#endif } /* read input device for players */ diff --git a/src/game_sp/main.c b/src/game_sp/main.c index 4da92cd3..1308353d 100644 --- a/src/game_sp/main.c +++ b/src/game_sp/main.c @@ -86,6 +86,8 @@ void GameActions_SP(byte action[MAX_PLAYERS], boolean warp_mode) if (!warp_mode) /* do not redraw values in warp mode */ DrawGameDoorValues_SP(); + CheckSingleStepMode_SP(PlayField16[MurphyPosIndex] != fiMurphy); + for (x = DisplayMinX; x <= DisplayMaxX; x++) for (y = DisplayMinY; y <= DisplayMaxY; y++) GfxFrame[x][y]++; diff --git a/src/libgame/gadgets.c b/src/libgame/gadgets.c index 3d593a9b..4ac2a294 100644 --- a/src/libgame/gadgets.c +++ b/src/libgame/gadgets.c @@ -383,7 +383,7 @@ static void DrawGadget(struct GadgetInfo *gi, boolean pressed, boolean direct) /* gadget text value */ #if 1 DrawTextBuffer(gi->x + border_x, gi->y + border_y, gi->textarea.value, - font_nr, gi->textarea.xsize, -1, gi->textarea.ysize, + font_nr, gi->textarea.xsize, 0, -1, gi->textarea.ysize, BLIT_ON_BACKGROUND, FALSE, FALSE, FALSE); #else DrawTextToTextArea(gi->x + border_x, gi->y + border_y, diff --git a/src/libgame/misc.c b/src/libgame/misc.c index d21815b2..b8f2fe5c 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -1873,7 +1873,7 @@ boolean FileIsMusic(char *filename) return TRUE; #if defined(TARGET_SDL) - if (fileHasPrefix(basename, "mod") || + if ((fileHasPrefix(basename, "mod") && !fileHasSuffix(basename, "txt")) || fileHasSuffix(basename, "mod") || fileHasSuffix(basename, "s3m") || fileHasSuffix(basename, "it") || diff --git a/src/libgame/text.c b/src/libgame/text.c index f0cdb01a..23de7cac 100644 --- a/src/libgame/text.c +++ b/src/libgame/text.c @@ -188,6 +188,22 @@ void getFontCharSource(int font_nr, char c, Bitmap **bitmap, int *x, int *y) } +/* ========================================================================= */ +/* text string helper functions */ +/* ========================================================================= */ + +int maxWordLengthInString(char *text) +{ + char *text_ptr; + int max_word_len = 0; + + for (text_ptr = text; *text_ptr; text_ptr++) + max_word_len = (*text_ptr != ' ' ? max_word_len + 1 : 0); + + return max_word_len; +} + + /* ========================================================================= */ /* simple text drawing functions */ /* ========================================================================= */ @@ -728,7 +744,8 @@ static boolean getCheckedTokenValueFromString(char *string, char **token, } static void DrawTextBuffer_Flush(int x, int y, char *buffer, int font_nr, - int line_length, int cut_length, int mask_mode, + int line_length, int cut_length, + int line_spacing, int mask_mode, boolean centered, int current_line) { int buffer_len = strlen(buffer); @@ -739,7 +756,7 @@ static void DrawTextBuffer_Flush(int x, int y, char *buffer, int font_nr, (centered ? font_width * (line_length - buffer_len) / 2 : 0); int final_cut_length = MAX(0, cut_length - offset_chars); int xx = x + offset_xsize; - int yy = y + current_line * font_height; + int yy = y + current_line * (font_height + line_spacing); buffer[final_cut_length] = '\0'; @@ -751,8 +768,8 @@ static void DrawTextBuffer_Flush(int x, int y, char *buffer, int font_nr, int DrawTextBuffer(int x, int y, char *text_buffer, int font_nr, int line_length, int cut_length, int max_lines, - int mask_mode, boolean autowrap, boolean centered, - boolean parse_comments) + int line_spacing, int mask_mode, boolean autowrap, + boolean centered, boolean parse_comments) { #if 0 int font_width = getFontWidth(font_nr); @@ -808,7 +825,7 @@ int DrawTextBuffer(int x, int y, char *text_buffer, int font_nr, if (buffer_len > 0 && current_line < max_lines) { DrawTextBuffer_Flush(x, y, buffer, font_nr, line_length, cut_length, - mask_mode, centered, current_line); + line_spacing, mask_mode, centered, current_line); current_line++; @@ -876,7 +893,7 @@ int DrawTextBuffer(int x, int y, char *text_buffer, int font_nr, { #if 1 DrawTextBuffer_Flush(x, y, buffer, font_nr, line_length, cut_length, - mask_mode, centered, current_line); + line_spacing, mask_mode, centered, current_line); #else int offset_chars = (centered ? (line_length - buffer_len) / 2 : 0); int offset_xsize = @@ -907,7 +924,7 @@ int DrawTextBuffer(int x, int y, char *text_buffer, int font_nr, { #if 1 DrawTextBuffer_Flush(x, y, buffer, font_nr, line_length, cut_length, - mask_mode, centered, current_line); + line_spacing, mask_mode, centered, current_line); #else int offset_chars = (centered ? (line_length - buffer_len) / 2 : 0); int offset_xsize = @@ -932,14 +949,14 @@ int DrawTextBuffer(int x, int y, char *text_buffer, int font_nr, int DrawTextFile(int x, int y, char *filename, int font_nr, int line_length, int cut_length, int max_lines, - int mask_mode, boolean autowrap, boolean centered, - boolean parse_comments) + int line_spacing, int mask_mode, boolean autowrap, + boolean centered, boolean parse_comments) { char *text_buffer = GetTextBufferFromFile(filename, MAX_LINES_FROM_FILE); int num_lines_printed = DrawTextBuffer(x, y, text_buffer, font_nr, line_length, cut_length, max_lines, - mask_mode, autowrap, centered, - parse_comments); + line_spacing, mask_mode, autowrap, + centered, parse_comments); checked_free(text_buffer); return num_lines_printed; diff --git a/src/libgame/text.h b/src/libgame/text.h index 146648a3..1d54a716 100644 --- a/src/libgame/text.h +++ b/src/libgame/text.h @@ -73,6 +73,8 @@ int getTextWidth(char *, int); void getFontCharSource(int, char, Bitmap **, int *, int *); +int maxWordLengthInString(char *); + void DrawInitText(char *, int, int); void DrawInitTextIfNeeded(char *, int, int); void DrawInitTextExt(char *, int, int, boolean); @@ -87,9 +89,9 @@ void DrawText(int, int, char *, int); void DrawTextExt(DrawBuffer *, int, int, char *, int, int); char *GetTextBufferFromFile(char *, int); -int DrawTextBuffer(int, int, char *, int, int, int, int, int, boolean, boolean, - boolean); -int DrawTextFile(int, int, char *, int, int, int, int, int, boolean, boolean, - boolean); +int DrawTextBuffer(int, int, char *, int, int, int, int, int, int, + boolean, boolean, boolean); +int DrawTextFile(int, int, char *, int, int, int, int, int, int, + boolean, boolean, boolean); #endif /* TEXT_H */ diff --git a/src/main.c b/src/main.c index 63d70d6e..d5dbe91c 100644 --- a/src/main.c +++ b/src/main.c @@ -96,6 +96,7 @@ int REAL_SX = 6, REAL_SY = 6; int DX = 566, DY = 60; int VX = 566, VY = 400; int EX = 566, EY = 356; +int dDX, dDY; #if 1 int FX, FY; diff --git a/src/main.h b/src/main.h index c237aa33..97f99115 100644 --- a/src/main.h +++ b/src/main.h @@ -2869,6 +2869,7 @@ extern int REAL_SX, REAL_SY; extern int DX, DY; extern int VX, VY; extern int EX, EY; +extern int dDX, dDY; extern int FX, FY; extern int ScrollStepSize; diff --git a/src/screens.c b/src/screens.c index 4bee7dc2..493e9984 100644 --- a/src/screens.c +++ b/src/screens.c @@ -1190,7 +1190,7 @@ void DrawTitleScreenMessage(int nr, boolean initial) ClearRectangleOnBackground(drawto, 0, 0, WIN_XSIZE, WIN_YSIZE); DrawTextFile(ALIGNED_TEXT_XPOS(tmi), ALIGNED_TEXT_YPOS(tmi), - filename, tmi->font, tmi->chars, -1, tmi->lines, -1, + filename, tmi->font, tmi->chars, -1, tmi->lines, 0, -1, tmi->autowrap, tmi->centered, tmi->parse_comments); game_status = last_game_status; /* restore current game status */ @@ -2256,7 +2256,7 @@ void DrawInfoScreen_HelpText(int element, int action, int direction, int ypos) sy += getFontHeight(font_nr) / 2; DrawTextBuffer(sx, sy + ypos * ystep, text, font_nr, - max_chars_per_line, -1, max_lines_per_text, -1, + max_chars_per_line, -1, max_lines_per_text, 0, -1, TRUE, FALSE, FALSE); } @@ -3060,7 +3060,7 @@ void DrawInfoScreen_LevelSet() if (filename != NULL) DrawTextFile(mSX + ALIGNED_TEXT_XPOS(tmi), mSY + ALIGNED_TEXT_YPOS(tmi), - filename, tmi->font, tmi->chars, -1, tmi->lines, -1, + filename, tmi->font, tmi->chars, -1, tmi->lines, 0, -1, tmi->autowrap, tmi->centered, tmi->parse_comments); else DrawTextCentered(mSY + ALIGNED_TEXT_YPOS(tmi), FONT_TEXT_2, diff --git a/src/tools.c b/src/tools.c index 97888462..0875bf5d 100644 --- a/src/tools.c +++ b/src/tools.c @@ -2099,7 +2099,7 @@ void AnimateEnvelope(int envelope_nr, int anim_mode, int action) #if 1 DrawTextBuffer(SX + sx + font_width, SY + sy + font_height, level.envelope[envelope_nr].text, font_nr, max_xsize, - xsize - 2, ysize - 2, mask_mode, + xsize - 2, ysize - 2, 0, mask_mode, level.envelope[envelope_nr].autowrap, level.envelope[envelope_nr].centered, FALSE); #else @@ -2128,12 +2128,24 @@ void AnimateEnvelopeDoor(char *text, int anim_mode, int action) unsigned long anim_delay = 0; int frame_delay_value = (ffwd_delay ? FfwdFrameDelay : GameFrameDelay); int anim_delay_value = (no_delay ? 0 : frame_delay_value); +#if 1 + int max_word_len = maxWordLengthInString(text); + int font_nr = (max_word_len > 7 ? FONT_TEXT_1 : FONT_TEXT_2); +#else int font_nr = FONT_ENVELOPE_1 + envelope_nr; +#endif int font_width = getFontWidth(font_nr); int font_height = getFontHeight(font_nr); #if 1 + +#if 1 + int max_xsize = DXSIZE / font_width; + int max_ysize = DYSIZE / font_height; +#else int max_xsize = 7; /* tools.c: MAX_REQUEST_LINE_FONT1_LEN == 7 */ int max_ysize = 13; /* tools.c: MAX_REQUEST_LINES == 13 */ +#endif + #else int max_xsize = level.envelope[envelope_nr].xsize; int max_ysize = level.envelope[envelope_nr].ysize; @@ -2147,6 +2159,18 @@ void AnimateEnvelopeDoor(char *text, int anim_mode, int action) int x, y; #if 1 + char *text_ptr; + char *text_copy = getStringCopy(text); +#else +#if 1 + font_nr = FONT_TEXT_2; + + if (maxWordLengthInString(text) > 7) /* MAX_REQUEST_LINE_FONT1_LEN == 7 */ + { + max_xsize = 10; /* tools.c: MAX_REQUEST_LINE_FONT2_LEN == 10 */ + font_nr = FONT_TEXT_1; + } +#else int max_word_len = 0; char *text_ptr; char *text_copy = getStringCopy(text); @@ -2165,12 +2189,23 @@ void AnimateEnvelopeDoor(char *text, int anim_mode, int action) break; } } +#endif +#endif +#if 1 for (text_ptr = text_copy; *text_ptr; text_ptr++) if (*text_ptr == ' ') *text_ptr = '\n'; #endif +#if 1 + dDX = SX + (SXSIZE - DXSIZE) / 2 - DX; + dDY = SY + (SYSIZE - DYSIZE) / 2 - DY; +#else + dDX = SX + SXSIZE / 2 - max_xsize * font_width / 2 - DX; + dDY = SY + SYSIZE / 2 - max_ysize * font_height / 2 - DY; +#endif + for (x = xstart, y = ystart; x <= xend && y <= yend; x += xstep, y += ystep) { int xsize = (action == ACTION_CLOSING ? xend - (x - xstart) : x) + 2; @@ -2195,14 +2230,14 @@ void AnimateEnvelopeDoor(char *text, int anim_mode, int action) #if 1 #if 1 - DrawTextBuffer(SX + sx + font_width, SY + sy + font_height, + DrawTextBuffer(SX + sx + font_width, SY + sy + font_height + 8, text_copy, font_nr, max_xsize, - xsize - 2, ysize - 2, mask_mode, + xsize - 2, ysize - 2, 2, mask_mode, FALSE, TRUE, FALSE); #else DrawTextBuffer(SX + sx + font_width, SY + sy + font_height, level.envelope[envelope_nr].text, font_nr, max_xsize, - xsize - 2, ysize - 2, mask_mode, + xsize - 2, ysize - 2, 0, mask_mode, level.envelope[envelope_nr].autowrap, level.envelope[envelope_nr].centered, FALSE); #endif @@ -2213,8 +2248,30 @@ void AnimateEnvelopeDoor(char *text, int anim_mode, int action) xsize - 2, ysize - 2, mask_mode); #endif + /* copy request gadgets to door backbuffer */ +#if 1 + if ((ysize - 2) > 13) + BlitBitmap(bitmap_db_door, drawto, + DOOR_GFX_PAGEX1 + (DXSIZE - (xsize - 2) * font_width) / 2, + DOOR_GFX_PAGEY1 + 13 * font_height, + (xsize - 2) * font_width, + (ysize - 2 - 13) * font_height, + SX + sx + font_width, + SY + sy + font_height * (1 + 13)); +#else + if ((ysize - 2) > 13) + BlitBitmap(bitmap_db_door, drawto, + DOOR_GFX_PAGEX1 + (DXSIZE - (xsize - 2) * font_width) / 2, + DOOR_GFX_PAGEY1 + 13 * font_height, + (xsize - 2) * font_width, + (ysize - 2 - 13) * font_height, + SX + sx + font_width, + SY + sy + font_height * (1 + 13)); +#endif + #if 1 - redraw_mask |= REDRAW_ALL | REDRAW_FROM_BACKBUFFER; + redraw_mask = REDRAW_FIELD | REDRAW_FROM_BACKBUFFER; + // redraw_mask |= REDRAW_ALL | REDRAW_FROM_BACKBUFFER; #else redraw_mask |= REDRAW_FIELD | REDRAW_FROM_BACKBUFFER; #endif @@ -2229,7 +2286,9 @@ void AnimateEnvelopeDoor(char *text, int anim_mode, int action) WaitUntilDelayReached(&anim_delay, anim_delay_value / 2); } +#if 1 free(text_copy); +#endif } void ShowEnvelope(int envelope_nr) @@ -2276,20 +2335,23 @@ void ShowEnvelope(int envelope_nr) BackToFront(); } -void ShowEnvelopeDoor(char *text) +void ShowEnvelopeDoor(char *text, int action) { #if 1 int last_game_status = game_status; /* save current game status */ + // int last_draw_background_mask = gfx.draw_background_mask; int envelope_nr = 0; #endif int element = EL_ENVELOPE_1 + envelope_nr; int graphic = IMG_BACKGROUND_ENVELOPE_1 + envelope_nr; int sound_opening = element_info[element].sound[ACTION_OPENING]; int sound_closing = element_info[element].sound[ACTION_CLOSING]; +#if 0 boolean ffwd_delay = (tape.playing && tape.fast_forward); boolean no_delay = (tape.warp_forward); int normal_delay_value = ONE_SECOND_DELAY / (ffwd_delay ? 2 : 1); int wait_delay_value = (no_delay ? 0 : normal_delay_value); +#endif int anim_mode = graphic_info[graphic].anim_mode; int main_anim_mode = (anim_mode == ANIM_NONE ? ANIM_VERTICAL|ANIM_HORIZONTAL: anim_mode == ANIM_DEFAULT ? ANIM_VERTICAL : anim_mode); @@ -2309,10 +2371,15 @@ void ShowEnvelopeDoor(char *text) SetDrawtoField(DRAW_BACKBUFFER); - BlitBitmap(backbuffer, bitmap_db_store, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); + // SetDrawBackgroundMask(REDRAW_NONE); - if (game_status != GAME_MODE_MAIN) - InitAnimation(); + if (action == ACTION_OPENING) + { + BlitBitmap(backbuffer, bitmap_db_store, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); + + if (game_status != GAME_MODE_MAIN) + InitAnimation(); + } /* force DOOR font inside door area */ game_status = GAME_MODE_PSEUDO_DOOR; @@ -2320,41 +2387,54 @@ void ShowEnvelopeDoor(char *text) game.envelope_active = TRUE; /* needed for RedrawPlayfield() events */ - PlayMenuSoundStereo(sound_opening, SOUND_MIDDLE); + if (action == ACTION_OPENING) + { + PlayMenuSoundStereo(sound_opening, SOUND_MIDDLE); - if (anim_mode == ANIM_DEFAULT) - AnimateEnvelopeDoor(text, ANIM_DEFAULT, ACTION_OPENING); + if (anim_mode == ANIM_DEFAULT) + AnimateEnvelopeDoor(text, ANIM_DEFAULT, ACTION_OPENING); - AnimateEnvelopeDoor(text, main_anim_mode, ACTION_OPENING); + AnimateEnvelopeDoor(text, main_anim_mode, ACTION_OPENING); - if (tape.playing) - Delay(wait_delay_value); +#if 0 + if (tape.playing) + Delay(wait_delay_value); + else + WaitForEventToContinue(); +#endif + } else - WaitForEventToContinue(); - - PlayMenuSoundStereo(sound_closing, SOUND_MIDDLE); + { + PlayMenuSoundStereo(sound_closing, SOUND_MIDDLE); - if (anim_mode != ANIM_NONE) - AnimateEnvelopeDoor(text, main_anim_mode, ACTION_CLOSING); + if (anim_mode != ANIM_NONE) + AnimateEnvelopeDoor(text, main_anim_mode, ACTION_CLOSING); - if (anim_mode == ANIM_DEFAULT) - AnimateEnvelopeDoor(text, ANIM_DEFAULT, ACTION_CLOSING); + if (anim_mode == ANIM_DEFAULT) + AnimateEnvelopeDoor(text, ANIM_DEFAULT, ACTION_CLOSING); + } game.envelope_active = FALSE; #if 1 game_status = last_game_status; /* restore current game status */ - if (game_status != GAME_MODE_MAIN) - StopAnimation(); + if (action == ACTION_CLOSING) + { + if (game_status != GAME_MODE_MAIN) + StopAnimation(); - BlitBitmap(bitmap_db_store, backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); + BlitBitmap(bitmap_db_store, backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); + } #else SetDrawtoField(DRAW_BUFFERED); #endif + // SetDrawBackgroundMask(last_draw_background_mask); + #if 1 - redraw_mask |= REDRAW_ALL; + redraw_mask = REDRAW_FIELD; + // redraw_mask |= REDRAW_ALL; #else redraw_mask |= REDRAW_FIELD; #endif @@ -3298,13 +3378,20 @@ boolean Request(char *text, unsigned int req_state) int last_game_status = game_status; /* save current game status */ int max_request_line_len = MAX_REQUEST_LINE_FONT1_LEN; int font_nr = FONT_TEXT_2; + boolean use_envelope_request = TRUE * 0; +#if 0 int max_word_len = 0; +#endif char *text_ptr; + int i; #if 1 - ShowEnvelopeDoor(text); -#endif - + if (maxWordLengthInString(text) > MAX_REQUEST_LINE_FONT1_LEN) + { + max_request_line_len = MAX_REQUEST_LINE_FONT2_LEN; + font_nr = FONT_TEXT_1; + } +#else for (text_ptr = text; *text_ptr; text_ptr++) { max_word_len = (*text_ptr != ' ' ? max_word_len + 1 : 0); @@ -3321,6 +3408,7 @@ boolean Request(char *text, unsigned int req_state) break; } } +#endif if (game_status == GAME_MODE_PLAYING) { @@ -3352,7 +3440,11 @@ boolean Request(char *text, unsigned int req_state) UnmapAllGadgets(); +#if 1 + if (old_door_state & DOOR_OPEN_1 && !use_envelope_request) +#else if (old_door_state & DOOR_OPEN_1) +#endif { CloseDoor(DOOR_CLOSE_1); @@ -3375,40 +3467,49 @@ boolean Request(char *text, unsigned int req_state) game_status = GAME_MODE_PSEUDO_DOOR; /* write text for request */ - for (ty = 0; ty < MAX_REQUEST_LINES; ty++) + for (text_ptr = text, ty = 0; ty < MAX_REQUEST_LINES; ty++) { char text_line[max_request_line_len + 1]; int tx, tl, tc = 0; - if (!*text) + if (!*text_ptr) break; for (tl = 0, tx = 0; tx < max_request_line_len; tl++, tx++) { - tc = *(text + tx); + tc = *(text_ptr + tx); if (!tc || tc == ' ') break; } if (!tl) { - text++; + text_ptr++; ty--; continue; } - strncpy(text_line, text, tl); + strncpy(text_line, text_ptr, tl); text_line[tl] = 0; DrawText(DX + (DXSIZE - tl * getFontWidth(font_nr)) / 2, DY + 8 + ty * (getFontHeight(font_nr) + 2), text_line, font_nr); - text += tl + (tc == ' ' ? 1 : 0); + text_ptr += tl + (tc == ' ' ? 1 : 0); } game_status = last_game_status; /* restore current game status */ +#if 1 + if (use_envelope_request) + { + /* !!! TMP !!! */ + FreeToolButtons(); + CreateToolButtons(); + } +#endif + if (req_state & REQ_ASK) { MapGadget(tool_gadget[TOOL_CTRL_ID_YES]); @@ -3431,7 +3532,36 @@ boolean Request(char *text, unsigned int req_state) DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1); +#if 1 + if (use_envelope_request) + { + ShowEnvelopeDoor(text, ACTION_OPENING); + + for (i = 0; i < NUM_TOOL_BUTTONS; i++) + { + if ((req_state & REQ_ASK && (i == TOOL_CTRL_ID_YES || + i == TOOL_CTRL_ID_NO)) || + (req_state & REQ_CONFIRM && i == TOOL_CTRL_ID_CONFIRM) || + (req_state & REQ_PLAYER && (i == TOOL_CTRL_ID_PLAYER_1 && + i == TOOL_CTRL_ID_PLAYER_2 && + i == TOOL_CTRL_ID_PLAYER_3 && + i == TOOL_CTRL_ID_PLAYER_4))) + { + int x = tool_gadget[i]->x + dDX; + int y = tool_gadget[i]->y + dDY; + + ModifyGadget(tool_gadget[i], GDI_X, x, GDI_Y, y, GDI_END); + } + } + } +#endif + +#if 1 + if (!use_envelope_request) + OpenDoor(DOOR_OPEN_1); +#else OpenDoor(DOOR_OPEN_1); +#endif if (!(req_state & REQUEST_WAIT_FOR_INPUT)) { @@ -3448,8 +3578,13 @@ boolean Request(char *text, unsigned int req_state) return FALSE; } +#if 1 + if (game_status != GAME_MODE_MAIN && !use_envelope_request) + InitAnimation(); +#else if (game_status != GAME_MODE_MAIN) InitAnimation(); +#endif button_status = MB_RELEASED; @@ -3608,7 +3743,16 @@ boolean Request(char *text, unsigned int req_state) UnmapToolButtons(); +#if 1 + if (use_envelope_request) + ShowEnvelopeDoor(text, ACTION_CLOSING); +#endif + +#if 1 + if (!(req_state & REQ_STAY_OPEN) && !use_envelope_request) +#else if (!(req_state & REQ_STAY_OPEN)) +#endif { CloseDoor(DOOR_CLOSE_1); @@ -6633,6 +6777,12 @@ inline static int get_effective_element_EM(int tile, int frame_em) case Yacid_splash_wB: return (frame_em > 5 ? EL_EMPTY : element); +#if 0 + case Ydiamond_stone: + // if (!game.use_native_emc_graphics_engine) + return EL_ROCK; +#endif + default: return element; } @@ -6710,6 +6860,11 @@ inline static boolean check_linear_animation_EM(int tile) case Ytank_s_e: case Ytank_w_s: case Ytank_n_w: +#if 1 + case Yacid_splash_eB: + case Yacid_splash_wB: + case Yemerald_stone: +#endif return TRUE; } @@ -7318,6 +7473,23 @@ void getGraphicSourceObjectExt_EM(struct GraphicInfo_EM *g_em, #endif +#if 1 + if (tile == Ydiamond_stone) + printf("::: stone smashing diamond... %d: %d, %d, %d, %d, %d -> %d [%d, %d, %d, %d, %d, %d] [%d]\n", + frame_em, + g->anim_frames, + g->anim_delay, + g->anim_mode, + g->anim_start_frame, + sync_frame, + frame, + g_em->src_x, g_em->src_y, + g_em->src_offset_x, g_em->src_offset_y, + g_em->dst_offset_x, g_em->dst_offset_y, + graphic); +#endif + + #if 0 return; #endif @@ -8160,6 +8332,33 @@ void InitGraphicInfo_EM(void) #endif } +void CheckSingleStepMode_EM(byte action[MAX_PLAYERS], int frame, + boolean any_player_moving) +{ + int i; + + if (tape.single_step && tape.recording && !tape.pausing) + { + boolean active_players = FALSE; + + for (i = 0; i < MAX_PLAYERS; i++) + if (action[i] != JOY_NO_ACTION) + active_players = TRUE; + + if (frame == 0) + TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); + } +} + +void CheckSingleStepMode_SP(boolean murphy_is_moving) +{ + if (tape.single_step && tape.recording && !tape.pausing) + { + if (!murphy_is_moving) + TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); + } +} + void getGraphicSource_SP(struct GraphicInfo_SP *g_sp, int graphic, int sync_frame, int x, int y) { diff --git a/src/tools.h b/src/tools.h index e0a6fcd6..510524af 100644 --- a/src/tools.h +++ b/src/tools.h @@ -147,7 +147,7 @@ void DrawMiniElement(int, int, int); void DrawMiniElementOrWall(int, int, int, int); void ShowEnvelope(int); -void ShowEnvelopeDoor(char *text); +void ShowEnvelopeDoor(char *text, int); void DrawLevel(void); void DrawMiniLevel(int, int, int, int);