diff --git a/README.txt b/README.txt index 7727f13..52598f8 100644 --- a/README.txt +++ b/README.txt @@ -10,6 +10,7 @@ R: reload Q: use left Gadget E: use right Gadget F: pick up item or swap Gadgets +Esc: exit ## Dependencies - SFML diff --git a/res/yaml/window.yaml b/res/yaml/window.yaml new file mode 100644 index 0000000..d23163f --- /dev/null +++ b/res/yaml/window.yaml @@ -0,0 +1,4 @@ +resolution_width: 1024 +resolution_height: 768 +fullscreen: false +borderless: false \ No newline at end of file diff --git a/src/Game.cpp b/src/Game.cpp index 4e37772..d389efb 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -66,12 +66,30 @@ Game::initPlayer() { Weapon::WeaponType::PISTOL, Weapon::WeaponType::KNIFE, Gadget::GadgetType::NONE, Gadget::GadgetType::NONE }; - mGenerator.generateCurrentAreaIfNeeded(Vector2f(), playerItems); + auto enemySpawns = mGenerator.generateCurrentAreaIfNeeded(Vector2f()); mPlayer = std::shared_ptr(new Player(mWorld, mPathfinder, mGenerator.getPlayerSpawn(), playerItems)); mWorld.insertCharacter(mPlayer); + insertEnemies(enemySpawns); } +/** + * Inserts enemies at the given positions, if they are more than + * Character::VISION_DISTANCE away from the player's postion. + */ +void +Game::insertEnemies(const std::vector& positions) { + for (const auto& spawn : positions) { + if (thor::length(spawn - mPlayer->getPosition()) > + Character::VISION_DISTANCE) + mWorld.insertCharacter(std::make_shared(mWorld, + mPathfinder, spawn, mPlayer->getEquippedItems())); + } +} + +/** + * Initializes the lights held by the player and sets light system parameters. + */ void Game::initLight() { Yaml config("light.yaml"); @@ -132,7 +150,8 @@ Game::loop() { render(); - mGenerator.generateCurrentAreaIfNeeded(mPlayer->getPosition(), mPlayer->getEquippedItems()); + auto enemySpawns = mGenerator.generateCurrentAreaIfNeeded(mPlayer->getPosition()); + insertEnemies(enemySpawns); } } @@ -341,7 +360,10 @@ Game::render() { // Update light mPlayerAreaLight->SetCenter(mPlayer->getPosition().toVec2f()); - mPlayerDirectionLight->SetCenter(mPlayer->getPosition().toVec2f()); + // Avoid light light drawing partially onto player sprite. + Vector2f playerLightPosition = mPlayer->getPosition() + + thor::rotatedVector(Vector2f(0, - 13), mPlayer->getDirection()); + mPlayerDirectionLight->SetCenter(playerLightPosition.toVec2f()); mPlayerDirectionLight->SetDirectionAngle(degreeToRadian(90 - mPlayer->getDirection())); mLightSystem.SetView(mWorldView); diff --git a/src/Game.h b/src/Game.h index 41e7c43..848d4fe 100644 --- a/src/Game.h +++ b/src/Game.h @@ -43,6 +43,7 @@ private: void updateGui(); void initPlayer(); void initLight(); + void insertEnemies(const std::vector& positions); private: static const int FPS_GOAL = 60; diff --git a/src/World.cpp b/src/World.cpp index cac8ef2..3c6652f 100755 --- a/src/World.cpp +++ b/src/World.cpp @@ -121,9 +121,9 @@ World::applyMovement(std::shared_ptr sprite, int elapsed) { void World::think(int elapsed) { for (auto it = mCharacters.begin(); it != mCharacters.end(); ) { - if ((*it)->getDelete() && (*it)->getCategory() != Sprite::CATEGORY_ACTOR) { + if ((*it)->getDelete()) { mCharacters.erase(it); - auto& d = mDrawables[(*it)->getCategory()]; + auto& d = mDrawables[Sprite::CATEGORY_ACTOR]; d.erase(std::find(d.begin(), d.end(), *it)); } else { diff --git a/src/generator/Generator.cpp b/src/generator/Generator.cpp index e5d2697..0487d60 100644 --- a/src/generator/Generator.cpp +++ b/src/generator/Generator.cpp @@ -39,15 +39,17 @@ Generator::Generator(World& world, Pathfinder& pathfinder, /** * Generates tiles near player position (maximum distance is determined by * GENERATE_AREA_SIZE and GENERATE_AREA_RANGE). + * + * @return Potential spawn points for enemies. Guaranteed to be on floor tiles. */ -void -Generator::generateCurrentAreaIfNeeded(const Vector2f& playerPosition, - const Character::EquippedItems& playerItems) { +std::vector +Generator::generateCurrentAreaIfNeeded(const Vector2f& position) { + std::vector enemySpawns; std::map open; std::set closed; - Vector2i start((int) floor(playerPosition.x / Tile::TILE_SIZE.x), - (int) floor(playerPosition.y / Tile::TILE_SIZE.y)); + Vector2i start((int) floor(position.x / Tile::TILE_SIZE.x), + (int) floor(position.y / Tile::TILE_SIZE.y)); start /= mAreaSize; auto makePair = [&start](const Vector2i& point) { return std::make_pair(point, thor::length(Vector2f(point - start))); @@ -65,12 +67,8 @@ Generator::generateCurrentAreaIfNeeded(const Vector2f& playerPosition, Vector2i(mAreaSize, mAreaSize) / 2, Vector2i(mAreaSize, mAreaSize)); generateTiles(area); - for (const auto& spawn : getEnemySpawns(area)) { - float distance = thor::length(spawn - playerPosition); - if (distance > Character::VISION_DISTANCE) - mWorld.insertCharacter(std::shared_ptr(new Enemy( - mWorld, mPathfinder, spawn, playerItems))); - } + auto spawnTemp = getEnemySpawns(area); + enemySpawns.insert(enemySpawns.end(), spawnTemp.begin(), spawnTemp.end()); } if (mGenerated[current.x][current.y] && distance <= mMaxRange) { if (closed.find(Vector2i(current.x + 1, current.y)) == closed.end()) @@ -83,6 +81,7 @@ Generator::generateCurrentAreaIfNeeded(const Vector2f& playerPosition, open.insert(makePair(Vector2i(current.x, current.y - 1))); } } + return enemySpawns; } /** diff --git a/src/generator/Generator.h b/src/generator/Generator.h index 4dbdab4..025cb30 100644 --- a/src/generator/Generator.h +++ b/src/generator/Generator.h @@ -28,10 +28,8 @@ class Generator : public sf::Drawable { public: explicit Generator(World& world, Pathfinder& pathfinder, ltbl::LightSystem& lightSystem, const Yaml& config); - void generateCurrentAreaIfNeeded(const Vector2f& position, - const Character::EquippedItems& playerItems); + std::vector generateCurrentAreaIfNeeded(const Vector2f& position); Vector2f getPlayerSpawn() const; - std::vector getEnemySpawns(const sf::IntRect& area); private: typedef std::map > array; @@ -43,6 +41,7 @@ private: std::vector createMinimalSpanningTree( const Vector2i& start, const float limit); void connectRooms(const Vector2i& start); + std::vector getEnemySpawns(const sf::IntRect& area); void draw(sf::RenderTarget& target, sf::RenderStates states) const; private: diff --git a/src/main.cpp b/src/main.cpp index f56e74c..479390b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -17,12 +17,22 @@ */ int main(int argc, char* argv[]) { Yaml::setFolder("res/yaml/"); - Loader::i().setFolder("res/"); Loader::i().setSubFolder("textures/"); - tgui::Window window(sf::VideoMode(1024, 768, 32), "Dungeon Gunner", - sf::Style::Close | sf::Style::Titlebar); + Yaml windowConfig("window.yaml"); + sf::VideoMode mode(windowConfig.get("resolution_width", 800), + windowConfig.get("resolution_height", 600), + 32); + sf::Uint32 style; + if (windowConfig.get("fullscreen", false)) + style = sf::Style::Fullscreen; + else if (windowConfig.get("borderless", false)) + style = sf::Style::None; + else + style = sf::Style::Titlebar; + tgui::Window window(mode, "Dungeon Gunner", style); + Vector2f::SCREEN_HEIGHT = window.getSize().y; if (!window.globalFont.loadFromFile("res/DejaVuSans.ttf")) diff --git a/src/sprites/Enemy.cpp b/src/sprites/Enemy.cpp index 3c6ee26..dc835ab 100644 --- a/src/sprites/Enemy.cpp +++ b/src/sprites/Enemy.cpp @@ -34,7 +34,7 @@ Enemy::Enemy(World& world, Pathfinder& pathfinder, Character::EquippedItems Enemy::generateItems(EquippedItems playerItems) { // Uses cast from enum to int to enum in order to increment enum values. - switch (rand() % 4) { + switch (rand() % 2) { case 0: if (playerItems.primary + 1 != Weapon::WeaponType::_LAST) playerItems.primary = @@ -46,20 +46,12 @@ Enemy::generateItems(EquippedItems playerItems) { playerItems.secondary = (Weapon::WeaponType) (((int) (playerItems.secondary) + 1)); - break; - case 2: - if (playerItems.left + 1 != Gadget::GadgetType::_LAST) - playerItems.left = (Gadget::GadgetType) (((int) (playerItems.left) - + 1)); - - break; - case 3: - if (playerItems.right + 1 != Gadget::GadgetType::_LAST) - playerItems.left = (Gadget::GadgetType) (((int) (playerItems.left) - + 1)); - break; } + + playerItems.left = (Gadget::GadgetType) (rand() % 4); + playerItems.right = (Gadget::GadgetType) (rand() % 4); + return playerItems; } diff --git a/src/sprites/items/Gadget.h b/src/sprites/items/Gadget.h index de96ce3..235e24d 100644 --- a/src/sprites/items/Gadget.h +++ b/src/sprites/items/Gadget.h @@ -23,8 +23,7 @@ public: NONE, SHIELD, HEAL, - RINGOFFIRE, - _LAST + RINGOFFIRE }; public: