#include "cartoons.h"
#include "network.h"
#include "init.h"
+#include "config.h"
/* screens in the setup menu */
#define SETUP_MODE_MAIN 0
#define INFO_MODE_MUSIC 3
#define INFO_MODE_CREDITS 4
#define INFO_MODE_PROGRAM 5
-#define INFO_MODE_LEVELSET 6
+#define INFO_MODE_VERSION 6
+#define INFO_MODE_LEVELSET 7
-#define MAX_INFO_MODES 7
+#define MAX_INFO_MODES 8
/* for various menu stuff */
#define MENU_SCREEN_START_XPOS 1
static void HandleInfoScreen_Music(int);
static void HandleInfoScreen_Credits(int);
static void HandleInfoScreen_Program(int);
+static void HandleInfoScreen_Version(int);
static void MapScreenMenuGadgets(int);
static void MapScreenTreeGadgets(TreeInfo *);
static struct GadgetInfo *screen_gadget[NUM_SCREEN_GADGETS];
-static boolean show_titlescreen_initial = TRUE;
-
static int setup_mode = SETUP_MODE_MAIN;
static int info_mode = INFO_MODE_MAIN;
#endif
+/* title display and control definitions */
+
+#define MAX_NUM_TITLE_SCREENS (2 * MAX_NUM_TITLE_IMAGES + \
+ 2 * MAX_NUM_TITLE_MESSAGES)
+
+static boolean show_title_initial = TRUE;
+static int num_title_screens = 0;
+
+struct TitleControlInfo
+{
+ boolean is_image;
+ boolean initial;
+ int local_nr;
+};
+
+struct TitleControlInfo title_controls[MAX_NUM_TITLE_SCREENS];
+
+
+/* main menu display and control definitions */
+
#define MAIN_CONTROL_NAME 0
#define MAIN_CONTROL_LEVELS 1
#define MAIN_CONTROL_SCORES 2
struct MenuPosInfo *pos_button;
int button_graphic;
- struct MenuPosInfo *pos_text;
+ struct TextPosInfo *pos_text;
char *text;
int font_text;
};
+static int getTitleScreenGraphic(int nr, boolean initial)
+{
+ return (initial ? IMG_TITLESCREEN_INITIAL_1 : IMG_TITLESCREEN_1) + nr;
+}
+
+static void InitializeTitleControlsExt_AddTitleInfo(boolean is_image,
+ boolean initial, int nr)
+{
+ title_controls[num_title_screens].is_image = is_image;
+ title_controls[num_title_screens].initial = initial;
+ title_controls[num_title_screens].local_nr = nr;
+
+ num_title_screens++;
+}
+
+static void InitializeTitleControls_CheckTitleInfo(boolean initial)
+{
+ int i;
+
+ for (i = 0; i < MAX_NUM_TITLE_IMAGES; i++)
+ if (graphic_info[getTitleScreenGraphic(i, initial)].bitmap != NULL)
+ InitializeTitleControlsExt_AddTitleInfo(TRUE, initial, i);
+
+ for (i = 0; i < MAX_NUM_TITLE_MESSAGES; i++)
+ if (getLevelSetTitleMessageFilename(i, initial) != NULL)
+ InitializeTitleControlsExt_AddTitleInfo(FALSE, initial, i);
+}
+
+static void InitializeTitleControls()
+{
+ num_title_screens = 0;
+
+ if (show_title_initial)
+ InitializeTitleControls_CheckTitleInfo(TRUE);
+
+ InitializeTitleControls_CheckTitleInfo(FALSE);
+}
+
static void InitializeMainControls()
{
boolean local_team_mode = (!options.network && setup.team_mode);
struct MainControlInfo *mci = &main_controls[i];
int nr = mci->nr;
struct MenuPosInfo *pos_button = mci->pos_button;
- struct MenuPosInfo *pos_text = mci->pos_text;
+ struct TextPosInfo *pos_text = mci->pos_text;
struct MenuPosInfo *pos_input = mci->pos_input;
char *text = mci->text;
char *input = mci->input;
menu.main.input.name.y = menu.main.text.name.y;
#endif
+#if 1
+ menu.main.input.name.width = input_width;
+ menu.main.input.name.height = input_height;
+#else
menu.main.input.name.width = font_input_width * MAX_PLAYER_NAME_LEN;
menu.main.input.name.height = font_input_height;
+#endif
}
if (pos_button != NULL)
if (mci->nr == nr || nr == -1)
{
struct MenuPosInfo *pos_button = mci->pos_button;
- struct MenuPosInfo *pos_text = mci->pos_text;
+ struct TextPosInfo *pos_text = mci->pos_text;
struct MenuPosInfo *pos_input = mci->pos_input;
char *text = mci->text;
char *input = mci->input;
if (pos_text != NULL && text != NULL)
{
- struct MenuPosInfo *pos = pos_text;
- int x = mSX + ALIGNED_XPOS(pos->x, pos->width, pos->align);
- int y = mSY + pos->y;
+ struct TextPosInfo *pos = pos_text;
+ int x = mSX + ALIGNED_MENU_XPOS(pos);
+ int y = mSY + ALIGNED_MENU_YPOS(pos);
DrawBackgroundForFont(x, y, pos->width, pos->height, font_text);
DrawText(x, y, text, font_text);
if (pos_input != NULL && input != NULL)
{
struct MenuPosInfo *pos = pos_input;
- int x = mSX + ALIGNED_XPOS(pos->x, pos->width, pos->align);
- int y = mSY + pos->y;
+ int x = mSX + ALIGNED_MENU_XPOS(pos);
+ int y = mSY + ALIGNED_MENU_YPOS(pos);
DrawBackgroundForFont(x, y, pos->width, pos->height, font_input);
DrawText(x, y, input, font_input);
if (rect == NULL)
return FALSE;
- int rect_x = ALIGNED_XPOS(rect->x, rect->width, rect->align);
- int rect_y = rect->y;
+ int rect_x = ALIGNED_MENU_XPOS(rect);
+ int rect_y = ALIGNED_MENU_YPOS(rect);
+
+ return (x >= rect_x && x < rect_x + rect->width &&
+ y >= rect_y && y < rect_y + rect->height);
+}
+
+static boolean insideTextPosRect(struct TextPosInfo *rect, int x, int y)
+{
+ if (rect == NULL)
+ return FALSE;
+
+ int rect_x = ALIGNED_MENU_XPOS(rect);
+ int rect_y = ALIGNED_MENU_YPOS(rect);
return (x >= rect_x && x < rect_x + rect->width &&
y >= rect_y && y < rect_y + rect->height);
}
#endif
-static int getTitleScreenGraphic()
-{
- return (show_titlescreen_initial ? IMG_TITLESCREEN_INITIAL_1 :
- IMG_TITLESCREEN_1);
-}
-
int effectiveGameStatus()
{
if (game_status == GAME_MODE_INFO && info_mode == INFO_MODE_TITLE)
return game_status;
}
-void DrawTitleScreenImage(int nr)
+void DrawTitleScreenImage(int nr, boolean initial)
{
- int graphic = getTitleScreenGraphic() + nr;
+ int graphic = getTitleScreenGraphic(nr, initial);
Bitmap *bitmap = graphic_info[graphic].bitmap;
#if 1
int width = graphic_info[graphic].width;
title.auto_delay_final = graphic_info[graphic].auto_delay;
}
-void DrawTitleScreenMessage(char *filename)
+void DrawTitleScreenMessage(int nr, boolean initial)
{
+ char *filename = getLevelSetTitleMessageFilename(nr, initial);
int font_nr = FONT_TEXT_1;
int font_width;
int font_height;
/* needed if last screen (level choice) changed graphics, sounds or music */
ReloadCustomArtwork(0);
-#ifdef TARGET_SDL
+#if defined(TARGET_SDL)
SetDrawtoField(DRAW_BACKBUFFER);
#endif
+#if 1
+ if (setup.show_titlescreen && (show_title_initial || levelset_has_changed))
+ {
+ /* needed to be able to skip title screen, if no image or message defined */
+ InitializeTitleControls();
+
+ if (num_title_screens > 0)
+ {
+ game_status = GAME_MODE_TITLE;
+
+ DrawTitleScreen();
+
+ return;
+ }
+ }
+#else
if (setup.show_titlescreen &&
((levelset_has_changed &&
(graphic_info[IMG_TITLESCREEN_1].bitmap != NULL ||
- getLevelSetMessageFilename() != NULL)) ||
- (show_titlescreen_initial &&
- graphic_info[IMG_TITLESCREEN_INITIAL_1].bitmap != NULL)))
+ getLevelSetMessageFilename(1, FALSE) != NULL)) ||
+ (show_title_initial &&
+ (graphic_info[IMG_TITLESCREEN_INITIAL_1].bitmap != NULL ||
+ getLevelSetMessageFilename(1, TRUE) != NULL))))
{
game_status = GAME_MODE_TITLE;
return;
}
+#endif
/* level_nr may have been set to value over handicap with level editor */
if (setup.handicap && level_nr > leveldir_current->handicap_level)
}
#endif
+#if 1
+void HandleTitleScreen(int mx, int my, int dx, int dy, int button)
+{
+ static unsigned long title_delay = 0;
+ static int title_screen_nr = 0;
+ boolean return_to_main_menu = FALSE;
+ boolean use_fading_main_menu = TRUE;
+ boolean use_cross_fading = !show_title_initial; /* default */
+ struct TitleControlInfo *tci;
+
+ if (button == MB_MENU_INITIALIZE)
+ {
+ int last_game_status = game_status; /* save current game status */
+
+ title_delay = 0;
+ title_screen_nr = 0;
+ tci = &title_controls[title_screen_nr];
+
+ /* determine number of title screens to display (images and messages) */
+ InitializeTitleControls();
+
+ if (game_status == GAME_MODE_INFO)
+ {
+ if (num_title_screens == 0)
+ {
+ DrawInfoScreen_NotAvailable("Title screen information:",
+ "No title screen for this level set.");
+
+ title.auto_delay_final = -1;
+
+ return;
+ }
+
+ FadeSoundsAndMusic();
+
+ FadeOut(REDRAW_ALL);
+ }
+
+ /* force TITLE music on title info screen */
+ game_status = GAME_MODE_TITLE;
+
+ PlayMenuSound();
+ PlayMenuMusic();
+
+ game_status = last_game_status; /* restore current game status */
+
+ if (tci->is_image)
+ {
+ DrawTitleScreenImage(tci->local_nr, tci->initial);
+ }
+ else
+ {
+ DrawTitleScreenMessage(tci->local_nr, tci->initial);
+
+ title.fade_delay_final = title.fade_delay;
+ title.post_delay_final = title.post_delay;
+ title.auto_delay_final = -1;
+ }
+
+ FadeIn(REDRAW_ALL);
+
+ DelayReached(&title_delay, 0); /* reset delay counter */
+
+ return;
+ }
+
+ if (title.auto_delay_final > -1 &&
+ DelayReached(&title_delay, title.auto_delay_final))
+ button = MB_MENU_CHOICE;
+
+ if (button == MB_MENU_LEAVE)
+ {
+ return_to_main_menu = TRUE;
+ use_fading_main_menu = FALSE;
+ }
+ else if (button == MB_MENU_CHOICE)
+ {
+ int anim_mode;
+
+ if (game_status == GAME_MODE_INFO && num_title_screens == 0)
+ {
+ FadeOut(REDRAW_FIELD);
+
+ info_mode = INFO_MODE_MAIN;
+ DrawAndFadeInInfoScreen(REDRAW_FIELD);
+
+ return;
+ }
+
+ title_screen_nr++;
+ tci = &title_controls[title_screen_nr];
+
+ if (tci->is_image)
+ anim_mode =
+ graphic_info[getTitleScreenGraphic(tci->local_nr,
+ tci->initial)].anim_mode;
+ else
+ anim_mode = ANIM_FADE; /* ??? */
+
+ use_cross_fading = (anim_mode == ANIM_FADE ? FALSE :
+ anim_mode == ANIM_CROSSFADE ? TRUE :
+ use_cross_fading);
+
+ if (title_screen_nr < num_title_screens)
+ {
+ if (!use_cross_fading)
+ FadeOut(REDRAW_ALL);
+
+ if (use_cross_fading)
+ FadeCrossSaveBackbuffer();
+
+ if (tci->is_image)
+ DrawTitleScreenImage(tci->local_nr, tci->initial);
+ else
+ DrawTitleScreenMessage(tci->local_nr, tci->initial);
+
+ if (use_cross_fading)
+ FadeCross(REDRAW_ALL);
+ else
+ FadeIn(REDRAW_ALL);
+
+ DelayReached(&title_delay, 0); /* reset delay counter */
+ }
+ else
+ {
+ FadeSoundsAndMusic();
+
+ FadeOut(REDRAW_ALL);
+
+ return_to_main_menu = TRUE;
+ }
+ }
+
+ if (return_to_main_menu)
+ {
+ /* show initial title images and messages only once at program start */
+ show_title_initial = FALSE;
+
+ RedrawBackground();
+
+ if (game_status == GAME_MODE_INFO)
+ {
+ OpenDoor(DOOR_CLOSE_1 | DOOR_CLOSE_2 | DOOR_NO_DELAY | DOOR_FORCE_REDRAW);
+
+ info_mode = INFO_MODE_MAIN;
+ DrawInfoScreenExt(REDRAW_ALL, use_fading_main_menu);
+ }
+ else /* default: return to main menu */
+ {
+ OpenDoor(DOOR_CLOSE_1 | DOOR_OPEN_2 | DOOR_NO_DELAY | DOOR_FORCE_REDRAW);
+
+ game_status = GAME_MODE_MAIN;
+ DrawMainMenuExt(REDRAW_ALL, use_fading_main_menu);
+ }
+ }
+}
+
+#else
+
void HandleTitleScreen(int mx, int my, int dx, int dy, int button)
{
static unsigned long title_delay = 0;
char *filename = getLevelSetMessageFilename();
boolean return_to_main_menu = FALSE;
boolean use_fading_main_menu = TRUE;
- boolean use_cross_fading = !show_titlescreen_initial; /* default */
+ boolean use_cross_fading = !show_title_initial; /* default */
boolean no_title_info = (graphic_info[IMG_TITLESCREEN_1].bitmap == NULL &&
- filename == NULL);
+ getLevelSetMessageFilename(1, FALSE) == NULL);
if (button == MB_MENU_INITIALIZE)
{
title_nr = 0;
showing_message = FALSE;
- if (show_titlescreen_initial &&
- graphic_info[IMG_TITLESCREEN_INITIAL_1].bitmap == NULL)
- show_titlescreen_initial = FALSE;
+ if (show_title_initial &&
+ graphic_info[IMG_TITLESCREEN_INITIAL_1].bitmap == NULL &&
+ getLevelSetMessageFilename(1, TRUE) == NULL)
+ show_title_initial = FALSE;
if (game_status == GAME_MODE_INFO)
{
game_status = last_game_status; /* restore current game status */
- if (graphic_info[getTitleScreenGraphic()].bitmap != NULL)
+ if (graphic_info[getTitleScreenGraphic(0, show_title_initial)].bitmap != NULL)
{
- DrawTitleScreenImage(title_nr);
+ DrawTitleScreenImage(title_nr, show_title_initial);
}
else
{
title_nr++;
- if (show_titlescreen_initial &&
- (title_nr >= MAX_NUM_TITLE_SCREENS ||
+ if (show_title_initial &&
+ (title_nr >= MAX_NUM_TITLE_IMAGES ||
graphic_info[IMG_TITLESCREEN_INITIAL_1 + title_nr].bitmap == NULL))
{
- show_titlescreen_initial = FALSE;
+ show_title_initial = FALSE;
title_nr = 0; /* restart with title screens for current level set */
}
- anim_mode = graphic_info[getTitleScreenGraphic() + title_nr].anim_mode;
+ anim_mode = graphic_info[getTitleScreenGraphic(title_nr, show_title_initial)].anim_mode;
use_cross_fading = (anim_mode == ANIM_FADE ? FALSE :
anim_mode == ANIM_CROSSFADE ? TRUE :
if (!use_cross_fading)
FadeOut(REDRAW_ALL);
- if (title_nr < MAX_NUM_TITLE_SCREENS &&
- graphic_info[getTitleScreenGraphic() + title_nr].bitmap != NULL)
+ if (title_nr < MAX_NUM_TITLE_IMAGES &&
+ graphic_info[getTitleScreenGraphic(title_nr, show_title_initial)].bitmap != NULL)
{
if (use_cross_fading)
FadeCrossSaveBackbuffer();
- DrawTitleScreenImage(title_nr);
+ DrawTitleScreenImage(title_nr, show_title_initial);
if (use_cross_fading)
FadeCross(REDRAW_ALL);
if (return_to_main_menu)
{
- show_titlescreen_initial = FALSE;
+ show_title_initial = FALSE;
RedrawBackground();
}
}
}
+#endif
void HandleMainMenu_SelectLevel(int step, int direction)
{
for (i = 0; main_controls[i].nr != -1; i++)
{
if (insideMenuPosRect(main_controls[i].pos_button, mx - mSX, my - mSY) ||
- insideMenuPosRect(main_controls[i].pos_text, mx - mSX, my - mSY) ||
+ insideTextPosRect(main_controls[i].pos_text, mx - mSX, my - mSY) ||
insideMenuPosRect(main_controls[i].pos_input, mx - mSX, my - mSY))
{
pos = main_controls[i].nr;
DrawInfoScreen();
}
+static void execInfoVersion()
+{
+ info_mode = INFO_MODE_VERSION;
+ DrawInfoScreen();
+}
+
static void execInfoLevelSet()
{
info_mode = INFO_MODE_LEVELSET;
{ TYPE_ENTER_SCREEN, execInfoMusic, "Music Info" },
{ TYPE_ENTER_SCREEN, execInfoCredits, "Credits" },
{ TYPE_ENTER_SCREEN, execInfoProgram, "Program Info" },
+ { TYPE_ENTER_SCREEN, execInfoVersion, "Version Info" },
{ TYPE_ENTER_SCREEN, execInfoLevelSet, "Level Set Info" },
{ TYPE_EMPTY, NULL, "" },
{ TYPE_LEAVE_MENU, execExitInfo, "Exit" },
}
}
+void DrawInfoScreen_Version()
+{
+ int font_header = FONT_TEXT_3;
+ int font_text = FONT_TEXT_2;
+ int xstep = getFontWidth(font_text);
+ int ystep = getFontHeight(font_text);
+ int ystart = 150;
+ int ybottom = SYSIZE - 20;
+ int xstart1 = SX + 2 * xstep;
+ int xstart2 = SX + 18 * xstep;
+#if defined(TARGET_SDL)
+ int xstart3 = SX + 28 * xstep;
+ SDL_version sdl_version_compiled;
+ const SDL_version *sdl_version_linked;
+#endif
+
+ SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_PROGRAM);
+
+ FadeOut(REDRAW_FIELD);
+
+ ClearWindow();
+ DrawHeadline();
+
+ DrawTextSCentered(100, FONT_TEXT_1, "Version Information:");
+
+ DrawTextF(xstart1, ystart, font_header, "Name");
+ DrawTextF(xstart2, ystart, font_text, PROGRAM_TITLE_STRING);
+
+ ystart += ystep;
+ DrawTextF(xstart1, ystart, font_header, "Version");
+ DrawTextF(xstart2, ystart, font_text, getProgramFullVersionString());
+
+ ystart += ystep;
+ DrawTextF(xstart1, ystart, font_header, "Platform");
+ DrawTextF(xstart2, ystart, font_text, PLATFORM_STRING);
+
+ ystart += ystep;
+ DrawTextF(xstart1, ystart, font_header, "Target");
+ DrawTextF(xstart2, ystart, font_text, TARGET_STRING);
+
+ ystart += ystep;
+ DrawTextF(xstart1, ystart, font_header, "Compile time");
+ DrawTextF(xstart2, ystart, font_text, getCompileDateString());
+
+#if defined(TARGET_SDL)
+ ystart += 3 * ystep;
+ DrawTextF(xstart1, ystart, font_header, "Library");
+ DrawTextF(xstart2, ystart, font_header, "compiled");
+ DrawTextF(xstart3, ystart, font_header, "linked");
+
+ SDL_VERSION(&sdl_version_compiled);
+ sdl_version_linked = SDL_Linked_Version();
+
+ ystart += 2 * ystep;
+ DrawTextF(xstart1, ystart, font_text, "SDL");
+ DrawTextF(xstart2, ystart, font_text, "%d.%d.%d",
+ sdl_version_compiled.major,
+ sdl_version_compiled.minor,
+ sdl_version_compiled.patch);
+ DrawTextF(xstart3, ystart, font_text, "%d.%d.%d",
+ sdl_version_linked->major,
+ sdl_version_linked->minor,
+ sdl_version_linked->patch);
+
+ SDL_IMAGE_VERSION(&sdl_version_compiled);
+ sdl_version_linked = IMG_Linked_Version();
+
+ ystart += ystep;
+ DrawTextF(xstart1, ystart, font_text, "SDL_image");
+ DrawTextF(xstart2, ystart, font_text, "%d.%d.%d",
+ sdl_version_compiled.major,
+ sdl_version_compiled.minor,
+ sdl_version_compiled.patch);
+ DrawTextF(xstart3, ystart, font_text, "%d.%d.%d",
+ sdl_version_linked->major,
+ sdl_version_linked->minor,
+ sdl_version_linked->patch);
+
+ SDL_MIXER_VERSION(&sdl_version_compiled);
+ sdl_version_linked = Mix_Linked_Version();
+
+ ystart += ystep;
+ DrawTextF(xstart1, ystart, font_text, "SDL_mixer");
+ DrawTextF(xstart2, ystart, font_text, "%d.%d.%d",
+ sdl_version_compiled.major,
+ sdl_version_compiled.minor,
+ sdl_version_compiled.patch);
+ DrawTextF(xstart3, ystart, font_text, "%d.%d.%d",
+ sdl_version_linked->major,
+ sdl_version_linked->minor,
+ sdl_version_linked->patch);
+
+ SDL_NET_VERSION(&sdl_version_compiled);
+ sdl_version_linked = SDLNet_Linked_Version();
+
+ ystart += ystep;
+ DrawTextF(xstart1, ystart, font_text, "SDL_net");
+ DrawTextF(xstart2, ystart, font_text, "%d.%d.%d",
+ sdl_version_compiled.major,
+ sdl_version_compiled.minor,
+ sdl_version_compiled.patch);
+ DrawTextF(xstart3, ystart, font_text, "%d.%d.%d",
+ sdl_version_linked->major,
+ sdl_version_linked->minor,
+ sdl_version_linked->patch);
+#endif
+
+ DrawTextSCentered(ybottom, FONT_TEXT_4,
+ "Press any key or button for info menu");
+
+ FadeIn(REDRAW_FIELD);
+}
+
+void HandleInfoScreen_Version(int button)
+{
+ if (button == MB_MENU_LEAVE)
+ {
+ PlaySound(SND_MENU_ITEM_SELECTING);
+
+ info_mode = INFO_MODE_MAIN;
+ DrawInfoScreen();
+
+ return;
+ }
+ else if (button == MB_MENU_CHOICE)
+ {
+ PlaySound(SND_MENU_ITEM_SELECTING);
+
+ FadeSoundsAndMusic();
+ FadeOut(REDRAW_FIELD);
+
+ info_mode = INFO_MODE_MAIN;
+ DrawAndFadeInInfoScreen(REDRAW_FIELD);
+ }
+ else
+ {
+ PlayMenuSoundIfLoop();
+ }
+}
+
void DrawInfoScreen_LevelSet()
{
int ystart = 150;
DrawInfoScreen_Credits();
else if (info_mode == INFO_MODE_PROGRAM)
DrawInfoScreen_Program();
+ else if (info_mode == INFO_MODE_VERSION)
+ DrawInfoScreen_Version();
else if (info_mode == INFO_MODE_LEVELSET)
DrawInfoScreen_LevelSet();
else
HandleInfoScreen_Credits(button);
else if (info_mode == INFO_MODE_PROGRAM)
HandleInfoScreen_Program(button);
+ else if (info_mode == INFO_MODE_VERSION)
+ HandleInfoScreen_Version(button);
else if (info_mode == INFO_MODE_LEVELSET)
HandleInfoScreen_LevelSet(button);
else
void HandleTypeName(int newxpos, Key key)
{
+ static char last_player_name[MAX_PLAYER_NAME_LEN + 1];
struct MainControlInfo *mci = getMainControlInfo(MAIN_CONTROL_NAME);
#if 1
struct MenuPosInfo *pos = mci->pos_input;
- int startx = mSX + ALIGNED_XPOS(pos->x, pos->width, pos->align);
- int starty = mSY + pos->y;
+ int startx = mSX + ALIGNED_MENU_XPOS(pos);
+ int starty = mSY + ALIGNED_MENU_YPOS(pos);
#endif
#if 1
static int xpos = 0;
int startx = mSX + 32 + name_width;
int starty = mSY + ypos * 32;
#endif
+ char key_char = getValidConfigValueChar(getCharFromKey(key));
+ boolean is_valid_key_char = (key_char != 0 && (key_char != ' ' || xpos > 0));
+ boolean is_active = TRUE;
+
+ DrawBackgroundForFont(startx,starty, pos->width, pos->height, font_active_nr);
if (newxpos)
{
+ strcpy(last_player_name, setup.player_name);
+
xpos = newxpos;
+#if 0
+ /* add one character width for added cursor character */
+ pos->width += font_width;
+ startx = mSX + ALIGNED_MENU_XPOS(pos);
+
DrawText(startx, starty, setup.player_name, font_active_nr);
DrawText(startx + xpos * font_width, starty, "_", font_active_nr);
-
- return;
+#endif
}
-
- if (((key >= KSYM_A && key <= KSYM_Z) ||
- (key >= KSYM_a && key <= KSYM_z)) &&
- xpos < MAX_PLAYER_NAME_LEN)
+ else if (is_valid_key_char && xpos < MAX_PLAYER_NAME_LEN)
{
- char ascii;
-
- if (key >= KSYM_A && key <= KSYM_Z)
- ascii = 'A' + (char)(key - KSYM_A);
- else
- ascii = 'a' + (char)(key - KSYM_a);
-
- setup.player_name[xpos] = ascii;
+ setup.player_name[xpos] = key_char;
setup.player_name[xpos + 1] = 0;
xpos++;
+#if 0
+ /* add one character width for added name text character */
+ pos->width += font_width;
+ startx = mSX + ALIGNED_MENU_XPOS(pos);
+
DrawText(startx, starty, setup.player_name, font_active_nr);
DrawText(startx + xpos * font_width, starty, "_", font_active_nr);
+#endif
}
else if ((key == KSYM_Delete || key == KSYM_BackSpace) && xpos > 0)
{
setup.player_name[xpos] = 0;
+#if 0
+ /* remove one character width for removed name text character */
+ pos->width -= font_width;
+ startx = mSX + ALIGNED_MENU_XPOS(pos);
+
+ DrawText(startx, starty, setup.player_name, font_active_nr);
DrawText(startx + xpos * font_width, starty, "_ ", font_active_nr);
+#endif
}
else if (key == KSYM_Return && xpos > 0)
{
+#if 0
+ /* remove one character width for removed cursor text character */
+ pos->width -= font_width;
+ startx = mSX + ALIGNED_MENU_XPOS(pos);
+
DrawText(startx, starty, setup.player_name, font_nr);
DrawText(startx + xpos * font_width, starty, " ", font_active_nr);
+#endif
SaveSetup();
+ is_active = FALSE;
+
game_status = GAME_MODE_MAIN;
}
+ else if (key == KSYM_Escape)
+ {
+ strcpy(setup.player_name, last_player_name);
+
+ is_active = FALSE;
+
+ game_status = GAME_MODE_MAIN;
+ }
+
+ if (is_active)
+ {
+ pos->width = (strlen(setup.player_name) + 1) * font_width;
+ startx = mSX + ALIGNED_MENU_XPOS(pos);
+
+ DrawText(startx, starty, setup.player_name, font_active_nr);
+ DrawText(startx + xpos * font_width, starty, "_", font_active_nr);
+ }
+ else
+ {
+ pos->width = strlen(setup.player_name) * font_width;
+ startx = mSX + ALIGNED_MENU_XPOS(pos);
+
+ DrawText(startx, starty, setup.player_name, font_nr);
+ }
}