]> git.sesse.net Git - pkanalytics/blobdiff - events.cpp
Fix pull button availability.
[pkanalytics] / events.cpp
index 7c9f93e9413cc1bf28fddf9943f3926d9e520707..bf16202289f650913f49a1f1470149193966f33f 100644 (file)
@@ -231,12 +231,25 @@ EventsModel::Status EventsModel::get_status_at(uint64_t t)
        s.our_score = 0;
        s.their_score = 0;
        s.offense = true;
+       s.stoppage = false;
+       s.should_pull = true;
        uint64_t last_gained_possession = 0;
+       uint64_t last_stoppage = 0;
+       uint64_t time_spent_in_stoppage = 0;
        unsigned num_touches = 0;
        for (const Event &e : events) {
                if (e.t > t) {
                        break;
                }
+
+               if (e.type == "goal" || e.type == "their_goal") {
+                       s.should_pull = true;
+               } else if (e.type == "in" || e.type == "out" || e.type == "stoppage" || e.type == "restart" || e.type == "unknown") {
+                       // No effect on pull status.
+               } else {
+                       s.should_pull = false;
+               }
+
                if (e.type == "goal") {
                        ++s.our_score;
                        s.offense = false;
@@ -250,6 +263,7 @@ EventsModel::Status EventsModel::get_status_at(uint64_t t)
                if (e.type == "catch") {
                        if (num_touches == 0) {  // Pick up.
                                last_gained_possession = e.t;
+                               time_spent_in_stoppage = 0;
                        }
                        ++num_touches;
                }
@@ -257,18 +271,36 @@ EventsModel::Status EventsModel::get_status_at(uint64_t t)
                        num_touches = 1;
                        s.offense = true;
                        last_gained_possession = e.t;
+                       time_spent_in_stoppage = 0;
                }
                if (e.type == "defense" || e.type == "their_throwaway") {
                        s.offense = true;
                        num_touches = 0;
+                       time_spent_in_stoppage = 0;
                }
                if (e.type == "drop" || e.type == "throwaway") {
                        s.offense = false;
                        num_touches = 0;
                }
+               if (e.type == "stoppage") {
+                       s.stoppage = true;
+                       last_stoppage = e.t;
+               }
+               if (e.type == "restart") {
+                       s.stoppage = false;
+                       if (last_stoppage != 0) {
+                               time_spent_in_stoppage += (e.t - last_stoppage);
+                               last_stoppage = 0;
+                       }
+               }
        }
+       if (s.stoppage && last_stoppage != 0) {
+               time_spent_in_stoppage += (t - last_stoppage);
+       }
+
        s.num_passes = (num_touches == 0) ? 0 : num_touches - 1;
-       s.possession_sec = (s.offense && last_gained_possession != 0 && num_touches != 0) ? (t - last_gained_possession) / 1000 : 0;
+       s.possession_sec = (s.offense && last_gained_possession != 0 && num_touches != 0) ? (t - last_gained_possession - time_spent_in_stoppage) / 1000 : 0;
+       s.stoppage_sec = (s.offense && last_gained_possession != 0 && num_touches != 0) ? time_spent_in_stoppage / 1000 : 0;
        return s;
 }