00001
00002
00003 #ifndef NOISE_H
00004 #define NOISE_H
00005
00006 #include "externs.h"
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 const int BASE_NOISE_ATTENUATION_MILLIS = 850;
00021 const int NOISE_ATTENUATION_COMPLETE = 250000;
00022 const int LOWEST_AUDIBLE_NOISE_INTENSITY_MILLIS = 1000;
00023
00024 static inline int noise_is_audible(int noise_intensity_millis)
00025 {
00026 return noise_intensity_millis >= LOWEST_AUDIBLE_NOISE_INTENSITY_MILLIS;
00027 }
00028
00029 enum noise_flag_type
00030 {
00031 NF_NONE = 0,
00032 NF_MERMAID = 0x1,
00033 NF_MESSAGE_IF_UNSEEN = 0x2,
00034 };
00035
00036 struct noise_t
00037 {
00038 coord_def noise_source;
00039
00040 std::string noise_player_msg;
00041
00042
00043
00044 int noise_intensity_millis;
00045
00046 int16_t noise_id;
00047
00048 int16_t noise_producer_id;
00049
00050 uint16_t noise_flags;
00051
00052 noise_t(coord_def _noise_source = coord_def(),
00053 std::string _noise_player_msg = "",
00054 int _noise_intensity_millis = 0,
00055 int16_t _noise_producer_id = -1,
00056 uint16_t _flags = 0)
00057 : noise_source(_noise_source),
00058 noise_player_msg(_noise_player_msg),
00059 noise_intensity_millis(_noise_intensity_millis),
00060 noise_id(-1),
00061 noise_producer_id(_noise_producer_id),
00062 noise_flags(_flags)
00063 {
00064 }
00065
00066 bool silent() const
00067 {
00068 return !noise_is_audible(noise_intensity_millis);
00069 }
00070
00071 bool operator < (const noise_t &other) const
00072 {
00073 return noise_intensity_millis < other.noise_intensity_millis;
00074 }
00075 };
00076
00077 struct noise_cell
00078 {
00079
00080 coord_def neighbour_delta;
00081
00082 int16_t noise_id;
00083 int noise_intensity_millis;
00084 int noise_travel_distance;
00085
00086 noise_cell();
00087 bool can_apply_noise(int noise_intensity_millis) const;
00088 bool apply_noise(int noise_intensity_millis,
00089 int noise_id,
00090 int travel_distance,
00091 const coord_def &neighbour_delta);
00092
00093 bool silent() const
00094 {
00095 return !noise_is_audible(noise_intensity_millis);
00096 }
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109 int turn_angle(const coord_def &next_delta) const;
00110 };
00111
00112 class noise_grid
00113 {
00114 public:
00115 noise_grid();
00116
00117
00118
00119 void register_noise(const noise_t &noise);
00120
00121
00122 void propagate_noise();
00123
00124
00125 void reset();
00126
00127 bool dirty() const { return !noises.empty(); }
00128
00129 #ifdef DEBUG_NOISE_PROPAGATION
00130 void dump_noise_grid(const std::string &filename) const;
00131 void write_noise_grid(FILE *outf) const;
00132 void write_cell(FILE *outf, coord_def p, int ch) const;
00133 #endif
00134
00135 private:
00136 bool propagate_noise_to_neighbour(int base_attenuation,
00137 int travel_distance,
00138 const noise_cell &cell,
00139 const coord_def &pos,
00140 const coord_def &next_position);
00141 void apply_noise_effects(const coord_def &pos,
00142 int noise_intensity_millis,
00143 const noise_t &noise,
00144 int noise_travel_distance);
00145
00146 coord_def noise_perceived_position(actor *act,
00147 const coord_def &affected_position,
00148 const noise_t &noise) const;
00149
00150 private:
00151 FixedArray<noise_cell, GXM, GYM> cells;
00152 std::vector<noise_t> noises;
00153 int affected_actor_count;
00154 };
00155
00156 #endif