shithub: candycrisis

Download patch

ref: 74ce8304ef22c094c169e714c2c5ee0543c3e02d
parent: 1de494ed50a7b368dafbcdf1b77f3c1e87332f85
author: Iliyas Jorio <iliyas@jor.io>
date: Sat Aug 1 10:37:29 EDT 2020

Text-based title screen

--- a/src/level.cpp
+++ b/src/level.cpp
@@ -52,19 +52,27 @@
 static int startMenuTime = 0;
 static int splatState[kNumSplats], splatColor[kNumSplats], splatSide[kNumSplats];
 static MRect splatBlob[kNumSplats];
-static MRect titleRect[kTitleItems] = {
-		{ 155, 203, 207, 426 }, // tutorial
-		{ 225, 179, 281, 451 }, // 1p
-		{ 297, 182, 352, 454 }, // 2p
-		{ 358, 183, 428, 458 }, // solitaire
-		{ 429, 280, 478, 390 }, // high scores
-		{ 433, 390, 477, 446 }, // quit
-		{ 430, 187, 479, 280 }, // controls
-		                };
 
+struct {
+	const char* name;
+	MRGBColor color1;
+	MRGBColor color2;
+	MRect rect;
+} titleItems[kTitleItems] = {
+		{ "\x03 Tutorial Mode",     {204, 67,137}, {101, 74,207}, {155, 203, 207, 426} },
+		{ "\x03 One Player Game",   { 35, 31,240}, { 81,237,252}, {225, 179, 281, 451} },
+		{ "\x03 Two Player Game",   {212,194, 48}, {255,196, 56}, {297, 182, 352, 454} },
+		{ "\x03 Solitaire Crisis",  {102,247,106}, {125,237,179}, {358, 183, 428, 458} },
+		{ "\x03 High Scores",       {234,244,132}, {192,218, 85}, {429, 280, 478, 390} },
+		{ "\x03 Controls",          { 64, 88,212}, { 62, 87,205}, {430, 187, 479, 280} },
+		{ "\x03 Quit",              {107,105,106}, {169,167,168}, {433, 390, 477, 446} }
+};
+
 const int kCursorWidth  = 32;
 const int kCursorHeight = 32;
 
+extern MBoolean useNewTitle;
+
 static void InsertCursor( MPoint mouseHere, SDL_Surface* scratch, SDL_Surface* surface )
 {
 	SkittlesFontPtr cursorFont = GetFont( picFont );
@@ -160,15 +168,53 @@
 	
 	// make drawing surface
 	gameStartDrawSurface = SDLU_InitSurface( &backdropSDLRect, 32 );
-	SDLU_BlitSurface( gameStartSurface,     &gameStartSurface->clip_rect,
-					  gameStartDrawSurface, &gameStartDrawSurface->clip_rect );
+	if (!useNewTitle) {
+		SDLU_BlitSurface(gameStartSurface, &gameStartSurface->clip_rect,
+						 gameStartDrawSurface, &gameStartDrawSurface->clip_rect);
+	} else {
+		// Prepare new title screen
+		SDL_FillRect(gameStartDrawSurface, &gameStartDrawSurface->clip_rect, black);
+
+		// Copy logo from original title screen to where we want it
+		SDL_Rect r1 = {0, 0, 640, 150};
+		SDL_Rect r2 = {0, 70, 640, 150};
+		SDLU_BlitSurface(gameStartSurface, &r1, gameStartDrawSurface, &r2);
+
+		// Now we're going to draw title items on gameStartSurface
+		SDL_FillRect(gameStartSurface, &gameStartSurface->clip_rect, black);
+		SDLU_AcquireSurface(gameStartSurface);
+
+		SkittlesFontPtr font = GetFont(picFont);
+		int left = 225;
+		dPoint.h = left;
+		dPoint.v = 215;
+		for (int i = 0; i < kTitleItems; i++) {
+			auto &item = titleItems[i];
+			item.rect.left = dPoint.h;
+			item.rect.top = dPoint.v - 6;
+			item.rect.bottom = dPoint.v + 16 + 6;
+			auto nameLength = strlen(item.name);
+			for (int charNo = 0; charNo < nameLength; charNo++) {
+				char c = item.name[charNo];
+				float p = charNo / (float) (nameLength - 1);
+				int red = item.color1.red * (1.0f - p) + item.color2.red * p;
+				int green = item.color1.green * (1.0f - p) + item.color2.green * p;
+				int blue = item.color1.blue * (1.0f - p) + item.color2.blue * p;
+				SurfaceBlitCharacter(font, c, &dPoint, red, green, blue, 1);
+			}
+			item.rect.right = dPoint.h;
+			dPoint.h = left;
+			dPoint.v += 28;
+		}
+		SDLU_ReleaseSurface(gameStartSurface);
+	}
 	
 	// darken menu items
 	for( count=0; count<kTitleItems; count++ )
 	{
 		SurfaceBlitColorOver( gameStartSurface,  gameStartDrawSurface,
-		                      &titleRect[count], &titleRect[count], 
-		                       0, 0, 0, titleGlow[count] );
+							  &titleItems[count].rect, &titleItems[count].rect, 
+							   0, 0, 0, titleGlow[count] );
 	}
 	
 	SDLU_BlitFrontSurface( gameStartDrawSurface, &backdropSDLRect, &backdropSDLRect );
@@ -377,7 +423,7 @@
 		selected = -1;			
 		for( count=0; count<kTitleItems; count++ )
 		{
-			if( MPointInMRect( mouse, &titleRect[count] ) )
+			if( MPointInMRect( mouse, &titleItems[count].rect ) )
 			{
 				selected = count;
 				break;
@@ -385,8 +431,9 @@
 		}
 
 		// update glows
-        for (int glowUpdate=0; glowUpdate < 7; ++glowUpdate)
+		for (int glowUpdate=0; glowUpdate < kTitleItems; ++glowUpdate)
 		{
+			const MRect& titleRect = titleItems[glowUpdate].rect;
 			oldGlow = titleGlow[glowUpdate];
 			
 			if( selected == glowUpdate )
@@ -403,13 +450,13 @@
 			if( titleGlow[glowUpdate] != oldGlow )
 			{
 				SurfaceBlitColorOver( gameStartSurface,       gameStartDrawSurface,
-				                      &titleRect[glowUpdate], &titleRect[glowUpdate],
-				                       0, 0, 0, titleGlow[glowUpdate] );
+									  &titleRect, &titleRect,
+									   0, 0, 0, titleGlow[glowUpdate] );
 
-                drawRect[kGlow].top    = min<short>(drawRect[kGlow].top,    titleRect[glowUpdate].top);
-                drawRect[kGlow].left   = min<short>(drawRect[kGlow].left,   titleRect[glowUpdate].left);
-                drawRect[kGlow].bottom = max<short>(drawRect[kGlow].bottom, titleRect[glowUpdate].bottom);
-                drawRect[kGlow].right  = max<short>(drawRect[kGlow].right,  titleRect[glowUpdate].right);
+				drawRect[kGlow].top    = min<short>(drawRect[kGlow].top, titleRect.top);
+				drawRect[kGlow].left   = min<short>(drawRect[kGlow].left, titleRect.left);
+				drawRect[kGlow].bottom = max<short>(drawRect[kGlow].bottom, titleRect.bottom);
+				drawRect[kGlow].right  = max<short>(drawRect[kGlow].right, titleRect.right);
 			}
 		}
 
@@ -460,7 +507,7 @@
 
 	if( finished ) 
 	{
-		selected = 5; // quit
+		selected = 6; // quit
 	}
 	
 	switch( selected )
@@ -481,6 +528,7 @@
 
 	switch( selected )
 	{
+		// Tutorial
 		case 0: 
 			InitGame( kAutoControl, kNobodyControl );
 			level = kTutorialLevel;
@@ -489,6 +537,7 @@
 			QuickFadeIn( NULL );
 			break;				
 
+		// 1P, 2P, Solitaire
 		case 1:
 		case 2:
 		case 3:
@@ -501,28 +550,31 @@
             break;
         }
 		
+		// High scores
 		case 4: 
 			ShowHiscore();
 			ShowBestCombo();
 			break;
 			
+		// Controls
 		case 5:
-			finished = true;
-			break;
-		
-		case 6:
-        {
+		{
 			int currentID = RandomBefore(kLevels) * 100;
 	
 			DrawPICTInSurface( boardSurface[0], picBoard + currentID );	
 			DrawPICTInSurface( g_frontSurface, picBackdrop + currentID );
-            SDLU_Present();
+			SDLU_Present();
 	
 			QuickFadeIn( NULL );
 			HandleDialog( kControlsDialog );
 			QuickFadeOut( NULL );
 			goto redo;
-        }
+		}
+		
+		// Quit
+		case 6:
+			finished = true;
+			break;
 	}
 }
 
binary files a/src/main.cpp b/src/main.cpp differ