Exemplo n.º 1
0
bool endingwin::draw()
{
	int lines;
	int textpos_x, textpos_y;
	SDL_Surface *image;

	if (!flags.tombstone) {
		for (item_iterator i = items.begin(); i != items.end(); ++i)
			printf("%s\n", i->str.c_str());

		printf("\n\n");
		return false;
	}

	/* make sure the screen is cleared */
	SDL_FillRect(vultures_screen, NULL, CLR32_BLACK);

	switch (ending_type-1)
	{
		case QUIT:
			image = vultures_load_graphic(V_FILENAME_ENDING_QUIT);
			vultures_play_event_sound("nhfe_music_end_quit");
			break;

		case ASCENDED:
			image = vultures_load_graphic(V_FILENAME_ENDING_ASCENDED);
			vultures_play_event_sound("nhfe_music_end_ascended");
			break;

		case ESCAPED:
			image = vultures_load_graphic(V_FILENAME_ENDING_ESCAPED);
			vultures_play_event_sound("nhfe_music_end_ascended");
			break;

		case PANICKED:
			image = NULL;
			break;

		default:
			image = vultures_load_graphic(V_FILENAME_ENDING_DIED);
			vultures_play_event_sound("nhfe_music_end_died");
	}

	if (image != NULL) {
		vultures_put_img((vultures_screen->w - image->w) / 2, (vultures_screen->h - image->h) / 2, image);
		SDL_FreeSurface(image);
		vultures_fade_in(0.5);
	}

	/* Count n. of rows to display */
	lines = items.size();

	/* Add prompt line */
	lines++;

	/* Display the rows */
	textpos_y = vultures_screen->h - (lines+1) * vultures_get_lineheight(V_FONT_INTRO);
	for (item_iterator i = items.begin(); i != items.end(); ++i) {
		textpos_x = (vultures_screen->w - vultures_text_length(V_FONT_INTRO, i->str))/2;
		vultures_put_text_shadow(V_FONT_INTRO, i->str, vultures_screen, textpos_x,
								textpos_y, V_COLOR_INTRO_TEXT, V_COLOR_BACKGROUND);
		textpos_y += vultures_get_lineheight(V_FONT_INTRO);
	}

	textpos_x = (vultures_screen->w - vultures_text_length(V_FONT_INTRO, "(press any key)"))/2;
	vultures_put_text_shadow(V_FONT_INTRO, "(press any key)", vultures_screen, textpos_x,
							textpos_y, V_COLOR_INTRO_TEXT, V_COLOR_BACKGROUND);

	vultures_refresh();
	return false;
}
Exemplo n.º 2
0
int vultures_handle_global_event(SDL_Event * event)
{
	static int quitting = 0;
	static int need_kludge = 0;
	static point actual_winsize = {0,0};
	
	/* blarg. see the SDL_VIDEORESIZE case */
	if (need_kludge &&
		(actual_winsize.x != vultures_opts.width ||
		actual_winsize.y != vultures_opts.height))
	{
		vultures_screen = SDL_SetVideoMode(vultures_opts.width, vultures_opts.height, 32,
										SDL_SWSURFACE | SDL_RESIZABLE | SDL_ASYNCBLIT);
		vultures_win_resize(vultures_opts.width, vultures_opts.height);
		actual_winsize.x = vultures_opts.width;
		actual_winsize.y = vultures_opts.height;
		need_kludge = 0;
	}

	switch (event->type)
	{
		case SDL_ACTIVEEVENT:
			if (event->active.gain && event->active.state == SDL_APPACTIVE)
				vultures_refresh();
			else if (event->active.state == SDL_APPMOUSEFOCUS)
				have_mouse_focus = event->active.gain;
			break;

		case SDL_VIDEOEXPOSE:
			vultures_refresh();
			break;

		case SDL_QUIT:
			if (quitting)
				break;

			/* prevent recursive quit dialogs... */
			quitting++;

			/* exit gracefully */
			if (program_state.gameover)
			{
				/* assume the user really meant this, as the game is already over... */
				/* to make sure we still save bones, just set stop printing flag */
				program_state.stopprint++;
				/* and send keyboard input as if user pressed ESC */
				vultures_eventstack_add('\033', -1, -1, V_RESPOND_POSKEY); 
			}
			else if (!program_state.something_worth_saving)
			{
				/* User exited before the game started, e.g. during splash display */
				/* Just get out. */
				vultures_bail(NULL);
			}
			else
			{
				switch (vultures_yn_function("Save and quit?", "yn", 'n'))
				{
					case 'y':
						vultures_eventstack_add('y', -1 , -1, V_RESPOND_CHARACTER);
						dosave();
						break;
					case 'n':
						vultures_eventstack_add('\033', -1, -1, V_RESPOND_CHARACTER);
						break;
					default:
						break;
				}
			}
			quitting--;
			break;

		case SDL_MOUSEMOTION:
			vultures_set_mouse_pos(event->motion.x, event->motion.y);
			break;

		case SDL_KEYDOWN:
			if (event->key.keysym.sym == SDLK_TAB && (event->key.keysym.mod & KMOD_ALT) && vultures_opts.fullscreen)
			{
				/* go out of fullscreen for alt + tab */
				vultures_opts.fullscreen = 0;
				vultures_set_windowed();
				if (!vultures_opts.fullscreen && !fs_message_printed++)
					/* This gets displayed only once */
					pline("You have left fullscreen mode. Press ALT+RETURN to reenter it.");

				event->type = 0; /* we don't want to leave the event loop for this */
				return 1;
			}
			else if(event->key.keysym.sym == SDLK_RETURN && (event->key.keysym.mod & KMOD_ALT))
			{
				/* toggle fullscreen with ctrl + enter */
				if (vultures_opts.fullscreen)
				{
					vultures_opts.fullscreen = 0;
					vultures_set_windowed();
				}
				else
				{
					vultures_opts.fullscreen = 1;
					vultures_set_fullscreen();
				}
				event->type = 0; /* we don't want to leave the event loop for this */
				return 1;
			}
			else if(event->key.keysym.sym == SDLK_SYSREQ ||
					event->key.keysym.sym == SDLK_PRINT ||
					event->key.keysym.sym == SDLK_F12)
			{
				vultures_save_screenshot();
				event->type = 0; /* we don't want to leave the event loop for this */
				return 1;
			}
			/* magic tileconfig reload key */
			else if (event->key.keysym.sym == SDLK_F11 &&
					(event->key.keysym.mod & KMOD_ALT) &&
					(event->key.keysym.mod & KMOD_SHIFT))
			{
				vultures_unload_gametiles();
				vultures_load_gametiles();
				levwin->force_redraw();
				ROOTWIN->draw_windows();
				pline("tileconfig reloaded!");
			}

			/* object highlight */
			if (vultures_map_highlight_objects == 0 &&
				((event->key.keysym.mod & KMOD_RCTRL) ||
				event->key.keysym.sym == SDLK_RCTRL))
			{
				/* enable highlighting */
				vultures_map_highlight_objects = 1;

				/* set the max clipping rect */
				levwin->force_redraw();

				/* redraw with the object highlight */
				ROOTWIN->draw_windows();

				/* the mouse got painted over, restore it */
				vultures_mouse_draw();

				/* bring the buffer onto the screen */
				vultures_refresh_window_region();

				/* make sure no after-images of the mouse are left over */
				vultures_mouse_restore_bg();
			}

			break;

		case SDL_KEYUP:
			if (vultures_map_highlight_objects == 1)
			{
				/* disable highlighting */
				vultures_map_highlight_objects = 0;

				/* set the max clipping rect */
				levwin->force_redraw();

				/* redraw without the object highlight */
				ROOTWIN->draw_windows();

				/* the mouse got painted over, restore it */
				vultures_mouse_draw();

				/* bring the buffer onto the screen */
				vultures_refresh_window_region();

				/* make sure no after-images of the mouse are left over */
				vultures_mouse_restore_bg();
			}
			break;

		case SDL_VIDEORESIZE:
			actual_winsize.x = event->resize.w;
			actual_winsize.y = event->resize.h;

			vultures_opts.width = event->resize.w;
			if (event->resize.w < 540)
			{
				need_kludge = 1;
				vultures_opts.width = 540;
			}
			vultures_opts.height = event->resize.h;
			if (event->resize.h < 300)
			{
				need_kludge = 1;
				vultures_opts.height = 300;
			}

			/* SDL will not actually change the size of the window here, only the size of the buffer.
			* therefore we may need_kludge to call SDL_SetVideoMode AGAIN to set the window size. */
			vultures_screen = SDL_SetVideoMode(vultures_opts.width, vultures_opts.height, 32,
										SDL_SWSURFACE | SDL_RESIZABLE | SDL_ASYNCBLIT);
			vultures_win_resize(vultures_opts.width, vultures_opts.height);
			break;
	}

	return 0;
}