示例#1
0
void Hero::takeAll()
{
    ObjectWeakPtrs objects;
    if (Simulator::get().listObjectsAt(
            getX(),
            getY(),
            getZ(),
            &objects))
    {
        ItemSharedPtrs items;
        std::for_each(
            objects.begin(), objects.end(), [&items](const ObjectWeakPtr& o)
            {
                ObjectSharedPtr object = o.lock();
                if (object->getObjectType() & OBJECT_TYPE_CHARACTER)
                {
                    Character* target = (Character*)object.get();
                    if (target->getHp() == 0)
                    {
                        items.reserve(items.size() + target->getItems().size());
                        items.insert(items.end(), target->getItems().begin(), target->getItems().end());
                        target->removeAllItems();
                    }
                }
                else if (object->getObjectType() & OBJECT_TYPE_CHEST)
                {
                    Chest* target = (Chest*)object.get();
                    items.reserve(items.size() + target->getItems().size());
                    items.insert(items.end(), target->getItems().begin(), target->getItems().end());
                    target->removeAllItems();
                }
            });

        if (!items.empty())
        {
            WindowSharedPtr w(new Window());
            w->setHorizontalAlign(Window::HorizontalAlign::CENTER);
            w->setVerticalAlign(Window::VerticalAlign::BOTTOM);
            w->setTitle("Added To Inventory");
            w->setMaxWidth(50);

            bool first = true;
            for_each(items.begin(), items.end(),
                     [w, &first] (const ItemSharedPtr& item)
                     {
                         if (!first)
                         {
                             w->printEndLine();
                         }
                         first = false;
                         w->print(Colors::WHITE(), item->getName());
                     });

            WindowManager::get().popup(w, 5);

            addItems(items);
        }
    }
}
示例#2
0
void Weapon::use(Direction dir)
{
    if (getOwner() && getOwner()->getObjectType() & Object::OBJECT_TYPE_CHARACTER)
    {
        Character* owner = (Character*)getOwner();

        m_dir = dir;
        show();

        float dx, dy;
        getDeltas(dx, dy);

        ObjectWeakPtrs objects;
        if (Simulator::get().listObjectsAt(
                    owner->getX() + dx,
                    owner->getY() + dy,
                    owner->getZ(),
                    &objects))
        {
            std::for_each(
                objects.begin(), objects.end(),
                [this, owner](const ObjectWeakPtr& o)
            {
                ObjectSharedPtr object = o.lock();
                if (object->getObjectType() & Object::OBJECT_TYPE_CHARACTER)
                {
                    int damage = Math::ceilRandom(m_damage);

                    Character* target = (Character*)object.get();

                    Math::clamp(damage, 0, target->getHp());
                    target->onReceiveHit(owner, damage);
                    owner->onGiveHit(target, damage);
                }
            });
        }
    }
}