git repos / blockattack-game

blame: source/code/BlockGameSdl.inc

normal view · raw

06fd7dec sago007 2016-04-04 17:53 1
/*
06fd7dec sago007 2016-04-04 17:53 2
===========================================================================
06fd7dec sago007 2016-04-04 17:53 3
blockattack - Block Attack - Rise of the Blocks
06fd7dec sago007 2016-04-04 17:53 4
Copyright (C) 2005-2016 Poul Sander
06fd7dec sago007 2016-04-04 17:53 5
06fd7dec sago007 2016-04-04 17:53 6
This program is free software: you can redistribute it and/or modify
06fd7dec sago007 2016-04-04 17:53 7
it under the terms of the GNU General Public License as published by
06fd7dec sago007 2016-04-04 17:53 8
the Free Software Foundation, either version 2 of the License, or
06fd7dec sago007 2016-04-04 17:53 9
(at your option) any later version.
06fd7dec sago007 2016-04-04 17:53 10
06fd7dec sago007 2016-04-04 17:53 11
This program is distributed in the hope that it will be useful,
06fd7dec sago007 2016-04-04 17:53 12
but WITHOUT ANY WARRANTY; without even the implied warranty of
06fd7dec sago007 2016-04-04 17:53 13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
06fd7dec sago007 2016-04-04 17:53 14
GNU General Public License for more details.
06fd7dec sago007 2016-04-04 17:53 15
06fd7dec sago007 2016-04-04 17:53 16
You should have received a copy of the GNU General Public License
06fd7dec sago007 2016-04-04 17:53 17
along with this program.  If not, see http://www.gnu.org/licenses/
06fd7dec sago007 2016-04-04 17:53 18
06fd7dec sago007 2016-04-04 17:53 19
Source information and contacts persons can be found at
810e1c2f sago007 2018-03-28 09:40 20
https://blockattack.net
06fd7dec sago007 2016-04-04 17:53 21
===========================================================================
06fd7dec sago007 2016-04-04 17:53 22
*/
8b1ab1cb sago007 2016-04-04 17:51 23
e8d66c68 sago007 2016-07-12 17:32 24
#include "BlockGame.hpp"
c310f8a5 sago007 2017-03-25 16:05 25
#include "global.hpp"
343fbe43 sago007 2018-03-27 19:53 26
#include "sago/SagoTextField.hpp"
247fe34e sago007 2018-06-30 12:35 27
#include "mainVars.inc"
e8d66c68 sago007 2016-07-12 17:32 28
343fbe43 sago007 2018-03-27 19:53 29
static void setScoreboardFont(const sago::SagoDataHolder* holder, sago::SagoTextField& field, const char* text){
343fbe43 sago007 2018-03-27 19:53 30
	field.SetHolder(holder);
343fbe43 sago007 2018-03-27 19:53 31
	field.SetFont("penguinattack");
343fbe43 sago007 2018-03-27 19:53 32
	field.SetColor({255,255,255,255});
343fbe43 sago007 2018-03-27 19:53 33
	field.SetFontSize(20);
343fbe43 sago007 2018-03-27 19:53 34
	field.SetText(text);
343fbe43 sago007 2018-03-27 19:53 35
}
e8d66c68 sago007 2016-07-12 17:32 36
871ce5d6 sago007 2018-03-28 12:36 37
static void setButtonFont(const sago::SagoDataHolder* holder, sago::SagoTextField& field, const char* text){
871ce5d6 sago007 2018-03-28 12:36 38
	field.SetHolder(holder);
871ce5d6 sago007 2018-03-28 12:36 39
	field.SetFont("freeserif");
871ce5d6 sago007 2018-03-28 12:36 40
	field.SetColor({255,255,255,255});
871ce5d6 sago007 2018-03-28 12:36 41
	field.SetFontSize(24);
f6e8c704 sago007 2018-04-03 21:39 42
	field.SetOutline(1, {64,64,64,255});
871ce5d6 sago007 2018-03-28 12:36 43
	field.SetText(text);
871ce5d6 sago007 2018-03-28 12:36 44
}
871ce5d6 sago007 2018-03-28 12:36 45
8b1ab1cb sago007 2016-04-04 17:51 46
class BlockGameSdl : public BlockGame {
8b1ab1cb sago007 2016-04-04 17:51 47
public:
343fbe43 sago007 2018-03-27 19:53 48
	BlockGameSdl(int tx, int ty, const sago::SagoDataHolder* holder) {
8b1ab1cb sago007 2016-04-04 17:51 49
		topx = tx;
8b1ab1cb sago007 2016-04-04 17:51 50
		topy = ty;
343fbe43 sago007 2018-03-27 19:53 51
		setScoreboardFont(holder, scoreLabel, _("Score:"));
343fbe43 sago007 2018-03-27 19:53 52
		setScoreboardFont(holder, timeLabel, _("Time:"));
343fbe43 sago007 2018-03-27 19:53 53
		setScoreboardFont(holder, chainLabel, _("Chain:"));
343fbe43 sago007 2018-03-27 19:53 54
		setScoreboardFont(holder, speedLabel, _("Speed:"));
871ce5d6 sago007 2018-03-28 12:36 55
		setButtonFont(holder, buttonNext, _("Next"));
871ce5d6 sago007 2018-03-28 12:36 56
		setButtonFont(holder, buttonRetry, _("Retry"));
871ce5d6 sago007 2018-03-28 12:36 57
		setButtonFont(holder, buttonSkip, _("Skip"));
fc338170 sago007 2018-03-28 14:31 58
		setButtonFont(holder, stopIntField, "");
8b1ab1cb sago007 2016-04-04 17:51 59
	}
7d649ca8 sago007 2016-10-02 16:43 60
	
8b1ab1cb sago007 2016-04-04 17:51 61
8b1ab1cb sago007 2016-04-04 17:51 62
	void DrawImgBoard(const sago::SagoSprite& img, int x, int y) const {
72383a9e sago007 2016-10-30 11:56 63
		DrawIMG(img, globalData.screen, x+topx, y+topy);
8b1ab1cb sago007 2016-04-04 17:51 64
	}
8b1ab1cb sago007 2016-04-04 17:51 65
8b1ab1cb sago007 2016-04-04 17:51 66
	void DrawImgBoardBounded(const sago::SagoSprite& img, int x, int y) const {
72383a9e sago007 2016-10-30 11:56 67
		DrawIMG_Bounded(img, globalData.screen, x+topx, y+topy, topx, topy, topx + backBoard.GetWidth(), topy + backBoard.GetHeight());
8b1ab1cb sago007 2016-04-04 17:51 68
	}
8b1ab1cb sago007 2016-04-04 17:51 69
871ce5d6 sago007 2018-03-28 12:36 70
	void PrintTextCenteredBoard(int x, int y, sago::SagoTextField& field) {
871ce5d6 sago007 2018-03-28 12:36 71
		field.Draw(globalData.screen, x+topx+60, y+topy+20, 
871ce5d6 sago007 2018-03-28 12:36 72
				sago::SagoTextField::Alignment::center, sago::SagoTextField::VerticalAlignment::center);
8b1ab1cb sago007 2016-04-04 17:51 73
	}
e8d66c68 sago007 2016-07-12 17:32 74
	
7d649ca8 sago007 2016-10-02 16:43 75
	void SetTopXY(int tx, int ty) {
7d649ca8 sago007 2016-10-02 16:43 76
		topx = tx;
7d649ca8 sago007 2016-10-02 16:43 77
		topy = ty;
7d649ca8 sago007 2016-10-02 16:43 78
	}
8b1ab1cb sago007 2016-04-04 17:51 79
8b1ab1cb sago007 2016-04-04 17:51 80
	int GetTopX() const {
8b1ab1cb sago007 2016-04-04 17:51 81
		return topx;
8b1ab1cb sago007 2016-04-04 17:51 82
	}
8b1ab1cb sago007 2016-04-04 17:51 83
	int GetTopY() const {
8b1ab1cb sago007 2016-04-04 17:51 84
		return topy;
8b1ab1cb sago007 2016-04-04 17:51 85
	}
8b1ab1cb sago007 2016-04-04 17:51 86
	
8b1ab1cb sago007 2016-04-04 17:51 87
	/**
8b1ab1cb sago007 2016-04-04 17:51 88
	 * Retrives the coordinate to a given brick based on mouse input.
8b1ab1cb sago007 2016-04-04 17:51 89
	 * @param match true if the coordinate are within borders
8b1ab1cb sago007 2016-04-04 17:51 90
	 * @param mousex mouse coordinate input
8b1ab1cb sago007 2016-04-04 17:51 91
	 * @param mousey mouse coordiante input
8b1ab1cb sago007 2016-04-04 17:51 92
	 * @param x brick x. Unchanged if outside border
8b1ab1cb sago007 2016-04-04 17:51 93
	 * @param y brick y. Unchanged if outside border
8b1ab1cb sago007 2016-04-04 17:51 94
	 */
8b1ab1cb sago007 2016-04-04 17:51 95
	void GetBrickCoordinateFromMouse(bool& match, int mousex, int mousey, int& x, int& y) const {
706e81fe sago007 2016-04-05 19:17 96
		if (!IsInTheBoard(mousex, mousey)) {
8b1ab1cb sago007 2016-04-04 17:51 97
			match = false;
8b1ab1cb sago007 2016-04-04 17:51 98
			return;
8b1ab1cb sago007 2016-04-04 17:51 99
		}
8b1ab1cb sago007 2016-04-04 17:51 100
		match = true;
e34256c1 Poul Sander 2021-10-06 20:10 101
		x = (mousex-topx) / bsize;
e34256c1 Poul Sander 2021-10-06 20:10 102
		y = (bsize*12+topy-mousey-pixels) / bsize;
8b1ab1cb sago007 2016-04-04 17:51 103
	}
706e81fe sago007 2016-04-05 19:17 104
	
706e81fe sago007 2016-04-05 19:17 105
	bool IsInTheBoard(int mousex, int mousey) const {
e34256c1 Poul Sander 2021-10-06 20:10 106
		if (mousex < topx || mousex > topx+bsize*6 || mousey < topy || mousey > topy+bsize*12) {
706e81fe sago007 2016-04-05 19:17 107
			return false;
706e81fe sago007 2016-04-05 19:17 108
		}
706e81fe sago007 2016-04-05 19:17 109
		return true;
706e81fe sago007 2016-04-05 19:17 110
	}
706e81fe sago007 2016-04-05 19:17 111
	
706e81fe sago007 2016-04-05 19:17 112
	bool IsUnderTheBoard(int mousex, int mousey) const {
e34256c1 Poul Sander 2021-10-06 20:10 113
		if (mousex < topx || mousex > topx+bsize*6 || mousey < topy+bsize*12) {
706e81fe sago007 2016-04-05 19:17 114
			return false;
706e81fe sago007 2016-04-05 19:17 115
		}
706e81fe sago007 2016-04-05 19:17 116
		return true;
706e81fe sago007 2016-04-05 19:17 117
	}
8b1ab1cb sago007 2016-04-04 17:51 118
3f3ff0b6 sago007 2018-03-30 12:59 119
	void AddText(int x, int y, unsigned int text, int time) const override {
c310f8a5 sago007 2017-03-25 16:05 120
		globalData.theTextManager.addText(topx-10+x*bsize, topy+12*bsize-y*bsize, text, time);
8b1ab1cb sago007 2016-04-04 17:51 121
	}
8b1ab1cb sago007 2016-04-04 17:51 122
8b1ab1cb sago007 2016-04-04 17:51 123
	void AddBall(int x, int y, bool right, int color) const  override {
8b1ab1cb sago007 2016-04-04 17:51 124
		theBallManager.addBall(topx+40+x*bsize, topy+bsize*12-y*bsize, right, color);
8b1ab1cb sago007 2016-04-04 17:51 125
	}
8b1ab1cb sago007 2016-04-04 17:51 126
8b1ab1cb sago007 2016-04-04 17:51 127
	void AddExplosion(int x, int y) const  override {
8b1ab1cb sago007 2016-04-04 17:51 128
		theExplosionManager.addExplosion(topx-10+x*bsize, topy+bsize*12-10-y*bsize);
8b1ab1cb sago007 2016-04-04 17:51 129
	}
8b1ab1cb sago007 2016-04-04 17:51 130
8b1ab1cb sago007 2016-04-04 17:51 131
	void PlayerWonEvent() const  override {
72383a9e sago007 2016-10-30 11:56 132
		if (!globalData.SoundEnabled) {
8b1ab1cb sago007 2016-04-04 17:51 133
			return;
8b1ab1cb sago007 2016-04-04 17:51 134
		}
524f188c sago007 2017-04-22 09:01 135
		Mix_PlayChannel(1, applause.get(), 0);
8b1ab1cb sago007 2016-04-04 17:51 136
	}
8b1ab1cb sago007 2016-04-04 17:51 137
8b1ab1cb sago007 2016-04-04 17:51 138
	void DrawEvent() const override {
8b1ab1cb sago007 2016-04-04 17:51 139
		Mix_HaltChannel(1);
8b1ab1cb sago007 2016-04-04 17:51 140
	}
8b1ab1cb sago007 2016-04-04 17:51 141
8b1ab1cb sago007 2016-04-04 17:51 142
	void BlockPopEvent() const  override {
72383a9e sago007 2016-10-30 11:56 143
		if (!globalData.SoundEnabled) {
8b1ab1cb sago007 2016-04-04 17:51 144
			return;
8b1ab1cb sago007 2016-04-04 17:51 145
		}
524f188c sago007 2017-04-22 09:01 146
		Mix_PlayChannel(0, boing.get(), 0);
8b1ab1cb sago007 2016-04-04 17:51 147
	}
8b1ab1cb sago007 2016-04-04 17:51 148
8b1ab1cb sago007 2016-04-04 17:51 149
	void LongChainDoneEvent() const  override {
72383a9e sago007 2016-10-30 11:56 150
		if (!globalData.SoundEnabled) {
8b1ab1cb sago007 2016-04-04 17:51 151
			return;
8b1ab1cb sago007 2016-04-04 17:51 152
		}
524f188c sago007 2017-04-22 09:01 153
		Mix_PlayChannel(1, applause.get(), 0);
8b1ab1cb sago007 2016-04-04 17:51 154
	}
8b1ab1cb sago007 2016-04-04 17:51 155
8b1ab1cb sago007 2016-04-04 17:51 156
	void TimeTrialEndEvent() const  override {
72383a9e sago007 2016-10-30 11:56 157
		if (!globalData.NoSound && globalData.SoundEnabled) {
524f188c sago007 2017-04-22 09:01 158
			Mix_PlayChannel(1,counterFinalChunk.get(),0);
8b1ab1cb sago007 2016-04-04 17:51 159
		}
8b1ab1cb sago007 2016-04-04 17:51 160
	}
8b1ab1cb sago007 2016-04-04 17:51 161
8b1ab1cb sago007 2016-04-04 17:51 162
	void EndlessHighscoreEvent() const  override {
72383a9e sago007 2016-10-30 11:56 163
		if (!globalData.SoundEnabled) {
8b1ab1cb sago007 2016-04-04 17:51 164
			return;
8b1ab1cb sago007 2016-04-04 17:51 165
		}
524f188c sago007 2017-04-22 09:01 166
		Mix_PlayChannel(1, applause.get(), 0);
8b1ab1cb sago007 2016-04-04 17:51 167
	}
8b1ab1cb sago007 2016-04-04 17:51 168
private:
e34256c1 Poul Sander 2021-10-06 20:10 169
e34256c1 Poul Sander 2021-10-06 20:10 170
	/**
e34256c1 Poul Sander 2021-10-06 20:10 171
	This crops "dstrect" and "srcrect" to fit inside "bounds"
e34256c1 Poul Sander 2021-10-06 20:10 172
	dstrect and srcrect are modified in place.
e34256c1 Poul Sander 2021-10-06 20:10 173
	*/
e34256c1 Poul Sander 2021-10-06 20:10 174
	void CropTexture(SDL_Rect& dstrect, SDL_Rect& srcrect, const SDL_Rect& bounds) const {
e34256c1 Poul Sander 2021-10-06 20:10 175
		if (dstrect.x > bounds.x+bounds.w) {
e34256c1 Poul Sander 2021-10-06 20:10 176
			dstrect = {0,0,0,0};
e34256c1 Poul Sander 2021-10-06 20:10 177
			return;
e34256c1 Poul Sander 2021-10-06 20:10 178
		}
e34256c1 Poul Sander 2021-10-06 20:10 179
		if (dstrect.y > bounds.y+bounds.h) {
e34256c1 Poul Sander 2021-10-06 20:10 180
			dstrect = {0,0,0,0};
e34256c1 Poul Sander 2021-10-06 20:10 181
			return;
e34256c1 Poul Sander 2021-10-06 20:10 182
		}
e34256c1 Poul Sander 2021-10-06 20:10 183
		if (dstrect.x+dstrect.w < bounds.x) {
e34256c1 Poul Sander 2021-10-06 20:10 184
			dstrect = {0,0,0,0};
e34256c1 Poul Sander 2021-10-06 20:10 185
			return;
e34256c1 Poul Sander 2021-10-06 20:10 186
		}
e34256c1 Poul Sander 2021-10-06 20:10 187
		if (dstrect.y+dstrect.h < bounds.y) {
e34256c1 Poul Sander 2021-10-06 20:10 188
			dstrect = {0,0,0,0};
e34256c1 Poul Sander 2021-10-06 20:10 189
			return;
e34256c1 Poul Sander 2021-10-06 20:10 190
		}
e34256c1 Poul Sander 2021-10-06 20:10 191
		if (dstrect.x < bounds.x) {
e34256c1 Poul Sander 2021-10-06 20:10 192
			Sint16 absDiff = bounds.x-dstrect.x;
e34256c1 Poul Sander 2021-10-06 20:10 193
			dstrect.x+=absDiff;
e34256c1 Poul Sander 2021-10-06 20:10 194
			srcrect.x+=absDiff;
e34256c1 Poul Sander 2021-10-06 20:10 195
			dstrect.w-=absDiff;
e34256c1 Poul Sander 2021-10-06 20:10 196
			srcrect.w-=absDiff;
e34256c1 Poul Sander 2021-10-06 20:10 197
		}
e34256c1 Poul Sander 2021-10-06 20:10 198
		if (dstrect.y < bounds.y) {
e34256c1 Poul Sander 2021-10-06 20:10 199
			Sint16 absDiff = bounds.y-dstrect.y;
e34256c1 Poul Sander 2021-10-06 20:10 200
			dstrect.y+=absDiff;
e34256c1 Poul Sander 2021-10-06 20:10 201
			srcrect.y+=absDiff;
e34256c1 Poul Sander 2021-10-06 20:10 202
			dstrect.h-=absDiff;
e34256c1 Poul Sander 2021-10-06 20:10 203
			srcrect.h-=absDiff;
e34256c1 Poul Sander 2021-10-06 20:10 204
		}
e34256c1 Poul Sander 2021-10-06 20:10 205
		if (dstrect.x+dstrect.w > bounds.x+bounds.w) {
e34256c1 Poul Sander 2021-10-06 20:10 206
			Sint16 absDiff = dstrect.x+dstrect.w-(bounds.x+bounds.w);
e34256c1 Poul Sander 2021-10-06 20:10 207
			dstrect.w -= absDiff;
e34256c1 Poul Sander 2021-10-06 20:10 208
			srcrect.w -= absDiff;
e34256c1 Poul Sander 2021-10-06 20:10 209
		}
e34256c1 Poul Sander 2021-10-06 20:10 210
		if (dstrect.y+dstrect.h > bounds.y+bounds.h) {
e34256c1 Poul Sander 2021-10-06 20:10 211
			Sint16 absDiff = dstrect.y+dstrect.h-(bounds.y+bounds.h);
e34256c1 Poul Sander 2021-10-06 20:10 212
			dstrect.h -= absDiff;
e34256c1 Poul Sander 2021-10-06 20:10 213
			srcrect.h -= absDiff;
e34256c1 Poul Sander 2021-10-06 20:10 214
		}
e34256c1 Poul Sander 2021-10-06 20:10 215
	}
e34256c1 Poul Sander 2021-10-06 20:10 216
e34256c1 Poul Sander 2021-10-06 20:10 217
	/**
e34256c1 Poul Sander 2021-10-06 20:10 218
	 * Creates a new texture for a garabge block of size size_x*size_y at x,y and crops it.
e34256c1 Poul Sander 2021-10-06 20:10 219
	 * Also sets globalData.screen to point to the texture, so Draw now draws on the Texture.
e34256c1 Poul Sander 2021-10-06 20:10 220
	*/
e34256c1 Poul Sander 2021-10-06 20:10 221
	SDL_Texture* CreateGarbageTexture(int x, int y, int size_x, int size_y, SDL_Rect& dstrect, SDL_Rect& srcrect) const {
e34256c1 Poul Sander 2021-10-06 20:10 222
		dstrect = { x, y, size_x*bsize, size_y*bsize };
e34256c1 Poul Sander 2021-10-06 20:10 223
		srcrect = { 0, 0, size_x*bsize, size_y*bsize };
e34256c1 Poul Sander 2021-10-06 20:10 224
		SDL_Rect bound = {topx, topy, backBoard.GetWidth(), backBoard.GetHeight()};
e34256c1 Poul Sander 2021-10-06 20:10 225
		CropTexture (dstrect, srcrect, bound);
e34256c1 Poul Sander 2021-10-06 20:10 226
		SDL_Texture* mTexture = SDL_CreateTexture( globalData.screen, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, size_x*bsize, size_y*bsize );
e34256c1 Poul Sander 2021-10-06 20:10 227
		SDL_SetRenderTarget( globalData.screen, mTexture );
e34256c1 Poul Sander 2021-10-06 20:10 228
e34256c1 Poul Sander 2021-10-06 20:10 229
		SDL_SetRenderDrawBlendMode(globalData.screen, SDL_BLENDMODE_NONE);
e34256c1 Poul Sander 2021-10-06 20:10 230
		SDL_SetTextureBlendMode(mTexture, SDL_BLENDMODE_BLEND);
e34256c1 Poul Sander 2021-10-06 20:10 231
		SDL_SetRenderDrawColor(globalData.screen, 0, 0, 0, 0);
e34256c1 Poul Sander 2021-10-06 20:10 232
		SDL_RenderFillRect(globalData.screen, NULL);
e34256c1 Poul Sander 2021-10-06 20:10 233
		SDL_SetRenderDrawBlendMode(globalData.screen, SDL_BLENDMODE_BLEND);
e34256c1 Poul Sander 2021-10-06 20:10 234
		return mTexture;
e34256c1 Poul Sander 2021-10-06 20:10 235
	}
e34256c1 Poul Sander 2021-10-06 20:10 236
e34256c1 Poul Sander 2021-10-06 20:10 237
	/**
e34256c1 Poul Sander 2021-10-06 20:10 238
	Paints a garbage block of size size_x*size_y (size in blocks) at x,y (coordinates in pixels).
e34256c1 Poul Sander 2021-10-06 20:10 239
	The garbage block will be painted on an internal texture and rendered to screen to protect against tearing.
e34256c1 Poul Sander 2021-10-06 20:10 240
	The result will be cropped to the playable area.
e34256c1 Poul Sander 2021-10-06 20:10 241
	*/
e34256c1 Poul Sander 2021-10-06 20:10 242
	void PaintGarbageBlock(int x, int y, int size_x, int size_y) const {
e34256c1 Poul Sander 2021-10-06 20:10 243
		SDL_Rect dstrect ;
e34256c1 Poul Sander 2021-10-06 20:10 244
		SDL_Rect srcrect ;
e34256c1 Poul Sander 2021-10-06 20:10 245
		SDL_Texture* mTexture = CreateGarbageTexture(x, y, size_x, size_y, dstrect, srcrect);
e34256c1 Poul Sander 2021-10-06 20:10 246
		const Sint32 draw_time = SDL_GetTicks();
e34256c1 Poul Sander 2021-10-06 20:10 247
e34256c1 Poul Sander 2021-10-06 20:10 248
		if (size_y == 1) {
e34256c1 Poul Sander 2021-10-06 20:10 249
			//single line
e34256c1 Poul Sander 2021-10-06 20:10 250
			garbageML.Draw(globalData.screen, draw_time, 0, 0);
e34256c1 Poul Sander 2021-10-06 20:10 251
			for (int i = 1; i < size_x-1; ++i) {
e34256c1 Poul Sander 2021-10-06 20:10 252
				garbageM.Draw(globalData.screen, draw_time, i*bsize, 0);
e34256c1 Poul Sander 2021-10-06 20:10 253
			}
e34256c1 Poul Sander 2021-10-06 20:10 254
			garbageMR.Draw(globalData.screen, draw_time, (size_x-1)*bsize, 0);
e34256c1 Poul Sander 2021-10-06 20:10 255
		}
e34256c1 Poul Sander 2021-10-06 20:10 256
		if (size_y > 1) {
e34256c1 Poul Sander 2021-10-06 20:10 257
			// Top line
e34256c1 Poul Sander 2021-10-06 20:10 258
			garbageTL.Draw(globalData.screen, draw_time, 0, 0);
e34256c1 Poul Sander 2021-10-06 20:10 259
			for (int i = 1; i < size_x-1; ++i) {
e34256c1 Poul Sander 2021-10-06 20:10 260
				garbageT.Draw(globalData.screen, draw_time, i*bsize, 0);
e34256c1 Poul Sander 2021-10-06 20:10 261
			}
e34256c1 Poul Sander 2021-10-06 20:10 262
			garbageTR.Draw(globalData.screen, draw_time, (size_x-1)*bsize, 0);
e34256c1 Poul Sander 2021-10-06 20:10 263
			// Middle lines (if any)
e34256c1 Poul Sander 2021-10-06 20:10 264
			for (int j=1; j < size_y-1; ++j) {
e34256c1 Poul Sander 2021-10-06 20:10 265
				garbageL.Draw(globalData.screen, draw_time, 0, j*bsize);
e34256c1 Poul Sander 2021-10-06 20:10 266
				for (int i = 1; i < size_x-1; ++i) {
e34256c1 Poul Sander 2021-10-06 20:10 267
					garbageFill.Draw(globalData.screen, draw_time, i*bsize, j*bsize);
e34256c1 Poul Sander 2021-10-06 20:10 268
				}
e34256c1 Poul Sander 2021-10-06 20:10 269
				garbageR.Draw(globalData.screen, draw_time, (size_x-1)*bsize, j*bsize);
e34256c1 Poul Sander 2021-10-06 20:10 270
			}
e34256c1 Poul Sander 2021-10-06 20:10 271
			//Buttom line
e34256c1 Poul Sander 2021-10-06 20:10 272
			garbageBL.Draw(globalData.screen, draw_time, 0, (size_y-1)*bsize);
e34256c1 Poul Sander 2021-10-06 20:10 273
			for (int i = 1; i < size_x-1; ++i) {
e34256c1 Poul Sander 2021-10-06 20:10 274
				garbageB.Draw(globalData.screen, draw_time, i*bsize, (size_y-1)*bsize);
e34256c1 Poul Sander 2021-10-06 20:10 275
			}
e34256c1 Poul Sander 2021-10-06 20:10 276
			garbageBR.Draw(globalData.screen, draw_time, (size_x-1)*bsize, (size_y-1)*bsize);
e34256c1 Poul Sander 2021-10-06 20:10 277
		}
e34256c1 Poul Sander 2021-10-06 20:10 278
e34256c1 Poul Sander 2021-10-06 20:10 279
		SDL_SetRenderTarget( globalData.screen, nullptr );
e34256c1 Poul Sander 2021-10-06 20:10 280
		SDL_RenderCopy( globalData.screen, mTexture, &srcrect, &dstrect );
e34256c1 Poul Sander 2021-10-06 20:10 281
		SDL_DestroyTexture(mTexture);
e34256c1 Poul Sander 2021-10-06 20:10 282
	}
e34256c1 Poul Sander 2021-10-06 20:10 283
e34256c1 Poul Sander 2021-10-06 20:10 284
	/**
e34256c1 Poul Sander 2021-10-06 20:10 285
	Paints a grey garbage block of size size_x (size in blocks, always 6) at x,y (coordinates in pixels).
e34256c1 Poul Sander 2021-10-06 20:10 286
	The result will be cropped to the playable area.
e34256c1 Poul Sander 2021-10-06 20:10 287
	*/
e34256c1 Poul Sander 2021-10-06 20:10 288
	void PaintGreyGarbageBlock(int x, int y, int size_x) const {
e34256c1 Poul Sander 2021-10-06 20:10 289
		const int size_y = bsize;
e34256c1 Poul Sander 2021-10-06 20:10 290
		SDL_Rect dstrect ;
e34256c1 Poul Sander 2021-10-06 20:10 291
		SDL_Rect srcrect ;
e34256c1 Poul Sander 2021-10-06 20:10 292
		SDL_Texture* mTexture = CreateGarbageTexture(x, y, size_x, size_y, dstrect, srcrect);
e34256c1 Poul Sander 2021-10-06 20:10 293
		const Sint32 draw_time = SDL_GetTicks();
e34256c1 Poul Sander 2021-10-06 20:10 294
e34256c1 Poul Sander 2021-10-06 20:10 295
		for (int j=0; j < size_y; ++j) {
e34256c1 Poul Sander 2021-10-06 20:10 296
			if (j==0) {
e34256c1 Poul Sander 2021-10-06 20:10 297
				garbageGML.Draw(globalData.screen, draw_time, j*bsize, 0);
e34256c1 Poul Sander 2021-10-06 20:10 298
			}
e34256c1 Poul Sander 2021-10-06 20:10 299
			else if (j==5) {
e34256c1 Poul Sander 2021-10-06 20:10 300
				garbageGMR.Draw(globalData.screen, draw_time, j*bsize, 0);
e34256c1 Poul Sander 2021-10-06 20:10 301
			}
e34256c1 Poul Sander 2021-10-06 20:10 302
			else {
e34256c1 Poul Sander 2021-10-06 20:10 303
				garbageGM.Draw(globalData.screen, draw_time, j*bsize, 0);
e34256c1 Poul Sander 2021-10-06 20:10 304
			}
e34256c1 Poul Sander 2021-10-06 20:10 305
		}
e34256c1 Poul Sander 2021-10-06 20:10 306
e34256c1 Poul Sander 2021-10-06 20:10 307
		SDL_SetRenderTarget( globalData.screen, nullptr );
e34256c1 Poul Sander 2021-10-06 20:10 308
		SDL_RenderCopy( globalData.screen, mTexture, &srcrect, &dstrect );
e34256c1 Poul Sander 2021-10-06 20:10 309
		SDL_DestroyTexture(mTexture);
e34256c1 Poul Sander 2021-10-06 20:10 310
	}
e34256c1 Poul Sander 2021-10-06 20:10 311
e34256c1 Poul Sander 2021-10-06 20:10 312
	std::pair<int, int> getGarbageSize(int topx, int topy) const {
e34256c1 Poul Sander 2021-10-06 20:10 313
		int size_x = 0;
e34256c1 Poul Sander 2021-10-06 20:10 314
		int size_y = 0;
e34256c1 Poul Sander 2021-10-06 20:10 315
		int number = board[topx][topy];
e34256c1 Poul Sander 2021-10-06 20:10 316
		for (int i=topy; i < 30 ; ++i) {
e34256c1 Poul Sander 2021-10-06 20:10 317
			if(number == board[topx][i]) {
e34256c1 Poul Sander 2021-10-06 20:10 318
				++size_y;
e34256c1 Poul Sander 2021-10-06 20:10 319
			}
e34256c1 Poul Sander 2021-10-06 20:10 320
		}
e34256c1 Poul Sander 2021-10-06 20:10 321
		for (int i=topx; i < 7 ; ++i) {
e34256c1 Poul Sander 2021-10-06 20:10 322
			if(number == board[i][topy]) {
e34256c1 Poul Sander 2021-10-06 20:10 323
				++size_x;
e34256c1 Poul Sander 2021-10-06 20:10 324
			}
e34256c1 Poul Sander 2021-10-06 20:10 325
		}
e34256c1 Poul Sander 2021-10-06 20:10 326
		return std::make_pair(size_x, size_y);
e34256c1 Poul Sander 2021-10-06 20:10 327
	}
e34256c1 Poul Sander 2021-10-06 20:10 328
8b1ab1cb sago007 2016-04-04 17:51 329
	//Draws all the bricks to the board (including garbage)
8b1ab1cb sago007 2016-04-04 17:51 330
	void PaintBricks() const {
e34256c1 Poul Sander 2021-10-06 20:10 331
		int lastGarbageNumber = 0;
32754436 Poul Sander 2020-08-15 15:12 332
		for (int i=0; i<13; ++i) {
32754436 Poul Sander 2020-08-15 15:12 333
			for (int j=0; j<6; ++j) {
8b1ab1cb sago007 2016-04-04 17:51 334
				int basicBrick = board[j][i]%10; //The basic brick, stored on the least significant digit
8b1ab1cb sago007 2016-04-04 17:51 335
				if ((basicBrick > -1) && (basicBrick < 7) && ((board[j][i]/1000000)%10==0)) {
8b1ab1cb sago007 2016-04-04 17:51 336
					DrawImgBoardBounded(bricks[basicBrick],  j*bsize, bsize*12-i*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 337
					if ((board[j][i]/BLOCKWAIT)%10==1) {
8b1ab1cb sago007 2016-04-04 17:51 338
						DrawImgBoard(bomb,  j*bsize, bsize*12-i*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 339
					}
8b1ab1cb sago007 2016-04-04 17:51 340
					if ((board[j][i]/BLOCKHANG)%10==1) {
8b1ab1cb sago007 2016-04-04 17:51 341
						DrawImgBoardBounded(ready,  j*bsize, bsize*12-i*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 342
					}
8b1ab1cb sago007 2016-04-04 17:51 343
8b1ab1cb sago007 2016-04-04 17:51 344
				}
8b1ab1cb sago007 2016-04-04 17:51 345
				if ((board[j][i]/1000000)%10==1) {
8b1ab1cb sago007 2016-04-04 17:51 346
					int number = board[j][i];
e34256c1 Poul Sander 2021-10-06 20:10 347
					if (number != lastGarbageNumber) {
e34256c1 Poul Sander 2021-10-06 20:10 348
						const auto& garbage_size = getGarbageSize(j, i);
e34256c1 Poul Sander 2021-10-06 20:10 349
						lastGarbageNumber = number;
e34256c1 Poul Sander 2021-10-06 20:10 350
						PaintGarbageBlock(topx+j*bsize, topy+12*bsize-i*bsize-(garbage_size.second-1)*bsize -pixels, garbage_size.first, garbage_size.second);
8b1ab1cb sago007 2016-04-04 17:51 351
					}
8b1ab1cb sago007 2016-04-04 17:51 352
				}
8b1ab1cb sago007 2016-04-04 17:51 353
				if ((board[j][i]/1000000)%10==2) {
e34256c1 Poul Sander 2021-10-06 20:10 354
					int number = board[j][i];
e34256c1 Poul Sander 2021-10-06 20:10 355
					if (number != lastGarbageNumber) {
e34256c1 Poul Sander 2021-10-06 20:10 356
						const auto& garbage_size = getGarbageSize(j, i);
e34256c1 Poul Sander 2021-10-06 20:10 357
						lastGarbageNumber = number;
e34256c1 Poul Sander 2021-10-06 20:10 358
						PaintGreyGarbageBlock(topx+j*bsize, topy+12*bsize-i*bsize-(garbage_size.second-1)*bsize -pixels, garbage_size.first);
8b1ab1cb sago007 2016-04-04 17:51 359
					}
8b1ab1cb sago007 2016-04-04 17:51 360
				}
8b1ab1cb sago007 2016-04-04 17:51 361
			}
8b1ab1cb sago007 2016-04-04 17:51 362
		}
8b1ab1cb sago007 2016-04-04 17:51 363
		const int j = 0;
8b1ab1cb sago007 2016-04-04 17:51 364
8b1ab1cb sago007 2016-04-04 17:51 365
		int garbageSize=0;
8b1ab1cb sago007 2016-04-04 17:51 366
		for (int i=0; i<20; i++) {
8b1ab1cb sago007 2016-04-04 17:51 367
			if ((board[j][i]/1000000)%10==1) {
8b1ab1cb sago007 2016-04-04 17:51 368
				int left, right, over, under;
8b1ab1cb sago007 2016-04-04 17:51 369
				int number = board[j][i];
32754436 Poul Sander 2020-08-15 15:12 370
				left = -1;
32754436 Poul Sander 2020-08-15 15:12 371
				right = board[j+1][i];
8b1ab1cb sago007 2016-04-04 17:51 372
				if (i>28) {
8b1ab1cb sago007 2016-04-04 17:51 373
					over = -1;
8b1ab1cb sago007 2016-04-04 17:51 374
				}
8b1ab1cb sago007 2016-04-04 17:51 375
				else {
8b1ab1cb sago007 2016-04-04 17:51 376
					over = board[j][i+1];
8b1ab1cb sago007 2016-04-04 17:51 377
				}
8b1ab1cb sago007 2016-04-04 17:51 378
				if (i<1) {
8b1ab1cb sago007 2016-04-04 17:51 379
					under = -1;
8b1ab1cb sago007 2016-04-04 17:51 380
				}
8b1ab1cb sago007 2016-04-04 17:51 381
				else {
8b1ab1cb sago007 2016-04-04 17:51 382
					under = board[j][i-1];
8b1ab1cb sago007 2016-04-04 17:51 383
				}
8b1ab1cb sago007 2016-04-04 17:51 384
				if (((left != number)&&(right == number)&&(over != number)&&(under == number))&&(garbageSize>0)) {
8b1ab1cb sago007 2016-04-04 17:51 385
					DrawImgBoardBounded(smiley[board[j][i]%4],  2*bsize, 12*bsize-i*bsize-pixels+(bsize/2)*garbageSize);
8b1ab1cb sago007 2016-04-04 17:51 386
				}
8b1ab1cb sago007 2016-04-04 17:51 387
				if (!((left != number)&&(right == number)&&(over == number)&&(under == number))) { //not in garbage
8b1ab1cb sago007 2016-04-04 17:51 388
					garbageSize=0;
8b1ab1cb sago007 2016-04-04 17:51 389
				}
8b1ab1cb sago007 2016-04-04 17:51 390
				else {
8b1ab1cb sago007 2016-04-04 17:51 391
					garbageSize++;
8b1ab1cb sago007 2016-04-04 17:51 392
				}
8b1ab1cb sago007 2016-04-04 17:51 393
8b1ab1cb sago007 2016-04-04 17:51 394
			}
8b1ab1cb sago007 2016-04-04 17:51 395
		}
8b1ab1cb sago007 2016-04-04 17:51 396
		for (int i=0; i<6; i++) {
8b1ab1cb sago007 2016-04-04 17:51 397
			if (board[i][0]!=-1) {
8b1ab1cb sago007 2016-04-04 17:51 398
				DrawImgBoardBounded(transCover,  i*bsize, 12*bsize-pixels);    //Make the appering blocks transperant
8b1ab1cb sago007 2016-04-04 17:51 399
			}
8b1ab1cb sago007 2016-04-04 17:51 400
		}
8b1ab1cb sago007 2016-04-04 17:51 401
8b1ab1cb sago007 2016-04-04 17:51 402
	}
8b1ab1cb sago007 2016-04-04 17:51 403
public:
8b1ab1cb sago007 2016-04-04 17:51 404
	//Draws everything
8b1ab1cb sago007 2016-04-04 17:51 405
	void DoPaintJob() {
72383a9e sago007 2016-10-30 11:56 406
		DrawIMG(boardBackBack,globalData.screen,this->GetTopX()-60,this->GetTopY()-68);
8b1ab1cb sago007 2016-04-04 17:51 407
343fbe43 sago007 2018-03-27 19:53 408
		this->scoreLabel.Draw(globalData.screen, this->GetTopX()+310,this->GetTopY()-68+148);
343fbe43 sago007 2018-03-27 19:53 409
		this->timeLabel.Draw(globalData.screen, this->GetTopX()+310,this->GetTopY()-68+197);
343fbe43 sago007 2018-03-27 19:53 410
		this->chainLabel.Draw(globalData.screen, this->GetTopX()+310,this->GetTopY()-68+246);
343fbe43 sago007 2018-03-27 19:53 411
		this->speedLabel.Draw(globalData.screen, this->GetTopX()+310,this->GetTopY()-68+295);
8b1ab1cb sago007 2016-04-04 17:51 412
		DrawImgBoard(backBoard,  0, 0);
8b1ab1cb sago007 2016-04-04 17:51 413
8b1ab1cb sago007 2016-04-04 17:51 414
		PaintBricks();
8b1ab1cb sago007 2016-04-04 17:51 415
		if (stageClear) {
8b1ab1cb sago007 2016-04-04 17:51 416
			DrawImgBoard(blackLine,  0, bsize*(12+2)+bsize*(stageClearLimit-linesCleared)-pixels-1);
8b1ab1cb sago007 2016-04-04 17:51 417
		}
8b1ab1cb sago007 2016-04-04 17:51 418
		if (puzzleMode&&(!bGameOver)) {
8b1ab1cb sago007 2016-04-04 17:51 419
			//We need to write nr. of moves left!
549ecfae sago007 2016-10-09 08:37 420
			strHolder = _("Moves left: ") + std::to_string(MovesLeft);
810e1c2f sago007 2018-03-28 09:40 421
			static sago::SagoTextField movesPuzzleLabel;
810e1c2f sago007 2018-03-28 09:40 422
			sagoTextSetHelpFont(movesPuzzleLabel);
0b8fb137 sago007 2018-03-31 19:53 423
			movesPuzzleLabel.SetText(strHolder);
810e1c2f sago007 2018-03-28 09:40 424
			movesPuzzleLabel.Draw(globalData.screen, topx+5, topy+5);
8b1ab1cb sago007 2016-04-04 17:51 425
8b1ab1cb sago007 2016-04-04 17:51 426
		}
8b1ab1cb sago007 2016-04-04 17:51 427
		if (puzzleMode && stageButtonStatus == SBpuzzleMode) {
8b1ab1cb sago007 2016-04-04 17:51 428
			DrawImgBoard(bRetry, cordRetryButton.x, cordRetryButton.y);
871ce5d6 sago007 2018-03-28 12:36 429
			PrintTextCenteredBoard(cordRetryButton.x, cordRetryButton.y, buttonRetry);
8b1ab1cb sago007 2016-04-04 17:51 430
			if (getLevel()<PuzzleGetNumberOfPuzzles()-1) {
8b1ab1cb sago007 2016-04-04 17:51 431
				if (hasWonTheGame) {
72383a9e sago007 2016-10-30 11:56 432
					DrawImgBoard(globalData.bNext, cordNextButton.x, cordNextButton.y);
871ce5d6 sago007 2018-03-28 12:36 433
					PrintTextCenteredBoard(cordNextButton.x, cordNextButton.y, buttonNext);
8b1ab1cb sago007 2016-04-04 17:51 434
				}
8b1ab1cb sago007 2016-04-04 17:51 435
				else {
8b1ab1cb sago007 2016-04-04 17:51 436
					DrawImgBoard(bSkip,cordNextButton.x, cordNextButton.y);
871ce5d6 sago007 2018-03-28 12:36 437
					PrintTextCenteredBoard(cordNextButton.x, cordNextButton.y, buttonSkip);
8b1ab1cb sago007 2016-04-04 17:51 438
				}
8b1ab1cb sago007 2016-04-04 17:51 439
			}
8b1ab1cb sago007 2016-04-04 17:51 440
			else {
810e1c2f sago007 2018-03-28 09:40 441
				static sago::SagoTextField lastPuzzleLabel;
810e1c2f sago007 2018-03-28 09:40 442
				sagoTextSetHelpFont(lastPuzzleLabel);
810e1c2f sago007 2018-03-28 09:40 443
				lastPuzzleLabel.SetText(_("Last puzzle"));
810e1c2f sago007 2018-03-28 09:40 444
				lastPuzzleLabel.Draw(globalData.screen, topx+5, topy+5);
8b1ab1cb sago007 2016-04-04 17:51 445
			}
8b1ab1cb sago007 2016-04-04 17:51 446
		}
8b1ab1cb sago007 2016-04-04 17:51 447
		if (stageClear && stageButtonStatus == SBstageClear) {
8b1ab1cb sago007 2016-04-04 17:51 448
			DrawImgBoard(bRetry, cordRetryButton.x, cordRetryButton.y);
871ce5d6 sago007 2018-03-28 12:36 449
			PrintTextCenteredBoard(cordRetryButton.x, cordRetryButton.y, buttonRetry);
8b1ab1cb sago007 2016-04-04 17:51 450
			if (getLevel()<50-1) {
8b1ab1cb sago007 2016-04-04 17:51 451
				if (hasWonTheGame) {
72383a9e sago007 2016-10-30 11:56 452
					DrawImgBoard(globalData.bNext, cordNextButton.x, cordNextButton.y);
871ce5d6 sago007 2018-03-28 12:36 453
					PrintTextCenteredBoard(cordNextButton.x, cordNextButton.y, buttonNext);
8b1ab1cb sago007 2016-04-04 17:51 454
				}
8b1ab1cb sago007 2016-04-04 17:51 455
				else {
8b1ab1cb sago007 2016-04-04 17:51 456
					DrawImgBoard(bSkip,cordNextButton.x, cordNextButton.y);
871ce5d6 sago007 2018-03-28 12:36 457
					PrintTextCenteredBoard(cordNextButton.x, cordNextButton.y, buttonSkip);
8b1ab1cb sago007 2016-04-04 17:51 458
				}
8b1ab1cb sago007 2016-04-04 17:51 459
			}
8b1ab1cb sago007 2016-04-04 17:51 460
			else {
810e1c2f sago007 2018-03-28 09:40 461
				static sago::SagoTextField lastStageLabel;
810e1c2f sago007 2018-03-28 09:40 462
				sagoTextSetHelpFont(lastStageLabel);
810e1c2f sago007 2018-03-28 09:40 463
				lastStageLabel.SetText(_("Last stage"));
810e1c2f sago007 2018-03-28 09:40 464
				lastStageLabel.Draw(globalData.screen, topx+5, topy+5);
8b1ab1cb sago007 2016-04-04 17:51 465
			}
8b1ab1cb sago007 2016-04-04 17:51 466
		}
e8d66c68 sago007 2016-07-12 17:32 467
		if (!bGameOver && stop > 20) {
0b8fb137 sago007 2018-03-31 19:53 468
			stopIntField.SetText(std::to_string(stop/10));
fc338170 sago007 2018-03-28 14:31 469
			stopIntField.Draw(globalData.screen, 240+topx, -40+topy);
e8d66c68 sago007 2016-07-12 17:32 470
		}
8b1ab1cb sago007 2016-04-04 17:51 471
8b1ab1cb sago007 2016-04-04 17:51 472
#if DEBUG
8b1ab1cb sago007 2016-04-04 17:51 473
		if (AI_Enabled&&(!bGameOver)) {
e7e189c7 sago007 2018-03-31 15:30 474
			sagoTextSetBlueFont(aiStatusField);
549ecfae sago007 2016-10-09 08:37 475
			strHolder = "AI_status: " + std::to_string(AIstatus)+ ", "+ std::to_string(AIlineToClear);
0b8fb137 sago007 2018-03-31 19:53 476
			aiStatusField.SetText(strHolder);
e7e189c7 sago007 2018-03-31 15:30 477
			aiStatusField.Draw(globalData.screen, topx+5, topy+5);
8b1ab1cb sago007 2016-04-04 17:51 478
		}
8b1ab1cb sago007 2016-04-04 17:51 479
#endif
8b1ab1cb sago007 2016-04-04 17:51 480
		if (!bGameOver) {
8b1ab1cb sago007 2016-04-04 17:51 481
			bool touched = false;
8b1ab1cb sago007 2016-04-04 17:51 482
			int mx = 0;
8b1ab1cb sago007 2016-04-04 17:51 483
			int my = 0;
8b1ab1cb sago007 2016-04-04 17:51 484
			this->GetMouseCursor(touched, mx, my);
8b1ab1cb sago007 2016-04-04 17:51 485
			if (touched) {
72383a9e sago007 2016-10-30 11:56 486
				DrawImgBoard(globalData.spriteHolder->GetSprite("touchcursor"),mx*bsize, 11*bsize-my*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 487
			}
8b1ab1cb sago007 2016-04-04 17:51 488
			else {
55ea55dd sago007 2018-03-24 16:07 489
				DrawImgBoard(cursor,cursorx*bsize,11*bsize-cursory*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 490
			}
8b1ab1cb sago007 2016-04-04 17:51 491
		}
8b1ab1cb sago007 2016-04-04 17:51 492
		if (ticks<gameStartedAt) {
8b1ab1cb sago007 2016-04-04 17:51 493
			int currentCounter = abs((int)ticks-(int)gameStartedAt)/1000;
72383a9e sago007 2016-10-30 11:56 494
			if ( (currentCounter!=lastCounter) && (globalData.SoundEnabled)&&(!globalData.NoSound)) {
524f188c sago007 2017-04-22 09:01 495
				Mix_PlayChannel(1, counterChunk.get(), 0);
8b1ab1cb sago007 2016-04-04 17:51 496
			}
8b1ab1cb sago007 2016-04-04 17:51 497
			lastCounter = currentCounter;
8b1ab1cb sago007 2016-04-04 17:51 498
			switch (currentCounter) {
8b1ab1cb sago007 2016-04-04 17:51 499
			case 2:
8b1ab1cb sago007 2016-04-04 17:51 500
				DrawImgBoard(counter[2],  2*bsize, 5*bsize);
8b1ab1cb sago007 2016-04-04 17:51 501
				break;
8b1ab1cb sago007 2016-04-04 17:51 502
			case 1:
8b1ab1cb sago007 2016-04-04 17:51 503
				DrawImgBoard(counter[1],  2*bsize, 5*bsize);
8b1ab1cb sago007 2016-04-04 17:51 504
				break;
8b1ab1cb sago007 2016-04-04 17:51 505
			case 0:
8b1ab1cb sago007 2016-04-04 17:51 506
				DrawImgBoard(counter[0],  2*bsize, 5*bsize);
8b1ab1cb sago007 2016-04-04 17:51 507
				break;
8b1ab1cb sago007 2016-04-04 17:51 508
			default:
8b1ab1cb sago007 2016-04-04 17:51 509
				break;
8b1ab1cb sago007 2016-04-04 17:51 510
			}
8b1ab1cb sago007 2016-04-04 17:51 511
		}
8b1ab1cb sago007 2016-04-04 17:51 512
		else {
72383a9e sago007 2016-10-30 11:56 513
			if (globalData.SoundEnabled&&(!globalData.NoSound)&&(timetrial)&&(ticks>gameStartedAt+10000)&&(!bGameOver)) {
8b1ab1cb sago007 2016-04-04 17:51 514
				int currentCounter = (ticks-(int)gameStartedAt)/1000;
8b1ab1cb sago007 2016-04-04 17:51 515
				if (currentCounter!=lastCounter) {
8b1ab1cb sago007 2016-04-04 17:51 516
					if (currentCounter>115 && currentCounter<120) {
524f188c sago007 2017-04-22 09:01 517
						Mix_PlayChannel(1, counterChunk.get(), 0);
8b1ab1cb sago007 2016-04-04 17:51 518
					}
8b1ab1cb sago007 2016-04-04 17:51 519
				}
8b1ab1cb sago007 2016-04-04 17:51 520
				lastCounter = currentCounter;
8b1ab1cb sago007 2016-04-04 17:51 521
			}
8b1ab1cb sago007 2016-04-04 17:51 522
			else {
72383a9e sago007 2016-10-30 11:56 523
				if ( (0==lastCounter) && (globalData.SoundEnabled)&&(!globalData.NoSound)) {
524f188c sago007 2017-04-22 09:01 524
					Mix_PlayChannel(1, counterFinalChunk.get(), 0);
8b1ab1cb sago007 2016-04-04 17:51 525
				}
8b1ab1cb sago007 2016-04-04 17:51 526
				lastCounter = -1;
8b1ab1cb sago007 2016-04-04 17:51 527
			}
8b1ab1cb sago007 2016-04-04 17:51 528
		}
8b1ab1cb sago007 2016-04-04 17:51 529
2c6a4bae sago007 2018-05-11 15:20 530
		if (bGameOver) {
8b1ab1cb sago007 2016-04-04 17:51 531
			if (hasWonTheGame) {
247fe34e sago007 2018-06-30 12:35 532
				tbWinner.Draw(globalData.screen, topx+150, topy+200, sago::SagoTextField::Alignment::center);
8b1ab1cb sago007 2016-04-04 17:51 533
			}
8b1ab1cb sago007 2016-04-04 17:51 534
			else {
8b1ab1cb sago007 2016-04-04 17:51 535
				if (bDraw) {
247fe34e sago007 2018-06-30 12:35 536
					tbDraw.Draw(globalData.screen, topx+150, topy+200, sago::SagoTextField::Alignment::center);
8b1ab1cb sago007 2016-04-04 17:51 537
				}
8b1ab1cb sago007 2016-04-04 17:51 538
				else {
247fe34e sago007 2018-06-30 12:35 539
					tbGameOver.Draw(globalData.screen, topx+150, topy+200, sago::SagoTextField::Alignment::center);
8b1ab1cb sago007 2016-04-04 17:51 540
				}
8b1ab1cb sago007 2016-04-04 17:51 541
			}
8b1ab1cb sago007 2016-04-04 17:51 542
		}
8b1ab1cb sago007 2016-04-04 17:51 543
	}
8b1ab1cb sago007 2016-04-04 17:51 544
8b1ab1cb sago007 2016-04-04 17:51 545
private:
8b1ab1cb sago007 2016-04-04 17:51 546
	int topx, topy;
343fbe43 sago007 2018-03-27 19:53 547
	sago::SagoTextField scoreLabel;
343fbe43 sago007 2018-03-27 19:53 548
	sago::SagoTextField timeLabel;
343fbe43 sago007 2018-03-27 19:53 549
	sago::SagoTextField chainLabel;
343fbe43 sago007 2018-03-27 19:53 550
	sago::SagoTextField speedLabel;
871ce5d6 sago007 2018-03-28 12:36 551
	sago::SagoTextField buttonSkip;
871ce5d6 sago007 2018-03-28 12:36 552
	sago::SagoTextField buttonRetry;
871ce5d6 sago007 2018-03-28 12:36 553
	sago::SagoTextField buttonNext;
fc338170 sago007 2018-03-28 14:31 554
	sago::SagoTextField stopIntField;
e7e189c7 sago007 2018-03-31 15:30 555
#if DEBUG
e7e189c7 sago007 2018-03-31 15:30 556
	sago::SagoTextField aiStatusField;
e7e189c7 sago007 2018-03-31 15:30 557
#endif
8b1ab1cb sago007 2016-04-04 17:51 558
};
8b1ab1cb sago007 2016-04-04 17:51 559
8b1ab1cb sago007 2016-04-04 17:51 560
1970-01-01 00:00 561