00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "animatedsprite.h"
00023 #include "beingmanager.h"
00024 #include "npc.h"
00025 #include "particle.h"
00026 #include "text.h"
00027
00028 #include "gui/npc_text.h"
00029 #include "gui/palette.h"
00030
00031 #include "net/net.h"
00032 #include "net/npchandler.h"
00033
00034 #include "resources/npcdb.h"
00035
00036 bool NPC::isTalking = false;
00037 int current_npc = 0;
00038
00039 NPC::NPC(int id, int job, Map *map):
00040 Player(id, job, map)
00041 {
00042 NPCInfo info = NPCDB::get(job);
00043
00044
00045 int c = BASE_SPRITE;
00046 for (std::list<NPCsprite*>::const_iterator i = info.sprites.begin();
00047 i != info.sprites.end();
00048 i++)
00049 {
00050 if (c == VECTOREND_SPRITE)
00051 break;
00052
00053 std::string file = "graphics/sprites/" + (*i)->sprite;
00054 int variant = (*i)->variant;
00055 mSprites[c] = AnimatedSprite::load(file, variant);
00056 c++;
00057 }
00058
00059 if (mParticleEffects)
00060 {
00061
00062 for (std::list<std::string>::const_iterator i = info.particles.begin();
00063 i != info.particles.end();
00064 i++)
00065 {
00066 Particle *p = particleEngine->addEffect(*i, 0, 0);
00067 this->controlParticle(p);
00068 }
00069 }
00070 mName = 0;
00071
00072 mNameColor = &guiPalette->getColor(Palette::NPC);
00073 }
00074
00075 NPC::~NPC()
00076 {
00077 delete mName;
00078 }
00079
00080 void NPC::setName(const std::string &name)
00081 {
00082 const std::string displayName = name.substr(0, name.find('#', 0));
00083
00084 delete mName;
00085 mName = new Text(displayName,
00086 getPixelX(),
00087 getPixelY(),
00088 gcn::Graphics::CENTER,
00089 &guiPalette->getColor(Palette::NPC));
00090 Being::setName(displayName + " (NPC)");
00091 }
00092
00093 void NPC::setGender(Gender gender)
00094 {
00095 Being::setGender(gender);
00096 }
00097
00098 void NPC::setSprite(int slot, int id, std::string color)
00099 {
00100
00101 Being::setSprite(slot, id, color);
00102 }
00103
00104 Being::Type NPC::getType() const
00105 {
00106 return Being::NPC;
00107 }
00108
00109 void NPC::talk()
00110 {
00111 if (isTalking)
00112 return;
00113
00114 isTalking = true;
00115
00116 Net::getNpcHandler()->talk(mId);
00117 }
00118
00119 void NPC::updateCoords()
00120 {
00121 if (mName)
00122 {
00123 mName->adviseXY(getPixelX(), getPixelY());
00124 }
00125 }