#include <InMemoryBuffer.h>

#include "ItemType.h"
#include "ItemStack.h"
#include "Registries.h"

ItemType::ItemType( int id )
    : ReferenceCounter(),
    id( id )
{
    STATIC_REGISTRY( ItemType ).registerT( this, id );
}

ItemType::~ItemType()
{}

void ItemType::loadSuperItem( Item* zItem, Framework::StreamReader* zReader ) const
{
    zReader->lese( (char*)&zItem->damage, 4 );
    zReader->lese( (char*)&zItem->maxDamage, 4 );
    zReader->lese( (char*)&zItem->durability, 4 );
    zReader->lese( (char*)&zItem->maxDurability, 4 );
    unsigned char flags = 0;
    zReader->lese( (char*)&flags, 1 );
    zItem->eatable = (flags | 1) == flags;
    zItem->placeable = (flags | 2) == flags;
    zItem->equippable = (flags | 4) == flags;
    zItem->solid = (flags | 8) == flags;
    zItem->usable = (flags | 16) == flags;
    zReader->lese( (char*)&zItem->maxStackSize, 1 );
    unsigned char len = 0;
    zReader->lese( (char*)&len, 1 );
    zItem->name.fillText( ' ', len );
    zReader->lese( zItem->name, len );
}

int ItemType::getId() const
{
    return id;
}

ItemStack* ItemType::createItemStack( int size ) const
{
    Item* item = createItem();
    if( !item )
        return 0;
    return new ItemStack( item, MIN( size, item->getMaxStackSize() ) );
}

Item* ItemType::loadItem( Framework::StreamReader* zReader ) const
{
    Item* item = createItem();
    loadSuperItem( item, zReader );
    return item;
}