diff options
59 files changed, 1018 insertions, 958 deletions
@@ -1,3 +1,36 @@ +2005-10-09 Bjørn Lindeijer <bjorn@lindeijer.nl> + + * src/being.cpp, src/being.h, src/engine.cpp, src/engine.h, + src/floor_item.cpp, src/floor_item.h, src/map.cpp, src/map.h, + src/sprite.h: Made Sprite into an interface implemented by both + FloorItem and Being, which hook themselves into the map on + construction. The improved fringe layer is working as expected now. + * src/equipment.cpp, src/equipment.h, src/game.cpp, src/game.h, + src/graphics.cpp, src/guichanfwd.h, src/inventory.h, + src/openglgraphics.cpp, src/sound.cpp, src/gui/chargedialog.cpp, + src/gui/chargedialog.h, src/gui/chat.cpp, src/gui/chat.h, + src/gui/equipmentwindow.cpp, src/gui/equipmentwindow.h, + src/gui/gui.cpp, src/gui/help.cpp, src/gui/inventorywindow.cpp, + src/gui/item_amount.cpp, src/gui/itemcontainer.cpp, + src/gui/itemcontainer.h, src/gui/linkhandler.h, src/gui/login.cpp, + src/gui/menuwindow.cpp, src/gui/newskill.cpp, src/gui/npc_text.cpp, + src/gui/popupmenu.cpp, src/gui/popupmenu.h, src/gui/progressbar.cpp, + src/gui/progressbar.h, src/gui/scrollarea.cpp, src/gui/scrollarea.h, + src/gui/skill.cpp, src/gui/status.cpp, src/gui/trade.h, + src/gui/window.cpp, src/gui/window.h, src/net/messagein.cpp, + src/net/packet.cpp, src/net/packet.h, src/resources/image.cpp, + src/resources/image.h, src/resources/iteminfo.cpp, + src/resources/iteminfo.h, src/resources/music.cpp, + src/resources/music.h, src/resources/soundeffect.cpp, + src/resources/soundeffect.h: Made sure TMW compiles without warnings + even when using "-Wconversion -Wshadow -Wcast-qual -Wwrite-strings + -ansi -pedantic", lots of cleanups. + * src/data/maps/new_3-1.tmx.gz, src/graphics/tiles/desert_x2.png, + src/graphics/tiled/desert_x3.png: Added two new small tilesets that + contain the desert tiles that are twice and three times the height of + a normal tile. One well in new_3-1 has been converted to use the new + double tiles for testing purposes. + 2005-10-06 Bjørn Lindeijer <bjorn@lindeijer.nl> * src/being.cpp: Modified finding NPC as by timonator's suggestion in diff --git a/src/Makefile.am b/src/Makefile.am index 25f60cf7..bef31080 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -123,7 +123,6 @@ tmw_SOURCES = graphic/spriteset.cpp \ resources/image.h \ resources/imagewriter.cpp \ resources/imagewriter.h \ - resources/iteminfo.cpp \ resources/iteminfo.h \ resources/itemmanager.cpp \ resources/itemmanager.h \ diff --git a/src/being.cpp b/src/being.cpp index 5cdd8c01..9f9c7834 100644 --- a/src/being.cpp +++ b/src/being.cpp @@ -45,12 +45,41 @@ extern Being* autoTarget; extern std::map<int, Spriteset*> monsterset; +// From main.cpp +extern Spriteset *hairset; +extern Spriteset *playerset; + +// From engine.cpp +extern Spriteset *emotionset; +extern Spriteset *npcset; +extern Spriteset *weaponset; + Being *player_node = NULL; std::list<Being*> beings; -PATH_NODE::PATH_NODE(Uint16 x, Uint16 y): - x(x), y(y) +char hairtable[16][4][2] = { + // S(x,y) W(x,y) N(x,y) E(x,y) + { { 0, 0}, {-1, 2}, {-1, 2}, { 0, 2} }, // STAND + { { 0, 2}, {-2, 3}, {-1, 2}, { 1, 3} }, // WALK 1st frame + { { 0, 3}, {-2, 4}, {-1, 3}, { 1, 4} }, // WALK 2nd frame + { { 0, 1}, {-2, 2}, {-1, 2}, { 1, 2} }, // WALK 3rd frame + { { 0, 2}, {-2, 3}, {-1, 2}, { 1, 3} }, // WALK 4th frame + { { 0, 1}, { 1, 2}, {-1, 3}, {-2, 2} }, // ATTACK 1st frame + { { 0, 1}, {-1, 2}, {-1, 3}, { 0, 2} }, // ATTACK 2nd frame + { { 0, 2}, {-4, 3}, { 0, 4}, { 3, 3} }, // ATTACK 3rd frame + { { 0, 2}, {-4, 3}, { 0, 4}, { 3, 3} }, // ATTACK 4th frame + { { 0, 0}, {-1, 2}, {-1, 2}, {-1, 2} }, // BOW_ATTACK 1st frame + { { 0, 0}, {-1, 2}, {-1, 2}, {-1, 2} }, // BOW_ATTACK 2nd frame + { { 0, 0}, {-1, 2}, {-1, 2}, {-1, 2} }, // BOW_ATTACK 3rd frame + { { 0, 0}, {-1, 2}, {-1, 2}, {-1, 2} }, // BOW_ATTACK 4th frame + { { 0, 4}, {-1, 6}, {-1, 6}, { 0, 6} }, // SIT + { { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0} }, // ?? HIT + { { 0, 16}, {-1, 6}, {-1, 6}, { 0, 6} } // DEAD +}; + +PATH_NODE::PATH_NODE(Uint16 iX, Uint16 iY): + x(iX), y(iY) { } @@ -161,16 +190,15 @@ void sort() { Being::Being(): job(0), x(0), y(0), direction(SOUTH), - action(0), frame(0), + action(0), mFrame(0), speech_color(0), walk_time(0), speed(150), emotion(0), emotion_time(0), - text_x(0), text_y(0), aspd(350), - m_weapon(0), - m_id(0), - map(0), + mWeapon(0), + mId(0), + mMap(NULL), hairStyle(1), hairColor(1), speech_time(0), damage_time(0), @@ -181,24 +209,25 @@ Being::Being(): Being::~Being() { clearPath(); + setMap(NULL); } void Being::setDestination(Uint16 destX, Uint16 destY) { - if (!map) - return; - - setPath(map->findPath(x, y, destX, destY)); + if (mMap) + { + setPath(mMap->findPath(x, y, destX, destY)); + } } void Being::clearPath() { - path.clear(); + mPath.clear(); } void Being::setPath(std::list<PATH_NODE> path) { - this->path = path; + mPath = path; if (action != WALK && action != DEAD) { @@ -257,21 +286,33 @@ void Being::setDamage(Sint16 amount, Uint32 time) void Being::setMap(Map *map) { - this->map = map; + // Remove sprite from potential previous map + if (mMap != NULL) + { + mMap->removeSprite(mSpriteIterator); + } + + mMap = map; + + // Add sprite to potential new map + if (mMap != NULL) + { + mSpriteIterator = mMap->addSprite(this); + } } void Being::nextStep() { - frame = 0; + mFrame = 0; - if (path.empty()) + if (mPath.empty()) { action = STAND; return; } - PATH_NODE node = path.front(); - path.pop_front(); + PATH_NODE node = mPath.front(); + mPath.pop_front(); if (node.x > x) { if (node.y > y) direction = SE; @@ -296,57 +337,74 @@ void Being::nextStep() void Being::logic() { - if (get_elapsed_time(speech_time) > 5000) { + // Determine whether speech should still be displayed + if (get_elapsed_time(speech_time) > 5000) + { showSpeech = false; } - if (get_elapsed_time(damage_time) > 3000) { - showDamage = false; - } - if (getType() != PLAYER) + // Determine whether damange should still be displayed + if (get_elapsed_time(damage_time) > 3000) { - return; + showDamage = false; } - switch (action) { - case WALK: - frame = (get_elapsed_time(walk_time) * 4) / speed; - if (frame >= 4) { - nextStep(); - } - break; - case ATTACK: - frame = (get_elapsed_time(walk_time) * 4) / aspd; - if (frame >= 4) { - nextStep(); - if (autoTarget && this == player_node) { - attack(autoTarget); + // Execute next walk or attack command for players + if (getType() == PLAYER) + { + switch (action) { + case WALK: + mFrame = (get_elapsed_time(walk_time) * 4) / speed; + if (mFrame >= 4) { + nextStep(); + } + break; + case ATTACK: + mFrame = (get_elapsed_time(walk_time) * 4) / aspd; + if (mFrame >= 4) { + nextStep(); + if (autoTarget && this == player_node) { + attack(autoTarget); + } } + break; + } + + if (emotion != 0) + { + emotion_time--; + if (emotion_time == 0) { + emotion = 0; } - break; + } } - if (emotion != 0) { - emotion_time--; - if (emotion_time == 0) { - emotion = 0; - } + // Update pixel coordinates + mPx = x * 32; + mPy = y * 32; + + if (getType() == PLAYER || getType() == MONSTER) + { + mPy += getYOffset(); + mPx += getXOffset(); } } -void Being::drawSpeech(Graphics *graphics) +void Being::drawSpeech(Graphics *graphics, Sint32 offsetX, Sint32 offsetY) { + int px = mPx + offsetX; + int py = mPy + offsetY; + // Draw speech above this being - if (showSpeech) { + if (showSpeech) + { graphics->setFont(speechFont); - graphics->drawText(speech, - text_x + 18, text_y - 60, - gcn::Graphics::CENTER); - - // Backing to default font - graphics->setFont(gui->getFont()); + graphics->drawText(speech, px + 18, py - 60, gcn::Graphics::CENTER); } - if (showDamage) { + + // Draw damage above this being + if (showDamage) + { // Selecting the right color if (damage == "miss") { @@ -361,28 +419,23 @@ void Being::drawSpeech(Graphics *graphics) graphics->setFont(hitRedFont); } - int textX = 0; - int textY = 0; - if (getType() == PLAYER) { - textX = 16; - textY = 70; - } - else { - textX = 60; - textY = 0; - } + int textY = (getType() == PLAYER) ? 70 : 32; graphics->drawText(damage, - text_x + textX, - text_y - textY - get_elapsed_time(damage_time) / 100, - gcn::Graphics::CENTER); + px + 16, + py - textY - get_elapsed_time(damage_time) / 100, + gcn::Graphics::CENTER); + } - // Backing to default font - graphics->setFont(gui->getFont()); + // Draw player name + if (getType() == PLAYER && this != player_node) + { + graphics->setFont(speechFont); + graphics->drawText(mName, px + 15, py + 30, gcn::Graphics::CENTER); } } -Being::Type Being::getType() +Being::Type Being::getType() const { if (job < 10) { return PLAYER; @@ -395,11 +448,6 @@ Being::Type Being::getType() } } -void Being::setWeapon(Uint16 weapon) -{ - m_weapon = weapon; -} - void Being::setWeaponById(Uint16 weapon) { switch (weapon) @@ -430,7 +478,154 @@ void Being::setWeaponById(Uint16 weapon) } } -void Being::setId(Uint32 id) +int +Being::getXOffset() const +{ + int offset = 0; + + if (action == WALK) + { + if (direction != NORTH && direction != SOUTH) + { + offset = (get_elapsed_time(walk_time) * 32) / speed; + if (offset > 32) offset = 32; + + if (direction == WEST || direction == NW || direction == SW) { + offset = -offset; + offset += 32; + } + else { + offset -= 32; + } + } + } + + return offset; +} + +int +Being::getYOffset() const +{ + int offset = 0; + + if (action == WALK) + { + if (direction != EAST && direction != WEST) + { + offset = (get_elapsed_time(walk_time) * 32) / speed; + if (offset > 32) offset = 32; + + if (direction == NORTH || direction == NW || direction == NE) { + offset = -offset; + offset += 32; + } + else { + offset -= 32; + } + } + } + + return offset; +} + +void +Being::draw(Graphics *graphics, int offsetX, int offsetY) { - m_id = id; + unsigned char dir = direction / 2; + int px = mPx + offsetX; + int py = mPy + offsetY; + int frame; + + switch (getType()) + { + case PLAYER: + if (action == SIT || action == DEAD) + { + frame = 0; + } + + frame = mFrame + action; + + if (action == ATTACK && getWeapon() > 0) + { + frame += 4 * (getWeapon() - 1); + } + + graphics->drawImage(playerset->spriteset[frame + 16 * dir], + px - 16, py - 32); + + if (getWeapon() != 0 && action == ATTACK) + { + Image *image = weaponset->spriteset[ + 16 * (getWeapon() - 1) + 4 * mFrame + dir]; + + graphics->drawImage(image, px - 64, py - 80); + } + + if (getHairColor() <= NR_HAIR_COLORS) + { + int hf = getHairColor() - 1 + 10 * (dir + 4 * + (getHairStyle() - 1)); + + graphics->drawImage(hairset->spriteset[hf], + px - 2 + 2 * hairtable[frame][dir][0], + py - 50 + 2 * hairtable[frame][dir][1]); + } + + if (emotion != 0) + { + graphics->drawImage(emotionset->spriteset[emotion - 1], + px + 3, py - 90); + } + break; + + case NPC: + graphics->drawImage(npcset->spriteset[job - 100], px - 8, py - 52); + break; + + case MONSTER: + if (mFrame >= 4) + { + mFrame = 3; + } + + px -= 42; + py -= 65; + + frame = mFrame + action; + + if (action == MONSTER_DEAD) + { + graphics->drawImage( + monsterset[job - 1002]->spriteset[dir + 4 * MONSTER_DEAD], + px + 30, py + 40); + } + else + { + graphics->drawImage( + monsterset[job-1002]->spriteset[dir + 4 * frame], + px + 30, py + 40); + + /* + if (x == mouseTileX && y == mouseTileY) + { + graphics->drawImage(attackTarget, px + 30 + 16, py + 32); + } + */ + } + + if (action != STAND) + { + mFrame = (get_elapsed_time(walk_time) * 4) / speed; + + if (mFrame >= 4 && action != MONSTER_DEAD) + { + nextStep(); + } + } + break; + + default: + break; + } } diff --git a/src/being.h b/src/being.h index 07b12232..d5ec7fab 100644 --- a/src/being.h +++ b/src/being.h @@ -28,22 +28,27 @@ #include <string> #include <SDL_types.h> +#include "sprite.h" +#include "map.h" + #define NR_HAIR_STYLES 5 #define NR_HAIR_COLORS 10 class Map; class Graphics; -struct PATH_NODE { +struct PATH_NODE +{ /** * Constructor. */ PATH_NODE(unsigned short x, unsigned short y); - unsigned short x, y; + unsigned short x; + unsigned short y; }; -class Being +class Being : public Sprite { public: enum Type { @@ -61,7 +66,7 @@ class Being MONSTER_DEAD = 9, SIT = 13, HIT = 14, - DEAD = 15, + DEAD = 15 }; enum Direction { @@ -73,20 +78,19 @@ class Being NORTH = 4, NE = 5, EAST = 6, - SE = 7, + SE = 7 }; Uint16 job; /**< Job (player job, npc, monster, ) */ Uint16 x, y; /**< Tile coordinates */ Uint8 direction; /**< Facing direction */ Uint8 action; - Uint8 frame; + Uint8 mFrame; Sint32 speech_color; Uint16 walk_time; Uint16 speed; Uint8 emotion; /**< Currently showing emotion */ Uint8 emotion_time; /**< Time until emotion disappears */ - Uint32 text_x, text_y; // temp solution to fix speech position Uint16 aspd; /**< Attack speed */ @@ -175,88 +179,147 @@ class Being /** * Draws the speech text above the being. */ - void drawSpeech(Graphics *graphics); + void drawSpeech(Graphics *graphics, Sint32 offsetX, Sint32 offsetY); /** * Returns the type of the being. */ - Type getType(); + Type getType() const; // ACCES METHODS /** - * get the weapon picture id. + * Gets the weapon picture id. */ - Uint16 getWeapon() { return m_weapon; } + Uint16 getWeapon() const { return mWeapon; } /** - * get the sprite id. + * Gets the sprite id. */ - Uint32 getId() { return m_id; } + Uint32 getId() const { return mId; } // MODIFICATION METHODS /** - * set the weapon picture id. + * Sets the weapon picture id. * - * @param weapon : the picture id + * @param weapon the picture id */ - void setWeapon(Uint16 weapon); + void + setWeapon(Uint16 weapon) { mWeapon = weapon; } /** - * set the weapon picture id with the weapon id. + * Sets the weapon picture id with the weapon id. * - * @param weapon : the weapon id + * @param weapon the weapon id */ void setWeaponById(Uint16 weapon); /** - * set the sprite id. + * Sets the sprite id. */ - void setId(Uint32 id); + void + setId(Uint32 id) { mId = id; } /** - * Set the map the being is on + * Sets the map the being is on */ void setMap(Map *map); + // SPRITE METHODS + + /** + * Draws this being to the given graphics context. + * + * @see Sprite::draw(Graphics, int, int) + */ + void + draw(Graphics *graphics, Sint32 offsetX, Sint32 offsetY); + + /** + * Returns the pixel X coordinate. + */ + int + getPixelX() const { return mPx; } + + /** + * Returns the pixel Y coordinate. + * + * @see Sprite::getPixelY() + */ + int + getPixelY() const { return mPy; } + + /** + * Get the current X pixel offset. + */ + int + getXOffset() const; + + /** + * Get the current Y pixel offset. + */ + int + getYOffset() const; + private: - Uint16 m_weapon; - Uint32 m_id; /**< Unique id */ - Map *map; + /** + * Sets the new path for this being. + */ + void + setPath(std::list<PATH_NODE> path); - std::list<PATH_NODE> path; + Uint16 mWeapon; /**< Weapon picture id */ + Uint32 mId; /**< Unique id */ + Map *mMap; /**< Map on which this being resides */ + std::string mName; /**< Name of character */ + Sprites::iterator mSpriteIterator; + + std::list<PATH_NODE> mPath; std::string speech; std::string damage; Uint16 hairStyle, hairColor; Uint32 speech_time; Uint32 damage_time; bool showSpeech, showDamage; - std::string mName; /**< Name of character */ - - /** - * Sets the new path for this being. - */ - void setPath(std::list<PATH_NODE> path); + Sint32 mPx, mPy; /**< Pixel coordinates */ }; -/** Return a specific id Being */ -Being *findNode(Uint32 id); +/** + * Return a specific id Being + */ +Being* +findNode(Uint32 id); -/** Return a being at specific coordinates */ -Being *findNode(Uint16 x, Uint16 y); +/** + * Return a being at specific coordinates + */ +Being* +findNode(Uint16 x, Uint16 y); -/** Return a being at specific coordinates with specific type*/ -Being *findNode(Uint16 x, Uint16 y, Being::Type type); +/** + * Return a being at specific coordinates with specific type + */ +Being* +findNode(Uint16 x, Uint16 y, Being::Type type); -/** Create a being and add it to the list of beings */ -Being *createBeing(Uint32 id, Uint16 job, Map *map); +/** + * Create a being and add it to the list of beings + */ +Being* +createBeing(Uint32 id, Uint16 job, Map *map); -/** Remove a Being */ -void remove_node(Being *being); +/** + * Remove a Being + */ +void +remove_node(Being *being); -/** Sort beings in vertical order */ -void sort(); +/** + * Sort beings in vertical order + */ +void +sort(); extern Being *player_node; diff --git a/src/engine.cpp b/src/engine.cpp index 4d934504..b7155ebb 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -54,8 +54,8 @@ extern Being *autoTarget; extern Graphics *graphics; extern Minimap *minimap; -extern Spriteset *hairset, *playerset; extern std::list<FloorItem*> floorItems; +extern int frame; char itemCurrenyQ[10] = "0"; int camera_x, camera_y; @@ -65,27 +65,11 @@ gcn::Label *debugInfo; std::map<int, Spriteset*> monsterset; ItemManager *itemDb; /**< Item database object */ -Spriteset *itemset; -char hairtable[16][4][2] = { - // S(x,y) W(x,y) N(x,y) E(x,y) - { { 0, 0}, {-1, 2}, {-1, 2}, { 0, 2} }, // STAND - { { 0, 2}, {-2, 3}, {-1, 2}, { 1, 3} }, // WALK 1st frame - { { 0, 3}, {-2, 4}, {-1, 3}, { 1, 4} }, // WALK 2nd frame - { { 0, 1}, {-2, 2}, {-1, 2}, { 1, 2} }, // WALK 3rd frame - { { 0, 2}, {-2, 3}, {-1, 2}, { 1, 3} }, // WALK 4th frame - { { 0, 1}, { 1, 2}, {-1, 3}, {-2, 2} }, // ATTACK 1st frame - { { 0, 1}, {-1, 2}, {-1, 3}, { 0, 2} }, // ATTACK 2nd frame - { { 0, 2}, {-4, 3}, { 0, 4}, { 3, 3} }, // ATTACK 3rd frame - { { 0, 2}, {-4, 3}, { 0, 4}, { 3, 3} }, // ATTACK 4th frame - { { 0, 0}, {-1, 2}, {-1, 2}, {-1, 2} }, // BOW_ATTACK 1st frame - { { 0, 0}, {-1, 2}, {-1, 2}, {-1, 2} }, // BOW_ATTACK 2nd frame - { { 0, 0}, {-1, 2}, {-1, 2}, {-1, 2} }, // BOW_ATTACK 3rd frame - { { 0, 0}, {-1, 2}, {-1, 2}, {-1, 2} }, // BOW_ATTACK 4th frame - { { 0, 4}, {-1, 6}, {-1, 6}, { 0, 6} }, // SIT - { { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0} }, // ?? HIT - { { 0, 16}, {-1, 6}, {-1, 6}, { 0, 6} } // DEAD -}; +Spriteset *itemset; +Spriteset *emotionset; +Spriteset *npcset; +Spriteset *weaponset; int get_x_offset(Being *being) @@ -240,7 +224,7 @@ void Engine::logic() being->logic(); - if (being->action == Being::MONSTER_DEAD && being->frame >= 20) + if (being->action == Being::MONSTER_DEAD && being->mFrame >= 20) { delete being; beingIterator = beings.erase(beingIterator); @@ -260,17 +244,16 @@ void Engine::draw() int midTileX = graphics->getWidth() / 32 / 2; int midTileY = graphics->getHeight() / 32 / 2; - int map_x = (player_node->x - midTileX) * 32 + get_x_offset(player_node); - int map_y = (player_node->y - midTileY) * 32 + get_y_offset(player_node); - - if (map_x < 0) { - map_x = 0; - } - if (map_y < 0) { - map_y = 0; - } + int map_x = (player_node->x - midTileX) * 32 + player_node->getXOffset(); + int map_y = (player_node->y - midTileY) * 32 + player_node->getYOffset(); if (mCurrentMap) { + if (map_x < 0) { + map_x = 0; + } + if (map_y < 0) { + map_y = 0; + } if (map_x > (mCurrentMap->getWidth() - midTileX) * 32) { map_x = (mCurrentMap->getWidth() - midTileX) * 32; } @@ -288,145 +271,11 @@ void Engine::draw() frame++; - // Draw tiles below nodes + // Draw tiles and sprites if (mCurrentMap != NULL) { mCurrentMap->draw(graphics, map_x, map_y, 0); mCurrentMap->draw(graphics, map_x, map_y, 1); - } - - // Draw nodes - for (std::list<Being*>::iterator i = beings.begin(); i != beings.end(); i++) - { - Being *being = (*i); - - unsigned char dir = being->direction / 2; - int x = being->x * 32 - map_x; - int y = being->y * 32 - map_y; - - int frame; - switch (being->getType()) - { - // Draw a player - case Being::PLAYER: - being->text_x = x + get_x_offset(being); - being->text_y = y + get_y_offset(being); - - if (being->action == Being::SIT || being->action == Being::DEAD) - { - being->frame = 0; - } - - frame = being->frame + being->action; - - if (being->action == Being::ATTACK) - { - if (being->getWeapon() > 0) - frame += 4 * (being->getWeapon() - 1); - } - - graphics->drawImage(playerset->spriteset[frame + 16 * dir], - being->text_x - 16, being->text_y - 32); - - if (being->getWeapon() != 0 && being->action == Being::ATTACK) - { - Image *image = weaponset->spriteset[ - 16 * (being->getWeapon() - 1) + 4 * being->frame + dir]; - - graphics->drawImage(image, - being->text_x - 64, being->text_y - 80); - } - - if (being->getHairColor() <= NR_HAIR_COLORS) - { - int hf = being->getHairColor() - 1 + 10 * (dir + 4 * - (being->getHairStyle() - 1)); - - graphics->drawImage(hairset->spriteset[hf], - being->text_x - 2 + 2 * hairtable[frame][dir][0], - being->text_y - 50 + 2 * hairtable[frame][dir][1]); - } - - if (being->emotion != 0) - { - graphics->drawImage( - emotionset->spriteset[being->emotion - 1], - being->text_x + 3, being->text_y - 90); - } - - if (being != player_node) - { - graphics->setFont(speechFont); - graphics->drawText(being->getName(), - being->text_x + 15, being->text_y + 30, - gcn::Graphics::CENTER); - graphics->setFont(gui->getFont()); - } - break; - - // Draw a NPC - case Being::NPC: - graphics->drawImage(npcset->spriteset[being->job - 100], - x - 8, y - 52); - break; - - // Draw a monster - case Being::MONSTER: - if (being->frame >= 4) - { - being->frame = 3; - } - - being->text_x = x - 42 + get_x_offset(being); - being->text_y = y - 65 + get_y_offset(being); - - frame = being->frame + being->action; - - if (being->action == Being::MONSTER_DEAD) { - graphics->drawImage( - monsterset[being->job - 1002]->spriteset[dir + 4 * Being::MONSTER_DEAD], - being->text_x + 30, being->text_y + 40); - } - else { - graphics->drawImage( - monsterset[being->job-1002]->spriteset[dir + 4 * frame], - being->text_x + 30, being->text_y + 40); - - if (being->x == mouseTileX && being->y == mouseTileY) - { - graphics->drawImage(attackTarget, - being->text_x + 30 + 16, being->text_y + 32); - } - } - - if (being->action != Being::STAND) { - being->frame = - (get_elapsed_time(being->walk_time) * 4) / (being->speed); - - if (being->frame >= 4 && being->action != Being::MONSTER_DEAD) { - being->nextStep(); - } - } - break; - - /* - // Draw a warp (job == 45) - case Being::WARP: - break; - */ - - // No idea how to draw this ;) - default: - break; - } - - // nodes are ordered so if the next being y is > then the - // last drawed for fringe layer, draw the missing lines - } - - // Draw tiles below nodes - if (mCurrentMap != NULL) - { mCurrentMap->draw(graphics, map_x, map_y, 2); } @@ -460,9 +309,7 @@ void Engine::draw() // Draw player speech for (std::list<Being*>::iterator i = beings.begin(); i != beings.end(); i++) { - Being *being = (*i); - - being->drawSpeech(graphics); + (*i)->drawSpeech(graphics, -map_x, -map_y); } if (autoTarget) @@ -470,16 +317,16 @@ void Engine::draw() if (autoTarget->getType() == Being::PLAYER) { graphics->drawText("[TARGET]", - autoTarget->text_x + 15, - autoTarget->text_y - 60, - gcn::Graphics::CENTER); + autoTarget->getPixelX() + 15, + autoTarget->getPixelY() - 60, + gcn::Graphics::CENTER); } else { graphics->drawText("[TARGET]", - autoTarget->text_x + 60, - autoTarget->text_y, - gcn::Graphics::CENTER); + autoTarget->getPixelX() + 60, + autoTarget->getPixelY(), + gcn::Graphics::CENTER); } } diff --git a/src/engine.h b/src/engine.h index 49a307f5..74f2ce9d 100644 --- a/src/engine.h +++ b/src/engine.h @@ -69,7 +69,6 @@ class Engine void draw(); private: - Spriteset *emotionset, *npcset, *weaponset; Map *mCurrentMap; Image *attackTarget; }; diff --git a/src/equipment.cpp b/src/equipment.cpp index 24c20ea4..85b5eda3 100644 --- a/src/equipment.cpp +++ b/src/equipment.cpp @@ -24,17 +24,38 @@ #include "equipment.h" #include "item.h" -Equipment *Equipment::instance = 0; +Equipment *Equipment::mInstance = NULL; Equipment::Equipment(): - arrows(0) + mArrows(NULL) { for (int i = 0; i < EQUIPMENT_SIZE; i++) { - equipment[i] = 0; + mEquipment[i] = NULL; } } Equipment::~Equipment() { } + +Equipment* +Equipment::getInstance() +{ + if (!mInstance) { + mInstance = new Equipment(); + } + + return mInstance; +} + +void +Equipment::removeEquipment(Item *item) +{ + for (int i = 0; i < EQUIPMENT_SIZE; i++) { + if (mEquipment[i] == item) { + mEquipment[i] = 0; + break; + } + } +} diff --git a/src/equipment.h b/src/equipment.h index 4e6cd705..2bb53e42 100644 --- a/src/equipment.h +++ b/src/equipment.h @@ -21,8 +21,10 @@ * $Id$ */ -#ifndef _EQUIPMENT_H -#define _EQUIPMENT_H +#ifndef _TMW_EQUIPMENT_H_ +#define _TMW_EQUIPMENT_H_ + +#include <stdlib.h> class Item; @@ -31,16 +33,45 @@ class Item; class Equipment { public: + /** + * Retrieve an instance of the equipment class. + */ static Equipment* getInstance(); - Item* getEquipment(int index); - void setEquipment(int index, Item *item); + /** + * Get equipment at the given slot. + */ + Item* + getEquipment(int index) { return mEquipment[index]; } + + /** + * Set equipment at the given slot. + */ + void + setEquipment(int index, Item *item) { mEquipment[index] = item; } + + /** + * Remove equipment from the given slot. + */ + void + removeEquipment(int index) { mEquipment[index] = NULL; } - void removeEquipment(int index); + /** + * Remove the given item from equipment. + */ void removeEquipment(Item *item); - Item* getArrows(); - void setArrows(Item *arrows); + /** + * Get the item used in the arrow slot. + */ + Item* + getArrows() { return mArrows; } + + /** + * Set the item used in the arrow slot. + */ + void + setArrows(Item *arrows) { mArrows = arrows; } protected: /** @@ -53,54 +84,11 @@ class Equipment */ ~Equipment(); - Item *equipment[EQUIPMENT_SIZE]; - Item *arrows; + Item *mEquipment[EQUIPMENT_SIZE]; + Item *mArrows; private: - static Equipment *instance; + static Equipment *mInstance; }; -inline Equipment *Equipment::getInstance() -{ - if (!instance) - instance = new Equipment(); - - return instance; -} - -inline Item* Equipment::getEquipment(int index) -{ - return equipment[index]; -} - -inline void Equipment::setEquipment(int index, Item *item) -{ - equipment[index] = item; -} - -inline void Equipment::removeEquipment(int index) -{ - equipment[index] = 0; -} - -inline void Equipment::removeEquipment(Item *item) -{ - for (int i = 0; i < EQUIPMENT_SIZE; i++) { - if (equipment[i] == item) { - equipment[i] = 0; - break; - } - } -} - -inline Item* Equipment::getArrows() -{ - return arrows; -} - -inline void Equipment::setArrows(Item *arrows) -{ - this->arrows = arrows; -} - #endif diff --git a/src/floor_item.cpp b/src/floor_item.cpp index a1b83a75..32b8aee5 100755 --- a/src/floor_item.cpp +++ b/src/floor_item.cpp @@ -46,23 +46,16 @@ FloorItem::FloorItem(unsigned int id, mMap(map) { // Retrieve item image using a global itemset and itemDb (alternative?) - Image *image = itemset->spriteset[ - itemDb->getItemInfo(itemId)->getImage() - 1]; + mImage = itemset->spriteset[itemDb->getItemInfo(itemId)->getImage() - 1]; - // Create the sprite representing this floor item - mSprite = new Sprite(mX * map->getTileWidth(), - mY * map->getTileHeight(), - image); - - // Add the representative sprite to the map - mSpriteIterator = mMap->addSprite(mSprite); + // Add ourselves to the map + mSpriteIterator = mMap->addSprite(this); } FloorItem::~FloorItem() { // Remove and delete the representative sprite mMap->removeSprite(mSpriteIterator); - delete mSprite; } void empty_floor_items() diff --git a/src/floor_item.h b/src/floor_item.h index 5563da24..e004c0a2 100755 --- a/src/floor_item.h +++ b/src/floor_item.h @@ -24,14 +24,16 @@ #ifndef _TMW_FLOORITEM_H_ #define _TMW_FLOORITEM_H_ -class Map; - +#include "graphics.h" #include "map.h" +#include "sprite.h" + +class Map; /** * An item lying on the floor. */ -class FloorItem +class FloorItem : public Sprite { public: /** @@ -51,28 +53,53 @@ class FloorItem /** * Returns instance id of this item. */ - unsigned int getId() { return mId; } + unsigned int + getId() { return mId; } /** * Returns the item id. */ - unsigned int getItemId() { return mItemId; } + unsigned int + getItemId() { return mItemId; } /** * Returns the x coordinate. */ - unsigned short getX() { return mX; } + unsigned short + getX() { return mX; } /** * Returns the y coordinate. */ - unsigned short getY() { return mY; } + unsigned short + getY() { return mY; } + + /** + * Returns the pixel y coordinate. + * + * @see Sprite::getPixelY() + */ + int + getPixelY() const { return mY * 32; } + + /** + * Draws this floor item to the given graphics context. + * + * @see Sprite::draw(Graphics, int, int) + */ + void + draw(Graphics *graphics, int offsetX, int offsetY) + { + graphics->drawImage(mImage, + mX * 32 + offsetX, + mY * 32 + offsetY); + } private: unsigned int mId; unsigned int mItemId; unsigned short mX, mY; - Sprite *mSprite; + Image *mImage; Sprites::iterator mSpriteIterator; Map *mMap; }; diff --git a/src/game.cpp b/src/game.cpp index 51848441..d85149fe 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -89,7 +89,6 @@ int fps = 0, frame = 0, current_npc = 0; bool displayPathToMouse = false; Uint16 startX = 0, startY = 0; Being *autoTarget = NULL; -Map *tiledMap = NULL; Engine *engine = NULL; SDL_Joystick *joypad = NULL; /**< Joypad object */ @@ -404,12 +403,11 @@ void game() void do_exit() { delete engine; - delete tiledMap; + delete player_node; destroyGuiWindows(); close_session(); delete inventory; - delete player_node; if (joypad != NULL) { @@ -538,43 +536,42 @@ void do_input() // Picking up items on the floor case SDLK_g: case SDLK_z: - if (chatWindow->isFocused()) + if (!chatWindow->isFocused()) { - break; - } + Uint32 id = find_floor_item_by_cor( + player_node->x, player_node->y); - Uint32 id = find_floor_item_by_cor( - player_node->x, player_node->y); + // If none below the player, try the tile in front of + // the player + if (!id) { + Uint16 x = player_node->x; + Uint16 y = player_node->y; - // If none below the player, try the tile in front of - // the player - if (!id) { - Uint16 x = player_node->x; - Uint16 y = player_node->y; + switch (player_node->direction) + { + case Being::NORTH: y--; break; + case Being::SOUTH: y++; break; + case Being::WEST: x--; break; + case Being::EAST: x++; break; + case Being::NW: x--; y--; break; + case Being::NE: x++; y--; break; + case Being::SW: x--; y++; break; + case Being::SE: x++; y++; break; + default: break; + } + id = find_floor_item_by_cor(x, y); + } - switch (player_node->direction) + if (id) { - case Being::NORTH: y--; break; - case Being::SOUTH: y++; break; - case Being::WEST: x--; break; - case Being::EAST: x++; break; - case Being::NW: x--; y--; break; - case Being::NE: x++; y--; break; - case Being::SW: x--; y++; break; - case Being::SE: x++; y++; break; - default: break; + // TODO: Remove duplicated code, probably add a + // pick up command + MessageOut outMsg; + outMsg.writeShort(0x009f); + outMsg.writeLong(id); } - id = find_floor_item_by_cor(x, y); - } - - if (id) - { - // TODO: remove duplicated code, probably add a pick up command - MessageOut outMsg; - outMsg.writeShort(0x009f); - outMsg.writeLong(id); + used = true; } - used = true; break; // Quitting confirmation dialog @@ -841,8 +838,9 @@ void do_input() } // End while // Moving player around - if ((player_node->action != Being::DEAD) && (current_npc == 0) && - !chatWindow->isFocused()) + if (player_node->action != Being::DEAD && + current_npc == 0 && + !chatWindow->isFocused()) { Uint16 x = player_node->x; Uint16 y = player_node->y; @@ -904,7 +902,7 @@ void do_input() Direction = Being::NE; } - tiledMap = engine->getCurrentMap(); + Map *tiledMap = engine->getCurrentMap(); // Allow keyboard control to interrupt an existing path if ((xDirection != 0 || yDirection != 0) && @@ -961,9 +959,7 @@ void do_input() if (joy[JOY_BTN1]) { - Uint16 x = player_node->x; - Uint16 y = player_node->y; - Uint32 id = find_floor_item_by_cor(x, y); + Uint32 id = find_floor_item_by_cor(player_node->x, player_node->y); if (id != 0) { @@ -1091,7 +1087,7 @@ void do_parse() else if (msg.getId() == 0x0078) { being->clearPath(); - being->frame = 0; + being->mFrame = 0; being->walk_time = tick_time; being->action = Being::STAND; } @@ -1158,7 +1154,7 @@ void do_parse() { case Being::MONSTER: being->action = Being::MONSTER_DEAD; - being->frame = 0; + being->mFrame = 0; being->walk_time = tick_time; break; @@ -1254,7 +1250,7 @@ void do_parse() msg.readByte(); // unknown being->walk_time = tick_time; - being->frame = 0; + being->mFrame = 0; } break; @@ -1506,7 +1502,7 @@ void do_parse() beings.push_back(player_node); player_node->action = Being::STAND; - player_node->frame = 0; + player_node->mFrame = 0; player_node->x = x; player_node->y = y; player_node->setMap(tiledMap); @@ -1595,7 +1591,7 @@ void do_parse() //if (being = findNode(readLong(2))) { // if (being->getId() != player_node->getId()) { // being->action = STAND; - // being->frame = 0; + // being->mFrame = 0; // set_coordinates(being->coordinates, // readWord(6), readWord(8), // get_direction(being->coordinates)); @@ -1627,20 +1623,20 @@ void do_parse() { // buggy srcBeing->action = Being::ATTACK; - srcBeing->frame = 0; + srcBeing->mFrame = 0; srcBeing->walk_time = tick_time; } break; case 2: // Sit if (srcBeing == NULL) break; - srcBeing->frame = 0; + srcBeing->mFrame = 0; srcBeing->action = Being::SIT; break; case 3: // Stand up if (srcBeing == NULL) break; - srcBeing->frame = 0; + srcBeing->mFrame = 0; srcBeing->action = Being::STAND; break; } @@ -36,7 +36,7 @@ class Being; extern std::string map_path; extern std::string tradePartnerName; -extern int fps, frame, current_npc; +extern int fps, current_npc; extern volatile int tick_time; extern int server_tick; extern bool displayPathToMouse; diff --git a/src/graphics.cpp b/src/graphics.cpp index 74b71888..0a66bb66 100644 --- a/src/graphics.cpp +++ b/src/graphics.cpp @@ -135,7 +135,7 @@ bool Graphics::drawImage(Image *image, int srcX, int srcY, int dstX, int dstY, srcY += image->bounds.y; // Check that preconditions for blitting are met. - if (!mScreen || !image->image) return false; + if (!mScreen || !image->mImage) return false; SDL_Rect dstRect; SDL_Rect srcRect; @@ -144,11 +144,7 @@ bool Graphics::drawImage(Image *image, int srcX, int srcY, int dstX, int dstY, srcRect.w = width; srcRect.h = height; - if (SDL_BlitSurface(image->image, &srcRect, mScreen, &dstRect) < 0) { - return false; - } - - return true; + return !(SDL_BlitSurface(image->mImage, &srcRect, mScreen, &dstRect) < 0); } void Graphics::drawImagePattern(Image *image, int x, int y, int w, int h) @@ -172,13 +168,13 @@ void Graphics::drawImagePattern(Image *image, int x, int y, int w, int h) } } -void Graphics::drawImageRect( - int x, int y, int w, int h, - Image *topLeft, Image *topRight, - Image *bottomLeft, Image *bottomRight, - Image *top, Image *right, - Image *bottom, Image *left, - Image *center) +void +Graphics::drawImageRect(int x, int y, int w, int h, + Image *topLeft, Image *topRight, + Image *bottomLeft, Image *bottomRight, + Image *top, Image *right, + Image *bottom, Image *left, + Image *center) { pushClipArea(gcn::Rectangle(x, y, w, h)); @@ -216,9 +212,9 @@ void Graphics::drawImageRect( popClipArea(); } -void Graphics::drawImageRect( - int x, int y, int w, int h, - const ImageRect &imgRect) +void +Graphics::drawImageRect(int x, int y, int w, int h, + const ImageRect &imgRect) { drawImageRect(x, y, w, h, imgRect.grid[0], imgRect.grid[2], imgRect.grid[6], imgRect.grid[8], diff --git a/src/gui/chargedialog.cpp b/src/gui/chargedialog.cpp index c6cee598..e456810f 100644 --- a/src/gui/chargedialog.cpp +++ b/src/gui/chargedialog.cpp @@ -43,11 +43,6 @@ ChargeDialog::~ChargeDialog() delete progBar; } -void ChargeDialog::action(const std::string& eventId) -{ - -} - // update the dialog void ChargeDialog::logic() { diff --git a/src/gui/chargedialog.h b/src/gui/chargedialog.h index 4e6d83dc..8a4f9b04 100644 --- a/src/gui/chargedialog.h +++ b/src/gui/chargedialog.h @@ -34,7 +34,7 @@ class ProgressBar; /** * \ingroup Interface */ -class ChargeDialog : public Window, public gcn::ActionListener +class ChargeDialog : public Window { public: /** @@ -45,10 +45,8 @@ class ChargeDialog : public Window, public gcn::ActionListener /** * Destructor. */ - ~ChargeDialog(); - - // action listener - void action(const std::string&); + ~ChargeDialog(); + void logic(); private: diff --git a/src/gui/chat.cpp b/src/gui/chat.cpp index a091abc9..7e1458c9 100644 --- a/src/gui/chat.cpp +++ b/src/gui/chat.cpp @@ -183,9 +183,9 @@ void ChatWindow::chat_log(std::string line, int own) } } -void ChatWindow::chat_log(CHATSKILL action) +void ChatWindow::chat_log(CHATSKILL act) { - chat_log(const_msg(action), BY_SERVER); + chat_log(const_msg(act), BY_SERVER); } void ChatWindow::action(const std::string& eventId) @@ -227,7 +227,8 @@ bool ChatWindow::isFocused() return chatInput->hasFocus(); } -char *ChatWindow::chat_send(std::string nick, std::string msg) +void +ChatWindow::chat_send(std::string nick, std::string msg) { short packetId = CMSG_CHAT_MESSAGE; @@ -240,7 +241,6 @@ char *ChatWindow::chat_send(std::string nick, std::string msg) }*/ // prepare ordinary message chat_log("Sorry but /commands are not available yet", BY_PLAYER); - return ""; } else { nick += " : "; @@ -254,15 +254,13 @@ char *ChatWindow::chat_send(std::string nick, std::string msg) outMsg.writeShort(packetId); outMsg.writeShort(msg.length() + 4); outMsg.writeString(msg, msg.length()); - - return ""; } -std::string ChatWindow::const_msg(CHATSKILL action) +std::string ChatWindow::const_msg(CHATSKILL act) { std::string msg; - if (action.success == SKILL_FAILED && action.skill == SKILL_BASIC) { - switch (action.bskill) { + if (act.success == SKILL_FAILED && act.skill == SKILL_BASIC) { + switch (act.bskill) { case BSKILL_TRADE : msg = "Trade failed!"; break; @@ -283,7 +281,7 @@ std::string ChatWindow::const_msg(CHATSKILL action) break; } - switch (action.reason) { + switch (act.reason) { case RFAIL_SKILLDEP : msg += " You have not yet reached a high enough lvl!"; break; @@ -319,7 +317,7 @@ std::string ChatWindow::const_msg(CHATSKILL action) break; } } else { - switch(action.skill) { + switch(act.skill) { case SKILL_WARP : msg = "Warp failed..."; break; diff --git a/src/gui/chat.h b/src/gui/chat.h index 1766bd08..e648eda5 100644 --- a/src/gui/chat.h +++ b/src/gui/chat.h @@ -176,7 +176,8 @@ class ChatWindow : public Window, public gcn::ActionListener, * // for simple message by a user /- message * chatlog.chat_send("Zaeiru", "Hello to all users on the screen!"); */ - char *chat_send(std::string nick, std::string msg); + void + chat_send(std::string nick, std::string msg); /** Called when key is pressed */ void keyPress(const gcn::Key& key); diff --git a/src/gui/equipmentwindow.cpp b/src/gui/equipmentwindow.cpp index ba29a1e5..d1d23ee1 100644 --- a/src/gui/equipmentwindow.cpp +++ b/src/gui/equipmentwindow.cpp @@ -43,7 +43,6 @@ EquipmentWindow::EquipmentWindow(): setDefaultSize(5, 230, 200, 90); loadWindowState(); - ResourceManager *resman = ResourceManager::getInstance(); Image *itemImg = resman->getImage("graphics/sprites/items.png"); if (!itemImg) logger->error("Unable to load items.png"); @@ -94,7 +93,3 @@ void EquipmentWindow::draw(gcn::Graphics *graphics) graphics->drawText(n.str(), 170, 62, gcn::Graphics::CENTER); } - -void EquipmentWindow::action(const std::string &eventId) -{ -} diff --git a/src/gui/equipmentwindow.h b/src/gui/equipmentwindow.h index 0470ba6f..a3241057 100644 --- a/src/gui/equipmentwindow.h +++ b/src/gui/equipmentwindow.h @@ -35,7 +35,8 @@ class Spriteset; * * \ingroup Interface */ -class EquipmentWindow : public Window, gcn::ActionListener { +class EquipmentWindow : public Window +{ public: /** * Constructor. @@ -52,11 +53,6 @@ class EquipmentWindow : public Window, gcn::ActionListener { */ void draw(gcn::Graphics *graphics); - /** - * Called when receiving actions from the widgets. - */ - void action(const std::string& eventId); - private: Spriteset *itemset; diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 365d8eba..c829cef7 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -69,12 +69,15 @@ gcn::ImageFont *speechFont; class GuiConfigListener : public ConfigListener { public: - GuiConfigListener(Gui *gui):mGui(gui) {} + GuiConfigListener(Gui *g): + mGui(g) + {} void optionChanged(const std::string &name) { if (name == "customcursor") { - mGui->setUseCustomCursor(config.getValue("customcursor", 1) == 1); + bool bCustomCursor = config.getValue("customcursor", 1) == 1; + mGui->setUseCustomCursor(bCustomCursor); } } private: diff --git a/src/gui/help.cpp b/src/gui/help.cpp index 80ddbc9a..71e94340 100644 --- a/src/gui/help.cpp +++ b/src/gui/help.cpp @@ -51,7 +51,7 @@ HelpWindow::HelpWindow(): okButton->setEventId("close"); okButton->addActionListener(this); - + browserBox->setLinkHandler(this); add(scrollArea); @@ -69,7 +69,10 @@ HelpWindow::~HelpWindow() void HelpWindow::action(const std::string& eventId) { - setVisible(false); + if (eventId == "close") + { + setVisible(false); + } } void HelpWindow::handleLink(const std::string& link) @@ -81,7 +84,7 @@ void HelpWindow::handleLink(const std::string& link) void HelpWindow::loadHelp(const std::string &helpFile) { browserBox->clearRows(); - + loadFile("header"); loadFile(helpFile); diff --git a/src/gui/inventorywindow.cpp b/src/gui/inventorywindow.cpp index 2fca3e3c..9012b8ee 100644 --- a/src/gui/inventorywindow.cpp +++ b/src/gui/inventorywindow.cpp @@ -42,6 +42,8 @@ #include "../resources/iteminfo.h" +extern Inventory *inventory; + InventoryWindow::InventoryWindow(): Window("Inventory") { diff --git a/src/gui/item_amount.cpp b/src/gui/item_amount.cpp index 52570514..b313b98c 100644 --- a/src/gui/item_amount.cpp +++ b/src/gui/item_amount.cpp @@ -31,6 +31,8 @@ #include "../inventory.h" #include "../item.h" +extern Inventory *inventory; + ItemAmountWindow::ItemAmountWindow(int usage, Window *parent, Item *item): Window("Select amount of items to drop.", true, parent), mItem(item) diff --git a/src/gui/itemcontainer.cpp b/src/gui/itemcontainer.cpp index 81a85b8d..3f00f9eb 100644 --- a/src/gui/itemcontainer.cpp +++ b/src/gui/itemcontainer.cpp @@ -39,7 +39,7 @@ #include "../resources/resourcemanager.h" ItemContainer::ItemContainer(Inventory *inventory): - inventory(inventory) + mInventory(inventory) { ResourceManager *resman = ResourceManager::getInstance(); Image *itemImg = resman->getImage("graphics/sprites/items.png"); @@ -51,7 +51,7 @@ ItemContainer::ItemContainer(Inventory *inventory): if (!selImg) logger->error("Unable to load selection.png"); selectedItem = 0; // No item selected - maxItems = inventory->getLastUsedSlot(); + maxItems = mInventory->getLastUsedSlot(); addMouseListener(this); } @@ -66,7 +66,7 @@ void ItemContainer::logic() { gcn::Widget::logic(); - int i = inventory->getLastUsedSlot(); + int i = mInventory->getLastUsedSlot(); if (i != maxItems) { maxItems = i; @@ -100,7 +100,7 @@ void ItemContainer::draw(gcn::Graphics* graphics) */ for (int i = 2; i < INVENTORY_SIZE; i++) { - Item *item = inventory->getItem(i); + Item *item = mInventory->getItem(i); if (item->getQuantity() <= 0) { continue; @@ -182,6 +182,6 @@ void ItemContainer::mousePress(int mx, int my, int button) if (index > INVENTORY_SIZE) { index = INVENTORY_SIZE - 1; } - selectedItem = inventory->getItem(index); + selectedItem = mInventory->getItem(index); } } diff --git a/src/gui/itemcontainer.h b/src/gui/itemcontainer.h index 9cd92812..69134d83 100644 --- a/src/gui/itemcontainer.h +++ b/src/gui/itemcontainer.h @@ -82,7 +82,7 @@ class ItemContainer : public gcn::Widget, public gcn::MouseListener void selectNone(); private: - Inventory *inventory; + Inventory *mInventory; Spriteset *itemset; Image *selImg; Item *selectedItem; diff --git a/src/gui/linkhandler.h b/src/gui/linkhandler.h index 05a0a99b..65c0d433 100644 --- a/src/gui/linkhandler.h +++ b/src/gui/linkhandler.h @@ -21,8 +21,8 @@ * $Id$ */ -#ifndef _TMW_LINK_HANDLER_H -#define _TMW_LINK_HANDLER_H +#ifndef _TMW_LINK_HANDLER_H_ +#define _TMW_LINK_HANDLER_H_ /** * A simple interface to windows that need to handle links from BrowserBox @@ -33,8 +33,8 @@ class LinkHandler public: virtual ~LinkHandler() { } - virtual void handleLink(const std::string& link) { } - + virtual void handleLink(const std::string& link) = 0; + protected: LinkHandler() { } }; diff --git a/src/gui/login.cpp b/src/gui/login.cpp index aea77768..6d1c896d 100644 --- a/src/gui/login.cpp +++ b/src/gui/login.cpp @@ -60,11 +60,14 @@ WrongPasswordNoticeListener::setLoginDialog(LoginDialog *loginDialog) void WrongPasswordNoticeListener::action(const std::string &eventId) { - // Reset the password and put the caret ready to retype it. - mLoginDialog->passField->setText(""); - mLoginDialog->passField->setCaretPosition(0); - mLoginDialog->passField->requestFocus(); - wrongLoginNotice = NULL; + if (eventId == "ok") + { + // Reset the password and put the caret ready to retype it. + mLoginDialog->passField->setText(""); + mLoginDialog->passField->setCaretPosition(0); + mLoginDialog->passField->requestFocus(); + wrongLoginNotice = NULL; + } } void @@ -76,10 +79,13 @@ WrongUsernameNoticeListener::setLoginDialog(LoginDialog *loginDialog) void WrongUsernameNoticeListener::action(const std::string &eventId) { - // Set the focus on the username Field - mLoginDialog->userField->setCaretPosition(LEN_MAX_USERNAME - 1); - mLoginDialog->userField->requestFocus(); - wrongLoginNotice = NULL; + if (eventId == "ok") + { + // Set the focus on the username Field + mLoginDialog->userField->setCaretPosition(LEN_MAX_USERNAME - 1); + mLoginDialog->userField->requestFocus(); + wrongLoginNotice = NULL; + } } LoginDialog::LoginDialog(): @@ -269,41 +275,41 @@ LoginDialog::action(const std::string& eventId) else if (user.length() < LEN_MIN_USERNAME) { // Name too short - std::stringstream errorMessage; - errorMessage << "The username needs to be at least " - << LEN_MIN_USERNAME - << " characters long."; - wrongLoginNotice = new OkDialog("Error", errorMessage.str(), + std::stringstream errorMsg; + errorMsg << "The username needs to be at least " + << LEN_MIN_USERNAME + << " characters long."; + wrongLoginNotice = new OkDialog("Error", errorMsg.str(), &wrongUsernameNoticeListener); } else if (user.length() > LEN_MAX_USERNAME - 1 ) { // Name too long - std::stringstream errorMessage; - errorMessage << "The username needs to be less than " - << LEN_MAX_USERNAME - << " characters long."; - wrongLoginNotice = new OkDialog("Error", errorMessage.str(), + std::stringstream errorMsg; + errorMsg << "The username needs to be less than " + << LEN_MAX_USERNAME + << " characters long."; + wrongLoginNotice = new OkDialog("Error", errorMsg.str(), &wrongUsernameNoticeListener); } else if (passField->getText().length() < LEN_MIN_PASSWORD) { // Pass too short - std::stringstream errorMessage; - errorMessage << "The password needs to be at least " - << LEN_MIN_PASSWORD - << " characters long."; - wrongLoginNotice = new OkDialog("Error", errorMessage.str(), + std::stringstream errorMsg; + errorMsg << "The password needs to be at least " + << LEN_MIN_PASSWORD + << " characters long."; + wrongLoginNotice = new OkDialog("Error", errorMsg.str(), &wrongPasswordNoticeListener); } else if (passField->getText().length() > LEN_MAX_PASSWORD - 1 ) { // Pass too long - std::stringstream errorMessage; - errorMessage << "The password needs to be less than " - << LEN_MAX_PASSWORD - << " characters long."; - wrongLoginNotice = new OkDialog("Error", errorMessage.str(), + std::stringstream errorMsg; + errorMsg << "The password needs to be less than " + << LEN_MAX_PASSWORD + << " characters long."; + wrongLoginNotice = new OkDialog("Error", errorMsg.str(), &wrongPasswordNoticeListener); } else diff --git a/src/gui/menuwindow.cpp b/src/gui/menuwindow.cpp index 1e190102..280339a1 100644 --- a/src/gui/menuwindow.cpp +++ b/src/gui/menuwindow.cpp @@ -33,6 +33,7 @@ #include "skill.h" #include "../graphics.h" + extern Graphics *graphics; extern Window *setupWindow; @@ -78,8 +79,8 @@ MenuWindow::MenuWindow(): int menuWidth = setupButton->getX() + setupButton->getWidth(); setDefaultSize((graphics->getWidth() - menuWidth - 5), 0, - menuWidth, - (setupButton->getY() + setupButton->getHeight())); + menuWidth, + (setupButton->getY() + setupButton->getHeight())); } MenuWindow::~MenuWindow() @@ -91,9 +92,9 @@ MenuWindow::~MenuWindow() delete setupButton; } -void MenuWindow::draw(gcn::Graphics *graphics) +void MenuWindow::draw(gcn::Graphics *g) { - Window::drawContent(graphics); + Window::drawContent(g); } void MenuWindow::action(const std::string& eventId) diff --git a/src/gui/newskill.cpp b/src/gui/newskill.cpp index 12c87b36..ec080d81 100644 --- a/src/gui/newskill.cpp +++ b/src/gui/newskill.cpp @@ -34,7 +34,7 @@ #include "../graphics.h" -char *skill_name[] = { +const char *skill_name[] = { // 0-99 // weapon skills 0-9 "Short Blades", "Long Blades", "Hammers", "Archery", "Whip", @@ -69,7 +69,6 @@ char *skill_name[] = { }; - NewSkillDialog::NewSkillDialog(): Window("Skills") { diff --git a/src/gui/npc_text.cpp b/src/gui/npc_text.cpp index 9896f08e..2e0b0837 100644 --- a/src/gui/npc_text.cpp +++ b/src/gui/npc_text.cpp @@ -80,10 +80,13 @@ NpcTextDialog::addText(const std::string &text) void NpcTextDialog::action(const std::string& eventId) { - MessageOut outMsg; - outMsg.writeShort(CMSG_NPC_NEXT_REQUEST); - outMsg.writeLong(current_npc); - setText(""); - setVisible(false); - current_npc = 0; + if (eventId == "ok") + { + MessageOut outMsg; + outMsg.writeShort(CMSG_NPC_NEXT_REQUEST); + outMsg.writeLong(current_npc); + setText(""); + setVisible(false); + current_npc = 0; + } } diff --git a/src/gui/popupmenu.cpp b/src/gui/popupmenu.cpp index feb287eb..6bb57f60 100644 --- a/src/gui/popupmenu.cpp +++ b/src/gui/popupmenu.cpp @@ -47,13 +47,17 @@ #include "../resources/itemmanager.h" extern Being* autoTarget; +extern Inventory* inventory; PopupMenu::PopupMenu(): - Window() + Window(), + mBeing(NULL), + mFloorItem(NULL), + mItem(NULL) { setResizable(false); setTitleBarHeight(0); - title = false; + mShowTitle = false; browserBox = new BrowserBox(); browserBox->setPosition(4, 4); @@ -61,29 +65,25 @@ PopupMenu::PopupMenu(): browserBox->setOpaque(false); add(browserBox); browserBox->setLinkHandler(this); - - being = NULL; - floorItem = NULL; } PopupMenu::~PopupMenu() { delete browserBox; - delete floorItem; } void PopupMenu::showPopup(int x, int y, Being *being) { - this->being = being; + mBeing = being; browserBox->clearRows(); - switch (being->getType()) + switch (mBeing->getType()) { case Being::PLAYER: { // Players can be traded with. Later also attack, follow and // add as buddy will be options in this menu. - const std::string &name = being->getName(); + const std::string &name = mBeing->getName(); browserBox->addRow("@@trade|Trade With " + name + "@@"); browserBox->addRow("@@attack|Attack " + name + "@@"); @@ -112,11 +112,11 @@ void PopupMenu::showPopup(int x, int y, Being *being) void PopupMenu::showPopup(int x, int y, FloorItem *floorItem) { - this->floorItem = floorItem; + mFloorItem = floorItem; browserBox->clearRows(); // Floor item can be picked up (single option, candidate for removal) - std::string name = itemDb->getItemInfo(floorItem->getItemId())->getName(); + std::string name = itemDb->getItemInfo(mFloorItem->getItemId())->getName(); browserBox->addRow("@@pickup|Pick Up " + name + "@@"); //browserBox->addRow("@@look|Look To@@"); @@ -129,32 +129,38 @@ void PopupMenu::showPopup(int x, int y, FloorItem *floorItem) void PopupMenu::handleLink(const std::string& link) { // Talk To action - if ((link == "talk") && being && being->getType() == Being::NPC && - (current_npc == 0)) + if (link == "talk" && + mBeing != NULL && + mBeing->getType() == Being::NPC && + current_npc == 0) { MessageOut outMsg; outMsg.writeShort(CMSG_NPC_TALK); - outMsg.writeLong(being->getId()); + outMsg.writeLong(mBeing->getId()); outMsg.writeByte(0); - current_npc = being->getId(); + current_npc = mBeing->getId(); } // Trade action - else if ((link == "trade") && being && being->getType() == Being::PLAYER) + else if (link == "trade" && + mBeing != NULL && + mBeing->getType() == Being::PLAYER) { MessageOut outMsg; outMsg.writeShort(CMSG_TRADE_REQUEST); - outMsg.writeLong(being->getId()); + outMsg.writeLong(mBeing->getId()); //tradePartner.flush(); //tradePartner << "Trade: You and " << being->name<< ""; - tradePartnerName = being->getName(); + tradePartnerName = mBeing->getName(); } // Attack action - else if ((link == "attack") && being && being->getType() == Being::PLAYER) + else if (link == "attack" && + mBeing != NULL && + mBeing->getType() == Being::PLAYER) { - autoTarget = being; - attack(being); + autoTarget = mBeing; + attack(mBeing); } /* @@ -165,20 +171,20 @@ void PopupMenu::handleLink(const std::string& link) /* // Add Buddy action - else if ((link == "buddy") && being && being->isPlayer()) + else if ((link == "buddy") && mBeing != NULL && mBeing->isPlayer()) { if (!buddyWindow->isVisible()) buddyWindow->setVisible(true); - buddyWindow->addBuddy(being->getName()); + buddyWindow->addBuddy(mBeing->getName()); }*/ // Pick Up Floor Item action - else if ((link == "pickup") && floorItem) + else if ((link == "pickup") && mFloorItem != NULL) { MessageOut outMsg; outMsg.writeShort(CMSG_ITEM_PICKUP); - outMsg.writeLong(floorItem->getId()); + outMsg.writeLong(mFloorItem->getId()); } // Look To action @@ -188,27 +194,27 @@ void PopupMenu::handleLink(const std::string& link) else if (link == "use") { - assert(m_item); - if (m_item->isEquipment()) + assert(mItem); + if (mItem->isEquipment()) { - if (m_item->isEquipped()) + if (mItem->isEquipped()) { - inventory->unequipItem(m_item); + inventory->unequipItem(mItem); } else { - inventory->equipItem(m_item); + inventory->equipItem(mItem); } } else { - inventory->useItem(m_item); + inventory->useItem(mItem); } } else if (link == "drop") { - new ItemAmountWindow(AMOUNT_ITEM_DROP, inventoryWindow, m_item); + new ItemAmountWindow(AMOUNT_ITEM_DROP, inventoryWindow, mItem); } else if (link == "description") @@ -231,15 +237,15 @@ void PopupMenu::handleLink(const std::string& link) */ _getFocusHandler()->focusNone(); - being = NULL; - floorItem = NULL; - m_item = NULL; + mBeing = NULL; + mFloorItem = NULL; + mItem = NULL; } void PopupMenu::showPopup(int x, int y, Item *item) { assert(item); - m_item = item; + mItem = item; browserBox->clearRows(); if (item->isEquipment()) diff --git a/src/gui/popupmenu.h b/src/gui/popupmenu.h index 0ba9f485..0cd6225c 100644 --- a/src/gui/popupmenu.h +++ b/src/gui/popupmenu.h @@ -74,10 +74,9 @@ class PopupMenu : public Window, public LinkHandler private: BrowserBox* browserBox; - Being* being; - FloorItem* floorItem; - - Item *m_item; + Being* mBeing; + FloorItem* mFloorItem; + Item *mItem; /** * Shared code for the various showPopup functions. diff --git a/src/gui/progressbar.cpp b/src/gui/progressbar.cpp index 834ca73a..0863db98 100644 --- a/src/gui/progressbar.cpp +++ b/src/gui/progressbar.cpp @@ -35,12 +35,10 @@ int ProgressBar::mInstances = 0; ProgressBar::ProgressBar(float progress, int x, int y, unsigned int width, unsigned int height, - unsigned char red, - unsigned char green, - unsigned char blue): + Uint8 red, Uint8 green, Uint8 blue): gcn::Widget(), - red(red), green(green), blue(blue), - redToGo(red), greenToGo(green), blueToGo(blue) + mRed(red), mGreen(green), mBlue(blue), + mRedToGo(red), mGreenToGo(green), mBlueToGo(blue) { setProgress(progress); setX(x); @@ -88,58 +86,43 @@ ProgressBar::~ProgressBar() void ProgressBar::logic() { // Smoothly changing the color for a nicer effect. - if (redToGo > red) red++; - if (redToGo < red) red--; - if (greenToGo > green) green++; - if (greenToGo < green) green--; - if (blueToGo > blue) blue++; - if (blueToGo < blue) blue--; + if (mRedToGo > mRed) mRed++; + if (mRedToGo < mRed) mRed--; + if (mGreenToGo > mGreen) mGreen++; + if (mGreenToGo < mGreen) mGreen--; + if (mBlueToGo > mBlue) mBlue++; + if (mBlueToGo < mBlue) mBlue--; } -void ProgressBar::draw(gcn::Graphics *graphics) +void +ProgressBar::draw(gcn::Graphics *graphics) { - dynamic_cast<Graphics*>(graphics)->drawImageRect(0, 0, getWidth(), getHeight(), - mBorder); + dynamic_cast<Graphics*>(graphics)->drawImageRect(0, 0, + getWidth(), getHeight(), + mBorder); // The bar - if (progress > 0) + if (mProgress > 0) { - graphics->setColor(gcn::Color(red, green, blue, 200)); + graphics->setColor(gcn::Color(mRed, mGreen, mBlue, 200)); graphics->fillRectangle(gcn::Rectangle(4, 4, - (int)(progress * (getWidth() - 8)), getHeight() - 8)); + (int)(mProgress * (getWidth() - 8)), + getHeight() - 8)); } } -void ProgressBar::setProgress(float progress) +void +ProgressBar::setProgress(float progress) { - if (progress < 0.0f) this->progress = 0.0; - else if (progress > 1.0f) this->progress = 1.0; - else this->progress = progress; + if (progress < 0.0f) mProgress = 0.0; + else if (progress > 1.0f) mProgress = 1.0; + else mProgress = progress; } -float ProgressBar::getProgress() +void +ProgressBar::setColor(Uint8 red, Uint8 green, Uint8 blue) { - return progress; -} - -void ProgressBar::setColor(unsigned char red, unsigned char green, unsigned char blue) -{ - redToGo = red; - greenToGo = green; - blueToGo = blue; -} - -unsigned char ProgressBar::getRed() -{ - return red; -} - -unsigned char ProgressBar::getGreen() -{ - return green; -} - -unsigned char ProgressBar::getBlue() -{ - return blue; + mRedToGo = red; + mGreenToGo = green; + mBlueToGo = blue; } diff --git a/src/gui/progressbar.h b/src/gui/progressbar.h index fe9e7085..cd62c498 100644 --- a/src/gui/progressbar.h +++ b/src/gui/progressbar.h @@ -26,6 +26,8 @@ #include <guichan/widget.hpp> +#include <SDL_types.h> + class ImageRect; @@ -40,8 +42,8 @@ class ProgressBar : public gcn::Widget { * Constructor, initializes the progress with the given value. */ ProgressBar(float progress = 0.0f, int x = 0, int y = 0, - unsigned int width = 40, unsigned int height = 7, - unsigned char red = 150, unsigned char green = 150, unsigned char blue = 150); + unsigned int width = 40, unsigned int height = 7, + Uint8 red = 150, Uint8 green = 150, Uint8 blue = 150); /** * Destructor. @@ -51,47 +53,55 @@ class ProgressBar : public gcn::Widget { /** * Performs progress bar logic (fading colors) */ - void logic(); + void + logic(); /** * Draws the progress bar. */ - void draw(gcn::Graphics *graphics); + void + draw(gcn::Graphics *graphics); /** * Sets the current progress. */ - void setProgress(float progress); + void + setProgress(float progress); /** * Returns the current progress. */ - float getProgress(); + float + getProgress() { return mProgress; } /** * Change the filling of the progress bar. */ - void setColor(unsigned char red, unsigned char green, unsigned char blue); + void + setColor(Uint8, Uint8 green, Uint8 blue); /** * Get The red value of color */ - unsigned char getRed(); + Uint8 + getRed() { return mRed; } /** * Get The red value of color */ - unsigned char getGreen(); + Uint8 + getGreen() { return mGreen; } - /** + /** * Get The red value of color */ - unsigned char getBlue(); + Uint8 + getBlue() { return mBlue; } private: - float progress; - unsigned char red, green, blue; - unsigned char redToGo, greenToGo, blueToGo; + float mProgress; + Uint8 mRed, mGreen, mBlue; + Uint8 mRedToGo, mGreenToGo, mBlueToGo; static ImageRect mBorder; static int mInstances; diff --git a/src/gui/scrollarea.cpp b/src/gui/scrollarea.cpp index ec8a7946..246e2ffa 100644 --- a/src/gui/scrollarea.cpp +++ b/src/gui/scrollarea.cpp @@ -216,21 +216,21 @@ void ScrollArea::draw(gcn::Graphics *graphics) void ScrollArea::drawBorder(gcn::Graphics *graphics) { - int w, h, bs; - bs = getBorderSize(); - w = getWidth() + bs * 2; - h = getHeight() + bs * 2; + int bs = getBorderSize(); + int w = getWidth() + bs * 2; + int h = getHeight() + bs * 2; - if (isOpaque()) { - dynamic_cast<Graphics*>(graphics)->drawImageRect(0, 0, w, h, background); + if (mOpaque) { + dynamic_cast<Graphics*>(graphics)->drawImageRect(0, 0, w, h, + background); } } void ScrollArea::setOpaque(bool opaque) { - this->opaque = opaque; + mOpaque = opaque; - if (opaque) { + if (mOpaque) { setBorderSize(2); } else { @@ -238,11 +238,6 @@ void ScrollArea::setOpaque(bool opaque) } } -bool ScrollArea::isOpaque() -{ - return opaque; -} - void ScrollArea::drawButton(gcn::Graphics *graphics, BUTTON_DIR dir) { int state = 0; diff --git a/src/gui/scrollarea.h b/src/gui/scrollarea.h index f2e00466..d75e194a 100644 --- a/src/gui/scrollarea.h +++ b/src/gui/scrollarea.h @@ -70,19 +70,21 @@ class ScrollArea : public gcn::ScrollArea { /** * Sets whether the widget should draw its background or not. */ - void setOpaque(bool opaque); + void + setOpaque(bool opaque); /** * Returns whether the widget draws its background or not. */ - bool isOpaque(); + bool + isOpaque() { return mOpaque; } protected: enum BUTTON_DIR { UP, DOWN, LEFT, - RIGHT, + RIGHT }; /** @@ -105,7 +107,7 @@ class ScrollArea : public gcn::ScrollArea { static ImageRect vMarker; static Image *buttons[4][2]; - bool opaque; + bool mOpaque; }; #endif diff --git a/src/gui/skill.cpp b/src/gui/skill.cpp index 75f77e39..b65fcfd9 100644 --- a/src/gui/skill.cpp +++ b/src/gui/skill.cpp @@ -37,7 +37,7 @@ #include "../graphics.h" extern Graphics *graphics; -char *skill_db[] = { +const char *skill_db[] = { // 0-99 "", "Basic", "Sword", "Two hand", "HP regeneration", "Bash", "Provoke", "Magnum", "Endure", "MP regeneration", "", "", "", "", "", "", "", "", "", "", diff --git a/src/gui/status.cpp b/src/gui/status.cpp index 1a858297..1ba09b98 100644 --- a/src/gui/status.cpp +++ b/src/gui/status.cpp @@ -35,6 +35,7 @@ #include "../net/protocol.h" #include "../graphics.h" + extern Graphics *graphics; StatusWindow::StatusWindow(): @@ -43,7 +44,7 @@ StatusWindow::StatusWindow(): setWindowName("Status"); setResizable(true); setDefaultSize((graphics->getWidth() - 365) / 2, - (graphics->getHeight() - 255) / 2, 365, 255); + (graphics->getHeight() - 255) / 2, 365, 255); loadWindowState(); // ---------------------- @@ -428,11 +429,11 @@ void StatusWindow::update() jobValueLabel->setPosition(290, jobXpLabel->getY()); } -void StatusWindow::draw(gcn::Graphics *graphics) +void StatusWindow::draw(gcn::Graphics *g) { update(); - Window::draw(graphics); + Window::draw(g); } void StatusWindow::action(const std::string& eventId) diff --git a/src/gui/trade.h b/src/gui/trade.h index 7cb350da..1a2d0d99 100644 --- a/src/gui/trade.h +++ b/src/gui/trade.h @@ -96,7 +96,8 @@ class TradeWindow : public Window, gcn::ActionListener /** * Send trade packet. */ - void TradeWindow::tradeItem(Item *item, int quantity); + void + tradeItem(Item *item, int quantity); /** * Called on mouse click. diff --git a/src/gui/window.cpp b/src/gui/window.cpp index 2f288fff..54fc0103 100644 --- a/src/gui/window.cpp +++ b/src/gui/window.cpp @@ -67,11 +67,11 @@ class WindowConfigListener : public ConfigListener Window::Window(const std::string& caption, bool modal, Window *parent): gcn::Window(caption), - parent(parent), + mParent(parent), mWindowName("window"), snapSize(8), - title(true), - modal(modal), + mShowTitle(true), + mModal(modal), resizable(false), mMouseResize(false), minWinWidth(6), @@ -114,14 +114,14 @@ Window::Window(const std::string& caption, bool modal, Window *parent): setTitleBarHeight(20); // Add chrome - chrome = new gcn::Container(); - chrome->setOpaque(false); - setContent(chrome); + mChrome = new gcn::Container(); + mChrome->setOpaque(false); + setContent(mChrome); // Add this window to the window container windowContainer->add(this); - if (modal) + if (mModal) { requestModalFocus(); } @@ -163,7 +163,7 @@ Window::~Window() resizeGrip->decRef(); } - delete chrome; + delete mChrome; } void Window::setWindowContainer(WindowContainer *wc) @@ -186,7 +186,7 @@ void Window::draw(gcn::Graphics* graphics) } // Draw title - if (title) { + if (mShowTitle) { graphics->setFont(getFont()); graphics->drawText(getCaption(), 7, 5, gcn::Graphics::LEFT); } @@ -196,13 +196,13 @@ void Window::draw(gcn::Graphics* graphics) void Window::setContentWidth(int width) { - chrome->setWidth(width); + mChrome->setWidth(width); resizeToContent(); } void Window::setContentHeight(int height) { - chrome->setHeight(height); + mChrome->setHeight(height); resizeToContent(); } @@ -254,11 +254,6 @@ bool Window::isResizable() return resizable; } -Window *Window::getParentWindow() -{ - return parent; -} - void Window::scheduleDelete() { windowContainer->scheduleDelete(this); @@ -266,12 +261,12 @@ void Window::scheduleDelete() void Window::add(gcn::Widget *w) { - chrome->add(w); + mChrome->add(w); } void Window::add(gcn::Widget *w, int x, int y) { - chrome->add(w, x, y); + mChrome->add(w, x, y); } void Window::mousePress(int x, int y, int button) @@ -401,7 +396,8 @@ void Window::mouseMotion(int x, int y) } } -void Window::mouseRelease(int x, int y, int button) +void +Window::mouseRelease(int x, int y, int button) { if (button == 1) { @@ -410,7 +406,8 @@ void Window::mouseRelease(int x, int y, int button) } } -gcn::Rectangle Window::getGripDimension() +gcn::Rectangle +Window::getGripDimension() { return gcn::Rectangle(getWidth() - resizeGrip->getWidth(), getHeight() - resizeGrip->getHeight(), @@ -418,7 +415,8 @@ gcn::Rectangle Window::getGripDimension() getHeight()); } -void Window::loadWindowState() +void +Window::loadWindowState() { const std::string &name = mWindowName; diff --git a/src/gui/window.h b/src/gui/window.h index 66330350..ee85c97f 100644 --- a/src/gui/window.h +++ b/src/gui/window.h @@ -138,7 +138,8 @@ class Window : public gcn::Window * * @return The parent window or <code>NULL</code> if there is none. */ - Window *getParentWindow(); + Window* + getParentWindow() { return mParent; } /** * Schedule this window for deletion. It will be deleted at the start @@ -195,12 +196,12 @@ class Window : public gcn::Window virtual void resetToDefaultSize(); protected: - gcn::Container *chrome; /**< Contained container */ - Window *parent; /**< The parent window */ + gcn::Container *mChrome; /**< Contained container */ + Window *mParent; /**< The parent window */ std::string mWindowName; /**< Name of the window */ int snapSize; /**< Snap distance to window edge */ - bool title; /**< Window has a title bar */ - bool modal; /**< Window is modal */ + bool mShowTitle; /**< Window has a title bar */ + bool mModal; /**< Window is modal */ bool resizable; /**< Window can be resized */ bool mMouseResize; /**< Window is being resized */ int minWinWidth; /**< Minimum window width */ diff --git a/src/guichanfwd.h b/src/guichanfwd.h index 981d6878..5eabc783 100644 --- a/src/guichanfwd.h +++ b/src/guichanfwd.h @@ -68,6 +68,6 @@ namespace gcn { class TextField; class Widget; class Window; -}; +} #endif diff --git a/src/inventory.h b/src/inventory.h index 461a4a50..bd6da744 100644 --- a/src/inventory.h +++ b/src/inventory.h @@ -97,6 +97,4 @@ class Inventory Item *items; /**< The holder of items */ }; -extern Inventory *inventory; - #endif diff --git a/src/map.cpp b/src/map.cpp index 3237b54a..37b7292a 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -36,8 +36,8 @@ MetaTile::MetaTile(): } -Location::Location(int x, int y, MetaTile *tile): - x(x), y(y), tile(tile) +Location::Location(int iX, int iY, MetaTile *iTile): + x(iX), y(iY), tile(iTile) { } @@ -88,7 +88,7 @@ Map::addTileset(Tileset *tileset) bool spriteCompare(const Sprite *a, const Sprite *b) { - return a->getY() < b->getY(); + return a->getPixelY() < b->getPixelY(); } void @@ -118,7 +118,7 @@ Map::draw(Graphics *graphics, int scrollX, int scrollY, int layer) // tiles have been drawn if (layer == 1) { - while (si != mSprites.end() && (*si)->getY() < y * 32) + while (si != mSprites.end() && (*si)->getPixelY() <= y * 32 - 32) { (*si)->draw(graphics, -scrollX, -scrollY); si++; @@ -135,6 +135,16 @@ Map::draw(Graphics *graphics, int scrollX, int scrollY, int layer) } } } + + // Draw any remaining sprites + if (layer == 1) + { + while (si != mSprites.end()) + { + (*si)->draw(graphics, -scrollX, -scrollY); + si++; + } + } } void @@ -29,7 +29,6 @@ #include <vector> #include "properties.h" -class Being; class Graphics; class Image; class Tileset; diff --git a/src/net/messagein.cpp b/src/net/messagein.cpp index 6086e096..25bf2f07 100644 --- a/src/net/messagein.cpp +++ b/src/net/messagein.cpp @@ -126,7 +126,6 @@ std::string MessageIn::readString(int length) { int stringLength = 0; - std::string readString = ""; // Get string length if (length < 0) { @@ -144,10 +143,10 @@ MessageIn::readString(int length) tmpString[stringLength] = 0; mPos += stringLength; - readString = tmpString; + std::string read = tmpString; delete[] tmpString; - return readString; + return read; } char& operator<<(char &lhs, MessageIn &msg) diff --git a/src/net/packet.cpp b/src/net/packet.cpp index 6d7b2b3e..e77ac117 100644 --- a/src/net/packet.cpp +++ b/src/net/packet.cpp @@ -26,15 +26,15 @@ #include <cstring> Packet::Packet(const char *data, int length): - length(length) + mLength(length) { // Create a copy of the data - this->data = new char[length]; - memcpy(this->data, data, length); + mData = new char[mLength]; + memcpy(mData, data, mLength); } Packet::~Packet() { // Clean up the data - delete[] data; + delete[] mData; } diff --git a/src/net/packet.h b/src/net/packet.h index 6b9fd18d..84d16d5e 100644 --- a/src/net/packet.h +++ b/src/net/packet.h @@ -40,8 +40,8 @@ class Packet */ ~Packet(); - char *data; /**< Packet data */ - unsigned int length; /**< Length of data in bytes */ + char *mData; /**< Packet data */ + unsigned int mLength; /**< Length of data in bytes */ }; #endif diff --git a/src/openglgraphics.cpp b/src/openglgraphics.cpp index d7915256..983c948e 100644 --- a/src/openglgraphics.cpp +++ b/src/openglgraphics.cpp @@ -89,13 +89,13 @@ bool OpenGLGraphics::drawImage(Image *image, int srcX, int srcY, srcY += image->bounds.y; // Find OpenGL texture coordinates - float texX1 = srcX / (float)image->texWidth; - float texY1 = srcY / (float)image->texHeight; - float texX2 = (srcX + width) / (float)image->texWidth; - float texY2 = (srcY + height) / (float)image->texHeight; + float texX1 = srcX / (float)image->mTexWidth; + float texY1 = srcY / (float)image->mTexHeight; + float texX2 = (srcX + width) / (float)image->mTexWidth; + float texY2 = (srcY + height) / (float)image->mTexHeight; glColor4f(1.0f, 1.0f, 1.0f, image->alpha); - glBindTexture(GL_TEXTURE_2D, image->glimage); + glBindTexture(GL_TEXTURE_2D, image->mGLImage); drawTexedQuad(dstX, dstY, width, height, texX1, texY1, texX2, texY2); diff --git a/src/resources/image.cpp b/src/resources/image.cpp index 27fc6497..266f46e3 100644 --- a/src/resources/image.cpp +++ b/src/resources/image.cpp @@ -28,28 +28,28 @@ #include "../log.h" #ifdef USE_OPENGL -bool Image::useOpenGL = false; +bool Image::mUseOpenGL = false; #endif Image::Image(const std::string &idPath, SDL_Surface *image): - Resource(idPath), image(image) + Resource(idPath), mImage(image) { // Default to opaque alpha = 1.0f; bounds.x = 0; bounds.y = 0; - bounds.w = image->w; - bounds.h = image->h; + bounds.w = mImage->w; + bounds.h = mImage->h; } #ifdef USE_OPENGL Image::Image(const std::string &idPath, GLuint glimage, int width, int height, - int texWidth, int texHeight): + int texWidth, int texHeight): Resource(idPath), - glimage(glimage), - texWidth(texWidth), - texHeight(texHeight) + mGLImage(glimage), + mTexWidth(texWidth), + mTexHeight(texHeight) { // Default to opaque alpha = 1.0f; @@ -66,7 +66,8 @@ Image::~Image() unload(); } -Image* Image::load(void* buffer, unsigned int bufferSize, const std::string &idPath) +Image* Image::load(void *buffer, unsigned int bufferSize, + const std::string &idPath) { // Load the raw file data from the buffer in an RWops structure SDL_RWops *rw = SDL_RWFromMem(buffer, bufferSize); @@ -154,7 +155,7 @@ Image* Image::load(void* buffer, unsigned int bufferSize, const std::string &idP } #ifdef USE_OPENGL - if (useOpenGL) + if (mUseOpenGL) { int width = tmpImage->w; int height = tmpImage->h; @@ -264,40 +265,27 @@ void Image::unload() loaded = false; #ifdef USE_OPENGL - if (useOpenGL) { - return; - } + if (mUseOpenGL) return; #endif - if (!image) { - return; - } + if (!mImage) return; // Free the image surface. - SDL_FreeSurface(image); - image = NULL; -} - -int Image::getWidth() const -{ - return bounds.w; -} - -int Image::getHeight() const -{ - return bounds.h; + SDL_FreeSurface(mImage); + mImage = NULL; } Image *Image::getSubImage(int x, int y, int width, int height) { // Create a new clipped sub-image #ifdef USE_OPENGL - if (useOpenGL) { - return new SubImage(this, glimage, x, y, width, height, texWidth, texHeight); + if (mUseOpenGL) { + return new SubImage(this, mGLImage, x, y, width, height, + mTexWidth, mTexHeight); } #endif - return new SubImage(this, image, x, y, width, height); + return new SubImage(this, mImage, x, y, width, height); } void Image::setAlpha(float a) @@ -305,13 +293,13 @@ void Image::setAlpha(float a) alpha = a; #ifdef USE_OPENGL - if (useOpenGL) { + if (mUseOpenGL) { return; } #endif // Set the alpha value this image is drawn at - SDL_SetAlpha(image, SDL_SRCALPHA | SDL_RLEACCEL, (int)(255 * alpha)); + SDL_SetAlpha(mImage, SDL_SRCALPHA | SDL_RLEACCEL, (int)(255 * alpha)); } float Image::getAlpha() @@ -322,7 +310,7 @@ float Image::getAlpha() #ifdef USE_OPENGL void Image::setLoadAsOpenGL(bool useOpenGL) { - Image::useOpenGL = useOpenGL; + Image::mUseOpenGL = useOpenGL; } #endif @@ -332,9 +320,9 @@ void Image::setLoadAsOpenGL(bool useOpenGL) SubImage::SubImage(Image *parent, SDL_Surface *image, int x, int y, int width, int height): - Image("", image), parent(parent) + Image("", image), mParent(parent) { - parent->incRef(); + mParent->incRef(); // Set up the rectangle. bounds.x = x; @@ -345,10 +333,11 @@ SubImage::SubImage(Image *parent, SDL_Surface *image, #ifdef USE_OPENGL SubImage::SubImage(Image *parent, GLuint image, - int x, int y, int width, int height, int texWidth, int texHeight): - Image("", image, width, height, texWidth, texHeight), parent(parent) + int x, int y, int width, int height, + int texWidth, int texHeight): + Image("", image, width, height, texWidth, texHeight), mParent(parent) { - parent->incRef(); + mParent->incRef(); // Set up the rectangle. bounds.x = x; @@ -361,14 +350,14 @@ SubImage::SubImage(Image *parent, GLuint image, SubImage::~SubImage() { #ifdef USE_OPENGL - if (!useOpenGL) { - image = NULL; + if (!mUseOpenGL) { + mImage = NULL; } #else - image = NULL; + mImage = NULL; #endif - parent->decRef(); + mParent->decRef(); } Image *SubImage::getSubImage(int x, int y, int w, int h) diff --git a/src/resources/image.h b/src/resources/image.h index 6fc4e89a..a7d5cdf1 100644 --- a/src/resources/image.h +++ b/src/resources/image.h @@ -70,13 +70,14 @@ class Image : public Resource * Returns the width of the image. */ virtual int - getWidth() const; + getWidth() const { return bounds.w; } + /** * Returns the height of the image. */ virtual int - getHeight() const; + getHeight() const { return bounds.h; } /** * Creates a new image with the desired clipping rectangle. @@ -122,12 +123,12 @@ class Image : public Resource bool loaded; #ifdef USE_OPENGL - GLuint glimage; - int texWidth, texHeight; + GLuint mGLImage; + int mTexWidth, mTexHeight; - static bool useOpenGL; + static bool mUseOpenGL; #endif - SDL_Surface *image; + SDL_Surface *mImage; float alpha; }; @@ -162,7 +163,7 @@ class SubImage : public Image getSubImage(int x, int y, int width, int height); private: - Image *parent; + Image *mParent; }; #endif diff --git a/src/resources/iteminfo.cpp b/src/resources/iteminfo.cpp deleted file mode 100644 index 69090dcb..00000000 --- a/src/resources/iteminfo.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/* - * The Mana World - * Copyright 2004 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World 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 - * any later version. - * - * The Mana World 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ - */ - -#include "iteminfo.h" - -ItemInfo::ItemInfo() : - image(0), name(""), - description(""), type(0), - weight(0), slot(0) -{ -} - -ItemInfo::~ItemInfo() -{ -} - -void ItemInfo::setImage(short image) -{ - this->image = image; -} - -short ItemInfo::getImage() -{ - return image; -} - -void ItemInfo::setArt(short art) -{ - this->art = art; -} - -short ItemInfo::getArt() -{ - return art; -} - -void ItemInfo::setName(const std::string &name) -{ - this->name = name; -} - -std::string ItemInfo::getName() -{ - return name; -} - -void ItemInfo::setDescription(const std::string &description) -{ - this->description = description; -} - -std::string ItemInfo::getDescription() -{ - return description; -} - -void ItemInfo::setEffect(const std::string &effect) -{ - this->effect = effect; -} - -std::string ItemInfo::getEffect() -{ - return effect; -} - -void ItemInfo::setType(short type) -{ - this->type = type; -} - -short ItemInfo::getType() -{ - return type; -} - -void ItemInfo::setWeight(short weight) -{ - this->weight = weight; -} - -short ItemInfo::getWeight() -{ - return weight; -} - -void ItemInfo::setSlot(char slot) -{ - this->slot = slot; -} - -char ItemInfo::getSlot() -{ - return slot; -} diff --git a/src/resources/iteminfo.h b/src/resources/iteminfo.h index 937911af..c515fd1c 100644 --- a/src/resources/iteminfo.h +++ b/src/resources/iteminfo.h @@ -37,52 +37,80 @@ class ItemInfo /** * Constructor. */ - ItemInfo(); + ItemInfo(): + mImage(0), + mArt(0), + mType(0), + mWeight(0), + mSlot(0) + { + } - void setImage(short image); - - short getImage(); - - void setArt(short art); - - short getArt(); - - void setName(const std::string &name); - - std::string getName(); - - void setDescription(const std::string &description); + void + setArt(short art) { mArt = art; } - std::string getDescription(); + short + getArt() { return mArt; } - void setEffect(const std::string &effect); + void + setName(const std::string &name) { mName = name; } - std::string getEffect(); + std::string + getName() { return mName; } - void setType(short type); + void + setImage(short image) { mImage = image; } - short getType(); - - void setWeight(short weight); + short + getImage() { return mImage; } - short getWeight(); - - void setSlot(char slot); - - char getSlot(); + void + setDescription(const std::string &description) + { + mDescription = description; + } + + std::string + getDescription() { return mDescription; } + + void + setEffect(const std::string &effect) { mEffect = effect; } + + std::string + getEffect() { return mEffect; } + + void + setType(short type) { mType = type; } + + short + getType() { return mType; } + + void + setWeight(short weight) { mWeight = weight; } + + short + getWeight() { return mWeight; } + + void + setSlot(char slot) { mSlot = slot; } + + char + getSlot() { return mSlot; } protected: /** * Destructor. */ - ~ItemInfo(); - - short image, art; - std::string name; - std::string description; - std::string effect; - short type, weight; - char slot; + ~ItemInfo() {} + + short mImage; + short mArt; + std::string mName; + std::string mDescription; + std::string mEffect; + short mType; + short mWeight; + char mSlot; }; #endif diff --git a/src/resources/music.cpp b/src/resources/music.cpp index ba9f6df7..09e2752a 100644 --- a/src/resources/music.cpp +++ b/src/resources/music.cpp @@ -24,19 +24,20 @@ #include "music.h" Music::Music(const std::string &idPath, Mix_Chunk *music): - Resource(idPath), music(music) + Resource(idPath), + mChunk(music), + mChannel(-1) { - channel = -1; } Music::~Music() { //Mix_FreeMusic(music); - Mix_FreeChunk(music); - music = NULL; + Mix_FreeChunk(mChunk); } -Music* Music::load(void* buffer, unsigned int bufferSize, const std::string &idPath) +Music* +Music::load(void *buffer, unsigned int bufferSize, const std::string &idPath) { // Load the raw file data from the buffer in an RWops structure SDL_RWops *rw = SDL_RWFromMem(buffer, bufferSize); @@ -44,39 +45,41 @@ Music* Music::load(void* buffer, unsigned int bufferSize, const std::string &idP // Use Mix_LoadMUS to load the raw music data //Mix_Music* music = Mix_LoadMUS_RW(rw); Need to be implemeted Mix_Chunk *tmpMusic = Mix_LoadWAV_RW(rw, 0); - + // Now free the SDL_RWops data SDL_FreeRW(rw); return new Music(idPath, tmpMusic); } -bool Music::play(int loops) +bool +Music::play(int loops) { /* * Warning: loops should be always set to -1 (infinite) with current * implementation to avoid halting the playback of other samples */ - + /*if (Mix_PlayMusic(music, loops)) return true;*/ - Mix_VolumeChunk(music, 120); - channel = Mix_PlayChannel(-1, music, loops); - if (channel != -1) - return true; - return false; + Mix_VolumeChunk(mChunk, 120); + mChannel = Mix_PlayChannel(-1, mChunk, loops); + + return mChannel != -1; } -bool Music::stop() +void +Music::stop() { /* * Warning: very dungerous trick, it could try to stop channels occupied * by samples rather than the current music file */ - + //Mix_HaltMusic(); - if (channel != -1) - Mix_HaltChannel(channel); - // Never fails - return true; + + if (mChannel != -1) + { + Mix_HaltChannel(mChannel); + } } diff --git a/src/resources/music.h b/src/resources/music.h index 4858eb86..9cf75928 100644 --- a/src/resources/music.h +++ b/src/resources/music.h @@ -48,7 +48,8 @@ class Music : public Resource * @return <code>NULL</code> if the an error occurred, a valid pointer * otherwise. */ - static Music *load(void* buffer, unsigned int bufferSize, const std::string &idPath); + static Music* + load(void* buffer, unsigned int bufferSize, const std::string &idPath); /** * Plays the music. @@ -58,15 +59,14 @@ class Music : public Resource * @return <code>true</code> if the playback started properly * <code>false</code> otherwise. */ - virtual bool play(int loops); + virtual bool + play(int loops); /** * Stops the music. - * - * @return <code>true</code> if the playback was stopped properly - * <code>false</code> otherwise. */ - virtual bool stop(); + virtual void + stop(); protected: /** @@ -75,8 +75,8 @@ class Music : public Resource Music(const std::string &idPath, Mix_Chunk *music); //Mix_Music *music; - Mix_Chunk *music; - int channel; + Mix_Chunk *mChunk; + int mChannel; }; #endif diff --git a/src/resources/soundeffect.cpp b/src/resources/soundeffect.cpp index 7c77d5b7..3340e5ea 100644 --- a/src/resources/soundeffect.cpp +++ b/src/resources/soundeffect.cpp @@ -24,34 +24,36 @@ #include "soundeffect.h" SoundEffect::SoundEffect(const std::string &idPath, Mix_Chunk *soundEffect): - Resource(idPath), soundEffect(soundEffect) + Resource(idPath), + mChunk(soundEffect) { } SoundEffect::~SoundEffect() { - Mix_FreeChunk(soundEffect); - soundEffect = NULL; + Mix_FreeChunk(mChunk); } -SoundEffect* SoundEffect::load(void* buffer, unsigned int bufferSize, const std::string &idPath) +SoundEffect* +SoundEffect::load(void *buffer, unsigned int bufferSize, + const std::string &idPath) { // Load the raw file data from the buffer in an RWops structure SDL_RWops *rw = SDL_RWFromMem(buffer, bufferSize); // Use Mix_LoadWAV_RW to load the raw music data Mix_Chunk *tmpSoundEffect = Mix_LoadWAV_RW(rw, 0); - + // Now free the SDL_RWops data SDL_FreeRW(rw); return new SoundEffect(idPath, tmpSoundEffect); } -bool SoundEffect::play(int loops, int volume) +bool +SoundEffect::play(int loops, int volume) { - Mix_VolumeChunk(soundEffect, volume); - if (Mix_PlayChannel(-1, soundEffect, loops) != -1) - return true; - return false; + Mix_VolumeChunk(mChunk, volume); + + return Mix_PlayChannel(-1, mChunk, loops) != -1; } diff --git a/src/resources/soundeffect.h b/src/resources/soundeffect.h index bd1c3c00..92b0016a 100644 --- a/src/resources/soundeffect.h +++ b/src/resources/soundeffect.h @@ -37,7 +37,8 @@ class SoundEffect : public Resource /** * Destructor. */ - virtual ~SoundEffect(); + virtual + ~SoundEffect(); /** * Loads a sample from a buffer in memory. @@ -48,8 +49,8 @@ class SoundEffect : public Resource * @return <code>NULL</code> if the an error occurred, a valid pointer * otherwise. */ - static SoundEffect *load(void* buffer, unsigned int bufferSize, - const std::string &idPath); + static SoundEffect* + load(void* buffer, unsigned int bufferSize, const std::string &idPath); /** * Plays the sample. @@ -60,7 +61,8 @@ class SoundEffect : public Resource * @return <code>true</code> if the playback started properly * <code>false</code> otherwise. */ - virtual bool play(int loops, int volume); + virtual bool + play(int loops, int volume); protected: /** @@ -68,7 +70,7 @@ class SoundEffect : public Resource */ SoundEffect(const std::string &idPath, Mix_Chunk *soundEffect); - Mix_Chunk *soundEffect; + Mix_Chunk *mChunk; }; #endif diff --git a/src/sound.cpp b/src/sound.cpp index 7bbe36e7..f4b2a3ed 100644 --- a/src/sound.cpp +++ b/src/sound.cpp @@ -76,7 +76,7 @@ void Sound::info() SDL_version compiledVersion; const SDL_version *linkedVersion; char driver[40] = "Unknown"; - char *format = "Unknown"; + const char *format = "Unknown"; int rate = 0; Uint16 audioFormat = 0; int channels = 0; diff --git a/src/sprite.h b/src/sprite.h index 97851138..2950f4e8 100644 --- a/src/sprite.h +++ b/src/sprite.h @@ -24,23 +24,20 @@ #ifndef _TMW_SPRITE_H_ #define _TMW_SPRITE_H_ -#include "graphics.h" +class Graphics; /** - * A sprite is some visible object on a map. + * A sprite is some visible object on a map. This abstract class defines the + * interface used by the map to sort and display the sprite. */ class Sprite { public: /** - * Constructor. + * Destructor. */ - Sprite(int x = 0, int y = 0, Image *image = NULL): - mX(x), - mY(y), - mImage(image) - { - } + virtual + ~Sprite() {} /** * Draws the sprite to the given graphics context. @@ -49,28 +46,20 @@ class Sprite * would support setting a translation offset. It already does this * partly with the clipping rectangle support. */ - void - draw(Graphics *graphics, int offsetX, int offsetY) - { - graphics->drawImage(mImage, mX + offsetX, mY + offsetY); - } + virtual void + draw(Graphics *graphics, int offsetX, int offsetY) = 0; /** - * Returns the X coordinate of the sprite. + * Returns the pixel Y coordinate of the sprite. */ - int - getY() const { return mY; } + virtual int + getPixelY() const = 0; + protected: /** - * Returns the Y coordinate of the sprite. + * Constructor. */ - int - getX() const { return mX; } - - private: - int mX; /**< X coordinate in pixels. */ - int mY; /**< Y coordinate in pixels. */ - Image *mImage; /**< The image currently representing this sprite. */ + Sprite() {} }; #endif |