278 lines
10 KiB
C
278 lines
10 KiB
C
/***************************************************************************
|
|
hint.c - description
|
|
-------------------
|
|
begin : Sun Jan 6 2002
|
|
copyright : (C) 2001 by Michael Speck
|
|
email : kulkanie@gmx.net
|
|
***************************************************************************/
|
|
|
|
/***************************************************************************
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
***************************************************************************/
|
|
|
|
#include "lbreakout.h"
|
|
#include "hint.h"
|
|
#include "config.h"
|
|
|
|
SDL_Surface *hint_balloon = 0;
|
|
SDL_Surface *hint_bkgnd = 0;
|
|
SDL_Surface *balloon = 0;
|
|
SDL_Surface *balloon_peek = 0;
|
|
int balloon_peek_add_x = 9, balloon_peek_add_y = 9; /* added to actual balloon to display peek */
|
|
int balloon_tile_size;
|
|
Hint *cur_hint = 0;
|
|
StkFont *hint_font = 0;
|
|
int hint_delay = 0;
|
|
float hint_alpha;
|
|
int hint_text_x = 10 + 9, hint_text_y = 10; /* text is drawn at this offset within balloon */
|
|
|
|
extern Config config;
|
|
extern SDL_Surface *stk_display;
|
|
|
|
/*
|
|
====================================================================
|
|
Locals
|
|
====================================================================
|
|
*/
|
|
|
|
/*
|
|
====================================================================
|
|
Create actual hint picture displayed.
|
|
====================================================================
|
|
*/
|
|
void hint_create_pic( Hint *hint )
|
|
{
|
|
int x, y, px, py;
|
|
stk_surface_free( &hint_balloon );
|
|
/* get screen size and position */
|
|
hint->rect.w = 240 + balloon_peek_add_x;
|
|
hint->rect.h = balloon_tile_size * ( 2 + ( hint->text->count + 0 ) * hint_font->height / balloon_tile_size ) + balloon_peek_add_y;
|
|
hint_set_pos( hint, hint->peek_x, hint->peek_y );
|
|
/* build surface */
|
|
hint_balloon = stk_surface_create( SDL_SWSURFACE, cur_hint->rect.w, cur_hint->rect.h );
|
|
for ( y = 0; y < cur_hint->rect.h - balloon_peek_add_y; y += balloon_tile_size )
|
|
for ( x = 0; x < cur_hint->rect.w - balloon_peek_add_x; x += balloon_tile_size ) {
|
|
px = x + balloon_peek_add_x; py = y;
|
|
/* get proper tile */
|
|
if ( y == 0 ) {
|
|
if ( x == 0 )
|
|
stk_surface_blit( balloon, 0, 0,
|
|
balloon_tile_size, balloon_tile_size,
|
|
hint_balloon, px, py );
|
|
else
|
|
if ( x >= cur_hint->rect.w - balloon_peek_add_x - balloon_tile_size )
|
|
stk_surface_blit( balloon, balloon_tile_size * 2, 0,
|
|
balloon_tile_size, balloon_tile_size,
|
|
hint_balloon, px, py );
|
|
else
|
|
stk_surface_blit( balloon, balloon_tile_size, 0,
|
|
balloon_tile_size, balloon_tile_size,
|
|
hint_balloon, px, py );
|
|
}
|
|
else
|
|
if ( y >= cur_hint->rect.h - balloon_peek_add_y - balloon_tile_size ) {
|
|
if ( x == 0 )
|
|
stk_surface_blit( balloon, 0, balloon_tile_size * 2,
|
|
balloon_tile_size, balloon_tile_size,
|
|
hint_balloon, px, py );
|
|
else
|
|
if ( x >= cur_hint->rect.w - balloon_peek_add_x - balloon_tile_size )
|
|
stk_surface_blit( balloon,
|
|
balloon_tile_size * 2, balloon_tile_size * 2,
|
|
balloon_tile_size, balloon_tile_size,
|
|
hint_balloon, px, py );
|
|
else
|
|
stk_surface_blit( balloon,
|
|
balloon_tile_size, balloon_tile_size * 2,
|
|
balloon_tile_size, balloon_tile_size,
|
|
hint_balloon, px, py );
|
|
}
|
|
else {
|
|
if ( x == 0 )
|
|
stk_surface_blit( balloon, 0, balloon_tile_size,
|
|
balloon_tile_size, balloon_tile_size,
|
|
hint_balloon, px, py );
|
|
else
|
|
if ( x >= cur_hint->rect.w - balloon_peek_add_x - balloon_tile_size )
|
|
stk_surface_blit( balloon,
|
|
balloon_tile_size * 2, balloon_tile_size,
|
|
balloon_tile_size, balloon_tile_size,
|
|
hint_balloon, px, py );
|
|
else
|
|
stk_surface_blit( balloon,
|
|
balloon_tile_size, balloon_tile_size,
|
|
balloon_tile_size, balloon_tile_size,
|
|
hint_balloon, px, py );
|
|
}
|
|
}
|
|
/* peek */
|
|
stk_surface_blit( balloon_peek, 0, 0, balloon_peek->w, balloon_peek->h,
|
|
hint_balloon, 0, cur_hint->rect.h - balloon_peek->h );
|
|
/* text */
|
|
for ( y = 0, x = 0; x < cur_hint->text->count; y += hint_font->height, x++ )
|
|
stk_font_write( hint_font,
|
|
hint_balloon, hint_text_x, hint_text_y + y,
|
|
-1, cur_hint->text->lines[x] );
|
|
}
|
|
|
|
/*
|
|
====================================================================
|
|
Publics
|
|
====================================================================
|
|
*/
|
|
|
|
/*
|
|
====================================================================
|
|
Load/delete hint resources.
|
|
====================================================================
|
|
*/
|
|
void hint_load_res()
|
|
{
|
|
balloon = stk_surface_load( SDL_SWSURFACE, "balloon.png" );
|
|
balloon_peek = stk_surface_load( SDL_SWSURFACE, "balloon_peek.png" );
|
|
balloon_tile_size = balloon->w / 3;
|
|
hint_font = stk_font_load( SDL_SWSURFACE, "f_tiny_black.png" );
|
|
}
|
|
void hint_delete_res()
|
|
{
|
|
stk_surface_free( &balloon );
|
|
stk_surface_free( &balloon_peek );
|
|
stk_font_free( &hint_font );
|
|
stk_surface_free( &hint_balloon );
|
|
}
|
|
|
|
/*
|
|
====================================================================
|
|
Create a hint. The passed x,y position is where the end of the
|
|
Sprechblasenspitze is. Contents is converted to lines (duplicated).
|
|
====================================================================
|
|
*/
|
|
Hint* hint_create( int x, int y, char *contents )
|
|
{
|
|
Hint *hint = calloc( 1, sizeof( Hint ) );
|
|
/* get text and position */
|
|
hint->text = create_text( contents, 36 );
|
|
hint->peek_x = x;
|
|
hint->peek_y = y;
|
|
return hint;
|
|
}
|
|
void hint_delete( Hint *hint )
|
|
{
|
|
if ( !hint )
|
|
return;
|
|
free( hint );
|
|
}
|
|
|
|
/*
|
|
====================================================================
|
|
Set the background on which the hints will be displayed.
|
|
====================================================================
|
|
*/
|
|
void hint_set_bkgnd( SDL_Surface *bkgnd )
|
|
{
|
|
hint_bkgnd = bkgnd;
|
|
}
|
|
|
|
/*
|
|
====================================================================
|
|
Set this hint as actual one. If NULL was passed no hint will be
|
|
handled.
|
|
====================================================================
|
|
*/
|
|
void hint_set( Hint *hint )
|
|
{
|
|
if ( config.use_hints )
|
|
cur_hint = hint;
|
|
else
|
|
cur_hint = 0;
|
|
if ( cur_hint ) {
|
|
hint_alpha = 0;
|
|
hint_delay = 500;
|
|
hint_create_pic( hint );
|
|
/* must be in screen */
|
|
if ( hint->rect.x + hint_balloon->w >= stk_display->w )
|
|
hint->rect.x = stk_display->w - hint_balloon->w;
|
|
if ( hint->rect.y < 0 ) hint->rect.y = 0;
|
|
}
|
|
}
|
|
|
|
/*
|
|
====================================================================
|
|
Set hint to this position.
|
|
====================================================================
|
|
*/
|
|
void hint_set_pos( Hint *hint, int x, int y )
|
|
{
|
|
hint->peek_x = x;
|
|
hint->peek_y = y;
|
|
/* adjust screen position so that balloon's peek is at x,y */
|
|
hint->rect.x = x;
|
|
hint->rect.y = y - hint->rect.h - balloon_peek->h / 2;
|
|
}
|
|
|
|
/*
|
|
====================================================================
|
|
Update the contents of a hint.
|
|
====================================================================
|
|
*/
|
|
void hint_set_contents( Hint *hint, char *contents )
|
|
{
|
|
delete_text( hint->text );
|
|
hint->text = create_text( contents, 36 );
|
|
}
|
|
|
|
/*
|
|
====================================================================
|
|
Show/hide/update _current_ hint.
|
|
====================================================================
|
|
*/
|
|
void hint_hide()
|
|
{
|
|
if ( !cur_hint || hint_delay )
|
|
return;
|
|
stk_surface_blit( hint_bkgnd, cur_hint->rect.x, cur_hint->rect.y,
|
|
cur_hint->rect.w, cur_hint->rect.h,
|
|
stk_display, cur_hint->rect.x, cur_hint->rect.y);
|
|
stk_display_store_drect();
|
|
/* peek */
|
|
stk_surface_blit(
|
|
hint_bkgnd,
|
|
cur_hint->rect.x + balloon_peek_add_x,
|
|
cur_hint->rect.y + cur_hint->rect.h + balloon_peek_add_y,
|
|
balloon_peek->w, balloon_peek->h,
|
|
stk_display,
|
|
cur_hint->rect.x + balloon_peek_add_x,
|
|
cur_hint->rect.y + cur_hint->rect.h + balloon_peek_add_y );
|
|
stk_display_store_drect();
|
|
}
|
|
void hint_show()
|
|
{
|
|
if ( !cur_hint || hint_delay > 0 )
|
|
return;
|
|
SDL_SetAlpha( hint_balloon, SDL_SRCALPHA, hint_alpha );
|
|
stk_surface_blit( hint_balloon, 0, 0,
|
|
cur_hint->rect.w, cur_hint->rect.h,
|
|
stk_display, cur_hint->rect.x, cur_hint->rect.y );
|
|
stk_display_store_drect();
|
|
}
|
|
void hint_update( int ms )
|
|
{
|
|
/* delay */
|
|
if ( hint_delay > 0 ) {
|
|
hint_delay -= ms;
|
|
if ( hint_delay <= 0 )
|
|
hint_delay = 0;
|
|
}
|
|
/* if delay fade blend if if still alpha */
|
|
if ( hint_delay == 0 && hint_alpha < 255 ) {
|
|
hint_alpha += 1.0 * ms;
|
|
if ( hint_alpha > 255 )
|
|
hint_alpha = 255;
|
|
}
|
|
}
|