Explorar el Código

Add raw signals chart

Cadel Watson hace 1 año
padre
commit
ef015fd743
Se han modificado 2 ficheros con 89 adiciones y 1 borrados
  1. 30 1
      src/Main.elm
  2. 59 0
      src/Signals.elm

+ 30 - 1
src/Main.elm

@@ -13,7 +13,8 @@ import Html.Events as Events exposing (onClick)
 import Html.Keyed as Keyed
 import List.Extra as List
 import Round
-import Tuple exposing (second)
+import Signals
+import Tuple exposing (first, second)
 import Zipper
 
 
@@ -204,6 +205,7 @@ viewDeck model =
                 [ text "Entire deck" ]
             ]
         , viewCmcChart model
+        , viewSignalsChart model
         ]
 
 
@@ -230,6 +232,33 @@ viewCmcChart model =
         ]
 
 
+viewSignalsChart : ReadyModel -> Html Msg
+viewSignalsChart model =
+    let
+        signals =
+            Signals.inferSignals (model.deckProgress == EntireDeck) model.database model.draft
+
+        lines =
+            C.series (first >> toFloat)
+                [ C.interpolated (second >> .blue >> toFloat) [ CA.color CA.blue ] []
+                , C.interpolated (second >> .red >> toFloat) [ CA.color CA.red ] []
+                , C.interpolated (second >> .black >> toFloat) [ CA.color "black" ] []
+                , C.interpolated (second >> .green >> toFloat) [ CA.color CA.green ] []
+                , C.interpolated (second >> .white >> toFloat) [ CA.color "white" ] []
+                ]
+                signals
+    in
+    div [ class "m-4" ]
+        [ C.chart
+            [ CA.height 300
+            ]
+            [ C.xLabels []
+            , C.yLabels [ CA.withGrid ]
+            , lines
+            ]
+        ]
+
+
 viewError : ErrorModel -> Html Msg
 viewError model =
     div [ class "error" ]

+ 59 - 0
src/Signals.elm

@@ -0,0 +1,59 @@
+module Signals exposing (..)
+
+import Card exposing (CardData, ManaColor(..))
+import Database exposing (Database)
+import Draft exposing (Draft, Pick)
+import List.Extra as List
+import Zipper
+
+
+type alias CardsSeenPerColor =
+    { white : Int
+    , blue : Int
+    , black : Int
+    , red : Int
+    , green : Int
+    }
+
+
+inferSignals : Bool -> Database -> Draft -> List ( Int, CardsSeenPerColor )
+inferSignals includeWholeDeck db draft =
+    let
+        numberOfPicks =
+            if includeWholeDeck then
+                Zipper.length draft
+
+            else
+                List.length (Zipper.left draft) + 1
+
+        relevantPicks =
+            List.take numberOfPicks (Zipper.toList draft)
+    in
+    List.range 0 (numberOfPicks - 1)
+        |> List.map (\i -> ( i, countCardsInPicks db (List.take (i + 1) relevantPicks) ))
+
+
+countCardsInPicks : Database -> List Pick -> CardsSeenPerColor
+countCardsInPicks db picks =
+    let
+        allCards =
+            allCardsInPicks db picks
+
+        countColor color =
+            List.count (\card -> List.member color card.details.colors) allCards
+    in
+    { white = countColor White
+    , blue = countColor Blue
+    , black = countColor Black
+    , red = countColor Red
+    , green = countColor Green
+    }
+
+
+allCardsInPicks : Database -> List Pick -> List CardData
+allCardsInPicks db picks =
+    let
+        cardsPicked =
+            List.concatMap .available picks
+    in
+    List.filterMap (\pick -> Database.get pick.name db) cardsPicked