/* * anchor.cpp * Magical anchors * ____ _ * | _ \ ___ __ _| |_ __ ___ ___ * | |_) / _ \/ _` | | '_ ` _ \/ __| * | _ < __/ (_| | | | | | | \__ \ * |_| \_\___|\__,_|_|_| |_| |_|___/ * * 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" //********************************************************************* // Anchor //********************************************************************* Anchor::Anchor() { reset(); } Anchor::Anchor(bstring a, const Player* player) { reset(); alias = a; bind(player); } Anchor::~Anchor() { if(mapmarker) delete mapmarker; } //********************************************************************* // getRoom //********************************************************************* CatRef Anchor::getRoom() const { return(room); } //********************************************************************* // setRoom //********************************************************************* void Anchor::setRoom(CatRef r) { room = r; } //********************************************************************* // getMapMarker //********************************************************************* const MapMarker* Anchor::getMapMarker() const { return(mapmarker); } //********************************************************************* // getAlias //********************************************************************* bstring Anchor::getAlias() const { return(alias); } //********************************************************************* // getRoomName //********************************************************************* bstring Anchor::getRoomName() const { return(roomName); } //********************************************************************* // reset //********************************************************************* void Anchor::reset() { alias = roomName = ""; mapmarker = 0; } //********************************************************************* // bind //********************************************************************* void Anchor::bind(const Player* player) { if(player->inUniqueRoom()) bind(player->getConstUniqueRoomParent()); else bind(player->getConstAreaRoomParent()); } void Anchor::bind(const UniqueRoom* uRoom) { roomName = uRoom->getName(); room = uRoom->info; } void Anchor::bind(const AreaRoom* aRoom) { roomName = aRoom->area->getTile( aRoom->area->getTerrain(0, &aRoom->mapmarker, 0, 0, 0, true), false )->getName().c_str(); if(mapmarker) delete mapmarker; mapmarker = new MapMarker; *mapmarker = *&aRoom->mapmarker; } //********************************************************************* // is //********************************************************************* bool Anchor::is(const BaseRoom* room) const { const UniqueRoom* uRoom = room->getAsConstUniqueRoom(); if(uRoom) return(is(uRoom)); else return(is(room->getAsConstAreaRoom())); } bool Anchor::is(const Player* player) const { if(player->inUniqueRoom()) return(is(player->getConstUniqueRoomParent())); else return(is(player->getConstAreaRoomParent())); } bool Anchor::is(const UniqueRoom* uRoom) const { return(room.id && room == uRoom->info); } bool Anchor::is(const AreaRoom* aRoom) const { return(mapmarker && *mapmarker == *&aRoom->mapmarker); } //********************************************************************* // operator= //********************************************************************* Anchor& Anchor::operator=(const Anchor& a) { alias = a.alias; roomName = a.roomName; room = a.room; if(a.mapmarker) { if(mapmarker) delete mapmarker; mapmarker = new MapMarker; *mapmarker = *a.mapmarker; } return(*this); } //********************************************************************* // load //********************************************************************* void Anchor::load(xmlNodePtr curNode) { xmlNodePtr childNode = curNode->children; while(childNode) { if(NODE_NAME(childNode, "Alias")) xml::copyToBString(alias, childNode); else if(NODE_NAME(childNode, "RoomName")) xml::copyToBString(roomName, childNode); else if(NODE_NAME(childNode, "Room")) room.load(childNode); else if(NODE_NAME(childNode, "MapMarker")) { mapmarker = new MapMarker; mapmarker->load(childNode); } childNode = childNode->next; } } //********************************************************************* // save //********************************************************************* void Anchor::save(xmlNodePtr curNode) const { xml::newStringChild(curNode, "Alias", alias); xml::newStringChild(curNode, "RoomName", roomName); room.save(curNode, "Room", false); if(mapmarker) { xmlNodePtr childNode = xml::newStringChild(curNode, "MapMarker"); mapmarker->save(childNode); } }