diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main.cpp | 8 | ||||
-rw-r--r-- | src/muxer.cpp | 58 | ||||
-rw-r--r-- | src/muxer.h | 12 |
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 | ||
64 | void Muxer::setMusicLevel(int level) { | 64 | void 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 | |||
87 | void 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 | ||
68 | void Muxer::update() { | 110 | void 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 | ||
16 | using fmod_system_ptr = std::unique_ptr<FMOD::Studio::System, fmod_system_deleter>; | 16 | using fmod_system_ptr = std::unique_ptr<FMOD::Studio::System, fmod_system_deleter>; |
17 | 17 | ||
18 | enum class TransitionState { | ||
19 | Pre, | ||
20 | Transition, | ||
21 | Post, | ||
22 | Stopped | ||
23 | }; | ||
24 | |||
18 | class Muxer { | 25 | class Muxer { |
19 | public: | 26 | public: |
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 | ||
30 | private: | 39 | private: |
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 */ |