summaryrefslogtreecommitdiff
path: root/src/game-server/attribute.h
diff options
context:
space:
mode:
authorYohann Ferreira <yohann_dot_ferreira_at_orange_dot_efer>2010-11-14 13:18:14 +0100
committerYohann Ferreira <yohann_dot_ferreira_at_orange_dot_efer>2010-11-14 13:18:14 +0100
commit196c1c0bffa8bb594ff0a7442748030f47cc9c58 (patch)
treeb60b3e3eff38907e2d8a94ce6aa7e63cd1a741c8 /src/game-server/attribute.h
parent23a94e7b154726599b9112b91ebedb32af9ff22c (diff)
downloadmanaserv-196c1c0bffa8bb594ff0a7442748030f47cc9c58.tar.gz
manaserv-196c1c0bffa8bb594ff0a7442748030f47cc9c58.tar.bz2
manaserv-196c1c0bffa8bb594ff0a7442748030f47cc9c58.tar.xz
manaserv-196c1c0bffa8bb594ff0a7442748030f47cc9c58.zip
Renamed .hpp files into .h for consistency.
Also added an header to the autoattack.{h,cpp} files. Big but trivial fix.
Diffstat (limited to 'src/game-server/attribute.h')
-rw-r--r--src/game-server/attribute.h184
1 files changed, 184 insertions, 0 deletions
diff --git a/src/game-server/attribute.h b/src/game-server/attribute.h
new file mode 100644
index 00000000..c2b8bcfb
--- /dev/null
+++ b/src/game-server/attribute.h
@@ -0,0 +1,184 @@
+/*
+ * The Mana Server
+ * Copyright (C) 2004-2010 The Mana World Development Team
+ *
+ * This file is part of The Mana Server.
+ *
+ * The Mana Server 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.
+ *
+ * The Mana Server 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 The Mana Server. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef ATTRIBUTE_H
+#define ATTRIBUTE_H
+
+#include "defines.h"
+#include <vector>
+#include <list>
+
+class AttributeModifierState
+{
+ public:
+ AttributeModifierState(unsigned short duration, double value,
+ unsigned int id)
+ : mDuration(duration), mValue(value), mId(id) {}
+ ~AttributeModifierState() {}
+ bool tick() { return mDuration ? !--mDuration : false; }
+ private:
+ /** Number of ticks (0 means permanent, e.g. equipment). */
+ unsigned short mDuration;
+ const double mValue; /**< Positive or negative amount. */
+ /**
+ * Special purpose variable used to identify this effect to
+ * dispells or similar. Exact usage depends on the effect,
+ * origin, etc.
+ */
+ const unsigned int mId;
+ friend bool durationCompare(const AttributeModifierState*,
+ const AttributeModifierState*);
+ friend class AttributeModifiersEffect;
+};
+
+class AttributeModifiersEffect {
+ public:
+ AttributeModifiersEffect(AT_TY sType, AME_TY eType);
+ ~AttributeModifiersEffect();
+ /**
+ * Recalculates the value for this level.
+ * @returns True if the value changed, false if it did not change.
+ * Note that this will not change values at a higher level, nor the
+ * overall modified value for this attribute.
+ * If this returns true, the cached values for *all* modifiers of a
+ * higher level must be recalculated, as well as the final
+ */
+ bool add(unsigned short duration, double value,
+ double prevLayerValue, int level);
+
+ /**
+ * remove() - as with Attribute::remove().
+ */
+
+ bool remove(double value, unsigned int id, bool fullCheck);
+
+ /**
+ * Performs the necessary modifications to mMod when the states change.
+ * @param value The value to alter. This is only used in stackable
+ * types, as the effect can be simply inverted there.
+ * For non stackable types (and stackable multiplicative types
+ * where the value is zero), mMod must be recalculated from all
+ * current modifiers.
+ * @note This /negates/ the effect of value.
+ * @note A parameter should always be provided when stackable.
+ */
+ void updateMod(double value = 0);
+
+ /**
+ * Performs the necessary modifications to mCacheVal when the states
+ * change.
+ */
+
+ bool recalculateModifiedValue(double newPrevLayerValue);
+
+ double getCachedModifiedValue() const { return mCacheVal; }
+
+ bool tick();
+
+ /**
+ * clearMods() - removes all modifications present in this layer.
+ * This only really makes sense when all other layers are being reset too.
+ * @param baseValue the value to reset to - typically an Attribute's mBase
+ */
+
+ void clearMods(double baseValue);
+
+ private:
+ /** List of all modifications present at this level */
+ std::list< AttributeModifierState * > mStates;
+ /**
+ * Stores the value that results from mStates. This takes into
+ * account all previous layers.
+ */
+ double mCacheVal;
+ /**
+ * Stores the effective modifying value from mStates. This defaults to
+ * 0 for additive modifiers and 1 for multiplicative modifiers.
+ */
+ double mMod;
+ const AT_TY mSType;
+ const AME_TY mEType;
+};
+
+class Attribute
+{
+ public:
+ Attribute() {throw;} // DEBUG; Find improper constructions
+
+ Attribute(const std::vector<struct AttributeInfoType> &type);
+
+ ~Attribute();
+
+ void setBase(double base);
+ double getBase() const { return mBase; }
+ double getModifiedAttribute() const
+ { return mMods.empty() ? mBase :
+ (*mMods.rbegin())->getCachedModifiedValue(); }
+
+ /**
+ * add() and remove() are the standard functions used to add and
+ * remove modifiers while keeping track of the modifier state.
+ */
+
+ /**
+ * @param duration The amount of time before the modifier expires
+ * naturally.
+ * When set to 0, the effect does not expire.
+ * @param value The value to be applied as the modifier.
+ * @param layer The id of the layer with which this modifier is to be
+ * applied to.
+ * @param id Used to identify this effect.
+ * @return Whether the modified attribute value was changed.
+ */
+
+ bool add(unsigned short duration, double value, unsigned int layer, int id = 0);
+
+ /**
+ * @param value The value of the modifier to be removed.
+ * - When 0, id is used exclusively to identify modifiers.
+ * @param layer The id of the layer which contains the modifier to be removed.
+ * @param id Used to identify this effect.
+ * - When 0, only the first match will be removed.
+ * - When non-0, all modifiers matching this id and other
+ * parameters will be removed.
+ * @param fullcheck Whether to perform a check for all modifiers,
+ * or only those that are otherwise permanent (ie. duration of 0)
+ * @returns Whether the modified attribute value was changed.
+ */
+ bool remove(double value, unsigned int layer, int id, bool fullcheck);
+
+ /**
+ * clearMods() removes *all* modifications present in this Attribute (!)
+ */
+
+ void clearMods();
+
+ /**
+ * tick() processes all timers associated with modifiers for this attribute.
+ */
+
+ bool tick();
+
+ private:
+ double mBase;
+ std::vector< AttributeModifiersEffect * > mMods;
+};
+
+#endif // ATTRIBUTE_H