Procházet zdrojové kódy

Add mana costs to decklist

Cadel Watson před 1 rokem
rodič
revize
a62d3c4496
6 změnil soubory, kde provedl 307 přidání a 9 odebrání
  1. 21 1
      css/styles.css
  2. 1 1
      elm.json
  3. 235 2
      src/Card.elm
  4. 13 1
      src/Database.elm
  5. 15 4
      src/Main.elm
  6. 22 0
      tests/TestCard.elm

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 21 - 1
css/styles.css


+ 1 - 1
elm.json

@@ -11,6 +11,7 @@
             "elm/core": "1.0.5",
             "elm/core": "1.0.5",
             "elm/html": "1.0.0",
             "elm/html": "1.0.0",
             "elm/json": "1.1.3",
             "elm/json": "1.1.3",
+            "elm/parser": "1.1.0",
             "elm/svg": "1.0.1",
             "elm/svg": "1.0.1",
             "elm-community/list-extra": "8.7.0",
             "elm-community/list-extra": "8.7.0",
             "myrho/elm-round": "1.0.5",
             "myrho/elm-round": "1.0.5",
@@ -19,7 +20,6 @@
         "indirect": {
         "indirect": {
             "K-Adam/elm-dom": "1.0.0",
             "K-Adam/elm-dom": "1.0.0",
             "danhandrea/elm-time-extra": "1.1.0",
             "danhandrea/elm-time-extra": "1.1.0",
-            "elm/parser": "1.1.0",
             "elm/time": "1.0.0",
             "elm/time": "1.0.0",
             "elm/url": "1.0.0",
             "elm/url": "1.0.0",
             "elm/virtual-dom": "1.0.2",
             "elm/virtual-dom": "1.0.2",

+ 235 - 2
src/Card.elm

@@ -4,14 +4,19 @@ module Card exposing
     , CardPerformanceData
     , CardPerformanceData
     , CardType(..)
     , CardType(..)
     , ManaColor(..)
     , ManaColor(..)
+    , ManaCost(..)
     , Power(..)
     , Power(..)
     , alpa
     , alpa
     , alsa
     , alsa
     , gihwr
     , gihwr
     , iwd
     , iwd
+    , manaCostToSymbol
+    , parseManaCost
     , pickRate
     , pickRate
     )
     )
 
 
+import Parser as P exposing ((|.), Parser, Trailing(..))
+
 
 
 type ManaColor
 type ManaColor
     = Red
     = Red
@@ -53,8 +58,7 @@ type alias CardDetails =
     , power : Maybe Power
     , power : Maybe Power
     , toughness : Maybe Power
     , toughness : Maybe Power
     , colors : List ManaColor
     , colors : List ManaColor
-
-    --, manaCost : List ManaColor
+    , manaCost : Maybe (List ManaCost)
     }
     }
 
 
 
 
@@ -95,3 +99,232 @@ gihwr card =
 iwd : CardData -> Maybe Float
 iwd : CardData -> Maybe Float
 iwd card =
 iwd card =
     card.performance.improvementWhenDrawn
     card.performance.improvementWhenDrawn
+
+
+type ManaCost
+    = X
+    | Y
+    | Color ManaColor
+    | ColorPay ManaColor
+    | Hybrid ManaColor ManaColor
+    | HybridPay ManaColor ManaColor
+    | AnyColor Int
+    | TwoOrColor ManaColor
+    | Tap
+    | Pay
+
+
+parseManaCost : String -> Maybe (List ManaCost)
+parseManaCost str =
+    let
+        p =
+            P.sequence
+                { start = ""
+                , separator = ""
+                , end = ""
+                , spaces = P.spaces
+                , item = manaCostP
+                , trailing = Optional
+                }
+    in
+    case P.run p str of
+        Ok result ->
+            Just result
+
+        Err _ ->
+            Nothing
+
+
+manaCostP : Parser ManaCost
+manaCostP =
+    let
+        mapping =
+            [ ( "{X}", X )
+            , ( "{Y}", Y )
+            , ( "{R}", Color Red )
+            , ( "{U}", Color Blue )
+            , ( "{G}", Color Green )
+            , ( "{W}", Color White )
+            , ( "{B}", Color Black )
+            , ( "{R/P}", ColorPay Red )
+            , ( "{U/P}", ColorPay Blue )
+            , ( "{G/P}", ColorPay Green )
+            , ( "{W/P}", ColorPay White )
+            , ( "{B/P}", ColorPay Black )
+            , ( "{R/W}", Hybrid Red White )
+            , ( "{R/G}", Hybrid Red Green )
+            , ( "{W/U}", Hybrid White Blue )
+            , ( "{W/B}", Hybrid White Black )
+            , ( "{G/U}", Hybrid Green Blue )
+            , ( "{G/W}", Hybrid Green White )
+            , ( "{U/B}", Hybrid Blue Black )
+            , ( "{U/R}", Hybrid Blue Red )
+            , ( "{B/G}", Hybrid Black Green )
+            , ( "{B/R}", Hybrid Black Red )
+            , ( "{R/W/P}", HybridPay Red White )
+            , ( "{R/G/P}", HybridPay Red Green )
+            , ( "{W/U/P}", HybridPay White Blue )
+            , ( "{W/B/P}", HybridPay White Black )
+            , ( "{G/U/P}", HybridPay Green Blue )
+            , ( "{G/W/P}", HybridPay Green White )
+            , ( "{U/B/P}", HybridPay Blue Black )
+            , ( "{U/R/P}", HybridPay Blue Red )
+            , ( "{B/G/P}", HybridPay Black Green )
+            , ( "{B/R/P}", HybridPay Black Red )
+            , ( "{2/W}", TwoOrColor White )
+            , ( "{2/U}", TwoOrColor Blue )
+            , ( "{2/G}", TwoOrColor Green )
+            , ( "{2/R}", TwoOrColor Red )
+            , ( "{2/B}", TwoOrColor Black )
+            , ( "{T}", Tap )
+            , ( "{P}", Pay )
+            , ( "{0}", AnyColor 0 )
+            , ( "{1}", AnyColor 1 )
+            , ( "{2}", AnyColor 2 )
+            , ( "{3}", AnyColor 3 )
+            , ( "{4}", AnyColor 4 )
+            , ( "{5}", AnyColor 5 )
+            , ( "{6}", AnyColor 6 )
+            , ( "{7}", AnyColor 7 )
+            , ( "{8}", AnyColor 8 )
+            , ( "{9}", AnyColor 9 )
+            , ( "{10}", AnyColor 10 )
+            , ( "{11}", AnyColor 11 )
+            , ( "{12}", AnyColor 12 )
+            , ( "{13}", AnyColor 13 )
+            , ( "{14}", AnyColor 14 )
+            , ( "{15}", AnyColor 15 )
+            ]
+    in
+    P.oneOf
+        (List.map (\( str, manaCost ) -> P.succeed manaCost |. P.keyword str) mapping)
+
+
+manaCostToSymbol : ManaCost -> String
+manaCostToSymbol c =
+    case c of
+        X ->
+            "card-symbol-X"
+
+        Y ->
+            "card-symbol-Y"
+
+        Color Colorless ->
+            "card-symbol-C"
+
+        Color Red ->
+            "card-symbol-R"
+
+        Color Blue ->
+            "card-symbol-U"
+
+        Color Green ->
+            "card-symbol-G"
+
+        Color White ->
+            "card-symbol-W"
+
+        Color Black ->
+            "card-symbol-B"
+
+        ColorPay Red ->
+            "card-symbol-RP"
+
+        ColorPay Blue ->
+            "card-symbol-UP"
+
+        ColorPay Green ->
+            "card-symbol-GP"
+
+        ColorPay White ->
+            "card-symbol-WP"
+
+        ColorPay Black ->
+            "card-symbol-BP"
+
+        Hybrid Red White ->
+            "card-symbol-RW"
+
+        Hybrid Red Green ->
+            "card-symbol-RG"
+
+        Hybrid White Blue ->
+            "card-symbol-WU"
+
+        Hybrid White Black ->
+            "card-symbol-WB"
+
+        Hybrid Green Blue ->
+            "card-symbol-GU"
+
+        Hybrid Green White ->
+            "card-symbol-GW"
+
+        Hybrid Blue Black ->
+            "card-symbol-UB"
+
+        Hybrid Blue Red ->
+            "card-symbol-UR"
+
+        Hybrid Black Green ->
+            "card-symbol-BG"
+
+        Hybrid Black Red ->
+            "card-symbol-BR"
+
+        HybridPay Red White ->
+            "card-symbol-RWP"
+
+        HybridPay Red Green ->
+            "card-symbol-RGP"
+
+        HybridPay White Blue ->
+            "card-symbol-WUP"
+
+        HybridPay White Black ->
+            "card-symbol-WBP"
+
+        HybridPay Green Blue ->
+            "card-symbol-GUP"
+
+        HybridPay Green White ->
+            "card-symbol-GWP"
+
+        HybridPay Blue Black ->
+            "card-symbol-UBP"
+
+        HybridPay Blue Red ->
+            "card-symbol-URP"
+
+        HybridPay Black Green ->
+            "card-symbol-BGP"
+
+        HybridPay Black Red ->
+            "card-symbol-BRP"
+
+        TwoOrColor White ->
+            "card-symbol-2W"
+
+        TwoOrColor Blue ->
+            "card-symbol-2U"
+
+        TwoOrColor Green ->
+            "card-symbol-2G"
+
+        TwoOrColor Red ->
+            "card-symbol-2R"
+
+        TwoOrColor Black ->
+            "card-symbol-2B"
+
+        Tap ->
+            "card-symbol-T"
+
+        Pay ->
+            "card-symbol-P"
+
+        AnyColor n ->
+            "card-symbol-" ++ String.fromInt n
+
+        _ ->
+            ""

+ 13 - 1
src/Database.elm

@@ -1,6 +1,6 @@
 module Database exposing (Database, decode, get)
 module Database exposing (Database, decode, get)
 
 
-import Card exposing (CardData, CardDetails, CardPerformanceData, CardType(..), ManaColor(..), Power(..))
+import Card exposing (CardData, CardDetails, CardPerformanceData, CardType(..), ManaColor(..), Power(..), parseManaCost)
 import Dict exposing (Dict)
 import Dict exposing (Dict)
 import Json.Decode as Decode exposing (Decoder, decodeString)
 import Json.Decode as Decode exposing (Decoder, decodeString)
 import Json.Decode.Pipeline exposing (optional, required)
 import Json.Decode.Pipeline exposing (optional, required)
@@ -148,6 +148,18 @@ decodeCardDetails =
             |> optional "power" (Decode.nullable decodePower) Nothing
             |> optional "power" (Decode.nullable decodePower) Nothing
             |> optional "toughness" (Decode.nullable decodePower) Nothing
             |> optional "toughness" (Decode.nullable decodePower) Nothing
             |> required "colors" (Decode.list decodeManaColor)
             |> required "colors" (Decode.list decodeManaColor)
+            |> required "mana_cost"
+                (Decode.string
+                    |> Decode.andThen
+                        (\s ->
+                            case parseManaCost s of
+                                Just m ->
+                                    Decode.succeed (Just m)
+
+                                Nothing ->
+                                    Decode.succeed Nothing
+                        )
+                )
         )
         )
 
 
 
 

+ 15 - 4
src/Main.elm

@@ -1,7 +1,7 @@
 module Main exposing (..)
 module Main exposing (..)
 
 
 import Browser exposing (Document)
 import Browser exposing (Document)
-import Card exposing (CardData)
+import Card exposing (CardData, manaCostToSymbol)
 import Chart as C
 import Chart as C
 import Chart.Attributes as CA
 import Chart.Attributes as CA
 import Database
 import Database
@@ -270,10 +270,21 @@ viewDeckList model =
         decklist =
         decklist =
             ul [] (List.map viewCard deck)
             ul [] (List.map viewCard deck)
 
 
+        viewManaCost : CardData -> Html Msg
+        viewManaCost card =
+            case card.details.manaCost of
+                Just xs ->
+                    span [ class "flex" ] (List.map (\x -> span [ class ("w-4 h-4 block " ++ manaCostToSymbol x) ] []) xs)
+
+                Nothing ->
+                    span
+                        []
+                        [ text "?" ]
+
         viewCard : CardData -> Html Msg
         viewCard : CardData -> Html Msg
         viewCard card =
         viewCard card =
-            li [ class "" ]
-                [ text card.details.name ]
+            li [ class "flex items-center gap-2 text-white justify-between" ]
+                [ span [ class "truncate" ] [ text card.details.name ], viewManaCost card ]
     in
     in
     div [ class "mb-2 w-full" ]
     div [ class "mb-2 w-full" ]
         [ button
         [ button
@@ -291,7 +302,7 @@ viewDeckList model =
             ]
             ]
         , if model.toolboxAccordion.deckList then
         , if model.toolboxAccordion.deckList then
             div [ class "py-2" ]
             div [ class "py-2" ]
-                [ decklist
+                [ div [ class "max-h-[400px] overflow-y-auto pr-2" ] [ decklist ]
                 ]
                 ]
 
 
           else
           else

+ 22 - 0
tests/TestCard.elm

@@ -0,0 +1,22 @@
+module TestCard exposing (..)
+
+import Card exposing (ManaCost(..))
+import Expect exposing (Expectation)
+import Fuzz exposing (Fuzzer, int, list, string)
+import Signals
+import Test exposing (..)
+
+
+suite : Test
+suite =
+    describe "Card"
+        [ test "parseManaCost ('')" <|
+            \_ ->
+                Expect.equal (Card.parseManaCost "") (Just [])
+        , test "parseManaCost ('{X}')" <|
+            \_ ->
+                Expect.equal (Card.parseManaCost "{X}") (Just [ X ])
+        , test "parseManaCost ('{X}{Y}')" <|
+            \_ ->
+                Expect.equal (Card.parseManaCost "{X}{Y}") (Just [ X, Y ])
+        ]

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů