Files
commandergenius/project/jni/application/lbreakout2-2.6.2/client/hint.c
2010-12-24 12:04:06 +00:00

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;
}
}