diff --git a/source/glest_game/types/projectile_type.cpp b/source/glest_game/types/projectile_type.cpp index 9d6265c0..ab77addd 100644 --- a/source/glest_game/types/projectile_type.cpp +++ b/source/glest_game/types/projectile_type.cpp @@ -24,9 +24,9 @@ ProjectileType::ProjectileType() { projectileParticleSystemType=NULL; attackStartTime=0.0f; - splash=false; - splashRadius=0; - splashDamageAll=true; + splash=false; + splashRadius=0; + splashDamageAll=true; splashParticleSystemType=NULL; shake=false; @@ -35,7 +35,7 @@ ProjectileType::ProjectileType() { shakeVisible=true; shakeInCameraView=true; - shakeCameraAffected=false; + shakeCameraDistanceAffected=false; } @@ -67,19 +67,34 @@ void ProjectileType::load(const XmlNode *projectileNode, const string &dir, cons } } - const XmlNode *soundNode= projectileNode->getChild("sound"); - if(soundNode->getAttribute("enabled")->getBoolValue()){ + if(projectileNode->hasChild("hitshake")){ + const XmlNode *hitShakeNode= projectileNode->getChild("hitshake"); + shake=hitShakeNode->getAttribute("enabled")->getBoolValue(); + if(shake){ + shakeIntensity=hitShakeNode->getAttribute("intensity")->getIntValue(); + shakeDuration=hitShakeNode->getAttribute("duration")->getIntValue(); - hitSounds.resize((int)soundNode->getChildCount()); - for(int i=0; i < (int)soundNode->getChildCount(); ++i){ - const XmlNode *soundFileNode= soundNode->getChild("sound-file", i); - string path= soundFileNode->getAttribute("path")->getRestrictedValue(currentPath, true); - //printf("\n\n\n\n!@#$ ---> parentLoader [%s] path [%s] nodeValue [%s] i = %d",parentLoader.c_str(),path.c_str(),soundFileNode->getAttribute("path")->getRestrictedValue().c_str(),i); + shakeVisible=hitShakeNode->getAttribute("visible")->getBoolValue(); + shakeInCameraView=hitShakeNode->getAttribute("in-camera-view")->getBoolValue(); + shakeCameraDistanceAffected=hitShakeNode->getAttribute("camera-distance-affected")->getBoolValue(); + } + } - StaticSound *sound= new StaticSound(); - sound->load(path); - loadedFileList[path].push_back(make_pair(parentLoader,soundFileNode->getAttribute("path")->getRestrictedValue())); - hitSounds[i]= sound; + if(projectileNode->hasChild("hitsound")){ + const XmlNode *soundNode= projectileNode->getChild("hitsound"); + if(soundNode->getAttribute("enabled")->getBoolValue()){ + + hitSounds.resize((int)soundNode->getChildCount()); + for(int i=0; i < (int)soundNode->getChildCount(); ++i){ + const XmlNode *soundFileNode= soundNode->getChild("sound-file", i); + string path= soundFileNode->getAttribute("path")->getRestrictedValue(currentPath, true); + //printf("\n\n\n\n!@#$ ---> parentLoader [%s] path [%s] nodeValue [%s] i = %d",parentLoader.c_str(),path.c_str(),soundFileNode->getAttribute("path")->getRestrictedValue().c_str(),i); + + StaticSound *sound= new StaticSound(); + sound->load(path); + loadedFileList[path].push_back(make_pair(parentLoader,soundFileNode->getAttribute("path")->getRestrictedValue())); + hitSounds[i]= sound; + } } } } diff --git a/source/glest_game/types/projectile_type.h b/source/glest_game/types/projectile_type.h index 15c5d31d..3a3b6ec6 100644 --- a/source/glest_game/types/projectile_type.h +++ b/source/glest_game/types/projectile_type.h @@ -52,7 +52,7 @@ protected: bool shakeVisible; bool shakeInCameraView; - bool shakeCameraAffected; + bool shakeCameraDistanceAffected; public: ProjectileType(); @@ -73,7 +73,7 @@ public: int getSplashRadius() const { return splashRadius;} bool isShake() const{return shake;} - bool isShakeCameraAffected() const{return shakeCameraAffected;} + bool isShakeCameraDistanceAffected() const{return shakeCameraDistanceAffected;} int getShakeDuration() const{return shakeDuration;} bool isShakeInCameraView() const{return shakeInCameraView;} int getShakeIntensity() const{return shakeIntensity;} diff --git a/source/glest_game/types/skill_type.cpp b/source/glest_game/types/skill_type.cpp index d7d343fb..8ccff7e7 100644 --- a/source/glest_game/types/skill_type.cpp +++ b/source/glest_game/types/skill_type.cpp @@ -881,19 +881,7 @@ void AttackSkillType::load(const XmlNode *sn, const XmlNode *attackBoostsNode, } } - if(sn->hasChild("projectiles")){ - const XmlNode *projectilesNode= sn->getChild("projectiles"); - vector projectilesNodeList = projectilesNode->getChildList("projectile"); - for(unsigned int i = 0; i < projectilesNodeList.size(); ++i) { - const XmlNode *projectileNode= projectilesNodeList[i]; - ProjectileType *projectileType=new ProjectileType(); - projectileType->load(projectileNode,dir, tt->getPath(), loadedFileList, parentLoader); - - projectileTypes.push_back(projectileType); - projectile=true; - } - } - else { + if(sn->hasChild("projectile")){ //projectile -- backward compatible old behaviour with only one projectile const XmlNode *projectileNode= sn->getChild("projectile"); projectile= projectileNode->getAttribute("value")->getBoolValue(); @@ -934,6 +922,34 @@ void AttackSkillType::load(const XmlNode *sn, const XmlNode *attackBoostsNode, } } } + else { + const XmlNode *projectilesNode= sn->getChild("projectiles"); + vector projectilesNodeList = projectilesNode->getChildList("projectile"); + for(unsigned int i = 0; i < projectilesNodeList.size(); ++i) { + const XmlNode *projectileNode= projectilesNodeList[i]; + ProjectileType *projectileType=new ProjectileType(); + projectileType->load(projectileNode,dir, tt->getPath(), loadedFileList, parentLoader); + + projectileTypes.push_back(projectileType); + projectile=true; + } + //general hit sounds, individual ones can be set in projectiles + const XmlNode *soundNode= sn->getChild("hitsound"); + if(soundNode->getAttribute("enabled")->getBoolValue()){ + + projSounds.resize((int)soundNode->getChildCount()); + for(int i=0; i < (int)soundNode->getChildCount(); ++i){ + const XmlNode *soundFileNode= soundNode->getChild("sound-file", i); + string path= soundFileNode->getAttribute("path")->getRestrictedValue(currentPath, true); + //printf("\n\n\n\n!@#$ ---> parentLoader [%s] path [%s] nodeValue [%s] i = %d",parentLoader.c_str(),path.c_str(),soundFileNode->getAttribute("path")->getRestrictedValue().c_str(),i); + + StaticSound *sound= new StaticSound(); + sound->load(path); + loadedFileList[path].push_back(make_pair(parentLoader,soundFileNode->getAttribute("path")->getRestrictedValue())); + projSounds[i]= sound; + } + } + } //splash const XmlNode *splashNode= sn->getChild("splash"); diff --git a/source/glest_game/world/unit_updater.cpp b/source/glest_game/world/unit_updater.cpp index 70e1cd86..062cff84 100644 --- a/source/glest_game/world/unit_updater.cpp +++ b/source/glest_game/world/unit_updater.cpp @@ -3254,10 +3254,33 @@ void ParticleDamager::update(ParticleSystem *particleSystem) { //attacker->setNetworkCRCParticleObserverLogInfo(szBuf); //play sound - StaticSound *projSound= ast->getProjSound(); + // Try to use the sound form the projetileType + StaticSound *projSound=projectileType->getHitSound(); + if(projSound == NULL){ + // use the sound from the skill + projSound= ast->getProjSound(); + } if(particleSystem->getVisible() && projSound != NULL) { SoundRenderer::getInstance().playFx(projSound, attacker->getCurrVector(), gameCamera->getPos()); } + + // check for shake and shake + if(projectileType->isShake()==true){ + World *world=attacker->getFaction()->getWorld(); + Map* map=world->getMap(); + Game *game=world->getGame(); + + //Unit *attacked= map->getCell(targetPos)->getUnit(targetField); + Vec2i surfaceTargetPos=Map::toSurfCoords(targetPos); + bool visibility=(!projectileType->isShakeVisible())||(map->getSurfaceCell(surfaceTargetPos)->isVisible(world->getThisTeamIndex()) || + (game->getWorld()->showWorldForPlayer(game->getWorld()->getThisTeamIndex()) == true)); + + bool isInCameraView=(!projectileType->isShakeInCameraView()) || Renderer::getInstance().posInCellQuadCache(surfaceTargetPos).first; + + if(visibility && isInCameraView) { + game->getGameCameraPtr()->shake( projectileType->getShakeDuration(), projectileType->getShakeIntensity(),projectileType->isShakeCameraDistanceAffected(),map->getSurfaceCell(surfaceTargetPos)->getVertex()); + } + } } particleSystem->setObserver(NULL); delete this;