1 #include "music.h"
2
3 #include "core/dir.h"
4 #include "city/figures.h"
5 #include "city/population.h"
6 #include "game/settings.h"
7 #include "sound/device.h"
8
9 enum {
10 TRACK_NONE = 0,
11 TRACK_CITY_1 = 1,
12 TRACK_CITY_2 = 2,
13 TRACK_CITY_3 = 3,
14 TRACK_CITY_4 = 4,
15 TRACK_CITY_5 = 5,
16 TRACK_COMBAT_SHORT = 6,
17 TRACK_COMBAT_LONG = 7,
18 TRACK_INTRO = 8,
19 TRACK_MAX = 9
20 };
21
22 static struct {
23 int current_track;
24 int next_check;
25 } data = {TRACK_NONE, 0};
26
27 static const char tracks[][32] = {
28 "",
29 "wavs/ROME1.WAV",
30 "wavs/ROME2.WAV",
31 "wavs/ROME3.WAV",
32 "wavs/ROME4.WAV",
33 "wavs/ROME5.WAV",
34 "wavs/Combat_Short.wav",
35 "wavs/Combat_Long.wav",
36 "wavs/setup.wav"
37 };
38
39 static const char mp3_tracks[][32] = {
40 "",
41 "mp3/ROME1.mp3",
42 "mp3/ROME2.mp3",
43 "mp3/ROME3.mp3",
44 "mp3/ROME4.mp3",
45 "mp3/ROME5.mp3",
46 "mp3/Combat_Short.mp3",
47 "mp3/Combat_Long.mp3",
48 "mp3/setup.mp3"
49 };
50
sound_music_set_volume(int percentage)51 void sound_music_set_volume(int percentage)
52 {
53 sound_device_set_music_volume(percentage);
54 }
55
play_track(int track)56 static void play_track(int track)
57 {
58 sound_device_stop_music();
59 if (track <= TRACK_NONE || track >= TRACK_MAX) {
60 return;
61 }
62 const char *mp3_track = dir_get_file(mp3_tracks[track], NOT_LOCALIZED);
63
64 int volume = setting_sound(SOUND_MUSIC)->volume;
65 if (!mp3_track || !sound_device_play_music(mp3_track, volume)) {
66 sound_device_play_music(dir_get_file(tracks[track], NOT_LOCALIZED), volume);
67 }
68 data.current_track = track;
69 }
70
sound_music_play_intro(void)71 void sound_music_play_intro(void)
72 {
73 if (setting_sound(SOUND_MUSIC)->enabled) {
74 play_track(TRACK_INTRO);
75 }
76 }
77
sound_music_play_editor(void)78 void sound_music_play_editor(void)
79 {
80 if (setting_sound(SOUND_MUSIC)->enabled) {
81 play_track(TRACK_CITY_1);
82 }
83 }
84
sound_music_update(int force)85 void sound_music_update(int force)
86 {
87 if (data.next_check && !force) {
88 --data.next_check;
89 return;
90 }
91 if (!setting_sound(SOUND_MUSIC)->enabled) {
92 return;
93 }
94 int track;
95 int population = city_population();
96 int total_enemies = city_figures_total_invading_enemies();
97 if (total_enemies >= 32) {
98 track = TRACK_COMBAT_LONG;
99 } else if (total_enemies > 0) {
100 track = TRACK_COMBAT_SHORT;
101 } else if (population < 1000) {
102 track = TRACK_CITY_1;
103 } else if (population < 2000) {
104 track = TRACK_CITY_2;
105 } else if (population < 5000) {
106 track = TRACK_CITY_3;
107 } else if (population < 7000) {
108 track = TRACK_CITY_4;
109 } else {
110 track = TRACK_CITY_5;
111 }
112
113 if (track == data.current_track) {
114 return;
115 }
116
117 play_track(track);
118 data.next_check = 10;
119 }
120
sound_music_stop(void)121 void sound_music_stop(void)
122 {
123 sound_device_stop_music();
124 data.current_track = TRACK_NONE;
125 data.next_check = 0;
126 }
127