Browse Source

Working calendar with new renderFunction.

This uses the new one, which is easier to get right.
Easier to work char by char.
Steve Thielemann 4 years ago
parent
commit
b208e17bbb
1 changed files with 96 additions and 5 deletions
  1. 96 5
      play.cpp

+ 96 - 5
play.cpp

@@ -14,7 +14,7 @@
  * This is for testing BONUS and scoring, etc.
  *
  */
-#define CHEATER "CHEAT_YOUR_ASS_OFF"
+#define CHEATER "_CHEAT_YOUR_ASS_OFF"
 
 // static std::function<std::ofstream &(void)> get_logger;
 
@@ -135,7 +135,10 @@ int PlayCards::play(void) {
   std::unique_ptr<door::Screen> calendar = make_calendar();
   door << door::reset << door::cls;
   door << *calendar;
-  press_a_key();
+  int r = press_a_key();
+  if (r < 0) // timeout!  exit!
+    return r;
+
   // return 0;
 
   hand = 1;
@@ -1107,9 +1110,95 @@ std::unique_ptr<door::Panel> PlayCards::make_calendar_panel(void) {
   const int W = 41;
   std::unique_ptr<door::Panel> p = make_unique<door::Panel>(W);
   p->setStyle(door::BorderStyle::DOUBLE);
-  std::string text;
-  int row;
+  p->setColor(door::ANSIColor(door::COLOR::CYAN, door::COLOR::BLACK));
+  door::renderFunction calendarRender =
+      [](const std::string &txt) -> door::Render {
+    door::Render r(txt);
+
+    // normal digits color
+    door::ANSIColor digits(door::COLOR::CYAN, door::COLOR::BLACK);
+    // digits/days that can be played
+    door::ANSIColor digits_play(door::COLOR::CYAN, door::COLOR::BLACK,
+                                door::ATTR::BOLD);
+    // spaces color
+    door::ANSIColor spaces(door::COLOR::WHITE, door::COLOR::BLACK);
+    // o - open days
+    door::ANSIColor open(door::COLOR::GREEN, door::COLOR::BLACK,
+                         door::ATTR::BOLD);
+    // h - hands can be played
+    door::ANSIColor hands(door::COLOR::YELLOW, door::COLOR::BLACK,
+                          door::ATTR::BOLD);
+    // x - already played
+    door::ANSIColor full(door::COLOR::RED, door::COLOR::BLACK);
+    // u - No, Not Yet! unavailable
+    door::ANSIColor nny(door::COLOR::BLACK, door::COLOR::BLACK,
+                        door::ATTR::BOLD);
+    int days;
+
+    /*
+        if (get_logger) {
+          get_logger() << "Line [" << txt << "]" << std::endl;
+        }
+    */
+
+    // B _ BBBB _ BBBB _ BBBB _ BBBB _ BBBB _ BBBB _ B
+    for (days = 0; days < 7; ++days) {
+      std::string dayText;
+
+      if (days == 0) {
+        r.append(spaces);
+        // dayText = txt.substr(1, 3);
+      } // else {
+      /*
+      if (get_logger)
+        get_logger() << days << " " << 1 + (days * 6) << std::endl;
+      */
+      dayText = txt.substr(1 + (days * 6), 3);
+      // }
+
+      /*
+            if (get_logger) {
+              get_logger() << days << " "
+                           << "[" << dayText << "] " << std::endl;
+            }
+      */
+
+      if (dayText[1] == ' ') {
+        // Ok, nothing there!
+        r.append(spaces, 3);
+      } else {
+        // Something is there
+        char cday = dayText[2];
 
+        if ((cday == 'o') or (cday == 'h'))
+          r.append(digits_play, 2);
+        else
+          r.append(digits, 2);
+
+        switch (dayText[2]) {
+        case 'o':
+          r.append(open);
+          break;
+        case 'h':
+          r.append(hands);
+          break;
+        case 'x':
+          r.append(full);
+          break;
+        case 'u':
+          r.append(nny);
+          break;
+        }
+      }
+      if (days == 6)
+        r.append(spaces);
+      else
+        r.append(spaces, 3);
+    }
+    return r;
+  };
+
+  int row;
   for (row = 0; row < 6; ++row) {
     door::updateFunction calendarUpdate = [this, row]() -> std::string {
       std::string text;
@@ -1149,8 +1238,10 @@ std::unique_ptr<door::Panel> PlayCards::make_calendar_panel(void) {
       return text;
     };
 
+    std::string text;
     text = calendarUpdate();
-    door::Line line(text);
+    door::Line line(text, W);
+    line.setRender(calendarRender);
     line.setUpdater(calendarUpdate);
     p->addLine(std::make_unique<door::Line>(line));
   }