summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.cpp8
-rw-r--r--src/muxer.cpp58
-rw-r--r--src/muxer.h12
3 files changed, 76 insertions, 2 deletions
diff --git a/src/main.cpp b/src/main.cpp index cd1a8c2..1805357 100644 --- a/src/main.cpp +++ b/src/main.cpp
@@ -419,8 +419,12 @@ void setZoom(Game& game, size_t zoom)
419 game.muxer.setMusicLevel(0); 419 game.muxer.setMusicLevel(0);
420 } else if (zoomLevel < 3) { 420 } else if (zoomLevel < 3) {
421 game.muxer.setMusicLevel(1); 421 game.muxer.setMusicLevel(1);
422 } else { 422 } else if (zoomLevel < 5) {
423 game.muxer.setMusicLevel(2); 423 game.muxer.setMusicLevel(2);
424 } else if (zoomLevel < 7) {
425 game.muxer.setMusicLevel(3);
426 } else {
427 game.muxer.setMusicLevel(4);
424 } 428 }
425} 429}
426 430
@@ -493,6 +497,7 @@ int main(int, char**)
493 quit = true; 497 quit = true;
494 } else { 498 } else {
495 losing = LoseState::PoppingLamps; 499 losing = LoseState::PoppingLamps;
500 game.muxer.stopMusic();
496 } 501 }
497 } else if (e.type == SDL_KEYDOWN) 502 } else if (e.type == SDL_KEYDOWN)
498 { 503 {
@@ -505,6 +510,7 @@ int main(int, char**)
505 quit = true; 510 quit = true;
506 } else { 511 } else {
507 losing = LoseState::PoppingLamps; 512 losing = LoseState::PoppingLamps;
513 game.muxer.stopMusic();
508 } 514 }
509 515
510 break; 516 break;
diff --git a/src/muxer.cpp b/src/muxer.cpp index 5b09ef8..3450187 100644 --- a/src/muxer.cpp +++ b/src/muxer.cpp
@@ -62,9 +62,65 @@ void Muxer::playSoundAtPosition(std::string name, float x, float y) {
62} 62}
63 63
64void Muxer::setMusicLevel(int level) { 64void Muxer::setMusicLevel(int level) {
65 ERRCHECK(exploration_event_->setParameterByName("level", level)); 65 if (transition_state_ == TransitionState::Pre) {
66 if (level >= 3) {
67 transition_state_ = TransitionState::Transition;
68 ERRCHECK(exploration_event_->stop(FMOD_STUDIO_STOP_ALLOWFADEOUT));
69 ERRCHECK(exploration_event_->release());
70
71 FMOD::Studio::EventDescription* eventDescription = nullptr;
72 ERRCHECK(system_->getEvent("event:/transition", &eventDescription));
73 ERRCHECK(eventDescription->createInstance(&transition_event_));
74 ERRCHECK(transition_event_->start());
75 } else {
76 ERRCHECK(exploration_event_->setParameterByName("level", level));
77 }
78 } else if (transition_state_ == TransitionState::Post) {
79 if (level <= 3) {
80 ERRCHECK(the_world_event_->setParameterByName("level_full", 0));
81 } else {
82 ERRCHECK(the_world_event_->setParameterByName("level_full", level - 3));
83 }
84 }
85}
86
87void Muxer::stopMusic() {
88 switch (transition_state_) {
89 case TransitionState::Pre: {
90 ERRCHECK(exploration_event_->stop(FMOD_STUDIO_STOP_ALLOWFADEOUT));
91 break;
92 }
93 case TransitionState::Transition: {
94 ERRCHECK(transition_event_->stop(FMOD_STUDIO_STOP_ALLOWFADEOUT));
95 break;
96 }
97 case TransitionState::Post: {
98 ERRCHECK(the_world_event_->stop(FMOD_STUDIO_STOP_ALLOWFADEOUT));
99 break;
100 }
101 case TransitionState::Stopped: {
102 // Do nothing.
103 break;
104 }
105 }
106
107 transition_state_ = TransitionState::Stopped;
66} 108}
67 109
68void Muxer::update() { 110void Muxer::update() {
111 if (transition_state_ == TransitionState::Transition) {
112 FMOD_STUDIO_PLAYBACK_STATE playbackState;
113 ERRCHECK(transition_event_->getPlaybackState(&playbackState));
114 if (playbackState == FMOD_STUDIO_PLAYBACK_STOPPED) {
115 transition_state_ = TransitionState::Post;
116 transition_event_->release();
117
118 FMOD::Studio::EventDescription* eventDescription = nullptr;
119 ERRCHECK(system_->getEvent("event:/the_world", &eventDescription));
120 ERRCHECK(eventDescription->createInstance(&the_world_event_));
121 ERRCHECK(the_world_event_->start());
122 }
123 }
124
69 ERRCHECK(system_->update()); 125 ERRCHECK(system_->update());
70} 126}
diff --git a/src/muxer.h b/src/muxer.h index f99cce4..b1a5b26 100644 --- a/src/muxer.h +++ b/src/muxer.h
@@ -15,6 +15,13 @@ public:
15 15
16using fmod_system_ptr = std::unique_ptr<FMOD::Studio::System, fmod_system_deleter>; 16using fmod_system_ptr = std::unique_ptr<FMOD::Studio::System, fmod_system_deleter>;
17 17
18enum class TransitionState {
19 Pre,
20 Transition,
21 Post,
22 Stopped
23};
24
18class Muxer { 25class Muxer {
19public: 26public:
20 Muxer(); 27 Muxer();
@@ -25,11 +32,16 @@ public:
25 32
26 void setMusicLevel(int level); 33 void setMusicLevel(int level);
27 34
35 void stopMusic();
36
28 void update(); 37 void update();
29 38
30private: 39private:
31 fmod_system_ptr system_; 40 fmod_system_ptr system_;
32 FMOD::Studio::EventInstance* exploration_event_; 41 FMOD::Studio::EventInstance* exploration_event_;
42 FMOD::Studio::EventInstance* transition_event_;
43 FMOD::Studio::EventInstance* the_world_event_;
44 TransitionState transition_state_ = TransitionState::Pre;
33}; 45};
34 46
35#endif /* end of include guard: MUXER_H_3146C802 */ 47#endif /* end of include guard: MUXER_H_3146C802 */