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