You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdegames/ksnake/level.cpp

153 lines
3.3 KiB

/**
* Copyright Michel Filippi <mfilippi@sade.rhein-main.de>
* Robert Williams
* Andrew Chant <andrew.chant@utoronto.ca>
* André Luiz dos Santos <andre@netvision.com.br>
* Benjamin Meyer <ben+ksnake@meyerhome.net>
*
* This file is part of the ksnake package
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include <qbitmap.h>
#include <qimage.h>
#include "level.h"
#include "board.h"
#include "bitmaps.h"
#include "levels.h"
const uchar *numbers[10] = { zero_bits, one_bits, two_bits,
three_bits, four_bits, five_bits,
six_bits, seven_bits, eight_bits, nine_bits
};
Level::Level(Board *b)
{
board = b;
create(Intro);
}
void Level::nextLevel()
{
if (level < leV->max())
level++;
}
void Level::create(Img img)
{
switch(img){
case Banner:
createBanner();
break;
case Room:
createRoom();
break;
case Intro:
makeImageFromData(intro_bits);
break;
case GameOver:
makeImageFromData(gameover_bits);
break;
}
}
void Level::createRoom()
{
QImage image = leV->getImage(level);
initBoard(image);
}
void Level::makeImageFromData(const uchar *buf)
{
QBitmap bitmap(BoardWidth, BoardWidth, buf, true);
QImage image = bitmap.convertToImage();
initBoard (image);
}
void Level::initBoard(const QImage &image)
{
int index = 0;
uchar *b;
for ( int y = 0;y < image.height();y++ ) {
b = image.scanLine(y);
for ( int x = 0;x < image.width();x++ ) {
if ( image.bitOrder() == QImage::BigEndian ) {
if (((*b >> (7 - (x & 7))) & 1) == 1)
board->set(index, brick);
else board->set(index, empty);
} else {
if (((*b >> (x & 7)) & 1) == 1)
board->set(index, brick);
else board->set(index, empty);
}
if ( (x & 7) == 7 )
b++;
index++;
}
}
}
void Level::createBanner()
{
makeImageFromData(level_bits);
QString num;
num.setNum(level);
if(level < 10)
num.insert(0,'0');
QString left = num.left(1);
QString right = num.right(1);
drawNumber ( 606, numbers[left.toInt()] );
drawNumber ( 614, numbers[right.toInt()] );
}
void Level::drawNumber(int beginAt, const uchar *buf)
{
QBitmap bitmap(7, 9, buf, true);
QImage image = bitmap.convertToImage();
int index = beginAt;
uchar *b;
for ( int y = 0;y < image.height();y++ )
{
b = image.scanLine(y);
for ( int x = 0;x < image.width();x++ )
{
if ( image.bitOrder() == QImage::BigEndian )
{
if (((*b >> (7 - (x & 7))) & 1) == 1)
board->set(index, brick);
} else {
if (((*b >> (x & 7)) & 1) == 1)
board->set(index, brick);
}
if ( (x & 7) == 7 )
b++;
index++;
}
index += 28;
}
}