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/
/*
 * pets.cpp
 *   Functions dealing with pets
 *   ____            _
 *  |  _ \ ___  __ _| |_ __ ___  ___
 *  | |_) / _ \/ _` | | '_ ` _ \/ __|
 *  |  _ <  __/ (_| | | | | | | \__ \
 *  |_| \_\___|\__,_|_|_| |_| |_|___/
 *
 * 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"

#include <iomanip>

void Creature::addPet(Monster* newPet, bool setPetFlag) {
    if(newPet->getMaster())
        return;

    if(setPetFlag)
        newPet->setFlag(M_PET);
    newPet->setMaster(this);
    pets.push_back(newPet);
    if(getGroup())
    	getGroup()->add(newPet);
}
void Creature::delPet(Monster* toDel) {
    PetList::iterator it = std::find(pets.begin(), pets.end(), toDel);
    if(it != pets.end()) {
        pets.erase(it);
    }

}
Monster* Creature::findPet(Monster* toFind) {
    PetList::iterator it = std::find(pets.begin(), pets.end(), toFind);
    if(it != pets.end())
        return((*it));
    return(NULL);
}

bool Creature::hasPet() const {
    return(!pets.empty());
}

void Monster::setMaster(Creature* pMaster) {
    myMaster = pMaster;
}

Creature* Monster::getMaster() const {
    if(!this)
        return(NULL);

    return(myMaster);
}
//
//template<class Type>
//Type doFindCreature(std::list<Type>& list, bstring pName, int pNum, bool exactMatch) {
//    if(pName.empty())
//        return(NULL);
//
//    int match = 0;
//    for(Type target : list) {
//        if(exactMatch) {
//            if(!pName.equals(target->getName())) {
//                match++;
//                if(match == pNum) {
//                    return(target);
//                }
//            }
//        } else {
//            if(keyTxtEqual(target, pName.c_str())) {
//                match++;
//                if(match == pNum) {
//                    return(target);
//                }
//            }
//        }
//    }
//    return(NULL);
//
//}

Monster* Creature::findPet(bstring pName, int pNum) {
	int match = 0;
    for(Monster* pet : pets) {
        if(isMatch(this, pet, pName, false, false)) {
            match++;
            if(match == pNum) {
            	return(pet);
            }
        }
    }
    return(NULL);
}

//*********************************************************************
//                      isPet
//*********************************************************************

bool Creature::isPet() const {
    if(isPlayer())
        return(false);
    return(flagIsSet(M_PET) && getAsConstMonster()->getMaster());
}

void Creature::dismissPet(Monster* pet) {
	if(pet->getMaster() != this)
		return;

	print("You dismiss %N.\n", pet);
	broadcast(getSock(), getRoomParent(), "%M dismisses %N.", this, pet);

	if(pet->isUndead())
		broadcast(NULL, getRoomParent(), "%M wanders away.", pet);
	else
		broadcast(NULL, getRoomParent(), "%M fades away.", pet);
	pet->die(this);

}
void Creature::dismissAll() {
	// We use this instead of for() because dismissPet will remove it from the list and invalidate the iterators
	PetList::iterator it;
	for(it = pets.begin() ; it != pets.end() ; ) {
		Monster* pet = (*it++);
		dismissPet(pet);
	}
}
void Creature::displayPets() {
    std::ostringstream oStr;
    oStr << "Your pet" << (pets.size() > 1 ? "s" : "") << ":" << std::endl;
    for(Monster* pet : pets) {

        oStr << pet->getName();

        oStr << " - " << (pet->hp.getCur() < pet->hp.getMax() && !pFlagIsSet(P_NO_EXTRA_COLOR) ? "^R" : "")
             << std::setw(3) << pet->hp.getCur() << "^x/" << std::setw(3) << pet->hp.getMax()
             << " Hp - " << std::setw(3) << pet->mp.getCur() << "/" << std::setw(3)
             << pet->mp.getMax() << " Mp";
        oStr << std::endl;
    }
    printColor("%s", oStr.str().c_str());
}