123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- #include "Dimension.h"
- #include "Constants.h"
- #include "Datei.h"
- #include "Game.h"
- using namespace Framework;
- Dimension::Dimension( int id )
- : dimensionId( id ),
- chunks( new Trie<Chunk>() )
- {}
- Dimension::~Dimension()
- {
- chunks->release();
- }
- void Dimension::getAddrOf( Punkt cPos, char *addr )
- {
- *(int *)addr = cPos.x;
- *( (int *)addr + 1 ) = cPos.y;
- addr[ 8 ] = 0;
- }
- void Dimension::getAddrOfWorld( Punkt wPos, char *addr )
- {
- wPos.x = (int)floor( ( (float)wPos.x + CHUNK_SIZE / 2 ) / CHUNK_SIZE );
- wPos.y = (int)floor( ( (float)wPos.y + CHUNK_SIZE / 2 ) / CHUNK_SIZE );
- getAddrOf( wPos, addr );
- }
- Chunk *Dimension::zChunk( Punkt wPos )
- {
- char addr[ 9 ];
- getAddrOfWorld( wPos, addr );
- return chunks->z( addr );
- }
- Block *Dimension::zBlock( Vec3<int> location )
- {
- return zChunk( Punkt( location.x, location.y ) )->zBlockAt( Vec3<int>( ( location.x + CHUNK_SIZE / 2 ) % CHUNK_SIZE, ( location.y + CHUNK_SIZE / 2 ) % CHUNK_SIZE, location.z ) );
- }
- void Dimension::addChunk( Chunk *chunk )
- {
- char addr[ 9 ];
- getAddrOf( chunk->getCenter(), addr );
- if( !chunks->z( addr ) )
- {
- chunks->set( addr, chunk );
- getAddrOf( chunk->getCenter() + Punkt( 1, 0 ), addr );
- Chunk *zChunk = chunks->z( addr );
- if( zChunk )
- {
- zChunk->setNeighbor( EAST, chunk );
- chunk->setNeighbor( WEST, chunk );
- }
- getAddrOf( chunk->getCenter() + Punkt( -1, 0 ), addr );
- zChunk = chunks->z( addr );
- if( zChunk )
- {
- zChunk->setNeighbor( WEST, chunk );
- chunk->setNeighbor( EAST, chunk );
- }
- getAddrOf( chunk->getCenter() + Punkt( 0, 1 ), addr );
- zChunk = chunks->z( addr );
- if( zChunk )
- {
- zChunk->setNeighbor( NORTH, chunk );
- chunk->setNeighbor( SOUTH, chunk );
- }
- getAddrOf( chunk->getCenter() + Punkt( 0, -1 ), addr );
- zChunk = chunks->z( addr );
- if( zChunk )
- {
- zChunk->setNeighbor( SOUTH, chunk ); // TODO: correct this in setBlock
- chunk->setNeighbor( NORTH, chunk );
- }
- }
- else
- chunk->release();
- }
- void Dimension::save( Framework::Writer *zWriter )
- {
- for( auto chunk = chunks->getIterator(); chunk; chunk++ )
- {
- if( !chunk._ )
- continue;
- Datei *file = new Datei();
- Text filePath = chunk->zGameObj()->getWorldDirectory() + "/dim/" + chunk->getDimensionId() + "/";
- filePath.appendHex( chunk->getCenter().x );
- filePath += "_";
- filePath.appendHex( chunk->getCenter().y );
- filePath += ".chunk";
- file->setDatei( filePath );
- if( file->open( Datei::Style::schreiben ) )
- chunk->save( file );
- file->close();
- file->release();
- }
- }
|