summaryrefslogtreecommitdiff
path: root/src/being.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/being.cpp')
-rw-r--r--src/being.cpp278
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);
}
}