QString TApp::getCurrentRoomName() const { Room *currentRoom = dynamic_cast<Room *>(getCurrentRoom()); if (!currentRoom) return QString(); return currentRoom->getName(); }
void Level::update(float dt) { if (_transitionTimer > 0.0f) { // Update transition _transitionTimer -= dt; } else { getCurrentRoom().update(dt); } }
void SwingingBlade::onFrameChanged(FrameChangeType frameChangeType) { auto room = getCurrentRoom(); auto sector = getLevel().findFloorSectorWithClampedPosition( getPosition().toInexact(), &room ); setCurrentRoom( room ); setFloorHeight( HeightInfo::fromFloor( sector, getPosition().toInexact(), getLevel().m_cameraController ) .distance ); ItemNode::onFrameChanged( frameChangeType ); }
void Level::render(sf::RenderTarget &rt) { if (_transitionTimer > 0.0f) { float interp = _transitionTimer / _transitionTime; // Render transition sf::Sprite oldRoomSprite; oldRoomSprite.setTexture(getGame()->_transitionTexture0.getTexture()); oldRoomSprite.setColor(sf::Color(interp * 255.0f, interp * 255.0f, interp * 255.0f)); sf::Sprite newRoomSprite; newRoomSprite.setTexture(getGame()->_transitionTexture1.getTexture()); sf::Vector2f sizef(getGame()->_transitionTexture0.getSize().x, getGame()->_transitionTexture0.getSize().y); newRoomSprite.setColor(sf::Color((1.0f - interp) * 255.0f, (1.0f - interp) * 255.0f, (1.0f - interp) * 255.0f)); switch (_transitionDir) { case 0: oldRoomSprite.setPosition((interp - 1.0f) * sizef.x, 0.0f); newRoomSprite.setPosition(interp * sizef.x, 0.0f); break; case 1: oldRoomSprite.setPosition(0.0f, (interp - 1.0f) * sizef.y); newRoomSprite.setPosition(0.0f, interp * sizef.y); break; case 2: oldRoomSprite.setPosition(-(interp - 1.0f) * sizef.x, 0.0f); newRoomSprite.setPosition(-interp * sizef.x, 0.0f); break; case 3: oldRoomSprite.setPosition(0.0f, -(interp - 1.0f) * sizef.y); newRoomSprite.setPosition(0.0f, -interp * sizef.y); break; } rt.draw(oldRoomSprite); rt.draw(newRoomSprite); } else getCurrentRoom().render(rt, _backgroundTextures, _doorTextures, _roofTextures); }
void Level::transition(int dir) { if (_transitionTimer > 0.0f) return; _transitionTimer = _transitionTime; _transitionDir = dir; Room &oldRoom = getCurrentRoom(); int oldCellX = _currentCellX; int oldCellY = _currentCellY; switch (_transitionDir) { case 0: _currentCellX++; break; case 1: _currentCellY++; break; case 2: _currentCellX--; break; case 3: _currentCellY--; break; } if (getCell(_currentCellX, _currentCellY)._room == nullptr) { std::cerr << "ERROR: Cannot transition: No room in direction: " << dir << std::endl; _currentCellX = oldCellX; _currentCellY = oldCellY; return; } // Render old room to temporary rt getGame()->_transitionTexture0.clear(); getGame()->_transitionTexture1.clear(); oldRoom.render(getGame()->_transitionTexture0, _backgroundTextures, _doorTextures, _roofTextures); getCurrentRoom().render(getGame()->_transitionTexture1, _backgroundTextures, _doorTextures, _roofTextures); getGame()->_transitionTexture0.display(); getGame()->_transitionTexture1.display(); // Normalize limbo times float maxTime = -99999.0f; for (int i = 0; i < getCell(_currentCellX, _currentCellY)._room->_transitLimbo.size(); i++) maxTime = std::max(maxTime, getCell(_currentCellX, _currentCellY)._room->_transitLimbo[i]->_timeSinceTransit); for (int i = 0; i < getCell(_currentCellX, _currentCellY)._room->_transitLimbo.size(); i++) getCell(_currentCellX, _currentCellY)._room->_transitLimbo[i]->_timeSinceTransit = std::max(-_maxAllowedTransitTime, getCell(_currentCellX, _currentCellY)._room->_transitLimbo[i]->_timeSinceTransit - maxTime); float minTime = 99999.0f; for (int i = 0; i < getCell(_currentCellX, _currentCellY)._room->_transitLimbo.size(); i++) minTime = std::min(minTime, getCell(_currentCellX, _currentCellY)._room->_transitLimbo[i]->_timeSinceTransit); for (int i = 0; i < getCell(_currentCellX, _currentCellY)._room->_transitLimbo.size(); i++) getCell(_currentCellX, _currentCellY)._room->_transitLimbo[i]->_timeSinceTransit = minTime - getCell(_currentCellX, _currentCellY)._room->_transitLimbo[i]->_timeSinceTransit; // If just finished transition, add all units to selection by default getGame()->_selection.clear(); for (int i = 0; i < getCell(_currentCellX, _currentCellY)._room->_transitLimbo.size(); i++) getGame()->_selection.insert(getCell(_currentCellX, _currentCellY)._room->_transitLimbo[i].get()); getCurrentRoom().healEnemies(); }