Line data Source code
1 : #ifndef __STATE_MANAGER_HPP__
2 : #define __STATE_MANAGER_HPP__
3 :
4 : #include "core/state/State.hpp"
5 : #include "core/state/Control.hpp"
6 :
7 : #include "core/types/ItemType.hpp"
8 :
9 : #include <memory>
10 : #include <functional>
11 : #include <random>
12 :
13 : namespace Soldank
14 : {
15 : class StateManager
16 : {
17 : public:
18 : StateManager(
19 : AnimationDataManager& animation_data_manager,
20 : std::shared_ptr<ParticleSystem> skeleton = ParticleSystem::Load(ParticleSystemType::Soldier));
21 :
22 : Map& GetMap() { return state_.map; } // TODO: Change this to const
23 0 : const Map& GetConstMap() const { return state_.map; }
24 : void OverrideMap(const Map& map) { state_.map = map; }
25 :
26 : void ChangeSoldierControlActionState(std::uint8_t soldier_id,
27 : ControlActionType control_action_type,
28 : bool new_state);
29 : void SoldierControlApply(
30 : std::uint8_t soldier_id,
31 : const std::function<void(const Soldier& soldier, Control& control)>& apply_function);
32 :
33 : void ChangeSoldierMouseMapPosition(std::uint8_t soldier_id, glm::ivec2 new_mouse_position);
34 : void SwitchSoldierWeapon(std::uint8_t soldier_id);
35 : void ChangeSoldierPrimaryWeapon(std::uint8_t soldier_id, WeaponType new_weapon_type);
36 : void SoldierPickupWeapon(std::uint8_t soldier_id, const Item& item);
37 : void SoldierPickupKit(std::uint8_t soldier_id, std::uint8_t item_id);
38 : void MoveSoldier(std::uint8_t soldier_id, const glm::vec2& move_offset);
39 : void SetSoldierPosition(std::uint8_t soldier_id, const glm::vec2& new_position);
40 : void ThrowSoldierFlags(std::uint8_t soldier_id);
41 : glm::vec2 GetSoldierAimDirection(std::uint8_t soldier_id);
42 : void TransformSoldier(std::uint8_t soldier_id,
43 : const std::function<void(Soldier&)>& transform_soldier_function);
44 : void TransformSoldiers(const std::function<void(Soldier&)>& transform_soldier_function);
45 : const Soldier& GetSoldier(std::uint8_t soldier_id) const;
46 : const Soldier& CreateSoldier(std::optional<unsigned int> force_soldier_id);
47 : glm::vec2 SpawnSoldier(unsigned int soldier_id, std::optional<glm::vec2> spawn_position);
48 : void ForEachSoldier(
49 : const std::function<void(const Soldier& soldier)>& for_each_soldier_function) const;
50 : void ForSoldier(std::uint8_t soldier_id,
51 : const std::function<void(const Soldier& soldier)>& for_soldier_function) const;
52 : const Soldier* FindSoldier(const std::function<bool(const Soldier& soldier)>& predicate) const;
53 : void RemoveSoldier(std::uint8_t soldier_id);
54 : std::size_t GetSoldiersCount() const;
55 :
56 : void EnqueueNewProjectile(const BulletParams& bullet_params);
57 : void CreateProjectile(const BulletParams& bullet_params);
58 : const std::vector<BulletParams>& GetBulletEmitter() const;
59 : void ClearBulletEmitter();
60 : void ForEachBullet(
61 : const std::function<void(const Bullet& bullet)>& for_each_bullet_function) const;
62 : std::size_t GetBulletsCount() const;
63 : void TransformBullets(const std::function<void(Bullet& bullet)>& transform_bullet_function);
64 :
65 : Item& CreateItem(glm::vec2 position, std::uint8_t owner_id, ItemType style);
66 : void SetItemPosition(unsigned int id, glm::vec2 new_position);
67 : void MoveItemIntoDirection(unsigned int id, glm::vec2 direction);
68 : void TransformItems(const std::function<void(Item& item)>& transform_item_function);
69 : void ForEachItem(const std::function<void(const Item& item)>& for_each_item_function) const;
70 :
71 : unsigned int GetGameTick() const { return state_.game_tick; }
72 : void SetGameTick(unsigned int new_game_tick) { state_.game_tick = new_game_tick; }
73 :
74 : bool IsGamePaused() const { return state_.paused; }
75 : void PauseGame() { state_.paused = true; }
76 : void UnPauseGame() { state_.paused = false; }
77 : void TogglePauseGame() { state_.paused = !state_.paused; }
78 :
79 : private:
80 : Soldier& GetSoldierRef(std::uint8_t soldier_id);
81 : Item& GetItemRef(std::uint8_t item_id);
82 :
83 : State state_;
84 : std::vector<BulletParams> bullet_emitter_;
85 :
86 : std::random_device random_device_{};
87 : std::mt19937 mersenne_twister_engine_{ random_device_() };
88 : };
89 : } // namespace Soldank
90 :
91 : #endif
|