#include "BlockType.h"
#include "Block.h"

#include "Registries.h"

using namespace Framework;

BlockType::BlockType( int id )
    : ReferenceCounter(),
    id( id ),
    defaultBlock( 0 )
{
    STATIC_REGISTRY( BlockType ).registerT( this, id );
}

BlockType::~BlockType()
{
    if( defaultBlock )
        defaultBlock->release();
}

void BlockType::loadSuperBlock( Block* zBlock, Framework::StreamReader* zReader )
{
    zBlock->loadInventory( zReader );
    zReader->lese( (char*)&zBlock->transparent, 1 );
    zReader->lese( (char*)&zBlock->passable, 1 );
    zReader->lese( (char*)&zBlock->hp, 4 );
    zReader->lese( (char*)&zBlock->maxHP, 4 );
    zReader->lese( (char*)&zBlock->hardness, 4 );
    zReader->lese( (char*)&zBlock->speedModifier, 4 );
    int effectiveToolId;
    zReader->lese( (char*)&effectiveToolId, 4 );
    if( effectiveToolId >= 0 )
        zBlock->zTool = STATIC_REGISTRY( ItemType ).zElement( effectiveToolId );
    else
        zBlock->zTool = 0;
}

Block* BlockType::loadBlock( Framework::Vec3<int> position, Framework::StreamReader* zReader )
{
    Block* result = createBlock( position );
    loadSuperBlock( result, zReader );
    return result;
}

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

const Block* BlockType::zDefault()
{
    if( !defaultBlock )
        defaultBlock = createBlock( { 0, 0, 0 } );
    return defaultBlock;
}