#include "common.hpp"
#include <iostream>
Avatar::Avatar(INETsocket controller){
sock=controller;
health=(float)0x100;
}
bool Avatar::Move(string destination, Container&location, unsigned int myindex) {
map<string,weak_ptr<Room> >* links=location.exits();
map<string,weak_ptr<Room> >::iterator where=links->find(destination);
if (where!=links->end()) {
where->second.lock()->getThing(myindex,location);
return true;
}
return false;
}
void Avatar::privateMessage(SENSES sense,std::string message) {
//FIXME
}
void Avatar::tick(Container&location, unsigned int myindex) {
Container::tick(location,myindex);
health-=1.0f/1024.0f;
//FIXME do hunger
//FIXME send update to client
//FIXME process client commands
}
void Avatar::addHealth(float health) {
this->health+=health;
if (health>0) {
//FIXME reward
}else {
//FIXME punish
}
}
bool Avatar::Eat(string desc) {
for (std::vector<shared_ptr<Thing> >::iterator it=items.begin(),end=items.end();
it!=end;
++it) {
if (desc==it->get()->description()) {
if (it->get()->EatMe(*this)) {
*it=items.back();
items.pop_back();
return true;
}
}
}
return false;
}
Avatar::~Avatar() {
std::cout << description()<<" died\n";
}
Grue::~Grue(){}
Snark::~Snark(){}
bool Grue::getThing(unsigned int thingindex, Container&previous) {
Thing* item=previous.examineItem(thingindex);
Grue * tmp=dynamic_cast<Grue*> (item);
if (tmp) return false;
Avatar * tmp1=dynamic_cast<Avatar*> (item);
if (tmp1&&previous.lightness()>.5) {
return false;
}
if (!tmp1) return false;//carnivore
return this->Avatar::getThing(thingindex,previous);
}
bool Grue::takeMe(Container& destination, Container& currentLocation) {
return false;///impervious to attack
}
bool Snark::EatMe(Avatar& thing) {
thing.addHealth(100);
}
bool Snark::getThing(unsigned int thingindex, Container&previous) {
Thing* item=previous.examineItem(thingindex);
Avatar * tmp=dynamic_cast<Avatar*> (item);
if (tmp)return false;
return Avatar::getThing(thingindex,previous);
}
bool Snark::takeMe(Container& destination, Container& currentLocation) {
for (std::vector<shared_ptr<Thing> >::iterator it=currentLocation.items.begin(),end=currentLocation.items.end();
it!=end;
++it) {
Thing*tmp=it->get();
if (dynamic_cast<Snark*>(tmp)) return false;
}
return Avatar::takeMe(destination,currentLocation);
}