/*
* creatureStreams.cpp
* 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
*
*/
#include "mud.h"
Streamable& Streamable::operator << ( Streamable& (*op)(Streamable&)) {
// call the function passed as parameter with this stream as the argument
return (*op)(*this);
}
Streamable& operator<<(Streamable& out, setf flags) {
return flags(out);
}
Streamable& setf::operator()(Streamable& out) const {
out.setManipFlags(value);
return(out);
}
Streamable& operator<<(Streamable& out, setn num) {
return num(out);
}
Streamable& setn::operator()(Streamable& out) const {
out.setManipNum(value);
return(out);
}
void Streamable::initStreamable() {
manipFlags = 0;
manipNum = 0;
streamColor = false;
petPrinted = false;
}
Streamable& Streamable::operator<< ( const MudObject& mo) {
Player* player = dynamic_cast<Player*>(this);
if(player && player->getSock()) {
const Creature* creature = mo.getAsConstCreature();
const Object* object = mo.getAsConstObject();
int mFlags = player->displayFlags() | player->getManipFlags();
int mNum = player->getManipNum();
if(creature) {
doPrint(creature->getCrtStr(player, mFlags, mNum));
} else if(object) {
doPrint(object->getObjStr(player, mFlags, mNum));
}
}
return(*this);
}
Streamable& Streamable::operator<< ( const MudObject* mo) {
return(*this << *mo);
}
Streamable& Streamable::operator<< (const bstring& str) {
doPrint(str);
return(*this);
}
Streamable& Streamable::operator<< (const int num) {
doPrint(num);
return(*this);
}
Streamable& Streamable::operator<< (Stat& stat) {
doPrint(stat.toString());
return(*this);
}
void Streamable::setColorOn() {
streamColor = true;
}
void Streamable::setColorOff() {
streamColor = false;
}
void Streamable::setManipFlags(int flags) {
manipFlags |= flags;
}
// Returns the manipFlags and resets them
int Streamable::getManipFlags() {
int toReturn = manipFlags;
manipFlags = 0;
return (toReturn);
}
void Streamable::setManipNum(int num) {
manipNum = num;
}
// Returns the manipNum and resets them
int Streamable::getManipNum() {
int toReturn = manipNum;
manipNum = 0;
return(toReturn);
}
void Streamable::doPrint(const bstring& toPrint) {
const Player* player = dynamic_cast<Player*>(this);
const Monster* monster = dynamic_cast<Monster*>(this);
const Player* master = null;
Socket* sock = null;
if(player)
sock = player->getSock();
if(monster) {
master = monster->getConstPlayerMaster();
if(master)
sock = master->getSock();
}
if(sock) {
if(master) {
if(!petPrinted) {
sock->bprint("Pet> ");
if(toPrint.find("\n") == bstring::npos)
petPrinted = true;
}
else {
if(toPrint.find("\n") != bstring::npos)
petPrinted = false;
}
}
if(streamColor)
sock->bprintColor(toPrint);
else
sock->bprintNoColor(toPrint);
}
}