1 /*
2  * Copyright (C) Volition, Inc. 1999.  All rights reserved.
3  *
4  * All source code herein is the property of Volition, Inc. You may not sell
5  * or otherwise commercially exploit the source or things you created based on the
6  * source.
7  *
8 */
9 
10 
11 
12 
13 #ifndef __EVENT_MUSIC_H__
14 #define __EVENT_MUSIC_H__
15 
16 #include "globalincs/globals.h"
17 #include "globalincs/pstypes.h"
18 
19 // Identifies songs in the Soundtrack_filenames[] structure.  The order matches up with
20 // what is in Pattern_info and music.tbl.  Do not modify without properly inputting to
21 //Pattern_info and New_pattern_order
22 #define SONG_NRML_1				0		// Normal Song 1
23 #define SONG_NRML_2				1		// Normal Song 2 - for FS1
24 #define SONG_NRML_3				2		// Normal Song 3 - for FS1
25 #define SONG_AARV_1				3		// Allied Arrival 1
26 #define SONG_AARV_2				4		// Allied Arrival 2
27 #define SONG_EARV_1				5		// Enemy Arrival 1
28 #define SONG_EARV_2				6		// Enemy Arrival 2
29 #define SONG_BTTL_1				7		// Battle Song 1
30 #define SONG_BTTL_2				8		// Battle Song 2
31 #define SONG_BTTL_3				9		// Battle Song 3
32 #define SONG_FAIL_1				10		// Goal Failed
33 #define SONG_VICT_1				11		// Victory Song 1
34 #define SONG_VICT_2				12		// Victory Song 2
35 #define SONG_DEAD_1				13		// Death Song 1
36 
37 #define MAX_PATTERNS	14
38 
39 // if player targets a hostile ship at less than this range, switch to battle track
40 #define BATTLE_START_MIN_TARGET_DIST	500
41 
42 extern int Event_Music_battle_started;	// flag that will tell us if we've started a battle in the current mission
43 extern int Event_music_enabled;
44 extern float Default_music_volume;				// range is 0->1
45 extern float Master_event_music_volume;			// range is 0->1
46 
47 
48 /////////////////////////////////////////////////////////////////////////////
49 // Used to track what briefing and debriefing music is played for the mission
50 /////////////////////////////////////////////////////////////////////////////
51 #define NUM_SCORES						5
52 #define SCORE_BRIEFING					0
53 #define SCORE_DEBRIEF_SUCCESS			1
54 #define SCORE_DEBRIEF_AVERAGE			2
55 #define SCORE_DEBRIEF_FAIL				3
56 #define SCORE_FICTION_VIEWER			4
57 extern int Mission_music[NUM_SCORES];		// indicies into Spooled_music[]
58 /////////////////////////////////////////////////////////////////////////////
59 
60 extern int Current_soundtrack_num;		// index into Soundtracks[]
61 
62 
63 // menu music storage
64 typedef struct menu_music {
65 	int flags;
66 	char name[NAME_LENGTH];				// name music is known by
67 	char filename[MAX_FILENAME_LEN];	// name music is stored on disk as
68 } menu_music;
69 
70 #define MAX_SPOOLED_MUSIC	50			// max number of briefing/mainhall/credits tracks
71 
72 // Goober5000 - spooled music flags
73 #define SMF_VALID						(1 << 0)
74 
75 extern menu_music Spooled_music[MAX_SPOOLED_MUSIC];
76 extern int Num_music_files;
77 
78 
79 // event music soundtrack storage
80 typedef struct tagSOUNDTRACK_INFO {
81 	int flags;
82 	int	num_patterns;
83 	char	name[NAME_LENGTH];
84 	char	pattern_fnames[MAX_PATTERNS][MAX_FILENAME_LEN];
85 } SOUNDTRACK_INFO;
86 
87 #define MAX_SOUNDTRACKS		30			// max number of battle tracks
88 
89 // Goober5000 - event music flags
90 #define EMF_VALID						(1 << 0)
91 #define EMF_ALLIED_ARRIVAL_OVERLAY		(1 << 1)
92 #define EMF_CYCLE_FS1					(1 << 2)
93 
94 extern SOUNDTRACK_INFO Soundtracks[MAX_SOUNDTRACKS];
95 extern int Num_soundtracks;
96 
97 
98 void	event_music_init();
99 void	event_music_close();
100 void	event_music_level_start(int force_soundtrack = -1);
101 void	event_music_level_close();
102 void	event_music_do_frame();
103 void	event_music_disable();
104 void	event_music_enable();
105 void	event_music_set_volume_all(float volume);
106 void	event_music_parse_musictbl(const char *filename);
107 void	event_music_change_pattern(int new_pattern);
108 int	event_music_return_current_pattern();
109 void	event_music_first_pattern();
110 int	event_music_battle_start();
111 int	event_music_enemy_arrival();
112 int	event_music_friendly_arrival();
113 void	event_music_arrival(int team);
114 int	event_music_primary_goals_met();
115 int	event_music_primary_goal_failed();
116 int	event_music_player_death();
117 void	event_music_start_default();
118 void	event_music_get_info(char *outbuf);
119 void	event_music_get_soundtrack_name(char *outbuf);
120 int	event_music_next_soundtrack(int delta);
121 void event_sexp_change_soundtrack(const char *name);
122 void	event_music_set_soundtrack(const char *name);
123 void	event_music_set_score(int score_index, const char *name);
124 int event_music_get_soundtrack_index(const char *name);
125 int	event_music_get_spooled_music_index(const char *name);
126 int	event_music_get_spooled_music_index(const SCP_string& name);
127 void	event_music_reset_choices();
128 int	event_music_player_respawn();
129 int	event_music_player_respawn_as_observer();
130 void event_music_hostile_ship_destroyed();
131 
132 /**
133  * @brief Sets the master music volume to the specified value
134  * @param volume The new music volume value. Must be in the range [0, 1].
135  */
136 void event_music_set_volume(float volume);
137 
138 #endif /* __EVENT_MUSIC_H__  */
139