diff options
Diffstat (limited to 'src/sign.cpp')
| -rw-r--r-- | src/sign.cpp | 130 |
1 files changed, 130 insertions, 0 deletions
| diff --git a/src/sign.cpp b/src/sign.cpp new file mode 100644 index 0000000..992ac3d --- /dev/null +++ b/src/sign.cpp | |||
| @@ -0,0 +1,130 @@ | |||
| 1 | #include "sign.h" | ||
| 2 | #include <list> | ||
| 3 | #include "util.h" | ||
| 4 | #include "consts.h" | ||
| 5 | #include "game.h" | ||
| 6 | |||
| 7 | void Sign::displayMessage(std::string text) { | ||
| 8 | signDisplayState = SignInstructionState::FadingIn; | ||
| 9 | lines.clear(); | ||
| 10 | |||
| 11 | auto lineChunks = splitStr<std::list<std::string>>(text, "\\n"); | ||
| 12 | for (std::string lineChunk : lineChunks) { | ||
| 13 | auto words = splitStr<std::list<std::string>>(lineChunk, " "); | ||
| 14 | std::string prev = words.front(); | ||
| 15 | words.pop_front(); | ||
| 16 | std::string cur = prev; | ||
| 17 | bool pauseLine = false; | ||
| 18 | |||
| 19 | while (!words.empty()) { | ||
| 20 | cur = prev + " " + words.front(); | ||
| 21 | |||
| 22 | int width = 0; | ||
| 23 | TTF_SizeText(font_, cur.c_str(), &width, nullptr); | ||
| 24 | if (width > MESSAGE_TEXT_WIDTH) { | ||
| 25 | lines.push_back({.text = prev, .pause = pauseLine}); | ||
| 26 | pauseLine = !pauseLine; | ||
| 27 | cur = words.front(); | ||
| 28 | } else if (words.size() == 1) { | ||
| 29 | lines.push_back({.text = cur, .pause = true}); | ||
| 30 | } | ||
| 31 | |||
| 32 | prev = cur; | ||
| 33 | words.pop_front(); | ||
| 34 | } | ||
| 35 | } | ||
| 36 | |||
| 37 | lines.back().pause = true; | ||
| 38 | linesToShow.push_back(lines.front()); | ||
| 39 | lines.pop_front(); | ||
| 40 | |||
| 41 | if (!linesToShow.back().pause) { | ||
| 42 | linesToShow.push_back(lines.front()); | ||
| 43 | lines.pop_front(); | ||
| 44 | } | ||
| 45 | } | ||
| 46 | |||
| 47 | void Sign::update(size_t dt, Game& game) { | ||
| 48 | SDL_Event e; | ||
| 49 | |||
| 50 | while (SDL_PollEvent(&e)) { | ||
| 51 | if (e.type == SDL_QUIT) { | ||
| 52 | game.quit = true; | ||
| 53 | } | ||
| 54 | } | ||
| 55 | |||
| 56 | switch (signDisplayState) { | ||
| 57 | case SignInstructionState::Hidden: { | ||
| 58 | // Shouldn't happen. | ||
| 59 | break; | ||
| 60 | } | ||
| 61 | case SignInstructionState::FadingIn: { | ||
| 62 | signDisplayFade.tick(dt); | ||
| 63 | if (signDisplayFade.isComplete()) { | ||
| 64 | signDisplayState = SignInstructionState::Visible; | ||
| 65 | } | ||
| 66 | |||
| 67 | break; | ||
| 68 | } | ||
| 69 | case SignInstructionState::FadingOut: { | ||
| 70 | signDisplayFade.tick(dt); | ||
| 71 | if (signDisplayFade.isComplete()) { | ||
| 72 | signDisplayState = SignInstructionState::Hidden; | ||
| 73 | } | ||
| 74 | |||
| 75 | break; | ||
| 76 | } | ||
| 77 | case SignInstructionState::Visible: { | ||
| 78 | const Uint8* state = SDL_GetKeyboardState(NULL); | ||
| 79 | if (state[SDL_SCANCODE_SPACE]) { | ||
| 80 | bool fullyRevealed = true; | ||
| 81 | for (const SignLine& line : linesToShow) { | ||
| 82 | if (line.charsRevealed != line.text.size()) { | ||
| 83 | fullyRevealed = false; | ||
| 84 | break; | ||
| 85 | } | ||
| 86 | } | ||
| 87 | |||
| 88 | if (fullyRevealed) { | ||
| 89 | if (linesToShow.back().pause) { | ||
| 90 | linesToShow.back().pause = false; | ||
| 91 | // Play a sound | ||
| 92 | } | ||
| 93 | if (lines.empty()) { | ||
| 94 | linesToShow.clear(); | ||
| 95 | signDisplayState = SignInstructionState::FadingOut; | ||
| 96 | signDisplayFade.start(1000); | ||
| 97 | break; | ||
| 98 | } | ||
| 99 | } | ||
| 100 | } | ||
| 101 | |||
| 102 | textAdvTimer_.accumulate(dt); | ||
| 103 | while (textAdvTimer_.step()) { | ||
| 104 | bool advancedChars = false; | ||
| 105 | for (SignLine& line : linesToShow) { | ||
| 106 | if (line.charsRevealed < line.text.size()) { | ||
| 107 | if (line.charsRevealed % CHARS_PER_BEEP == 0) { | ||
| 108 | // Play a sound | ||
| 109 | game.muxer.playSound("textbeep"); | ||
| 110 | } | ||
| 111 | line.charsRevealed++; | ||
| 112 | advancedChars = true; | ||
| 113 | break; | ||
| 114 | } | ||
| 115 | } | ||
| 116 | if (!advancedChars) { | ||
| 117 | if (!lines.empty() && !linesToShow.back().pause) { | ||
| 118 | if (linesToShow.size() == 2) { | ||
| 119 | linesToShow.pop_front(); | ||
| 120 | } | ||
| 121 | linesToShow.push_back(lines.front()); | ||
| 122 | lines.pop_front(); | ||
| 123 | } | ||
| 124 | } | ||
| 125 | } | ||
| 126 | |||
| 127 | break; | ||
| 128 | } | ||
| 129 | } | ||
| 130 | } | ||
