00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "Tile.h"
00021 #include "../Util/STL_Helper.h"
00022
00023 using namespace Game;
00024
00025 MovementEffect::MovementEffect(Sint16 x_, Sint16 y_, bool relMotion) :
00026 x(x_),
00027 y(y_),
00028 motionIsRelative(relMotion)
00029 { }
00030
00031 Sint16 MovementEffect::getXchange() const {
00032 return x;
00033 }
00034
00035 Sint16 MovementEffect::getYchange() const {
00036 return y;
00037 }
00038
00039 bool MovementEffect::isRelative() const{
00040 return motionIsRelative;
00041 }
00042
00043 SingleImageTile::SingleImageTile() :
00044 img(NULL)
00045 {}
00046
00047 SingleImageTile::SingleImageTile(Graphics::AbstractImage * image) {
00048 setImage(image);
00049 }
00050
00051 SingleImageTile::~SingleImageTile() {
00052 delete img;
00053 img = NULL;
00054 }
00055
00056 void SingleImageTile::drawAt(SDL_Surface * screen, SDL_Rect *loc) {
00057 img->drawAt(screen,loc);
00058 }
00059
00060 AbstractTile::AbstractTile() :
00061 currentlyOccupied(false)
00062 { }
00063
00064 AbstractTile::~AbstractTile() { }
00065
00066 void AbstractTile::deOccupy() {
00067 currentlyOccupied = false;
00068 }
00069
00070 void AbstractTile::occupy() {
00071 currentlyOccupied = true;
00072 }
00073
00074 bool AbstractTile::isOccupied() const {
00075 return currentlyOccupied;
00076 }
00077
00078 AbstractTile* IndestructibleTile::dynCopy() const {
00079 IndestructibleTile* newTile = new IndestructibleTile;
00080 newTile->img=img->dynCopyImage();
00081
00082 return newTile;
00083 }
00084
00085 AbstractTile* PassableTile::dynCopy() const {
00086 PassableTile* newTile = new PassableTile;
00087 newTile->img=img->dynCopyImage();
00088 return newTile;
00089 }
00090
00091 Parse::Parser* SingleImageTile::makeParserToParseMe(std::istream &input) {
00092 Parse::SimpleParser* parser = new Parse::SimpleParser(input);
00093 parser->addAction("image", new Graphics::ReadImage(img));
00094 return parser;
00095 }
00096
00097 void SingleImageTile::setImage(Graphics::AbstractImage *image) {
00098 delete img;
00099 img = image;
00100 }
00101
00102 bool IndestructibleTile::isPassable() const{
00103 return false;
00104 }
00105
00106 bool PassableTile::isPassable() const{
00107 if (isOccupied()) return false;
00108 return true;
00109 }
00110
00111 ExplodableTile::ExplodableTile() :
00112 hasExploded(false),
00113 bombedImage(NULL),
00114 unbombedImage(NULL)
00115 {}
00116
00117 AbstractTile* ExplodableTile::dynCopy() const {
00118 ExplodableTile* newTile = new ExplodableTile;
00119 newTile->bombedImage = bombedImage->dynCopyImage();
00120 newTile->unbombedImage = unbombedImage->dynCopyImage();
00121 return newTile;
00122 }
00123
00124 void ExplodableTile::drawAt(SDL_Surface *screen, SDL_Rect *loc) {
00125 if (hasExploded) bombedImage->drawAt(screen, loc);
00126 else unbombedImage->drawAt(screen,loc);
00127 }
00128
00129 Parse::Parser* ExplodableTile::makeParserToParseMe(std::istream &input) {
00130 Parse::SimpleParser* parser = new Parse::SimpleParser(input);
00131 parser->addAction("BombedImage", new Graphics::ReadImage(bombedImage));
00132 parser->addAction("UnbombedImage", new Graphics::ReadImage(unbombedImage));
00133 return parser;
00134 }
00135
00136 bool ExplodableTile::isPassable() const {
00137 if (isOccupied()) return false;
00138 return hasExploded;
00139 }
00140
00141 void ExplodableTile::hitWithExplosion() {
00142 hasExploded = true;
00143
00144 }
00145
00146 ExplodableTile::~ExplodableTile() {
00147 delete unbombedImage;
00148 delete bombedImage;
00149 }
00150
00151 ConveyorTile::ConveyorTile() :
00152 img(NULL),
00153 xSpeed(0),
00154 ySpeed(0)
00155 { }
00156
00157 ConveyorTile::~ConveyorTile() {
00158 delete img;
00159 }
00160
00161 bool ConveyorTile::isPassable() const {
00162 return (!isOccupied());
00163 }
00164
00165 MovementEffect ConveyorTile::effect(MoveableItem& m) {
00166 return MovementEffect(xSpeed, ySpeed, true);
00167 }
00168
00169 void ConveyorTile::drawAt(SDL_Surface* surf, SDL_Rect* loc) {
00170 img->drawAt(surf, loc);
00171 }
00172
00173 AbstractTile* ConveyorTile::dynCopy() const {
00174 ConveyorTile* tile = new ConveyorTile(*this);
00175 tile->img = img->dynCopyImage();
00176 return tile;
00177 }
00178
00179 Parse::Parser* ConveyorTile::makeParserToParseMe(std::istream& in) {
00180 Parse::Parser* parser = new Parse::SimpleParser(in);
00181
00182 parser->addAction("image", new Graphics::ReadImage(img));
00183 parser->addAction("xspeed", new Parse::StdRead<Sint16>(xSpeed));
00184 parser->addAction("yspeed", new Parse::StdRead<Sint16>(ySpeed));
00185
00186 return parser;
00187 }
00188
00189 SlipperyTile::SlipperyTile() :
00190 front(NULL),
00191 back(NULL)
00192 { }
00193
00194 SlipperyTile::~SlipperyTile() {
00195 delete front;
00196 delete back;
00197 }
00198
00199 Parse::Parser* SlipperyTile::makeParserToParseMe(std::istream& in) {
00200 Parse::SimpleParser* p= new Parse::SimpleParser(in);
00201 p->addAction("front", new Graphics::ReadImage(front));
00202 p->addAction("back", new Graphics::ReadImage(back));
00203 return p;
00204 }
00205
00206 void SlipperyTile::drawAt(SDL_Surface* surf, SDL_Rect* loc) {
00207 if (back != NULL) back->drawAt(surf, loc);
00208 front->drawAt(surf, loc);
00209 }
00210
00211 MovementEffect SlipperyTile::effect(MoveableItem& m) {
00212 if (m.getDirection() != Game::NO_DIRECTION) m.lockMovement();
00213 return MovementEffect(0,0);
00214 }
00215
00216 bool SlipperyTile::isPassable() const {
00217 return !isOccupied();
00218 }
00219
00220 AbstractTile* SlipperyTile::dynCopy() const {
00221 SlipperyTile* n = new SlipperyTile();
00222 n->front = front->dynCopyImage();
00223 n->back = back->dynCopyImage();
00224 return n;
00225 }
00226
00227 TileSetReader::TileSetReader()
00228
00229
00230 { }
00231
00232 TileSetReader::~TileSetReader() {
00233 Util::freeDynamicContainer(tileVec);
00234 }
00235
00236 int TileSetReader::numTiles() const {
00237 return (int) tileVec.size();
00238 }
00239
00240 MovementEffect AbstractTile::effect(MoveableItem& item) {
00241 item.unlockMovement();
00242 return MovementEffect(0,0, false);
00243 }
00244
00245 Game::AbstractTile* TileSetReader::copyTile(int index) const {
00246 validateIndex(index);
00247 return tileVec[index]->dynCopy();
00248 }
00249
00250 Game::AbstractTile* TileSetReader::getTile(int index) {
00251 validateIndex(index);
00252 return tileVec[index];
00253 }
00254
00255 void TileSetReader::validateIndex(int index) const {
00256 if ((index >= (int) tileVec.size() || index < 0)) {
00257 throw Util::GeneralException("Tile index " + Util::toString(index) + " out of range ", __FILE__, __LINE__);
00258 } else if (tileVec[index] == NULL) {
00259 throw Util::GeneralException("Tile index " + Util::toString(index)
00260 + " has no actual corresponding tile ", __FILE__, __LINE__);
00261 }
00262 }
00263
00264 Parse::Parser* TileSetReader::makeParserToParseMe(std::istream& in) {
00265 Parse::SimpleParser *parser = new Parse::SimpleParser(in);
00266
00267 parser->addAction("BombableTile",
00268 new Parse::NaturalVectorParser<AbstractTile, ExplodableTile>(tileVec));
00269 parser->addAction("Conveyor",
00270 new Parse::NaturalVectorParser<AbstractTile, ConveyorTile>(tileVec));
00271 parser->addAction("PassableTile",
00272 new Parse::NaturalVectorParser<AbstractTile, PassableTile>(tileVec));
00273 parser->addAction("SlipperyTile",
00274 new Parse::NaturalVectorParser<AbstractTile, SlipperyTile>(tileVec));
00275 parser->addAction("UnbombableTile",
00276 new Parse::NaturalVectorParser<AbstractTile, IndestructibleTile>(tileVec));
00277
00278 return parser;
00279 }
00280