Dimension.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #include "Dimension.h"
  2. #include "Constants.h"
  3. #include "Datei.h"
  4. #include "Game.h"
  5. using namespace Framework;
  6. Dimension::Dimension( int id )
  7. : dimensionId( id ),
  8. chunks( new Trie<Chunk>() )
  9. {}
  10. Dimension::~Dimension()
  11. {
  12. chunks->release();
  13. }
  14. void Dimension::getAddrOf( Punkt cPos, char *addr )
  15. {
  16. *(int *)addr = cPos.x;
  17. *( (int *)addr + 1 ) = cPos.y;
  18. addr[ 8 ] = 0;
  19. }
  20. void Dimension::getAddrOfWorld( Punkt wPos, char *addr )
  21. {
  22. wPos.x = (int)floor( ( (float)wPos.x + CHUNK_SIZE / 2 ) / CHUNK_SIZE );
  23. wPos.y = (int)floor( ( (float)wPos.y + CHUNK_SIZE / 2 ) / CHUNK_SIZE );
  24. getAddrOf( wPos, addr );
  25. }
  26. Chunk *Dimension::zChunk( Punkt wPos )
  27. {
  28. char addr[ 9 ];
  29. getAddrOfWorld( wPos, addr );
  30. return chunks->z( addr );
  31. }
  32. Block *Dimension::zBlock( Vec3<int> location )
  33. {
  34. 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 ) );
  35. }
  36. void Dimension::addChunk( Chunk *chunk )
  37. {
  38. char addr[ 9 ];
  39. getAddrOf( chunk->getCenter(), addr );
  40. if( !chunks->z( addr ) )
  41. {
  42. chunks->set( addr, chunk );
  43. getAddrOf( chunk->getCenter() + Punkt( 1, 0 ), addr );
  44. Chunk *zChunk = chunks->z( addr );
  45. if( zChunk )
  46. {
  47. zChunk->setNeighbor( EAST, chunk );
  48. chunk->setNeighbor( WEST, chunk );
  49. }
  50. getAddrOf( chunk->getCenter() + Punkt( -1, 0 ), addr );
  51. zChunk = chunks->z( addr );
  52. if( zChunk )
  53. {
  54. zChunk->setNeighbor( WEST, chunk );
  55. chunk->setNeighbor( EAST, chunk );
  56. }
  57. getAddrOf( chunk->getCenter() + Punkt( 0, 1 ), addr );
  58. zChunk = chunks->z( addr );
  59. if( zChunk )
  60. {
  61. zChunk->setNeighbor( NORTH, chunk );
  62. chunk->setNeighbor( SOUTH, chunk );
  63. }
  64. getAddrOf( chunk->getCenter() + Punkt( 0, -1 ), addr );
  65. zChunk = chunks->z( addr );
  66. if( zChunk )
  67. {
  68. zChunk->setNeighbor( SOUTH, chunk ); // TODO: correct this in setBlock
  69. chunk->setNeighbor( NORTH, chunk );
  70. }
  71. }
  72. else
  73. chunk->release();
  74. }
  75. void Dimension::save( Framework::Writer *zWriter )
  76. {
  77. for( auto chunk = chunks->getIterator(); chunk; chunk++ )
  78. {
  79. if( !chunk._ )
  80. continue;
  81. Datei *file = new Datei();
  82. Text filePath = chunk->zGameObj()->getWorldDirectory() + "/dim/" + chunk->getDimensionId() + "/";
  83. filePath.appendHex( chunk->getCenter().x );
  84. filePath += "_";
  85. filePath.appendHex( chunk->getCenter().y );
  86. filePath += ".chunk";
  87. file->setDatei( filePath );
  88. if( file->open( Datei::Style::schreiben ) )
  89. chunk->save( file );
  90. file->close();
  91. file->release();
  92. }
  93. }