summaryrefslogtreecommitdiff
path: root/src/monster.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/monster.cpp')
-rw-r--r--src/monster.cpp144
1 files changed, 106 insertions, 38 deletions
diff --git a/src/monster.cpp b/src/monster.cpp
index c472a21b..deabd7a8 100644
--- a/src/monster.cpp
+++ b/src/monster.cpp
@@ -1,44 +1,48 @@
/*
* The Mana World
- * Copyright 2004 The Mana World Development Team
+ * Copyright (C) 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
+ * This program 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,
+ * This program 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
+ * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#include "monster.h"
-
#include "animatedsprite.h"
#include "game.h"
+#include "localplayer.h"
+#include "monster.h"
#include "particle.h"
#include "sound.h"
+#include "text.h"
#include "resources/monsterdb.h"
+#include "resources/monsterinfo.h"
-#include "utils/tostring.h"
+static const int NAME_X_OFFSET = 16;
+static const int NAME_Y_OFFSET = 16;
-
-Monster::Monster(Uint16 id, Uint16 job, Map *map):
- Being(id, job, map)
+Monster::Monster(Uint32 id, Uint16 job, Map *map):
+ Being(id, job, map),
+ mText(0)
{
const MonsterInfo& info = getInfo();
// Setup Monster sprites
int c = BASE_SPRITE;
const std::list<std::string> &sprites = info.getSprites();
+
for (std::list<std::string>::const_iterator i = sprites.begin();
i != sprites.end();
i++)
@@ -56,27 +60,48 @@ Monster::Monster(Uint16 id, Uint16 job, Map *map):
mSprites[c] = AnimatedSprite::load("graphics/sprites/error.xml");
}
- const std::list<std::string> &particleEffects = info.getParticleEffects();
- for (std::list<std::string>::const_iterator i = particleEffects.begin();
- i != particleEffects.end();
- i++)
+ if (mParticleEffects)
{
- controlParticle(particleEngine->addEffect((*i), 0, 0));
+ const std::list<std::string> &particleEffects = info.getParticleEffects();
+ for ( std::list<std::string>::const_iterator i = particleEffects.begin();
+ i != particleEffects.end(); i++
+ )
+ {
+ controlParticle(particleEngine->addEffect((*i), 0, 0));
+ }
}
+
+ mNameColor = 0xff2020;
}
Monster::~Monster()
{
+ delete mText;
+}
+
+#ifdef EATHENA_SUPPORT
+void Monster::logic()
+{
+ if (mAction != STAND)
+ {
+ mFrame = (get_elapsed_time(mWalkTime) * 4) / getWalkSpeed();
+
+ if (mFrame >= 4 && mAction != DEAD)
+ {
+ nextStep();
+ }
+ }
+
+ Being::logic();
}
+#endif
-Being::Type
-Monster::getType() const
+Being::Type Monster::getType() const
{
return MONSTER;
}
-void
-Monster::setAction(Action action, int attackType)
+void Monster::setAction(Action action, int attackType)
{
SpriteAction currentAction = ACTION_INVALID;
int rotation = 0;
@@ -93,10 +118,11 @@ Monster::setAction(Action action, int attackType)
break;
case ATTACK:
currentAction = getInfo().getAttackAction(attackType);
+ mSprites[BASE_SPRITE]->reset();
//attack particle effect
particleEffect = getInfo().getAttackParticleEffect(attackType);
- if (particleEffect != "")
+ if (!particleEffect.empty() && mParticleEffects)
{
switch (mDirection)
{
@@ -106,21 +132,21 @@ Monster::setAction(Action action, int attackType)
case RIGHT: rotation = 270; break;
default: break;
}
- mSprites[BASE_SPRITE]->reset();
- Particle *p;
- p = particleEngine->addEffect(
+ Particle *p;
+ p = particleEngine->addEffect(
particleEffect, 0, 0, rotation);
- controlParticle(p);
+ controlParticle(p);
}
break;
case STAND:
- currentAction = ACTION_STAND;
- break;
+ currentAction = ACTION_STAND;
+ break;
case HURT:
- // Not implemented yet
- break;
- default:
- break;
+ // Not implemented yet
+ break;
+ case SIT:
+ // Also not implemented yet
+ break;
}
if (currentAction != ACTION_INVALID)
@@ -136,8 +162,9 @@ Monster::setAction(Action action, int attackType)
}
}
-void
-Monster::handleAttack()
+#ifdef TMWSERV_SUPPORT
+
+void Monster::handleAttack()
{
Being::handleAttack();
@@ -149,21 +176,62 @@ Monster::handleAttack()
sound.playSfx(mi.getSound(MONSTER_EVENT_HIT));
}
-void
-Monster::takeDamage(int amount)
+#else
+
+void Monster::handleAttack(Being *victim, int damage)
+{
+ Being::handleAttack(victim, damage);
+
+ const MonsterInfo &mi = getInfo();
+ sound.playSfx(mi.getSound((damage > 0) ?
+ MONSTER_EVENT_HIT : MONSTER_EVENT_MISS));
+}
+
+#endif
+
+void Monster::takeDamage(int amount)
{
if (amount > 0) sound.playSfx(getInfo().getSound(MONSTER_EVENT_HURT));
Being::takeDamage(amount);
}
-Being::TargetCursorSize
-Monster::getTargetCursorSize() const
+Being::TargetCursorSize Monster::getTargetCursorSize() const
{
return getInfo().getTargetCursorSize();
}
-const MonsterInfo&
-Monster::getInfo() const
+const MonsterInfo &Monster::getInfo() const
{
+#ifdef TMWSERV_SUPPORT
return MonsterDB::get(mJob);
+#else
+ return MonsterDB::get(mJob - 1002);
+#endif
+}
+
+void Monster::showName(bool show)
+{
+ if (mText)
+ {
+ delete mText;
+ }
+ if (show)
+ {
+ mText = new Text(getInfo().getName(), mPx + NAME_X_OFFSET,
+ mPy + NAME_Y_OFFSET - getHeight(),
+ gcn::Graphics::CENTER, gcn::Color(255, 64, 64));
+ }
+ else
+ {
+ mText = 0;
+ }
+}
+
+void Monster::updateCoords()
+{
+ if (mText)
+ {
+ mText->adviseXY(mPx + NAME_X_OFFSET,
+ mPy + NAME_Y_OFFSET - getHeight());
+ }
}