Source Code (Use browser search to find items of interest.)

Class Index

ksmiletris'GameWidget (./kdegames/ksmiletris/gamewidget.h:37)

class GameWidget : public QWidget {
	Q_OBJECT

signals:
	void changedStats(int, int);
	void gameOver();

public:
	bool in_game, in_pause;
	bool do_sounds;
	int num_level;
	int num_points;

	GameWidget(QWidget *parent=0, const char *name=0);
	~GameWidget();

	void setPieces(PiecesType type);

	Sprite& ref(int x, int y) {
		return map[y*scr_width + x];
	}

	Sprite type(Sprite s) {
		if (s >= Sprite_Broken1 && s < Sprite_Broken1 + num_blocks)
			return (Sprite)(Sprite_Block1 + s - Sprite_Broken1);
		return s;
	}

	void repaintChilds();

private:
	QPixmap *sprites;
	ScreenWidget *screen;
	MirrorWidget *mirror;
	NextPieceWidget *next;
	int xpos, ypos;
	Sprite piece[4];
	Sprite *map;
	Sprite *mirror_sprites;
	Sprite next_piece[4];
	Sprite bg_sprite;
	int timer_interval;
	bool fast_mode;
	QTimer *timer;
	KRandomSequence random;

	int num_pieces_level;

	void playSound(Sound s);
	void loadSprites();
	void loadSprite(Sprite spr, const char *path);
	void loadMaskedSprite(Sprite spr, const char *path1, const char *path2);
	void newBlock();
	void putPiece();
	void getPiece();
	void newPiece();
	void nextPiece();
	void compact();
	void broke(int x, int y, bool *xmap);
	void recBroke(int x, int y, bool *xmap);
	void checkSolePiece(int x, int y, bool *xmap);
	void checkPiece(int x, int y);
	void blockPiece();
	void updateMirror();

public slots:
	void newGame();
	void keyUp();
	void keyDown();
	void keyLeft();
	void keyRight();
	void keySpace();
	void timeout();
};

ksmiletris'GameWidget::GameWidget() (./kdegames/ksmiletris/gamewidget.cpp:48)

GameWidget::GameWidget(QWidget *parent, const char *name)
        : QWidget(parent, name)
{
	in_game = false;
	in_pause = false;

	random.setSeed(0);

	QAccel *accel = new QAccel(this);
	accel->connectItem(accel->insertItem(Key_Up), this, SLOT(keyUp()));
	accel->connectItem(accel->insertItem(Key_Down), this, SLOT(keyDown()));
	accel->connectItem(accel->insertItem(Key_Left), this, SLOT(keyLeft()));
	accel->connectItem(accel->insertItem(Key_Right), this, SLOT(keyRight()));
	accel->connectItem(accel->insertItem(Key_Space), this, SLOT(keySpace()));

	loadSprites();
	setPieces(Pieces_Smiles);

	map = new Sprite[scr_width * scr_height];
	mirror_sprites = new Sprite[scr_width];

	screen = new ScreenWidget(sprites, &in_game, &in_pause, this);
	screen->move(10, 10);
	screen->setScreenSprites(map);

	mirror = new MirrorWidget(sprites, &in_game, &in_pause, this);
	mirror->move(10, 407);
	mirror->setMirrorSprites(mirror_sprites);

	next = new NextPieceWidget(sprites, &in_game, &in_pause, this);
	next->move(278, 10);
	next->setNextPieceSprites(next_piece);

	timer = new QTimer(this);
	connect(timer, SIGNAL(timeout()), this, SLOT(timeout()));
}


ksmiletris'GameWidget::~GameWidget() (./kdegames/ksmiletris/gamewidget.cpp:85)

GameWidget::~GameWidget()
{
	delete [] sprites;
	delete [] map;
	delete [] mirror_sprites;
}


ksmiletris'GameWidget::playSound() (./kdegames/ksmiletris/gamewidget.cpp:92)

void GameWidget::playSound(Sound s)
{
	if (!do_sounds)
		return;

	QString name;
	switch (s) {
	case Sound_Break:
		name = "break.wav";
		break;
	case Sound_Clear:
		name = "clear.wav";
		break;
	}

	KAudioPlayer::play(locate("data", QString("ksmiletris/sounds/") + name));
}


ksmiletris'GameWidget::setPieces() (./kdegames/ksmiletris/gamewidget.cpp:110)

void GameWidget::setPieces(PiecesType type)
{
	QString prefix;

	switch (type) {
	case Pieces_Smiles:
		prefix = "block-a";
		loadSprite(Sprite_Cleared, "cleared-a.bmp");
		break;
	case Pieces_Symbols:
		prefix = "block-b";
		loadSprite(Sprite_Cleared, "cleared-b.bmp");
		break;
	case Pieces_Icons:
		prefix = "block-c";
		loadSprite(Sprite_Cleared, "cleared-c.bmp");
	}

	for (int i = 0; i < num_blocks; ++i) {
		QString n;
		n.setNum(i + 1);
		loadSprite((Sprite)(Sprite_Block1 + i), prefix + n + ".bmp");
	}
	QPixmap pm(32, 32);
	for (int i = 0; i < num_blocks; ++i) {
		QPainter p;
		p.begin(&pm);
		p.drawPixmap(0, 0, sprites[Sprite_Block1 + i]);
		p.drawPixmap(0, 0, sprites[Sprite_Broken]);
		p.end();
		sprites[Sprite_Broken1 + i] = pm;
	}

	if (in_game) repaintChilds();
}


ksmiletris'GameWidget::loadSprites() (./kdegames/ksmiletris/gamewidget.cpp:146)

void GameWidget::loadSprites()
{
	sprites = new QPixmap[num_sprites];
	loadSprite(Sprite_Bg1, "bg1.bmp");
	loadSprite(Sprite_Bg2, "bg2.bmp");
	loadSprite(Sprite_Bg3, "bg3.bmp");
	loadSprite(Sprite_Bg4, "bg4.bmp");
	loadSprite(Sprite_Bg5, "bg5.bmp");
	loadSprite(Sprite_Bg6, "bg6.bmp");
	loadSprite(Sprite_Bg7, "bg7.bmp");
	loadSprite(Sprite_Bg8, "bg8.bmp");
	loadSprite(Sprite_Bg9, "bg9.bmp");
	loadSprite(Sprite_Bg10, "bg10.bmp");
	loadSprite(Sprite_Bg11, "bg11.bmp");
	loadSprite(Sprite_Bg12, "bg12.bmp");
	loadSprite(Sprite_Bg13, "bg13.bmp");
	loadSprite(Sprite_Bg14, "bg14.bmp");
	loadSprite(Sprite_Bg15, "bg15.bmp");
	loadSprite(Sprite_Bg16, "bg16.bmp");
	loadMaskedSprite(Sprite_Broken, "broken.bmp", "broken-mask.bmp");
}


ksmiletris'GameWidget::loadSprite() (./kdegames/ksmiletris/gamewidget.cpp:168)

void GameWidget::loadSprite(Sprite spr, const char *path)
{
	if (!sprites[spr].load(locate("appdata", QString("data/") + path)))
		fatal("Cannot open data files.\nHave you correctly installed KSmiletris?");
}


ksmiletris'GameWidget::loadMaskedSprite() (./kdegames/ksmiletris/gamewidget.cpp:174)

void GameWidget::loadMaskedSprite(Sprite spr, const char *path1, const char *path2)
{
	QBitmap bmp;
	if (!sprites[spr].load(locate("appdata", QString("data/") + path1)))
		fatal("Cannot open data files.\nHave you correctly installed KSmiletris?");
	if (!bmp.load(locate("appdata", QString("data/") + path2)))
		fatal("Cannot open data files.\nHave you correctly installed KSmiletris?");
	sprites[spr].setMask(bmp);
}


ksmiletris'GameWidget::newGame() (./kdegames/ksmiletris/gamewidget.cpp:184)

void GameWidget::newGame()
{
	in_pause = false;
	fast_mode = false;

	num_level = 1;
	num_pieces_level = 2;
	num_points = 0;

	bg_sprite = (Sprite)(Sprite_Bg1 + random.getLong(num_bgs));
	screen->setBackgroundSprite(bg_sprite);
	mirror->setBackgroundSprite(bg_sprite);
	next->setBackgroundSprite(bg_sprite);
	for (int i = 0; i < scr_width; ++i)
		mirror_sprites[i] = bg_sprite;
	for (int i = 0; i < 4; ++i)
		next_piece[i] = bg_sprite;
	for (int y = 0; y < scr_height; ++y)
		for (int x = 0; x < scr_width; ++x)
			ref(x, y) = bg_sprite;

	newPiece();
	nextPiece();
	updateMirror();

	in_game = true;
	repaintChilds();
	emit changedStats(num_level, num_points);
	timer_interval = 700;
	timer->start(timer_interval);
}


ksmiletris'GameWidget::repaintChilds() (./kdegames/ksmiletris/gamewidget.cpp:216)

void GameWidget::repaintChilds()
{
	screen->repaint(false);
	mirror->repaint(false);
	next->repaint(false);
}


ksmiletris'GameWidget::putPiece() (./kdegames/ksmiletris/gamewidget.cpp:223)

void GameWidget::putPiece()
{
	if (piece[0] != bg_sprite) ref(xpos + 0, ypos + 0) = piece[0];
	if (piece[1] != bg_sprite) ref(xpos + 1, ypos + 0) = piece[1];
	if (piece[2] != bg_sprite) ref(xpos + 0, ypos + 1) = piece[2];
	if (piece[3] != bg_sprite) ref(xpos + 1, ypos + 1) = piece[3];
	updateMirror();
	screen->repaint(false);
}


ksmiletris'GameWidget::getPiece() (./kdegames/ksmiletris/gamewidget.cpp:233)

void GameWidget::getPiece()
{
	if (piece[0] != bg_sprite) ref(xpos + 0, ypos + 0) = bg_sprite;
	if (piece[1] != bg_sprite) ref(xpos + 1, ypos + 0) = bg_sprite;
	if (piece[2] != bg_sprite) ref(xpos + 0, ypos + 1) = bg_sprite;
	if (piece[3] != bg_sprite) ref(xpos + 1, ypos + 1) = bg_sprite;
}


ksmiletris'GameWidget::newPiece() (./kdegames/ksmiletris/gamewidget.cpp:241)

void GameWidget::newPiece()
{
	static int pieces[][4] = {{1, 0, 1, 1},
				  {1, 1, 1, 0},
				  {1, 1, 0, 1},
				  {0, 1, 1, 1}};
	int p = random.getLong(4);
	for (int i = 0; i < 4; ++i)
		if (pieces[p][i])
			next_piece[i] = (Sprite)(Sprite_Block1 + random.getLong(num_pieces_level));
		else
			next_piece[i] = bg_sprite;
	next->repaint(false);
}


ksmiletris'GameWidget::nextPiece() (./kdegames/ksmiletris/gamewidget.cpp:256)

void GameWidget::nextPiece()
{
	piece[0] = next_piece[0];
	piece[1] = next_piece[1];
	piece[2] = next_piece[2];
	piece[3] = next_piece[3];
	newPiece();
	xpos = (scr_width - 2) / 2;
	ypos = 0;
	if ((piece[0] != bg_sprite && ref(xpos + 0, ypos + 0) != bg_sprite)
	 || (piece[1] != bg_sprite && ref(xpos + 1, ypos + 0) != bg_sprite)
	 || (piece[2] != bg_sprite && ref(xpos + 0, ypos + 1) != bg_sprite)
	 || (piece[3] != bg_sprite && ref(xpos + 1, ypos + 1) != bg_sprite)) {
		in_game = false;
		repaintChilds();
		QMessageBox::information(this, kapp->caption(),
					 i18n("Game Over"), i18n("OK"));
		emit gameOver();
	}

	putPiece();
}


ksmiletris'GameWidget::updateMirror() (./kdegames/ksmiletris/gamewidget.cpp:279)

void GameWidget::updateMirror()
{
	for (int x = 0; x < scr_width; ++x)
		mirror_sprites[x] = bg_sprite;
	mirror_sprites[xpos] = piece[2] == bg_sprite ? piece[0] : piece[2];
	mirror_sprites[xpos+1] = piece[3] == bg_sprite ? piece[1] : piece[3];
	mirror->repaint(false);
}


ksmiletris'GameWidget::keyUp() (./kdegames/ksmiletris/gamewidget.cpp:288)

void GameWidget::keyUp()
{
	if (!in_game || in_pause) return;

	getPiece();
	if ((piece[0] == bg_sprite && ref(xpos + 0, ypos + 0) != bg_sprite)
	 || (piece[1] == bg_sprite && ref(xpos + 1, ypos + 0) != bg_sprite)
	 || (piece[2] == bg_sprite && ref(xpos + 0, ypos + 1) != bg_sprite)
	 || (piece[3] == bg_sprite && ref(xpos + 1, ypos + 1) != bg_sprite)) {
		putPiece();
		return;
	}
	 
	Sprite npiece[4];
	npiece[2] = piece[0];
	npiece[0] = piece[1];
	npiece[3] = piece[2];
	npiece[1] = piece[3];
	for (int i = 0; i < 4; ++i)
		piece[i] = npiece[i];
	putPiece();
}


ksmiletris'GameWidget::keyDown() (./kdegames/ksmiletris/gamewidget.cpp:311)

void GameWidget::keyDown()
{
	if (!in_game || in_pause) return;

	getPiece();
	if ((piece[0] == bg_sprite && ref(xpos + 0, ypos + 0) != bg_sprite)
	 || (piece[1] == bg_sprite && ref(xpos + 1, ypos + 0) != bg_sprite)
	 || (piece[2] == bg_sprite && ref(xpos + 0, ypos + 1) != bg_sprite)
         || (piece[3] == bg_sprite && ref(xpos + 1, ypos + 1) != bg_sprite)) {
		putPiece();
		return;
	}

	Sprite npiece[4];
	npiece[0] = piece[2];
	npiece[1] = piece[0];
	npiece[2] = piece[3];
	npiece[3] = piece[1];
	for (int i = 0; i < 4; ++i)
		piece[i] = npiece[i];
	putPiece();
}


ksmiletris'GameWidget::keyLeft() (./kdegames/ksmiletris/gamewidget.cpp:334)

void GameWidget::keyLeft()
{
 	if (!in_game || in_pause || xpos == 0) return;

	getPiece();
	if ((piece[0] != bg_sprite && ref(xpos - 1, ypos + 0) != bg_sprite)
	 || (piece[1] != bg_sprite && ref(xpos + 0, ypos + 0) != bg_sprite)
	 || (piece[2] != bg_sprite && ref(xpos - 1, ypos + 1) != bg_sprite)
         || (piece[3] != bg_sprite && ref(xpos + 0, ypos + 1) != bg_sprite)) {
		putPiece();
		return;
	}

	--xpos;
	putPiece();
}


ksmiletris'GameWidget::keyRight() (./kdegames/ksmiletris/gamewidget.cpp:351)

void GameWidget::keyRight()
{
 	if (!in_game || in_pause || xpos == scr_width - 2) return;

	getPiece();
	if ((piece[0] != bg_sprite && ref(xpos + 1, ypos + 0) != bg_sprite)
	 || (piece[1] != bg_sprite && ref(xpos + 2, ypos + 0) != bg_sprite)
	 || (piece[2] != bg_sprite && ref(xpos + 1, ypos + 1) != bg_sprite)
         || (piece[3] != bg_sprite && ref(xpos + 2, ypos + 1) != bg_sprite)) {
		putPiece();
		return;
	}

	++xpos;
	putPiece();
}


ksmiletris'GameWidget::keySpace() (./kdegames/ksmiletris/gamewidget.cpp:368)

void GameWidget::keySpace()
{
	if (!in_game || in_pause || fast_mode) return;
	fast_mode = true;
	timer->changeInterval(50);
}


ksmiletris'GameWidget::broke() (./kdegames/ksmiletris/gamewidget.cpp:375)

void GameWidget::broke(int x, int y, bool *xmap)
{
	xmap[y*scr_width + x] = true;
	if (ref(x, y) >= Sprite_Broken1) {
		// Clear the piece
		playSound(Sound_Clear);
		ref(x, y) = Sprite_Cleared;
		num_points += 20;
	} else {
		// Break the piece
		playSound(Sound_Break);
		ref(x, y) = (Sprite)(Sprite_Broken1 + ref(x, y) - Sprite_Block1);
		num_points += 10;
	}
	int level = num_points / 1000 + 1;
	if (level > num_level) {
		num_level = level;
		num_pieces_level = (num_level/2 + 2) > num_blocks ?
			num_blocks : num_level/2 + 2;
		timer_interval = timer_interval - 25;
		if (timer_interval < 50)
			timer_interval = 50;
		timer->changeInterval(timer_interval);
	}

	emit changedStats(num_level, num_points);

#ifdef HAVE_USLEEP
	screen->repaint(false);
	usleep(75 * 1000);
#endif
}


ksmiletris'GameWidget::recBroke() (./kdegames/ksmiletris/gamewidget.cpp:408)

void GameWidget::recBroke(int x, int y, bool *xmap)
{
	int t = type(ref(x, y));

	broke(x, y, xmap);
	// X-1, Y
	if (x > 0 && !xmap[y*scr_width + x - 1] && type(ref(x-1, y)) == t)
		recBroke(x-1, y, xmap);
	// X+1, Y
	if (x < scr_width-1 && !xmap[y*scr_width + x + 1] && type(ref(x+1, y)) == t)
		recBroke(x+1, y, xmap);
	// X, Y-1
	if (y > 0 && !xmap[(y-1)*scr_width + x] && type(ref(x, y-1)) == t)
		recBroke(x, y-1, xmap);
	// X, Y+1
	if (y < scr_height-1 && !xmap[(y+1)*scr_width + x] && type(ref(x, y+1)) == t)
		recBroke(x, y+1, xmap);

	// X-1, Y+1
	if (x > 0 && y < scr_height-1 && !xmap[(y+1)*scr_width + x - 1] && type(ref(x-1, y+1)) == t)
		recBroke(x-1, y+1, xmap);
	// X+1, Y+1
	if (x < scr_width-1 && y < scr_height-1 && !xmap[(y+1)*scr_width + x + 1] && type(ref(x+1, y+1)) == t)
		recBroke(x+1, y+1, xmap);
	// X-1, Y-1
	if (x > 0 && y > 0 && !xmap[(y-1)*scr_width + x - 1] && type(ref(x-1, y-1)) == t)
		recBroke(x-1, y-1, xmap);
	// X+1, Y-1
	if (x < scr_width-1 && y > 0 && !xmap[(y-1)*scr_width + x + 1] && type(ref(x+1, y-1)) == t)
		recBroke(x+1, y-1, xmap);
}


ksmiletris'GameWidget::checkSolePiece() (./kdegames/ksmiletris/gamewidget.cpp:440)

void GameWidget::checkSolePiece(int x, int y, bool *xmap)
{
	if (y < scr_height-1 && type(ref(x, y+1)) == type(ref(x, y)))
		recBroke(x, y, xmap);
}


ksmiletris'GameWidget::checkPiece() (./kdegames/ksmiletris/gamewidget.cpp:446)

void GameWidget::checkPiece(int x, int y)
{
	bool xmap[scr_width * scr_height];
	for (int yy = 0; yy < scr_height; ++yy)
		for (int x = 0; x < scr_width; ++x)
			xmap[yy*scr_width + x] = false;
	checkSolePiece(x, y, xmap);
}


ksmiletris'GameWidget::compact() (./kdegames/ksmiletris/gamewidget.cpp:455)

void GameWidget::compact()
{
 recheck:
	bool moved = true;
	while (moved) {
		moved = false;
		for (int x = 0; x < scr_width; ++x)
			for (int y = scr_height - 1; y > 0; --y)
				if (ref(x, y) == bg_sprite
				 || ref(x, y) == Sprite_Cleared) {
					int i;
					for (i = y-1; i >= 0; --i)
						if (ref(x, i) != bg_sprite
						&&  ref(x, i) != Sprite_Cleared) {
							ref(x, y) = ref(x, i);
							ref(x, i) = bg_sprite;
							moved = true;
							checkPiece(x, y);
							goto recheck;
							break;
						}
					if (i < 0)
						ref(x, y) = bg_sprite;
				}
	}			
}


ksmiletris'GameWidget::blockPiece() (./kdegames/ksmiletris/gamewidget.cpp:482)

void GameWidget::blockPiece()
{
	if (fast_mode) {
		timer->changeInterval(timer_interval);
		fast_mode = false;
	}	
	putPiece();
	bool xmap[scr_width * scr_height];
	for (int yy = 0; yy < scr_height; ++yy)
		for (int x = 0; x < scr_width; ++x)
			xmap[yy*scr_width + x] = false;
	if (piece[2] != bg_sprite)
		checkSolePiece(xpos, ypos+1, xmap);
	if (piece[3] != bg_sprite)
		checkSolePiece(xpos+1, ypos+1, xmap);
	if (piece[2] == bg_sprite)
		checkSolePiece(xpos, ypos, xmap);
	if (piece[3] == bg_sprite)
		checkSolePiece(xpos+1, ypos, xmap);
	compact();
	nextPiece();
}


ksmiletris'GameWidget::timeout() (./kdegames/ksmiletris/gamewidget.cpp:505)

void GameWidget::timeout()
{
	if (!in_game || in_pause)
		return;

	getPiece();
	if (ypos == scr_height - 2) {
		blockPiece();
		return;
	}

	if ((piece[0] != bg_sprite && ref(xpos + 0, ypos + 1) != bg_sprite)
	 || (piece[1] != bg_sprite && ref(xpos + 1, ypos + 1) != bg_sprite)
	 || (piece[2] != bg_sprite && ref(xpos + 0, ypos + 2) != bg_sprite)
         || (piece[3] != bg_sprite && ref(xpos + 1, ypos + 2) != bg_sprite))
		blockPiece();
	else {
		++ypos;
		putPiece();
	}

}