git repos / blockattack-game

blame: source/code/levelselect.cpp

normal view · raw

c6c637cc sago007 2016-11-12 17:35 1
/*
c6c637cc sago007 2016-11-12 17:35 2
===========================================================================
c6c637cc sago007 2016-11-12 17:35 3
blockattack - Block Attack - Rise of the Blocks
c6c637cc sago007 2016-11-12 17:35 4
Copyright (C) 2005-2016 Poul Sander
c6c637cc sago007 2016-11-12 17:35 5
c6c637cc sago007 2016-11-12 17:35 6
This program is free software: you can redistribute it and/or modify
c6c637cc sago007 2016-11-12 17:35 7
it under the terms of the GNU General Public License as published by
c6c637cc sago007 2016-11-12 17:35 8
the Free Software Foundation, either version 2 of the License, or
c6c637cc sago007 2016-11-12 17:35 9
(at your option) any later version.
c6c637cc sago007 2016-11-12 17:35 10
c6c637cc sago007 2016-11-12 17:35 11
This program is distributed in the hope that it will be useful,
c6c637cc sago007 2016-11-12 17:35 12
but WITHOUT ANY WARRANTY; without even the implied warranty of
c6c637cc sago007 2016-11-12 17:35 13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
c6c637cc sago007 2016-11-12 17:35 14
GNU General Public License for more details.
c6c637cc sago007 2016-11-12 17:35 15
c6c637cc sago007 2016-11-12 17:35 16
You should have received a copy of the GNU General Public License
c6c637cc sago007 2016-11-12 17:35 17
along with this program.  If not, see http://www.gnu.org/licenses/
c6c637cc sago007 2016-11-12 17:35 18
c6c637cc sago007 2016-11-12 17:35 19
Source information and contacts persons can be found at
83d6c18d sago007 2018-03-31 16:28 20
https://blockattack.net
c6c637cc sago007 2016-11-12 17:35 21
===========================================================================
c6c637cc sago007 2016-11-12 17:35 22
*/
c6c637cc sago007 2016-11-12 17:35 23
c6c637cc sago007 2016-11-12 17:35 24
#include "levelselect.hpp"
c6c637cc sago007 2016-11-12 17:35 25
#include "SDL.h"
c6c637cc sago007 2016-11-12 17:35 26
#include "common.h"
c6c637cc sago007 2016-11-12 17:35 27
#include "global.hpp"
c6c637cc sago007 2016-11-12 17:35 28
#include "puzzlehandler.hpp"
c6c637cc sago007 2016-11-12 17:35 29
#include "stageclearhandler.hpp"
c6c637cc sago007 2016-11-12 17:35 30
#include "MenuSystem.h"
16476649 Poul Sander 2022-01-09 10:29 31
#include <fmt/core.h>
c6c637cc sago007 2016-11-12 17:35 32
c6c637cc sago007 2016-11-12 17:35 33
c6c637cc sago007 2016-11-12 17:35 34
static bool bMouseUp;              //true if the mouse(1) is unpressed
c6c637cc sago007 2016-11-12 17:35 35
83d6c18d sago007 2018-03-31 16:28 36
static std::map<std::string, std::shared_ptr<sago::SagoTextField> > fieldCache;
83d6c18d sago007 2018-03-31 16:28 37
83d6c18d sago007 2018-03-31 16:28 38
static sago::SagoTextField* getCachedText(const std::string& text) {
83d6c18d sago007 2018-03-31 16:28 39
	std::shared_ptr<sago::SagoTextField> ptr = fieldCache[text];
83d6c18d sago007 2018-03-31 16:28 40
	if (!ptr) {
83d6c18d sago007 2018-03-31 16:28 41
		std::shared_ptr<sago::SagoTextField> newText = std::make_shared<sago::SagoTextField>();
83d6c18d sago007 2018-03-31 16:28 42
		sagoTextSetBlueFont(*newText.get());
0b8fb137 sago007 2018-03-31 19:53 43
		newText->SetText(text);
83d6c18d sago007 2018-03-31 16:28 44
		fieldCache[text] = newText;
83d6c18d sago007 2018-03-31 16:28 45
	}
83d6c18d sago007 2018-03-31 16:28 46
	return fieldCache[text].get();
83d6c18d sago007 2018-03-31 16:28 47
}
83d6c18d sago007 2018-03-31 16:28 48
83d6c18d sago007 2018-03-31 16:28 49
static void Write(SDL_Renderer* target, int x, int y, const char* text) {
9dabbfe5 Poul Sander 2025-03-06 20:54 50
	getCachedText(text)->Draw(target, x, y, sago::SagoTextField::Alignment::left, sago::SagoTextField::VerticalAlignment::top, &globalData.logicalResize);
c6c637cc sago007 2016-11-12 17:35 51
}
c6c637cc sago007 2016-11-12 17:35 52
c6c637cc sago007 2016-11-12 17:35 53
//The function that allows the player to choose PuzzleLevel
c6c637cc sago007 2016-11-12 17:35 54
int PuzzleLevelSelect(int Type) {
c6c637cc sago007 2016-11-12 17:35 55
	const int xplace = 200;
c6c637cc sago007 2016-11-12 17:35 56
	const int yplace = 300;
c6c637cc sago007 2016-11-12 17:35 57
	int levelNr = 0;
c6c637cc sago007 2016-11-12 17:35 58
	int oldmousex = 0;
c6c637cc sago007 2016-11-12 17:35 59
	int oldmousey = 0;
c6c637cc sago007 2016-11-12 17:35 60
	bool levelSelected = false;
c6c637cc sago007 2016-11-12 17:35 61
	int nrOfLevels = 0;
c6c637cc sago007 2016-11-12 17:35 62
	Uint32 totalScore = 0;
c6c637cc sago007 2016-11-12 17:35 63
	Uint32 totalTime = 0;
c6c637cc sago007 2016-11-12 17:35 64
	int selected = 0;
83d6c18d sago007 2018-03-31 16:28 65
	fieldCache.clear();
c6c637cc sago007 2016-11-12 17:35 66
c6c637cc sago007 2016-11-12 17:35 67
	//Loads the levels, if they havn't been loaded:
c6c637cc sago007 2016-11-12 17:35 68
	if (Type == 0) {
c6c637cc sago007 2016-11-12 17:35 69
		LoadPuzzleStages();
c6c637cc sago007 2016-11-12 17:35 70
		nrOfLevels = PuzzleGetNumberOfPuzzles();
c6c637cc sago007 2016-11-12 17:35 71
	}
c6c637cc sago007 2016-11-12 17:35 72
	if (Type == 1) {
c6c637cc sago007 2016-11-12 17:35 73
		LoadStageClearStages();
c6c637cc sago007 2016-11-12 17:35 74
		totalScore = GetTotalScore();
c6c637cc sago007 2016-11-12 17:35 75
		totalTime = GetTotalTime();
c6c637cc sago007 2016-11-12 17:35 76
		nrOfLevels = GetNrOfLevels();
c6c637cc sago007 2016-11-12 17:35 77
	}
c6c637cc sago007 2016-11-12 17:35 78
c6c637cc sago007 2016-11-12 17:35 79
	while (!levelSelected) {
c6c637cc sago007 2016-11-12 17:35 80
		SDL_Delay(1);
c6c637cc sago007 2016-11-12 17:35 81
		auto ticks = SDL_GetTicks();
c6c637cc sago007 2016-11-12 17:35 82
		DrawBackground(globalData.screen);
9dabbfe5 Poul Sander 2025-03-06 20:54 83
		int mousex;
9dabbfe5 Poul Sander 2025-03-06 20:54 84
		int mousey;
9dabbfe5 Poul Sander 2025-03-06 20:54 85
		globalData.logicalResize.PhysicalToLogical(globalData.mousex, globalData.mousey, mousex, mousey);
9dabbfe5 Poul Sander 2025-03-06 20:54 86
		globalData.iCheckBoxArea.Draw(globalData.screen,ticks,xplace,yplace, &globalData.logicalResize);
c6c637cc sago007 2016-11-12 17:35 87
		if (Type == 0) {
83d6c18d sago007 2018-03-31 16:28 88
			Write(globalData.screen, xplace+12,yplace+2,_("Select Puzzle") );
c6c637cc sago007 2016-11-12 17:35 89
		}
c6c637cc sago007 2016-11-12 17:35 90
		if (Type == 1) {
83d6c18d sago007 2018-03-31 16:28 91
			Write(globalData.screen, xplace+12,yplace+2, _("Stage Clear Level Select") );
c6c637cc sago007 2016-11-12 17:35 92
		}
c6c637cc sago007 2016-11-12 17:35 93
		//Now drow the fields you click in (and a V if clicked):
c6c637cc sago007 2016-11-12 17:35 94
		for (int i = 0; i < nrOfLevels; i++) {
9dabbfe5 Poul Sander 2025-03-06 20:54 95
			globalData.iLevelCheckBox.Draw(globalData.screen, ticks, xplace+10+(i%10)*50, yplace+60+(i/10)*50, &globalData.logicalResize);
c6c637cc sago007 2016-11-12 17:35 96
			if (i==selected) {
9dabbfe5 Poul Sander 2025-03-06 20:54 97
				globalData.iLevelCheckBoxMarked.Draw(globalData.screen, ticks, xplace+10+(i%10)*50, yplace+60+(i/10)*50, &globalData.logicalResize);
c6c637cc sago007 2016-11-12 17:35 98
			}
c6c637cc sago007 2016-11-12 17:35 99
			if (Type == 0 && PuzzleIsCleared(i)) {
9dabbfe5 Poul Sander 2025-03-06 20:54 100
				globalData.iLevelCheck.Draw(globalData.screen,ticks, xplace+10+(i%10)*50, yplace+60+(i/10)*50, &globalData.logicalResize);
c6c637cc sago007 2016-11-12 17:35 101
			}
c03502ad Poul Sander 2025-10-11 17:10 102
			if (Type == 1) {
c03502ad Poul Sander 2025-10-11 17:10 103
				if (GetStageScores(i) >= GetStageParScore(i)) {
c03502ad Poul Sander 2025-10-11 17:10 104
					globalData.yellow_star.Draw(globalData.screen, ticks, xplace+10+(i%10)*50+2, yplace+60+(i/10)*50+2, &globalData.logicalResize);
c03502ad Poul Sander 2025-10-11 17:10 105
				}
c03502ad Poul Sander 2025-10-11 17:10 106
				if (IsStageCleared(i)) {
c03502ad Poul Sander 2025-10-11 17:10 107
					globalData.iLevelCheck.Draw(globalData.screen, ticks, xplace+10+(i%10)*50, yplace+60+(i/10)*50, &globalData.logicalResize);
c03502ad Poul Sander 2025-10-11 17:10 108
				}
c6c637cc sago007 2016-11-12 17:35 109
			}
c6c637cc sago007 2016-11-12 17:35 110
		}
c6c637cc sago007 2016-11-12 17:35 111
c6c637cc sago007 2016-11-12 17:35 112
		SDL_Event event;
c6c637cc sago007 2016-11-12 17:35 113
		while ( SDL_PollEvent(&event) ) {
c6c637cc sago007 2016-11-12 17:35 114
			UpdateMouseCoordinates(event, globalData.mousex, globalData.mousey);
9dabbfe5 Poul Sander 2025-03-06 20:54 115
			globalData.logicalResize.PhysicalToLogical(globalData.mousex, globalData.mousey, mousex, mousey);
092bdebe sago007 2017-03-19 14:39 116
c6c637cc sago007 2016-11-12 17:35 117
			if ( event.type == SDL_QUIT ) {
c6c637cc sago007 2016-11-12 17:35 118
				Config::getInstance()->setShuttingDown(5);
c6c637cc sago007 2016-11-12 17:35 119
				levelNr = -1;
c6c637cc sago007 2016-11-12 17:35 120
				levelSelected = true;
c6c637cc sago007 2016-11-12 17:35 121
			}
c6c637cc sago007 2016-11-12 17:35 122
			if (isEscapeEvent(event)) {
c6c637cc sago007 2016-11-12 17:35 123
				levelNr = -1;
c6c637cc sago007 2016-11-12 17:35 124
				levelSelected = true;
c6c637cc sago007 2016-11-12 17:35 125
			}
c6c637cc sago007 2016-11-12 17:35 126
			if (isConfirmEvent(event)) {
c6c637cc sago007 2016-11-12 17:35 127
				levelNr = selected;
c6c637cc sago007 2016-11-12 17:35 128
				levelSelected = true;
c6c637cc sago007 2016-11-12 17:35 129
			}
c6c637cc sago007 2016-11-12 17:35 130
			if (isRightEvent(event)) {
c6c637cc sago007 2016-11-12 17:35 131
				++selected;
c6c637cc sago007 2016-11-12 17:35 132
				if (selected >= nrOfLevels) {
c6c637cc sago007 2016-11-12 17:35 133
					selected = 0;
c6c637cc sago007 2016-11-12 17:35 134
				}
c6c637cc sago007 2016-11-12 17:35 135
			}
c6c637cc sago007 2016-11-12 17:35 136
			if (isLeftEvent(event)) {
c6c637cc sago007 2016-11-12 17:35 137
				--selected;
c6c637cc sago007 2016-11-12 17:35 138
				if (selected < 0) {
c6c637cc sago007 2016-11-12 17:35 139
					selected = nrOfLevels-1;
c6c637cc sago007 2016-11-12 17:35 140
				}
c6c637cc sago007 2016-11-12 17:35 141
			}
c6c637cc sago007 2016-11-12 17:35 142
			if (isDownEvent(event)) {
c6c637cc sago007 2016-11-12 17:35 143
				selected+=10;
c6c637cc sago007 2016-11-12 17:35 144
				if (selected >= nrOfLevels) {
c6c637cc sago007 2016-11-12 17:35 145
					selected-=10;
c6c637cc sago007 2016-11-12 17:35 146
				}
c6c637cc sago007 2016-11-12 17:35 147
			}
c6c637cc sago007 2016-11-12 17:35 148
			if (isUpEvent(event)) {
c6c637cc sago007 2016-11-12 17:35 149
				selected-=10;
c6c637cc sago007 2016-11-12 17:35 150
				if (selected < 0) {
c6c637cc sago007 2016-11-12 17:35 151
					selected+=10;
c6c637cc sago007 2016-11-12 17:35 152
				}
c6c637cc sago007 2016-11-12 17:35 153
			}
c6c637cc sago007 2016-11-12 17:35 154
		}
c6c637cc sago007 2016-11-12 17:35 155
c6c637cc sago007 2016-11-12 17:35 156
		SDL_GetKeyboardState(nullptr);
c6c637cc sago007 2016-11-12 17:35 157
9dabbfe5 Poul Sander 2025-03-06 20:54 158
		if (mousex != oldmousex || mousey != oldmousey) {
c6c637cc sago007 2016-11-12 17:35 159
			int tmpSelected = -1;
c6c637cc sago007 2016-11-12 17:35 160
			int j;
c6c637cc sago007 2016-11-12 17:35 161
			for (j = 0; (tmpSelected == -1) && ( (j<nrOfLevels/10)||((j<nrOfLevels/10+1)&&(nrOfLevels%10 != 0)) ); j++) {
9dabbfe5 Poul Sander 2025-03-06 20:54 162
				if ((60+j*50<mousey-yplace)&&(mousey-yplace<j*50+92)) {
c6c637cc sago007 2016-11-12 17:35 163
					tmpSelected = j*10;
c6c637cc sago007 2016-11-12 17:35 164
				}
c6c637cc sago007 2016-11-12 17:35 165
			}
c6c637cc sago007 2016-11-12 17:35 166
			if (tmpSelected != -1) {
c6c637cc sago007 2016-11-12 17:35 167
				for (int k = 0; (( (!(nrOfLevels%10) || k<nrOfLevels-10*(j-1)) )&&(k<10)); k++) {
9dabbfe5 Poul Sander 2025-03-06 20:54 168
					if ((10+k*50<mousex-xplace)&&(mousex-xplace<k*50+42)) {
c6c637cc sago007 2016-11-12 17:35 169
						tmpSelected +=k;
c6c637cc sago007 2016-11-12 17:35 170
						selected = tmpSelected;
c6c637cc sago007 2016-11-12 17:35 171
					}
c6c637cc sago007 2016-11-12 17:35 172
				}
c6c637cc sago007 2016-11-12 17:35 173
			}
c6c637cc sago007 2016-11-12 17:35 174
		}
9dabbfe5 Poul Sander 2025-03-06 20:54 175
		oldmousey = mousey;
9dabbfe5 Poul Sander 2025-03-06 20:54 176
		oldmousex= mousex;
c6c637cc sago007 2016-11-12 17:35 177
c6c637cc sago007 2016-11-12 17:35 178
		// If the mouse button is released, make bMouseUp equal true
c6c637cc sago007 2016-11-12 17:35 179
		if ( !(SDL_GetMouseState(nullptr, nullptr)&SDL_BUTTON(1)) ) {
c6c637cc sago007 2016-11-12 17:35 180
			bMouseUp=true;
c6c637cc sago007 2016-11-12 17:35 181
		}
c6c637cc sago007 2016-11-12 17:35 182
c6c637cc sago007 2016-11-12 17:35 183
		if (SDL_GetMouseState(nullptr,nullptr)&SDL_BUTTON(1) && bMouseUp) {
c6c637cc sago007 2016-11-12 17:35 184
			bMouseUp = false;
c6c637cc sago007 2016-11-12 17:35 185
c6c637cc sago007 2016-11-12 17:35 186
			int levelClicked = -1;
c6c637cc sago007 2016-11-12 17:35 187
			int i;
c6c637cc sago007 2016-11-12 17:35 188
			for (i = 0; (i<nrOfLevels/10)||((i<nrOfLevels/10+1)&&(nrOfLevels%10 != 0)); i++)
9dabbfe5 Poul Sander 2025-03-06 20:54 189
				if ((60+i*50<mousey-yplace)&&(mousey-yplace<i*50+92)) {
c6c637cc sago007 2016-11-12 17:35 190
					levelClicked = i*10;
c6c637cc sago007 2016-11-12 17:35 191
				}
c6c637cc sago007 2016-11-12 17:35 192
			i++;
c6c637cc sago007 2016-11-12 17:35 193
			if (levelClicked != -1)
c6c637cc sago007 2016-11-12 17:35 194
				for (int j = 0; ((j<nrOfStageLevels%(i*10))&&(j<10)); j++)
9dabbfe5 Poul Sander 2025-03-06 20:54 195
					if ((10+j*50<mousex-xplace)&&(mousex-xplace<j*50+42)) {
c6c637cc sago007 2016-11-12 17:35 196
						levelClicked +=j;
c6c637cc sago007 2016-11-12 17:35 197
						levelSelected = true;
c6c637cc sago007 2016-11-12 17:35 198
						levelNr = levelClicked;
c6c637cc sago007 2016-11-12 17:35 199
					}
c6c637cc sago007 2016-11-12 17:35 200
		}
c6c637cc sago007 2016-11-12 17:35 201
c6c637cc sago007 2016-11-12 17:35 202
		if (Type == 1) {
16476649 Poul Sander 2022-01-09 10:29 203
			std::string scoreString = fmt::format(_("Best score: {}"), GetStageScores(selected)) ;
16476649 Poul Sander 2022-01-09 10:29 204
			std::string timeString = fmt::format(_("Time used: {}"),"-- : --");
c03502ad Poul Sander 2025-10-11 17:10 205
			std::string parScoreString = fmt::format(_("Par score: {}"), GetStageParScore(selected));
c6c637cc sago007 2016-11-12 17:35 206
c6c637cc sago007 2016-11-12 17:35 207
			if (GetStageTime(selected)>0) {
16476649 Poul Sander 2022-01-09 10:29 208
				timeString = fmt::format(_("Time used: {} : {:02}"), GetStageTime(selected)/1000/60, (GetStageTime(selected)/1000)%60);
c6c637cc sago007 2016-11-12 17:35 209
			}
c6c637cc sago007 2016-11-12 17:35 210
83d6c18d sago007 2018-03-31 16:28 211
			Write(globalData.screen, 200,200,scoreString.c_str());
c03502ad Poul Sander 2025-10-11 17:10 212
			Write(globalData.screen,  500, 200, parScoreString.c_str());
83d6c18d sago007 2018-03-31 16:28 213
			Write(globalData.screen, 200,250,timeString.c_str());
16476649 Poul Sander 2022-01-09 10:29 214
			std::string totalString = fmt::format(_("Total score: {} in {}:{:02}"), totalScore, totalTime/1000/60, ((totalTime/1000)%60) );
83d6c18d sago007 2018-03-31 16:28 215
			Write(globalData.screen, 200,600,totalString.c_str());
c6c637cc sago007 2016-11-12 17:35 216
		}
c6c637cc sago007 2016-11-12 17:35 217
c6c637cc sago007 2016-11-12 17:35 218
		globalData.mouse.Draw(globalData.screen, SDL_GetTicks(), globalData.mousex, globalData.mousey);
c6c637cc sago007 2016-11-12 17:35 219
		SDL_RenderPresent(globalData.screen); //draws it all to the screen
c6c637cc sago007 2016-11-12 17:35 220
c6c637cc sago007 2016-11-12 17:35 221
	}
c6c637cc sago007 2016-11-12 17:35 222
	DrawBackground(globalData.screen);
c6c637cc sago007 2016-11-12 17:35 223
	return levelNr;
32754436 Poul Sander 2020-08-15 15:12 224
}
1970-01-01 00:00 225