From 8ec4e8575001e50ac2917b0a1599d2a6223aa337 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Mon, 7 Aug 2017 20:11:00 +0300 Subject: Add additional attributes to missile particle in items. --- src/resources/db/itemdb.cpp | 60 +++++++++++++++++++++++++++++++++------------ src/resources/iteminfo.cpp | 2 +- src/resources/iteminfo.h | 15 ++++++++---- src/resources/missileinfo.h | 47 +++++++++++++++++++++++++++++++++++ 4 files changed, 102 insertions(+), 22 deletions(-) create mode 100644 src/resources/missileinfo.h (limited to 'src/resources') diff --git a/src/resources/db/itemdb.cpp b/src/resources/db/itemdb.cpp index e23623367..ded7e59f2 100644 --- a/src/resources/db/itemdb.cpp +++ b/src/resources/db/itemdb.cpp @@ -345,6 +345,14 @@ void ItemDB::loadXmlFile(const std::string &fileName, int attackRange = XML::getProperty(node, "attack-range", 0); std::string missileParticle = XML::getProperty( node, "missile-particle", ""); + float missileZ = static_cast(XML::getFloatProperty( + node, "missile-z", 32.0f)); + int missileLifeTime = static_cast(XML::getProperty( + node, "missile-lifetime", 3000)); + float missileSpeed = static_cast(XML::getFloatProperty( + node, "missile-speed", 7.0f)); + float missileDieDistance = static_cast(XML::getFloatProperty( + node, "missile-diedistance", 8.0f)); int hitEffectId = XML::getProperty(node, "hit-effect-id", paths.getIntValue("hitEffectId")); int criticalEffectId = XML::getProperty( @@ -464,46 +472,66 @@ void ItemDB::loadXmlFile(const std::string &fileName, } } - if ((view == 0) && (inheritItemInfo != nullptr)) + if (view == 0 && inheritItemInfo != nullptr) view = inheritItemInfo->getView(); itemInfo->setView(view); - if ((weight == 0) && (inheritItemInfo != nullptr)) + if (weight == 0 && inheritItemInfo != nullptr) weight = inheritItemInfo->getWeight(); itemInfo->setWeight(weight); - if (attackAction.empty() && (inheritItemInfo != nullptr)) + if (attackAction.empty() && inheritItemInfo != nullptr) attackAction = inheritItemInfo->getAttackAction(); itemInfo->setAttackAction(attackAction); - if (skyAttackAction.empty() && (inheritItemInfo != nullptr)) + if (skyAttackAction.empty() && inheritItemInfo != nullptr) skyAttackAction = inheritItemInfo->getSkyAttackAction(); itemInfo->setSkyAttackAction(skyAttackAction); - if (waterAttackAction.empty() && (inheritItemInfo != nullptr)) + if (waterAttackAction.empty() && inheritItemInfo != nullptr) waterAttackAction = inheritItemInfo->getWaterAttackAction(); itemInfo->setWaterAttackAction(waterAttackAction); - if (rideAttackAction.empty() && (inheritItemInfo != nullptr)) + if (rideAttackAction.empty() && inheritItemInfo != nullptr) rideAttackAction = inheritItemInfo->getRideAttackAction(); itemInfo->setRideAttackAction(rideAttackAction); - if ((attackRange == 0) && (inheritItemInfo != nullptr)) + if (attackRange == 0 && inheritItemInfo != nullptr) attackRange = inheritItemInfo->getAttackRange(); itemInfo->setAttackRange(attackRange); - if (missileParticle.empty() && (inheritItemInfo != nullptr)) - missileParticle = inheritItemInfo->getMissileParticleFile(); - itemInfo->setMissileParticleFile(missileParticle); - if ((hitEffectId == 0) && (inheritItemInfo != nullptr)) + + if (inheritItemInfo) + { + const MissileInfo &inheritMissile = + inheritItemInfo->getMissileConst(); + if (missileParticle.empty()) + missileParticle = inheritMissile.particle; + if (missileZ == 32.0F) + missileZ = inheritMissile.z; + if (missileLifeTime == 3000) + missileLifeTime = inheritMissile.lifeTime; + if (missileSpeed == 7.0F) + missileSpeed = inheritMissile.speed; + if (missileDieDistance == 8.0F) + missileDieDistance = inheritMissile.dieDistance; + } + MissileInfo &missile = itemInfo->getMissile(); + missile.particle = missileParticle; + missile.z = missileZ; + missile.lifeTime = missileLifeTime; + missile.speed = missileSpeed; + missile.dieDistance = missileDieDistance; + + if (hitEffectId == 0 && inheritItemInfo != nullptr) hitEffectId = inheritItemInfo->getHitEffectId(); itemInfo->setHitEffectId(hitEffectId); - if ((criticalEffectId == 0) && (inheritItemInfo != nullptr)) + if (criticalEffectId == 0 && inheritItemInfo != nullptr) criticalEffectId = inheritItemInfo->getCriticalHitEffectId(); itemInfo->setCriticalHitEffectId(criticalEffectId); - if ((missEffectId == 0) && (inheritItemInfo != nullptr)) + if (missEffectId == 0 && inheritItemInfo != nullptr) missEffectId = inheritItemInfo->getMissEffectId(); itemInfo->setMissEffectId(missEffectId); itemInfo->setDrawBefore(-1, parseSpriteName(drawBefore)); itemInfo->setDrawAfter(-1, parseSpriteName(drawAfter)); itemInfo->setDrawPriority(-1, drawPriority); - if (colors.empty() && (inheritItemInfo != nullptr)) + if (colors.empty() && inheritItemInfo != nullptr) colors = inheritItemInfo->getColorsListName(); itemInfo->setColorsList(colors); - if (iconColors.empty() && (inheritItemInfo != nullptr)) + if (iconColors.empty() && inheritItemInfo != nullptr) iconColors = inheritItemInfo->getIconColorsListName(); itemInfo->setIconColorsList(iconColors); itemInfo->setMaxFloorOffsetX(maxFloorOffsetX); @@ -518,7 +546,7 @@ void ItemDB::loadXmlFile(const std::string &fileName, if (!effect.empty() && !temp.empty()) effect.append(" / "); effect.append(temp); - if (effect.empty() && (inheritItemInfo != nullptr)) + if (effect.empty() && inheritItemInfo != nullptr) effect = inheritItemInfo->getEffect(); itemInfo->setEffect(effect); diff --git a/src/resources/iteminfo.cpp b/src/resources/iteminfo.cpp index 6c8840f75..26cd2dc20 100644 --- a/src/resources/iteminfo.cpp +++ b/src/resources/iteminfo.cpp @@ -38,8 +38,8 @@ #include "debug.h" ItemInfo::ItemInfo() : - mMissileParticleFile(), mDisplay(), + mMissile(), mName(), mNameEn(), mDescription(), diff --git a/src/resources/iteminfo.h b/src/resources/iteminfo.h index a80442882..8abc78717 100644 --- a/src/resources/iteminfo.h +++ b/src/resources/iteminfo.h @@ -31,6 +31,7 @@ #include "resources/cursors.h" #include "resources/itemcolordata.h" +#include "resources/missileinfo.h" #include "resources/soundinfo.h" #include "resources/sprite/spritedisplay.h" @@ -153,11 +154,17 @@ class ItemInfo final // Handlers for seting and getting the string // used for particles when attacking void setMissileParticleFile(const std::string &s) noexcept2 - { mMissileParticleFile = s; } + { mMissile.particle = s; } const std::string &getMissileParticleFile() const noexcept2 A_WARN_UNUSED - { return mMissileParticleFile; } + { return mMissile.particle; } + + MissileInfo &getMissile() noexcept2 A_WARN_UNUSED + { return mMissile; } + + const MissileInfo &getMissileConst() const noexcept2 A_WARN_UNUSED + { return mMissile; } void setHitEffectId(const int s) noexcept2 { mHitEffectId = s; } @@ -246,9 +253,6 @@ class ItemInfo final ItemColor getCardColor() const noexcept2 { return mCardColor; } - /** Effects to be shown when weapon attacks - see also effects.xml */ - std::string mMissileParticleFile; - int getReplaceToSpriteId(int id) const A_WARN_UNUSED; IntMap *addReplaceSprite(const int sprite, @@ -324,6 +328,7 @@ class ItemInfo final const int def = -1) A_NONNULL(1); SpriteDisplay mDisplay; /**< Display info (like icon) */ + MissileInfo mMissile; std::string mName; std::string mNameEn; std::string mDescription; /**< Short description. */ diff --git a/src/resources/missileinfo.h b/src/resources/missileinfo.h new file mode 100644 index 000000000..41429f61c --- /dev/null +++ b/src/resources/missileinfo.h @@ -0,0 +1,47 @@ +/* + * The ManaPlus Client + * Copyright (C) 2011-2017 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * 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. + * + * 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 this program. If not, see . + */ + +#ifndef RESOURCES_MISSILEINFO_H +#define RESOURCES_MISSILEINFO_H + +#include + +#include "localconsts.h" + +struct MissileInfo final +{ + MissileInfo() : + particle(), + z(32.0F), + speed(7.0F), + dieDistance(8.0F), + lifeTime(3000) + { } + + A_DELETE_COPY(MissileInfo) + + std::string particle; + float z; + float speed; + float dieDistance; + int lifeTime; +}; + +#endif // RESOURCES_MISSILEINFO_H -- cgit v1.2.3-70-g09d2