Codebase list icebreaker / scrub-obsolete/main transition.c
scrub-obsolete/main

Tree @scrub-obsolete/main (Download .tar.gz)

transition.c @scrub-obsolete/mainraw · history · blame

/*
* IceBreaker
* Copyright (c) 2000-2020 Matthew Miller <mattdm@mattdm.org>
*
* <http://www.mattdm.org/icebreaker/>
*
* 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.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/

#include <SDL.h>
#include "icebreaker.h"
#include "globals.h"
#include "line.h"
#include "penguin.h"
#include "level.h"
#include "text.h"
#include "cursor.h"
#include "laundry.h"
#include "hiscore.h"
#include "dialog.h"
#include "themes.h"
#include "event.h"

// FIX -- it'd be better to draw text once and then scroll that graphic,
// of course.

static int scrolltext(char * firsttext, SDL_Rect* firstrect, Uint32 firstcolor, char * secondtext, SDL_Rect* secondrect, Uint32 secondcolor, int doneonfinish);

int intermission(ScoreSheet * levelscore, int nextlevel)
{
	int quit=false;
	SDL_Event event;
	SDL_Rect scorerect, bonusrect;
	char scoretext[30];
	char bonustext[30];

	snprintf(scoretext,30,"SCORE: %d",levelscore->basescore);
	snprintf(bonustext,30, "BONUS: %d",levelscore->clearbonus + levelscore->lifebonus);

	// FIX -- play some truimphant but not annoying sound
	
	// clear any pending events
	SDL_Delay(10); // needed? probably not.
	while (pollevent(&event)) if (event.type == SDL_QUIT) { quit=true; }

	setcursor(CURSORCLICK);

	scorerect.h=CHARHEIGHT*4;
	scorerect.w=gettextwidth(4,scoretext);
	
	bonusrect.h=CHARHEIGHT*4;
	bonusrect.w=gettextwidth(4,bonustext);

	if (scorerect.w>bonusrect.w)
		scorerect.x=(screen->w - scorerect.w) / 2;
	else
		scorerect.x=(screen->w - bonusrect.w) / 2;
	scorerect.y=HEIGHT-CHARHEIGHT*5; // extra space for separation

	bonusrect.x=scorerect.x;
	bonusrect.y=HEIGHT-CHARHEIGHT*4;
	
	// wait for click, scroll score
	quit=scrolltext(scoretext, &scorerect, color.scorescrolltext, bonustext, &bonusrect, color.bonusscrolltext, false);

	// and clear any more events, for good luck.
	while (pollevent(&event)) if (event.type == SDL_QUIT) quit=true;
			
	//printf("Level %d completed. ",level);	
	return(quit);
}

int gameover(long finalscore)
{
	int quit=false;
	SDL_Event event;
	SDL_Rect loserrect, finalrect;

	char finaltext[30];

	snprintf(finaltext,30,"FINAL SCORE: %ld",finalscore);
	

	loserrect.h=CHARHEIGHT*4;
	loserrect.w=gettextwidth(4,"GAME OVER");
	loserrect.x=(screen->w - loserrect.w) / 2;
	loserrect.y=HEIGHT-CHARHEIGHT*4;

	finalrect.h=CHARHEIGHT*4;
	finalrect.w=gettextwidth(4,finaltext);
	finalrect.x=(screen->w - finalrect.w) / 2;
	finalrect.y=HEIGHT-CHARHEIGHT*4;

	// clear any pending events
	SDL_Delay(10); // needed? probably not.
	while (pollevent(&event)) if (event.type == SDL_QUIT) { quit=true; }

	if (!checkhiscore(finalscore))
		setcursor(CURSORCLICK);
	else 
		setcursor(CURSORARROW);


	// wait for click, scroll score
	quit=scrolltext("GAME OVER", &loserrect, color.gameovertext, finaltext, &finalrect,  color.scorescrolltext, false);
		
	if (checkhiscore(finalscore))
	{
		// FIX -- play some truimphant but not annoying sound 

		if (gethighusername(finalscore>hiscoreval[0])==POPUPQUITGAME)
			quit=true;
		
		if(!addhiscore(username,finalscore,true))
		{ // I don't think we need to say this; people can figure it out by looking at the numbers
		  // but don't comment out the addhighscore function call above, of course. :)
			// fprintf(stderr,"Ouch: looks like someone beat your score while you were typing your name!\n");
		}

		// jump text to top
		loserrect.y=(HEIGHT/2-31);
		puttext(loserrect.x,loserrect.y,4,color.gameovertext,"GAME OVER");			
		soil(loserrect);
		finalrect.y=(HEIGHT/2);
		puttext(finalrect.x,finalrect.y,4,color.scorescrolltext,finaltext);
		soil(loserrect);
		clean();
	}

			
	// and clear any more events, for good luck.
	while (pollevent(&event)) if (event.type == SDL_QUIT) quit=true;
			
	//printf("Game over.\n");	
	return(quit);
}


int scrolltext(char * firsttext, SDL_Rect* firstrect, Uint32 firstcolor, char * secondtext, SDL_Rect* secondrect, Uint32 secondcolor, int doneonfinish)
{
	int quit=false;
	int done=false;
	SDL_Event event;
	
	SDL_Surface * bgsave=SDL_CreateRGBSurface(SDL_SWSURFACE,WIDTH,HEIGHT,screen->format->BitsPerPixel,0,0,0,0);

	// get background
	SDL_BlitSurface(screen, NULL, bgsave, NULL);
	

	// wait for click, scroll score (or whatever)
	while (!done) 
	{
		while(pollevent(&event));

		if (event.type == SDL_QUIT)
		{
			done=true; quit=true;
		}
		else if (event.type==SDL_MOUSEBUTTONDOWN)
		{
			if (event.button.button==1)
			{
					done=true;
			}
		}
		else if (event.type == SDL_KEYUP)
		{
			switch(translatekeyevent(&event))
			{
				case KEYCANCEL:     // falls through
				case KEYMENU:       // falls through
				case KEYSWITCHLINE: // falls through
				case KEYSTARTLINE:  
					done=true;
				default:
				break;
			}
		}
		
		if (firstrect->y>(HEIGHT/2-30))
		{
			firstrect->y--; 
			puttext(firstrect->x,firstrect->y,4,firstcolor,firsttext);
			soil(*firstrect);
			clean();		
			SDL_BlitSurface(bgsave,firstrect, screen, firstrect);
		}
		else if (firstrect->y==(HEIGHT/2-30))
		{
			// un-clean. :)
			firstrect->y--; 
			puttext(firstrect->x,firstrect->y,4,firstcolor,firsttext);
			soil(*firstrect);
			clean();
		}
		else if (secondrect->y>(HEIGHT/2))
		{
			secondrect->y--;
			puttext(secondrect->x,secondrect->y,4,secondcolor,secondtext);
			soil(*secondrect);
			clean();
			SDL_BlitSurface(bgsave,secondrect, screen, secondrect);
		}
		else if (secondrect->y==(HEIGHT/2))
		{
			// un-clean. :)
			secondrect->y--;
			puttext(secondrect->x,secondrect->y,4,secondcolor,secondtext);
			soil(*secondrect);
			clean();
		}
		else
		{
			if (doneonfinish) done=true;
			clean();
		}		
		
		SDL_Delay(10);
	}
	SDL_FreeSurface(bgsave);
	return(quit);
}