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"
e8d66c68 sago007 2016-07-12 17:32 27
343fbe43 sago007 2018-03-27 19:53 28
static void setScoreboardFont(const sago::SagoDataHolder* holder, sago::SagoTextField& field, const char* text){
343fbe43 sago007 2018-03-27 19:53 29
	field.SetHolder(holder);
343fbe43 sago007 2018-03-27 19:53 30
	field.SetFont("penguinattack");
343fbe43 sago007 2018-03-27 19:53 31
	field.SetColor({255,255,255,255});
343fbe43 sago007 2018-03-27 19:53 32
	field.SetFontSize(20);
343fbe43 sago007 2018-03-27 19:53 33
	field.SetText(text);
343fbe43 sago007 2018-03-27 19:53 34
}
e8d66c68 sago007 2016-07-12 17:32 35
871ce5d6 sago007 2018-03-28 12:36 36
static void setButtonFont(const sago::SagoDataHolder* holder, sago::SagoTextField& field, const char* text){
871ce5d6 sago007 2018-03-28 12:36 37
	field.SetHolder(holder);
871ce5d6 sago007 2018-03-28 12:36 38
	field.SetFont("freeserif");
871ce5d6 sago007 2018-03-28 12:36 39
	field.SetColor({255,255,255,255});
871ce5d6 sago007 2018-03-28 12:36 40
	field.SetFontSize(24);
871ce5d6 sago007 2018-03-28 12:36 41
	field.SetOutline(1, {0,0,0,255});
871ce5d6 sago007 2018-03-28 12:36 42
	field.SetText(text);
871ce5d6 sago007 2018-03-28 12:36 43
}
871ce5d6 sago007 2018-03-28 12:36 44
8b1ab1cb sago007 2016-04-04 17:51 45
class BlockGameSdl : public BlockGame {
8b1ab1cb sago007 2016-04-04 17:51 46
public:
343fbe43 sago007 2018-03-27 19:53 47
	BlockGameSdl(int tx, int ty, const sago::SagoDataHolder* holder) {
8b1ab1cb sago007 2016-04-04 17:51 48
		topx = tx;
8b1ab1cb sago007 2016-04-04 17:51 49
		topy = ty;
343fbe43 sago007 2018-03-27 19:53 50
		setScoreboardFont(holder, scoreLabel, _("Score:"));
343fbe43 sago007 2018-03-27 19:53 51
		setScoreboardFont(holder, timeLabel, _("Time:"));
343fbe43 sago007 2018-03-27 19:53 52
		setScoreboardFont(holder, chainLabel, _("Chain:"));
343fbe43 sago007 2018-03-27 19:53 53
		setScoreboardFont(holder, speedLabel, _("Speed:"));
871ce5d6 sago007 2018-03-28 12:36 54
		setButtonFont(holder, buttonNext, _("Next"));
871ce5d6 sago007 2018-03-28 12:36 55
		setButtonFont(holder, buttonRetry, _("Retry"));
871ce5d6 sago007 2018-03-28 12:36 56
		setButtonFont(holder, buttonSkip, _("Skip"));
fc338170 sago007 2018-03-28 14:31 57
		setButtonFont(holder, stopIntField, "");
8b1ab1cb sago007 2016-04-04 17:51 58
	}
7d649ca8 sago007 2016-10-02 16:43 59
	
8b1ab1cb sago007 2016-04-04 17:51 60
8b1ab1cb sago007 2016-04-04 17:51 61
	void DrawImgBoard(const sago::SagoSprite& img, int x, int y) const {
72383a9e sago007 2016-10-30 11:56 62
		DrawIMG(img, globalData.screen, x+topx, y+topy);
8b1ab1cb sago007 2016-04-04 17:51 63
	}
8b1ab1cb sago007 2016-04-04 17:51 64
8b1ab1cb sago007 2016-04-04 17:51 65
	void DrawImgBoardBounded(const sago::SagoSprite& img, int x, int y) const {
72383a9e sago007 2016-10-30 11:56 66
		DrawIMG_Bounded(img, globalData.screen, x+topx, y+topy, topx, topy, topx + backBoard.GetWidth(), topy + backBoard.GetHeight());
8b1ab1cb sago007 2016-04-04 17:51 67
	}
8b1ab1cb sago007 2016-04-04 17:51 68
871ce5d6 sago007 2018-03-28 12:36 69
	void PrintTextCenteredBoard(int x, int y, sago::SagoTextField& field) {
871ce5d6 sago007 2018-03-28 12:36 70
		field.Draw(globalData.screen, x+topx+60, y+topy+20, 
871ce5d6 sago007 2018-03-28 12:36 71
				sago::SagoTextField::Alignment::center, sago::SagoTextField::VerticalAlignment::center);
8b1ab1cb sago007 2016-04-04 17:51 72
	}
e8d66c68 sago007 2016-07-12 17:32 73
	
7d649ca8 sago007 2016-10-02 16:43 74
	void SetTopXY(int tx, int ty) {
7d649ca8 sago007 2016-10-02 16:43 75
		topx = tx;
7d649ca8 sago007 2016-10-02 16:43 76
		topy = ty;
7d649ca8 sago007 2016-10-02 16:43 77
	}
8b1ab1cb sago007 2016-04-04 17:51 78
8b1ab1cb sago007 2016-04-04 17:51 79
	int GetTopX() const {
8b1ab1cb sago007 2016-04-04 17:51 80
		return topx;
8b1ab1cb sago007 2016-04-04 17:51 81
	}
8b1ab1cb sago007 2016-04-04 17:51 82
	int GetTopY() const {
8b1ab1cb sago007 2016-04-04 17:51 83
		return topy;
8b1ab1cb sago007 2016-04-04 17:51 84
	}
8b1ab1cb sago007 2016-04-04 17:51 85
	
8b1ab1cb sago007 2016-04-04 17:51 86
	/**
8b1ab1cb sago007 2016-04-04 17:51 87
	 * Retrives the coordinate to a given brick based on mouse input.
8b1ab1cb sago007 2016-04-04 17:51 88
	 * @param match true if the coordinate are within borders
8b1ab1cb sago007 2016-04-04 17:51 89
	 * @param mousex mouse coordinate input
8b1ab1cb sago007 2016-04-04 17:51 90
	 * @param mousey mouse coordiante input
8b1ab1cb sago007 2016-04-04 17:51 91
	 * @param x brick x. Unchanged if outside border
8b1ab1cb sago007 2016-04-04 17:51 92
	 * @param y brick y. Unchanged if outside border
8b1ab1cb sago007 2016-04-04 17:51 93
	 */
8b1ab1cb sago007 2016-04-04 17:51 94
	void GetBrickCoordinateFromMouse(bool& match, int mousex, int mousey, int& x, int& y) const {
706e81fe sago007 2016-04-05 19:17 95
		if (!IsInTheBoard(mousex, mousey)) {
8b1ab1cb sago007 2016-04-04 17:51 96
			match = false;
8b1ab1cb sago007 2016-04-04 17:51 97
			return;
8b1ab1cb sago007 2016-04-04 17:51 98
		}
8b1ab1cb sago007 2016-04-04 17:51 99
		match = true;
8b1ab1cb sago007 2016-04-04 17:51 100
		x = (mousex-topx) / 50;
8b1ab1cb sago007 2016-04-04 17:51 101
		y = (50*12+topy-mousey-pixels) / 50;
8b1ab1cb sago007 2016-04-04 17:51 102
	}
706e81fe sago007 2016-04-05 19:17 103
	
706e81fe sago007 2016-04-05 19:17 104
	bool IsInTheBoard(int mousex, int mousey) const {
706e81fe sago007 2016-04-05 19:17 105
		if (mousex < topx || mousex > topx+50*6 || mousey < topy || mousey > topy+50*12) {
706e81fe sago007 2016-04-05 19:17 106
			return false;
706e81fe sago007 2016-04-05 19:17 107
		}
706e81fe sago007 2016-04-05 19:17 108
		return true;
706e81fe sago007 2016-04-05 19:17 109
	}
706e81fe sago007 2016-04-05 19:17 110
	
706e81fe sago007 2016-04-05 19:17 111
	bool IsUnderTheBoard(int mousex, int mousey) const {
706e81fe sago007 2016-04-05 19:17 112
		if (mousex < topx || mousex > topx+50*6 || mousey < topy+50*12) {
706e81fe sago007 2016-04-05 19:17 113
			return false;
706e81fe sago007 2016-04-05 19:17 114
		}
706e81fe sago007 2016-04-05 19:17 115
		return true;
706e81fe sago007 2016-04-05 19:17 116
	}
8b1ab1cb sago007 2016-04-04 17:51 117
3f3ff0b6 sago007 2018-03-30 12:59 118
	void AddText(int x, int y, unsigned int text, int time) const override {
c310f8a5 sago007 2017-03-25 16:05 119
		globalData.theTextManager.addText(topx-10+x*bsize, topy+12*bsize-y*bsize, text, time);
8b1ab1cb sago007 2016-04-04 17:51 120
	}
8b1ab1cb sago007 2016-04-04 17:51 121
8b1ab1cb sago007 2016-04-04 17:51 122
	void AddBall(int x, int y, bool right, int color) const  override {
8b1ab1cb sago007 2016-04-04 17:51 123
		theBallManager.addBall(topx+40+x*bsize, topy+bsize*12-y*bsize, right, color);
8b1ab1cb sago007 2016-04-04 17:51 124
	}
8b1ab1cb sago007 2016-04-04 17:51 125
8b1ab1cb sago007 2016-04-04 17:51 126
	void AddExplosion(int x, int y) const  override {
8b1ab1cb sago007 2016-04-04 17:51 127
		theExplosionManager.addExplosion(topx-10+x*bsize, topy+bsize*12-10-y*bsize);
8b1ab1cb sago007 2016-04-04 17:51 128
	}
8b1ab1cb sago007 2016-04-04 17:51 129
8b1ab1cb sago007 2016-04-04 17:51 130
	void PlayerWonEvent() const  override {
72383a9e sago007 2016-10-30 11:56 131
		if (!globalData.SoundEnabled) {
8b1ab1cb sago007 2016-04-04 17:51 132
			return;
8b1ab1cb sago007 2016-04-04 17:51 133
		}
524f188c sago007 2017-04-22 09:01 134
		Mix_PlayChannel(1, applause.get(), 0);
8b1ab1cb sago007 2016-04-04 17:51 135
	}
8b1ab1cb sago007 2016-04-04 17:51 136
8b1ab1cb sago007 2016-04-04 17:51 137
	void DrawEvent() const override {
8b1ab1cb sago007 2016-04-04 17:51 138
		Mix_HaltChannel(1);
8b1ab1cb sago007 2016-04-04 17:51 139
	}
8b1ab1cb sago007 2016-04-04 17:51 140
8b1ab1cb sago007 2016-04-04 17:51 141
	void BlockPopEvent() const  override {
72383a9e sago007 2016-10-30 11:56 142
		if (!globalData.SoundEnabled) {
8b1ab1cb sago007 2016-04-04 17:51 143
			return;
8b1ab1cb sago007 2016-04-04 17:51 144
		}
524f188c sago007 2017-04-22 09:01 145
		Mix_PlayChannel(0, boing.get(), 0);
8b1ab1cb sago007 2016-04-04 17:51 146
	}
8b1ab1cb sago007 2016-04-04 17:51 147
8b1ab1cb sago007 2016-04-04 17:51 148
	void LongChainDoneEvent() const  override {
72383a9e sago007 2016-10-30 11:56 149
		if (!globalData.SoundEnabled) {
8b1ab1cb sago007 2016-04-04 17:51 150
			return;
8b1ab1cb sago007 2016-04-04 17:51 151
		}
524f188c sago007 2017-04-22 09:01 152
		Mix_PlayChannel(1, applause.get(), 0);
8b1ab1cb sago007 2016-04-04 17:51 153
	}
8b1ab1cb sago007 2016-04-04 17:51 154
8b1ab1cb sago007 2016-04-04 17:51 155
	void TimeTrialEndEvent() const  override {
72383a9e sago007 2016-10-30 11:56 156
		if (!globalData.NoSound && globalData.SoundEnabled) {
524f188c sago007 2017-04-22 09:01 157
			Mix_PlayChannel(1,counterFinalChunk.get(),0);
8b1ab1cb sago007 2016-04-04 17:51 158
		}
8b1ab1cb sago007 2016-04-04 17:51 159
	}
8b1ab1cb sago007 2016-04-04 17:51 160
8b1ab1cb sago007 2016-04-04 17:51 161
	void EndlessHighscoreEvent() const  override {
72383a9e sago007 2016-10-30 11:56 162
		if (!globalData.SoundEnabled) {
8b1ab1cb sago007 2016-04-04 17:51 163
			return;
8b1ab1cb sago007 2016-04-04 17:51 164
		}
524f188c sago007 2017-04-22 09:01 165
		Mix_PlayChannel(1, applause.get(), 0);
8b1ab1cb sago007 2016-04-04 17:51 166
	}
8b1ab1cb sago007 2016-04-04 17:51 167
private:
8b1ab1cb sago007 2016-04-04 17:51 168
	//Draws all the bricks to the board (including garbage)
8b1ab1cb sago007 2016-04-04 17:51 169
	void PaintBricks() const {
8b1ab1cb sago007 2016-04-04 17:51 170
		for (int i=0; ((i<13)&&(i<30)); i++) {
8b1ab1cb sago007 2016-04-04 17:51 171
			for (int j=0; j<6; j++) {
8b1ab1cb sago007 2016-04-04 17:51 172
				int basicBrick = board[j][i]%10; //The basic brick, stored on the least significant digit
8b1ab1cb sago007 2016-04-04 17:51 173
				if ((basicBrick > -1) && (basicBrick < 7) && ((board[j][i]/1000000)%10==0)) {
8b1ab1cb sago007 2016-04-04 17:51 174
					DrawImgBoardBounded(bricks[basicBrick],  j*bsize, bsize*12-i*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 175
					if ((board[j][i]/BLOCKWAIT)%10==1) {
8b1ab1cb sago007 2016-04-04 17:51 176
						DrawImgBoard(bomb,  j*bsize, bsize*12-i*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 177
					}
8b1ab1cb sago007 2016-04-04 17:51 178
					if ((board[j][i]/BLOCKHANG)%10==1) {
8b1ab1cb sago007 2016-04-04 17:51 179
						DrawImgBoardBounded(ready,  j*bsize, bsize*12-i*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 180
					}
8b1ab1cb sago007 2016-04-04 17:51 181
8b1ab1cb sago007 2016-04-04 17:51 182
				}
8b1ab1cb sago007 2016-04-04 17:51 183
				if ((board[j][i]/1000000)%10==1) {
8b1ab1cb sago007 2016-04-04 17:51 184
					int left, right, over, under;
8b1ab1cb sago007 2016-04-04 17:51 185
					int number = board[j][i];
8b1ab1cb sago007 2016-04-04 17:51 186
					if (j<1) {
8b1ab1cb sago007 2016-04-04 17:51 187
						left = -1;
8b1ab1cb sago007 2016-04-04 17:51 188
					}
8b1ab1cb sago007 2016-04-04 17:51 189
					else {
8b1ab1cb sago007 2016-04-04 17:51 190
						left = board[j-1][i];
8b1ab1cb sago007 2016-04-04 17:51 191
					}
8b1ab1cb sago007 2016-04-04 17:51 192
					if (j>=5) {
8b1ab1cb sago007 2016-04-04 17:51 193
						right = -1;
8b1ab1cb sago007 2016-04-04 17:51 194
					}
8b1ab1cb sago007 2016-04-04 17:51 195
					else {
8b1ab1cb sago007 2016-04-04 17:51 196
						right = board[j+1][i];
8b1ab1cb sago007 2016-04-04 17:51 197
					}
8b1ab1cb sago007 2016-04-04 17:51 198
					if (i>28) {
8b1ab1cb sago007 2016-04-04 17:51 199
						over = -1;
8b1ab1cb sago007 2016-04-04 17:51 200
					}
8b1ab1cb sago007 2016-04-04 17:51 201
					else {
8b1ab1cb sago007 2016-04-04 17:51 202
						over = board[j][i+1];
8b1ab1cb sago007 2016-04-04 17:51 203
					}
8b1ab1cb sago007 2016-04-04 17:51 204
					if (i<1) {
8b1ab1cb sago007 2016-04-04 17:51 205
						under = -1;
8b1ab1cb sago007 2016-04-04 17:51 206
					}
8b1ab1cb sago007 2016-04-04 17:51 207
					else {
8b1ab1cb sago007 2016-04-04 17:51 208
						under = board[j][i-1];
8b1ab1cb sago007 2016-04-04 17:51 209
					}
8b1ab1cb sago007 2016-04-04 17:51 210
					if ((left == number)&&(right == number)&&(over == number)&&(under == number)) {
8b1ab1cb sago007 2016-04-04 17:51 211
						DrawImgBoardBounded(garbageFill,  j*bsize, bsize*12-i*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 212
					}
8b1ab1cb sago007 2016-04-04 17:51 213
					if ((left != number)&&(right == number)&&(over == number)&&(under == number)) {
8b1ab1cb sago007 2016-04-04 17:51 214
						DrawImgBoardBounded(garbageL,  j*bsize, bsize*12-i*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 215
					}
8b1ab1cb sago007 2016-04-04 17:51 216
					if ((left == number)&&(right != number)&&(over == number)&&(under == number)) {
8b1ab1cb sago007 2016-04-04 17:51 217
						DrawImgBoardBounded(garbageR,  j*bsize, bsize*12-i*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 218
					}
8b1ab1cb sago007 2016-04-04 17:51 219
					if ((left == number)&&(right == number)&&(over != number)&&(under == number)) {
8b1ab1cb sago007 2016-04-04 17:51 220
						DrawImgBoardBounded(garbageT,  j*bsize, bsize*12-i*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 221
					}
8b1ab1cb sago007 2016-04-04 17:51 222
					if ((left == number)&&(right == number)&&(over == number)&&(under != number)) {
8b1ab1cb sago007 2016-04-04 17:51 223
						DrawImgBoardBounded(garbageB,  j*bsize, bsize*12-i*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 224
					}
8b1ab1cb sago007 2016-04-04 17:51 225
					if ((left != number)&&(right == number)&&(over != number)&&(under == number)) {
8b1ab1cb sago007 2016-04-04 17:51 226
						DrawImgBoardBounded(garbageTL,  j*bsize, bsize*12-i*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 227
					}
8b1ab1cb sago007 2016-04-04 17:51 228
					if ((left != number)&&(right == number)&&(over == number)&&(under != number)) {
8b1ab1cb sago007 2016-04-04 17:51 229
						DrawImgBoardBounded(garbageBL,  j*bsize, bsize*12-i*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 230
					}
8b1ab1cb sago007 2016-04-04 17:51 231
					if ((left == number)&&(right != number)&&(over != number)&&(under == number)) {
8b1ab1cb sago007 2016-04-04 17:51 232
						DrawImgBoardBounded(garbageTR,  j*bsize, bsize*12-i*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 233
					}
8b1ab1cb sago007 2016-04-04 17:51 234
					if ((left == number)&&(right != number)&&(over == number)&&(under != number)) {
8b1ab1cb sago007 2016-04-04 17:51 235
						DrawImgBoardBounded(garbageBR,  j*bsize, bsize*12-i*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 236
					}
8b1ab1cb sago007 2016-04-04 17:51 237
					if ((left == number)&&(right != number)&&(over != number)&&(under != number)) {
8b1ab1cb sago007 2016-04-04 17:51 238
						DrawImgBoardBounded(garbageMR,  j*bsize, bsize*12-i*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 239
					}
8b1ab1cb sago007 2016-04-04 17:51 240
					if ((left == number)&&(right == number)&&(over != number)&&(under != number)) {
8b1ab1cb sago007 2016-04-04 17:51 241
						DrawImgBoardBounded(garbageM,  j*bsize, bsize*12-i*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 242
					}
8b1ab1cb sago007 2016-04-04 17:51 243
					if ((left != number)&&(right == number)&&(over != number)&&(under != number)) {
8b1ab1cb sago007 2016-04-04 17:51 244
						DrawImgBoardBounded(garbageML,  j*bsize, bsize*12-i*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 245
					}
8b1ab1cb sago007 2016-04-04 17:51 246
				}
8b1ab1cb sago007 2016-04-04 17:51 247
				if ((board[j][i]/1000000)%10==2) {
8b1ab1cb sago007 2016-04-04 17:51 248
					if (j==0) {
8b1ab1cb sago007 2016-04-04 17:51 249
						DrawImgBoardBounded(garbageGML,  j*bsize, bsize*12-i*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 250
					}
8b1ab1cb sago007 2016-04-04 17:51 251
					else if (j==5) {
8b1ab1cb sago007 2016-04-04 17:51 252
						DrawImgBoardBounded(garbageGMR,  j*bsize, bsize*12-i*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 253
					}
8b1ab1cb sago007 2016-04-04 17:51 254
					else {
8b1ab1cb sago007 2016-04-04 17:51 255
						DrawImgBoardBounded(garbageGM,  j*bsize, bsize*12-i*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 256
					}
8b1ab1cb sago007 2016-04-04 17:51 257
				}
8b1ab1cb sago007 2016-04-04 17:51 258
			}
8b1ab1cb sago007 2016-04-04 17:51 259
		}
8b1ab1cb sago007 2016-04-04 17:51 260
		const int j = 0;
8b1ab1cb sago007 2016-04-04 17:51 261
8b1ab1cb sago007 2016-04-04 17:51 262
		int garbageSize=0;
8b1ab1cb sago007 2016-04-04 17:51 263
		for (int i=0; i<20; i++) {
8b1ab1cb sago007 2016-04-04 17:51 264
			if ((board[j][i]/1000000)%10==1) {
8b1ab1cb sago007 2016-04-04 17:51 265
				int left, right, over, under;
8b1ab1cb sago007 2016-04-04 17:51 266
				int number = board[j][i];
8b1ab1cb sago007 2016-04-04 17:51 267
				if (j<1) {
8b1ab1cb sago007 2016-04-04 17:51 268
					left = -1;
8b1ab1cb sago007 2016-04-04 17:51 269
				}
8b1ab1cb sago007 2016-04-04 17:51 270
				else {
8b1ab1cb sago007 2016-04-04 17:51 271
					left = board[j-1][i];
8b1ab1cb sago007 2016-04-04 17:51 272
				}
8b1ab1cb sago007 2016-04-04 17:51 273
				if (j>5) {
8b1ab1cb sago007 2016-04-04 17:51 274
					right = -1;
8b1ab1cb sago007 2016-04-04 17:51 275
				}
8b1ab1cb sago007 2016-04-04 17:51 276
				else {
8b1ab1cb sago007 2016-04-04 17:51 277
					right = board[j+1][i];
8b1ab1cb sago007 2016-04-04 17:51 278
				}
8b1ab1cb sago007 2016-04-04 17:51 279
				if (i>28) {
8b1ab1cb sago007 2016-04-04 17:51 280
					over = -1;
8b1ab1cb sago007 2016-04-04 17:51 281
				}
8b1ab1cb sago007 2016-04-04 17:51 282
				else {
8b1ab1cb sago007 2016-04-04 17:51 283
					over = board[j][i+1];
8b1ab1cb sago007 2016-04-04 17:51 284
				}
8b1ab1cb sago007 2016-04-04 17:51 285
				if (i<1) {
8b1ab1cb sago007 2016-04-04 17:51 286
					under = -1;
8b1ab1cb sago007 2016-04-04 17:51 287
				}
8b1ab1cb sago007 2016-04-04 17:51 288
				else {
8b1ab1cb sago007 2016-04-04 17:51 289
					under = board[j][i-1];
8b1ab1cb sago007 2016-04-04 17:51 290
				}
8b1ab1cb sago007 2016-04-04 17:51 291
				if (((left != number)&&(right == number)&&(over != number)&&(under == number))&&(garbageSize>0)) {
8b1ab1cb sago007 2016-04-04 17:51 292
					DrawImgBoardBounded(smiley[board[j][i]%4],  2*bsize, 12*bsize-i*bsize-pixels+(bsize/2)*garbageSize);
8b1ab1cb sago007 2016-04-04 17:51 293
				}
8b1ab1cb sago007 2016-04-04 17:51 294
				if (!((left != number)&&(right == number)&&(over == number)&&(under == number))) { //not in garbage
8b1ab1cb sago007 2016-04-04 17:51 295
					garbageSize=0;
8b1ab1cb sago007 2016-04-04 17:51 296
				}
8b1ab1cb sago007 2016-04-04 17:51 297
				else {
8b1ab1cb sago007 2016-04-04 17:51 298
					garbageSize++;
8b1ab1cb sago007 2016-04-04 17:51 299
				}
8b1ab1cb sago007 2016-04-04 17:51 300
8b1ab1cb sago007 2016-04-04 17:51 301
			}
8b1ab1cb sago007 2016-04-04 17:51 302
		}
8b1ab1cb sago007 2016-04-04 17:51 303
		for (int i=0; i<6; i++) {
8b1ab1cb sago007 2016-04-04 17:51 304
			if (board[i][0]!=-1) {
8b1ab1cb sago007 2016-04-04 17:51 305
				DrawImgBoardBounded(transCover,  i*bsize, 12*bsize-pixels);    //Make the appering blocks transperant
8b1ab1cb sago007 2016-04-04 17:51 306
			}
8b1ab1cb sago007 2016-04-04 17:51 307
		}
8b1ab1cb sago007 2016-04-04 17:51 308
8b1ab1cb sago007 2016-04-04 17:51 309
	}
8b1ab1cb sago007 2016-04-04 17:51 310
public:
8b1ab1cb sago007 2016-04-04 17:51 311
	//Draws everything
8b1ab1cb sago007 2016-04-04 17:51 312
	void DoPaintJob() {
72383a9e sago007 2016-10-30 11:56 313
		DrawIMG(boardBackBack,globalData.screen,this->GetTopX()-60,this->GetTopY()-68);
8b1ab1cb sago007 2016-04-04 17:51 314
343fbe43 sago007 2018-03-27 19:53 315
		this->scoreLabel.Draw(globalData.screen, this->GetTopX()+310,this->GetTopY()-68+148);
343fbe43 sago007 2018-03-27 19:53 316
		this->timeLabel.Draw(globalData.screen, this->GetTopX()+310,this->GetTopY()-68+197);
343fbe43 sago007 2018-03-27 19:53 317
		this->chainLabel.Draw(globalData.screen, this->GetTopX()+310,this->GetTopY()-68+246);
343fbe43 sago007 2018-03-27 19:53 318
		this->speedLabel.Draw(globalData.screen, this->GetTopX()+310,this->GetTopY()-68+295);
8b1ab1cb sago007 2016-04-04 17:51 319
		DrawImgBoard(backBoard,  0, 0);
8b1ab1cb sago007 2016-04-04 17:51 320
8b1ab1cb sago007 2016-04-04 17:51 321
		PaintBricks();
8b1ab1cb sago007 2016-04-04 17:51 322
		if (stageClear) {
8b1ab1cb sago007 2016-04-04 17:51 323
			DrawImgBoard(blackLine,  0, bsize*(12+2)+bsize*(stageClearLimit-linesCleared)-pixels-1);
8b1ab1cb sago007 2016-04-04 17:51 324
		}
8b1ab1cb sago007 2016-04-04 17:51 325
		if (puzzleMode&&(!bGameOver)) {
8b1ab1cb sago007 2016-04-04 17:51 326
			//We need to write nr. of moves left!
549ecfae sago007 2016-10-09 08:37 327
			strHolder = _("Moves left: ") + std::to_string(MovesLeft);
810e1c2f sago007 2018-03-28 09:40 328
			static sago::SagoTextField movesPuzzleLabel;
810e1c2f sago007 2018-03-28 09:40 329
			sagoTextSetHelpFont(movesPuzzleLabel);
0b8fb137 sago007 2018-03-31 19:53 330
			movesPuzzleLabel.SetText(strHolder);
810e1c2f sago007 2018-03-28 09:40 331
			movesPuzzleLabel.Draw(globalData.screen, topx+5, topy+5);
8b1ab1cb sago007 2016-04-04 17:51 332
8b1ab1cb sago007 2016-04-04 17:51 333
		}
8b1ab1cb sago007 2016-04-04 17:51 334
		if (puzzleMode && stageButtonStatus == SBpuzzleMode) {
8b1ab1cb sago007 2016-04-04 17:51 335
			DrawImgBoard(bRetry, cordRetryButton.x, cordRetryButton.y);
871ce5d6 sago007 2018-03-28 12:36 336
			PrintTextCenteredBoard(cordRetryButton.x, cordRetryButton.y, buttonRetry);
8b1ab1cb sago007 2016-04-04 17:51 337
			if (getLevel()<PuzzleGetNumberOfPuzzles()-1) {
8b1ab1cb sago007 2016-04-04 17:51 338
				if (hasWonTheGame) {
72383a9e sago007 2016-10-30 11:56 339
					DrawImgBoard(globalData.bNext, cordNextButton.x, cordNextButton.y);
871ce5d6 sago007 2018-03-28 12:36 340
					PrintTextCenteredBoard(cordNextButton.x, cordNextButton.y, buttonNext);
8b1ab1cb sago007 2016-04-04 17:51 341
				}
8b1ab1cb sago007 2016-04-04 17:51 342
				else {
8b1ab1cb sago007 2016-04-04 17:51 343
					DrawImgBoard(bSkip,cordNextButton.x, cordNextButton.y);
871ce5d6 sago007 2018-03-28 12:36 344
					PrintTextCenteredBoard(cordNextButton.x, cordNextButton.y, buttonSkip);
8b1ab1cb sago007 2016-04-04 17:51 345
				}
8b1ab1cb sago007 2016-04-04 17:51 346
			}
8b1ab1cb sago007 2016-04-04 17:51 347
			else {
810e1c2f sago007 2018-03-28 09:40 348
				static sago::SagoTextField lastPuzzleLabel;
810e1c2f sago007 2018-03-28 09:40 349
				sagoTextSetHelpFont(lastPuzzleLabel);
810e1c2f sago007 2018-03-28 09:40 350
				lastPuzzleLabel.SetText(_("Last puzzle"));
810e1c2f sago007 2018-03-28 09:40 351
				lastPuzzleLabel.Draw(globalData.screen, topx+5, topy+5);
8b1ab1cb sago007 2016-04-04 17:51 352
			}
8b1ab1cb sago007 2016-04-04 17:51 353
		}
8b1ab1cb sago007 2016-04-04 17:51 354
		if (stageClear && stageButtonStatus == SBstageClear) {
8b1ab1cb sago007 2016-04-04 17:51 355
			DrawImgBoard(bRetry, cordRetryButton.x, cordRetryButton.y);
871ce5d6 sago007 2018-03-28 12:36 356
			PrintTextCenteredBoard(cordRetryButton.x, cordRetryButton.y, buttonRetry);
8b1ab1cb sago007 2016-04-04 17:51 357
			if (getLevel()<50-1) {
8b1ab1cb sago007 2016-04-04 17:51 358
				if (hasWonTheGame) {
72383a9e sago007 2016-10-30 11:56 359
					DrawImgBoard(globalData.bNext, cordNextButton.x, cordNextButton.y);
871ce5d6 sago007 2018-03-28 12:36 360
					PrintTextCenteredBoard(cordNextButton.x, cordNextButton.y, buttonNext);
8b1ab1cb sago007 2016-04-04 17:51 361
				}
8b1ab1cb sago007 2016-04-04 17:51 362
				else {
8b1ab1cb sago007 2016-04-04 17:51 363
					DrawImgBoard(bSkip,cordNextButton.x, cordNextButton.y);
871ce5d6 sago007 2018-03-28 12:36 364
					PrintTextCenteredBoard(cordNextButton.x, cordNextButton.y, buttonSkip);
8b1ab1cb sago007 2016-04-04 17:51 365
				}
8b1ab1cb sago007 2016-04-04 17:51 366
			}
8b1ab1cb sago007 2016-04-04 17:51 367
			else {
810e1c2f sago007 2018-03-28 09:40 368
				static sago::SagoTextField lastStageLabel;
810e1c2f sago007 2018-03-28 09:40 369
				sagoTextSetHelpFont(lastStageLabel);
810e1c2f sago007 2018-03-28 09:40 370
				lastStageLabel.SetText(_("Last stage"));
810e1c2f sago007 2018-03-28 09:40 371
				lastStageLabel.Draw(globalData.screen, topx+5, topy+5);
8b1ab1cb sago007 2016-04-04 17:51 372
			}
8b1ab1cb sago007 2016-04-04 17:51 373
		}
e8d66c68 sago007 2016-07-12 17:32 374
		if (!bGameOver && stop > 20) {
0b8fb137 sago007 2018-03-31 19:53 375
			stopIntField.SetText(std::to_string(stop/10));
fc338170 sago007 2018-03-28 14:31 376
			stopIntField.Draw(globalData.screen, 240+topx, -40+topy);
e8d66c68 sago007 2016-07-12 17:32 377
		}
8b1ab1cb sago007 2016-04-04 17:51 378
8b1ab1cb sago007 2016-04-04 17:51 379
#if DEBUG
8b1ab1cb sago007 2016-04-04 17:51 380
		if (AI_Enabled&&(!bGameOver)) {
e7e189c7 sago007 2018-03-31 15:30 381
			sagoTextSetBlueFont(aiStatusField);
549ecfae sago007 2016-10-09 08:37 382
			strHolder = "AI_status: " + std::to_string(AIstatus)+ ", "+ std::to_string(AIlineToClear);
0b8fb137 sago007 2018-03-31 19:53 383
			aiStatusField.SetText(strHolder);
e7e189c7 sago007 2018-03-31 15:30 384
			aiStatusField.Draw(globalData.screen, topx+5, topy+5);
8b1ab1cb sago007 2016-04-04 17:51 385
		}
8b1ab1cb sago007 2016-04-04 17:51 386
#endif
8b1ab1cb sago007 2016-04-04 17:51 387
		if (!bGameOver) {
8b1ab1cb sago007 2016-04-04 17:51 388
			bool touched = false;
8b1ab1cb sago007 2016-04-04 17:51 389
			int mx = 0;
8b1ab1cb sago007 2016-04-04 17:51 390
			int my = 0;
8b1ab1cb sago007 2016-04-04 17:51 391
			this->GetMouseCursor(touched, mx, my);
8b1ab1cb sago007 2016-04-04 17:51 392
			if (touched) {
72383a9e sago007 2016-10-30 11:56 393
				DrawImgBoard(globalData.spriteHolder->GetSprite("touchcursor"),mx*bsize, 11*bsize-my*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 394
			}
8b1ab1cb sago007 2016-04-04 17:51 395
			else {
55ea55dd sago007 2018-03-24 16:07 396
				DrawImgBoard(cursor,cursorx*bsize,11*bsize-cursory*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 397
			}
8b1ab1cb sago007 2016-04-04 17:51 398
		}
8b1ab1cb sago007 2016-04-04 17:51 399
		if (ticks<gameStartedAt) {
8b1ab1cb sago007 2016-04-04 17:51 400
			int currentCounter = abs((int)ticks-(int)gameStartedAt)/1000;
72383a9e sago007 2016-10-30 11:56 401
			if ( (currentCounter!=lastCounter) && (globalData.SoundEnabled)&&(!globalData.NoSound)) {
524f188c sago007 2017-04-22 09:01 402
				Mix_PlayChannel(1, counterChunk.get(), 0);
8b1ab1cb sago007 2016-04-04 17:51 403
			}
8b1ab1cb sago007 2016-04-04 17:51 404
			lastCounter = currentCounter;
8b1ab1cb sago007 2016-04-04 17:51 405
			switch (currentCounter) {
8b1ab1cb sago007 2016-04-04 17:51 406
			case 2:
8b1ab1cb sago007 2016-04-04 17:51 407
				DrawImgBoard(counter[2],  2*bsize, 5*bsize);
8b1ab1cb sago007 2016-04-04 17:51 408
				break;
8b1ab1cb sago007 2016-04-04 17:51 409
			case 1:
8b1ab1cb sago007 2016-04-04 17:51 410
				DrawImgBoard(counter[1],  2*bsize, 5*bsize);
8b1ab1cb sago007 2016-04-04 17:51 411
				break;
8b1ab1cb sago007 2016-04-04 17:51 412
			case 0:
8b1ab1cb sago007 2016-04-04 17:51 413
				DrawImgBoard(counter[0],  2*bsize, 5*bsize);
8b1ab1cb sago007 2016-04-04 17:51 414
				break;
8b1ab1cb sago007 2016-04-04 17:51 415
			default:
8b1ab1cb sago007 2016-04-04 17:51 416
				break;
8b1ab1cb sago007 2016-04-04 17:51 417
			}
8b1ab1cb sago007 2016-04-04 17:51 418
		}
8b1ab1cb sago007 2016-04-04 17:51 419
		else {
72383a9e sago007 2016-10-30 11:56 420
			if (globalData.SoundEnabled&&(!globalData.NoSound)&&(timetrial)&&(ticks>gameStartedAt+10000)&&(!bGameOver)) {
8b1ab1cb sago007 2016-04-04 17:51 421
				int currentCounter = (ticks-(int)gameStartedAt)/1000;
8b1ab1cb sago007 2016-04-04 17:51 422
				if (currentCounter!=lastCounter) {
8b1ab1cb sago007 2016-04-04 17:51 423
					if (currentCounter>115 && currentCounter<120) {
524f188c sago007 2017-04-22 09:01 424
						Mix_PlayChannel(1, counterChunk.get(), 0);
8b1ab1cb sago007 2016-04-04 17:51 425
					}
8b1ab1cb sago007 2016-04-04 17:51 426
				}
8b1ab1cb sago007 2016-04-04 17:51 427
				lastCounter = currentCounter;
8b1ab1cb sago007 2016-04-04 17:51 428
			}
8b1ab1cb sago007 2016-04-04 17:51 429
			else {
72383a9e sago007 2016-10-30 11:56 430
				if ( (0==lastCounter) && (globalData.SoundEnabled)&&(!globalData.NoSound)) {
524f188c sago007 2017-04-22 09:01 431
					Mix_PlayChannel(1, counterFinalChunk.get(), 0);
8b1ab1cb sago007 2016-04-04 17:51 432
				}
8b1ab1cb sago007 2016-04-04 17:51 433
				lastCounter = -1;
8b1ab1cb sago007 2016-04-04 17:51 434
			}
8b1ab1cb sago007 2016-04-04 17:51 435
		}
8b1ab1cb sago007 2016-04-04 17:51 436
8b1ab1cb sago007 2016-04-04 17:51 437
		if ((bGameOver)&&(!editorMode)) {
8b1ab1cb sago007 2016-04-04 17:51 438
			if (hasWonTheGame) {
8b1ab1cb sago007 2016-04-04 17:51 439
				DrawImgBoard(iWinner,  0, 5*bsize);
8b1ab1cb sago007 2016-04-04 17:51 440
			}
8b1ab1cb sago007 2016-04-04 17:51 441
			else {
8b1ab1cb sago007 2016-04-04 17:51 442
				if (bDraw) {
8b1ab1cb sago007 2016-04-04 17:51 443
					DrawImgBoard(iDraw,  0, 5*bsize);
8b1ab1cb sago007 2016-04-04 17:51 444
				}
8b1ab1cb sago007 2016-04-04 17:51 445
				else {
8b1ab1cb sago007 2016-04-04 17:51 446
					DrawImgBoard(iGameOver,  0, 5*bsize);
8b1ab1cb sago007 2016-04-04 17:51 447
				}
8b1ab1cb sago007 2016-04-04 17:51 448
			}
8b1ab1cb sago007 2016-04-04 17:51 449
		}
8b1ab1cb sago007 2016-04-04 17:51 450
	}
8b1ab1cb sago007 2016-04-04 17:51 451
8b1ab1cb sago007 2016-04-04 17:51 452
private:
8b1ab1cb sago007 2016-04-04 17:51 453
	int topx, topy;
343fbe43 sago007 2018-03-27 19:53 454
	sago::SagoTextField scoreLabel;
343fbe43 sago007 2018-03-27 19:53 455
	sago::SagoTextField timeLabel;
343fbe43 sago007 2018-03-27 19:53 456
	sago::SagoTextField chainLabel;
343fbe43 sago007 2018-03-27 19:53 457
	sago::SagoTextField speedLabel;
871ce5d6 sago007 2018-03-28 12:36 458
	sago::SagoTextField buttonSkip;
871ce5d6 sago007 2018-03-28 12:36 459
	sago::SagoTextField buttonRetry;
871ce5d6 sago007 2018-03-28 12:36 460
	sago::SagoTextField buttonNext;
fc338170 sago007 2018-03-28 14:31 461
	sago::SagoTextField stopIntField;
e7e189c7 sago007 2018-03-31 15:30 462
#if DEBUG
e7e189c7 sago007 2018-03-31 15:30 463
	sago::SagoTextField aiStatusField;
e7e189c7 sago007 2018-03-31 15:30 464
#endif
8b1ab1cb sago007 2016-04-04 17:51 465
};
8b1ab1cb sago007 2016-04-04 17:51 466
8b1ab1cb sago007 2016-04-04 17:51 467
1970-01-01 00:00 468