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