//////////////////////////////////////////////////////////////////////// // OpenTibia - an opensource roleplaying game //////////////////////////////////////////////////////////////////////// // 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 3 of the License, or // (at your option) 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 __CONDITION__ #define __CONDITION__ #include "otsystem.h" #include "const.h" #include "enums.h" #include #include #include "fileloader.h" class Creature; class Player; class PropStream; enum ConditionType_t { CONDITION_NONE = 0, CONDITION_POISON = 1 << 0, CONDITION_FIRE = 1 << 1, CONDITION_ENERGY = 1 << 2, CONDITION_PHYSICAL = 1 << 3, CONDITION_HASTE = 1 << 4, CONDITION_PARALYZE = 1 << 5, CONDITION_OUTFIT = 1 << 6, CONDITION_INVISIBLE = 1 << 7, CONDITION_LIGHT = 1 << 8, CONDITION_MANASHIELD = 1 << 9, CONDITION_INFIGHT = 1 << 10, CONDITION_DRUNK = 1 << 11, CONDITION_EXHAUST = 1 << 12, CONDITION_REGENERATION = 1 << 13, CONDITION_SOUL = 1 << 14, CONDITION_DROWN = 1 << 15, CONDITION_MUTED = 1 << 16, CONDITION_ATTRIBUTES = 1 << 17, CONDITION_FREEZING = 1 << 18, CONDITION_DAZZLED = 1 << 19, CONDITION_CURSED = 1 << 20, CONDITION_PACIFIED = 1 << 21, CONDITION_GAMEMASTER = 1 << 22, CONDITION_HUNTING = 1 << 23 }; enum ConditionEnd_t { CONDITIONEND_CLEANUP, CONDITIONEND_DEATH, CONDITIONEND_TICKS, CONDITIONEND_ABORT }; enum ConditionAttr_t { CONDITIONATTR_TYPE = 1, CONDITIONATTR_ID = 2, CONDITIONATTR_TICKS = 3, CONDITIONATTR_HEALTHTICKS = 4, CONDITIONATTR_HEALTHGAIN = 5, CONDITIONATTR_MANATICKS = 6, CONDITIONATTR_MANAGAIN = 7, CONDITIONATTR_DELAYED = 8, CONDITIONATTR_OWNER = 9, CONDITIONATTR_INTERVALDATA = 10, CONDITIONATTR_SPEEDDELTA = 11, CONDITIONATTR_FORMULA_MINA = 12, CONDITIONATTR_FORMULA_MINB = 13, CONDITIONATTR_FORMULA_MAXA = 14, CONDITIONATTR_FORMULA_MAXB = 15, CONDITIONATTR_LIGHTCOLOR = 16, CONDITIONATTR_LIGHTLEVEL = 17, CONDITIONATTR_LIGHTTICKS = 18, CONDITIONATTR_LIGHTINTERVAL = 19, CONDITIONATTR_SOULTICKS = 20, CONDITIONATTR_SOULGAIN = 21, CONDITIONATTR_SKILLS = 22, CONDITIONATTR_STATS = 23, CONDITIONATTR_OUTFIT = 24, CONDITIONATTR_PERIODDAMAGE = 25, CONDITIONATTR_BUFF = 26, CONDITIONATTR_SUBID = 27, //reserved for serialization CONDITIONATTR_END = 254 }; struct IntervalInfo { int32_t timeLeft, value, interval; }; class Condition { public: Condition(ConditionId_t _id, ConditionType_t _type, int32_t _ticks, bool _buff, uint32_t _subId); virtual ~Condition() {} virtual bool startCondition(Creature* creature); virtual bool executeCondition(Creature* creature, int32_t interval); virtual void endCondition(Creature* creature, ConditionEnd_t reason) {} virtual void addCondition(Creature* creature, const Condition* condition) {} virtual Icons_t getIcons() const; ConditionId_t getId() const {return id;} uint32_t getSubId() const {return subId;} virtual Condition* clone() const {return NULL;} ConditionType_t getType() const {return conditionType;} int64_t getEndTime() const {return ticks == -1 ? 0 : endTime;} int32_t getTicks() const {return ticks;} void setTicks(int32_t newTicks); static Condition* createCondition(ConditionId_t _id, ConditionType_t _type, int32_t ticks, int32_t param = 0, bool _buff = false, uint32_t _subId = 0); static Condition* createCondition(PropStream& propStream); virtual bool setParam(ConditionParam_t param, int32_t value); //serialization bool unserialize(PropStream& propStream); virtual bool serialize(PropWriteStream& propWriteStream); virtual bool unserializeProp(ConditionAttr_t attr, PropStream& propStream); bool isPersistent() const {return (ticks > 0 && (id == CONDITIONID_DEFAULT || id != CONDITIONID_COMBAT));} protected: virtual bool updateCondition(const Condition* addCondition); ConditionId_t id; uint32_t subId; int32_t ticks; int64_t endTime; ConditionType_t conditionType; bool buff; }; class ConditionGeneric: public Condition { public: ConditionGeneric(ConditionId_t _id, ConditionType_t _type, int32_t _ticks, bool _buff, uint32_t _subId); virtual ~ConditionGeneric() {} virtual void addCondition(Creature* creature, const Condition* condition); virtual Icons_t getIcons() const; virtual ConditionGeneric* clone() const {return new ConditionGeneric(*this);} }; class ConditionManaShield : public ConditionGeneric { public: ConditionManaShield(ConditionId_t _id, ConditionType_t _type, int32_t _ticks, bool _buff, uint32_t _subId); virtual ~ConditionManaShield() {} virtual Icons_t getIcons() const; virtual ConditionManaShield* clone() const {return new ConditionManaShield(*this);} }; class ConditionAttributes : public ConditionGeneric { public: ConditionAttributes(ConditionId_t _id, ConditionType_t _type, int32_t _ticks, bool _buff, uint32_t _subId); virtual ~ConditionAttributes() {} virtual bool startCondition(Creature* creature); virtual bool executeCondition(Creature* creature, int32_t interval); virtual void endCondition(Creature* creature, ConditionEnd_t reason); virtual void addCondition(Creature* creature, const Condition* condition); virtual ConditionAttributes* clone() const {return new ConditionAttributes(*this);} virtual bool setParam(ConditionParam_t param, int32_t value); //serialization virtual bool serialize(PropWriteStream& propWriteStream); virtual bool unserializeProp(ConditionAttr_t attr, PropStream& propStream); protected: int32_t skills[SKILL_LAST + 1], stats[STAT_LAST + 1], skillsPercent[SKILL_LAST + 1], statsPercent[STAT_LAST + 1], currentSkill, currentStat; void updatePercentSkills(Player* player); void updatePercentStats(Player* player); void updateSkills(Player* player); void updateStats(Player* player); }; class ConditionRegeneration : public ConditionGeneric { public: ConditionRegeneration(ConditionId_t _id, ConditionType_t _type, int32_t _ticks, bool _buff, uint32_t _subId); virtual ~ConditionRegeneration() {} virtual void addCondition(Creature* creature, const Condition* addCondition); virtual bool executeCondition(Creature* creature, int32_t interval); virtual ConditionRegeneration* clone() const {return new ConditionRegeneration(*this);} virtual bool setParam(ConditionParam_t param, int32_t value); //serialization virtual bool serialize(PropWriteStream& propWriteStream); virtual bool unserializeProp(ConditionAttr_t attr, PropStream& propStream); protected: uint32_t internalHealthTicks, internalManaTicks, healthTicks, manaTicks, healthGain, manaGain; }; class ConditionSoul : public ConditionGeneric { public: ConditionSoul(ConditionId_t _id, ConditionType_t _type, int32_t _ticks, bool _buff, uint32_t _subId); virtual ~ConditionSoul() {} virtual void addCondition(Creature* creature, const Condition* addCondition); virtual bool executeCondition(Creature* creature, int32_t interval); virtual ConditionSoul* clone() const {return new ConditionSoul(*this);} virtual bool setParam(ConditionParam_t param, int32_t value); //serialization virtual bool serialize(PropWriteStream& propWriteStream); virtual bool unserializeProp(ConditionAttr_t attr, PropStream& propStream); protected: uint32_t internalSoulTicks, soulTicks, soulGain; }; class ConditionDamage: public Condition { public: ConditionDamage(ConditionId_t _id, ConditionType_t _type, bool _buff, uint32_t _subId); virtual ~ConditionDamage() {} static void generateDamageList(int32_t amount, int32_t start, std::list& list); virtual bool startCondition(Creature* creature); virtual bool executeCondition(Creature* creature, int32_t interval); virtual void addCondition(Creature* creature, const Condition* condition); virtual Icons_t getIcons() const; virtual ConditionDamage* clone() const {return new ConditionDamage(*this);} virtual bool setParam(ConditionParam_t param, int32_t value); int32_t getTotalDamage() const; bool doForceUpdate() const {return forceUpdate;} bool addDamage(int32_t rounds, int32_t time, int32_t value); //serialization virtual bool serialize(PropWriteStream& propWriteStream); virtual bool unserializeProp(ConditionAttr_t attr, PropStream& propStream); protected: bool updateCondition(const ConditionDamage* addCondition); bool init(); bool getNextDamage(int32_t& damage); bool doDamage(Creature* creature, int32_t damage); bool forceUpdate, delayed; int32_t maxDamage, minDamage, startDamage, periodDamage, periodDamageTick, tickInterval; uint32_t owner; typedef std::list DamageList; DamageList damageList; }; class ConditionOutfit: public Condition { public: ConditionOutfit(ConditionId_t _id, ConditionType_t _type, int32_t _ticks, bool _buff, uint32_t _subId); virtual ~ConditionOutfit() {} virtual bool startCondition(Creature* creature); virtual void endCondition(Creature* creature, ConditionEnd_t reason); virtual void addCondition(Creature* creature, const Condition* condition); virtual ConditionOutfit* clone() const {return new ConditionOutfit(*this);} void addOutfit(Outfit_t _outfit) {outfits.push_back(_outfit);} void setOutfits(std::vector _outfits) {outfits = _outfits;} //serialization virtual bool serialize(PropWriteStream& propWriteStream); virtual bool unserializeProp(ConditionAttr_t attr, PropStream& propStream); protected: void changeOutfit(Creature* creature, int32_t index = -1); std::vector outfits; }; class ConditionSpeed: public ConditionOutfit { public: ConditionSpeed(ConditionId_t _id, ConditionType_t _type, int32_t _ticks, bool _buff, uint32_t _subId, int32_t changeSpeed); virtual ~ConditionSpeed() {} virtual bool startCondition(Creature* creature); virtual void endCondition(Creature* creature, ConditionEnd_t reason); virtual void addCondition(Creature* creature, const Condition* condition); virtual Icons_t getIcons() const; virtual ConditionSpeed* clone() const {return new ConditionSpeed(*this);} virtual bool setParam(ConditionParam_t param, int32_t value); void setFormulaVars(float _mina, float _minb, float _maxa, float _maxb); //serialization virtual bool serialize(PropWriteStream& propWriteStream); virtual bool unserializeProp(ConditionAttr_t attr, PropStream& propStream); protected: void getFormulaValues(int32_t var, int32_t& min, int32_t& max) const; int32_t speedDelta; float mina, minb, maxa, maxb; }; class ConditionLight: public Condition { public: ConditionLight(ConditionId_t _id, ConditionType_t _type, int32_t _ticks, bool _buff, uint32_t _subId, int32_t lightLevel, int32_t lightColor); virtual ~ConditionLight() {} virtual bool startCondition(Creature* creature); virtual bool executeCondition(Creature* creature, int32_t interval); virtual void endCondition(Creature* creature, ConditionEnd_t reason); virtual void addCondition(Creature* creature, const Condition* addCondition); virtual ConditionLight* clone() const {return new ConditionLight(*this);} virtual bool setParam(ConditionParam_t param, int32_t value); //serialization virtual bool serialize(PropWriteStream& propWriteStream); virtual bool unserializeProp(ConditionAttr_t attr, PropStream& propStream); protected: LightInfo lightInfo; uint32_t internalLightTicks, lightChangeInterval; }; #endif