Dimension.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #include "Dimension.h"
  2. #include "Constants.h"
  3. #include "Datei.h"
  4. #include "Game.h"
  5. #include "Globals.h"
  6. using namespace Framework;
  7. Dimension::Dimension( int id )
  8. : dimensionId( id ),
  9. chunks( new Trie<Chunk>() ),
  10. entities( new RCArray<Entity>() )
  11. {}
  12. Dimension::~Dimension()
  13. {
  14. entities->release();
  15. chunks->release();
  16. }
  17. void Dimension::updateVisibility()
  18. {
  19. bool changed = true;
  20. while( changed )
  21. {
  22. changed = false;
  23. for( auto chunk = chunks->getIterator(); chunk; chunk++ )
  24. changed |= chunk->updateVisibility();
  25. }
  26. }
  27. void Dimension::getAddrOf( Punkt cPos, char *addr ) const
  28. {
  29. *(int *)addr = cPos.x;
  30. *( (int *)addr + 1 ) = cPos.y;
  31. addr[ 8 ] = 0;
  32. }
  33. void Dimension::getAddrOfWorld( Punkt wPos, char *addr ) const
  34. {
  35. if( wPos.x < 0 )
  36. wPos.x -= CHUNK_SIZE;
  37. if( wPos.y < 0 ) // needed because otherwise would (-8, -8) have the same adress as (8, 8)
  38. wPos.y -= CHUNK_SIZE;
  39. wPos /= CHUNK_SIZE;
  40. getAddrOf( wPos, addr );
  41. }
  42. Chunk *Dimension::zChunk( Punkt wPos ) const
  43. {
  44. char addr[ 9 ];
  45. getAddrOfWorld( wPos, addr );
  46. return chunks->z( addr, 9 );
  47. }
  48. Block *Dimension::zBlock( Vec3<int> location )
  49. {
  50. Chunk *c = zChunk( currentGame->getChunkCenter( location.x, location.y ) );
  51. if( c )
  52. {
  53. int x = location.x % CHUNK_SIZE;
  54. int y = location.y % CHUNK_SIZE;
  55. if( x < 0 )
  56. x += CHUNK_SIZE;
  57. if( y < 0 )
  58. y += CHUNK_SIZE;
  59. return c->zBlockAt( Vec3<int>( x, y, location.z ) );
  60. }
  61. return 0;
  62. }
  63. void Dimension::addEntity( Entity *entity )
  64. {
  65. entities->add( entity );
  66. }
  67. void Dimension::addChunk( Chunk *chunk )
  68. {
  69. char addr[ 9 ];
  70. getAddrOfWorld( chunk->getCenter(), addr );
  71. if( !chunks->z( addr, 9 ) )
  72. {
  73. chunks->set( addr, 9, chunk );
  74. getAddrOfWorld( chunk->getCenter() + Punkt( CHUNK_SIZE, 0 ), addr );
  75. Chunk *zChunk = chunks->z( addr, 9 );
  76. if( zChunk )
  77. {
  78. zChunk->setNeighbor( WEST, chunk );
  79. chunk->setNeighbor( EAST, chunk );
  80. }
  81. getAddrOfWorld( chunk->getCenter() + Punkt( -CHUNK_SIZE, 0 ), addr );
  82. zChunk = chunks->z( addr, 9 );
  83. if( zChunk )
  84. {
  85. zChunk->setNeighbor( EAST, chunk );
  86. chunk->setNeighbor( WEST, chunk );
  87. }
  88. getAddrOfWorld( chunk->getCenter() + Punkt( 0, CHUNK_SIZE ), addr );
  89. zChunk = chunks->z( addr, 9 );
  90. if( zChunk )
  91. {
  92. zChunk->setNeighbor( NORTH, chunk );
  93. chunk->setNeighbor( SOUTH, chunk );
  94. }
  95. getAddrOfWorld( chunk->getCenter() + Punkt( 0, -CHUNK_SIZE ), addr );
  96. zChunk = chunks->z( addr, 9 );
  97. if( zChunk )
  98. {
  99. zChunk->setNeighbor( SOUTH, chunk );
  100. chunk->setNeighbor( NORTH, chunk );
  101. }
  102. }
  103. else
  104. chunk->release();
  105. }
  106. int Dimension::getDimensionId() const
  107. {
  108. return dimensionId;
  109. }
  110. bool Dimension::hasChunck( int x, int y ) const
  111. {
  112. return zChunk( Punkt( x, y ) );
  113. }