├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── Setup.hs ├── ldtk-types.cabal ├── package.yaml ├── src ├── LDtk.hs └── LDtk │ └── Types.hs ├── stack.yaml ├── stack.yaml.lock └── test ├── Spec.hs ├── entities.json └── ex.json /.gitignore: -------------------------------------------------------------------------------- 1 | .stack-work/ 2 | *~ -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog for `ldtk` 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 6 | and this project adheres to the 7 | [Haskell Package Versioning Policy](https://pvp.haskell.org/). 8 | 9 | ## Unreleased 10 | 11 | ## 1.2.3 - 2023-01-13 12 | 13 | - Added `LDtk.loadLDtk` 14 | - Package version now follows LDtk. 15 | 16 | ## 0.2.0.0 - 2023-01-08 17 | 18 | - Support ldtk-1.2.3 19 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright Sandy Maguire (c) 2023 2 | 3 | All rights reserved. 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are met: 7 | 8 | * Redistributions of source code must retain the above copyright 9 | notice, this list of conditions and the following disclaimer. 10 | 11 | * Redistributions in binary form must reproduce the above 12 | copyright notice, this list of conditions and the following 13 | disclaimer in the documentation and/or other materials provided 14 | with the distribution. 15 | 16 | * Neither the name of Sandy Maguire nor the names of other 17 | contributors may be used to endorse or promote products derived 18 | from this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24 | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26 | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ldtk-types 2 | 3 | [Hackage](https://hackage.haskell.org/package/ldtk-types) 4 | 5 | ## Overview 6 | 7 | Types and Aeson instances for parsing [LDtk](https://ldtk.io/json) files. Parse 8 | a file as `LDtk.Types.LDtkRoot`. 9 | 10 | -------------------------------------------------------------------------------- /Setup.hs: -------------------------------------------------------------------------------- 1 | import Distribution.Simple 2 | main = defaultMain 3 | -------------------------------------------------------------------------------- /ldtk-types.cabal: -------------------------------------------------------------------------------- 1 | cabal-version: 1.12 2 | 3 | -- This file has been generated from package.yaml by hpack version 0.36.0. 4 | -- 5 | -- see: https://github.com/sol/hpack 6 | 7 | name: ldtk-types 8 | version: 1.5.3 9 | synopsis: Datatypes and Aeson instances for parsing LDtk 10 | description: Please see the README on GitHub at 11 | category: Data 12 | homepage: https://github.com/isovector/ldtk-types#readme 13 | bug-reports: https://github.com/isovector/ldtk-types/issues 14 | author: Sandy Maguire 15 | maintainer: sandy@sandymaguire.me 16 | copyright: Sandy Maguire 17 | license: BSD3 18 | license-file: LICENSE 19 | build-type: Simple 20 | extra-source-files: 21 | README.md 22 | CHANGELOG.md 23 | 24 | source-repository head 25 | type: git 26 | location: https://github.com/isovector/ldtk-types 27 | 28 | library 29 | exposed-modules: 30 | LDtk 31 | LDtk.Types 32 | other-modules: 33 | Paths_ldtk_types 34 | hs-source-dirs: 35 | src 36 | default-extensions: 37 | DeriveDataTypeable 38 | DeriveFoldable 39 | DeriveFunctor 40 | DeriveGeneric 41 | DeriveTraversable 42 | DerivingStrategies 43 | GeneralisedNewtypeDeriving 44 | LambdaCase 45 | NamedFieldPuns 46 | ScopedTypeVariables 47 | TraditionalRecordSyntax 48 | TupleSections 49 | TypeApplications 50 | ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wpartial-fields -Wredundant-constraints 51 | build-depends: 52 | aeson 53 | , base >=4.7 && <5 54 | , text 55 | default-language: Haskell2010 56 | 57 | test-suite ldtk-test 58 | type: exitcode-stdio-1.0 59 | main-is: Spec.hs 60 | other-modules: 61 | Paths_ldtk_types 62 | hs-source-dirs: 63 | test 64 | default-extensions: 65 | DeriveDataTypeable 66 | DeriveFoldable 67 | DeriveFunctor 68 | DeriveGeneric 69 | DeriveTraversable 70 | DerivingStrategies 71 | GeneralisedNewtypeDeriving 72 | LambdaCase 73 | NamedFieldPuns 74 | ScopedTypeVariables 75 | TraditionalRecordSyntax 76 | TupleSections 77 | TypeApplications 78 | ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wpartial-fields -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N 79 | build-depends: 80 | aeson 81 | , base >=4.7 && <5 82 | , ldtk-types 83 | , text 84 | default-language: Haskell2010 85 | -------------------------------------------------------------------------------- /package.yaml: -------------------------------------------------------------------------------- 1 | name: ldtk-types 2 | version: 1.5.3 3 | github: "isovector/ldtk-types" 4 | license: BSD3 5 | author: "Sandy Maguire" 6 | maintainer: "sandy@sandymaguire.me" 7 | copyright: "Sandy Maguire" 8 | 9 | extra-source-files: 10 | - README.md 11 | - CHANGELOG.md 12 | 13 | # Metadata used when publishing your package 14 | synopsis: Datatypes and Aeson instances for parsing LDtk 15 | category: Data 16 | 17 | # To avoid duplicated efforts in documentation and dealing with the 18 | # complications of embedding Haddock markup inside cabal files, it is 19 | # common to point users to the README.md file. 20 | description: Please see the README on GitHub at 21 | 22 | dependencies: 23 | - base >= 4.7 && < 5 24 | - aeson 25 | - text 26 | 27 | ghc-options: 28 | - -Wall 29 | - -Wcompat 30 | - -Widentities 31 | - -Wincomplete-record-updates 32 | - -Wincomplete-uni-patterns 33 | - -Wpartial-fields 34 | - -Wredundant-constraints 35 | 36 | default-extensions: 37 | - DeriveDataTypeable 38 | - DeriveFoldable 39 | - DeriveFunctor 40 | - DeriveGeneric 41 | - DeriveTraversable 42 | - DerivingStrategies 43 | - GeneralisedNewtypeDeriving 44 | - LambdaCase 45 | - NamedFieldPuns 46 | - ScopedTypeVariables 47 | - TraditionalRecordSyntax 48 | - TupleSections 49 | - TypeApplications 50 | 51 | library: 52 | source-dirs: src 53 | 54 | tests: 55 | ldtk-test: 56 | main: Spec.hs 57 | source-dirs: test 58 | ghc-options: 59 | - -threaded 60 | - -rtsopts 61 | - -with-rtsopts=-N 62 | dependencies: 63 | - ldtk-types 64 | -------------------------------------------------------------------------------- /src/LDtk.hs: -------------------------------------------------------------------------------- 1 | module LDtk 2 | ( module LDtk 3 | , module LDtk.Types 4 | ) where 5 | 6 | import Data.Aeson 7 | import LDtk.Types hiding (ldtkOpts, parseFieldValue) 8 | 9 | ------------------------------------------------------------------------------ 10 | -- | @since 1.2.3 11 | loadLDtk :: FilePath -> IO (Either String LDtkRoot) 12 | loadLDtk = eitherDecodeFileStrict 13 | 14 | -------------------------------------------------------------------------------- /src/LDtk/Types.hs: -------------------------------------------------------------------------------- 1 | {-# LANGUAGE DeriveAnyClass #-} 2 | {-# LANGUAGE DuplicateRecordFields #-} 3 | {-# LANGUAGE OverloadedStrings #-} 4 | {-# LANGUAGE RecordWildCards #-} 5 | {-# LANGUAGE ViewPatterns #-} 6 | 7 | module LDtk.Types where 8 | 9 | import Data.Aeson 10 | import GHC.Generics 11 | import Data.Text (Text) 12 | import qualified Data.Text as T 13 | import Data.Word (Word8) 14 | import Data.Maybe (listToMaybe) 15 | import Numeric (readHex) 16 | import Data.Aeson.Types (Parser) 17 | 18 | ldtkOpts :: Options 19 | ldtkOpts = defaultOptions 20 | { fieldLabelModifier = \case 21 | -- Names that are too atrocious to allow 22 | "data'" -> "data" 23 | "enumid" -> "id" 24 | "tile_flip" -> "f" 25 | x -> x 26 | , allNullaryToStringTag = True 27 | , unwrapUnaryRecords = True 28 | } 29 | 30 | data Color = Color 31 | { c_r :: Word8 32 | , c_g :: Word8 33 | , c_b :: Word8 34 | } 35 | deriving stock (Eq, Ord, Show, Read, Generic) 36 | 37 | instance FromJSON Color where 38 | parseJSON v = do 39 | ('#' : r1 : r2 : g1 : g2 : b1 : b2 : []) <- parseJSON v 40 | let safe_read = pure . listToMaybe . fmap fst 41 | Just r <- safe_read $ readHex [r1, r2] 42 | Just g <- safe_read $ readHex [g1, g2] 43 | Just b <- safe_read $ readHex [b1, b2] 44 | pure $ Color r g b 45 | 46 | 47 | data EntityDef = EntityDef 48 | { color :: Color 49 | , height :: Int 50 | , identifier :: Text 51 | , nineSliceBorders :: [Int] 52 | , pivotX :: Float 53 | , pivotY :: Float 54 | , tileRect :: Maybe TilesetRect 55 | , tileRenderMode :: TileRenderMode 56 | , tilesetId :: Maybe Int 57 | , uid :: Int 58 | , uiTileRect :: Maybe TilesetRect 59 | , width :: Int 60 | } 61 | deriving stock (Eq, Ord, Show, Read, Generic) 62 | 63 | data EmbedAtlas = LdtkIcons 64 | deriving stock (Eq, Ord, Show, Read, Enum, Bounded, Generic) 65 | 66 | instance FromJSON EmbedAtlas where 67 | parseJSON v = do 68 | "LdtkIcons" <- parseJSON @String v 69 | pure LdtkIcons 70 | 71 | data CustomData = CustomData 72 | { data' :: Text 73 | , tileId :: Int 74 | } 75 | deriving stock (Eq, Ord, Show, Read, Generic) 76 | 77 | data EnumTag = EnumTag 78 | { enumValueId :: Text 79 | , tileIds :: [Int] 80 | } 81 | deriving stock (Eq, Ord, Show, Read, Generic) 82 | 83 | data TilesetDef = TilesetDef 84 | { __cHei :: Int 85 | , __cWid :: Int 86 | , customData :: [CustomData] 87 | , embedAtlas :: Maybe EmbedAtlas 88 | , enumTags :: [EnumTag] 89 | , identifier :: Text 90 | , padding :: Int 91 | , pxHei :: Int 92 | , pxWid :: Int 93 | , relPath :: Maybe FilePath 94 | , spacing :: Int 95 | , tags :: [Text] 96 | , tagsSourceEnumUid :: Maybe Int 97 | , tileGridSize :: Int 98 | , uid :: Int 99 | } 100 | deriving stock (Eq, Ord, Show, Read, Generic) 101 | 102 | data Definitions = Definitions 103 | { entities :: [EntityDef] 104 | , enums :: [EnumDef] 105 | , externalEnums :: [EnumDef] 106 | , layers :: [LayerDef] 107 | -- , LevelFields :: [FieldDef] 108 | , tilesets :: [TilesetDef] 109 | } 110 | deriving stock (Eq, Ord, Show, Read, Generic) 111 | 112 | data EnumValueDef = EnumValueDef 113 | { color :: Int 114 | , tileRect :: Maybe TilesetRect 115 | , enumid :: Text 116 | } 117 | deriving stock (Eq, Ord, Show, Read, Generic) 118 | 119 | data EnumDef = EnumDef 120 | { externalRelPath :: Maybe FilePath 121 | , iconTilesetUid :: Maybe Int 122 | , identifier :: Text 123 | , tags :: [Text] 124 | , uid :: Int 125 | , values :: [EnumValueDef] 126 | } 127 | deriving stock (Eq, Ord, Show, Read, Generic) 128 | 129 | data GridValue = GridValue 130 | { color :: Color 131 | -- TODO(sandy): if zero should be null 132 | , groupUid :: Maybe Int 133 | , identifier :: Maybe Text 134 | , value :: Int 135 | , tile :: Maybe TilesetRect 136 | } 137 | deriving stock (Eq, Ord, Show, Read, Generic) 138 | 139 | data LayerDef = LayerDef 140 | { __type :: LayerType 141 | , autoSourceLayerDefUid :: Maybe Int 142 | , displayOpacity :: Float 143 | , gridSize :: Int 144 | , identifier :: Text 145 | , intGridValues :: [GridValue] 146 | , parallaxFactorX :: Float 147 | , parallaxFactorY :: Float 148 | , parallaxScaling :: Bool 149 | , pxOffsetX :: Int 150 | , pxOffsetY :: Int 151 | , tilesetDefUid :: Maybe Int 152 | , uid :: Int 153 | } 154 | deriving stock (Eq, Ord, Show, Read, Generic) 155 | 156 | data LDtkRoot = LDtkRoot 157 | { bgColor :: Color 158 | , defs :: Definitions 159 | , externalLevels :: Bool 160 | , iid :: Text 161 | , jsonVersion :: Text 162 | , levels :: [Level] 163 | , worldGridHeight :: Maybe Int 164 | , worldGridWidth :: Maybe Int 165 | , worldLayout :: WorldLayout 166 | , worlds :: [World] 167 | } 168 | deriving stock (Eq, Ord, Show, Read, Generic) 169 | 170 | data TileRenderMode = Cover | FitInside | Repeat | Stretch | FullSizeCropped | FillSizeUncropped | NineSlice 171 | deriving stock (Eq, Ord, Show, Read, Enum, Bounded, Generic) 172 | deriving anyclass (FromJSON) 173 | 174 | data WorldLayout = Free | GridVania | LinearHorizontal | LinearVertical 175 | deriving stock (Eq, Ord, Show, Read, Enum, Bounded, Generic) 176 | deriving anyclass (FromJSON) 177 | 178 | data LayerType = IntGrid | Entities | Tiles | AutoLayer 179 | deriving stock (Eq, Ord, Show, Read, Enum, Bounded, Generic) 180 | deriving anyclass (FromJSON) 181 | 182 | data World = World 183 | { identifier :: Text 184 | , iid :: Text 185 | , levels :: [Level] 186 | , worldGridHeight :: Maybe Int 187 | , worldGridWidth :: Maybe Int 188 | , worldLayout :: WorldLayout 189 | } 190 | deriving stock (Eq, Ord, Show, Read, Generic) 191 | 192 | data Rect a = Rect 193 | { r_x :: a 194 | , r_y :: a 195 | , r_width :: a 196 | , r_height :: a 197 | } 198 | deriving stock (Eq, Ord, Show, Read, Generic) 199 | 200 | data BgPos = BgPos 201 | { cropRect :: Rect Float 202 | , scale :: Pair Float 203 | , topLeftPx :: Pair Int 204 | } 205 | deriving stock (Eq, Ord, Show, Read, Generic) 206 | 207 | data Direction 208 | = North | South | East | West 209 | | NorthEast | NorthWest | SouthEast | SouthWest 210 | | LowerDepth | GreaterDepth | OverlappingDepth 211 | deriving stock (Eq, Ord, Show, Read, Generic) 212 | 213 | instance FromJSON Direction where 214 | parseJSON v = do 215 | parseJSON @String v >>= pure . \case 216 | "n" -> North 217 | "ne" -> NorthEast 218 | "nw" -> NorthWest 219 | "s" -> South 220 | "se" -> SouthEast 221 | "sw" -> SouthWest 222 | "e" -> East 223 | "w" -> West 224 | "<" -> LowerDepth 225 | ">" -> GreaterDepthy 226 | "o" -> OverlappingDepth 227 | x -> fail $ "not a direction: " <> show x 228 | 229 | data IntGridValueGroup = IntGridValueGroup 230 | { color :: Maybe Color 231 | , identifier :: Maybe String 232 | , uid :: Int 233 | } 234 | deriving stock (Eq, Ord, Show, Read, Generic) 235 | 236 | data Neighbour = Neighbour 237 | { dir :: Direction 238 | , levelIid :: Text 239 | } 240 | deriving stock (Eq, Ord, Show, Read, Generic) 241 | 242 | data Level = Level 243 | { __bgColor :: Color 244 | , __bgPos :: Maybe BgPos 245 | , __neighbours :: [Neighbour] 246 | , bgRelPath :: Maybe Text 247 | , externalRelPath :: Maybe Text 248 | , fieldInstances :: [Field] 249 | , identifier :: Text 250 | , iid :: Text 251 | , layerInstances :: [Layer] 252 | , pxHei :: Int 253 | , pxWid :: Int 254 | , uid :: Int 255 | , worldDepth :: Int 256 | , worldX :: Int 257 | , worldY :: Int 258 | } 259 | deriving stock (Eq, Ord, Show, Read, Generic) 260 | 261 | data Layer = Layer 262 | { __cHei :: Int 263 | , __cWid :: Int 264 | , __gridSize :: Int 265 | , __identifier :: Text 266 | , __opacity :: Float 267 | , __pxTotalOffsetX :: Int 268 | , __pxTotalOffsetY :: Int 269 | , __tilesetDefUid :: Maybe Int 270 | , __tilesetRelPath:: Maybe Text 271 | , __type :: LayerType 272 | , autoLayerTiles :: [Tile] 273 | , entityInstances :: [Entity] 274 | , gridTiles :: [Tile] 275 | , iid :: Text 276 | , intGridCsv :: [Int] 277 | , layerDefUid :: Maybe Int 278 | , tilesetRelPath :: Maybe Text 279 | , levelId :: Int 280 | , overrideTilesetUid :: Maybe Int 281 | , visible :: Bool 282 | } 283 | deriving stock (Eq, Ord, Show, Read, Generic) 284 | 285 | data GridPoint = GridPoint 286 | { cx :: Int 287 | , cy :: Int 288 | } 289 | deriving stock (Eq, Ord, Show, Read, Generic) 290 | 291 | data Pair a = Pair 292 | { p_x :: a 293 | , p_y :: a 294 | } 295 | deriving stock (Eq, Ord, Show, Read, Generic) 296 | 297 | instance FromJSON a => FromJSON (Pair a) where 298 | parseJSON v = do 299 | [x, y] <- parseJSON v 300 | pure $ Pair x y 301 | 302 | instance FromJSON a => FromJSON (Rect a) where 303 | parseJSON v = do 304 | [x, y, w, h] <- parseJSON v 305 | pure $ Rect x y w h 306 | 307 | 308 | data Flip = NoFlip | FlipX | FlipY | FlipXY 309 | deriving stock (Eq, Ord, Show, Read, Enum, Bounded, Generic) 310 | 311 | instance FromJSON Flip where 312 | parseJSON = fmap toEnum . parseJSON 313 | 314 | data EntityReferenceInfos = EntityReferenceInfos 315 | { entityIid :: Text 316 | , layerIid :: Text 317 | , levelIid :: Text 318 | , worldIid :: Text 319 | } 320 | deriving stock (Eq, Ord, Show, Read, Generic) 321 | 322 | data FieldValue 323 | = IntegerValue Integer 324 | | FloatValue Float 325 | | BooleanValue Bool 326 | | StringValue Text 327 | | FilePathValue FilePath 328 | | ColorValue Color 329 | | EnumValue Text 330 | | PointValue GridPoint 331 | | TileValue TilesetRect 332 | | EntityRefValue EntityReferenceInfos 333 | | ArrayValue [FieldValue] 334 | deriving stock (Eq, Ord, Show, Read, Generic) 335 | 336 | data TilesetRect = TilesetRect 337 | { h :: Int 338 | , tilesetUid :: Int 339 | , w :: Int 340 | , x :: Int 341 | , y :: Int 342 | } 343 | deriving stock (Eq, Ord, Show, Read, Generic) 344 | 345 | data Tile = Tile 346 | { tile_flip :: Flip 347 | -- TODO(sandy): should default to 1 if not present 348 | , a :: Float 349 | , px :: Pair Int 350 | , src :: Pair Int 351 | , t :: Maybe Int 352 | } 353 | deriving stock (Eq, Ord, Show, Read, Generic) 354 | 355 | data Entity = Entity 356 | { __grid :: Pair Int 357 | , __identifier :: Text 358 | , __pivot :: Pair Float 359 | , __smartColor :: Color 360 | , __tags :: [Text] 361 | , __tile :: Maybe TilesetRect 362 | , __worldX :: Maybe Int 363 | , __worldY :: Maybe Int 364 | , defUid :: Int 365 | , fieldInstances :: [Field] 366 | , height :: Int 367 | , iid :: Text 368 | , px :: Pair Int 369 | , width :: Int 370 | } 371 | deriving stock (Eq, Ord, Show, Read, Generic) 372 | 373 | data Field = Field 374 | { __identifier :: Text 375 | , __tile :: Maybe TilesetRect 376 | , __type :: Text 377 | , __value :: FieldValue 378 | , defUid :: Int 379 | } 380 | deriving stock (Eq, Ord, Show, Read, Generic) 381 | 382 | parseFieldValue :: Text -> Value -> Parser FieldValue 383 | parseFieldValue ty v = do 384 | let (super, T.dropEnd 1 -> T.drop 1 -> sub) = T.break (\c -> c == '(' || c == '<' || c == '.') ty 385 | case super of 386 | "Int" -> IntegerValue <$> parseJSON v 387 | "Integer" -> IntegerValue <$> parseJSON v 388 | "Float" -> FloatValue <$> parseJSON v 389 | "Bool" -> BooleanValue <$> parseJSON v 390 | "Boolean" -> BooleanValue <$> parseJSON v 391 | "String" -> StringValue <$> parseJSON v 392 | "Multilines" -> StringValue <$> parseJSON v 393 | "Text" -> StringValue <$> parseJSON v 394 | "FilePath" -> FilePathValue <$> parseJSON v 395 | "Color" -> ColorValue <$> parseJSON v 396 | "Enum" -> EnumValue <$> parseJSON v 397 | "LocalEnum" -> EnumValue <$> parseJSON v 398 | "Point" -> PointValue <$> parseJSON v 399 | "Tile" -> TileValue <$> parseJSON v 400 | "EntityRef" -> EntityRefValue <$> parseJSON v 401 | "Array" -> do 402 | arr <- parseJSON v 403 | ArrayValue <$> traverse (parseFieldValue sub) arr 404 | x -> fail $ "unknown type " <> show x 405 | 406 | instance FromJSON Field where 407 | parseJSON = withObject "Field" $ \obj -> do 408 | __identifier <- obj .: "__identifier" 409 | __tile <- obj .: "__tile" 410 | __type <- obj .: "__type" 411 | defUid <- obj .: "defUid" 412 | mv <- obj .: "__value" 413 | __value <- 414 | case mv of 415 | Just v -> parseFieldValue __type v 416 | Nothing -> pure $ ArrayValue [] 417 | pure $ Field {..} 418 | 419 | instance FromJSON LDtkRoot where 420 | parseJSON = genericParseJSON ldtkOpts 421 | 422 | instance FromJSON BgPos where 423 | parseJSON = genericParseJSON ldtkOpts 424 | 425 | instance FromJSON Neighbour where 426 | parseJSON = genericParseJSON ldtkOpts 427 | 428 | instance FromJSON GridPoint where 429 | parseJSON = genericParseJSON ldtkOpts 430 | 431 | instance FromJSON EntityReferenceInfos where 432 | parseJSON = genericParseJSON ldtkOpts 433 | 434 | instance FromJSON TilesetRect where 435 | parseJSON = genericParseJSON ldtkOpts 436 | 437 | instance FromJSON Tile where 438 | parseJSON = genericParseJSON ldtkOpts 439 | 440 | instance FromJSON Entity where 441 | parseJSON = genericParseJSON ldtkOpts 442 | 443 | instance FromJSON Layer where 444 | parseJSON = genericParseJSON ldtkOpts 445 | 446 | instance FromJSON Level where 447 | parseJSON = genericParseJSON ldtkOpts 448 | 449 | instance FromJSON World where 450 | parseJSON = genericParseJSON ldtkOpts 451 | 452 | instance FromJSON Definitions where 453 | parseJSON = genericParseJSON ldtkOpts 454 | 455 | instance FromJSON EntityDef where 456 | parseJSON = genericParseJSON ldtkOpts 457 | 458 | instance FromJSON EnumDef where 459 | parseJSON = genericParseJSON ldtkOpts 460 | 461 | instance FromJSON EnumValueDef where 462 | parseJSON = genericParseJSON ldtkOpts 463 | 464 | instance FromJSON LayerDef where 465 | parseJSON = genericParseJSON ldtkOpts 466 | 467 | instance FromJSON GridValue where 468 | parseJSON = genericParseJSON ldtkOpts 469 | 470 | instance FromJSON TilesetDef where 471 | parseJSON = genericParseJSON ldtkOpts 472 | 473 | instance FromJSON CustomData where 474 | parseJSON = genericParseJSON ldtkOpts 475 | 476 | instance FromJSON EnumTag where 477 | parseJSON = genericParseJSON ldtkOpts 478 | 479 | -------------------------------------------------------------------------------- /stack.yaml: -------------------------------------------------------------------------------- 1 | resolver: lts-18.18 2 | 3 | packages: 4 | - . 5 | 6 | -------------------------------------------------------------------------------- /stack.yaml.lock: -------------------------------------------------------------------------------- 1 | # This file was autogenerated by Stack. 2 | # You should not edit this file by hand. 3 | # For more information, please see the documentation at: 4 | # https://docs.haskellstack.org/en/stable/lock_files 5 | 6 | packages: [] 7 | snapshots: 8 | - completed: 9 | size: 586296 10 | url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/18/18.yaml 11 | sha256: 63539429076b7ebbab6daa7656cfb079393bf644971156dc349d7c0453694ac2 12 | original: lts-18.18 13 | -------------------------------------------------------------------------------- /test/Spec.hs: -------------------------------------------------------------------------------- 1 | main :: IO () 2 | main = putStrLn "Test suite not yet implemented" 3 | -------------------------------------------------------------------------------- /test/ex.json: -------------------------------------------------------------------------------- 1 | { 2 | "__header__": { 3 | "fileType": "LDtk Project JSON", 4 | "app": "LDtk", 5 | "doc": "https://ldtk.io/json", 6 | "schema": "https://ldtk.io/files/JSON_SCHEMA.json", 7 | "appAuthor": "Sebastien 'deepnight' Benard", 8 | "appVersion": "1.2.2", 9 | "url": "https://ldtk.io" 10 | }, 11 | "iid": "a22d35f0-7820-11ed-b6fd-213e885f30da", 12 | "jsonVersion": "1.2.2", 13 | "appBuildId": 464719, 14 | "nextUid": 108, 15 | "identifierStyle": "Capitalize", 16 | "worldLayout": "LinearHorizontal", 17 | "worldGridWidth": 128, 18 | "worldGridHeight": 128, 19 | "defaultLevelWidth": 256, 20 | "defaultLevelHeight": 256, 21 | "defaultPivotX": 0, 22 | "defaultPivotY": 0, 23 | "defaultGridSize": 8, 24 | "bgColor": "#4A5066", 25 | "defaultLevelBgColor": "#1E2027", 26 | "minifyJson": false, 27 | "externalLevels": false, 28 | "exportTiled": false, 29 | "simplifiedExport": false, 30 | "imageExportMode": "None", 31 | "exportLevelBg": true, 32 | "pngFilePattern": null, 33 | "backupOnSave": false, 34 | "backupLimit": 10, 35 | "levelNamePattern": "%world_Level_%idx", 36 | "tutorialDesc": "IntGrid layers can paint tiles automatically using simple RULE SETS.\n\n - Press [SHIFT + R] to toggle auto-layer rendering\n - Click on the RULES button on the left to see/edit rules.", 37 | "customCommands": [], 38 | "flags": ["UseMultilinesType"], 39 | "defs": { "layers": [ 40 | { 41 | "__type": "IntGrid", 42 | "identifier": "IntGrid_layer", 43 | "type": "IntGrid", 44 | "uid": 72, 45 | "gridSize": 8, 46 | "guideGridWid": 0, 47 | "guideGridHei": 0, 48 | "displayOpacity": 1, 49 | "inactiveOpacity": 1, 50 | "hideInList": false, 51 | "hideFieldsWhenInactive": true, 52 | "canSelectWhenInactive": true, 53 | "pxOffsetX": 0, 54 | "pxOffsetY": 0, 55 | "parallaxFactorX": 0, 56 | "parallaxFactorY": 0, 57 | "parallaxScaling": true, 58 | "requiredTags": [], 59 | "excludedTags": [], 60 | "intGridValues": [{ "value": 1, "identifier": "walls", "color": "#FFFFFF" }], 61 | "autoRuleGroups": [ 62 | { "uid": 104, "name": "Plants", "active": true, "isOptional": false, "rules": [ 63 | { 64 | "uid": 99, 65 | "active": true, 66 | "size": 3, 67 | "tileIds": [126,127,147,148], 68 | "chance": 0.65, 69 | "breakOnMatch": false, 70 | "pattern": [0,1,0,0,-1,0,0,0,0], 71 | "flipX": false, 72 | "flipY": false, 73 | "xModulo": 1, 74 | "yModulo": 1, 75 | "xOffset": 0, 76 | "yOffset": 0, 77 | "checker": "None", 78 | "tileMode": "Single", 79 | "pivotX": 0, 80 | "pivotY": 0, 81 | "outOfBoundsValue": null, 82 | "perlinActive": false, 83 | "perlinSeed": 2671222, 84 | "perlinScale": 0.2, 85 | "perlinOctaves": 2 86 | } 87 | ], "usesWizard": false }, 88 | { "uid": 85, "name": "Dirt", "active": true, "isOptional": false, "rules": [ 89 | { 90 | "uid": 95, 91 | "active": true, 92 | "size": 3, 93 | "tileIds": [64], 94 | "chance": 0.3, 95 | "breakOnMatch": false, 96 | "pattern": [0,0,0,0,-1,0,0,1,0], 97 | "flipX": false, 98 | "flipY": false, 99 | "xModulo": 1, 100 | "yModulo": 1, 101 | "xOffset": 0, 102 | "yOffset": 0, 103 | "checker": "None", 104 | "tileMode": "Single", 105 | "pivotX": 0, 106 | "pivotY": 0, 107 | "outOfBoundsValue": null, 108 | "perlinActive": false, 109 | "perlinSeed": 336628, 110 | "perlinScale": 0.28, 111 | "perlinOctaves": 2 112 | }, 113 | { 114 | "uid": 98, 115 | "active": true, 116 | "size": 3, 117 | "tileIds": [92], 118 | "chance": 1, 119 | "breakOnMatch": true, 120 | "pattern": [0,-1,0,0,1,0,0,-1,0], 121 | "flipX": false, 122 | "flipY": false, 123 | "xModulo": 1, 124 | "yModulo": 1, 125 | "xOffset": 0, 126 | "yOffset": 0, 127 | "checker": "None", 128 | "tileMode": "Single", 129 | "pivotX": 0, 130 | "pivotY": 0, 131 | "outOfBoundsValue": null, 132 | "perlinActive": false, 133 | "perlinSeed": 7378060, 134 | "perlinScale": 0.2, 135 | "perlinOctaves": 2 136 | }, 137 | { 138 | "uid": 82, 139 | "active": true, 140 | "size": 3, 141 | "tileIds": [51], 142 | "chance": 1, 143 | "breakOnMatch": true, 144 | "pattern": [0,-1,0,-1,1,0,0,0,0], 145 | "flipX": true, 146 | "flipY": false, 147 | "xModulo": 1, 148 | "yModulo": 1, 149 | "xOffset": 0, 150 | "yOffset": 0, 151 | "checker": "None", 152 | "tileMode": "Single", 153 | "pivotX": 0, 154 | "pivotY": 0, 155 | "outOfBoundsValue": null, 156 | "perlinActive": false, 157 | "perlinSeed": 8451851, 158 | "perlinScale": 0.2, 159 | "perlinOctaves": 2 160 | }, 161 | { 162 | "uid": 83, 163 | "active": true, 164 | "size": 3, 165 | "tileIds": [75], 166 | "chance": 1, 167 | "breakOnMatch": true, 168 | "pattern": [0,0,0,-1,1,0,0,-1,0], 169 | "flipX": true, 170 | "flipY": false, 171 | "xModulo": 1, 172 | "yModulo": 1, 173 | "xOffset": 0, 174 | "yOffset": 0, 175 | "checker": "None", 176 | "tileMode": "Single", 177 | "pivotX": 0, 178 | "pivotY": 0, 179 | "outOfBoundsValue": null, 180 | "perlinActive": false, 181 | "perlinSeed": 182798, 182 | "perlinScale": 0.2, 183 | "perlinOctaves": 2 184 | }, 185 | { 186 | "uid": 76, 187 | "active": true, 188 | "size": 3, 189 | "tileIds": [52], 190 | "chance": 1, 191 | "breakOnMatch": true, 192 | "pattern": [0,-1,0,0,1,0,0,0,0], 193 | "flipX": false, 194 | "flipY": false, 195 | "xModulo": 1, 196 | "yModulo": 1, 197 | "xOffset": 0, 198 | "yOffset": 0, 199 | "checker": "None", 200 | "tileMode": "Single", 201 | "pivotX": 0, 202 | "pivotY": 0, 203 | "outOfBoundsValue": null, 204 | "perlinActive": false, 205 | "perlinSeed": 5373312, 206 | "perlinScale": 0.2, 207 | "perlinOctaves": 2 208 | }, 209 | { 210 | "uid": 84, 211 | "active": true, 212 | "size": 3, 213 | "tileIds": [76], 214 | "chance": 1, 215 | "breakOnMatch": true, 216 | "pattern": [0,0,0,0,1,0,0,-1,0], 217 | "flipX": false, 218 | "flipY": false, 219 | "xModulo": 1, 220 | "yModulo": 1, 221 | "xOffset": 0, 222 | "yOffset": 0, 223 | "checker": "None", 224 | "tileMode": "Single", 225 | "pivotX": 0, 226 | "pivotY": 0, 227 | "outOfBoundsValue": null, 228 | "perlinActive": false, 229 | "perlinSeed": 9668495, 230 | "perlinScale": 0.2, 231 | "perlinOctaves": 2 232 | }, 233 | { 234 | "uid": 81, 235 | "active": true, 236 | "size": 3, 237 | "tileIds": [63], 238 | "chance": 1, 239 | "breakOnMatch": true, 240 | "pattern": [0,0,0,-1,1,0,0,0,0], 241 | "flipX": true, 242 | "flipY": false, 243 | "xModulo": 1, 244 | "yModulo": 1, 245 | "xOffset": 0, 246 | "yOffset": 0, 247 | "checker": "None", 248 | "tileMode": "Single", 249 | "pivotX": 0, 250 | "pivotY": 0, 251 | "outOfBoundsValue": null, 252 | "perlinActive": false, 253 | "perlinSeed": 4414423, 254 | "perlinScale": 0.2, 255 | "perlinOctaves": 2 256 | }, 257 | { 258 | "uid": 73, 259 | "active": true, 260 | "size": 1, 261 | "tileIds": [1,2,3,4,5,6], 262 | "chance": 1, 263 | "breakOnMatch": true, 264 | "pattern": [1], 265 | "flipX": false, 266 | "flipY": false, 267 | "xModulo": 1, 268 | "yModulo": 1, 269 | "xOffset": 0, 270 | "yOffset": 0, 271 | "checker": "None", 272 | "tileMode": "Single", 273 | "pivotX": 0, 274 | "pivotY": 0, 275 | "outOfBoundsValue": null, 276 | "perlinActive": false, 277 | "perlinSeed": 3417420, 278 | "perlinScale": 0.2, 279 | "perlinOctaves": 2 280 | } 281 | ], "usesWizard": false } 282 | ], 283 | "autoSourceLayerDefUid": null, 284 | "tilesetDefUid": 9, 285 | "tilePivotX": 0, 286 | "tilePivotY": 0 287 | } 288 | ], "entities": [], "tilesets": [ 289 | { 290 | "__cWid": 12, 291 | "__cHei": 32, 292 | "identifier": "Cavernas_by_Adam_Saltsman", 293 | "uid": 9, 294 | "relPath": "../../../../usr/share/ldtk/extraFiles/samples/atlas/Cavernas_by_Adam_Saltsman.png", 295 | "embedAtlas": null, 296 | "pxWid": 96, 297 | "pxHei": 256, 298 | "tileGridSize": 8, 299 | "spacing": 0, 300 | "padding": 0, 301 | "tags": [], 302 | "tagsSourceEnumUid": null, 303 | "enumTags": [], 304 | "customData": [], 305 | "savedSelections": [ 306 | { "ids": [0,1,2,3,4,5,6], "mode": "Random" }, 307 | { "ids": [120,121,122], "mode": "Random" }, 308 | { "ids": [56,57,58,59], "mode": "Random" }, 309 | { "ids": [32,44,33,45,34,46,35,47], "mode": "Random" }, 310 | { "ids": [9,10], "mode": "Random" }, 311 | { "ids": [20,21,22], "mode": "Random" }, 312 | { "ids": [25,40], "mode": "Random" }, 313 | { "ids": [168,180], "mode": "Stamp" }, 314 | { "ids": [169,181], "mode": "Stamp" }, 315 | { "ids": [170,182], "mode": "Stamp" }, 316 | { "ids": [156,157,158], "mode": "Random" }, 317 | { "ids": [140,141], "mode": "Random" }, 318 | { "ids": [142,143], "mode": "Random" }, 319 | { "ids": [154,155], "mode": "Random" }, 320 | { "ids": [152,153], "mode": "Random" }, 321 | { "ids": [164,165], "mode": "Random" }, 322 | { "ids": [265,277,289], "mode": "Random" }, 323 | { "ids": [266,278,290], "mode": "Random" }, 324 | { "ids": [268,280,292], "mode": "Random" }, 325 | { "ids": [269,281,293], "mode": "Random" }, 326 | { "ids": [252,264,276,288], "mode": "Random" } 327 | ], 328 | "cachedPixelData": null 329 | } 330 | ], "enums": [], "externalEnums": [], "levelFields": [] }, 331 | "levels": [ 332 | { 333 | "identifier": "AutoLayer", 334 | "iid": "a2a50ff0-66b0-11ec-9cd7-c721746049b9", 335 | "uid": 70, 336 | "worldX": -1, 337 | "worldY": -1, 338 | "worldDepth": 0, 339 | "pxWid": 296, 340 | "pxHei": 176, 341 | "__bgColor": "#1E2027", 342 | "bgColor": null, 343 | "useAutoIdentifier": false, 344 | "bgRelPath": null, 345 | "bgPos": null, 346 | "bgPivotX": 0.5, 347 | "bgPivotY": 0.5, 348 | "__smartColor": "#838488", 349 | "__bgPos": null, 350 | "externalRelPath": null, 351 | "fieldInstances": [], 352 | "layerInstances": [ 353 | { 354 | "__identifier": "IntGrid_layer", 355 | "__type": "IntGrid", 356 | "__cWid": 37, 357 | "__cHei": 22, 358 | "__gridSize": 8, 359 | "__opacity": 1, 360 | "__pxTotalOffsetX": 0, 361 | "__pxTotalOffsetY": 0, 362 | "__tilesetDefUid": 9, 363 | "__tilesetRelPath": "../../../../usr/share/ldtk/extraFiles/samples/atlas/Cavernas_by_Adam_Saltsman.png", 364 | "iid": "a2a53701-66b0-11ec-9cd7-43934582bcfa", 365 | "levelId": 70, 366 | "layerDefUid": 72, 367 | "pxOffsetX": 0, 368 | "pxOffsetY": 0, 369 | "visible": true, 370 | "optionalRules": [], 371 | "intGridCsv": [ 372 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 373 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 374 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 375 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 376 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 377 | 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 378 | 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 379 | 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 380 | 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 381 | 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 382 | 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 383 | 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 384 | 0,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,0,0, 385 | 0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 386 | 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 387 | 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 388 | 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, 389 | 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, 390 | 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,1,1,1,1, 391 | 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,1,1, 392 | 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0, 393 | 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 394 | 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 395 | 0,0,0,0,1,1,1,1,1 396 | ], 397 | "autoLayerTiles": [ 398 | { "px": [96,40], "src": [32,0], "f": 0, "t": 4, "d": [73,197] }, 399 | { "px": [104,40], "src": [16,0], "f": 0, "t": 2, "d": [73,198] }, 400 | { "px": [112,40], "src": [40,0], "f": 0, "t": 5, "d": [73,199] }, 401 | { "px": [120,40], "src": [40,0], "f": 0, "t": 5, "d": [73,200] }, 402 | { "px": [128,40], "src": [8,0], "f": 0, "t": 1, "d": [73,201] }, 403 | { "px": [136,40], "src": [40,0], "f": 0, "t": 5, "d": [73,202] }, 404 | { "px": [144,40], "src": [40,0], "f": 0, "t": 5, "d": [73,203] }, 405 | { "px": [152,40], "src": [8,0], "f": 0, "t": 1, "d": [73,204] }, 406 | { "px": [160,40], "src": [16,0], "f": 0, "t": 2, "d": [73,205] }, 407 | { "px": [168,40], "src": [32,0], "f": 0, "t": 4, "d": [73,206] }, 408 | { "px": [176,40], "src": [24,0], "f": 0, "t": 3, "d": [73,207] }, 409 | { "px": [184,40], "src": [8,0], "f": 0, "t": 1, "d": [73,208] }, 410 | { "px": [192,40], "src": [48,0], "f": 0, "t": 6, "d": [73,209] }, 411 | { "px": [200,40], "src": [24,0], "f": 0, "t": 3, "d": [73,210] }, 412 | { "px": [208,40], "src": [40,0], "f": 0, "t": 5, "d": [73,211] }, 413 | { "px": [216,40], "src": [48,0], "f": 0, "t": 6, "d": [73,212] }, 414 | { "px": [224,40], "src": [40,0], "f": 0, "t": 5, "d": [73,213] }, 415 | { "px": [232,40], "src": [32,0], "f": 0, "t": 4, "d": [73,214] }, 416 | { "px": [240,40], "src": [40,0], "f": 0, "t": 5, "d": [73,215] }, 417 | { "px": [248,40], "src": [24,0], "f": 0, "t": 3, "d": [73,216] }, 418 | { "px": [256,40], "src": [16,0], "f": 0, "t": 2, "d": [73,217] }, 419 | { "px": [264,40], "src": [24,0], "f": 0, "t": 3, "d": [73,218] }, 420 | { "px": [272,40], "src": [48,0], "f": 0, "t": 6, "d": [73,219] }, 421 | { "px": [280,40], "src": [24,0], "f": 0, "t": 3, "d": [73,220] }, 422 | { "px": [288,40], "src": [48,0], "f": 0, "t": 6, "d": [73,221] }, 423 | { "px": [208,48], "src": [16,0], "f": 0, "t": 2, "d": [73,248] }, 424 | { "px": [216,48], "src": [8,0], "f": 0, "t": 1, "d": [73,249] }, 425 | { "px": [224,48], "src": [32,0], "f": 0, "t": 4, "d": [73,250] }, 426 | { "px": [232,48], "src": [32,0], "f": 0, "t": 4, "d": [73,251] }, 427 | { "px": [240,48], "src": [32,0], "f": 0, "t": 4, "d": [73,252] }, 428 | { "px": [248,48], "src": [16,0], "f": 0, "t": 2, "d": [73,253] }, 429 | { "px": [256,48], "src": [16,0], "f": 0, "t": 2, "d": [73,254] }, 430 | { "px": [264,48], "src": [32,0], "f": 0, "t": 4, "d": [73,255] }, 431 | { "px": [272,48], "src": [16,0], "f": 0, "t": 2, "d": [73,256] }, 432 | { "px": [280,48], "src": [24,0], "f": 0, "t": 3, "d": [73,257] }, 433 | { "px": [288,48], "src": [8,0], "f": 0, "t": 1, "d": [73,258] }, 434 | { "px": [216,56], "src": [32,0], "f": 0, "t": 4, "d": [73,286] }, 435 | { "px": [224,56], "src": [24,0], "f": 0, "t": 3, "d": [73,287] }, 436 | { "px": [232,56], "src": [32,0], "f": 0, "t": 4, "d": [73,288] }, 437 | { "px": [240,56], "src": [32,0], "f": 0, "t": 4, "d": [73,289] }, 438 | { "px": [248,56], "src": [24,0], "f": 0, "t": 3, "d": [73,290] }, 439 | { "px": [256,56], "src": [8,0], "f": 0, "t": 1, "d": [73,291] }, 440 | { "px": [264,56], "src": [32,0], "f": 0, "t": 4, "d": [73,292] }, 441 | { "px": [272,56], "src": [40,0], "f": 0, "t": 5, "d": [73,293] }, 442 | { "px": [280,56], "src": [16,0], "f": 0, "t": 2, "d": [73,294] }, 443 | { "px": [288,56], "src": [8,0], "f": 0, "t": 1, "d": [73,295] }, 444 | { "px": [0,64], "src": [40,0], "f": 0, "t": 5, "d": [73,296] }, 445 | { "px": [8,64], "src": [16,0], "f": 0, "t": 2, "d": [73,297] }, 446 | { "px": [16,64], "src": [8,0], "f": 0, "t": 1, "d": [73,298] }, 447 | { "px": [24,64], "src": [40,0], "f": 0, "t": 5, "d": [73,299] }, 448 | { "px": [216,64], "src": [24,0], "f": 0, "t": 3, "d": [73,323] }, 449 | { "px": [224,64], "src": [32,0], "f": 0, "t": 4, "d": [73,324] }, 450 | { "px": [232,64], "src": [48,0], "f": 0, "t": 6, "d": [73,325] }, 451 | { "px": [240,64], "src": [48,0], "f": 0, "t": 6, "d": [73,326] }, 452 | { "px": [248,64], "src": [8,0], "f": 0, "t": 1, "d": [73,327] }, 453 | { "px": [256,64], "src": [32,0], "f": 0, "t": 4, "d": [73,328] }, 454 | { "px": [264,64], "src": [16,0], "f": 0, "t": 2, "d": [73,329] }, 455 | { "px": [272,64], "src": [24,0], "f": 0, "t": 3, "d": [73,330] }, 456 | { "px": [280,64], "src": [48,0], "f": 0, "t": 6, "d": [73,331] }, 457 | { "px": [288,64], "src": [32,0], "f": 0, "t": 4, "d": [73,332] }, 458 | { "px": [216,72], "src": [8,0], "f": 0, "t": 1, "d": [73,360] }, 459 | { "px": [224,72], "src": [32,0], "f": 0, "t": 4, "d": [73,361] }, 460 | { "px": [232,72], "src": [40,0], "f": 0, "t": 5, "d": [73,362] }, 461 | { "px": [240,72], "src": [40,0], "f": 0, "t": 5, "d": [73,363] }, 462 | { "px": [248,72], "src": [48,0], "f": 0, "t": 6, "d": [73,364] }, 463 | { "px": [256,72], "src": [8,0], "f": 0, "t": 1, "d": [73,365] }, 464 | { "px": [264,72], "src": [48,0], "f": 0, "t": 6, "d": [73,366] }, 465 | { "px": [272,72], "src": [32,0], "f": 0, "t": 4, "d": [73,367] }, 466 | { "px": [280,72], "src": [24,0], "f": 0, "t": 3, "d": [73,368] }, 467 | { "px": [288,72], "src": [8,0], "f": 0, "t": 1, "d": [73,369] }, 468 | { "px": [216,80], "src": [32,0], "f": 0, "t": 4, "d": [73,397] }, 469 | { "px": [224,80], "src": [40,0], "f": 0, "t": 5, "d": [73,398] }, 470 | { "px": [232,80], "src": [8,0], "f": 0, "t": 1, "d": [73,399] }, 471 | { "px": [240,80], "src": [16,0], "f": 0, "t": 2, "d": [73,400] }, 472 | { "px": [248,80], "src": [16,0], "f": 0, "t": 2, "d": [73,401] }, 473 | { "px": [256,80], "src": [8,0], "f": 0, "t": 1, "d": [73,402] }, 474 | { "px": [264,80], "src": [8,0], "f": 0, "t": 1, "d": [73,403] }, 475 | { "px": [272,80], "src": [8,0], "f": 0, "t": 1, "d": [73,404] }, 476 | { "px": [280,80], "src": [40,0], "f": 0, "t": 5, "d": [73,405] }, 477 | { "px": [288,80], "src": [8,0], "f": 0, "t": 1, "d": [73,406] }, 478 | { "px": [256,88], "src": [40,0], "f": 0, "t": 5, "d": [73,439] }, 479 | { "px": [264,88], "src": [40,0], "f": 0, "t": 5, "d": [73,440] }, 480 | { "px": [272,88], "src": [8,0], "f": 0, "t": 1, "d": [73,441] }, 481 | { "px": [280,88], "src": [40,0], "f": 0, "t": 5, "d": [73,442] }, 482 | { "px": [288,88], "src": [16,0], "f": 0, "t": 2, "d": [73,443] }, 483 | { "px": [112,96], "src": [48,0], "f": 0, "t": 6, "d": [73,458] }, 484 | { "px": [120,96], "src": [48,0], "f": 0, "t": 6, "d": [73,459] }, 485 | { "px": [128,96], "src": [32,0], "f": 0, "t": 4, "d": [73,460] }, 486 | { "px": [136,96], "src": [32,0], "f": 0, "t": 4, "d": [73,461] }, 487 | { "px": [144,96], "src": [24,0], "f": 0, "t": 3, "d": [73,462] }, 488 | { "px": [264,96], "src": [8,0], "f": 0, "t": 1, "d": [73,477] }, 489 | { "px": [272,96], "src": [16,0], "f": 0, "t": 2, "d": [73,478] }, 490 | { "px": [280,96], "src": [8,0], "f": 0, "t": 1, "d": [73,479] }, 491 | { "px": [288,96], "src": [48,0], "f": 0, "t": 6, "d": [73,480] }, 492 | { "px": [48,104], "src": [40,0], "f": 0, "t": 5, "d": [73,487] }, 493 | { "px": [56,104], "src": [24,0], "f": 0, "t": 3, "d": [73,488] }, 494 | { "px": [64,104], "src": [8,0], "f": 0, "t": 1, "d": [73,489] }, 495 | { "px": [96,104], "src": [48,0], "f": 0, "t": 6, "d": [73,493] }, 496 | { "px": [104,104], "src": [16,0], "f": 0, "t": 2, "d": [73,494] }, 497 | { "px": [112,104], "src": [8,0], "f": 0, "t": 1, "d": [73,495] }, 498 | { "px": [120,104], "src": [48,0], "f": 0, "t": 6, "d": [73,496] }, 499 | { "px": [128,104], "src": [8,0], "f": 0, "t": 1, "d": [73,497] }, 500 | { "px": [136,104], "src": [40,0], "f": 0, "t": 5, "d": [73,498] }, 501 | { "px": [144,104], "src": [24,0], "f": 0, "t": 3, "d": [73,499] }, 502 | { "px": [264,104], "src": [8,0], "f": 0, "t": 1, "d": [73,514] }, 503 | { "px": [272,104], "src": [48,0], "f": 0, "t": 6, "d": [73,515] }, 504 | { "px": [280,104], "src": [16,0], "f": 0, "t": 2, "d": [73,516] }, 505 | { "px": [288,104], "src": [32,0], "f": 0, "t": 4, "d": [73,517] }, 506 | { "px": [0,112], "src": [16,0], "f": 0, "t": 2, "d": [73,518] }, 507 | { "px": [8,112], "src": [32,0], "f": 0, "t": 4, "d": [73,519] }, 508 | { "px": [16,112], "src": [32,0], "f": 0, "t": 4, "d": [73,520] }, 509 | { "px": [24,112], "src": [24,0], "f": 0, "t": 3, "d": [73,521] }, 510 | { "px": [32,112], "src": [16,0], "f": 0, "t": 2, "d": [73,522] }, 511 | { "px": [40,112], "src": [48,0], "f": 0, "t": 6, "d": [73,523] }, 512 | { "px": [48,112], "src": [16,0], "f": 0, "t": 2, "d": [73,524] }, 513 | { "px": [56,112], "src": [8,0], "f": 0, "t": 1, "d": [73,525] }, 514 | { "px": [64,112], "src": [40,0], "f": 0, "t": 5, "d": [73,526] }, 515 | { "px": [72,112], "src": [32,0], "f": 0, "t": 4, "d": [73,527] }, 516 | { "px": [80,112], "src": [8,0], "f": 0, "t": 1, "d": [73,528] }, 517 | { "px": [88,112], "src": [40,0], "f": 0, "t": 5, "d": [73,529] }, 518 | { "px": [96,112], "src": [32,0], "f": 0, "t": 4, "d": [73,530] }, 519 | { "px": [104,112], "src": [48,0], "f": 0, "t": 6, "d": [73,531] }, 520 | { "px": [112,112], "src": [32,0], "f": 0, "t": 4, "d": [73,532] }, 521 | { "px": [120,112], "src": [48,0], "f": 0, "t": 6, "d": [73,533] }, 522 | { "px": [128,112], "src": [24,0], "f": 0, "t": 3, "d": [73,534] }, 523 | { "px": [136,112], "src": [32,0], "f": 0, "t": 4, "d": [73,535] }, 524 | { "px": [144,112], "src": [8,0], "f": 0, "t": 1, "d": [73,536] }, 525 | { "px": [264,112], "src": [24,0], "f": 0, "t": 3, "d": [73,551] }, 526 | { "px": [272,112], "src": [32,0], "f": 0, "t": 4, "d": [73,552] }, 527 | { "px": [280,112], "src": [48,0], "f": 0, "t": 6, "d": [73,553] }, 528 | { "px": [288,112], "src": [24,0], "f": 0, "t": 3, "d": [73,554] }, 529 | { "px": [0,120], "src": [8,0], "f": 0, "t": 1, "d": [73,555] }, 530 | { "px": [8,120], "src": [24,0], "f": 0, "t": 3, "d": [73,556] }, 531 | { "px": [16,120], "src": [16,0], "f": 0, "t": 2, "d": [73,557] }, 532 | { "px": [24,120], "src": [24,0], "f": 0, "t": 3, "d": [73,558] }, 533 | { "px": [32,120], "src": [24,0], "f": 0, "t": 3, "d": [73,559] }, 534 | { "px": [40,120], "src": [40,0], "f": 0, "t": 5, "d": [73,560] }, 535 | { "px": [48,120], "src": [24,0], "f": 0, "t": 3, "d": [73,561] }, 536 | { "px": [56,120], "src": [40,0], "f": 0, "t": 5, "d": [73,562] }, 537 | { "px": [64,120], "src": [48,0], "f": 0, "t": 6, "d": [73,563] }, 538 | { "px": [72,120], "src": [16,0], "f": 0, "t": 2, "d": [73,564] }, 539 | { "px": [80,120], "src": [16,0], "f": 0, "t": 2, "d": [73,565] }, 540 | { "px": [88,120], "src": [32,0], "f": 0, "t": 4, "d": [73,566] }, 541 | { "px": [96,120], "src": [48,0], "f": 0, "t": 6, "d": [73,567] }, 542 | { "px": [104,120], "src": [16,0], "f": 0, "t": 2, "d": [73,568] }, 543 | { "px": [112,120], "src": [16,0], "f": 0, "t": 2, "d": [73,569] }, 544 | { "px": [120,120], "src": [16,0], "f": 0, "t": 2, "d": [73,570] }, 545 | { "px": [128,120], "src": [40,0], "f": 0, "t": 5, "d": [73,571] }, 546 | { "px": [136,120], "src": [48,0], "f": 0, "t": 6, "d": [73,572] }, 547 | { "px": [144,120], "src": [40,0], "f": 0, "t": 5, "d": [73,573] }, 548 | { "px": [264,120], "src": [8,0], "f": 0, "t": 1, "d": [73,588] }, 549 | { "px": [272,120], "src": [40,0], "f": 0, "t": 5, "d": [73,589] }, 550 | { "px": [280,120], "src": [40,0], "f": 0, "t": 5, "d": [73,590] }, 551 | { "px": [288,120], "src": [8,0], "f": 0, "t": 1, "d": [73,591] }, 552 | { "px": [0,128], "src": [40,0], "f": 0, "t": 5, "d": [73,592] }, 553 | { "px": [8,128], "src": [8,0], "f": 0, "t": 1, "d": [73,593] }, 554 | { "px": [16,128], "src": [32,0], "f": 0, "t": 4, "d": [73,594] }, 555 | { "px": [24,128], "src": [32,0], "f": 0, "t": 4, "d": [73,595] }, 556 | { "px": [32,128], "src": [32,0], "f": 0, "t": 4, "d": [73,596] }, 557 | { "px": [40,128], "src": [32,0], "f": 0, "t": 4, "d": [73,597] }, 558 | { "px": [48,128], "src": [24,0], "f": 0, "t": 3, "d": [73,598] }, 559 | { "px": [56,128], "src": [40,0], "f": 0, "t": 5, "d": [73,599] }, 560 | { "px": [64,128], "src": [48,0], "f": 0, "t": 6, "d": [73,600] }, 561 | { "px": [72,128], "src": [32,0], "f": 0, "t": 4, "d": [73,601] }, 562 | { "px": [80,128], "src": [16,0], "f": 0, "t": 2, "d": [73,602] }, 563 | { "px": [88,128], "src": [32,0], "f": 0, "t": 4, "d": [73,603] }, 564 | { "px": [96,128], "src": [40,0], "f": 0, "t": 5, "d": [73,604] }, 565 | { "px": [104,128], "src": [24,0], "f": 0, "t": 3, "d": [73,605] }, 566 | { "px": [112,128], "src": [24,0], "f": 0, "t": 3, "d": [73,606] }, 567 | { "px": [120,128], "src": [32,0], "f": 0, "t": 4, "d": [73,607] }, 568 | { "px": [128,128], "src": [40,0], "f": 0, "t": 5, "d": [73,608] }, 569 | { "px": [136,128], "src": [16,0], "f": 0, "t": 2, "d": [73,609] }, 570 | { "px": [144,128], "src": [16,0], "f": 0, "t": 2, "d": [73,610] }, 571 | { "px": [264,128], "src": [24,0], "f": 0, "t": 3, "d": [73,625] }, 572 | { "px": [272,128], "src": [8,0], "f": 0, "t": 1, "d": [73,626] }, 573 | { "px": [280,128], "src": [8,0], "f": 0, "t": 1, "d": [73,627] }, 574 | { "px": [288,128], "src": [40,0], "f": 0, "t": 5, "d": [73,628] }, 575 | { "px": [0,136], "src": [16,0], "f": 0, "t": 2, "d": [73,629] }, 576 | { "px": [8,136], "src": [24,0], "f": 0, "t": 3, "d": [73,630] }, 577 | { "px": [16,136], "src": [16,0], "f": 0, "t": 2, "d": [73,631] }, 578 | { "px": [24,136], "src": [32,0], "f": 0, "t": 4, "d": [73,632] }, 579 | { "px": [32,136], "src": [24,0], "f": 0, "t": 3, "d": [73,633] }, 580 | { "px": [40,136], "src": [8,0], "f": 0, "t": 1, "d": [73,634] }, 581 | { "px": [48,136], "src": [32,0], "f": 0, "t": 4, "d": [73,635] }, 582 | { "px": [56,136], "src": [24,0], "f": 0, "t": 3, "d": [73,636] }, 583 | { "px": [64,136], "src": [16,0], "f": 0, "t": 2, "d": [73,637] }, 584 | { "px": [72,136], "src": [32,0], "f": 0, "t": 4, "d": [73,638] }, 585 | { "px": [80,136], "src": [40,0], "f": 0, "t": 5, "d": [73,639] }, 586 | { "px": [88,136], "src": [24,0], "f": 0, "t": 3, "d": [73,640] }, 587 | { "px": [96,136], "src": [40,0], "f": 0, "t": 5, "d": [73,641] }, 588 | { "px": [104,136], "src": [16,0], "f": 0, "t": 2, "d": [73,642] }, 589 | { "px": [112,136], "src": [48,0], "f": 0, "t": 6, "d": [73,643] }, 590 | { "px": [120,136], "src": [40,0], "f": 0, "t": 5, "d": [73,644] }, 591 | { "px": [128,136], "src": [8,0], "f": 0, "t": 1, "d": [73,645] }, 592 | { "px": [136,136], "src": [40,0], "f": 0, "t": 5, "d": [73,646] }, 593 | { "px": [144,136], "src": [32,0], "f": 0, "t": 4, "d": [73,647] }, 594 | { "px": [264,136], "src": [16,0], "f": 0, "t": 2, "d": [73,662] }, 595 | { "px": [272,136], "src": [32,0], "f": 0, "t": 4, "d": [73,663] }, 596 | { "px": [280,136], "src": [24,0], "f": 0, "t": 3, "d": [73,664] }, 597 | { "px": [288,136], "src": [32,0], "f": 0, "t": 4, "d": [73,665] }, 598 | { "px": [0,144], "src": [40,0], "f": 0, "t": 5, "d": [73,666] }, 599 | { "px": [8,144], "src": [24,0], "f": 0, "t": 3, "d": [73,667] }, 600 | { "px": [16,144], "src": [16,0], "f": 0, "t": 2, "d": [73,668] }, 601 | { "px": [24,144], "src": [16,0], "f": 0, "t": 2, "d": [73,669] }, 602 | { "px": [32,144], "src": [32,0], "f": 0, "t": 4, "d": [73,670] }, 603 | { "px": [40,144], "src": [16,0], "f": 0, "t": 2, "d": [73,671] }, 604 | { "px": [48,144], "src": [32,0], "f": 0, "t": 4, "d": [73,672] }, 605 | { "px": [56,144], "src": [24,0], "f": 0, "t": 3, "d": [73,673] }, 606 | { "px": [64,144], "src": [8,0], "f": 0, "t": 1, "d": [73,674] }, 607 | { "px": [72,144], "src": [24,0], "f": 0, "t": 3, "d": [73,675] }, 608 | { "px": [80,144], "src": [32,0], "f": 0, "t": 4, "d": [73,676] }, 609 | { "px": [88,144], "src": [40,0], "f": 0, "t": 5, "d": [73,677] }, 610 | { "px": [96,144], "src": [24,0], "f": 0, "t": 3, "d": [73,678] }, 611 | { "px": [104,144], "src": [16,0], "f": 0, "t": 2, "d": [73,679] }, 612 | { "px": [112,144], "src": [40,0], "f": 0, "t": 5, "d": [73,680] }, 613 | { "px": [120,144], "src": [16,0], "f": 0, "t": 2, "d": [73,681] }, 614 | { "px": [128,144], "src": [48,0], "f": 0, "t": 6, "d": [73,682] }, 615 | { "px": [136,144], "src": [24,0], "f": 0, "t": 3, "d": [73,683] }, 616 | { "px": [144,144], "src": [48,0], "f": 0, "t": 6, "d": [73,684] }, 617 | { "px": [264,144], "src": [40,0], "f": 0, "t": 5, "d": [73,699] }, 618 | { "px": [272,144], "src": [48,0], "f": 0, "t": 6, "d": [73,700] }, 619 | { "px": [280,144], "src": [40,0], "f": 0, "t": 5, "d": [73,701] }, 620 | { "px": [288,144], "src": [48,0], "f": 0, "t": 6, "d": [73,702] }, 621 | { "px": [0,152], "src": [32,0], "f": 0, "t": 4, "d": [73,703] }, 622 | { "px": [8,152], "src": [24,0], "f": 0, "t": 3, "d": [73,704] }, 623 | { "px": [16,152], "src": [8,0], "f": 0, "t": 1, "d": [73,705] }, 624 | { "px": [24,152], "src": [40,0], "f": 0, "t": 5, "d": [73,706] }, 625 | { "px": [32,152], "src": [16,0], "f": 0, "t": 2, "d": [73,707] }, 626 | { "px": [40,152], "src": [48,0], "f": 0, "t": 6, "d": [73,708] }, 627 | { "px": [48,152], "src": [40,0], "f": 0, "t": 5, "d": [73,709] }, 628 | { "px": [56,152], "src": [8,0], "f": 0, "t": 1, "d": [73,710] }, 629 | { "px": [64,152], "src": [8,0], "f": 0, "t": 1, "d": [73,711] }, 630 | { "px": [72,152], "src": [32,0], "f": 0, "t": 4, "d": [73,712] }, 631 | { "px": [80,152], "src": [16,0], "f": 0, "t": 2, "d": [73,713] }, 632 | { "px": [88,152], "src": [40,0], "f": 0, "t": 5, "d": [73,714] }, 633 | { "px": [96,152], "src": [48,0], "f": 0, "t": 6, "d": [73,715] }, 634 | { "px": [104,152], "src": [40,0], "f": 0, "t": 5, "d": [73,716] }, 635 | { "px": [112,152], "src": [24,0], "f": 0, "t": 3, "d": [73,717] }, 636 | { "px": [120,152], "src": [48,0], "f": 0, "t": 6, "d": [73,718] }, 637 | { "px": [128,152], "src": [8,0], "f": 0, "t": 1, "d": [73,719] }, 638 | { "px": [136,152], "src": [40,0], "f": 0, "t": 5, "d": [73,720] }, 639 | { "px": [144,152], "src": [8,0], "f": 0, "t": 1, "d": [73,721] }, 640 | { "px": [264,152], "src": [16,0], "f": 0, "t": 2, "d": [73,736] }, 641 | { "px": [272,152], "src": [8,0], "f": 0, "t": 1, "d": [73,737] }, 642 | { "px": [280,152], "src": [32,0], "f": 0, "t": 4, "d": [73,738] }, 643 | { "px": [288,152], "src": [48,0], "f": 0, "t": 6, "d": [73,739] }, 644 | { "px": [0,160], "src": [48,0], "f": 0, "t": 6, "d": [73,740] }, 645 | { "px": [8,160], "src": [24,0], "f": 0, "t": 3, "d": [73,741] }, 646 | { "px": [16,160], "src": [16,0], "f": 0, "t": 2, "d": [73,742] }, 647 | { "px": [24,160], "src": [32,0], "f": 0, "t": 4, "d": [73,743] }, 648 | { "px": [32,160], "src": [8,0], "f": 0, "t": 1, "d": [73,744] }, 649 | { "px": [40,160], "src": [48,0], "f": 0, "t": 6, "d": [73,745] }, 650 | { "px": [48,160], "src": [48,0], "f": 0, "t": 6, "d": [73,746] }, 651 | { "px": [56,160], "src": [8,0], "f": 0, "t": 1, "d": [73,747] }, 652 | { "px": [64,160], "src": [32,0], "f": 0, "t": 4, "d": [73,748] }, 653 | { "px": [72,160], "src": [32,0], "f": 0, "t": 4, "d": [73,749] }, 654 | { "px": [80,160], "src": [8,0], "f": 0, "t": 1, "d": [73,750] }, 655 | { "px": [88,160], "src": [8,0], "f": 0, "t": 1, "d": [73,751] }, 656 | { "px": [96,160], "src": [8,0], "f": 0, "t": 1, "d": [73,752] }, 657 | { "px": [104,160], "src": [32,0], "f": 0, "t": 4, "d": [73,753] }, 658 | { "px": [112,160], "src": [24,0], "f": 0, "t": 3, "d": [73,754] }, 659 | { "px": [120,160], "src": [48,0], "f": 0, "t": 6, "d": [73,755] }, 660 | { "px": [128,160], "src": [16,0], "f": 0, "t": 2, "d": [73,756] }, 661 | { "px": [136,160], "src": [16,0], "f": 0, "t": 2, "d": [73,757] }, 662 | { "px": [144,160], "src": [32,0], "f": 0, "t": 4, "d": [73,758] }, 663 | { "px": [264,160], "src": [40,0], "f": 0, "t": 5, "d": [73,773] }, 664 | { "px": [272,160], "src": [8,0], "f": 0, "t": 1, "d": [73,774] }, 665 | { "px": [280,160], "src": [8,0], "f": 0, "t": 1, "d": [73,775] }, 666 | { "px": [288,160], "src": [8,0], "f": 0, "t": 1, "d": [73,776] }, 667 | { "px": [0,168], "src": [16,0], "f": 0, "t": 2, "d": [73,777] }, 668 | { "px": [8,168], "src": [24,0], "f": 0, "t": 3, "d": [73,778] }, 669 | { "px": [16,168], "src": [32,0], "f": 0, "t": 4, "d": [73,779] }, 670 | { "px": [24,168], "src": [8,0], "f": 0, "t": 1, "d": [73,780] }, 671 | { "px": [32,168], "src": [48,0], "f": 0, "t": 6, "d": [73,781] }, 672 | { "px": [40,168], "src": [40,0], "f": 0, "t": 5, "d": [73,782] }, 673 | { "px": [48,168], "src": [24,0], "f": 0, "t": 3, "d": [73,783] }, 674 | { "px": [56,168], "src": [8,0], "f": 0, "t": 1, "d": [73,784] }, 675 | { "px": [64,168], "src": [40,0], "f": 0, "t": 5, "d": [73,785] }, 676 | { "px": [72,168], "src": [40,0], "f": 0, "t": 5, "d": [73,786] }, 677 | { "px": [80,168], "src": [8,0], "f": 0, "t": 1, "d": [73,787] }, 678 | { "px": [88,168], "src": [32,0], "f": 0, "t": 4, "d": [73,788] }, 679 | { "px": [96,168], "src": [40,0], "f": 0, "t": 5, "d": [73,789] }, 680 | { "px": [104,168], "src": [16,0], "f": 0, "t": 2, "d": [73,790] }, 681 | { "px": [112,168], "src": [32,0], "f": 0, "t": 4, "d": [73,791] }, 682 | { "px": [120,168], "src": [48,0], "f": 0, "t": 6, "d": [73,792] }, 683 | { "px": [128,168], "src": [8,0], "f": 0, "t": 1, "d": [73,793] }, 684 | { "px": [136,168], "src": [8,0], "f": 0, "t": 1, "d": [73,794] }, 685 | { "px": [144,168], "src": [8,0], "f": 0, "t": 1, "d": [73,795] }, 686 | { "px": [264,168], "src": [40,0], "f": 0, "t": 5, "d": [73,810] }, 687 | { "px": [272,168], "src": [48,0], "f": 0, "t": 6, "d": [73,811] }, 688 | { "px": [280,168], "src": [32,0], "f": 0, "t": 4, "d": [73,812] }, 689 | { "px": [288,168], "src": [16,0], "f": 0, "t": 2, "d": [73,813] }, 690 | { "px": [88,40], "src": [24,40], "f": 0, "t": 63, "d": [81,196] }, 691 | { "px": [208,56], "src": [24,40], "f": 0, "t": 63, "d": [81,285] }, 692 | { "px": [208,64], "src": [24,40], "f": 0, "t": 63, "d": [81,322] }, 693 | { "px": [208,72], "src": [24,40], "f": 0, "t": 63, "d": [81,359] }, 694 | { "px": [208,80], "src": [24,40], "f": 0, "t": 63, "d": [81,396] }, 695 | { "px": [152,96], "src": [24,40], "f": 1, "t": 63, "d": [81,463] }, 696 | { "px": [256,96], "src": [24,40], "f": 0, "t": 63, "d": [81,476] }, 697 | { "px": [152,104], "src": [24,40], "f": 1, "t": 63, "d": [81,500] }, 698 | { "px": [256,104], "src": [24,40], "f": 0, "t": 63, "d": [81,513] }, 699 | { "px": [152,112], "src": [24,40], "f": 1, "t": 63, "d": [81,537] }, 700 | { "px": [256,112], "src": [24,40], "f": 0, "t": 63, "d": [81,550] }, 701 | { "px": [152,120], "src": [24,40], "f": 1, "t": 63, "d": [81,574] }, 702 | { "px": [256,120], "src": [24,40], "f": 0, "t": 63, "d": [81,587] }, 703 | { "px": [152,128], "src": [24,40], "f": 1, "t": 63, "d": [81,611] }, 704 | { "px": [256,128], "src": [24,40], "f": 0, "t": 63, "d": [81,624] }, 705 | { "px": [152,136], "src": [24,40], "f": 1, "t": 63, "d": [81,648] }, 706 | { "px": [256,136], "src": [24,40], "f": 0, "t": 63, "d": [81,661] }, 707 | { "px": [152,144], "src": [24,40], "f": 1, "t": 63, "d": [81,685] }, 708 | { "px": [256,144], "src": [24,40], "f": 0, "t": 63, "d": [81,698] }, 709 | { "px": [152,152], "src": [24,40], "f": 1, "t": 63, "d": [81,722] }, 710 | { "px": [256,152], "src": [24,40], "f": 0, "t": 63, "d": [81,735] }, 711 | { "px": [152,160], "src": [24,40], "f": 1, "t": 63, "d": [81,759] }, 712 | { "px": [256,160], "src": [24,40], "f": 0, "t": 63, "d": [81,772] }, 713 | { "px": [152,168], "src": [24,40], "f": 1, "t": 63, "d": [81,796] }, 714 | { "px": [256,168], "src": [24,40], "f": 0, "t": 63, "d": [81,809] }, 715 | { "px": [96,48], "src": [32,48], "f": 0, "t": 76, "d": [84,234] }, 716 | { "px": [104,48], "src": [32,48], "f": 0, "t": 76, "d": [84,235] }, 717 | { "px": [112,48], "src": [32,48], "f": 0, "t": 76, "d": [84,236] }, 718 | { "px": [120,48], "src": [32,48], "f": 0, "t": 76, "d": [84,237] }, 719 | { "px": [128,48], "src": [32,48], "f": 0, "t": 76, "d": [84,238] }, 720 | { "px": [136,48], "src": [32,48], "f": 0, "t": 76, "d": [84,239] }, 721 | { "px": [144,48], "src": [32,48], "f": 0, "t": 76, "d": [84,240] }, 722 | { "px": [152,48], "src": [32,48], "f": 0, "t": 76, "d": [84,241] }, 723 | { "px": [160,48], "src": [32,48], "f": 0, "t": 76, "d": [84,242] }, 724 | { "px": [168,48], "src": [32,48], "f": 0, "t": 76, "d": [84,243] }, 725 | { "px": [176,48], "src": [32,48], "f": 0, "t": 76, "d": [84,244] }, 726 | { "px": [184,48], "src": [32,48], "f": 0, "t": 76, "d": [84,245] }, 727 | { "px": [192,48], "src": [32,48], "f": 0, "t": 76, "d": [84,246] }, 728 | { "px": [200,48], "src": [32,48], "f": 0, "t": 76, "d": [84,247] }, 729 | { "px": [32,64], "src": [32,48], "f": 0, "t": 76, "d": [84,300] }, 730 | { "px": [40,64], "src": [32,48], "f": 0, "t": 76, "d": [84,301] }, 731 | { "px": [48,64], "src": [32,48], "f": 0, "t": 76, "d": [84,302] }, 732 | { "px": [0,72], "src": [32,48], "f": 0, "t": 76, "d": [84,333] }, 733 | { "px": [8,72], "src": [32,48], "f": 0, "t": 76, "d": [84,334] }, 734 | { "px": [16,72], "src": [32,48], "f": 0, "t": 76, "d": [84,335] }, 735 | { "px": [216,88], "src": [32,48], "f": 0, "t": 76, "d": [84,434] }, 736 | { "px": [224,88], "src": [32,48], "f": 0, "t": 76, "d": [84,435] }, 737 | { "px": [232,88], "src": [32,48], "f": 0, "t": 76, "d": [84,436] }, 738 | { "px": [240,88], "src": [32,48], "f": 0, "t": 76, "d": [84,437] }, 739 | { "px": [248,88], "src": [32,48], "f": 0, "t": 76, "d": [84,438] }, 740 | { "px": [96,32], "src": [32,32], "f": 0, "t": 52, "d": [76,160] }, 741 | { "px": [104,32], "src": [32,32], "f": 0, "t": 52, "d": [76,161] }, 742 | { "px": [112,32], "src": [32,32], "f": 0, "t": 52, "d": [76,162] }, 743 | { "px": [120,32], "src": [32,32], "f": 0, "t": 52, "d": [76,163] }, 744 | { "px": [128,32], "src": [32,32], "f": 0, "t": 52, "d": [76,164] }, 745 | { "px": [136,32], "src": [32,32], "f": 0, "t": 52, "d": [76,165] }, 746 | { "px": [144,32], "src": [32,32], "f": 0, "t": 52, "d": [76,166] }, 747 | { "px": [152,32], "src": [32,32], "f": 0, "t": 52, "d": [76,167] }, 748 | { "px": [160,32], "src": [32,32], "f": 0, "t": 52, "d": [76,168] }, 749 | { "px": [168,32], "src": [32,32], "f": 0, "t": 52, "d": [76,169] }, 750 | { "px": [176,32], "src": [32,32], "f": 0, "t": 52, "d": [76,170] }, 751 | { "px": [184,32], "src": [32,32], "f": 0, "t": 52, "d": [76,171] }, 752 | { "px": [192,32], "src": [32,32], "f": 0, "t": 52, "d": [76,172] }, 753 | { "px": [200,32], "src": [32,32], "f": 0, "t": 52, "d": [76,173] }, 754 | { "px": [208,32], "src": [32,32], "f": 0, "t": 52, "d": [76,174] }, 755 | { "px": [216,32], "src": [32,32], "f": 0, "t": 52, "d": [76,175] }, 756 | { "px": [224,32], "src": [32,32], "f": 0, "t": 52, "d": [76,176] }, 757 | { "px": [232,32], "src": [32,32], "f": 0, "t": 52, "d": [76,177] }, 758 | { "px": [240,32], "src": [32,32], "f": 0, "t": 52, "d": [76,178] }, 759 | { "px": [248,32], "src": [32,32], "f": 0, "t": 52, "d": [76,179] }, 760 | { "px": [256,32], "src": [32,32], "f": 0, "t": 52, "d": [76,180] }, 761 | { "px": [264,32], "src": [32,32], "f": 0, "t": 52, "d": [76,181] }, 762 | { "px": [272,32], "src": [32,32], "f": 0, "t": 52, "d": [76,182] }, 763 | { "px": [280,32], "src": [32,32], "f": 0, "t": 52, "d": [76,183] }, 764 | { "px": [288,32], "src": [32,32], "f": 0, "t": 52, "d": [76,184] }, 765 | { "px": [0,56], "src": [32,32], "f": 0, "t": 52, "d": [76,259] }, 766 | { "px": [8,56], "src": [32,32], "f": 0, "t": 52, "d": [76,260] }, 767 | { "px": [16,56], "src": [32,32], "f": 0, "t": 52, "d": [76,261] }, 768 | { "px": [24,56], "src": [32,32], "f": 0, "t": 52, "d": [76,262] }, 769 | { "px": [32,56], "src": [32,32], "f": 0, "t": 52, "d": [76,263] }, 770 | { "px": [40,56], "src": [32,32], "f": 0, "t": 52, "d": [76,264] }, 771 | { "px": [48,56], "src": [32,32], "f": 0, "t": 52, "d": [76,265] }, 772 | { "px": [120,88], "src": [32,32], "f": 0, "t": 52, "d": [76,422] }, 773 | { "px": [128,88], "src": [32,32], "f": 0, "t": 52, "d": [76,423] }, 774 | { "px": [136,88], "src": [32,32], "f": 0, "t": 52, "d": [76,424] }, 775 | { "px": [144,88], "src": [32,32], "f": 0, "t": 52, "d": [76,425] }, 776 | { "px": [152,88], "src": [32,32], "f": 0, "t": 52, "d": [76,426] }, 777 | { "px": [56,96], "src": [32,32], "f": 0, "t": 52, "d": [76,451] }, 778 | { "px": [104,96], "src": [32,32], "f": 0, "t": 52, "d": [76,457] }, 779 | { "px": [0,104], "src": [32,32], "f": 0, "t": 52, "d": [76,481] }, 780 | { "px": [8,104], "src": [32,32], "f": 0, "t": 52, "d": [76,482] }, 781 | { "px": [16,104], "src": [32,32], "f": 0, "t": 52, "d": [76,483] }, 782 | { "px": [24,104], "src": [32,32], "f": 0, "t": 52, "d": [76,484] }, 783 | { "px": [32,104], "src": [32,32], "f": 0, "t": 52, "d": [76,485] }, 784 | { "px": [40,104], "src": [32,32], "f": 0, "t": 52, "d": [76,486] }, 785 | { "px": [72,104], "src": [32,32], "f": 0, "t": 52, "d": [76,490] }, 786 | { "px": [80,104], "src": [32,32], "f": 0, "t": 52, "d": [76,491] }, 787 | { "px": [88,104], "src": [32,32], "f": 0, "t": 52, "d": [76,492] }, 788 | { "px": [200,144], "src": [32,32], "f": 0, "t": 52, "d": [76,691] }, 789 | { "px": [88,48], "src": [24,48], "f": 0, "t": 75, "d": [83,233] }, 790 | { "px": [56,64], "src": [24,48], "f": 1, "t": 75, "d": [83,303] }, 791 | { "px": [24,72], "src": [24,48], "f": 1, "t": 75, "d": [83,336] }, 792 | { "px": [208,88], "src": [24,48], "f": 0, "t": 75, "d": [83,433] }, 793 | { "px": [192,144], "src": [24,48], "f": 0, "t": 75, "d": [83,690] }, 794 | { "px": [200,152], "src": [24,48], "f": 0, "t": 75, "d": [83,728] }, 795 | { "px": [208,152], "src": [24,48], "f": 1, "t": 75, "d": [83,729] }, 796 | { "px": [88,32], "src": [24,32], "f": 0, "t": 51, "d": [82,159] }, 797 | { "px": [56,56], "src": [24,32], "f": 1, "t": 51, "d": [82,266] }, 798 | { "px": [112,88], "src": [24,32], "f": 0, "t": 51, "d": [82,421] }, 799 | { "px": [48,96], "src": [24,32], "f": 0, "t": 51, "d": [82,450] }, 800 | { "px": [64,96], "src": [24,32], "f": 1, "t": 51, "d": [82,452] }, 801 | { "px": [96,96], "src": [24,32], "f": 0, "t": 51, "d": [82,456] }, 802 | { "px": [192,136], "src": [24,32], "f": 1, "t": 51, "d": [82,653] }, 803 | { "px": [208,144], "src": [24,32], "f": 1, "t": 51, "d": [82,692] }, 804 | { "px": [160,88], "src": [64,56], "f": 0, "t": 92, "d": [98,427] }, 805 | { "px": [168,88], "src": [64,56], "f": 0, "t": 92, "d": [98,428] }, 806 | { "px": [184,136], "src": [64,56], "f": 0, "t": 92, "d": [98,652] }, 807 | { "px": [112,24], "src": [32,40], "f": 0, "t": 64, "d": [95,125] }, 808 | { "px": [152,24], "src": [32,40], "f": 0, "t": 64, "d": [95,130] }, 809 | { "px": [176,24], "src": [32,40], "f": 0, "t": 64, "d": [95,133] }, 810 | { "px": [224,24], "src": [32,40], "f": 0, "t": 64, "d": [95,139] }, 811 | { "px": [248,24], "src": [32,40], "f": 0, "t": 64, "d": [95,142] }, 812 | { "px": [288,24], "src": [32,40], "f": 0, "t": 64, "d": [95,147] }, 813 | { "px": [24,48], "src": [32,40], "f": 0, "t": 64, "d": [95,225] }, 814 | { "px": [120,80], "src": [32,40], "f": 0, "t": 64, "d": [95,385] }, 815 | { "px": [128,80], "src": [32,40], "f": 0, "t": 64, "d": [95,386] }, 816 | { "px": [168,80], "src": [32,40], "f": 0, "t": 64, "d": [95,391] }, 817 | { "px": [96,88], "src": [32,40], "f": 0, "t": 64, "d": [95,419] }, 818 | { "px": [16,96], "src": [32,40], "f": 0, "t": 64, "d": [95,446] }, 819 | { "px": [40,96], "src": [32,40], "f": 0, "t": 64, "d": [95,449] }, 820 | { "px": [72,96], "src": [32,40], "f": 0, "t": 64, "d": [95,453] }, 821 | { "px": [184,128], "src": [32,40], "f": 0, "t": 64, "d": [95,615] }, 822 | { "px": [192,128], "src": [32,40], "f": 0, "t": 64, "d": [95,616] }, 823 | { "px": [96,56], "src": [48,80], "f": 0, "t": 126, "d": [99,271] }, 824 | { "px": [112,56], "src": [32,96], "f": 0, "t": 148, "d": [99,273] }, 825 | { "px": [120,56], "src": [48,80], "f": 0, "t": 126, "d": [99,274] }, 826 | { "px": [128,56], "src": [48,80], "f": 0, "t": 126, "d": [99,275] }, 827 | { "px": [136,56], "src": [56,80], "f": 0, "t": 127, "d": [99,276] }, 828 | { "px": [160,56], "src": [56,80], "f": 0, "t": 127, "d": [99,279] }, 829 | { "px": [176,56], "src": [32,96], "f": 0, "t": 148, "d": [99,281] }, 830 | { "px": [184,56], "src": [24,96], "f": 0, "t": 147, "d": [99,282] }, 831 | { "px": [32,72], "src": [56,80], "f": 0, "t": 127, "d": [99,337] }, 832 | { "px": [40,72], "src": [48,80], "f": 0, "t": 126, "d": [99,338] }, 833 | { "px": [48,72], "src": [24,96], "f": 0, "t": 147, "d": [99,339] }, 834 | { "px": [56,72], "src": [32,96], "f": 0, "t": 148, "d": [99,340] }, 835 | { "px": [8,80], "src": [48,80], "f": 0, "t": 126, "d": [99,371] }, 836 | { "px": [16,80], "src": [48,80], "f": 0, "t": 126, "d": [99,372] }, 837 | { "px": [168,96], "src": [24,96], "f": 0, "t": 147, "d": [99,465] }, 838 | { "px": [232,96], "src": [24,96], "f": 0, "t": 147, "d": [99,473] }, 839 | { "px": [240,96], "src": [56,80], "f": 0, "t": 127, "d": [99,474] }, 840 | { "px": [248,96], "src": [56,80], "f": 0, "t": 127, "d": [99,475] }, 841 | { "px": [200,160], "src": [32,96], "f": 0, "t": 148, "d": [99,765] }, 842 | { "px": [208,160], "src": [48,80], "f": 0, "t": 126, "d": [99,766] } 843 | ], 844 | "seed": 6134941, 845 | "overrideTilesetUid": null, 846 | "gridTiles": [], 847 | "entityInstances": [] 848 | } 849 | ], 850 | "__neighbours": [] 851 | } 852 | ], 853 | "worlds": [] 854 | } --------------------------------------------------------------------------------