/***************************************************************************
*                          Pachi el marciano                               *
*                          -----------------                               *
*                     (c) Santiago Radeff (coding)                         *
*                     (c) Nicolas Radeff  (graphics)                       *
*                     (c) Peter Hajba     (music)                          *
*                                                                          *
*                          T-1000@Bigfoot.com                              *
****************************************************************************
    *******************************************************************
    *                                                                 *
    *   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.      *
    *                                                                 *
    *******************************************************************/

void screen_mode()
{
    if(fullscreen)
    {
        screen = SDL_SetVideoMode(screen_w,screen_h,screen_bpp,0);
        fullscreen = 0;
    }
    else
    {
        screen = SDL_SetVideoMode(screen_w,screen_h,screen_bpp,SDL_FULLSCREEN);
        fullscreen = 1;
    }
}



void print_credits()
{
    int creditsfont_h = 25;
    int creditsfont_w = 18;
    if(needinput==1) // la variable needinput indica si se debe imprimir una nueva linea de texto
    {
	char line2print[100]; // esta es la cadena de texto que contiene el renglon a imprimir

	for(int n=0; n<=37; n++)
	    line2print[n]=creditstext[n+(creditslinecounter*36)];
	
	print_text(creditsfont, creditsbuffer, creditsfont_w, creditsfont_h, 0,400, line2print);
	// imprime una linea de texto en la parte de abajo (no imprimible del primer buffer)

	needinput=0;
	creditslinecounter++;
	if(creditslinecounter==creditslines)
	{
	    creditslinecounter--;
	    wrapcounter++;
	    if(wrapcounter==100)
	    {
		creditslinecounter=0;
		wrapcounter=0;
	    }
	}
    }
    else // si no se imprime una nueva linea se debe hacer el scroll entre los buffers
    {
	SDL_Rect cbuffer;
	cbuffer.w = 600;
	cbuffer.h = 440;
	cbuffer.x = 0;
	cbuffer.y = 1;

	SDL_Rect cbuffer1;
	cbuffer1.w = 600;
	cbuffer1.h = 400;
	cbuffer1.x = 0;
	cbuffer1.y = 0;

	SDL_Rect creditspos;
	creditspos.w=600;
	creditspos.h=400;
	creditspos.x=100;
	creditspos.y=100;

	SDL_Rect bgpos;
	bgpos.w=600;
	bgpos.h=420;
	bgpos.x=100;
	bgpos.y=100;
	
    SDL_SetColorKey(creditsbuffer, 0, 0);
    SDL_SetAlpha(creditsbuffer, SDL_SRCALPHA, 255);
	SDL_BlitSurface(creditsbuffer, &cbuffer, creditsbuffer1, &cbuffer1);
	SDL_BlitSurface(creditsbuffer1, &cbuffer1, creditsbuffer, &cbuffer1);
	SDL_BlitSurface(background, &bgpos, screen, &bgpos);
    SDL_SetColorKey(creditsbuffer, SDL_SRCCOLORKEY, SDL_MapRGB(creditsbuffer->format, 0, 255, 0));
    SDL_SetAlpha(creditsbuffer, SDL_SRCALPHA, 128);
	SDL_BlitSurface(creditsbuffer, &cbuffer1, screen, &creditspos);
	SDL_UpdateRect(screen,100,100,600,400);
	SDL_Delay(50);
	
	linegone++;
	if(linegone == creditsfont_h)
	{
	    needinput = 1;
	    linegone = 0;
	}
    }
}

void do_help()
{
    load_helpgfx();
    fadesurface(background, 0, 0, 150);
    print_text(scorefont, screen, 16, 16, 72, 68,   "      HOW TO PLAY PACHI EL MARCIANO      ");
    print_text(scorefont1, screen, 16, 16, 72, 120, "KEYS:");
    print_text(scorefont1, screen, 16, 16,100, 140, "RIGHT     : P");
    print_text(scorefont1, screen, 16, 16,100, 160, "LEFT      : O");
    print_text(scorefont1, screen, 16, 16,100, 180, "DUCK      : A");
    print_text(scorefont1, screen, 16, 16,100, 200, "STAND UP  : Q");
    print_text(scorefont1, screen, 16, 16,100, 220, "JUMP      : SPACE");
    print_text(scorefont1, screen, 16, 16,100, 240, "PAUSE     : H OR F1");
    print_text(scorefont1, screen, 16, 16, 72, 270, "YOU CAN ALSO USE THE CURSOR KEYS / KEYPAD");

    print_text(scorefont,  screen, 16, 16, 72, 300, " THE GOAL OF THE GAME IS TO COLLECT ALL  ");
    print_text(scorefont,  screen, 16, 16, 72, 320, " THE OBJECTS OF EACH LEVEL, WHEN THIS IS ");
    print_text(scorefont,  screen, 16, 16, 72, 340, "  DONE, THE EXIT GATE TO THE NEXT LEVEL  ");
    print_text(scorefont,  screen, 16, 16, 72, 360, "WILL APPEAR, BUT BEWARE OF THE ENEMIES...");

    SDL_Flip(screen);
    escape_exit=0;
    while(escape_exit == 0)
    {
        credits_events();
    }
    unload_helpgfx();
}

void print_monitor()
{
    print_text(scorefont1,screen,16,16,30,485,"%s", mstage[stage-1].title);
    print_text(scorefont,screen,16,16,30,510, "SCORE:%d", score);
    print_text(scorefont,screen,16,16,30,528, "LIVES:%d", mplayer[dificulty].lives);
    print_text(scorefont,screen,16,16,30,546, "STAGE:%d", stage);
    print_text(scorefont,screen,16,16,30,564, "ITEMS:%d/%d",mplayer[dificulty].objects,mstage[stage-1].objects);
    SDL_UpdateRect(screen, 30, 482, 500, 100); 
}

void blinkscreen(int R,int G, int B, int A)
{
    SDL_FillRect(screen,NULL,SDL_MapRGBA(screen->format,R,G,B,A));
    SDL_Flip(screen);
    setback();
    SDL_Flip(screen);
}

void print_room()
{
    int x,y;
    SDL_Rect gamearea;
    gamearea.x=R_gamearea_x;
    gamearea.y=R_gamearea_y;
    gamearea.h=448;
    gamearea.w=736;
    SDL_FillRect(screen,&gamearea,0);

    SDL_Rect backs_dst;
    SDL_Rect backs_src;
    SDL_Rect backs_dstbak;
    backs_src.w = R_back_x;
    backs_src.h = R_back_y;
    backs_dst.w = R_back_x;
    backs_dst.h = R_back_y;
    for(x=0;x < R_maxbacks_h;x++)
    {
        for(y=0;y < R_maxbacks_v;y++)
        {
            backs_dst.x = R_gamearea_x + (x*R_back_x);
            backs_dst.y = R_gamearea_y + (y*R_back_y);
	    backs_dstbak.x = x*R_back_x;
	    backs_dstbak.y = y*R_back_y;

            backs_src.y = (int(R_backdata[x][y]/6) * R_back_y);
            backs_src.x = (R_backdata[x][y] - (int(R_backdata[x][y]/6) * 6))*R_back_x;
    	    SDL_BlitSurface(backs,&backs_src,screen,&backs_dst);
        }
    }

    SDL_Rect tiles_dst;
    SDL_Rect tiles_dstbak;
    SDL_Rect tiles_src;
    tiles_src.w = R_tileside;
    tiles_src.h = R_tileside;
    for(x=0;x < R_maxtiles_h;x++)
    {
	for(y=0;y < R_maxtiles_v;y++)
	{
	    tiles_dst.x = R_gamearea_x + (x*R_tileside);
	    tiles_dst.y = R_gamearea_y + (y*R_tileside);
	    tiles_dstbak.x = x*R_tileside;
	    tiles_dstbak.y = y*R_tileside;

            tiles_src.y = (int(mroom.data[x][y]/20) * R_tileside);
            tiles_src.x = (mroom.data[x][y] - (int(mroom.data[x][y]/20) * 20))*R_tileside;
	    if((mroom.data[x][y] != 0) && (mroom.data[x][y] != 239))
		SDL_BlitSurface(tiles,&tiles_src,screen,&tiles_dst);
	    if(mroom.data[x][y] == 239 && stagecompleted == 1)
		SDL_BlitSurface(tiles,&tiles_src,screen,&tiles_dst);
	}
    }
    SDL_BlitSurface(screen,&gamearea,screenbak,NULL);
    print_monitor(); //imprime la informacion del jugador (vidas, puntos, etc)
    SDL_Flip(screen);
}

void showcode(char *str)
{
    SDL_Rect code;
	code.x=280; code.y=220;code.w=240;code.h=50;
    SDL_FillRect(screen,&code,SDL_MapRGB(screen->format,255,255,255));
	code.x+=2; code.y+=2;code.w-=4;code.h-=4;
    SDL_FillRect(screen,&code,SDL_MapRGB(screen->format,0,0,0));
	code.x=280; code.y=220;code.w=240;code.h=50;
    print_text(scorefont,screen,16,16,code.x+8,code.y+7,"STAGE CODE IS:");
    print_text(scorefont1,screen,16,16,code.x+90,code.y+27,"%s",str);
    SDL_UpdateRect(screen, code.x, code.y, code.w, code.h);
    escape_exit=0;
    while(escape_exit==0)
    {
	credits_events();
	SDL_Delay(1);
    }
}

void setback()
{
    SDL_BlitSurface(background,NULL,screen,NULL);
    SDL_Flip(screen);
}

void fadesurface(SDL_Surface *surface, int x, int y, int speed)
{
    SDL_Rect dst;
	dst.x=x; dst.y=y;
    float alpha=0;
    while(alpha<255)
    {
	delta_time();
	SDL_SetAlpha(surface, SDL_SRCALPHA, int(alpha));
	SDL_BlitSurface(surface, NULL, screen, &dst);
	SDL_Flip(screen);
	alpha+=(speed*imove);
    }
    SDL_SetAlpha(surface, 0, 0);
    SDL_BlitSurface(surface, NULL, screen, &dst);
    SDL_Flip(screen);
}

// speed es la velocidad del fade y blackback es un flag que indica si debe poner un fondo de color antes de imprimir (1=negro, 2=blanco)
float intro_blit(SDL_Surface *surface, int x, int y, int w, int h, float blit_alpha, int speed, int back)
{
    SDL_Rect dst;
	dst.x=x; dst.y=y; dst.w=w; dst.h=h;
    int alpha=int(blit_alpha);
    SDL_SetAlpha(surface, SDL_SRCALPHA, alpha);
    blit_alpha+=(speed*imove);
    SDL_BlitSurface(surface, NULL, screen, &dst);
    SDL_UpdateRect(screen, dst.x, dst.y, dst.w, dst.h);
    if(back==1)
    {
	if(blit_alpha<255)
	SDL_FillRect(screen, &dst, SDL_MapRGB(screen->format,0,0,0));
    }
    if(back==2)
    {
	if(blit_alpha<255)
	SDL_FillRect(screen, &dst, SDL_MapRGB(screen->format,255,255,255));
    }
    if(blit_alpha>255)
    {
	SDL_SetAlpha(surface, 0, 0);
	SDL_BlitSurface(surface, NULL, screen, &dst);
	SDL_Flip(screen);
    }
    return(blit_alpha);
}

float fade(SDL_Surface *surface, int x, int y, int w, int h, int R, int G, int B, int speed, float blit_alpha)
{
    SDL_Rect dst;
	dst.x=x; dst.y=y; dst.w=w; dst.h=h;
    int alpha=int (blit_alpha);
    SDL_SetAlpha(surface, SDL_SRCALPHA, alpha);
    blit_alpha-=(speed*imove);
    SDL_FillRect(screen, &dst, SDL_MapRGB(screen->format,R,G,B));
    SDL_BlitSurface(surface, NULL, screen, &dst);
    SDL_UpdateRect(screen, dst.x, dst.y, dst.w, dst.h);
    return(blit_alpha);
}

void showposter(int num)
{
    if(num==CEMETERY || num==CAVES || num==CASTLE || num==CASTLE+1 || num==LAB)
    {
	escape_exit=0;
	SDL_Surface *temp;
	switch(num)
	{
	    case CEMETERY:
		background=LoadT8(DATADIR"/Tgfx/cemetery.T8");
		fadesurface(background, 0, 0, 200);
		escape_exit=0;
		break;
	    case CAVES:
		background=LoadT8(DATADIR"/Tgfx/comic_02.T8");
		fadesurface(background, 0, 0, 200);
		escape_exit=0;
		while(escape_exit==0) { credits_events(); SDL_Delay(1);	}
		background=LoadT8(DATADIR"/Tgfx/cave.T8");
		fadesurface(background, 0, 0, 200);
		escape_exit=0;
		break;
	    case CASTLE:
		background=LoadT8(DATADIR"/Tgfx/comic_03.T8");
		fadesurface(background, 0, 0, 200);
		escape_exit=0;
		while(escape_exit==0) { credits_events(); SDL_Delay(1);	}
		break;
	    case CASTLE+1:
	    	background=LoadT8(DATADIR"/Tgfx/comic_04.T8");
		fadesurface(background, 0, 0, 200);
		escape_exit=0;
		while(escape_exit==0) { credits_events(); SDL_Delay(1);	}
		background=LoadT8(DATADIR"/Tgfx/castle.T8");
		fadesurface(background, 0, 0, 200);
		escape_exit=0;
		break;
	    case LAB:
	    	background=LoadT8(DATADIR"/Tgfx/comic_05.T8");
		fadesurface(background, 0, 0, 200);
		escape_exit=0;
		while(escape_exit==0) { credits_events(); SDL_Delay(1);	}
		background=LoadT8(DATADIR"/Tgfx/comic_06.T8");
		fadesurface(background, 0, 0, 200);
		escape_exit=0;
		while(escape_exit==0) { credits_events(); SDL_Delay(1);	}
		background=LoadT8(DATADIR"/Tgfx/comic_07.T8");
		fadesurface(background, 0, 0, 200);
		escape_exit=0;
		while(escape_exit==0) { credits_events(); SDL_Delay(1);	}
		background=LoadT8(DATADIR"/Tgfx/comic_08.T8");
		fadesurface(background, 0, 0, 200);
		escape_exit=0;
		while(escape_exit==0) { credits_events(); SDL_Delay(1);	}
		background=LoadT8(DATADIR"/Tgfx/lab.T8");
		fadesurface(background, 0, 0, 200);
		escape_exit=0;
		break;
	    default:
		break;
	}    
	while(escape_exit==0) { credits_events(); SDL_Delay(1);	}
    }
    background=LoadT8(DATADIR"/Tgfx/gamepanel.T8");
    fadesurface(background, 0, 0, 250);
}
