The Battle for Wesnoth 1.21.0-dev
 
Loading...
Searching...
No Matches
soundsource.hpp
Go to the documentation of this file.
1/*
2 Copyright (C) 2006 - 2025
3 by Karol Nowak <grzywacz@sul.uni.lodz.pl>
4 Part of the Battle for Wesnoth Project https://www.wesnoth.org/
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY.
12
13 See the COPYING file for more details.
14*/
15
16#pragma once
17
18#include <map>
19
20#include "generic_event.hpp"
21#include "map/location.hpp"
22
23class config;
24class display;
25
26namespace soundsource {
27
28class sourcespec;
29
30/*
31 * Sound source is an object on a map (a location) which has one or more
32 * sounds effects associated with it, which are played randomly and with
33 * appropriate delays, when sound emitting object is visible on screen.
34 */
36 std::chrono::steady_clock::time_point last_played_;
37 std::chrono::milliseconds min_delay_;
39 int loops_;
40 const unsigned int id_;
41 int range_;
45 std::string files_;
46 std::vector<map_location> locations_;
47
48 // Last assigned id; this can, of course, overflow, but I'd
49 // never expect to see 4 billions sound sources being created...
50 static unsigned int last_id;
51
52public:
53 // min_delay is a minimum time in seconds, which must pass before
54 // this sound source can be played again if it remains visible
55 //
56 // chance is a chance ;-) (in %) that the sound source will emit
57 // sound every second after the delay has passed or once the source
58 // becomes visible
59 positional_source(const sourcespec &spec);
61
62 bool is_global() const;
63
64 void update(const std::chrono::steady_clock::time_point& time, const display &disp);
65 void update_positions(const std::chrono::steady_clock::time_point& time, const display &disp);
66
67 int calculate_volume(const map_location &loc, const display &disp);
68
69 /**
70 * Serializes attributes as WML config.
71 * @param cfg A reference to a [sound_source] tag object.
72 */
73 void write_config(config& cfg) const;
74};
75
77{
78
79 typedef std::map<std::string, std::unique_ptr<positional_source>> positional_source_map;
80 typedef positional_source_map::iterator positional_source_iterator;
81 typedef positional_source_map::const_iterator positional_source_const_iterator;
82
84 const display &disp_;
85
86public:
87 manager(const display &disp);
88 ~manager();
89
90 // event interface
91 void handle_generic_event(const std::string &event_name);
92
93 // add or replace a soundsource
94 void add(const sourcespec &source);
95 void remove(const std::string &id);
96 sourcespec get(const std::string &id);
97 bool contains(const std::string& id);
98 void update();
99
100 // checks which sound sources are visible
101 void update_positions();
102
103 /**
104 * Serializes information into cfg as new children of key
105 * "sound_source", appended to existing content.
106 */
107 void write_sourcespecs(config& cfg) const;
108};
109
110/**
111 * Sound source info class.
112 * Encapsulates sound source parameters, so that they're easier to pass
113 * around/extend/read.
114 */
116{
117 const std::string id_;
118 std::string files_;
119
120 std::chrono::milliseconds min_delay_;
122
128
129 std::vector<map_location> locations_;
130
131public:
132 /** Parameter-list constructor. */
133 sourcespec(const std::string& id, const std::string& files, const std::chrono::milliseconds& min_delay, int chance) :
134 id_(id),
135 files_(files),
136 min_delay_(min_delay),
138 loops_(0),
139 range_(3),
140 faderange_(14),
141 check_fogged_(false),
142 check_shrouded_(false),
143 locations_()
144 {}
145
146 /** WML constructor. */
147 sourcespec(const config& cfg);
148
149 /**
150 * Serializes information into cfg as a new (appended)
151 * child of key "sound_source".
152 */
153 void write(config& cfg) const;
154
155 int loops() const { return loops_; }
156
157 void set_loops(int value) {
158 loops_ = value;
159 }
160
161 bool check_fogged() const { return check_fogged_; }
162 bool check_shrouded() const { return check_shrouded_; }
163
166 }
167
171
172 const std::vector<map_location>& get_locations() const {
173 return locations_;
174 }
175
176 void set_locations(const std::vector<map_location>& locs) {
177 locations_ = locs;
178 }
179
180 int full_range() const { return range_; }
181
183 range_ = value;
184 }
185
186 int fade_range() const { return faderange_; }
187
190 }
191
192 auto minimum_delay() const { return min_delay_; }
193
194 void set_minimum_delay(const std::chrono::milliseconds& value) {
196 }
197
198 int chance() const { return chance_; }
199
200 void set_chance(int value) {
201 chance_ = value;
202 }
203
204 const std::string& id() const { return id_; }
205
206 const std::string& files() const { return files_; }
207
208 void set_files(const std::string& f) {
209 files_ = f;
210 }
211};
212
213} // namespace soundsource
map_location loc
Definition move.cpp:172
A config object defines a single node in a WML file, with access to child nodes.
Definition config.hpp:157
Sort-of-Singleton that many classes, both GUI and non-GUI, use to access the game data.
Definition display.hpp:88
void handle_generic_event(const std::string &event_name)
sourcespec get(const std::string &id)
positional_source_map sources_
const display & disp_
positional_source_map::iterator positional_source_iterator
void write_sourcespecs(config &cfg) const
Serializes information into cfg as new children of key "sound_source", appended to existing content.
void add(const sourcespec &source)
positional_source_map::const_iterator positional_source_const_iterator
bool contains(const std::string &id)
void remove(const std::string &id)
std::map< std::string, std::unique_ptr< positional_source > > positional_source_map
std::chrono::steady_clock::time_point last_played_
void update(const std::chrono::steady_clock::time_point &time, const display &disp)
void write_config(config &cfg) const
Serializes attributes as WML config.
std::vector< map_location > locations_
int calculate_volume(const map_location &loc, const display &disp)
static unsigned int last_id
std::chrono::milliseconds min_delay_
void update_positions(const std::chrono::steady_clock::time_point &time, const display &disp)
Sound source info class.
const std::string & id() const
const std::vector< map_location > & get_locations() const
void set_check_fogged(bool value)
void write(config &cfg) const
Serializes information into cfg as a new (appended) child of key "sound_source".
const std::string & files() const
void set_check_shrouded(bool value)
const std::string id_
void set_locations(const std::vector< map_location > &locs)
void set_loops(int value)
std::vector< map_location > locations_
void set_files(const std::string &f)
sourcespec(const std::string &id, const std::string &files, const std::chrono::milliseconds &min_delay, int chance)
Parameter-list constructor.
void set_minimum_delay(const std::chrono::milliseconds &value)
std::chrono::milliseconds min_delay_
void set_chance(int value)
void set_fade_range(int value)
void set_full_range(int value)
const config * cfg
std::unique_ptr< MIX_Audio, decltype(&MIX_DestroyAudio)> value
Definition sound.cpp:139
Encapsulates the map of the game.
Definition location.hpp:46
#define f