diff options
Diffstat (limited to 'src/being.cpp')
-rw-r--r-- | src/being.cpp | 278 |
1 files changed, 14 insertions, 264 deletions
diff --git a/src/being.cpp b/src/being.cpp index 08341bb9..aeb90860 100644 --- a/src/being.cpp +++ b/src/being.cpp @@ -20,7 +20,6 @@ * * $Id$ */ - #include "being.h" #include <algorithm> @@ -30,153 +29,29 @@ #include "graphics.h" #include "log.h" #include "map.h" +#include "monster.h" +#include "player.h" #include "graphic/spriteset.h" #include "gui/gui.h" -#include "net/messageout.h" -#include "net/protocol.h" - -#include "resources/resourcemanager.h" - -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; - -Beings beings; - -signed 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) { } -Being* createBeing(Uint32 id, Uint16 job, Map *map) -{ - Being *being = new Being; - - being->setId(id); - being->job = job; - being->setMap(map); - - beings.push_back(being); - - // If the being is a player, request the name - if (being->getType() == Being::PLAYER) - { - MessageOut outMsg; - outMsg.writeInt16(0x0094); - outMsg.writeInt32(being->getId());//readLong(2)); - } - // If the being is a monster then load the monsterset - else if (being->job >= 1002 && - monsterset.find(being->job - 1002) == monsterset.end()) - { - std::stringstream filename; - - filename << "graphics/sprites/monster" << (being->job - 1002) << ".png"; - logger->log("%s",filename.str().c_str()); - - Spriteset *tmp = ResourceManager::getInstance()->createSpriteset( - filename.str(), 60, 60); - if (!tmp) { - logger->error("Unable to load monster spriteset!"); - } else { - monsterset[being->job - 1002] = tmp; - } - } - - return being; -} - -void remove_node(Being *being) -{ - delete being; - beings.remove(being); -} - -Being *findNode(Uint32 id) -{ - for (Beings::iterator i = beings.begin(); i != beings.end(); i++) - { - Being *being = (*i); - if (being->getId() == id) { - return being; - } - } - return NULL; -} - -class FindNodeFunctor -{ - public: - bool operator() (Being *being) - { - Uint16 other_y = y + ((being->getType() == Being::NPC) ? 1 : 0); - return (being->x == x && (being->y == y || being->y == other_y) && - being->action != Being::MONSTER_DEAD && - (type == Being::UNKNOWN || being->getType() == type)); - } - - Uint16 x, y; - Being::Type type; -} nodeFinder; - -Being *findNode(Uint16 x, Uint16 y) -{ - return findNode(x, y, Being::UNKNOWN); -} - -Being* findNode(Uint16 x, Uint16 y, Being::Type type) -{ - nodeFinder.x = x; - nodeFinder.y = y; - nodeFinder.type = type; - - Beings::iterator i = find_if(beings.begin(), beings.end(), nodeFinder); - - return (i == beings.end()) ? NULL : *i; -} - -Being::Being(): - job(0), +Being::Being(Uint32 id, Uint16 job, Map *map): + job(job), x(0), y(0), direction(SOUTH), action(0), mFrame(0), speech_color(0), walk_time(0), emotion(0), emotion_time(0), aspd(350), - mId(0), + mId(id), mWeapon(0), mWalkSpeed(150), mMap(NULL), @@ -185,6 +60,7 @@ Being::Being(): damage_time(0), showSpeech(false), showDamage(false) { + setMap(map); } Being::~Being() @@ -325,48 +201,13 @@ Being::logic() showDamage = false; } - // Execute next walk or attack command for players - if (getType() == PLAYER) - { - switch (action) { - case WALK: - mFrame = (get_elapsed_time(walk_time) * 4) / mWalkSpeed; - 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 (getType() == MONSTER && action != STAND) - { - mFrame = (get_elapsed_time(walk_time) * 4) / mWalkSpeed; - - if (mFrame >= 4 && action != MONSTER_DEAD) - { - nextStep(); - } - } - // Update pixel coordinates mPx = x * 32; mPy = y * 32; - if (getType() == PLAYER || getType() == MONSTER) - { - mPy += getYOffset(); - mPx += getXOffset(); - } - + mPy += getYOffset(); + mPx += getXOffset(); + if (emotion != 0) { emotion_time--; @@ -406,7 +247,7 @@ Being::drawSpeech(Graphics *graphics, Sint32 offsetX, Sint32 offsetY) graphics->setFont(hitRedFont); } - int textY = (getType() == PLAYER) ? 70 : 32; + int textY = (getType() == MONSTER) ? 32 : 70; int ft = get_elapsed_time(damage_time) - 1500; float a = (ft > 0) ? 1.0 - ft / 1500.0 : 1.0; @@ -419,29 +260,11 @@ Being::drawSpeech(Graphics *graphics, Sint32 offsetX, Sint32 offsetY) // Reset alpha value graphics->setColor(gcn::Color(255, 255, 255)); } - - // Potentially draw [TARGET] above this being - if (this == autoTarget) - { - graphics->setFont(speechFont); - int dy = (getType() == PLAYER) ? 90 : 52; - - graphics->drawText("[TARGET]", px + 15, py - dy, - gcn::Graphics::CENTER); - } } Being::Type Being::getType() const { - if (job < 10) { - return PLAYER; - } else if (job >= 100 & job < 200) { - return NPC; - } else if (job >= 1000 && job < 1200) { - return MONSTER; - } else { - return UNKNOWN; - } + return UNKNOWN; } void Being::setWeaponById(Uint16 weapon) @@ -524,85 +347,12 @@ Being::getYOffset() const void Being::draw(Graphics *graphics, int offsetX, int offsetY) { - unsigned char dir = direction / 2; int px = mPx + offsetX; int py = mPy + offsetY; - int frame; - switch (getType()) + if (emotion) { - case PLAYER: - frame = action; - - if (action != SIT && action != DEAD) - { - frame += mFrame; - } - - 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); - } - - // Draw player name - if (this != player_node) { - graphics->setFont(speechFont); - graphics->drawText(mName, px + 15, py + 30, gcn::Graphics::CENTER); - } - break; - - case NPC: - graphics->drawImage(npcset->spriteset[job - 100], px - 8, py - 52); - break; - - case MONSTER: - if (mFrame >= 4) - { - mFrame = 3; - } - - frame = action; - if (action != MONSTER_DEAD) { - frame += mFrame; - } - graphics->drawImage( - monsterset[job-1002]->spriteset[dir + 4 * frame], - px - 12, py - 25); - if (emotion != 0) - { - graphics->drawImage(emotionset->spriteset[emotion - 1], - px + 3, py - 60); - } - break; - - default: - break; + graphics->drawImage(emotionset->spriteset[emotion - 1], + px + 3, py - 60); } } |