diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/game.h | 2 | ||||
-rw-r--r-- | src/main.cpp | 19 | ||||
-rw-r--r-- | src/muxer.cpp | 70 | ||||
-rw-r--r-- | src/muxer.h | 35 |
4 files changed, 126 insertions, 0 deletions
diff --git a/src/game.h b/src/game.h index 200b691..f0385ee 100644 --- a/src/game.h +++ b/src/game.h | |||
@@ -6,6 +6,7 @@ | |||
6 | #include <random> | 6 | #include <random> |
7 | #include <list> | 7 | #include <list> |
8 | #include "map.h" | 8 | #include "map.h" |
9 | #include "muxer.h" | ||
9 | 10 | ||
10 | const int GAME_WIDTH = 640*2; | 11 | const int GAME_WIDTH = 640*2; |
11 | const int GAME_HEIGHT = 480*2; | 12 | const int GAME_HEIGHT = 480*2; |
@@ -80,6 +81,7 @@ public: | |||
80 | } | 81 | } |
81 | 82 | ||
82 | std::mt19937& rng; | 83 | std::mt19937& rng; |
84 | Muxer muxer; | ||
83 | 85 | ||
84 | Map<MapData> map; | 86 | Map<MapData> map; |
85 | std::list<Kickup> kickups; | 87 | std::list<Kickup> kickups; |
diff --git a/src/main.cpp b/src/main.cpp index 4b13051..25da94f 100644 --- a/src/main.cpp +++ b/src/main.cpp | |||
@@ -13,6 +13,10 @@ void incrementIfSet(Game& game, int& count, int x, int y, Tile val = Tile::Wall) | |||
13 | } | 13 | } |
14 | } | 14 | } |
15 | 15 | ||
16 | int getZoomLevel(const Game& game) { | ||
17 | return (game.curZoom - INIT_ZOOM) / 2; | ||
18 | } | ||
19 | |||
16 | void tick( | 20 | void tick( |
17 | Game& game, | 21 | Game& game, |
18 | int x1, | 22 | int x1, |
@@ -96,11 +100,14 @@ bool movePlayer(Game& game, int x, int y) | |||
96 | 100 | ||
97 | game.player_x = x; | 101 | game.player_x = x; |
98 | game.player_y = y; | 102 | game.player_y = y; |
103 | game.muxer.setPlayerLoc(x, y); | ||
99 | 104 | ||
100 | game.dirtyLighting = true; | 105 | game.dirtyLighting = true; |
101 | 106 | ||
102 | return true; | 107 | return true; |
103 | } else { | 108 | } else { |
109 | //game.muxer.playSoundAtPosition("bump", game.player_x, game.player_y); | ||
110 | |||
104 | return false; | 111 | return false; |
105 | } | 112 | } |
106 | } | 113 | } |
@@ -241,6 +248,8 @@ void kickUpDust(Game& game, int x, int y, size_t chain) | |||
241 | 248 | ||
242 | void popLamp(Game& game, int x, int y, size_t chain) | 249 | void popLamp(Game& game, int x, int y, size_t chain) |
243 | { | 250 | { |
251 | game.muxer.playSoundAtPosition("pop", x, y); | ||
252 | |||
244 | if (game.map.at(x,y).tile == Tile::Lamp) | 253 | if (game.map.at(x,y).tile == Tile::Lamp) |
245 | { | 254 | { |
246 | game.numLamps--; | 255 | game.numLamps--; |
@@ -400,6 +409,15 @@ void setZoom(Game& game, size_t zoom) | |||
400 | { | 409 | { |
401 | game.curBoundY = game.map.getBottom() - zoom * ZOOM_Y_FACTOR; | 410 | game.curBoundY = game.map.getBottom() - zoom * ZOOM_Y_FACTOR; |
402 | } | 411 | } |
412 | |||
413 | int zoomLevel = getZoomLevel(game); | ||
414 | if (zoomLevel == 0) { | ||
415 | game.muxer.setMusicLevel(0); | ||
416 | } else if (zoomLevel < 3) { | ||
417 | game.muxer.setMusicLevel(1); | ||
418 | } else { | ||
419 | game.muxer.setMusicLevel(2); | ||
420 | } | ||
403 | } | 421 | } |
404 | 422 | ||
405 | int main(int, char**) | 423 | int main(int, char**) |
@@ -731,6 +749,7 @@ int main(int, char**) | |||
731 | zoomAcc -= zoomDt; | 749 | zoomAcc -= zoomDt; |
732 | } | 750 | } |
733 | 751 | ||
752 | game.muxer.update(); | ||
734 | renderer.render(game, true); | 753 | renderer.render(game, true); |
735 | } | 754 | } |
736 | } catch (const sdl_error& ex) | 755 | } catch (const sdl_error& ex) |
diff --git a/src/muxer.cpp b/src/muxer.cpp new file mode 100644 index 0000000..5b09ef8 --- /dev/null +++ b/src/muxer.cpp | |||
@@ -0,0 +1,70 @@ | |||
1 | #include "muxer.h" | ||
2 | #include <iostream> | ||
3 | #include <fmod_errors.h> | ||
4 | |||
5 | void ERRCHECK_fn(FMOD_RESULT result, const char* file, int line) { | ||
6 | if (result != FMOD_OK) { | ||
7 | std::cout << file << "(" << line << "): FMOD error " << result << " - " << FMOD_ErrorString(result); | ||
8 | abort(); | ||
9 | } | ||
10 | } | ||
11 | |||
12 | #define ERRCHECK(_result) ERRCHECK_fn(_result, __FILE__, __LINE__) | ||
13 | |||
14 | Muxer::Muxer() { | ||
15 | FMOD::Studio::System* system_holder = nullptr; | ||
16 | ERRCHECK(FMOD::Studio::System::create(&system_holder)); | ||
17 | system_.reset(system_holder); | ||
18 | |||
19 | FMOD::System* coreSystem = nullptr; | ||
20 | ERRCHECK(system_->getCoreSystem(&coreSystem)); | ||
21 | ERRCHECK(coreSystem->setSoftwareFormat(0, FMOD_SPEAKERMODE_5POINT1, 0)); | ||
22 | ERRCHECK(system_->initialize(1024, FMOD_STUDIO_INIT_NORMAL, FMOD_INIT_NORMAL, nullptr)); | ||
23 | |||
24 | FMOD::Studio::Bank* masterBank = nullptr; | ||
25 | ERRCHECK(system_->loadBankFile("../res/fmod/Build/Desktop/Master Bank.bank", FMOD_STUDIO_LOAD_BANK_NORMAL, &masterBank)); | ||
26 | |||
27 | FMOD::Studio::Bank* stringsBank = nullptr; | ||
28 | ERRCHECK(system_->loadBankFile("../res/fmod/Build/Desktop/Master Bank.strings.bank", FMOD_STUDIO_LOAD_BANK_NORMAL, &stringsBank)); | ||
29 | |||
30 | FMOD::Studio::EventDescription* exploration_desc = nullptr; | ||
31 | ERRCHECK(system_->getEvent("event:/exploration", &exploration_desc)); | ||
32 | ERRCHECK(exploration_desc->createInstance(&exploration_event_)); | ||
33 | ERRCHECK(exploration_event_->start()); | ||
34 | } | ||
35 | |||
36 | void Muxer::setPlayerLoc(int x, int y) { | ||
37 | FMOD_3D_ATTRIBUTES attributes = {{0}}; | ||
38 | attributes.forward.z = 1.0f; | ||
39 | attributes.up.y = 1.0f; | ||
40 | attributes.position.x = x; | ||
41 | attributes.position.y = y; | ||
42 | ERRCHECK(system_->setListenerAttributes(0, &attributes)); | ||
43 | } | ||
44 | |||
45 | void Muxer::playSoundAtPosition(std::string name, float x, float y) { | ||
46 | std::string eventPath = std::string("event:/") + name; | ||
47 | |||
48 | FMOD::Studio::EventDescription* eventDescription = nullptr; | ||
49 | ERRCHECK(system_->getEvent(eventPath.c_str(), &eventDescription)); | ||
50 | |||
51 | FMOD::Studio::EventInstance* eventInstance = nullptr; | ||
52 | ERRCHECK(eventDescription->createInstance(&eventInstance)); | ||
53 | |||
54 | FMOD_3D_ATTRIBUTES attributes = {{0}}; | ||
55 | attributes.forward.z = 1.0f; | ||
56 | attributes.up.y = 1.0f; | ||
57 | attributes.position.x = x; | ||
58 | attributes.position.y = y; | ||
59 | ERRCHECK(eventInstance->set3DAttributes(&attributes)); | ||
60 | ERRCHECK(eventInstance->start()); | ||
61 | ERRCHECK(eventInstance->release()); | ||
62 | } | ||
63 | |||
64 | void Muxer::setMusicLevel(int level) { | ||
65 | ERRCHECK(exploration_event_->setParameterByName("level", level)); | ||
66 | } | ||
67 | |||
68 | void Muxer::update() { | ||
69 | ERRCHECK(system_->update()); | ||
70 | } | ||
diff --git a/src/muxer.h b/src/muxer.h new file mode 100644 index 0000000..f99cce4 --- /dev/null +++ b/src/muxer.h | |||
@@ -0,0 +1,35 @@ | |||
1 | #ifndef MUXER_H_3146C802 | ||
2 | #define MUXER_H_3146C802 | ||
3 | |||
4 | #include <memory> | ||
5 | #include <string> | ||
6 | #include <fmod_studio_common.h> | ||
7 | #include <fmod_studio.hpp> | ||
8 | |||
9 | class fmod_system_deleter { | ||
10 | public: | ||
11 | void operator()(FMOD::Studio::System* val) { | ||
12 | val->release(); | ||
13 | } | ||
14 | }; | ||
15 | |||
16 | using fmod_system_ptr = std::unique_ptr<FMOD::Studio::System, fmod_system_deleter>; | ||
17 | |||
18 | class Muxer { | ||
19 | public: | ||
20 | Muxer(); | ||
21 | |||
22 | void setPlayerLoc(int x, int y); | ||
23 | |||
24 | void playSoundAtPosition(std::string name, float x, float y); | ||
25 | |||
26 | void setMusicLevel(int level); | ||
27 | |||
28 | void update(); | ||
29 | |||
30 | private: | ||
31 | fmod_system_ptr system_; | ||
32 | FMOD::Studio::EventInstance* exploration_event_; | ||
33 | }; | ||
34 | |||
35 | #endif /* end of include guard: MUXER_H_3146C802 */ | ||