-- |
-- SPDX-License-Identifier: BSD-3-Clause
--
-- Definitions of all possible achievements.
module Swarm.Game.Achievement.Definitions (
  -- * Achievements
  CategorizedAchievement (..),
  GlobalAchievement (..),
  GameplayAchievement (..),
  listAchievements,

  -- * Achievement info
  ExpectedEffort (..),
  Quotation (..),
  FlavorText (..),
  AchievementInfo (..),
) where

import Data.Aeson
import Data.Text (Text)
import GHC.Generics (Generic)
import Swarm.Language.Syntax (Syntax)
import Swarm.Language.Text.Markdown (Document)
import Swarm.Util

-- | How hard do we expect the achievement to be?
data ExpectedEffort
  = Trivial
  | Easy
  | Moderate
  | Gruelling
  deriving (ExpectedEffort -> ExpectedEffort -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ExpectedEffort -> ExpectedEffort -> Bool
$c/= :: ExpectedEffort -> ExpectedEffort -> Bool
== :: ExpectedEffort -> ExpectedEffort -> Bool
$c== :: ExpectedEffort -> ExpectedEffort -> Bool
Eq, Eq ExpectedEffort
ExpectedEffort -> ExpectedEffort -> Bool
ExpectedEffort -> ExpectedEffort -> Ordering
ExpectedEffort -> ExpectedEffort -> ExpectedEffort
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ExpectedEffort -> ExpectedEffort -> ExpectedEffort
$cmin :: ExpectedEffort -> ExpectedEffort -> ExpectedEffort
max :: ExpectedEffort -> ExpectedEffort -> ExpectedEffort
$cmax :: ExpectedEffort -> ExpectedEffort -> ExpectedEffort
>= :: ExpectedEffort -> ExpectedEffort -> Bool
$c>= :: ExpectedEffort -> ExpectedEffort -> Bool
> :: ExpectedEffort -> ExpectedEffort -> Bool
$c> :: ExpectedEffort -> ExpectedEffort -> Bool
<= :: ExpectedEffort -> ExpectedEffort -> Bool
$c<= :: ExpectedEffort -> ExpectedEffort -> Bool
< :: ExpectedEffort -> ExpectedEffort -> Bool
$c< :: ExpectedEffort -> ExpectedEffort -> Bool
compare :: ExpectedEffort -> ExpectedEffort -> Ordering
$ccompare :: ExpectedEffort -> ExpectedEffort -> Ordering
Ord, Int -> ExpectedEffort -> ShowS
[ExpectedEffort] -> ShowS
ExpectedEffort -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ExpectedEffort] -> ShowS
$cshowList :: [ExpectedEffort] -> ShowS
show :: ExpectedEffort -> String
$cshow :: ExpectedEffort -> String
showsPrec :: Int -> ExpectedEffort -> ShowS
$cshowsPrec :: Int -> ExpectedEffort -> ShowS
Show, ExpectedEffort
forall a. a -> a -> Bounded a
maxBound :: ExpectedEffort
$cmaxBound :: ExpectedEffort
minBound :: ExpectedEffort
$cminBound :: ExpectedEffort
Bounded, Int -> ExpectedEffort
ExpectedEffort -> Int
ExpectedEffort -> [ExpectedEffort]
ExpectedEffort -> ExpectedEffort
ExpectedEffort -> ExpectedEffort -> [ExpectedEffort]
ExpectedEffort
-> ExpectedEffort -> ExpectedEffort -> [ExpectedEffort]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: ExpectedEffort
-> ExpectedEffort -> ExpectedEffort -> [ExpectedEffort]
$cenumFromThenTo :: ExpectedEffort
-> ExpectedEffort -> ExpectedEffort -> [ExpectedEffort]
enumFromTo :: ExpectedEffort -> ExpectedEffort -> [ExpectedEffort]
$cenumFromTo :: ExpectedEffort -> ExpectedEffort -> [ExpectedEffort]
enumFromThen :: ExpectedEffort -> ExpectedEffort -> [ExpectedEffort]
$cenumFromThen :: ExpectedEffort -> ExpectedEffort -> [ExpectedEffort]
enumFrom :: ExpectedEffort -> [ExpectedEffort]
$cenumFrom :: ExpectedEffort -> [ExpectedEffort]
fromEnum :: ExpectedEffort -> Int
$cfromEnum :: ExpectedEffort -> Int
toEnum :: Int -> ExpectedEffort
$ctoEnum :: Int -> ExpectedEffort
pred :: ExpectedEffort -> ExpectedEffort
$cpred :: ExpectedEffort -> ExpectedEffort
succ :: ExpectedEffort -> ExpectedEffort
$csucc :: ExpectedEffort -> ExpectedEffort
Enum, forall x. Rep ExpectedEffort x -> ExpectedEffort
forall x. ExpectedEffort -> Rep ExpectedEffort x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep ExpectedEffort x -> ExpectedEffort
$cfrom :: forall x. ExpectedEffort -> Rep ExpectedEffort x
Generic, Value -> Parser [ExpectedEffort]
Value -> Parser ExpectedEffort
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [ExpectedEffort]
$cparseJSONList :: Value -> Parser [ExpectedEffort]
parseJSON :: Value -> Parser ExpectedEffort
$cparseJSON :: Value -> Parser ExpectedEffort
FromJSON, [ExpectedEffort] -> Encoding
[ExpectedEffort] -> Value
ExpectedEffort -> Encoding
ExpectedEffort -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [ExpectedEffort] -> Encoding
$ctoEncodingList :: [ExpectedEffort] -> Encoding
toJSONList :: [ExpectedEffort] -> Value
$ctoJSONList :: [ExpectedEffort] -> Value
toEncoding :: ExpectedEffort -> Encoding
$ctoEncoding :: ExpectedEffort -> Encoding
toJSON :: ExpectedEffort -> Value
$ctoJSON :: ExpectedEffort -> Value
ToJSON)

-- | A quotation to spice up the description of an achievement.
data Quotation = Quotation
  { Quotation -> Text
attribution :: Text
  , Quotation -> Text
content :: Text
  }
  deriving (Quotation -> Quotation -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Quotation -> Quotation -> Bool
$c/= :: Quotation -> Quotation -> Bool
== :: Quotation -> Quotation -> Bool
$c== :: Quotation -> Quotation -> Bool
Eq, Int -> Quotation -> ShowS
[Quotation] -> ShowS
Quotation -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Quotation] -> ShowS
$cshowList :: [Quotation] -> ShowS
show :: Quotation -> String
$cshow :: Quotation -> String
showsPrec :: Int -> Quotation -> ShowS
$cshowsPrec :: Int -> Quotation -> ShowS
Show, forall x. Rep Quotation x -> Quotation
forall x. Quotation -> Rep Quotation x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Quotation x -> Quotation
$cfrom :: forall x. Quotation -> Rep Quotation x
Generic, Value -> Parser [Quotation]
Value -> Parser Quotation
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [Quotation]
$cparseJSONList :: Value -> Parser [Quotation]
parseJSON :: Value -> Parser Quotation
$cparseJSON :: Value -> Parser Quotation
FromJSON, [Quotation] -> Encoding
[Quotation] -> Value
Quotation -> Encoding
Quotation -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [Quotation] -> Encoding
$ctoEncodingList :: [Quotation] -> Encoding
toJSONList :: [Quotation] -> Value
$ctoJSONList :: [Quotation] -> Value
toEncoding :: Quotation -> Encoding
$ctoEncoding :: Quotation -> Encoding
toJSON :: Quotation -> Value
$ctoJSON :: Quotation -> Value
ToJSON)

-- | Flavor text to spice up the description of an achievement, either
--   freeform text or a quotation.
data FlavorText
  = Freeform (Document Syntax)
  | FTQuotation Quotation
  deriving (FlavorText -> FlavorText -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: FlavorText -> FlavorText -> Bool
$c/= :: FlavorText -> FlavorText -> Bool
== :: FlavorText -> FlavorText -> Bool
$c== :: FlavorText -> FlavorText -> Bool
Eq, Int -> FlavorText -> ShowS
[FlavorText] -> ShowS
FlavorText -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [FlavorText] -> ShowS
$cshowList :: [FlavorText] -> ShowS
show :: FlavorText -> String
$cshow :: FlavorText -> String
showsPrec :: Int -> FlavorText -> ShowS
$cshowsPrec :: Int -> FlavorText -> ShowS
Show, forall x. Rep FlavorText x -> FlavorText
forall x. FlavorText -> Rep FlavorText x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep FlavorText x -> FlavorText
$cfrom :: forall x. FlavorText -> Rep FlavorText x
Generic, Value -> Parser [FlavorText]
Value -> Parser FlavorText
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [FlavorText]
$cparseJSONList :: Value -> Parser [FlavorText]
parseJSON :: Value -> Parser FlavorText
$cparseJSON :: Value -> Parser FlavorText
FromJSON, [FlavorText] -> Encoding
[FlavorText] -> Value
FlavorText -> Encoding
FlavorText -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [FlavorText] -> Encoding
$ctoEncodingList :: [FlavorText] -> Encoding
toJSONList :: [FlavorText] -> Value
$ctoJSONList :: [FlavorText] -> Value
toEncoding :: FlavorText -> Encoding
$ctoEncoding :: FlavorText -> Encoding
toJSON :: FlavorText -> Value
$ctoJSON :: FlavorText -> Value
ToJSON)

-- | Information about an achievement.  See
--   "Swarm.Game.Achievement.Description" for a mapping from
--   achievements to an corresponding 'AchievementInfo' record.
data AchievementInfo = AchievementInfo
  { AchievementInfo -> Text
title :: Text
  -- ^ Guidelines:
  --
  -- * prefer puns, pop culture references, etc.
  -- * should be a phrase in Title Case.
  -- * For achievements that are "obfuscated", this can be
  --   a vague "clue" as to what the attainment entails.
  , AchievementInfo -> Maybe FlavorText
humorousElaboration :: Maybe FlavorText
  -- ^ Explain the reference, e.g. in the form of a full quote
  -- from a movie, or something you might find
  -- in a fortune cookie
  , AchievementInfo -> Document Syntax
attainmentProcess :: Document Syntax
  -- ^ Precisely what must be done to obtain this achievement.
  , AchievementInfo -> ExpectedEffort
effort :: ExpectedEffort
  -- ^ How hard the achievement is expected to be.
  , AchievementInfo -> Bool
isObfuscated :: Bool
  -- ^ Hides the attainment process until after the achievement is attained.
  --   Best when the title + elaboration constitute a good clue.
  }
  deriving (AchievementInfo -> AchievementInfo -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AchievementInfo -> AchievementInfo -> Bool
$c/= :: AchievementInfo -> AchievementInfo -> Bool
== :: AchievementInfo -> AchievementInfo -> Bool
$c== :: AchievementInfo -> AchievementInfo -> Bool
Eq, Int -> AchievementInfo -> ShowS
[AchievementInfo] -> ShowS
AchievementInfo -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AchievementInfo] -> ShowS
$cshowList :: [AchievementInfo] -> ShowS
show :: AchievementInfo -> String
$cshow :: AchievementInfo -> String
showsPrec :: Int -> AchievementInfo -> ShowS
$cshowsPrec :: Int -> AchievementInfo -> ShowS
Show, forall x. Rep AchievementInfo x -> AchievementInfo
forall x. AchievementInfo -> Rep AchievementInfo x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep AchievementInfo x -> AchievementInfo
$cfrom :: forall x. AchievementInfo -> Rep AchievementInfo x
Generic, Value -> Parser [AchievementInfo]
Value -> Parser AchievementInfo
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [AchievementInfo]
$cparseJSONList :: Value -> Parser [AchievementInfo]
parseJSON :: Value -> Parser AchievementInfo
$cparseJSON :: Value -> Parser AchievementInfo
FromJSON, [AchievementInfo] -> Encoding
[AchievementInfo] -> Value
AchievementInfo -> Encoding
AchievementInfo -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [AchievementInfo] -> Encoding
$ctoEncodingList :: [AchievementInfo] -> Encoding
toJSONList :: [AchievementInfo] -> Value
$ctoJSONList :: [AchievementInfo] -> Value
toEncoding :: AchievementInfo -> Encoding
$ctoEncoding :: AchievementInfo -> Encoding
toJSON :: AchievementInfo -> Value
$ctoJSON :: AchievementInfo -> Value
ToJSON)

-- | An achievement, categorized as either global or gameplay.
data CategorizedAchievement
  = GlobalAchievement GlobalAchievement
  | GameplayAchievement GameplayAchievement
  deriving (CategorizedAchievement -> CategorizedAchievement -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CategorizedAchievement -> CategorizedAchievement -> Bool
$c/= :: CategorizedAchievement -> CategorizedAchievement -> Bool
== :: CategorizedAchievement -> CategorizedAchievement -> Bool
$c== :: CategorizedAchievement -> CategorizedAchievement -> Bool
Eq, Eq CategorizedAchievement
CategorizedAchievement -> CategorizedAchievement -> Bool
CategorizedAchievement -> CategorizedAchievement -> Ordering
CategorizedAchievement
-> CategorizedAchievement -> CategorizedAchievement
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: CategorizedAchievement
-> CategorizedAchievement -> CategorizedAchievement
$cmin :: CategorizedAchievement
-> CategorizedAchievement -> CategorizedAchievement
max :: CategorizedAchievement
-> CategorizedAchievement -> CategorizedAchievement
$cmax :: CategorizedAchievement
-> CategorizedAchievement -> CategorizedAchievement
>= :: CategorizedAchievement -> CategorizedAchievement -> Bool
$c>= :: CategorizedAchievement -> CategorizedAchievement -> Bool
> :: CategorizedAchievement -> CategorizedAchievement -> Bool
$c> :: CategorizedAchievement -> CategorizedAchievement -> Bool
<= :: CategorizedAchievement -> CategorizedAchievement -> Bool
$c<= :: CategorizedAchievement -> CategorizedAchievement -> Bool
< :: CategorizedAchievement -> CategorizedAchievement -> Bool
$c< :: CategorizedAchievement -> CategorizedAchievement -> Bool
compare :: CategorizedAchievement -> CategorizedAchievement -> Ordering
$ccompare :: CategorizedAchievement -> CategorizedAchievement -> Ordering
Ord, Int -> CategorizedAchievement -> ShowS
[CategorizedAchievement] -> ShowS
CategorizedAchievement -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CategorizedAchievement] -> ShowS
$cshowList :: [CategorizedAchievement] -> ShowS
show :: CategorizedAchievement -> String
$cshow :: CategorizedAchievement -> String
showsPrec :: Int -> CategorizedAchievement -> ShowS
$cshowsPrec :: Int -> CategorizedAchievement -> ShowS
Show, forall x. Rep CategorizedAchievement x -> CategorizedAchievement
forall x. CategorizedAchievement -> Rep CategorizedAchievement x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CategorizedAchievement x -> CategorizedAchievement
$cfrom :: forall x. CategorizedAchievement -> Rep CategorizedAchievement x
Generic)

categorizedAchievementJsonOptions :: Options
categorizedAchievementJsonOptions :: Options
categorizedAchievementJsonOptions =
  Options
defaultOptions
    { sumEncoding :: SumEncoding
sumEncoding = SumEncoding
UntaggedValue
    }

instance ToJSON CategorizedAchievement where
  toJSON :: CategorizedAchievement -> Value
toJSON = forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON Options
categorizedAchievementJsonOptions

instance FromJSON CategorizedAchievement where
  parseJSON :: Value -> Parser CategorizedAchievement
parseJSON = forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
genericParseJSON Options
categorizedAchievementJsonOptions

-- | Achievements that entail some aggregate of actions across
--   scenarios, or are independent of any particular scenario.
data GlobalAchievement
  = CompletedSingleTutorial
  | CompletedAllTutorials
  | LookedAtAboutScreen
  deriving (GlobalAchievement -> GlobalAchievement -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GlobalAchievement -> GlobalAchievement -> Bool
$c/= :: GlobalAchievement -> GlobalAchievement -> Bool
== :: GlobalAchievement -> GlobalAchievement -> Bool
$c== :: GlobalAchievement -> GlobalAchievement -> Bool
Eq, Eq GlobalAchievement
GlobalAchievement -> GlobalAchievement -> Bool
GlobalAchievement -> GlobalAchievement -> Ordering
GlobalAchievement -> GlobalAchievement -> GlobalAchievement
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: GlobalAchievement -> GlobalAchievement -> GlobalAchievement
$cmin :: GlobalAchievement -> GlobalAchievement -> GlobalAchievement
max :: GlobalAchievement -> GlobalAchievement -> GlobalAchievement
$cmax :: GlobalAchievement -> GlobalAchievement -> GlobalAchievement
>= :: GlobalAchievement -> GlobalAchievement -> Bool
$c>= :: GlobalAchievement -> GlobalAchievement -> Bool
> :: GlobalAchievement -> GlobalAchievement -> Bool
$c> :: GlobalAchievement -> GlobalAchievement -> Bool
<= :: GlobalAchievement -> GlobalAchievement -> Bool
$c<= :: GlobalAchievement -> GlobalAchievement -> Bool
< :: GlobalAchievement -> GlobalAchievement -> Bool
$c< :: GlobalAchievement -> GlobalAchievement -> Bool
compare :: GlobalAchievement -> GlobalAchievement -> Ordering
$ccompare :: GlobalAchievement -> GlobalAchievement -> Ordering
Ord, Int -> GlobalAchievement -> ShowS
[GlobalAchievement] -> ShowS
GlobalAchievement -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GlobalAchievement] -> ShowS
$cshowList :: [GlobalAchievement] -> ShowS
show :: GlobalAchievement -> String
$cshow :: GlobalAchievement -> String
showsPrec :: Int -> GlobalAchievement -> ShowS
$cshowsPrec :: Int -> GlobalAchievement -> ShowS
Show, GlobalAchievement
forall a. a -> a -> Bounded a
maxBound :: GlobalAchievement
$cmaxBound :: GlobalAchievement
minBound :: GlobalAchievement
$cminBound :: GlobalAchievement
Bounded, Int -> GlobalAchievement
GlobalAchievement -> Int
GlobalAchievement -> [GlobalAchievement]
GlobalAchievement -> GlobalAchievement
GlobalAchievement -> GlobalAchievement -> [GlobalAchievement]
GlobalAchievement
-> GlobalAchievement -> GlobalAchievement -> [GlobalAchievement]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: GlobalAchievement
-> GlobalAchievement -> GlobalAchievement -> [GlobalAchievement]
$cenumFromThenTo :: GlobalAchievement
-> GlobalAchievement -> GlobalAchievement -> [GlobalAchievement]
enumFromTo :: GlobalAchievement -> GlobalAchievement -> [GlobalAchievement]
$cenumFromTo :: GlobalAchievement -> GlobalAchievement -> [GlobalAchievement]
enumFromThen :: GlobalAchievement -> GlobalAchievement -> [GlobalAchievement]
$cenumFromThen :: GlobalAchievement -> GlobalAchievement -> [GlobalAchievement]
enumFrom :: GlobalAchievement -> [GlobalAchievement]
$cenumFrom :: GlobalAchievement -> [GlobalAchievement]
fromEnum :: GlobalAchievement -> Int
$cfromEnum :: GlobalAchievement -> Int
toEnum :: Int -> GlobalAchievement
$ctoEnum :: Int -> GlobalAchievement
pred :: GlobalAchievement -> GlobalAchievement
$cpred :: GlobalAchievement -> GlobalAchievement
succ :: GlobalAchievement -> GlobalAchievement
$csucc :: GlobalAchievement -> GlobalAchievement
Enum, forall x. Rep GlobalAchievement x -> GlobalAchievement
forall x. GlobalAchievement -> Rep GlobalAchievement x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep GlobalAchievement x -> GlobalAchievement
$cfrom :: forall x. GlobalAchievement -> Rep GlobalAchievement x
Generic)

instance FromJSON GlobalAchievement
instance ToJSON GlobalAchievement

-- | Achievements obtained while playing a single scenario.
data GameplayAchievement
  = CraftedBitcoin
  | RobotIntoWater
  | AttemptSelfDestructBase
  | DestroyedBase
  | LoseScenario
  | GetDisoriented
  | SwapSame
  deriving (GameplayAchievement -> GameplayAchievement -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GameplayAchievement -> GameplayAchievement -> Bool
$c/= :: GameplayAchievement -> GameplayAchievement -> Bool
== :: GameplayAchievement -> GameplayAchievement -> Bool
$c== :: GameplayAchievement -> GameplayAchievement -> Bool
Eq, Eq GameplayAchievement
GameplayAchievement -> GameplayAchievement -> Bool
GameplayAchievement -> GameplayAchievement -> Ordering
GameplayAchievement -> GameplayAchievement -> GameplayAchievement
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: GameplayAchievement -> GameplayAchievement -> GameplayAchievement
$cmin :: GameplayAchievement -> GameplayAchievement -> GameplayAchievement
max :: GameplayAchievement -> GameplayAchievement -> GameplayAchievement
$cmax :: GameplayAchievement -> GameplayAchievement -> GameplayAchievement
>= :: GameplayAchievement -> GameplayAchievement -> Bool
$c>= :: GameplayAchievement -> GameplayAchievement -> Bool
> :: GameplayAchievement -> GameplayAchievement -> Bool
$c> :: GameplayAchievement -> GameplayAchievement -> Bool
<= :: GameplayAchievement -> GameplayAchievement -> Bool
$c<= :: GameplayAchievement -> GameplayAchievement -> Bool
< :: GameplayAchievement -> GameplayAchievement -> Bool
$c< :: GameplayAchievement -> GameplayAchievement -> Bool
compare :: GameplayAchievement -> GameplayAchievement -> Ordering
$ccompare :: GameplayAchievement -> GameplayAchievement -> Ordering
Ord, Int -> GameplayAchievement -> ShowS
[GameplayAchievement] -> ShowS
GameplayAchievement -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GameplayAchievement] -> ShowS
$cshowList :: [GameplayAchievement] -> ShowS
show :: GameplayAchievement -> String
$cshow :: GameplayAchievement -> String
showsPrec :: Int -> GameplayAchievement -> ShowS
$cshowsPrec :: Int -> GameplayAchievement -> ShowS
Show, GameplayAchievement
forall a. a -> a -> Bounded a
maxBound :: GameplayAchievement
$cmaxBound :: GameplayAchievement
minBound :: GameplayAchievement
$cminBound :: GameplayAchievement
Bounded, Int -> GameplayAchievement
GameplayAchievement -> Int
GameplayAchievement -> [GameplayAchievement]
GameplayAchievement -> GameplayAchievement
GameplayAchievement -> GameplayAchievement -> [GameplayAchievement]
GameplayAchievement
-> GameplayAchievement
-> GameplayAchievement
-> [GameplayAchievement]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: GameplayAchievement
-> GameplayAchievement
-> GameplayAchievement
-> [GameplayAchievement]
$cenumFromThenTo :: GameplayAchievement
-> GameplayAchievement
-> GameplayAchievement
-> [GameplayAchievement]
enumFromTo :: GameplayAchievement -> GameplayAchievement -> [GameplayAchievement]
$cenumFromTo :: GameplayAchievement -> GameplayAchievement -> [GameplayAchievement]
enumFromThen :: GameplayAchievement -> GameplayAchievement -> [GameplayAchievement]
$cenumFromThen :: GameplayAchievement -> GameplayAchievement -> [GameplayAchievement]
enumFrom :: GameplayAchievement -> [GameplayAchievement]
$cenumFrom :: GameplayAchievement -> [GameplayAchievement]
fromEnum :: GameplayAchievement -> Int
$cfromEnum :: GameplayAchievement -> Int
toEnum :: Int -> GameplayAchievement
$ctoEnum :: Int -> GameplayAchievement
pred :: GameplayAchievement -> GameplayAchievement
$cpred :: GameplayAchievement -> GameplayAchievement
succ :: GameplayAchievement -> GameplayAchievement
$csucc :: GameplayAchievement -> GameplayAchievement
Enum, forall x. Rep GameplayAchievement x -> GameplayAchievement
forall x. GameplayAchievement -> Rep GameplayAchievement x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep GameplayAchievement x -> GameplayAchievement
$cfrom :: forall x. GameplayAchievement -> Rep GameplayAchievement x
Generic)

instance FromJSON GameplayAchievement
instance ToJSON GameplayAchievement

-- | List of all possible achievements.
listAchievements :: [CategorizedAchievement]
listAchievements :: [CategorizedAchievement]
listAchievements =
  forall a b. (a -> b) -> [a] -> [b]
map GlobalAchievement -> CategorizedAchievement
GlobalAchievement forall e. (Enum e, Bounded e) => [e]
listEnums
    forall a. Semigroup a => a -> a -> a
<> forall a b. (a -> b) -> [a] -> [b]
map GameplayAchievement -> CategorizedAchievement
GameplayAchievement forall e. (Enum e, Bounded e) => [e]
listEnums