1 /*
2  *  Copyright (C) 2011-2016  OpenDungeons Team
3  *
4  *  This program is free software: you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License as published by
6  *  the Free Software Foundation, either version 3 of the License, or
7  *  (at your option) any later version.
8  *
9  *  This program is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License
15  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #include "entities/MissileOneHit.h"
19 
20 #include "entities/Building.h"
21 #include "gamemap/GameMap.h"
22 #include "network/ODPacket.h"
23 #include "utils/LogManager.h"
24 #include "utils/Random.h"
25 
26 #include <iostream>
27 
MissileOneHit(GameMap * gameMap,Seat * seat,const std::string & senderName,const std::string & meshName,const std::string & particleScript,const Ogre::Vector3 & direction,double speed,double physicalDamage,double magicalDamage,double elementDamage,GameEntity * entityTarget,bool damageAllies,bool koEnemyCreature,bool notifyPlayerIfHit)28 MissileOneHit::MissileOneHit(GameMap* gameMap, Seat* seat, const std::string& senderName, const std::string& meshName,
29         const std::string& particleScript, const Ogre::Vector3& direction, double speed, double physicalDamage, double magicalDamage,
30         double elementDamage, GameEntity* entityTarget, bool damageAllies, bool koEnemyCreature, bool notifyPlayerIfHit) :
31     MissileObject(gameMap, seat, senderName, meshName, direction, speed, entityTarget, damageAllies, koEnemyCreature),
32     mPhysicalDamage(physicalDamage),
33     mMagicalDamage(magicalDamage),
34     mElementDamage(elementDamage),
35     mNotifyPlayerIfHit(notifyPlayerIfHit)
36 {
37     if(!particleScript.empty())
38     {
39         EntityParticleEffect* effect = new EntityParticleEffect(nextParticleSystemsName(), particleScript, -1);
40         mEntityParticleEffects.push_back(effect);
41     }
42 }
43 
MissileOneHit(GameMap * gameMap)44 MissileOneHit::MissileOneHit(GameMap* gameMap) :
45         MissileObject(gameMap),
46     mPhysicalDamage(0.0),
47     mMagicalDamage(0.0),
48     mElementDamage(0.0),
49     mNotifyPlayerIfHit(false)
50 {
51 }
52 
hitCreature(Tile * tile,GameEntity * entity)53 bool MissileOneHit::hitCreature(Tile* tile, GameEntity* entity)
54 {
55     entity->takeDamage(this, 0.0, mPhysicalDamage, mMagicalDamage, mElementDamage, tile, getKoEnemyCreature());
56     if(mNotifyPlayerIfHit)
57         entity->notifyFightPlayer(tile);
58 
59     return false;
60 }
61 
hitTargetEntity(Tile * tile,GameEntity * entityTarget)62 void MissileOneHit::hitTargetEntity(Tile* tile, GameEntity* entityTarget)
63 {
64     entityTarget->takeDamage(this, 0.0, mPhysicalDamage, mMagicalDamage, mElementDamage, tile, getKoEnemyCreature());
65     if(mNotifyPlayerIfHit)
66         entityTarget->notifyFightPlayer(tile);
67 }
68 
getMissileOneHitFromStream(GameMap * gameMap,std::istream & is)69 MissileOneHit* MissileOneHit::getMissileOneHitFromStream(GameMap* gameMap, std::istream& is)
70 {
71     MissileOneHit* obj = new MissileOneHit(gameMap);
72     obj->importFromStream(is);
73     return obj;
74 }
75 
getMissileOneHitFromPacket(GameMap * gameMap,ODPacket & is)76 MissileOneHit* MissileOneHit::getMissileOneHitFromPacket(GameMap* gameMap, ODPacket& is)
77 {
78     MissileOneHit* obj = new MissileOneHit(gameMap);
79     obj->importFromPacket(is);
80     return obj;
81 }
82 
exportToStream(std::ostream & os) const83 void MissileOneHit::exportToStream(std::ostream& os) const
84 {
85     MissileObject::exportToStream(os);
86     os << mPhysicalDamage << "\t";
87     os << mMagicalDamage << "\t";
88     os << mElementDamage << "\t";
89 
90     uint32_t nbEffects = mEntityParticleEffects.size();
91     os << "\t" << nbEffects;
92     for(EntityParticleEffect* effect : mEntityParticleEffects)
93     {
94         os << "\t" << effect->mScript;
95     }
96 }
97 
importFromStream(std::istream & is)98 bool MissileOneHit::importFromStream(std::istream& is)
99 {
100     if(!MissileObject::importFromStream(is))
101         return false;
102     if(!(is >> mPhysicalDamage))
103         return false;
104     if(!(is >> mMagicalDamage))
105         return false;
106     if(!(is >> mElementDamage))
107         return false;
108     uint32_t nbEffects;
109     if(!(is >> nbEffects))
110         return false;
111     while(nbEffects > 0)
112     {
113         --nbEffects;
114         std::string effectScript;
115         if(!(is >> effectScript))
116             return false;
117         EntityParticleEffect* effect = new EntityParticleEffect(nextParticleSystemsName(), effectScript, -1);
118         mEntityParticleEffects.push_back(effect);
119     }
120 
121     return true;
122 }
123