git repos / blockattack-game

blame: source/code/BlockGameSdl.hpp

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"
a3a8b2b4 Poul Sander 2023-10-15 21:04 27
#include "BallManager.hpp"
607bd2a1 Poul Sander 2023-11-29 20:08 28
#include "ExplosionManager.hpp"
a3a8b2b4 Poul Sander 2023-10-15 21:04 29
#include "puzzlehandler.hpp"
a3a8b2b4 Poul Sander 2023-10-15 21:04 30
a3a8b2b4 Poul Sander 2023-10-15 21:04 31
extern BallManager theBallManager;
a3a8b2b4 Poul Sander 2023-10-15 21:04 32
a3a8b2b4 Poul Sander 2023-10-15 21:04 33
extern ExplosionManager theExplosionManager;
e8d66c68 sago007 2016-07-12 17:32 34
5d36f49f Poul Sander 2023-07-11 22:38 35
5d601060 Poul Sander 2023-10-26 21:00 36
static void setScoreboardFont(const sago::SagoDataHolder* holder, sago::SagoTextField& field, const char* text) {
343fbe43 sago007 2018-03-27 19:53 37
	field.SetHolder(holder);
343fbe43 sago007 2018-03-27 19:53 38
	field.SetFont("penguinattack");
343fbe43 sago007 2018-03-27 19:53 39
	field.SetColor({255,255,255,255});
343fbe43 sago007 2018-03-27 19:53 40
	field.SetFontSize(20);
343fbe43 sago007 2018-03-27 19:53 41
	field.SetText(text);
343fbe43 sago007 2018-03-27 19:53 42
}
e8d66c68 sago007 2016-07-12 17:32 43
5d601060 Poul Sander 2023-10-26 21:00 44
static void setButtonFont(const sago::SagoDataHolder* holder, sago::SagoTextField& field, const char* text) {
871ce5d6 sago007 2018-03-28 12:36 45
	field.SetHolder(holder);
871ce5d6 sago007 2018-03-28 12:36 46
	field.SetFont("freeserif");
871ce5d6 sago007 2018-03-28 12:36 47
	field.SetColor({255,255,255,255});
871ce5d6 sago007 2018-03-28 12:36 48
	field.SetFontSize(24);
f6e8c704 sago007 2018-04-03 21:39 49
	field.SetOutline(1, {64,64,64,255});
871ce5d6 sago007 2018-03-28 12:36 50
	field.SetText(text);
871ce5d6 sago007 2018-03-28 12:36 51
}
871ce5d6 sago007 2018-03-28 12:36 52
dc7f7fbd Poul Sander 2023-10-22 12:26 53
template <class T> void sagoTextSetHelpFont(T& field) {
5d601060 Poul Sander 2023-10-26 21:00 54
	field.SetHolder(&globalData.spriteHolder->GetDataHolder());
5d601060 Poul Sander 2023-10-26 21:00 55
	field.SetFont("freeserif");
5d601060 Poul Sander 2023-10-26 21:00 56
	field.SetFontSize(30);
5d601060 Poul Sander 2023-10-26 21:00 57
	field.SetOutline(1, {128,128,128,255});
dc7f7fbd Poul Sander 2023-10-22 12:26 58
}
dc7f7fbd Poul Sander 2023-10-22 12:26 59
8b1ab1cb sago007 2016-04-04 17:51 60
class BlockGameSdl : public BlockGame {
8b1ab1cb sago007 2016-04-04 17:51 61
public:
343fbe43 sago007 2018-03-27 19:53 62
	BlockGameSdl(int tx, int ty, const sago::SagoDataHolder* holder) {
8b1ab1cb sago007 2016-04-04 17:51 63
		topx = tx;
8b1ab1cb sago007 2016-04-04 17:51 64
		topy = ty;
343fbe43 sago007 2018-03-27 19:53 65
		setScoreboardFont(holder, scoreLabel, _("Score:"));
343fbe43 sago007 2018-03-27 19:53 66
		setScoreboardFont(holder, timeLabel, _("Time:"));
343fbe43 sago007 2018-03-27 19:53 67
		setScoreboardFont(holder, chainLabel, _("Chain:"));
343fbe43 sago007 2018-03-27 19:53 68
		setScoreboardFont(holder, speedLabel, _("Speed:"));
871ce5d6 sago007 2018-03-28 12:36 69
		setButtonFont(holder, buttonNext, _("Next"));
871ce5d6 sago007 2018-03-28 12:36 70
		setButtonFont(holder, buttonRetry, _("Retry"));
871ce5d6 sago007 2018-03-28 12:36 71
		setButtonFont(holder, buttonSkip, _("Skip"));
fc338170 sago007 2018-03-28 14:31 72
		setButtonFont(holder, stopIntField, "");
43e3097e Poul Sander 2023-10-22 08:50 73
5d601060 Poul Sander 2023-10-26 21:00 74
		sagoTextSetBlueFont(player_name);
5d601060 Poul Sander 2023-10-26 21:00 75
		sagoTextSetBlueFont(player_time);
5d601060 Poul Sander 2023-10-26 21:00 76
		sagoTextSetBlueFont(player_score);
5d601060 Poul Sander 2023-10-26 21:00 77
		sagoTextSetBlueFont(player_chain);
5d601060 Poul Sander 2023-10-26 21:00 78
		sagoTextSetBlueFont(player_speed);
8b1ab1cb sago007 2016-04-04 17:51 79
	}
5d601060 Poul Sander 2023-10-26 21:00 80
8b1ab1cb sago007 2016-04-04 17:51 81
8b1ab1cb sago007 2016-04-04 17:51 82
	void DrawImgBoard(const sago::SagoSprite& img, int x, int y) const {
72383a9e sago007 2016-10-30 11:56 83
		DrawIMG(img, globalData.screen, x+topx, y+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
	void DrawImgBoardBounded(const sago::SagoSprite& img, int x, int y) const {
5d36f49f Poul Sander 2023-07-11 22:38 87
		DrawIMG_Bounded(img, globalData.screen, x+topx, y+topy, topx, topy, topx + BOARD_WIDTH, topy + BOARD_HEIGHT);
8b1ab1cb sago007 2016-04-04 17:51 88
	}
8b1ab1cb sago007 2016-04-04 17:51 89
871ce5d6 sago007 2018-03-28 12:36 90
	void PrintTextCenteredBoard(int x, int y, sago::SagoTextField& field) {
5d601060 Poul Sander 2023-10-26 21:00 91
		field.Draw(globalData.screen, x+topx+60, y+topy+20,
a7226e17 Poul Sander 2025-03-06 20:42 92
		           sago::SagoTextField::Alignment::center, sago::SagoTextField::VerticalAlignment::center, &globalData.logicalResize);
8b1ab1cb sago007 2016-04-04 17:51 93
	}
5d601060 Poul Sander 2023-10-26 21:00 94
7d649ca8 sago007 2016-10-02 16:43 95
	void SetTopXY(int tx, int ty) {
7d649ca8 sago007 2016-10-02 16:43 96
		topx = tx;
7d649ca8 sago007 2016-10-02 16:43 97
		topy = ty;
7d649ca8 sago007 2016-10-02 16:43 98
	}
8b1ab1cb sago007 2016-04-04 17:51 99
8b1ab1cb sago007 2016-04-04 17:51 100
	int GetTopX() const {
8b1ab1cb sago007 2016-04-04 17:51 101
		return topx;
8b1ab1cb sago007 2016-04-04 17:51 102
	}
8b1ab1cb sago007 2016-04-04 17:51 103
	int GetTopY() const {
8b1ab1cb sago007 2016-04-04 17:51 104
		return topy;
8b1ab1cb sago007 2016-04-04 17:51 105
	}
5d601060 Poul Sander 2023-10-26 21:00 106
8b1ab1cb sago007 2016-04-04 17:51 107
	/**
8b1ab1cb sago007 2016-04-04 17:51 108
	 * Retrives the coordinate to a given brick based on mouse input.
8b1ab1cb sago007 2016-04-04 17:51 109
	 * @param match true if the coordinate are within borders
8b1ab1cb sago007 2016-04-04 17:51 110
	 * @param mousex mouse coordinate input
8b1ab1cb sago007 2016-04-04 17:51 111
	 * @param mousey mouse coordiante input
8b1ab1cb sago007 2016-04-04 17:51 112
	 * @param x brick x. Unchanged if outside border
8b1ab1cb sago007 2016-04-04 17:51 113
	 * @param y brick y. Unchanged if outside border
8b1ab1cb sago007 2016-04-04 17:51 114
	 */
8b1ab1cb sago007 2016-04-04 17:51 115
	void GetBrickCoordinateFromMouse(bool& match, int mousex, int mousey, int& x, int& y) const {
706e81fe sago007 2016-04-05 19:17 116
		if (!IsInTheBoard(mousex, mousey)) {
8b1ab1cb sago007 2016-04-04 17:51 117
			match = false;
8b1ab1cb sago007 2016-04-04 17:51 118
			return;
8b1ab1cb sago007 2016-04-04 17:51 119
		}
8b1ab1cb sago007 2016-04-04 17:51 120
		match = true;
e34256c1 Poul Sander 2021-10-06 20:10 121
		x = (mousex-topx) / bsize;
e34256c1 Poul Sander 2021-10-06 20:10 122
		y = (bsize*12+topy-mousey-pixels) / bsize;
8b1ab1cb sago007 2016-04-04 17:51 123
	}
5d601060 Poul Sander 2023-10-26 21:00 124
706e81fe sago007 2016-04-05 19:17 125
	bool IsInTheBoard(int mousex, int mousey) const {
e34256c1 Poul Sander 2021-10-06 20:10 126
		if (mousex < topx || mousex > topx+bsize*6 || mousey < topy || mousey > topy+bsize*12) {
706e81fe sago007 2016-04-05 19:17 127
			return false;
706e81fe sago007 2016-04-05 19:17 128
		}
706e81fe sago007 2016-04-05 19:17 129
		return true;
706e81fe sago007 2016-04-05 19:17 130
	}
5d601060 Poul Sander 2023-10-26 21:00 131
706e81fe sago007 2016-04-05 19:17 132
	bool IsUnderTheBoard(int mousex, int mousey) const {
e34256c1 Poul Sander 2021-10-06 20:10 133
		if (mousex < topx || mousex > topx+bsize*6 || mousey < topy+bsize*12) {
706e81fe sago007 2016-04-05 19:17 134
			return false;
706e81fe sago007 2016-04-05 19:17 135
		}
706e81fe sago007 2016-04-05 19:17 136
		return true;
706e81fe sago007 2016-04-05 19:17 137
	}
8b1ab1cb sago007 2016-04-04 17:51 138
3f3ff0b6 sago007 2018-03-30 12:59 139
	void AddText(int x, int y, unsigned int text, int time) const override {
c310f8a5 sago007 2017-03-25 16:05 140
		globalData.theTextManager.addText(topx-10+x*bsize, topy+12*bsize-y*bsize, text, time);
8b1ab1cb sago007 2016-04-04 17:51 141
	}
8b1ab1cb sago007 2016-04-04 17:51 142
8b1ab1cb sago007 2016-04-04 17:51 143
	void AddBall(int x, int y, bool right, int color) const  override {
8b1ab1cb sago007 2016-04-04 17:51 144
		theBallManager.addBall(topx+40+x*bsize, topy+bsize*12-y*bsize, right, color);
8b1ab1cb sago007 2016-04-04 17:51 145
	}
8b1ab1cb sago007 2016-04-04 17:51 146
8b1ab1cb sago007 2016-04-04 17:51 147
	void AddExplosion(int x, int y) const  override {
8b1ab1cb sago007 2016-04-04 17:51 148
		theExplosionManager.addExplosion(topx-10+x*bsize, topy+bsize*12-10-y*bsize);
8b1ab1cb sago007 2016-04-04 17:51 149
	}
8b1ab1cb sago007 2016-04-04 17:51 150
8b1ab1cb sago007 2016-04-04 17:51 151
	void PlayerWonEvent() const  override {
72383a9e sago007 2016-10-30 11:56 152
		if (!globalData.SoundEnabled) {
8b1ab1cb sago007 2016-04-04 17:51 153
			return;
8b1ab1cb sago007 2016-04-04 17:51 154
		}
a3a8b2b4 Poul Sander 2023-10-15 21:04 155
		Mix_PlayChannel(1, globalData.applause.get(), 0);
8b1ab1cb sago007 2016-04-04 17:51 156
	}
8b1ab1cb sago007 2016-04-04 17:51 157
8b1ab1cb sago007 2016-04-04 17:51 158
	void DrawEvent() const override {
8b1ab1cb sago007 2016-04-04 17:51 159
		Mix_HaltChannel(1);
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 BlockPopEvent() 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
		}
a3a8b2b4 Poul Sander 2023-10-15 21:04 166
		Mix_PlayChannel(0, globalData.boing.get(), 0);
8b1ab1cb sago007 2016-04-04 17:51 167
	}
8b1ab1cb sago007 2016-04-04 17:51 168
8b1ab1cb sago007 2016-04-04 17:51 169
	void LongChainDoneEvent() const  override {
72383a9e sago007 2016-10-30 11:56 170
		if (!globalData.SoundEnabled) {
8b1ab1cb sago007 2016-04-04 17:51 171
			return;
8b1ab1cb sago007 2016-04-04 17:51 172
		}
a3a8b2b4 Poul Sander 2023-10-15 21:04 173
		Mix_PlayChannel(1, globalData.applause.get(), 0);
8b1ab1cb sago007 2016-04-04 17:51 174
	}
8b1ab1cb sago007 2016-04-04 17:51 175
8b1ab1cb sago007 2016-04-04 17:51 176
	void TimeTrialEndEvent() const  override {
72383a9e sago007 2016-10-30 11:56 177
		if (!globalData.NoSound && globalData.SoundEnabled) {
a3a8b2b4 Poul Sander 2023-10-15 21:04 178
			Mix_PlayChannel(1,globalData.counterFinalChunk.get(),0);
8b1ab1cb sago007 2016-04-04 17:51 179
		}
8b1ab1cb sago007 2016-04-04 17:51 180
	}
8b1ab1cb sago007 2016-04-04 17:51 181
8b1ab1cb sago007 2016-04-04 17:51 182
	void EndlessHighscoreEvent() const  override {
72383a9e sago007 2016-10-30 11:56 183
		if (!globalData.SoundEnabled) {
8b1ab1cb sago007 2016-04-04 17:51 184
			return;
8b1ab1cb sago007 2016-04-04 17:51 185
		}
a3a8b2b4 Poul Sander 2023-10-15 21:04 186
		Mix_PlayChannel(1, globalData.applause.get(), 0);
8b1ab1cb sago007 2016-04-04 17:51 187
	}
8b1ab1cb sago007 2016-04-04 17:51 188
private:
e34256c1 Poul Sander 2021-10-06 20:10 189
e34256c1 Poul Sander 2021-10-06 20:10 190
	/**
e34256c1 Poul Sander 2021-10-06 20:10 191
	This crops "dstrect" and "srcrect" to fit inside "bounds"
e34256c1 Poul Sander 2021-10-06 20:10 192
	dstrect and srcrect are modified in place.
e34256c1 Poul Sander 2021-10-06 20:10 193
	*/
e34256c1 Poul Sander 2021-10-06 20:10 194
	void CropTexture(SDL_Rect& dstrect, SDL_Rect& srcrect, const SDL_Rect& bounds) const {
e34256c1 Poul Sander 2021-10-06 20:10 195
		if (dstrect.x > bounds.x+bounds.w) {
e34256c1 Poul Sander 2021-10-06 20:10 196
			dstrect = {0,0,0,0};
e34256c1 Poul Sander 2021-10-06 20:10 197
			return;
e34256c1 Poul Sander 2021-10-06 20:10 198
		}
e34256c1 Poul Sander 2021-10-06 20:10 199
		if (dstrect.y > bounds.y+bounds.h) {
e34256c1 Poul Sander 2021-10-06 20:10 200
			dstrect = {0,0,0,0};
e34256c1 Poul Sander 2021-10-06 20:10 201
			return;
e34256c1 Poul Sander 2021-10-06 20:10 202
		}
e34256c1 Poul Sander 2021-10-06 20:10 203
		if (dstrect.x+dstrect.w < bounds.x) {
e34256c1 Poul Sander 2021-10-06 20:10 204
			dstrect = {0,0,0,0};
e34256c1 Poul Sander 2021-10-06 20:10 205
			return;
e34256c1 Poul Sander 2021-10-06 20:10 206
		}
e34256c1 Poul Sander 2021-10-06 20:10 207
		if (dstrect.y+dstrect.h < bounds.y) {
e34256c1 Poul Sander 2021-10-06 20:10 208
			dstrect = {0,0,0,0};
e34256c1 Poul Sander 2021-10-06 20:10 209
			return;
e34256c1 Poul Sander 2021-10-06 20:10 210
		}
e34256c1 Poul Sander 2021-10-06 20:10 211
		if (dstrect.x < bounds.x) {
e34256c1 Poul Sander 2021-10-06 20:10 212
			Sint16 absDiff = bounds.x-dstrect.x;
e34256c1 Poul Sander 2021-10-06 20:10 213
			dstrect.x+=absDiff;
e34256c1 Poul Sander 2021-10-06 20:10 214
			srcrect.x+=absDiff;
e34256c1 Poul Sander 2021-10-06 20:10 215
			dstrect.w-=absDiff;
e34256c1 Poul Sander 2021-10-06 20:10 216
			srcrect.w-=absDiff;
e34256c1 Poul Sander 2021-10-06 20:10 217
		}
e34256c1 Poul Sander 2021-10-06 20:10 218
		if (dstrect.y < bounds.y) {
e34256c1 Poul Sander 2021-10-06 20:10 219
			Sint16 absDiff = bounds.y-dstrect.y;
e34256c1 Poul Sander 2021-10-06 20:10 220
			dstrect.y+=absDiff;
e34256c1 Poul Sander 2021-10-06 20:10 221
			srcrect.y+=absDiff;
e34256c1 Poul Sander 2021-10-06 20:10 222
			dstrect.h-=absDiff;
e34256c1 Poul Sander 2021-10-06 20:10 223
			srcrect.h-=absDiff;
e34256c1 Poul Sander 2021-10-06 20:10 224
		}
e34256c1 Poul Sander 2021-10-06 20:10 225
		if (dstrect.x+dstrect.w > bounds.x+bounds.w) {
e34256c1 Poul Sander 2021-10-06 20:10 226
			Sint16 absDiff = dstrect.x+dstrect.w-(bounds.x+bounds.w);
e34256c1 Poul Sander 2021-10-06 20:10 227
			dstrect.w -= absDiff;
e34256c1 Poul Sander 2021-10-06 20:10 228
			srcrect.w -= absDiff;
e34256c1 Poul Sander 2021-10-06 20:10 229
		}
e34256c1 Poul Sander 2021-10-06 20:10 230
		if (dstrect.y+dstrect.h > bounds.y+bounds.h) {
e34256c1 Poul Sander 2021-10-06 20:10 231
			Sint16 absDiff = dstrect.y+dstrect.h-(bounds.y+bounds.h);
e34256c1 Poul Sander 2021-10-06 20:10 232
			dstrect.h -= absDiff;
e34256c1 Poul Sander 2021-10-06 20:10 233
			srcrect.h -= absDiff;
e34256c1 Poul Sander 2021-10-06 20:10 234
		}
e34256c1 Poul Sander 2021-10-06 20:10 235
	}
e34256c1 Poul Sander 2021-10-06 20:10 236
8b1ab1cb sago007 2016-04-04 17:51 237
	//Draws all the bricks to the board (including garbage)
8b1ab1cb sago007 2016-04-04 17:51 238
	void PaintBricks() const {
32754436 Poul Sander 2020-08-15 15:12 239
		for (int i=0; i<13; ++i) {
32754436 Poul Sander 2020-08-15 15:12 240
			for (int j=0; j<6; ++j) {
8b1ab1cb sago007 2016-04-04 17:51 241
				int basicBrick = board[j][i]%10; //The basic brick, stored on the least significant digit
8b1ab1cb sago007 2016-04-04 17:51 242
				if ((basicBrick > -1) && (basicBrick < 7) && ((board[j][i]/1000000)%10==0)) {
a3a8b2b4 Poul Sander 2023-10-15 21:04 243
					DrawImgBoardBounded(globalData.bricks[basicBrick],  j*bsize, bsize*12-i*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 244
					if ((board[j][i]/BLOCKWAIT)%10==1) {
a3a8b2b4 Poul Sander 2023-10-15 21:04 245
						DrawImgBoard(globalData.bomb,  j*bsize, bsize*12-i*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 246
					}
8b1ab1cb sago007 2016-04-04 17:51 247
					if ((board[j][i]/BLOCKHANG)%10==1) {
a3a8b2b4 Poul Sander 2023-10-15 21:04 248
						DrawImgBoardBounded(globalData.ready,  j*bsize, bsize*12-i*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 249
					}
8b1ab1cb sago007 2016-04-04 17:51 250
8b1ab1cb sago007 2016-04-04 17:51 251
				}
8b1ab1cb sago007 2016-04-04 17:51 252
				if ((board[j][i]/1000000)%10==1) {
6e9aa65d Poul Sander 2025-02-23 19:30 253
					int left, right, over, under;
8b1ab1cb sago007 2016-04-04 17:51 254
					int number = board[j][i];
6e9aa65d Poul Sander 2025-02-23 19:30 255
					if (j<1) {
6e9aa65d Poul Sander 2025-02-23 19:30 256
						left = -1;
6e9aa65d Poul Sander 2025-02-23 19:30 257
					}
6e9aa65d Poul Sander 2025-02-23 19:30 258
					else {
6e9aa65d Poul Sander 2025-02-23 19:30 259
						left = board[j-1][i];
6e9aa65d Poul Sander 2025-02-23 19:30 260
					}
6e9aa65d Poul Sander 2025-02-23 19:30 261
					if (j>=5) {
6e9aa65d Poul Sander 2025-02-23 19:30 262
						right = -1;
6e9aa65d Poul Sander 2025-02-23 19:30 263
					}
6e9aa65d Poul Sander 2025-02-23 19:30 264
					else {
6e9aa65d Poul Sander 2025-02-23 19:30 265
						right = board[j+1][i];
6e9aa65d Poul Sander 2025-02-23 19:30 266
					}
6e9aa65d Poul Sander 2025-02-23 19:30 267
					if (i>28) {
6e9aa65d Poul Sander 2025-02-23 19:30 268
						over = -1;
6e9aa65d Poul Sander 2025-02-23 19:30 269
					}
6e9aa65d Poul Sander 2025-02-23 19:30 270
					else {
6e9aa65d Poul Sander 2025-02-23 19:30 271
						over = board[j][i+1];
6e9aa65d Poul Sander 2025-02-23 19:30 272
					}
6e9aa65d Poul Sander 2025-02-23 19:30 273
					if (i<1) {
6e9aa65d Poul Sander 2025-02-23 19:30 274
						under = -1;
6e9aa65d Poul Sander 2025-02-23 19:30 275
					}
6e9aa65d Poul Sander 2025-02-23 19:30 276
					else {
6e9aa65d Poul Sander 2025-02-23 19:30 277
						under = board[j][i-1];
6e9aa65d Poul Sander 2025-02-23 19:30 278
					}
6e9aa65d Poul Sander 2025-02-23 19:30 279
					if ((left == number)&&(right == number)&&(over == number)&&(under == number)) {
6e9aa65d Poul Sander 2025-02-23 19:30 280
						DrawImgBoardBounded(globalData.garbageFill,  j*bsize, bsize*12-i*bsize-pixels);
6e9aa65d Poul Sander 2025-02-23 19:30 281
					}
6e9aa65d Poul Sander 2025-02-23 19:30 282
					if ((left != number)&&(right == number)&&(over == number)&&(under == number)) {
6e9aa65d Poul Sander 2025-02-23 19:30 283
						DrawImgBoardBounded(globalData.garbageL,  j*bsize, bsize*12-i*bsize-pixels);
6e9aa65d Poul Sander 2025-02-23 19:30 284
					}
6e9aa65d Poul Sander 2025-02-23 19:30 285
					if ((left == number)&&(right != number)&&(over == number)&&(under == number)) {
6e9aa65d Poul Sander 2025-02-23 19:30 286
						DrawImgBoardBounded(globalData.garbageR,  j*bsize, bsize*12-i*bsize-pixels);
6e9aa65d Poul Sander 2025-02-23 19:30 287
					}
6e9aa65d Poul Sander 2025-02-23 19:30 288
					if ((left == number)&&(right == number)&&(over != number)&&(under == number)) {
6e9aa65d Poul Sander 2025-02-23 19:30 289
						DrawImgBoardBounded(globalData.garbageT,  j*bsize, bsize*12-i*bsize-pixels);
6e9aa65d Poul Sander 2025-02-23 19:30 290
					}
6e9aa65d Poul Sander 2025-02-23 19:30 291
					if ((left == number)&&(right == number)&&(over == number)&&(under != number)) {
6e9aa65d Poul Sander 2025-02-23 19:30 292
						DrawImgBoardBounded(globalData.garbageB,  j*bsize, bsize*12-i*bsize-pixels);
6e9aa65d Poul Sander 2025-02-23 19:30 293
					}
6e9aa65d Poul Sander 2025-02-23 19:30 294
					if ((left != number)&&(right == number)&&(over != number)&&(under == number)) {
6e9aa65d Poul Sander 2025-02-23 19:30 295
						DrawImgBoardBounded(globalData.garbageTL,  j*bsize, bsize*12-i*bsize-pixels);
6e9aa65d Poul Sander 2025-02-23 19:30 296
					}
6e9aa65d Poul Sander 2025-02-23 19:30 297
					if ((left != number)&&(right == number)&&(over == number)&&(under != number)) {
6e9aa65d Poul Sander 2025-02-23 19:30 298
						DrawImgBoardBounded(globalData.garbageBL,  j*bsize, bsize*12-i*bsize-pixels);
6e9aa65d Poul Sander 2025-02-23 19:30 299
					}
6e9aa65d Poul Sander 2025-02-23 19:30 300
					if ((left == number)&&(right != number)&&(over != number)&&(under == number)) {
6e9aa65d Poul Sander 2025-02-23 19:30 301
						DrawImgBoardBounded(globalData.garbageTR,  j*bsize, bsize*12-i*bsize-pixels);
6e9aa65d Poul Sander 2025-02-23 19:30 302
					}
6e9aa65d Poul Sander 2025-02-23 19:30 303
					if ((left == number)&&(right != number)&&(over == number)&&(under != number)) {
6e9aa65d Poul Sander 2025-02-23 19:30 304
						DrawImgBoardBounded(globalData.garbageBR,  j*bsize, bsize*12-i*bsize-pixels);
6e9aa65d Poul Sander 2025-02-23 19:30 305
					}
6e9aa65d Poul Sander 2025-02-23 19:30 306
					if ((left == number)&&(right != number)&&(over != number)&&(under != number)) {
6e9aa65d Poul Sander 2025-02-23 19:30 307
						DrawImgBoardBounded(globalData.garbageMR,  j*bsize, bsize*12-i*bsize-pixels);
6e9aa65d Poul Sander 2025-02-23 19:30 308
					}
6e9aa65d Poul Sander 2025-02-23 19:30 309
					if ((left == number)&&(right == number)&&(over != number)&&(under != number)) {
6e9aa65d Poul Sander 2025-02-23 19:30 310
						DrawImgBoardBounded(globalData.garbageM,  j*bsize, bsize*12-i*bsize-pixels);
6e9aa65d Poul Sander 2025-02-23 19:30 311
					}
6e9aa65d Poul Sander 2025-02-23 19:30 312
					if ((left != number)&&(right == number)&&(over != number)&&(under != number)) {
6e9aa65d Poul Sander 2025-02-23 19:30 313
						DrawImgBoardBounded(globalData.garbageML,  j*bsize, bsize*12-i*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 314
					}
8b1ab1cb sago007 2016-04-04 17:51 315
				}
8b1ab1cb sago007 2016-04-04 17:51 316
				if ((board[j][i]/1000000)%10==2) {
6e9aa65d Poul Sander 2025-02-23 19:30 317
					if (j==0) {
6e9aa65d Poul Sander 2025-02-23 19:30 318
						DrawImgBoardBounded(globalData.garbageGML,  j*bsize, bsize*12-i*bsize-pixels);
6e9aa65d Poul Sander 2025-02-23 19:30 319
					}
6e9aa65d Poul Sander 2025-02-23 19:30 320
					else if (j==5) {
6e9aa65d Poul Sander 2025-02-23 19:30 321
						DrawImgBoardBounded(globalData.garbageGMR,  j*bsize, bsize*12-i*bsize-pixels);
6e9aa65d Poul Sander 2025-02-23 19:30 322
					}
6e9aa65d Poul Sander 2025-02-23 19:30 323
					else {
6e9aa65d Poul Sander 2025-02-23 19:30 324
						DrawImgBoardBounded(globalData.garbageGM,  j*bsize, bsize*12-i*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 325
					}
8b1ab1cb sago007 2016-04-04 17:51 326
				}
8b1ab1cb sago007 2016-04-04 17:51 327
			}
8b1ab1cb sago007 2016-04-04 17:51 328
		}
8b1ab1cb sago007 2016-04-04 17:51 329
		const int j = 0;
8b1ab1cb sago007 2016-04-04 17:51 330
8b1ab1cb sago007 2016-04-04 17:51 331
		int garbageSize=0;
8b1ab1cb sago007 2016-04-04 17:51 332
		for (int i=0; i<20; i++) {
8b1ab1cb sago007 2016-04-04 17:51 333
			if ((board[j][i]/1000000)%10==1) {
8b1ab1cb sago007 2016-04-04 17:51 334
				int left, right, over, under;
8b1ab1cb sago007 2016-04-04 17:51 335
				int number = board[j][i];
32754436 Poul Sander 2020-08-15 15:12 336
				left = -1;
32754436 Poul Sander 2020-08-15 15:12 337
				right = board[j+1][i];
8b1ab1cb sago007 2016-04-04 17:51 338
				if (i>28) {
8b1ab1cb sago007 2016-04-04 17:51 339
					over = -1;
8b1ab1cb sago007 2016-04-04 17:51 340
				}
8b1ab1cb sago007 2016-04-04 17:51 341
				else {
8b1ab1cb sago007 2016-04-04 17:51 342
					over = board[j][i+1];
8b1ab1cb sago007 2016-04-04 17:51 343
				}
8b1ab1cb sago007 2016-04-04 17:51 344
				if (i<1) {
8b1ab1cb sago007 2016-04-04 17:51 345
					under = -1;
8b1ab1cb sago007 2016-04-04 17:51 346
				}
8b1ab1cb sago007 2016-04-04 17:51 347
				else {
8b1ab1cb sago007 2016-04-04 17:51 348
					under = board[j][i-1];
8b1ab1cb sago007 2016-04-04 17:51 349
				}
8b1ab1cb sago007 2016-04-04 17:51 350
				if (((left != number)&&(right == number)&&(over != number)&&(under == number))&&(garbageSize>0)) {
a0c212cb Poul Sander 2023-08-13 16:10 351
					if (globalData.theme.decoration.decoration_sprites.size()) {
a0c212cb Poul Sander 2023-08-13 16:10 352
						const sago::SagoSprite& sprite = globalData.spriteHolder->GetSprite(globalData.theme.decoration.decoration_sprites[board[j][i]%globalData.theme.decoration.decoration_sprites.size()]);
a0c212cb Poul Sander 2023-08-13 16:10 353
						DrawImgBoardBounded(sprite,  2*bsize, 12*bsize-i*bsize-pixels+(bsize/2)*garbageSize);
a0c212cb Poul Sander 2023-08-13 16:10 354
					}
8b1ab1cb sago007 2016-04-04 17:51 355
				}
8b1ab1cb sago007 2016-04-04 17:51 356
				if (!((left != number)&&(right == number)&&(over == number)&&(under == number))) { //not in garbage
8b1ab1cb sago007 2016-04-04 17:51 357
					garbageSize=0;
8b1ab1cb sago007 2016-04-04 17:51 358
				}
8b1ab1cb sago007 2016-04-04 17:51 359
				else {
8b1ab1cb sago007 2016-04-04 17:51 360
					garbageSize++;
8b1ab1cb sago007 2016-04-04 17:51 361
				}
8b1ab1cb sago007 2016-04-04 17:51 362
8b1ab1cb sago007 2016-04-04 17:51 363
			}
8b1ab1cb sago007 2016-04-04 17:51 364
		}
8b1ab1cb sago007 2016-04-04 17:51 365
		for (int i=0; i<6; i++) {
8b1ab1cb sago007 2016-04-04 17:51 366
			if (board[i][0]!=-1) {
a3a8b2b4 Poul Sander 2023-10-15 21:04 367
				DrawImgBoardBounded(globalData.transCover,  i*bsize, 12*bsize-pixels);    //Make the appering blocks transperant
8b1ab1cb sago007 2016-04-04 17:51 368
			}
8b1ab1cb sago007 2016-04-04 17:51 369
		}
8b1ab1cb sago007 2016-04-04 17:51 370
8b1ab1cb sago007 2016-04-04 17:51 371
	}
8b1ab1cb sago007 2016-04-04 17:51 372
public:
8b1ab1cb sago007 2016-04-04 17:51 373
	//Draws everything
8b1ab1cb sago007 2016-04-04 17:51 374
	void DoPaintJob() {
5d5a5e92 Poul Sander 2024-03-06 21:41 375
		const ThemeBorderData& border = globalData.theme.border;
5d5a5e92 Poul Sander 2024-03-06 21:41 376
		sago::SagoSprite backback = globalData.spriteHolder->GetSprite(border.border_sprite);
5d5a5e92 Poul Sander 2024-03-06 21:41 377
		DrawIMG(backback, globalData.screen, this->GetTopX()+border.border_sprite_offset.first, this->GetTopY()+border.border_sprite_offset.second);
5d5a5e92 Poul Sander 2024-03-06 21:41 378
a7226e17 Poul Sander 2025-03-06 20:42 379
		this->scoreLabel.Draw(globalData.screen, this->GetTopX()+border.score_label_offset.first,this->GetTopY()+border.score_label_offset.second, sago::SagoTextField::Alignment::left, sago::SagoTextField::VerticalAlignment::top, &globalData.logicalResize);
a7226e17 Poul Sander 2025-03-06 20:42 380
		this->timeLabel.Draw(globalData.screen, this->GetTopX()+border.time_label_offset.first,this->GetTopY()+border.time_label_offset.second, sago::SagoTextField::Alignment::left, sago::SagoTextField::VerticalAlignment::top, &globalData.logicalResize);
a7226e17 Poul Sander 2025-03-06 20:42 381
		this->chainLabel.Draw(globalData.screen, this->GetTopX()+border.chain_label_offset.first,this->GetTopY()+border.chain_label_offset.second, sago::SagoTextField::Alignment::left, sago::SagoTextField::VerticalAlignment::top, &globalData.logicalResize);
a7226e17 Poul Sander 2025-03-06 20:42 382
		this->speedLabel.Draw(globalData.screen, this->GetTopX()+border.speed_label_offset.first,this->GetTopY()+border.speed_label_offset.second, sago::SagoTextField::Alignment::left, sago::SagoTextField::VerticalAlignment::top, &globalData.logicalResize);
a7226e17 Poul Sander 2025-03-06 20:42 383
		globalData.spriteHolder->GetSprite(globalData.theme.back_board).DrawScaled(globalData.screen, SDL_GetTicks(), this->GetTopX(),this->GetTopY(), BOARD_WIDTH, BOARD_HEIGHT, &globalData.logicalResize);
8b1ab1cb sago007 2016-04-04 17:51 384
8b1ab1cb sago007 2016-04-04 17:51 385
		PaintBricks();
8b1ab1cb sago007 2016-04-04 17:51 386
		if (stageClear) {
a3a8b2b4 Poul Sander 2023-10-15 21:04 387
			DrawImgBoard(globalData.blackLine,  0, bsize*(12+2)+bsize*(stageClearLimit-linesCleared)-pixels-1);
8b1ab1cb sago007 2016-04-04 17:51 388
		}
8b1ab1cb sago007 2016-04-04 17:51 389
		if (puzzleMode&&(!bGameOver)) {
8b1ab1cb sago007 2016-04-04 17:51 390
			//We need to write nr. of moves left!
549ecfae sago007 2016-10-09 08:37 391
			strHolder = _("Moves left: ") + std::to_string(MovesLeft);
810e1c2f sago007 2018-03-28 09:40 392
			static sago::SagoTextField movesPuzzleLabel;
810e1c2f sago007 2018-03-28 09:40 393
			sagoTextSetHelpFont(movesPuzzleLabel);
0b8fb137 sago007 2018-03-31 19:53 394
			movesPuzzleLabel.SetText(strHolder);
a7226e17 Poul Sander 2025-03-06 20:42 395
			movesPuzzleLabel.Draw(globalData.screen, topx+5, topy+5, sago::SagoTextField::Alignment::left, sago::SagoTextField::VerticalAlignment::top, &globalData.logicalResize);
8b1ab1cb sago007 2016-04-04 17:51 396
8b1ab1cb sago007 2016-04-04 17:51 397
		}
8b1ab1cb sago007 2016-04-04 17:51 398
		if (puzzleMode && stageButtonStatus == SBpuzzleMode) {
a3a8b2b4 Poul Sander 2023-10-15 21:04 399
			DrawImgBoard(globalData.bRetry, globalData.cordRetryButton.x, globalData.cordRetryButton.y);
a3a8b2b4 Poul Sander 2023-10-15 21:04 400
			PrintTextCenteredBoard(globalData.cordRetryButton.x, globalData.cordRetryButton.y, buttonRetry);
8b1ab1cb sago007 2016-04-04 17:51 401
			if (getLevel()<PuzzleGetNumberOfPuzzles()-1) {
8b1ab1cb sago007 2016-04-04 17:51 402
				if (hasWonTheGame) {
a3a8b2b4 Poul Sander 2023-10-15 21:04 403
					DrawImgBoard(globalData.bNext, globalData.cordNextButton.x, globalData.cordNextButton.y);
a3a8b2b4 Poul Sander 2023-10-15 21:04 404
					PrintTextCenteredBoard(globalData.cordNextButton.x, globalData.cordNextButton.y, buttonNext);
8b1ab1cb sago007 2016-04-04 17:51 405
				}
8b1ab1cb sago007 2016-04-04 17:51 406
				else {
a3a8b2b4 Poul Sander 2023-10-15 21:04 407
					DrawImgBoard(globalData.bSkip, globalData.cordNextButton.x, globalData.cordNextButton.y);
a3a8b2b4 Poul Sander 2023-10-15 21:04 408
					PrintTextCenteredBoard(globalData.cordNextButton.x, globalData.cordNextButton.y, buttonSkip);
8b1ab1cb sago007 2016-04-04 17:51 409
				}
8b1ab1cb sago007 2016-04-04 17:51 410
			}
8b1ab1cb sago007 2016-04-04 17:51 411
			else {
810e1c2f sago007 2018-03-28 09:40 412
				static sago::SagoTextField lastPuzzleLabel;
810e1c2f sago007 2018-03-28 09:40 413
				sagoTextSetHelpFont(lastPuzzleLabel);
810e1c2f sago007 2018-03-28 09:40 414
				lastPuzzleLabel.SetText(_("Last puzzle"));
a7226e17 Poul Sander 2025-03-06 20:42 415
				lastPuzzleLabel.Draw(globalData.screen, topx+5, topy+5, sago::SagoTextField::Alignment::left, sago::SagoTextField::VerticalAlignment::top, &globalData.logicalResize);
8b1ab1cb sago007 2016-04-04 17:51 416
			}
8b1ab1cb sago007 2016-04-04 17:51 417
		}
8b1ab1cb sago007 2016-04-04 17:51 418
		if (stageClear && stageButtonStatus == SBstageClear) {
a3a8b2b4 Poul Sander 2023-10-15 21:04 419
			DrawImgBoard(globalData.bRetry, globalData.cordRetryButton.x, globalData.cordRetryButton.y);
a3a8b2b4 Poul Sander 2023-10-15 21:04 420
			PrintTextCenteredBoard(globalData.cordRetryButton.x, globalData.cordRetryButton.y, buttonRetry);
8b1ab1cb sago007 2016-04-04 17:51 421
			if (getLevel()<50-1) {
8b1ab1cb sago007 2016-04-04 17:51 422
				if (hasWonTheGame) {
a3a8b2b4 Poul Sander 2023-10-15 21:04 423
					DrawImgBoard(globalData.bNext, globalData.cordNextButton.x, globalData.cordNextButton.y);
a3a8b2b4 Poul Sander 2023-10-15 21:04 424
					PrintTextCenteredBoard(globalData.cordNextButton.x, globalData.cordNextButton.y, buttonNext);
8b1ab1cb sago007 2016-04-04 17:51 425
				}
8b1ab1cb sago007 2016-04-04 17:51 426
				else {
a3a8b2b4 Poul Sander 2023-10-15 21:04 427
					DrawImgBoard(globalData.bSkip, globalData.cordNextButton.x, globalData.cordNextButton.y);
a3a8b2b4 Poul Sander 2023-10-15 21:04 428
					PrintTextCenteredBoard(globalData.cordNextButton.x, globalData.cordNextButton.y, buttonSkip);
8b1ab1cb sago007 2016-04-04 17:51 429
				}
8b1ab1cb sago007 2016-04-04 17:51 430
			}
8b1ab1cb sago007 2016-04-04 17:51 431
			else {
810e1c2f sago007 2018-03-28 09:40 432
				static sago::SagoTextField lastStageLabel;
810e1c2f sago007 2018-03-28 09:40 433
				sagoTextSetHelpFont(lastStageLabel);
810e1c2f sago007 2018-03-28 09:40 434
				lastStageLabel.SetText(_("Last stage"));
a7226e17 Poul Sander 2025-03-06 20:42 435
				lastStageLabel.Draw(globalData.screen, topx+5, topy+5, sago::SagoTextField::Alignment::left, sago::SagoTextField::VerticalAlignment::top, &globalData.logicalResize);
8b1ab1cb sago007 2016-04-04 17:51 436
			}
8b1ab1cb sago007 2016-04-04 17:51 437
		}
e8d66c68 sago007 2016-07-12 17:32 438
		if (!bGameOver && stop > 20) {
0b8fb137 sago007 2018-03-31 19:53 439
			stopIntField.SetText(std::to_string(stop/10));
a7226e17 Poul Sander 2025-03-06 20:42 440
			stopIntField.Draw(globalData.screen, 240+topx, -40+topy, sago::SagoTextField::Alignment::left, sago::SagoTextField::VerticalAlignment::top, &globalData.logicalResize);
e8d66c68 sago007 2016-07-12 17:32 441
		}
8b1ab1cb sago007 2016-04-04 17:51 442
8b1ab1cb sago007 2016-04-04 17:51 443
#if DEBUG
8b1ab1cb sago007 2016-04-04 17:51 444
		if (AI_Enabled&&(!bGameOver)) {
e7e189c7 sago007 2018-03-31 15:30 445
			sagoTextSetBlueFont(aiStatusField);
549ecfae sago007 2016-10-09 08:37 446
			strHolder = "AI_status: " + std::to_string(AIstatus)+ ", "+ std::to_string(AIlineToClear);
0b8fb137 sago007 2018-03-31 19:53 447
			aiStatusField.SetText(strHolder);
a7226e17 Poul Sander 2025-03-06 20:42 448
			aiStatusField.Draw(globalData.screen, topx+5, topy+5, sago::SagoTextField::Alignment::left, sago::SagoTextField::VerticalAlignment::top, &globalData.logicalResize);
8b1ab1cb sago007 2016-04-04 17:51 449
		}
8b1ab1cb sago007 2016-04-04 17:51 450
#endif
8b1ab1cb sago007 2016-04-04 17:51 451
		if (!bGameOver) {
8b1ab1cb sago007 2016-04-04 17:51 452
			bool touched = false;
8b1ab1cb sago007 2016-04-04 17:51 453
			int mx = 0;
8b1ab1cb sago007 2016-04-04 17:51 454
			int my = 0;
8b1ab1cb sago007 2016-04-04 17:51 455
			this->GetMouseCursor(touched, mx, my);
8b1ab1cb sago007 2016-04-04 17:51 456
			if (touched) {
72383a9e sago007 2016-10-30 11:56 457
				DrawImgBoard(globalData.spriteHolder->GetSprite("touchcursor"),mx*bsize, 11*bsize-my*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 458
			}
8b1ab1cb sago007 2016-04-04 17:51 459
			else {
a3a8b2b4 Poul Sander 2023-10-15 21:04 460
				DrawImgBoard(globalData.cursor,cursorx*bsize,11*bsize-cursory*bsize-pixels);
8b1ab1cb sago007 2016-04-04 17:51 461
			}
8b1ab1cb sago007 2016-04-04 17:51 462
		}
8b1ab1cb sago007 2016-04-04 17:51 463
		if (ticks<gameStartedAt) {
8b1ab1cb sago007 2016-04-04 17:51 464
			int currentCounter = abs((int)ticks-(int)gameStartedAt)/1000;
72383a9e sago007 2016-10-30 11:56 465
			if ( (currentCounter!=lastCounter) && (globalData.SoundEnabled)&&(!globalData.NoSound)) {
a3a8b2b4 Poul Sander 2023-10-15 21:04 466
				Mix_PlayChannel(1, globalData.counterChunk.get(), 0);
8b1ab1cb sago007 2016-04-04 17:51 467
			}
8b1ab1cb sago007 2016-04-04 17:51 468
			lastCounter = currentCounter;
8b1ab1cb sago007 2016-04-04 17:51 469
			switch (currentCounter) {
8b1ab1cb sago007 2016-04-04 17:51 470
			case 2:
a3a8b2b4 Poul Sander 2023-10-15 21:04 471
				DrawImgBoard(globalData.counter[2],  2*bsize, 5*bsize);
8b1ab1cb sago007 2016-04-04 17:51 472
				break;
8b1ab1cb sago007 2016-04-04 17:51 473
			case 1:
a3a8b2b4 Poul Sander 2023-10-15 21:04 474
				DrawImgBoard(globalData.counter[1],  2*bsize, 5*bsize);
8b1ab1cb sago007 2016-04-04 17:51 475
				break;
8b1ab1cb sago007 2016-04-04 17:51 476
			case 0:
a3a8b2b4 Poul Sander 2023-10-15 21:04 477
				DrawImgBoard(globalData.counter[0],  2*bsize, 5*bsize);
8b1ab1cb sago007 2016-04-04 17:51 478
				break;
8b1ab1cb sago007 2016-04-04 17:51 479
			default:
8b1ab1cb sago007 2016-04-04 17:51 480
				break;
8b1ab1cb sago007 2016-04-04 17:51 481
			}
8b1ab1cb sago007 2016-04-04 17:51 482
		}
8b1ab1cb sago007 2016-04-04 17:51 483
		else {
72383a9e sago007 2016-10-30 11:56 484
			if (globalData.SoundEnabled&&(!globalData.NoSound)&&(timetrial)&&(ticks>gameStartedAt+10000)&&(!bGameOver)) {
8b1ab1cb sago007 2016-04-04 17:51 485
				int currentCounter = (ticks-(int)gameStartedAt)/1000;
8b1ab1cb sago007 2016-04-04 17:51 486
				if (currentCounter!=lastCounter) {
8b1ab1cb sago007 2016-04-04 17:51 487
					if (currentCounter>115 && currentCounter<120) {
a3a8b2b4 Poul Sander 2023-10-15 21:04 488
						Mix_PlayChannel(1, globalData.counterChunk.get(), 0);
8b1ab1cb sago007 2016-04-04 17:51 489
					}
8b1ab1cb sago007 2016-04-04 17:51 490
				}
8b1ab1cb sago007 2016-04-04 17:51 491
				lastCounter = currentCounter;
8b1ab1cb sago007 2016-04-04 17:51 492
			}
8b1ab1cb sago007 2016-04-04 17:51 493
			else {
72383a9e sago007 2016-10-30 11:56 494
				if ( (0==lastCounter) && (globalData.SoundEnabled)&&(!globalData.NoSound)) {
a3a8b2b4 Poul Sander 2023-10-15 21:04 495
					Mix_PlayChannel(1, globalData.counterFinalChunk.get(), 0);
8b1ab1cb sago007 2016-04-04 17:51 496
				}
8b1ab1cb sago007 2016-04-04 17:51 497
				lastCounter = -1;
8b1ab1cb sago007 2016-04-04 17:51 498
			}
8b1ab1cb sago007 2016-04-04 17:51 499
		}
8b1ab1cb sago007 2016-04-04 17:51 500
2c6a4bae sago007 2018-05-11 15:20 501
		if (bGameOver) {
8b1ab1cb sago007 2016-04-04 17:51 502
			if (hasWonTheGame) {
a7226e17 Poul Sander 2025-03-06 20:42 503
				globalData.tbWinner.Draw(globalData.screen, topx+150, topy+200, sago::SagoTextField::Alignment::center, &globalData.logicalResize);
8b1ab1cb sago007 2016-04-04 17:51 504
			}
8b1ab1cb sago007 2016-04-04 17:51 505
			else {
8b1ab1cb sago007 2016-04-04 17:51 506
				if (bDraw) {
a7226e17 Poul Sander 2025-03-06 20:42 507
					globalData.tbDraw.Draw(globalData.screen, topx+150, topy+200, sago::SagoTextField::Alignment::center, &globalData.logicalResize);
8b1ab1cb sago007 2016-04-04 17:51 508
				}
8b1ab1cb sago007 2016-04-04 17:51 509
				else {
5d601060 Poul Sander 2023-10-26 21:00 510
					if (this->infostring.empty()) {
a7226e17 Poul Sander 2025-03-06 20:42 511
						globalData.tbGameOver.Draw(globalData.screen, topx+150, topy+200, sago::SagoTextField::Alignment::center, &globalData.logicalResize);
5d601060 Poul Sander 2023-10-26 21:00 512
					}
8b1ab1cb sago007 2016-04-04 17:51 513
				}
8b1ab1cb sago007 2016-04-04 17:51 514
			}
8b1ab1cb sago007 2016-04-04 17:51 515
		}
43e3097e Poul Sander 2023-10-22 08:50 516
5d601060 Poul Sander 2023-10-26 21:00 517
		std::string strHolder;
5d601060 Poul Sander 2023-10-26 21:00 518
		strHolder = std::to_string(this->GetScore()+this->GetHandicap());
5d601060 Poul Sander 2023-10-26 21:00 519
		player_score.SetText(strHolder);
a7226e17 Poul Sander 2025-03-06 20:42 520
		player_score.Draw(globalData.screen, this->GetTopX()+border.score_label_offset.first,this->GetTopY()+border.score_label_offset.second+22, sago::SagoTextField::Alignment::left, sago::SagoTextField::VerticalAlignment::top, &globalData.logicalResize);
5d601060 Poul Sander 2023-10-26 21:00 521
		if (this->GetAIenabled()) {
5d601060 Poul Sander 2023-10-26 21:00 522
			player_name.SetText(_("AI"));
5d601060 Poul Sander 2023-10-26 21:00 523
		}
5d601060 Poul Sander 2023-10-26 21:00 524
		else {
5d601060 Poul Sander 2023-10-26 21:00 525
			player_name.SetText(name);
5d601060 Poul Sander 2023-10-26 21:00 526
		}
a7226e17 Poul Sander 2025-03-06 20:42 527
		player_name.Draw(globalData.screen, this->GetTopX()+10,this->GetTopY()-34, sago::SagoTextField::Alignment::left, sago::SagoTextField::VerticalAlignment::top, &globalData.logicalResize);
5d601060 Poul Sander 2023-10-26 21:00 528
		if (this->isTimeTrial()) {
5d601060 Poul Sander 2023-10-26 21:00 529
			int tid = (int)SDL_GetTicks()-this->GetGameStartedAt();
5d601060 Poul Sander 2023-10-26 21:00 530
			int minutes;
5d601060 Poul Sander 2023-10-26 21:00 531
			int seconds;
5d601060 Poul Sander 2023-10-26 21:00 532
			if (tid>=0) {
5d601060 Poul Sander 2023-10-26 21:00 533
				minutes = (2*60*1000-(abs((int)SDL_GetTicks()-(int)this->GetGameStartedAt())))/60/1000;
5d601060 Poul Sander 2023-10-26 21:00 534
				seconds = ((2*60*1000-(abs((int)SDL_GetTicks()-(int)this->GetGameStartedAt())))%(60*1000))/1000;
5d601060 Poul Sander 2023-10-26 21:00 535
			}
5d601060 Poul Sander 2023-10-26 21:00 536
			else {
5d601060 Poul Sander 2023-10-26 21:00 537
				minutes = ((abs((int)SDL_GetTicks()-(int)this->GetGameStartedAt())))/60/1000;
5d601060 Poul Sander 2023-10-26 21:00 538
				seconds = (((abs((int)SDL_GetTicks()-(int)this->GetGameStartedAt())))%(60*1000))/1000;
5d601060 Poul Sander 2023-10-26 21:00 539
			}
5d601060 Poul Sander 2023-10-26 21:00 540
			if (this->isGameOver()) {
5d601060 Poul Sander 2023-10-26 21:00 541
				minutes=0;
5d601060 Poul Sander 2023-10-26 21:00 542
			}
5d601060 Poul Sander 2023-10-26 21:00 543
			if (this->isGameOver()) {
5d601060 Poul Sander 2023-10-26 21:00 544
				seconds=0;
5d601060 Poul Sander 2023-10-26 21:00 545
			}
5d601060 Poul Sander 2023-10-26 21:00 546
			if (seconds>9) {
5d601060 Poul Sander 2023-10-26 21:00 547
				strHolder = std::to_string(minutes)+":"+std::to_string(seconds);
5d601060 Poul Sander 2023-10-26 21:00 548
			}
5d601060 Poul Sander 2023-10-26 21:00 549
			else {
5d601060 Poul Sander 2023-10-26 21:00 550
				strHolder = std::to_string(minutes)+":0"+std::to_string(seconds);
5d601060 Poul Sander 2023-10-26 21:00 551
			}
5d601060 Poul Sander 2023-10-26 21:00 552
			player_time.SetText(strHolder);
5d601060 Poul Sander 2023-10-26 21:00 553
		}
5d601060 Poul Sander 2023-10-26 21:00 554
		else {
5d601060 Poul Sander 2023-10-26 21:00 555
			int minutes = ((abs((int)SDL_GetTicks()-(int)this->GetGameStartedAt())))/60/1000;
5d601060 Poul Sander 2023-10-26 21:00 556
			int seconds = (((abs((int)SDL_GetTicks()-(int)this->GetGameStartedAt())))%(60*1000))/1000;
5d601060 Poul Sander 2023-10-26 21:00 557
			if (this->isGameOver()) {
5d601060 Poul Sander 2023-10-26 21:00 558
				minutes=(this->GetGameEndedAt()/1000/60)%100;
5d601060 Poul Sander 2023-10-26 21:00 559
			}
5d601060 Poul Sander 2023-10-26 21:00 560
			if (this->isGameOver()) {
5d601060 Poul Sander 2023-10-26 21:00 561
				seconds=(this->GetGameEndedAt()/1000)%60;
5d601060 Poul Sander 2023-10-26 21:00 562
			}
5d601060 Poul Sander 2023-10-26 21:00 563
			if (seconds>9) {
5d601060 Poul Sander 2023-10-26 21:00 564
				strHolder = std::to_string(minutes)+":"+std::to_string(seconds);
5d601060 Poul Sander 2023-10-26 21:00 565
			}
5d601060 Poul Sander 2023-10-26 21:00 566
			else {
5d601060 Poul Sander 2023-10-26 21:00 567
				strHolder = std::to_string(minutes)+":0"+std::to_string(seconds);
5d601060 Poul Sander 2023-10-26 21:00 568
			}
5d601060 Poul Sander 2023-10-26 21:00 569
			player_time.SetText(strHolder);
5d601060 Poul Sander 2023-10-26 21:00 570
		}
a7226e17 Poul Sander 2025-03-06 20:42 571
		player_time.Draw(globalData.screen, this->GetTopX()+border.time_label_offset.first,this->GetTopY()+border.time_label_offset.second+22, sago::SagoTextField::Alignment::left, sago::SagoTextField::VerticalAlignment::top, &globalData.logicalResize);
5d601060 Poul Sander 2023-10-26 21:00 572
		strHolder = std::to_string(this->GetChains());
5d601060 Poul Sander 2023-10-26 21:00 573
		player_chain.SetText(strHolder);
a7226e17 Poul Sander 2025-03-06 20:42 574
		player_chain.Draw(globalData.screen, this->GetTopX()+border.chain_label_offset.first,this->GetTopY()+border.chain_label_offset.second+22, sago::SagoTextField::Alignment::left, sago::SagoTextField::VerticalAlignment::top, &globalData.logicalResize);
5d601060 Poul Sander 2023-10-26 21:00 575
		//drawspeedLevel:
5d601060 Poul Sander 2023-10-26 21:00 576
		strHolder = std::to_string(this->GetSpeedLevel());
5d601060 Poul Sander 2023-10-26 21:00 577
		player_speed.SetText(strHolder);
a7226e17 Poul Sander 2025-03-06 20:42 578
		player_speed.Draw(globalData.screen, this->GetTopX()+border.speed_label_offset.first,this->GetTopY()+border.speed_label_offset.second+22, sago::SagoTextField::Alignment::left, sago::SagoTextField::VerticalAlignment::top, &globalData.logicalResize);
5d601060 Poul Sander 2023-10-26 21:00 579
		if ((this->isStageClear()) &&(this->GetTopY()+700+50*(this->GetStageClearLimit()-this->GetLinesCleared())-this->GetPixels()-1<600+this->GetTopY())) {
5d601060 Poul Sander 2023-10-26 21:00 580
			oldBubleX = this->GetTopX()+280;
5d601060 Poul Sander 2023-10-26 21:00 581
			oldBubleY = this->GetTopY()+650+50*(this->GetStageClearLimit()-this->GetLinesCleared())-this->GetPixels()-1;
5d601060 Poul Sander 2023-10-26 21:00 582
			DrawIMG(globalData.stageBobble,globalData.screen,this->GetTopX()+280,this->GetTopY()+650+50*(this->GetStageClearLimit()-this->GetLinesCleared())-this->GetPixels()-1);
5d601060 Poul Sander 2023-10-26 21:00 583
		}
5d601060 Poul Sander 2023-10-26 21:00 584
5d601060 Poul Sander 2023-10-26 21:00 585
		if (infostring.length() > 0) {
5d601060 Poul Sander 2023-10-26 21:00 586
			static sago::SagoTextBox infoBox;
5d601060 Poul Sander 2023-10-26 21:00 587
			static sago::SagoTextField objectiveField;
5d601060 Poul Sander 2023-10-26 21:00 588
			static sago::SagoTextField gametypeNameField;
5d601060 Poul Sander 2023-10-26 21:00 589
			sagoTextSetHelpFont(infoBox);
5d601060 Poul Sander 2023-10-26 21:00 590
			infoBox.SetMaxWidth(290);
5d601060 Poul Sander 2023-10-26 21:00 591
			infoBox.SetText(infostring);
5d601060 Poul Sander 2023-10-26 21:00 592
			sagoTextSetHelpFont(objectiveField);
5d601060 Poul Sander 2023-10-26 21:00 593
			objectiveField.SetText(_("Objective:"));
5d601060 Poul Sander 2023-10-26 21:00 594
			sagoTextSetHelpFont(gametypeNameField);
5d601060 Poul Sander 2023-10-26 21:00 595
			gametypeNameField.SetText(infostringName);
a7226e17 Poul Sander 2025-03-06 20:42 596
			gametypeNameField.Draw(globalData.screen, this->GetTopX()+7,this->GetTopY()+10, sago::SagoTextField::Alignment::left, sago::SagoTextField::VerticalAlignment::top, &globalData.logicalResize);
a7226e17 Poul Sander 2025-03-06 20:42 597
			objectiveField.Draw(globalData.screen, this->GetTopX()+7, this->GetTopY()+160, sago::SagoTextField::Alignment::left, sago::SagoTextField::VerticalAlignment::top, &globalData.logicalResize);
a7226e17 Poul Sander 2025-03-06 20:42 598
			infoBox.Draw(globalData.screen, this->GetTopX()+7, this->GetTopY()+160+32, sago::SagoTextField::Alignment::left, &globalData.logicalResize);
5d601060 Poul Sander 2023-10-26 21:00 599
5d601060 Poul Sander 2023-10-26 21:00 600
			int y = this->GetTopY()+400;
5d601060 Poul Sander 2023-10-26 21:00 601
			static sago::SagoTextBox controldBox;
5d601060 Poul Sander 2023-10-26 21:00 602
			controldBox.SetHolder(&globalData.spriteHolder->GetDataHolder());
5d601060 Poul Sander 2023-10-26 21:00 603
			sagoTextSetHelpFont(controldBox);
5d601060 Poul Sander 2023-10-26 21:00 604
			controldBox.SetMaxWidth(290);
5d601060 Poul Sander 2023-10-26 21:00 605
			controldBox.SetText(controldBoxText);
a7226e17 Poul Sander 2025-03-06 20:42 606
			controldBox.Draw(globalData.screen, this->GetTopX()+7,y, sago::SagoTextField::Alignment::left, &globalData.logicalResize);
5d601060 Poul Sander 2023-10-26 21:00 607
		}
8b1ab1cb sago007 2016-04-04 17:51 608
	}
8b1ab1cb sago007 2016-04-04 17:51 609
5d601060 Poul Sander 2023-10-26 21:00 610
	sago::SagoTextField player_name;
5d601060 Poul Sander 2023-10-26 21:00 611
	sago::SagoTextField player_time;
5d601060 Poul Sander 2023-10-26 21:00 612
	sago::SagoTextField player_score;
5d601060 Poul Sander 2023-10-26 21:00 613
	sago::SagoTextField player_chain;
5d601060 Poul Sander 2023-10-26 21:00 614
	sago::SagoTextField player_speed;
43e3097e Poul Sander 2023-10-22 08:50 615
5d601060 Poul Sander 2023-10-26 21:00 616
	//Old Stage Clear Buble
9a9a96ab Poul Sander 2024-10-15 20:25 617
	int oldBubleX = 0;
9a9a96ab Poul Sander 2024-10-15 20:25 618
	int oldBubleY = 0;
43e3097e Poul Sander 2023-10-22 08:50 619
5d601060 Poul Sander 2023-10-26 21:00 620
	std::string infostring;
5d601060 Poul Sander 2023-10-26 21:00 621
	std::string infostringName;
5d601060 Poul Sander 2023-10-26 21:00 622
	std::string controldBoxText;
dc7f7fbd Poul Sander 2023-10-22 12:26 623
43e3097e Poul Sander 2023-10-22 08:50 624
8b1ab1cb sago007 2016-04-04 17:51 625
private:
9a9a96ab Poul Sander 2024-10-15 20:25 626
	int topx = 0;
9a9a96ab Poul Sander 2024-10-15 20:25 627
	int topy = 0;
343fbe43 sago007 2018-03-27 19:53 628
	sago::SagoTextField scoreLabel;
343fbe43 sago007 2018-03-27 19:53 629
	sago::SagoTextField timeLabel;
343fbe43 sago007 2018-03-27 19:53 630
	sago::SagoTextField chainLabel;
343fbe43 sago007 2018-03-27 19:53 631
	sago::SagoTextField speedLabel;
871ce5d6 sago007 2018-03-28 12:36 632
	sago::SagoTextField buttonSkip;
871ce5d6 sago007 2018-03-28 12:36 633
	sago::SagoTextField buttonRetry;
871ce5d6 sago007 2018-03-28 12:36 634
	sago::SagoTextField buttonNext;
fc338170 sago007 2018-03-28 14:31 635
	sago::SagoTextField stopIntField;
e7e189c7 sago007 2018-03-31 15:30 636
#if DEBUG
e7e189c7 sago007 2018-03-31 15:30 637
	sago::SagoTextField aiStatusField;
e7e189c7 sago007 2018-03-31 15:30 638
#endif
8b1ab1cb sago007 2016-04-04 17:51 639
};
8b1ab1cb sago007 2016-04-04 17:51 640
8b1ab1cb sago007 2016-04-04 17:51 641
1970-01-01 00:00 642