From 996076cf151a27a7a8d278aa4d15b28cfb196c46 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Sat, 20 Feb 2021 13:04:41 -0500 Subject: Added a randomly wandering Ionia to the map --- src/behaviour_system.cpp | 32 ++++++++++++++++++++++++++++++++ src/behaviour_system.h | 24 ++++++++++++++++++++++++ src/game.cpp | 4 ++++ src/game.h | 6 +++++- src/main.cpp | 14 ++++++++++---- src/map.cpp | 2 ++ src/map.h | 1 + src/sprite.h | 3 +++ src/system.h | 1 + 9 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 src/behaviour_system.cpp create mode 100644 src/behaviour_system.h (limited to 'src') diff --git a/src/behaviour_system.cpp b/src/behaviour_system.cpp new file mode 100644 index 0000000..8f17329 --- /dev/null +++ b/src/behaviour_system.cpp @@ -0,0 +1,32 @@ +#include "behaviour_system.h" +#include +#include "game.h" +#include "character_system.h" +#include "direction.h" + +void BehaviourSystem::tick(double dt) { + timer_.accumulate(dt); + while (timer_.step()) { + for (int spriteId : game_.getSprites()) { + Sprite& sprite = game_.getSprite(spriteId); + if (sprite.wander) { + // 75% chance of changing what's happening + if (std::bernoulli_distribution(0.75)(game_.getRng())) { + // 50% chance of choosing a direction or stopping + if (std::bernoulli_distribution(0.5)(game_.getRng())) { + Direction dir; + switch (std::uniform_int_distribution(0,3)(game_.getRng())) { + case 0: dir = Direction::left; break; + case 1: dir = Direction::up; break; + case 2: dir = Direction::right; break; + default: dir = Direction::down; break; + } + game_.getSystem().moveInDirection(spriteId, dir); + } else { + game_.getSystem().stopDirecting(spriteId); + } + } + } + } + } +} diff --git a/src/behaviour_system.h b/src/behaviour_system.h new file mode 100644 index 0000000..0eb4772 --- /dev/null +++ b/src/behaviour_system.h @@ -0,0 +1,24 @@ +#ifndef BEHAVIOUR_SYSTEM_H_FC908ABE +#define BEHAVIOUR_SYSTEM_H_FC908ABE + +#include "system.h" +#include "timer.h" + +class Game; + +class BehaviourSystem : public System { +public: + + static constexpr SystemKey Key = SystemKey::Behaviour; + + explicit BehaviourSystem(Game& game) : game_(game) {} + + void tick(double dt) override; + +private: + + Game& game_; + Timer timer_ { 500 }; +}; + +#endif /* end of include guard: BEHAVIOUR_SYSTEM_H_FC908ABE */ diff --git a/src/game.cpp b/src/game.cpp index dbd314a..729e665 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -62,6 +62,10 @@ void Game::loadMap(std::string filename) { getSprite(spriteId).hasShadow = p.shadow; } getSprite(spriteId).interactionScript = p.interactionScript; + if (p.wander) { + getSystem().initSprite(spriteId); + getSprite(spriteId).wander = true; + } } for (const Trigger& t : map_->getTriggers()) { diff --git a/src/game.h b/src/game.h index 9340c65..72dd337 100644 --- a/src/game.h +++ b/src/game.h @@ -8,6 +8,7 @@ #include #include #include +#include #include "sprite.h" #include "map.h" #include "consts.h" @@ -20,7 +21,7 @@ class Renderer; class Game { public: - explicit Game(Renderer& renderer) : font_("../res/font.txt", renderer) {} + Game(Renderer& renderer, std::mt19937& rng) : font_("../res/font.txt", renderer), rng_(&rng) {} Mixer& getMixer() { return mixer_; } @@ -83,6 +84,8 @@ public: const Font& getFont() const { return font_; } + std::mt19937& getRng() { return *rng_; } + private: Mixer mixer_; @@ -97,6 +100,7 @@ private: std::map spritesByAlias_; std::unique_ptr map_; Font font_; + std::mt19937* rng_; }; #endif /* end of include guard: GAME_H_E6F1396E */ diff --git a/src/main.cpp b/src/main.cpp index f220dc0..9f503e1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "renderer.h" #include "game.h" #include "timer.h" @@ -12,12 +13,14 @@ #include "message_system.h" #include "script_system.h" #include "effect_system.h" +#include "behaviour_system.h" -void loop(Renderer& renderer) { - Game game(renderer); +void loop(Renderer& renderer, std::mt19937& rng) { + Game game(renderer, rng); game.emplaceSystem(); game.emplaceSystem(); game.emplaceSystem(); + game.emplaceSystem(); game.emplaceSystem(); game.emplaceSystem(); game.emplaceSystem(); @@ -26,7 +29,7 @@ void loop(Renderer& renderer) { game.loadMap("map2"); - vec2i warpLoc = game.getMap().getWarpPoint("debugWarp_mailboxes"); + vec2i warpLoc = game.getMap().getWarpPoint("debugWarp_rightside"); int lucasSprite = game.emplaceSprite("lucas"); game.getSystem().initSprite(lucasSprite, warpLoc); @@ -83,11 +86,14 @@ void loop(Renderer& renderer) { } int main(int, char**) { + std::random_device randomEngine; + std::mt19937 rng(randomEngine()); + try { Renderer renderer; - loop(renderer); + loop(renderer, rng); } catch (const sdl_error& ex) { std::cout << "SDL error (" << ex.what() << ")" << std::endl; diff --git a/src/map.cpp b/src/map.cpp index 3686bbd..7bff071 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -76,6 +76,8 @@ Map::Map(std::string_view name) : name_(name) { p.interactionScript = property.getStringValue(); } else if (property.getName() == "shadow") { p.shadow = property.getBoolValue(); + } else if (property.getName() == "wander") { + p.wander = property.getBoolValue(); } } diff --git a/src/map.h b/src/map.h index 7dbe613..c5ecc64 100644 --- a/src/map.h +++ b/src/map.h @@ -24,6 +24,7 @@ struct Prototype { std::string animationFilename; std::string interactionScript; bool shadow = false; + bool wander = false; }; struct Trigger { diff --git a/src/sprite.h b/src/sprite.h index 19dbf92..82849fa 100644 --- a/src/sprite.h +++ b/src/sprite.h @@ -78,6 +78,9 @@ public: // Input bool controllable = false; bool player = false; + + // Behaviour + bool wander = false; }; #endif /* end of include guard: SPRITE_H_70503825 */ diff --git a/src/system.h b/src/system.h index 01d6cec..c0b0637 100644 --- a/src/system.h +++ b/src/system.h @@ -5,6 +5,7 @@ enum class SystemKey { Script, Transform, Input, + Behaviour, Character, Animation, Camera, -- cgit 1.4.1