|  | @@ -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));
 | 
	
		
			
				|  |  |    }
 |