diff options
Diffstat (limited to 'src/being.cpp')
-rw-r--r-- | src/being.cpp | 77 |
1 files changed, 42 insertions, 35 deletions
diff --git a/src/being.cpp b/src/being.cpp index dcb45a9d..86811e33 100644 --- a/src/being.cpp +++ b/src/being.cpp @@ -30,6 +30,7 @@ #include "log.h" #include "map.h" #include "particle.h" +#include "simpleanimation.h" #include "sound.h" #include "text.h" #include "statuseffect.h" @@ -37,10 +38,8 @@ #include "gui/speechbubble.h" #include "resources/colordb.h" - #include "resources/emotedb.h" #include "resources/image.h" -#include "resources/imageset.h" #include "resources/itemdb.h" #include "resources/iteminfo.h" #include "resources/resourcemanager.h" @@ -95,7 +94,8 @@ Being::Being(int id, int job, Map *map): mSpriteColors(VECTOREND_SPRITE, ""), mStatusParticleEffects(&mStunParticleEffects, false), mChildParticleEffects(&mStatusParticleEffects, false), - mMustResetParticles(false) + mMustResetParticles(false), + mUsedTargetCursor(NULL) { setMap(map); @@ -113,7 +113,8 @@ Being::Being(int id, int job, Map *map): emotionSet.push_back(AnimatedSprite::load(file, variant)); } - // Hairstyles are encoded as negative numbers. Count how far negative we can go. + // Hairstyles are encoded as negative numbers. Count how far negative + // we can go. int hairstyles = 1; while (ItemDB::get(-hairstyles).getSprite(GENDER_MALE) != "error.xml") { @@ -130,6 +131,7 @@ Being::Being(int id, int job, Map *map): Being::~Being() { + mUsedTargetCursor = NULL; delete_all(mSprites); clearPath(); @@ -149,9 +151,7 @@ Being::~Being() void Being::setDestination(Uint16 destX, Uint16 destY) { if (mMap) - { setPath(mMap->findPath(mX, mY, destX, destY)); - } } void Being::clearPath() @@ -232,19 +232,13 @@ void Being::takeDamage(int amount) // Selecting the right color if (damage == "miss") - { font = hitYellowFont; - } else { if (getType() == MONSTER) - { font = hitBlueFont; - } else - { font = hitRedFont; - } } // Show damage number @@ -270,17 +264,13 @@ void Being::setMap(Map *map) { // Remove sprite from potential previous map if (mMap) - { mMap->removeSprite(mSpriteIterator); - } mMap = map; // Add sprite to potential new map if (mMap) - { mSpriteIterator = mMap->addSprite(this); - } // Clear particle effect list because child particles became invalid mChildParticleEffects.clear(); @@ -316,9 +306,7 @@ void Being::setAction(Action action) for (int i = 0; i < VECTOREND_SPRITE; i++) { if (mSprites[i]) - { mSprites[i]->reset(); - } } break; case HURT: @@ -339,9 +327,7 @@ void Being::setAction(Action action) for (int i = 0; i < VECTOREND_SPRITE; i++) { if (mSprites[i]) - { mSprites[i]->play(currentAction); - } } mAction = action; } @@ -449,18 +435,18 @@ void Being::logic() if (mEmotion != 0) { mEmotionTime--; - if (mEmotionTime == 0) { + if (mEmotionTime == 0) mEmotion = 0; - } } // Update sprite animations + if (mUsedTargetCursor != NULL) + mUsedTargetCursor->update(tick_time * 10); + for (int i = 0; i < VECTOREND_SPRITE; i++) { if (mSprites[i]) - { mSprites[i]->update(tick_time * 10); - } } // Restart status/particle effects, if needed @@ -485,6 +471,11 @@ void Being::draw(Graphics *graphics, int offsetX, int offsetY) const int px = mPx + offsetX; int py = mPy + offsetY; + if (mUsedTargetCursor != NULL) + { + mUsedTargetCursor->draw(graphics, px, py); + } + for (int i = 0; i < VECTOREND_SPRITE; i++) { if (mSprites[i]) @@ -509,28 +500,33 @@ void Being::drawEmotion(Graphics *graphics, int offsetX, int offsetY) void Being::drawSpeech(int offsetX, int offsetY) { - int px = mPx + offsetX; - int py = mPy + offsetY; + const int px = mPx + offsetX; + const int py = mPy + offsetY; + const int speech = (int) config.getValue("speech", NAME_IN_BUBBLE); // Draw speech above this being - if (mSpeechTime > 0 && config.getValue("speechbubble", 1)) + if (mSpeechTime > 0 && (speech == NAME_IN_BUBBLE || + speech == NO_NAME_IN_BUBBLE)) { + const bool showName = (speech == NAME_IN_BUBBLE); + if (mText) { delete mText; mText = 0; } - mSpeechBubble->setCaption(mName, mNameColor); + mSpeechBubble->setCaption(showName ? mName : "", mNameColor); - // Not quite centered, but close enough. However, it's not too important to get - // it right right now, as it doesn't take bubble collision into account yet. - mSpeechBubble->setText(mSpeech); - mSpeechBubble->setPosition(px - (mSpeechBubble->getWidth() * 4 / 11), py - 70 - - (mSpeechBubble->getNumRows()*14)); + // Not quite centered, but close enough. However, it's not too important + // to get it right right now, as it doesn't take bubble collision into + // account yet. + mSpeechBubble->setText(mSpeech, showName); + mSpeechBubble->setPosition(px - (mSpeechBubble->getWidth() * 4 / 11), + py - 40 - (mSpeechBubble->getHeight())); mSpeechBubble->setVisible(true); } - else if (mSpeechTime > 0 && !config.getValue("speechbubble", 1)) + else if (mSpeechTime > 0 && speech == TEXT_OVERHEAD) { mSpeechBubble->setVisible(false); // don't introduce a memory leak @@ -540,6 +536,13 @@ void Being::drawSpeech(int offsetX, int offsetY) mText = new Text(mSpeech, mPx + X_SPEECH_OFFSET, mPy - Y_SPEECH_OFFSET, gcn::Graphics::CENTER, gcn::Color(255, 255, 255)); } + else if (speech == NO_SPEECH) + { + mSpeechBubble->setVisible(false); + if (mText) + delete mText; + mText = NULL; + } else if (mSpeechTime == 0) { mSpeechBubble->setVisible(false); @@ -648,7 +651,6 @@ int Being::getWidth() const } } - int Being::getHeight() const { if (mSprites[BASE_SPRITE]) @@ -664,6 +666,11 @@ int Being::getHeight() const } } +void Being::setTargetAnimation(SimpleAnimation* animation) +{ + mUsedTargetCursor = animation; + mUsedTargetCursor->reset(); +} struct EffectDescription { std::string mGFXEffect; |