Advertisement
Guest User

Untitled

a guest
Apr 27th, 2017
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.23 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <chrono>
  5. #include <thread>
  6. #include <vector>
  7. #include <map>
  8.  
  9. using namespace std;
  10.  
  11. #ifdef __APPLE__
  12. #include <Carbon/Carbon.h>
  13. #include <ncurses.h>
  14. #include <streambuf>
  15.  
  16. class ncursesbuf: public std::streambuf {
  17. public:
  18.     ncursesbuf() {}
  19.     virtual int overflow(int c) {
  20.         printw("%c", c);
  21.         return 0;
  22.     }
  23. };
  24.  
  25. class ncurses_stream : public std::ostream {
  26. public:
  27.     ncursesbuf tbuf_;
  28.     std::ostream &src_;
  29.     std::streambuf * const srcbuf_;
  30.    
  31.     ncurses_stream(std::ostream &o) : src_(o), srcbuf_(o.rdbuf()), std::ostream(&tbuf_) {
  32.         o.rdbuf(rdbuf());
  33.     }
  34.    
  35.     ~ncurses_stream() {
  36.         src_.rdbuf(srcbuf_);
  37.     }
  38. };
  39.  
  40. bool isPressedKeyCode(uint16_t vKey) {
  41.     uint8_t index = (vKey) / 32;
  42.     uint8_t shift = ((vKey) % 32);
  43.     KeyMap keyStates;
  44.     GetKeys(keyStates);
  45.     return (keyStates[index].bigEndianValue & (1 << shift));
  46. }
  47.  
  48. bool isTabPressed() {
  49.     return isPressedKeyCode(kVK_Tab);
  50. }
  51.  
  52. bool isEnterPressed() {
  53.     return isPressedKeyCode(kVK_Return);
  54. }
  55.  
  56. bool isSpacePressed() {
  57.     return isPressedKeyCode(kVK_Space);
  58. }
  59.  
  60. bool isEscapePressed() {
  61.     return isPressedKeyCode(kVK_Escape);
  62. }
  63. #else
  64. #include <Windows.h>
  65.  
  66. bool isPressed(char key) {
  67.     return GetAsyncKeyState(key) < 0;
  68. }
  69.  
  70. bool isTabPressed() {
  71.     return isPressed(VK_TAB);
  72. }
  73.  
  74. bool isEnterPressed() {
  75.     return isPressed(VK_RETURN);
  76. }
  77.  
  78. bool isSpacePressed() {
  79.     return isPressed(VK_SPACE);
  80. }
  81.  
  82. bool isSpacePressed() {
  83.     return isPressed(VK_ESCAPE);
  84. }
  85. #endif
  86.  
  87. struct SequenceInfo {
  88.     std::string scene;
  89.     int seconds;
  90. };
  91.  
  92. int main() {
  93. #ifdef __APPLE__
  94.     initscr();
  95.     scrollok(stdscr,TRUE);
  96.     ncurses_stream foo(std::cout);
  97.     noecho();
  98. #endif
  99.     std::cout << "Initializing!" << std::endl;
  100.     std::ifstream config("sceneconfig.txt");
  101.     std::vector<SequenceInfo> scenes;
  102.     if (config) {
  103.         while (!config.eof()) {
  104.             SequenceInfo sequence;
  105.             config >> sequence.scene >> sequence.seconds;
  106.             scenes.push_back(sequence);
  107.         }
  108.     } else {
  109.         scenes.push_back({ "DervView", 30 });
  110.         scenes.push_back({ "JaiView", 30 });
  111.     }
  112.     bool keyPressed = false;
  113.     int currentIndex = 0;
  114.     int previousSeconds = -1;
  115.     while (true) {
  116.         {
  117.             std::ofstream outfile("sceneswapin.txt");
  118.             std::cout << "Swapping to: " << scenes[currentIndex].scene << " Next Up: " << scenes[currentIndex].seconds << "s\n";
  119. #ifdef __APPLE__
  120.             refresh();
  121. #endif
  122.             outfile << scenes[currentIndex].scene;
  123.         }
  124.        
  125.         // (1 / tickDivider) where 1 is a second. Or sleepTicks * tickDivider to get seconds.
  126.         int tickDivider = 8;
  127.         int pausedAt = 0;
  128.         for (int sleepTicks = scenes[currentIndex].seconds * tickDivider; sleepTicks != 0; --sleepTicks) {
  129.             std::this_thread::sleep_for(std::chrono::milliseconds(static_cast<int>((1.0 / static_cast<double>(tickDivider)) * 1000.0)));
  130.  
  131.             if(isEscapePressed()){
  132.                 std::cout << "\nGoodbye!\n";
  133. #ifdef __APPLE__
  134.                 std::cout << std::flush;
  135.                 refresh();
  136.                 endwin();
  137. #endif
  138.                 return 0;
  139.             }
  140.             bool tabPressed = isTabPressed();
  141.             bool enterPressed = isEnterPressed();
  142.             bool spacePressed = isSpacePressed();
  143.  
  144.             bool wasKeyPressed = keyPressed;
  145.             keyPressed = tabPressed || enterPressed || spacePressed;
  146.            
  147.             if (!wasKeyPressed && tabPressed){
  148.                 std::cout << "\nSkipping to next scene!";
  149.                 break;
  150.             } else if (!wasKeyPressed && enterPressed) {
  151.                 if(sleepTicks >= 0){
  152.                     sleepTicks += scenes[currentIndex].seconds * tickDivider;
  153.                     std::cout << "[" << (sleepTicks / tickDivider) << "]";
  154.                 }else{
  155.                     pausedAt += scenes[currentIndex].seconds * tickDivider;
  156.                     std::cout << "[" << (pausedAt / tickDivider) << "]";
  157.                 }
  158.             } else if (!wasKeyPressed && spacePressed) {
  159.                 if (sleepTicks < 0) {
  160.                     std::cout << "~";
  161.                     sleepTicks = pausedAt;
  162.                 } else {
  163.                     std::cout << "!";
  164.                     pausedAt = sleepTicks;
  165.                     sleepTicks = -1;
  166.                 }
  167.             } else {
  168.                 int seconds = (sleepTicks / tickDivider);
  169.                 if (seconds != previousSeconds) {
  170.                     previousSeconds = seconds;
  171.                     if (sleepTicks > 0 && (seconds % 5 == 0)) {
  172.                         std::cout << "." << (sleepTicks / tickDivider);
  173.                     } else if (sleepTicks > 0) {
  174.                         std::cout << ".";
  175.                     }
  176.                 }
  177.             }
  178. #ifdef __APPLE__
  179.             std::cout << std::flush;
  180.             refresh();
  181. #endif
  182.         }
  183.         std::cout << "\n";
  184. #ifdef __APPLE__
  185.         std::cout << std::flush;
  186.         refresh();
  187. #endif
  188.         currentIndex++;
  189.         if (currentIndex >= scenes.size()) {
  190.             currentIndex = 0;
  191.         }
  192.     }
  193. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement