roh/conf.old/area/
roh/config/code/python/
roh/config/game/area/
roh/config/game/signs/
roh/help/dmhelp/
roh/help/help/
roh/log/
roh/log/staff/
roh/monsters/ocean/
roh/objects/misc/
roh/objects/ocean/
roh/player/
roh/rooms/area/1/
roh/rooms/misc/
roh/rooms/ocean/
roh/src-2.47e/
/*
 * alchemy.cpp
 *   Alchmey classes, functions, and other handlers
 *   ____            _
 *  |  _ \ ___  __ _| |_ __ ___  ___
 *  | |_) / _ \/ _` | | '_ ` _ \/ __|
 *  |  _ <  __/ (_| | | | | | | \__ \
 *  |_| \_\___|\__,_|_|_| |_| |_|___/
 *
 * Permission to use, modify and distribute is granted via the
 *  Creative Commons - Attribution - Non Commercial - Share Alike 3.0 License
 *    http://creativecommons.org/licenses/by-nc-sa/3.0/
 *
 * 	Copyright (C) 2007-2012 Jason Mitchell, Randi Mitchell
 * 	   Contributions by Tim Callahan, Jonathan Hseu
 *  Based on Mordor (C) Brooke Paul, Brett J. Vickers, John P. Freeman
 *
 */

#ifndef _ALCHEMY_H
#define	_ALCHEMY_H

//class XmlNodePtr;

typedef std::vector<Object*> HerbVector;
typedef std::map<bstring, HerbVector > HerbMap;

namespace Alchemy {
	bstring getEffectString(Object* obj, const bstring& effect);
};

//########################################################################
//# AlchemyInfo
//########################################################################

class AlchemyInfo {
public:
    AlchemyInfo(xmlNodePtr rootNode);

    bstring getDisplayString();

    const bstring& getName() const;
    const bstring& getPotionPrefix() const;
    const bstring& getPotionDisplayName() const;
    const bstring& getAction() const;
    const bstring& getPythonScript() const;
	long getBaseDuration() const;
	short getBaseStrength() const;
	bool potionNameHasPrefix() const;
	bool isThrowable() const;
	bool isPositive() const;


protected:
	void init();
	bstring name;
    bstring potionDisplayName;
    bstring potionPrefix;
    bool positive = false;

    // Standard duration and strength for this effect - will be modified by alchemy skill,
    // equipment quality, and herb quality
    long baseDuration = 10;
    short baseStrength = 1;

    bstring action; // effect, python
    bool throwable = false; // Can this be thrown at a door/creature/etc
    bstring pythonScript; // if action == python, or if throwable, needs to handle both
};

//########################################################################
//# AlchemyEffect
//########################################################################

class AlchemyEffect {
protected:
    bstring     effect;
    short       quality;

    long	duration;
    short	strength;

public:
    AlchemyEffect();
    AlchemyEffect(xmlNodePtr curNode);
    AlchemyEffect(const AlchemyEffect &ae);
    
    int saveToXml(xmlNodePtr rootNode);

    // Combine with another effect and caculate the average quality of the two
    void combineWith(const AlchemyEffect &ae);

    // Apply this effect to the creature:
    bool apply(Creature* target);

    const bstring& getEffect() const;
    long getDuration() const;
    short getStrength() const;
    short getQuality() const;

    void setDuration(const long newDuration);

};


#endif	/* _ALCHEMY_H */