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