Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int MapView::calcFirstVisibleFloor()
- {
- int z = 7;
- // return forced first visible floor
- if(m_lockedFirstVisibleFloor != -1) {
- z = m_lockedFirstVisibleFloor;
- } else {
- Position cameraPosition = getCameraPosition();
- // this could happens if the player is not known yet
- if(cameraPosition.isValid()) {
- // avoid rendering multifloors in far views
- if(!m_multifloor) {
- z = cameraPosition.z;
- } else {
- // if nothing is limiting the view, the first visible floor is 0
- int firstFloor = 0;
- // limits to underground floors while under sea level
- if(cameraPosition.z > Otc::SEA_FLOOR)
- firstFloor = std::max<int>(cameraPosition.z - Otc::AWARE_UNDEGROUND_FLOOR_RANGE, (int)Otc::UNDERGROUND_FLOOR);
- // loop in 3x3 tiles around the camera
- for(int ix = -1; ix <= 1 && firstFloor < cameraPosition.z; ++ix) {
- for(int iy = -1; iy <= 1 && firstFloor < cameraPosition.z; ++iy) {
- Position pos = cameraPosition.translated(ix, iy);
- // process tiles that we can look through, e.g. windows, doors
- if((ix == 0 && iy == 0) || ((std::abs(ix) != std::abs(iy)) && g_map.isLookPossible(pos))) {
- Position upperPos = pos;
- Position coveredPos = pos;
- while(coveredPos.coveredUp() && upperPos.up() && upperPos.z >= firstFloor) {
- // check tiles physically above
- TilePtr tile = g_map.getTile(upperPos);
- if(tile && tile->limitsFloorsView(!g_map.isLookPossible(pos))) {
- firstFloor = upperPos.z + 1;
- break;
- }
- // check tiles geometrically above
- tile = g_map.getTile(coveredPos);
- if(tile && tile->limitsFloorsView(g_map.isLookPossible(pos))) {
- firstFloor = coveredPos.z + 1;
- break;
- }
- }
- }
- }
- }
- z = firstFloor;
- }
- }
- }
- // just ensure the that the floor is in the valid range
- z = stdext::clamp<int>(z, 0, (int)Otc::MAX_Z);
- return z;
- }
- int MapView::calcLastVisibleFloor()
- {
- if(!m_multifloor)
- return calcFirstVisibleFloor();
- int z = 7;
- Position cameraPosition = getCameraPosition();
- // this could happens if the player is not known yet
- if(cameraPosition.isValid()) {
- // view only underground floors when below sea level
- if(cameraPosition.z > Otc::SEA_FLOOR)
- z = cameraPosition.z + Otc::AWARE_UNDEGROUND_FLOOR_RANGE;
- else
- z = Otc::SEA_FLOOR;
- }
- if(m_lockedFirstVisibleFloor != -1)
- z = std::max<int>(m_lockedFirstVisibleFloor, z);
- // just ensure the that the floor is in the valid range
- z = stdext::clamp<int>(z, 0, (int)Otc::MAX_Z);
- return z;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement