git repos / blockattack-game

blame: source/code/ScoresDisplay.cpp

normal view · raw

c3b697c6 sago007 2016-02-07 17:30 1
/*
7a956470 sago007 2016-02-14 17:09 2
===========================================================================
7a956470 sago007 2016-02-14 17:09 3
blockattack - Block Attack - Rise of the Blocks
7a956470 sago007 2016-02-14 17:09 4
Copyright (C) 2005-2016 Poul Sander
c3b697c6 sago007 2016-02-07 17:30 5
7a956470 sago007 2016-02-14 17:09 6
This program is free software: you can redistribute it and/or modify
7a956470 sago007 2016-02-14 17:09 7
it under the terms of the GNU General Public License as published by
7a956470 sago007 2016-02-14 17:09 8
the Free Software Foundation, either version 2 of the License, or
7a956470 sago007 2016-02-14 17:09 9
(at your option) any later version.
7a956470 sago007 2016-02-14 17:09 10
7a956470 sago007 2016-02-14 17:09 11
This program is distributed in the hope that it will be useful,
7a956470 sago007 2016-02-14 17:09 12
but WITHOUT ANY WARRANTY; without even the implied warranty of
7a956470 sago007 2016-02-14 17:09 13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
7a956470 sago007 2016-02-14 17:09 14
GNU General Public License for more details.
7a956470 sago007 2016-02-14 17:09 15
7a956470 sago007 2016-02-14 17:09 16
You should have received a copy of the GNU General Public License
7a956470 sago007 2016-02-14 17:09 17
along with this program.  If not, see http://www.gnu.org/licenses/
7a956470 sago007 2016-02-14 17:09 18
7a956470 sago007 2016-02-14 17:09 19
Source information and contacts persons can be found at
7a956470 sago007 2016-02-14 17:09 20
http://www.blockattack.net
7a956470 sago007 2016-02-14 17:09 21
===========================================================================
7a956470 sago007 2016-02-14 17:09 22
*/
c3b697c6 sago007 2016-02-07 17:30 23
c3b697c6 sago007 2016-02-07 17:30 24
#include "ScoresDisplay.hpp"
c3b697c6 sago007 2016-02-07 17:30 25
#include "global.hpp"
c3b697c6 sago007 2016-02-07 17:30 26
#include "common.h"
c3b697c6 sago007 2016-02-07 17:30 27
#include "stats.h"
d21782d4 sago007 2016-03-13 11:17 28
#include "MenuSystem.h"
c3b697c6 sago007 2016-02-07 17:30 29
96eb7a16 sago007 2016-04-29 17:01 30
using std::string;
96eb7a16 sago007 2016-04-29 17:01 31
using std::cerr;
96eb7a16 sago007 2016-04-29 17:01 32
using std::vector;
c3b697c6 sago007 2016-02-07 17:30 33
34ab7861 sago007 2018-03-28 14:47 34
static void setButtonFont(const sago::SagoDataHolder* holder, sago::SagoTextField& field, const char* text){
34ab7861 sago007 2018-03-28 14:47 35
	field.SetHolder(holder);
34ab7861 sago007 2018-03-28 14:47 36
	field.SetFont("freeserif");
34ab7861 sago007 2018-03-28 14:47 37
	field.SetColor({255,255,255,255});
34ab7861 sago007 2018-03-28 14:47 38
	field.SetFontSize(24);
34ab7861 sago007 2018-03-28 14:47 39
	field.SetOutline(1, {0,0,0,255});
34ab7861 sago007 2018-03-28 14:47 40
	field.SetText(text);
34ab7861 sago007 2018-03-28 14:47 41
}
e1b2e653 sago007 2017-11-28 18:10 42
c3b697c6 sago007 2016-02-07 17:30 43
static void NFont_Write(SDL_Renderer* target, int x, int y, const char* text) {
e1b2e653 sago007 2017-11-28 18:10 44
	globalData.standard_blue_font.draw(target, x, y, text);
c3b697c6 sago007 2016-02-07 17:30 45
}
c3b697c6 sago007 2016-02-07 17:30 46
c3b697c6 sago007 2016-02-07 17:30 47
const int numberOfPages = 3;
c3b697c6 sago007 2016-02-07 17:30 48
13476fc2 sago007 2016-09-28 18:34 49
void ScoresDisplay::DrawBackgroundAndCalcPlacements() {
72383a9e sago007 2016-10-30 11:56 50
	DrawBackground(globalData.screen);
72383a9e sago007 2016-10-30 11:56 51
	nextX = globalData.xsize-buttonXsize-20;
72383a9e sago007 2016-10-30 11:56 52
	backY = globalData.ysize-buttonYsize-20;
13476fc2 sago007 2016-09-28 18:34 53
	nextY = backY;
13476fc2 sago007 2016-09-28 18:34 54
}
13476fc2 sago007 2016-09-28 18:34 55
c3b697c6 sago007 2016-02-07 17:30 56
//Draws the highscores
c3b697c6 sago007 2016-02-07 17:30 57
void ScoresDisplay::DrawHighscores(int x, int y, bool endless) {
13476fc2 sago007 2016-09-28 18:34 58
	DrawBackgroundAndCalcPlacements();
c3b697c6 sago007 2016-02-07 17:30 59
	if (endless) {
e1b2e653 sago007 2017-11-28 18:10 60
		globalData.standard_blue_font.draw(globalData.screen, x+100,y+100, _("Endless:") );
c3b697c6 sago007 2016-02-07 17:30 61
	}
c3b697c6 sago007 2016-02-07 17:30 62
	else {
e1b2e653 sago007 2017-11-28 18:10 63
		globalData.standard_blue_font.draw(globalData.screen, x+100,y+100, _("Time Trial:") );
c3b697c6 sago007 2016-02-07 17:30 64
	}
c3b697c6 sago007 2016-02-07 17:30 65
	for (int i =0; i<10; i++) {
7a956470 sago007 2016-02-14 17:09 66
		record r;
c3b697c6 sago007 2016-02-07 17:30 67
		if (endless) {
72383a9e sago007 2016-10-30 11:56 68
			r = globalData.theTopScoresEndless.getScoreNumber(i);
c3b697c6 sago007 2016-02-07 17:30 69
		}
c3b697c6 sago007 2016-02-07 17:30 70
		else {
72383a9e sago007 2016-10-30 11:56 71
			r = globalData.theTopScoresTimeTrial.getScoreNumber(i);
c3b697c6 sago007 2016-02-07 17:30 72
		}
7a956470 sago007 2016-02-14 17:09 73
		char playerScore[32];
7a956470 sago007 2016-02-14 17:09 74
		char playerName[32];
7a956470 sago007 2016-02-14 17:09 75
		snprintf(playerScore, sizeof(playerScore), "%i", r.score);
7a956470 sago007 2016-02-14 17:09 76
		snprintf(playerName, sizeof(playerName), "%s", r.name.c_str());
e1b2e653 sago007 2017-11-28 18:10 77
		globalData.standard_blue_font.draw(globalData.screen, x+420,y+150+i*35, playerScore);
e1b2e653 sago007 2017-11-28 18:10 78
		globalData.standard_blue_font.draw(globalData.screen, x+60,y+150+i*35, playerName);
c3b697c6 sago007 2016-02-07 17:30 79
	}
c3b697c6 sago007 2016-02-07 17:30 80
}
c3b697c6 sago007 2016-02-07 17:30 81
c3b697c6 sago007 2016-02-07 17:30 82
void ScoresDisplay::DrawStats() {
13476fc2 sago007 2016-09-28 18:34 83
	DrawBackgroundAndCalcPlacements();
c3b697c6 sago007 2016-02-07 17:30 84
	int y = 5;
c3b697c6 sago007 2016-02-07 17:30 85
	const int y_spacing = 30;
72383a9e sago007 2016-10-30 11:56 86
	NFont_Write(globalData.screen, 10,y,_("Stats") );
c3b697c6 sago007 2016-02-07 17:30 87
	y+=y_spacing*2;
72383a9e sago007 2016-10-30 11:56 88
	NFont_Write(globalData.screen, 10,y,_("Chains") );
c3b697c6 sago007 2016-02-07 17:30 89
	for (int i=2; i<13; i++) {
c3b697c6 sago007 2016-02-07 17:30 90
		y+=y_spacing;
72383a9e sago007 2016-10-30 11:56 91
		NFont_Write(globalData.screen, 10,y,(std::to_string(i)+"X").c_str());
549ecfae sago007 2016-10-09 08:37 92
		string numberAsString = std::to_string(Stats::getInstance()->getNumberOf("chainX"+std::to_string(i)));
72383a9e sago007 2016-10-30 11:56 93
		NFont_Write(globalData.screen, 300,y,numberAsString.c_str());
c3b697c6 sago007 2016-02-07 17:30 94
	}
c3b697c6 sago007 2016-02-07 17:30 95
	y+=y_spacing*2;
72383a9e sago007 2016-10-30 11:56 96
	NFont_Write(globalData.screen, 10,y,_("Lines Pushed: ") );
549ecfae sago007 2016-10-09 08:37 97
	string numberAsString = std::to_string(Stats::getInstance()->getNumberOf("linesPushed"));
72383a9e sago007 2016-10-30 11:56 98
	NFont_Write(globalData.screen, 300,y,numberAsString.c_str());
c3b697c6 sago007 2016-02-07 17:30 99
c3b697c6 sago007 2016-02-07 17:30 100
	y+=y_spacing;
72383a9e sago007 2016-10-30 11:56 101
	NFont_Write(globalData.screen, 10,y, _("Puzzles solved: ") );
549ecfae sago007 2016-10-09 08:37 102
	numberAsString = std::to_string(Stats::getInstance()->getNumberOf("puzzlesSolved"));
72383a9e sago007 2016-10-30 11:56 103
	NFont_Write(globalData.screen, 300,y,numberAsString.c_str());
c3b697c6 sago007 2016-02-07 17:30 104
c3b697c6 sago007 2016-02-07 17:30 105
	y+=y_spacing*2;
72383a9e sago007 2016-10-30 11:56 106
	NFont_Write(globalData.screen, 10,y, _("Run time: ") );
c3b697c6 sago007 2016-02-07 17:30 107
	commonTime ct = TimeHandler::peekTime("totalTime",TimeHandler::ms2ct(SDL_GetTicks()));
c3b697c6 sago007 2016-02-07 17:30 108
	y+=y_spacing;
72383a9e sago007 2016-10-30 11:56 109
	NFont_Write(globalData.screen, 10, y, SPrintCF( _("Days: %i"), ct.days) );
c3b697c6 sago007 2016-02-07 17:30 110
	y+=y_spacing;
72383a9e sago007 2016-10-30 11:56 111
	NFont_Write(globalData.screen, 10, y, SPrintCF( _("Hours: %i"), ct.hours) );
c3b697c6 sago007 2016-02-07 17:30 112
	y+=y_spacing;
72383a9e sago007 2016-10-30 11:56 113
	NFont_Write(globalData.screen, 10, y, SPrintCF( _("Minutes: %i"), ct.minutes) );
c3b697c6 sago007 2016-02-07 17:30 114
	y+=y_spacing;
72383a9e sago007 2016-10-30 11:56 115
	NFont_Write(globalData.screen, 10, y, SPrintCF( _("Seconds: %i"), ct.seconds) );
c3b697c6 sago007 2016-02-07 17:30 116
c3b697c6 sago007 2016-02-07 17:30 117
	y-=y_spacing*4; //Four rows back
72383a9e sago007 2016-10-30 11:56 118
	const int x_offset3 = globalData.xsize/3+10; //Ofset for three rows
72383a9e sago007 2016-10-30 11:56 119
	NFont_Write(globalData.screen, x_offset3,y, _("Play time: ") );
c3b697c6 sago007 2016-02-07 17:30 120
	ct = TimeHandler::getTime("playTime");
c3b697c6 sago007 2016-02-07 17:30 121
	y+=y_spacing;
72383a9e sago007 2016-10-30 11:56 122
	NFont_Write(globalData.screen, x_offset3, y, SPrintCF( _("Days: %i"), ct.days) );
c3b697c6 sago007 2016-02-07 17:30 123
	y+=y_spacing;
72383a9e sago007 2016-10-30 11:56 124
	NFont_Write(globalData.screen, x_offset3, y, SPrintCF( _("Hours: %i"), ct.hours) );
c3b697c6 sago007 2016-02-07 17:30 125
	y+=y_spacing;
72383a9e sago007 2016-10-30 11:56 126
	NFont_Write(globalData.screen, x_offset3, y, SPrintCF( _("Minutes: %i"), ct.minutes) );
c3b697c6 sago007 2016-02-07 17:30 127
	y+=y_spacing;
72383a9e sago007 2016-10-30 11:56 128
	NFont_Write(globalData.screen, x_offset3, y, SPrintCF( _("Seconds: %i"), ct.seconds) );
c3b697c6 sago007 2016-02-07 17:30 129
72383a9e sago007 2016-10-30 11:56 130
	const int x_offset = globalData.xsize/2+10;
c3b697c6 sago007 2016-02-07 17:30 131
	y = 5+y_spacing*2;
72383a9e sago007 2016-10-30 11:56 132
	NFont_Write(globalData.screen, x_offset,y, _("VS CPU (win/loss)") );
c3b697c6 sago007 2016-02-07 17:30 133
	for (int i=0; i<7; i++) {
c3b697c6 sago007 2016-02-07 17:30 134
		y += y_spacing;
72383a9e sago007 2016-10-30 11:56 135
		NFont_Write(globalData.screen, x_offset,y,string("AI "+std::to_string(i+1)).c_str());
549ecfae sago007 2016-10-09 08:37 136
		numberAsString = std::to_string(Stats::getInstance()->getNumberOf("defeatedAI"+std::to_string(i)));
549ecfae sago007 2016-10-09 08:37 137
		string numberAsString2 = std::to_string(Stats::getInstance()->getNumberOf("defeatedByAI"+std::to_string(i)));
c3b697c6 sago007 2016-02-07 17:30 138
		string toPrint = numberAsString + "/" + numberAsString2;
72383a9e sago007 2016-10-30 11:56 139
		NFont_Write(globalData.screen, x_offset+230,y,toPrint.c_str());
c3b697c6 sago007 2016-02-07 17:30 140
	}
c3b697c6 sago007 2016-02-07 17:30 141
}
c3b697c6 sago007 2016-02-07 17:30 142
c3b697c6 sago007 2016-02-07 17:30 143
ScoresDisplay::ScoresDisplay() {
c3b697c6 sago007 2016-02-07 17:30 144
}
c3b697c6 sago007 2016-02-07 17:30 145
c3b697c6 sago007 2016-02-07 17:30 146
ScoresDisplay::~ScoresDisplay() {
c3b697c6 sago007 2016-02-07 17:30 147
}
c3b697c6 sago007 2016-02-07 17:30 148
c3b697c6 sago007 2016-02-07 17:30 149
bool ScoresDisplay::IsActive() {
c3b697c6 sago007 2016-02-07 17:30 150
	return isActive;
c3b697c6 sago007 2016-02-07 17:30 151
}
c3b697c6 sago007 2016-02-07 17:30 152
647f12da sago007 2016-09-12 20:07 153
void ScoresDisplay::Draw(SDL_Renderer*) {
c3b697c6 sago007 2016-02-07 17:30 154
	switch (page) {
c3b697c6 sago007 2016-02-07 17:30 155
	case 0:
c3b697c6 sago007 2016-02-07 17:30 156
		//Highscores, endless
c3b697c6 sago007 2016-02-07 17:30 157
		DrawHighscores(100,100,true);
c3b697c6 sago007 2016-02-07 17:30 158
		break;
c3b697c6 sago007 2016-02-07 17:30 159
	case 1:
c3b697c6 sago007 2016-02-07 17:30 160
		//Highscores, Time Trial
c3b697c6 sago007 2016-02-07 17:30 161
		DrawHighscores(100,100,false);
c3b697c6 sago007 2016-02-07 17:30 162
		break;
c3b697c6 sago007 2016-02-07 17:30 163
	case 2:
c3b697c6 sago007 2016-02-07 17:30 164
	default:
c3b697c6 sago007 2016-02-07 17:30 165
		DrawStats();
c3b697c6 sago007 2016-02-07 17:30 166
	};
c3b697c6 sago007 2016-02-07 17:30 167
34ab7861 sago007 2018-03-28 14:47 168
	const sago::SagoDataHolder* holder = &globalData.spriteHolder->GetDataHolder();
c3b697c6 sago007 2016-02-07 17:30 169
	//Draw buttons:
72383a9e sago007 2016-10-30 11:56 170
	globalData.bHighScore.Draw(globalData.screen, 0, scoreX,scoreY);
72383a9e sago007 2016-10-30 11:56 171
	globalData.bBack.Draw(globalData.screen, 0, backX, backY);
34ab7861 sago007 2018-03-28 14:47 172
	static sago::SagoTextField backLabel;
34ab7861 sago007 2018-03-28 14:47 173
	setButtonFont(holder, backLabel, _("Back"));
34ab7861 sago007 2018-03-28 14:47 174
	backLabel.Draw(globalData.screen, backX+60,backY+10, sago::SagoTextField::Alignment::center);
72383a9e sago007 2016-10-30 11:56 175
	globalData.bNext.Draw(globalData.screen, 0, nextX, nextY);
34ab7861 sago007 2018-03-28 14:47 176
	static sago::SagoTextField nextLabel;
34ab7861 sago007 2018-03-28 14:47 177
	setButtonFont(holder, nextLabel, _("Next"));
34ab7861 sago007 2018-03-28 14:47 178
	nextLabel.Draw(globalData.screen, nextX+60, nextY+10, sago::SagoTextField::Alignment::center);
c3b697c6 sago007 2016-02-07 17:30 179
c3b697c6 sago007 2016-02-07 17:30 180
	//Draw page number
d3f1e001 Poul Sander 2017-03-29 18:17 181
	string pageXofY = SPrintStringF(_("Page %i of %i"), page+1, numberOfPages);
e1b2e653 sago007 2017-11-28 18:10 182
	//NFont_Write(globalData.screen, globalData.xsize/2-globalData.nf_standard_blue_font.getWidth( "%s", pageXofY.c_str())/2, globalData.ysize-60, pageXofY.c_str());
e1b2e653 sago007 2017-11-28 18:10 183
	globalData.standard_blue_font.drawCenter(globalData.screen,  globalData.xsize/2, globalData.ysize-60, pageXofY );
c3b697c6 sago007 2016-02-07 17:30 184
}
c3b697c6 sago007 2016-02-07 17:30 185
58a2d7e1 sago007 2016-02-12 18:53 186
void ScoresDisplay::ProcessInput(const SDL_Event& event, bool& processed) {
c7f2082f sago007 2016-03-13 11:48 187
20d77c6e sago007 2016-11-12 16:28 188
	UpdateMouseCoordinates(event, globalData.mousex, globalData.mousey);
092bdebe sago007 2017-03-19 14:39 189
d21782d4 sago007 2016-03-13 11:17 190
	if (isLeftEvent(event)) {
d21782d4 sago007 2016-03-13 11:17 191
		page++;
d21782d4 sago007 2016-03-13 11:17 192
		if (page>=numberOfPages) {
d21782d4 sago007 2016-03-13 11:17 193
			page = 0;
c3b697c6 sago007 2016-02-07 17:30 194
		}
647f12da sago007 2016-09-12 20:07 195
		processed = true;
d21782d4 sago007 2016-03-13 11:17 196
	}
8e3fb7e1 sago007 2016-03-13 11:26 197
d21782d4 sago007 2016-03-13 11:17 198
	if (isRightEvent(event)) {
d21782d4 sago007 2016-03-13 11:17 199
		page--;
d21782d4 sago007 2016-03-13 11:17 200
		if (page<0) {
d21782d4 sago007 2016-03-13 11:17 201
			page = numberOfPages-1;
c3b697c6 sago007 2016-02-07 17:30 202
		}
647f12da sago007 2016-09-12 20:07 203
		processed = true;
c3b697c6 sago007 2016-02-07 17:30 204
	}
8e3fb7e1 sago007 2016-03-13 11:26 205
d21782d4 sago007 2016-03-13 11:17 206
	if (isConfirmEvent(event) || isEscapeEvent(event)) {
d21782d4 sago007 2016-03-13 11:17 207
		isActive = false;
647f12da sago007 2016-09-12 20:07 208
		processed = true;
d21782d4 sago007 2016-03-13 11:17 209
	}
c3b697c6 sago007 2016-02-07 17:30 210
}
c3b697c6 sago007 2016-02-07 17:30 211
c3b697c6 sago007 2016-02-07 17:30 212
void ScoresDisplay::Update() {
c3b697c6 sago007 2016-02-07 17:30 213
	// If the mouse button is released, make bMouseUp equal true
08c44684 sago007 2016-10-30 09:19 214
	if ( !(SDL_GetMouseState(nullptr, nullptr)&SDL_BUTTON(1)) ) {
c3b697c6 sago007 2016-02-07 17:30 215
		bMouseUp=true;
c3b697c6 sago007 2016-02-07 17:30 216
	}
c3b697c6 sago007 2016-02-07 17:30 217
c3b697c6 sago007 2016-02-07 17:30 218
	if (SDL_GetMouseState(nullptr,nullptr)&SDL_BUTTON(1) && bMouseUp) {
c3b697c6 sago007 2016-02-07 17:30 219
		bMouseUp = false;
c3b697c6 sago007 2016-02-07 17:30 220
c3b697c6 sago007 2016-02-07 17:30 221
		//The Score button:
20d77c6e sago007 2016-11-12 16:28 222
		if ((globalData.mousex>scoreX) && (globalData.mousex<scoreX+buttonXsize) && (globalData.mousey>scoreY) && (globalData.mousey<scoreY+buttonYsize)) {
c3b697c6 sago007 2016-02-07 17:30 223
			isActive = false;
c3b697c6 sago007 2016-02-07 17:30 224
		}
c3b697c6 sago007 2016-02-07 17:30 225
c3b697c6 sago007 2016-02-07 17:30 226
		//The back button:
20d77c6e sago007 2016-11-12 16:28 227
		if ((globalData.mousex>backX) && (globalData.mousex<backX+buttonXsize) && (globalData.mousey>backY) && (globalData.mousey<backY+buttonYsize)) {
c3b697c6 sago007 2016-02-07 17:30 228
			page--;
c3b697c6 sago007 2016-02-07 17:30 229
			if (page<0) {
c3b697c6 sago007 2016-02-07 17:30 230
				page = numberOfPages-1;
c3b697c6 sago007 2016-02-07 17:30 231
			}
c3b697c6 sago007 2016-02-07 17:30 232
		}
c3b697c6 sago007 2016-02-07 17:30 233
c3b697c6 sago007 2016-02-07 17:30 234
		//The next button:
20d77c6e sago007 2016-11-12 16:28 235
		if ((globalData.mousex>nextX) && (globalData.mousex<nextX+buttonXsize) && (globalData.mousey>nextY) && (globalData.mousey<nextY+buttonYsize)) {
c3b697c6 sago007 2016-02-07 17:30 236
			page++;
c3b697c6 sago007 2016-02-07 17:30 237
			if (page>=numberOfPages) {
c3b697c6 sago007 2016-02-07 17:30 238
				page = 0;
c3b697c6 sago007 2016-02-07 17:30 239
			}
c3b697c6 sago007 2016-02-07 17:30 240
		}
c3b697c6 sago007 2016-02-07 17:30 241
	}
c3b697c6 sago007 2016-02-07 17:30 242
}