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/
/*
 * creatureStreams.h
 *   Handles streaming to creatures
 *   ____            _
 *  |  _ \ ___  __ _| |_ __ ___  ___
 *  | |_) / _ \/ _` | | '_ ` _ \/ __|
 *  |  _ <  __/ (_| | | | | | | \__ \
 *  |_| \_\___|\__,_|_|_| |_| |_|___/
 *
 * 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 CREATURE_STREAMS_H
#define CREATURE_STREAMS_H

class Streamable {
public:
	virtual ~Streamable() {};
	void initStreamable();
    // Stream operators
	Streamable& operator<< (const MudObject* obj);
	Streamable& operator<< (const MudObject& obj);
	Streamable& operator<< (const bstring& str);
	Streamable& operator<< (const int num);
	Streamable& operator<< (Stat& stat);

	// This is to allow simple function based manipulators (like ColorOn, ColorOff)
	Streamable& operator <<( Streamable& (*op)(Streamable&));

    void setManipFlags(int flags);
    void setManipNum(int num);
    void setColorOn();
    void setColorOff();

    int getManipFlags();
    int getManipNum();
    //Creature& operator<< (creatureManip& manip)

protected:
    int manipFlags;
    int manipNum;
    bool streamColor;
    bool petPrinted;

    void doPrint(const bstring& toPrint);
};

inline Streamable& ColorOn(Streamable& out) {
    out.setColorOn();
    return out;
}

inline Streamable& ColorOff(Streamable& out) {
    out << "^x";
    out.setColorOff();
    return out;
}

class setf {
public:
    setf(int flags) : value(flags) {}
    Streamable& operator()(Streamable &) const;
    int value;
};

class setn {
public:
    setn(int flags) : value(flags) {}
    Streamable& operator()(Streamable &) const;
    int value;
};

Streamable& operator<<(Streamable& out, setf flags);
Streamable& operator<<(Streamable& out, setn num);


#endif