From dadc08d16e4dd78fd9a87d436762b272de601867 Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Sat, 17 Feb 2024 00:40:03 -0500 Subject: [PATCH] Add Terestallization mechanics Add Terestallization mechanics; implement Stellar type; fix bug with held item weights --- public/images/effects/tera.png | Bin 0 -> 15235 bytes public/images/effects/tera_sparkle.json | 293 ++ public/images/effects/tera_sparkle.png | Bin 0 -> 191 bytes public/images/items.json | 4686 +++++++++-------- public/images/items.png | Bin 38389 -> 40990 bytes public/images/items/bug_tera_shard.png | Bin 0 -> 349 bytes public/images/items/dark_tera_shard.png | Bin 0 -> 349 bytes public/images/items/dragon_tera_shard.png | Bin 0 -> 349 bytes public/images/items/electric_tera_shard.png | Bin 0 -> 349 bytes public/images/items/fairy_tera_shard.png | Bin 0 -> 349 bytes public/images/items/fighting_tera_shard.png | Bin 0 -> 349 bytes public/images/items/fire_tera_shard.png | Bin 0 -> 349 bytes public/images/items/flying_tera_shard.png | Bin 0 -> 354 bytes public/images/items/ghost_tera_shard.png | Bin 0 -> 354 bytes public/images/items/grass_tera_shard.png | Bin 0 -> 339 bytes public/images/items/ground_tera_shard.png | Bin 0 -> 349 bytes public/images/items/ice_tera_shard.png | Bin 0 -> 343 bytes public/images/items/normal_tera_shard.png | Bin 0 -> 349 bytes public/images/items/poison_tera_shard.png | Bin 0 -> 349 bytes public/images/items/psychic_tera_shard.png | Bin 0 -> 349 bytes public/images/items/rock_tera_shard.png | Bin 0 -> 349 bytes public/images/items/steel_tera_shard.png | Bin 0 -> 349 bytes public/images/items/stellar_tera_shard.png | Bin 0 -> 408 bytes public/images/items/tera_orb.png | Bin 0 -> 391 bytes public/images/items/water_tera_shard.png | Bin 0 -> 349 bytes public/images/types.json | 25 +- public/images/types.png | Bin 1646 -> 2142 bytes public/images/types/stellar.png | Bin 0 -> 813 bytes public/images/ui/icon_tera.png | Bin 0 -> 162 bytes public/images/ui/type_tera.png | Bin 0 -> 234 bytes src/battle-phases.ts | 15 +- src/battle-scene.ts | 88 +- src/battle.ts | 2 +- src/data/ability.ts | 6 +- src/data/battle-anims.ts | 4 +- src/data/egg.ts | 4 +- src/data/move.ts | 2 +- src/data/pokemon-evolutions.ts | 2 +- src/data/pokemon-species.ts | 1 + src/data/trainer-config.ts | 47 +- src/data/type.ts | 50 +- src/evolution-phase.ts | 5 +- src/form-change-phase.ts | 5 +- src/modifier/modifier-type.ts | 43 +- src/modifier/modifier.ts | 116 +- src/pipelines/field-sprite.ts | 19 +- src/pipelines/sprite.ts | 151 +- src/pokemon.ts | 93 +- .../pokemon-icon-anim-handler.ts | 0 src/sprite/pokemon-sprite-sparkle-handler.ts | 70 + src/system/achv.ts | 3 + src/system/game-data.ts | 2 +- src/trainer.ts | 13 +- src/ui/battle-info.ts | 49 +- src/ui/battle-message-ui-handler.ts | 2 +- src/ui/egg-list-ui-handler.ts | 2 +- src/ui/party-ui-handler.ts | 4 +- src/ui/starter-select-ui-handler.ts | 5 +- src/ui/summary-ui-handler.ts | 24 +- src/utils.ts | 12 + 60 files changed, 3585 insertions(+), 2258 deletions(-) create mode 100644 public/images/effects/tera.png create mode 100644 public/images/effects/tera_sparkle.json create mode 100644 public/images/effects/tera_sparkle.png create mode 100644 public/images/items/bug_tera_shard.png create mode 100644 public/images/items/dark_tera_shard.png create mode 100644 public/images/items/dragon_tera_shard.png create mode 100644 public/images/items/electric_tera_shard.png create mode 100644 public/images/items/fairy_tera_shard.png create mode 100644 public/images/items/fighting_tera_shard.png create mode 100644 public/images/items/fire_tera_shard.png create mode 100644 public/images/items/flying_tera_shard.png create mode 100644 public/images/items/ghost_tera_shard.png create mode 100644 public/images/items/grass_tera_shard.png create mode 100644 public/images/items/ground_tera_shard.png create mode 100644 public/images/items/ice_tera_shard.png create mode 100644 public/images/items/normal_tera_shard.png create mode 100644 public/images/items/poison_tera_shard.png create mode 100644 public/images/items/psychic_tera_shard.png create mode 100644 public/images/items/rock_tera_shard.png create mode 100644 public/images/items/steel_tera_shard.png create mode 100644 public/images/items/stellar_tera_shard.png create mode 100644 public/images/items/tera_orb.png create mode 100644 public/images/items/water_tera_shard.png create mode 100644 public/images/types/stellar.png create mode 100644 public/images/ui/icon_tera.png create mode 100644 public/images/ui/type_tera.png rename src/{ui => sprite}/pokemon-icon-anim-handler.ts (100%) create mode 100644 src/sprite/pokemon-sprite-sparkle-handler.ts diff --git a/public/images/effects/tera.png b/public/images/effects/tera.png new file mode 100644 index 0000000000000000000000000000000000000000..e378d1c051c4a5f86bab383748f7fa21d1b61e10 GIT binary patch literal 15235 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 literal 0 HcmV?d00001 diff --git a/public/images/items.json b/public/images/items.json index 77b7ed7f3..a09745d70 100644 --- a/public/images/items.json +++ b/public/images/items.json @@ -4,8 +4,8 @@ "image": "items.png", "format": "RGBA8888", "size": { - "w": 342, - "h": 342 + "w": 356, + "h": 356 }, "scale": 1, "frames": [ @@ -388,7 +388,7 @@ } }, { - "filename": "elixir", + "filename": "muscle_band", "rotated": false, "trimmed": true, "sourceSize": { @@ -396,15 +396,15 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, + "x": 4, "y": 4, - "w": 18, + "w": 24, "h": 24 }, "frame": { "x": 324, "y": 0, - "w": 18, + "w": 24, "h": 24 } }, @@ -493,7 +493,7 @@ } }, { - "filename": "muscle_band", + "filename": "reveal_glass", "rotated": false, "trimmed": true, "sourceSize": { @@ -503,13 +503,13 @@ "spriteSourceSize": { "x": 4, "y": 4, - "w": 24, + "w": 23, "h": 24 }, "frame": { "x": 0, "y": 246, - "w": 24, + "w": 23, "h": 24 } }, @@ -576,6 +576,27 @@ "h": 24 } }, + { + "filename": "ability_capsule", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 9, + "w": 24, + "h": 14 + }, + "frame": { + "x": 0, + "y": 342, + "w": 24, + "h": 14 + } + }, { "filename": "calcium", "rotated": false, @@ -661,7 +682,7 @@ } }, { - "filename": "ether", + "filename": "elixir", "rotated": false, "trimmed": true, "sourceSize": { @@ -682,7 +703,7 @@ } }, { - "filename": "full_restore", + "filename": "ether", "rotated": false, "trimmed": true, "sourceSize": { @@ -703,7 +724,7 @@ } }, { - "filename": "max_elixir", + "filename": "full_restore", "rotated": false, "trimmed": true, "sourceSize": { @@ -723,6 +744,27 @@ "h": 24 } }, + { + "filename": "max_elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 23, + "y": 245, + "w": 18, + "h": 24 + } + }, { "filename": "lure", "rotated": false, @@ -739,7 +781,7 @@ }, "frame": { "x": 24, - "y": 245, + "y": 269, "w": 17, "h": 24 } @@ -760,7 +802,7 @@ }, "frame": { "x": 24, - "y": 269, + "y": 293, "w": 18, "h": 24 } @@ -781,13 +823,13 @@ }, "frame": { "x": 24, - "y": 293, + "y": 317, "w": 18, "h": 24 } }, { - "filename": "max_revive", + "filename": "silver_powder", "rotated": false, "trimmed": true, "sourceSize": { @@ -795,16 +837,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 24 + "x": 4, + "y": 11, + "w": 24, + "h": 15 }, "frame": { "x": 24, - "y": 317, - "w": 22, - "h": 24 + "y": 341, + "w": 24, + "h": 15 } }, { @@ -829,7 +871,7 @@ } }, { - "filename": "reveal_glass", + "filename": "max_revive", "rotated": false, "trimmed": true, "sourceSize": { @@ -837,15 +879,15 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, + "x": 5, "y": 4, - "w": 23, + "w": 22, "h": 24 }, "frame": { "x": 33, "y": 73, - "w": 23, + "w": 22, "h": 24 } }, @@ -996,6 +1038,27 @@ "h": 23 } }, + { + "filename": "expert_belt", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 23 + }, + "frame": { + "x": 41, + "y": 262, + "w": 24, + "h": 23 + } + }, { "filename": "dynamax_band", "rotated": false, @@ -1012,34 +1075,13 @@ }, "frame": { "x": 42, - "y": 262, + "y": 285, "w": 23, "h": 23 } }, { - "filename": "expert_belt", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 23 - }, - "frame": { - "x": 42, - "y": 285, - "w": 24, - "h": 23 - } - }, - { - "filename": "black_belt", + "filename": "griseous_core", "rotated": false, "trimmed": true, "sourceSize": { @@ -1048,19 +1090,19 @@ }, "spriteSourceSize": { "x": 5, - "y": 4, - "w": 22, + "y": 5, + "w": 23, "h": 23 }, "frame": { - "x": 46, + "x": 42, "y": 308, - "w": 22, + "w": 23, "h": 23 } }, { - "filename": "relic_gold", + "filename": "max_lure", "rotated": false, "trimmed": true, "sourceSize": { @@ -1068,16 +1110,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 15, - "h": 11 + "x": 8, + "y": 4, + "w": 17, + "h": 24 }, "frame": { - "x": 46, + "x": 48, "y": 331, - "w": 15, - "h": 11 + "w": 17, + "h": 24 } }, { @@ -1249,7 +1291,7 @@ } }, { - "filename": "griseous_core", + "filename": "healing_charm", "rotated": false, "trimmed": true, "sourceSize": { @@ -1260,13 +1302,13 @@ "x": 5, "y": 5, "w": 23, - "h": 23 + "h": 22 }, "frame": { "x": 234, "y": 24, "w": 23, - "h": 23 + "h": 22 } }, { @@ -1333,7 +1375,7 @@ } }, { - "filename": "pp_max", + "filename": "black_belt", "rotated": false, "trimmed": true, "sourceSize": { @@ -1341,37 +1383,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, + "x": 5, "y": 4, - "w": 16, - "h": 24 + "w": 22, + "h": 23 }, "frame": { "x": 326, "y": 24, - "w": 16, - "h": 24 - } - }, - { - "filename": "ability_capsule", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 9, - "w": 24, - "h": 14 - }, - "frame": { - "x": 136, - "y": 44, - "w": 24, - "h": 14 + "w": 22, + "h": 23 } }, { @@ -1389,8 +1410,8 @@ "h": 18 }, "frame": { - "x": 160, - "y": 46, + "x": 88, + "y": 47, "w": 24, "h": 18 } @@ -1410,12 +1431,33 @@ "h": 18 }, "frame": { - "x": 184, - "y": 46, + "x": 112, + "y": 47, "w": 24, "h": 18 } }, + { + "filename": "amulet_coin", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 136, + "y": 44, + "w": 23, + "h": 21 + } + }, { "filename": "sacred_ash", "rotated": false, @@ -1431,7 +1473,7 @@ "h": 20 }, "frame": { - "x": 208, + "x": 159, "y": 46, "w": 24, "h": 20 @@ -1452,33 +1494,12 @@ "h": 20 }, "frame": { - "x": 232, - "y": 47, + "x": 183, + "y": 46, "w": 24, "h": 20 } }, - { - "filename": "amulet_coin", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 256, - "y": 47, - "w": 23, - "h": 21 - } - }, { "filename": "auspicious_armor", "rotated": false, @@ -1494,159 +1515,12 @@ "h": 21 }, "frame": { - "x": 279, - "y": 47, + "x": 207, + "y": 46, "w": 23, "h": 21 } }, - { - "filename": "healing_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 23, - "h": 22 - }, - "frame": { - "x": 302, - "y": 47, - "w": 23, - "h": 22 - } - }, - { - "filename": "max_lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 325, - "y": 48, - "w": 17, - "h": 24 - } - }, - { - "filename": "silver_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 11, - "w": 24, - "h": 15 - }, - "frame": { - "x": 88, - "y": 47, - "w": 24, - "h": 15 - } - }, - { - "filename": "binding_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 112, - "y": 47, - "w": 23, - "h": 20 - } - }, - { - "filename": "black_glasses", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 135, - "y": 58, - "w": 23, - "h": 17 - } - }, - { - "filename": "coupon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 158, - "y": 64, - "w": 23, - "h": 19 - } - }, - { - "filename": "golden_mystic_ticket", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 181, - "y": 64, - "w": 23, - "h": 19 - } - }, { "filename": "moon_stone", "rotated": false, @@ -1662,12 +1536,33 @@ "h": 21 }, "frame": { - "x": 204, - "y": 66, + "x": 230, + "y": 46, "w": 23, "h": 21 } }, + { + "filename": "binding_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 23, + "h": 20 + }, + "frame": { + "x": 253, + "y": 47, + "w": 23, + "h": 20 + } + }, { "filename": "reviver_seed", "rotated": false, @@ -1683,75 +1578,12 @@ "h": 20 }, "frame": { - "x": 227, - "y": 67, + "x": 276, + "y": 47, "w": 23, "h": 20 } }, - { - "filename": "mystic_ticket", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 250, - "y": 68, - "w": 23, - "h": 19 - } - }, - { - "filename": "pair_of_tickets", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 273, - "y": 68, - "w": 23, - "h": 19 - } - }, - { - "filename": "relic_crown", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 18 - }, - "frame": { - "x": 296, - "y": 69, - "w": 23, - "h": 18 - } - }, { "filename": "shell_bell", "rotated": false, @@ -1767,12 +1599,54 @@ "h": 20 }, "frame": { - "x": 319, - "y": 72, + "x": 299, + "y": 47, "w": 23, "h": 20 } }, + { + "filename": "bug_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 322, + "y": 47, + "w": 22, + "h": 23 + } + }, + { + "filename": "revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 12, + "h": 17 + }, + "frame": { + "x": 344, + "y": 47, + "w": 12, + "h": 17 + } + }, { "filename": "abomasite", "rotated": false, @@ -1795,28 +1669,7 @@ } }, { - "filename": "golden_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 17, - "h": 20 - }, - "frame": { - "x": 55, - "y": 53, - "w": 17, - "h": 20 - } - }, - { - "filename": "pp_up", + "filename": "super_lure", "rotated": false, "trimmed": true, "sourceSize": { @@ -1826,18 +1679,39 @@ "spriteSourceSize": { "x": 8, "y": 4, - "w": 16, + "w": 17, "h": 24 }, "frame": { - "x": 56, - "y": 73, - "w": 16, + "x": 55, + "y": 53, + "w": 17, "h": 24 } }, { - "filename": "protein", + "filename": "apicot_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 20 + }, + "frame": { + "x": 55, + "y": 77, + "w": 19, + "h": 20 + } + }, + { + "filename": "pp_max", "rotated": false, "trimmed": true, "sourceSize": { @@ -1858,70 +1732,7 @@ } }, { - "filename": "super_lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 72, - "y": 66, - "w": 17, - "h": 24 - } - }, - { - "filename": "fire_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 89, - "y": 62, - "w": 22, - "h": 23 - } - }, - { - "filename": "blunder_policy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 19 - }, - "frame": { - "x": 111, - "y": 67, - "w": 22, - "h": 19 - } - }, - { - "filename": "unknown", + "filename": "pp_up", "rotated": false, "trimmed": true, "sourceSize": { @@ -1942,7 +1753,7 @@ } }, { - "filename": "zinc", + "filename": "protein", "rotated": false, "trimmed": true, "sourceSize": { @@ -1962,6 +1773,48 @@ "h": 24 } }, + { + "filename": "unknown", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 61, + "y": 169, + "w": 16, + "h": 24 + } + }, + { + "filename": "dark_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 64, + "y": 193, + "w": 22, + "h": 23 + } + }, { "filename": "dragon_fang", "rotated": false, @@ -1977,12 +1830,201 @@ "h": 23 }, "frame": { - "x": 61, - "y": 169, + "x": 65, + "y": 216, "w": 21, "h": 23 } }, + { + "filename": "dragon_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 65, + "y": 239, + "w": 22, + "h": 23 + } + }, + { + "filename": "electric_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 65, + "y": 262, + "w": 22, + "h": 23 + } + }, + { + "filename": "fairy_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 65, + "y": 285, + "w": 22, + "h": 23 + } + }, + { + "filename": "fighting_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 65, + "y": 308, + "w": 22, + "h": 23 + } + }, + { + "filename": "fire_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 65, + "y": 331, + "w": 22, + "h": 23 + } + }, + { + "filename": "relic_gold", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 15, + "h": 11 + }, + "frame": { + "x": 72, + "y": 66, + "w": 15, + "h": 11 + } + }, + { + "filename": "big_nugget", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 74, + "y": 77, + "w": 20, + "h": 20 + } + }, + { + "filename": "fire_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 73, + "y": 97, + "w": 22, + "h": 23 + } + }, + { + "filename": "flying_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 75, + "y": 120, + "w": 22, + "h": 23 + } + }, { "filename": "focus_sash", "rotated": false, @@ -1998,8 +2040,71 @@ "h": 23 }, "frame": { - "x": 64, - "y": 192, + "x": 76, + "y": 143, + "w": 22, + "h": 23 + } + }, + { + "filename": "ghost_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 77, + "y": 166, + "w": 22, + "h": 23 + } + }, + { + "filename": "grass_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 94, + "y": 65, + "w": 22, + "h": 23 + } + }, + { + "filename": "ground_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 116, + "y": 65, "w": 22, "h": 23 } @@ -2019,134 +2124,8 @@ "h": 23 }, "frame": { - "x": 65, - "y": 215, - "w": 21, - "h": 23 - } - }, - { - "filename": "leaf_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 65, - "y": 238, - "w": 21, - "h": 23 - } - }, - { - "filename": "never_melt_ice", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 65, - "y": 261, - "w": 22, - "h": 23 - } - }, - { - "filename": "petaya_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 66, - "y": 284, - "w": 22, - "h": 23 - } - }, - { - "filename": "mystic_water", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 20, - "h": 23 - }, - "frame": { - "x": 68, - "y": 307, - "w": 20, - "h": 23 - } - }, - { - "filename": "hyper_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 73, - "y": 90, - "w": 17, - "h": 23 - } - }, - { - "filename": "sharp_beak", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 90, - "y": 85, + "x": 138, + "y": 65, "w": 21, "h": 23 } @@ -2166,96 +2145,12 @@ "h": 22 }, "frame": { - "x": 111, - "y": 86, + "x": 159, + "y": 66, "w": 22, "h": 22 } }, - { - "filename": "reaper_cloth", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 133, - "y": 75, - "w": 22, - "h": 23 - } - }, - { - "filename": "wise_glasses", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 155, - "y": 83, - "w": 23, - "h": 17 - } - }, - { - "filename": "deep_sea_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 178, - "y": 83, - "w": 22, - "h": 20 - } - }, - { - "filename": "deep_sea_tooth", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 133, - "y": 98, - "w": 22, - "h": 21 - } - }, { "filename": "dire_hit", "rotated": false, @@ -2271,12 +2166,33 @@ "h": 22 }, "frame": { - "x": 155, - "y": 100, + "x": 181, + "y": 66, "w": 22, "h": 22 } }, + { + "filename": "deep_sea_tooth", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 203, + "y": 67, + "w": 22, + "h": 21 + } + }, { "filename": "dna_splicers", "rotated": false, @@ -2292,33 +2208,12 @@ "h": 22 }, "frame": { - "x": 177, - "y": 103, + "x": 225, + "y": 67, "w": 22, "h": 22 } }, - { - "filename": "dubious_disc", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 19 - }, - "frame": { - "x": 200, - "y": 87, - "w": 22, - "h": 19 - } - }, { "filename": "electirizer", "rotated": false, @@ -2334,8 +2229,8 @@ "h": 22 }, "frame": { - "x": 222, - "y": 87, + "x": 247, + "y": 67, "w": 22, "h": 22 } @@ -2355,8 +2250,8 @@ "h": 22 }, "frame": { - "x": 244, - "y": 87, + "x": 269, + "y": 67, "w": 22, "h": 22 } @@ -2376,12 +2271,138 @@ "h": 22 }, "frame": { - "x": 266, - "y": 87, + "x": 291, + "y": 67, "w": 22, "h": 22 } }, + { + "filename": "ice_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 95, + "y": 88, + "w": 22, + "h": 23 + } + }, + { + "filename": "never_melt_ice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 117, + "y": 88, + "w": 22, + "h": 23 + } + }, + { + "filename": "normal_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 139, + "y": 88, + "w": 22, + "h": 23 + } + }, + { + "filename": "petaya_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 161, + "y": 88, + "w": 22, + "h": 23 + } + }, + { + "filename": "poison_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 183, + "y": 88, + "w": 22, + "h": 23 + } + }, + { + "filename": "mystic_water", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 20, + "h": 23 + }, + "frame": { + "x": 205, + "y": 88, + "w": 20, + "h": 23 + } + }, { "filename": "guard_spec", "rotated": false, @@ -2397,33 +2418,12 @@ "h": 22 }, "frame": { - "x": 288, - "y": 87, + "x": 225, + "y": 89, "w": 22, "h": 22 } }, - { - "filename": "fairy_feather", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 20 - }, - "frame": { - "x": 199, - "y": 106, - "w": 22, - "h": 20 - } - }, { "filename": "ice_stone", "rotated": false, @@ -2439,8 +2439,8 @@ "h": 22 }, "frame": { - "x": 221, - "y": 109, + "x": 247, + "y": 89, "w": 22, "h": 22 } @@ -2460,8 +2460,8 @@ "h": 22 }, "frame": { - "x": 243, - "y": 109, + "x": 269, + "y": 89, "w": 22, "h": 22 } @@ -2481,12 +2481,201 @@ "h": 22 }, "frame": { - "x": 265, - "y": 109, + "x": 291, + "y": 89, "w": 22, "h": 22 } }, + { + "filename": "psychic_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 313, + "y": 70, + "w": 22, + "h": 23 + } + }, + { + "filename": "leaf_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 335, + "y": 70, + "w": 21, + "h": 23 + } + }, + { + "filename": "coupon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 313, + "y": 93, + "w": 23, + "h": 19 + } + }, + { + "filename": "sitrus_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 20, + "h": 22 + }, + "frame": { + "x": 336, + "y": 93, + "w": 20, + "h": 22 + } + }, + { + "filename": "reaper_cloth", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 97, + "y": 111, + "w": 22, + "h": 23 + } + }, + { + "filename": "rock_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 119, + "y": 111, + "w": 22, + "h": 23 + } + }, + { + "filename": "steel_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 141, + "y": 111, + "w": 22, + "h": 23 + } + }, + { + "filename": "stellar_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 163, + "y": 111, + "w": 22, + "h": 23 + } + }, + { + "filename": "water_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 185, + "y": 111, + "w": 22, + "h": 23 + } + }, { "filename": "protector", "rotated": false, @@ -2502,33 +2691,12 @@ "h": 22 }, "frame": { - "x": 287, - "y": 109, + "x": 207, + "y": 111, "w": 22, "h": 22 } }, - { - "filename": "full_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 15, - "h": 23 - }, - "frame": { - "x": 75, - "y": 113, - "w": 15, - "h": 23 - } - }, { "filename": "scroll_of_darkness", "rotated": false, @@ -2544,75 +2712,12 @@ "h": 22 }, "frame": { - "x": 90, - "y": 108, + "x": 229, + "y": 111, "w": 22, "h": 22 } }, - { - "filename": "whipped_dream", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 23 - }, - "frame": { - "x": 112, - "y": 108, - "w": 21, - "h": 23 - } - }, - { - "filename": "liechi_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 133, - "y": 119, - "w": 22, - "h": 21 - } - }, - { - "filename": "malicious_armor", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 155, - "y": 122, - "w": 22, - "h": 20 - } - }, { "filename": "scroll_of_waters", "rotated": false, @@ -2628,8 +2733,8 @@ "h": 22 }, "frame": { - "x": 177, - "y": 125, + "x": 251, + "y": 111, "w": 22, "h": 22 } @@ -2649,12 +2754,96 @@ "h": 22 }, "frame": { - "x": 199, - "y": 126, + "x": 273, + "y": 111, "w": 22, "h": 22 } }, + { + "filename": "sachet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 18, + "h": 23 + }, + "frame": { + "x": 295, + "y": 111, + "w": 18, + "h": 23 + } + }, + { + "filename": "golden_mystic_ticket", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 313, + "y": 112, + "w": 23, + "h": 19 + } + }, + { + "filename": "dawn_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 21 + }, + "frame": { + "x": 336, + "y": 115, + "w": 20, + "h": 21 + } + }, + { + "filename": "sharp_beak", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 98, + "y": 134, + "w": 21, + "h": 23 + } + }, { "filename": "starf_berry", "rotated": false, @@ -2670,8 +2859,8 @@ "h": 22 }, "frame": { - "x": 221, - "y": 131, + "x": 119, + "y": 134, "w": 22, "h": 22 } @@ -2691,8 +2880,8 @@ "h": 22 }, "frame": { - "x": 243, - "y": 131, + "x": 141, + "y": 134, "w": 22, "h": 22 } @@ -2712,8 +2901,8 @@ "h": 22 }, "frame": { - "x": 265, - "y": 131, + "x": 163, + "y": 134, "w": 22, "h": 22 } @@ -2733,33 +2922,12 @@ "h": 22 }, "frame": { - "x": 287, - "y": 131, + "x": 185, + "y": 134, "w": 22, "h": 22 } }, - { - "filename": "sweet_apple", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 310, - "y": 92, - "w": 22, - "h": 21 - } - }, { "filename": "tm_dragon", "rotated": false, @@ -2775,75 +2943,12 @@ "h": 22 }, "frame": { - "x": 309, - "y": 113, + "x": 207, + "y": 133, "w": 22, "h": 22 } }, - { - "filename": "syrupy_apple", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 309, - "y": 135, - "w": 22, - "h": 21 - } - }, - { - "filename": "tart_apple", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 90, - "y": 130, - "w": 22, - "h": 21 - } - }, - { - "filename": "dusk_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 112, - "y": 131, - "w": 21, - "h": 21 - } - }, { "filename": "tm_electric", "rotated": false, @@ -2859,8 +2964,8 @@ "h": 22 }, "frame": { - "x": 133, - "y": 140, + "x": 229, + "y": 133, "w": 22, "h": 22 } @@ -2880,8 +2985,8 @@ "h": 22 }, "frame": { - "x": 155, - "y": 142, + "x": 251, + "y": 133, "w": 22, "h": 22 } @@ -2901,539 +3006,14 @@ "h": 22 }, "frame": { - "x": 177, - "y": 147, + "x": 273, + "y": 133, "w": 22, "h": 22 } }, { - "filename": "tm_fire", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 199, - "y": 148, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_flying", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 221, - "y": 153, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_ghost", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 243, - "y": 153, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_grass", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 265, - "y": 153, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_ground", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 287, - "y": 153, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_ice", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 309, - "y": 156, - "w": 22, - "h": 22 - } - }, - { - "filename": "masterpiece_teacup", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 21, - "h": 18 - }, - "frame": { - "x": 76, - "y": 151, - "w": 21, - "h": 18 - } - }, - { - "filename": "potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 82, - "y": 169, - "w": 17, - "h": 23 - } - }, - { - "filename": "sachet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 18, - "h": 23 - }, - "frame": { - "x": 86, - "y": 192, - "w": 18, - "h": 23 - } - }, - { - "filename": "metal_coat", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 19, - "h": 22 - }, - "frame": { - "x": 86, - "y": 215, - "w": 19, - "h": 22 - } - }, - { - "filename": "sitrus_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 86, - "y": 237, - "w": 20, - "h": 22 - } - }, - { - "filename": "tm_normal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 87, - "y": 259, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_poison", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 88, - "y": 281, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_psychic", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 88, - "y": 303, - "w": 22, - "h": 22 - } - }, - { - "filename": "everstone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 17 - }, - "frame": { - "x": 88, - "y": 325, - "w": 20, - "h": 17 - } - }, - { - "filename": "prism_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 15, - "h": 15 - }, - "frame": { - "x": 97, - "y": 151, - "w": 15, - "h": 15 - } - }, - { - "filename": "metal_alloy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 21, - "h": 19 - }, - "frame": { - "x": 112, - "y": 152, - "w": 21, - "h": 19 - } - }, - { - "filename": "poison_barb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 99, - "y": 171, - "w": 21, - "h": 21 - } - }, - { - "filename": "super_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 104, - "y": 192, - "w": 17, - "h": 23 - } - }, - { - "filename": "metronome", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 105, - "y": 215, - "w": 17, - "h": 22 - } - }, - { - "filename": "soothe_bell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 106, - "y": 237, - "w": 17, - "h": 22 - } - }, - { - "filename": "leftovers", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 15, - "h": 22 - }, - "frame": { - "x": 109, - "y": 259, - "w": 15, - "h": 22 - } - }, - { - "filename": "tm_rock", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 110, - "y": 281, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_steel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 110, - "y": 303, - "w": 22, - "h": 22 - } - }, - { - "filename": "revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 12, - "h": 17 - }, - "frame": { - "x": 108, - "y": 325, - "w": 12, - "h": 17 - } - }, - { - "filename": "dawn_stone", + "filename": "dusk_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -3443,352 +3023,16 @@ "spriteSourceSize": { "x": 6, "y": 6, - "w": 20, - "h": 21 - }, - "frame": { - "x": 120, - "y": 171, - "w": 20, - "h": 21 - } - }, - { - "filename": "tm_water", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 121, - "y": 192, - "w": 22, - "h": 22 - } - }, - { - "filename": "water_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 122, - "y": 214, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_accuracy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 123, - "y": 236, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_attack", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 124, - "y": 258, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_defense", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 132, - "y": 280, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_sp_atk", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 132, - "y": 302, - "w": 22, - "h": 22 - } - }, - { - "filename": "unremarkable_teacup", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 21, - "h": 18 - }, - "frame": { - "x": 132, - "y": 324, - "w": 21, - "h": 18 - } - }, - { - "filename": "wl_ability_urge", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 153, - "y": 324, - "w": 20, - "h": 18 - } - }, - { - "filename": "x_sp_def", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 140, - "y": 170, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_speed", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 143, - "y": 192, - "w": 22, - "h": 22 - } - }, - { - "filename": "shiny_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, "w": 21, "h": 21 }, "frame": { - "x": 144, - "y": 214, + "x": 295, + "y": 134, "w": 21, "h": 21 } }, - { - "filename": "zoom_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 145, - "y": 235, - "w": 21, - "h": 21 - } - }, - { - "filename": "big_nugget", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 146, - "y": 256, - "w": 20, - "h": 20 - } - }, - { - "filename": "spell_tag", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 19, - "h": 21 - }, - "frame": { - "x": 154, - "y": 276, - "w": 19, - "h": 21 - } - }, - { - "filename": "apicot_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 - }, - "frame": { - "x": 154, - "y": 297, - "w": 19, - "h": 20 - } - }, - { - "filename": "upgrade", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 19 - }, - "frame": { - "x": 162, - "y": 169, - "w": 22, - "h": 19 - } - }, { "filename": "blue_orb", "rotated": false, @@ -3804,8 +3048,8 @@ "h": 20 }, "frame": { - "x": 165, - "y": 188, + "x": 316, + "y": 131, "w": 20, "h": 20 } @@ -3825,8 +3069,1205 @@ "h": 20 }, "frame": { - "x": 165, - "y": 208, + "x": 336, + "y": 136, + "w": 20, + "h": 20 + } + }, + { + "filename": "whipped_dream", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 23 + }, + "frame": { + "x": 99, + "y": 157, + "w": 21, + "h": 23 + } + }, + { + "filename": "tm_fire", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 120, + "y": 156, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_flying", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 142, + "y": 156, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_ghost", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 164, + "y": 156, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_grass", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 186, + "y": 156, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_ground", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 208, + "y": 155, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_ice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 230, + "y": 155, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_normal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 252, + "y": 155, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_poison", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 274, + "y": 155, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_psychic", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 296, + "y": 155, + "w": 22, + "h": 22 + } + }, + { + "filename": "razor_fang", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 18, + "h": 20 + }, + "frame": { + "x": 318, + "y": 151, + "w": 18, + "h": 20 + } + }, + { + "filename": "magnet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 336, + "y": 156, + "w": 20, + "h": 20 + } + }, + { + "filename": "zinc", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 86, + "y": 189, + "w": 16, + "h": 24 + } + }, + { + "filename": "hyper_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 86, + "y": 213, + "w": 17, + "h": 23 + } + }, + { + "filename": "potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 87, + "y": 236, + "w": 17, + "h": 23 + } + }, + { + "filename": "super_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 87, + "y": 259, + "w": 17, + "h": 23 + } + }, + { + "filename": "metal_coat", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 87, + "y": 282, + "w": 19, + "h": 22 + } + }, + { + "filename": "tm_rock", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 87, + "y": 304, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_steel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 87, + "y": 326, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_water", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 102, + "y": 180, + "w": 22, + "h": 22 + } + }, + { + "filename": "water_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 124, + "y": 178, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_accuracy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 146, + "y": 178, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_attack", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 168, + "y": 178, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_defense", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 190, + "y": 178, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_sp_atk", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 212, + "y": 177, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_sp_def", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 234, + "y": 177, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_speed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 256, + "y": 177, + "w": 22, + "h": 22 + } + }, + { + "filename": "liechi_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 278, + "y": 177, + "w": 22, + "h": 21 + } + }, + { + "filename": "poison_barb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 300, + "y": 177, + "w": 21, + "h": 21 + } + }, + { + "filename": "full_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 15, + "h": 23 + }, + "frame": { + "x": 321, + "y": 171, + "w": 15, + "h": 23 + } + }, + { + "filename": "mb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 336, + "y": 176, + "w": 20, + "h": 20 + } + }, + { + "filename": "shiny_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 103, + "y": 202, + "w": 21, + "h": 21 + } + }, + { + "filename": "sweet_apple", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 124, + "y": 200, + "w": 22, + "h": 21 + } + }, + { + "filename": "syrupy_apple", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 146, + "y": 200, + "w": 22, + "h": 21 + } + }, + { + "filename": "tart_apple", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 168, + "y": 200, + "w": 22, + "h": 21 + } + }, + { + "filename": "deep_sea_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 190, + "y": 200, + "w": 22, + "h": 20 + } + }, + { + "filename": "fairy_feather", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 20 + }, + "frame": { + "x": 212, + "y": 199, + "w": 22, + "h": 20 + } + }, + { + "filename": "malicious_armor", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 234, + "y": 199, + "w": 22, + "h": 20 + } + }, + { + "filename": "tera_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 256, + "y": 199, + "w": 22, + "h": 20 + } + }, + { + "filename": "mystic_ticket", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 278, + "y": 198, + "w": 23, + "h": 19 + } + }, + { + "filename": "blunder_policy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 19 + }, + "frame": { + "x": 301, + "y": 198, + "w": 22, + "h": 19 + } + }, + { + "filename": "zoom_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 104, + "y": 223, + "w": 21, + "h": 21 + } + }, + { + "filename": "dubious_disc", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 104, + "y": 244, + "w": 22, + "h": 19 + } + }, + { + "filename": "pair_of_tickets", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 104, + "y": 263, + "w": 23, + "h": 19 + } + }, + { + "filename": "metronome", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 106, + "y": 282, + "w": 17, + "h": 22 + } + }, + { + "filename": "relic_crown", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 18 + }, + "frame": { + "x": 125, + "y": 221, + "w": 23, + "h": 18 + } + }, + { + "filename": "black_glasses", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 148, + "y": 221, + "w": 23, + "h": 17 + } + }, + { + "filename": "big_mushroom", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 19 + }, + "frame": { + "x": 171, + "y": 221, + "w": 19, + "h": 19 + } + }, + { + "filename": "upgrade", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 190, + "y": 220, + "w": 22, + "h": 19 + } + }, + { + "filename": "metal_alloy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 21, + "h": 19 + }, + "frame": { + "x": 212, + "y": 219, + "w": 21, + "h": 19 + } + }, + { + "filename": "wise_glasses", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 233, + "y": 219, + "w": 23, + "h": 17 + } + }, + { + "filename": "masterpiece_teacup", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 21, + "h": 18 + }, + "frame": { + "x": 256, + "y": 219, + "w": 21, + "h": 18 + } + }, + { + "filename": "leftovers", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 15, + "h": 22 + }, + "frame": { + "x": 109, + "y": 304, + "w": 15, + "h": 22 + } + }, + { + "filename": "soothe_bell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 109, + "y": 326, + "w": 17, + "h": 22 + } + }, + { + "filename": "pb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 126, + "y": 239, + "w": 20, + "h": 20 + } + }, + { + "filename": "spell_tag", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 19, + "h": 21 + }, + "frame": { + "x": 127, + "y": 259, + "w": 19, + "h": 21 + } + }, + { + "filename": "pb_gold", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 323, + "y": 196, "w": 20, "h": 20 } @@ -3846,8 +4287,8 @@ "h": 20 }, "frame": { - "x": 166, - "y": 228, + "x": 123, + "y": 282, "w": 19, "h": 20 } @@ -3867,12 +4308,75 @@ "h": 20 }, "frame": { - "x": 166, - "y": 248, + "x": 124, + "y": 302, "w": 19, "h": 20 } }, + { + "filename": "golden_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 17, + "h": 20 + }, + "frame": { + "x": 126, + "y": 322, + "w": 17, + "h": 20 + } + }, + { + "filename": "unremarkable_teacup", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 21, + "h": 18 + }, + "frame": { + "x": 278, + "y": 217, + "w": 21, + "h": 18 + } + }, + { + "filename": "lum_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 299, + "y": 217, + "w": 20, + "h": 19 + } + }, { "filename": "lucky_egg", "rotated": false, @@ -3888,117 +4392,12 @@ "h": 20 }, "frame": { - "x": 173, - "y": 268, + "x": 319, + "y": 217, "w": 17, "h": 20 } }, - { - "filename": "magnet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 173, - "y": 288, - "w": 20, - "h": 20 - } - }, - { - "filename": "mb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 173, - "y": 308, - "w": 20, - "h": 20 - } - }, - { - "filename": "wl_antidote", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 184, - "y": 170, - "w": 20, - "h": 18 - } - }, - { - "filename": "pb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 185, - "y": 188, - "w": 20, - "h": 20 - } - }, - { - "filename": "pb_gold", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 185, - "y": 208, - "w": 20, - "h": 20 - } - }, { "filename": "strange_ball", "rotated": false, @@ -4014,8 +4413,8 @@ "h": 20 }, "frame": { - "x": 185, - "y": 228, + "x": 336, + "y": 216, "w": 20, "h": 20 } @@ -4035,35 +4434,14 @@ "h": 20 }, "frame": { - "x": 185, - "y": 248, + "x": 336, + "y": 236, "w": 20, "h": 20 } }, { - "filename": "razor_fang", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 18, - "h": 20 - }, - "frame": { - "x": 190, - "y": 268, - "w": 18, - "h": 20 - } - }, - { - "filename": "big_mushroom", + "filename": "everstone", "rotated": false, "trimmed": true, "sourceSize": { @@ -4072,36 +4450,15 @@ }, "spriteSourceSize": { "x": 6, - "y": 6, - "w": 19, - "h": 19 + "y": 8, + "w": 20, + "h": 17 }, "frame": { - "x": 193, - "y": 288, - "w": 19, - "h": 19 - } - }, - { - "filename": "lum_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, + "x": 233, + "y": 236, "w": 20, - "h": 19 - }, - "frame": { - "x": 193, - "y": 307, - "w": 20, - "h": 19 + "h": 17 } }, { @@ -4119,33 +4476,12 @@ "h": 16 }, "frame": { - "x": 193, - "y": 326, + "x": 253, + "y": 237, "w": 20, "h": 16 } }, - { - "filename": "absolite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 204, - "y": 170, - "w": 16, - "h": 16 - } - }, { "filename": "miracle_seed", "rotated": false, @@ -4161,8 +4497,8 @@ "h": 19 }, "frame": { - "x": 205, - "y": 186, + "x": 146, + "y": 239, "w": 19, "h": 19 } @@ -4182,14 +4518,14 @@ "h": 19 }, "frame": { - "x": 205, - "y": 205, + "x": 146, + "y": 258, "w": 20, "h": 19 } }, { - "filename": "wl_awakening", + "filename": "wl_ability_urge", "rotated": false, "trimmed": true, "sourceSize": { @@ -4203,29 +4539,8 @@ "h": 18 }, "frame": { - "x": 205, - "y": 224, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_burn_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 205, - "y": 242, + "x": 165, + "y": 240, "w": 20, "h": 18 } @@ -4245,12 +4560,75 @@ "h": 19 }, "frame": { - "x": 208, - "y": 260, + "x": 166, + "y": 258, "w": 18, "h": 19 } }, + { + "filename": "wl_antidote", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 146, + "y": 277, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_awakening", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 166, + "y": 277, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_burn_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 143, + "y": 295, + "w": 20, + "h": 18 + } + }, { "filename": "wl_ether", "rotated": false, @@ -4266,8 +4644,8 @@ "h": 18 }, "frame": { - "x": 224, - "y": 175, + "x": 143, + "y": 313, "w": 20, "h": 18 } @@ -4287,8 +4665,8 @@ "h": 18 }, "frame": { - "x": 244, - "y": 175, + "x": 163, + "y": 295, "w": 20, "h": 18 } @@ -4308,8 +4686,8 @@ "h": 18 }, "frame": { - "x": 264, - "y": 175, + "x": 163, + "y": 313, "w": 20, "h": 18 } @@ -4329,8 +4707,8 @@ "h": 18 }, "frame": { - "x": 284, - "y": 175, + "x": 143, + "y": 331, "w": 20, "h": 18 } @@ -4350,8 +4728,8 @@ "h": 18 }, "frame": { - "x": 304, - "y": 178, + "x": 163, + "y": 331, "w": 20, "h": 18 } @@ -4371,8 +4749,8 @@ "h": 18 }, "frame": { - "x": 225, - "y": 193, + "x": 185, + "y": 240, "w": 20, "h": 18 } @@ -4392,8 +4770,8 @@ "h": 18 }, "frame": { - "x": 225, - "y": 211, + "x": 184, + "y": 258, "w": 20, "h": 18 } @@ -4413,8 +4791,8 @@ "h": 18 }, "frame": { - "x": 245, - "y": 193, + "x": 186, + "y": 276, "w": 20, "h": 18 } @@ -4434,8 +4812,8 @@ "h": 18 }, "frame": { - "x": 225, - "y": 229, + "x": 205, + "y": 239, "w": 20, "h": 18 } @@ -4455,8 +4833,8 @@ "h": 18 }, "frame": { - "x": 245, - "y": 211, + "x": 277, + "y": 235, "w": 20, "h": 18 } @@ -4476,12 +4854,33 @@ "h": 18 }, "frame": { - "x": 265, - "y": 193, + "x": 297, + "y": 236, "w": 20, "h": 18 } }, + { + "filename": "absolite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 317, + "y": 237, + "w": 16, + "h": 16 + } + }, { "filename": "wl_potion", "rotated": false, @@ -4497,8 +4896,8 @@ "h": 18 }, "frame": { - "x": 245, - "y": 229, + "x": 183, + "y": 295, "w": 20, "h": 18 } @@ -4518,8 +4917,8 @@ "h": 18 }, "frame": { - "x": 265, - "y": 211, + "x": 183, + "y": 313, "w": 20, "h": 18 } @@ -4539,8 +4938,29 @@ "h": 18 }, "frame": { - "x": 265, - "y": 229, + "x": 183, + "y": 331, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_super_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 204, + "y": 258, "w": 20, "h": 18 } @@ -4560,33 +4980,12 @@ "h": 16 }, "frame": { - "x": 285, - "y": 193, + "x": 206, + "y": 276, "w": 16, "h": 16 } }, - { - "filename": "wl_super_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 285, - "y": 209, - "w": 20, - "h": 18 - } - }, { "filename": "aggronite", "rotated": false, @@ -4602,8 +5001,8 @@ "h": 16 }, "frame": { - "x": 285, - "y": 227, + "x": 203, + "y": 294, "w": 16, "h": 16 } @@ -4623,8 +5022,8 @@ "h": 16 }, "frame": { - "x": 324, - "y": 178, + "x": 203, + "y": 310, "w": 16, "h": 16 } @@ -4644,8 +5043,8 @@ "h": 16 }, "frame": { - "x": 212, - "y": 279, + "x": 203, + "y": 326, "w": 16, "h": 16 } @@ -4665,8 +5064,8 @@ "h": 16 }, "frame": { - "x": 285, - "y": 243, + "x": 222, + "y": 276, "w": 16, "h": 16 } @@ -4686,8 +5085,8 @@ "h": 16 }, "frame": { - "x": 301, - "y": 227, + "x": 219, + "y": 292, "w": 16, "h": 16 } @@ -4707,8 +5106,8 @@ "h": 16 }, "frame": { - "x": 301, - "y": 243, + "x": 219, + "y": 308, "w": 16, "h": 16 } @@ -4728,8 +5127,8 @@ "h": 16 }, "frame": { - "x": 213, - "y": 295, + "x": 219, + "y": 324, "w": 16, "h": 16 } @@ -4749,8 +5148,8 @@ "h": 16 }, "frame": { - "x": 213, - "y": 311, + "x": 219, + "y": 340, "w": 16, "h": 16 } @@ -4770,8 +5169,8 @@ "h": 16 }, "frame": { - "x": 226, - "y": 247, + "x": 235, + "y": 292, "w": 16, "h": 16 } @@ -4791,8 +5190,8 @@ "h": 16 }, "frame": { - "x": 226, - "y": 263, + "x": 235, + "y": 308, "w": 16, "h": 16 } @@ -4812,8 +5211,8 @@ "h": 16 }, "frame": { - "x": 242, - "y": 247, + "x": 235, + "y": 324, "w": 16, "h": 16 } @@ -4833,8 +5232,8 @@ "h": 16 }, "frame": { - "x": 242, - "y": 263, + "x": 235, + "y": 340, "w": 16, "h": 16 } @@ -4854,8 +5253,8 @@ "h": 16 }, "frame": { - "x": 228, - "y": 279, + "x": 317, + "y": 253, "w": 16, "h": 16 } @@ -4875,8 +5274,8 @@ "h": 16 }, "frame": { - "x": 258, - "y": 247, + "x": 333, + "y": 256, "w": 16, "h": 16 } @@ -4896,8 +5295,8 @@ "h": 16 }, "frame": { - "x": 258, - "y": 263, + "x": 238, + "y": 253, "w": 16, "h": 16 } @@ -4917,8 +5316,8 @@ "h": 16 }, "frame": { - "x": 244, - "y": 279, + "x": 254, + "y": 253, "w": 16, "h": 16 } @@ -4938,8 +5337,8 @@ "h": 16 }, "frame": { - "x": 229, - "y": 295, + "x": 270, + "y": 253, "w": 16, "h": 16 } @@ -4959,8 +5358,8 @@ "h": 16 }, "frame": { - "x": 229, - "y": 311, + "x": 238, + "y": 269, "w": 16, "h": 16 } @@ -4980,8 +5379,8 @@ "h": 16 }, "frame": { - "x": 245, - "y": 295, + "x": 254, + "y": 269, "w": 16, "h": 16 } @@ -5001,8 +5400,8 @@ "h": 16 }, "frame": { - "x": 245, - "y": 311, + "x": 270, + "y": 269, "w": 16, "h": 16 } @@ -5022,8 +5421,8 @@ "h": 16 }, "frame": { - "x": 260, - "y": 279, + "x": 251, + "y": 285, "w": 16, "h": 16 } @@ -5043,8 +5442,8 @@ "h": 16 }, "frame": { - "x": 261, - "y": 295, + "x": 251, + "y": 301, "w": 16, "h": 16 } @@ -5064,8 +5463,8 @@ "h": 16 }, "frame": { - "x": 261, - "y": 311, + "x": 267, + "y": 285, "w": 16, "h": 16 } @@ -5085,8 +5484,8 @@ "h": 16 }, "frame": { - "x": 274, - "y": 259, + "x": 251, + "y": 317, "w": 16, "h": 16 } @@ -5106,8 +5505,8 @@ "h": 16 }, "frame": { - "x": 290, - "y": 259, + "x": 267, + "y": 301, "w": 16, "h": 16 } @@ -5127,8 +5526,8 @@ "h": 16 }, "frame": { - "x": 276, - "y": 275, + "x": 251, + "y": 333, "w": 16, "h": 16 } @@ -5148,8 +5547,8 @@ "h": 16 }, "frame": { - "x": 292, - "y": 275, + "x": 267, + "y": 317, "w": 16, "h": 16 } @@ -5169,8 +5568,8 @@ "h": 16 }, "frame": { - "x": 306, - "y": 259, + "x": 267, + "y": 333, "w": 16, "h": 16 } @@ -5190,12 +5589,33 @@ "h": 16 }, "frame": { - "x": 308, - "y": 275, + "x": 286, + "y": 254, "w": 16, "h": 16 } }, + { + "filename": "prism_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 302, + "y": 254, + "w": 15, + "h": 15 + } + }, { "filename": "metagrossite", "rotated": false, @@ -5211,8 +5631,8 @@ "h": 16 }, "frame": { - "x": 277, - "y": 291, + "x": 286, + "y": 270, "w": 16, "h": 16 } @@ -5232,8 +5652,8 @@ "h": 16 }, "frame": { - "x": 277, - "y": 307, + "x": 302, + "y": 269, "w": 16, "h": 16 } @@ -5253,8 +5673,8 @@ "h": 16 }, "frame": { - "x": 293, - "y": 291, + "x": 283, + "y": 286, "w": 16, "h": 16 } @@ -5274,8 +5694,8 @@ "h": 16 }, "frame": { - "x": 293, - "y": 307, + "x": 283, + "y": 302, "w": 16, "h": 16 } @@ -5295,8 +5715,8 @@ "h": 16 }, "frame": { - "x": 309, - "y": 291, + "x": 283, + "y": 318, "w": 16, "h": 16 } @@ -5316,8 +5736,8 @@ "h": 16 }, "frame": { - "x": 309, - "y": 307, + "x": 283, + "y": 334, "w": 16, "h": 16 } @@ -5337,8 +5757,8 @@ "h": 16 }, "frame": { - "x": 277, - "y": 323, + "x": 299, + "y": 286, "w": 16, "h": 16 } @@ -5358,8 +5778,8 @@ "h": 16 }, "frame": { - "x": 293, - "y": 323, + "x": 299, + "y": 302, "w": 16, "h": 16 } @@ -5379,8 +5799,8 @@ "h": 16 }, "frame": { - "x": 309, - "y": 323, + "x": 299, + "y": 318, "w": 16, "h": 16 } @@ -5400,8 +5820,8 @@ "h": 16 }, "frame": { - "x": 305, - "y": 196, + "x": 299, + "y": 334, "w": 16, "h": 16 } @@ -5421,8 +5841,8 @@ "h": 16 }, "frame": { - "x": 321, - "y": 196, + "x": 315, + "y": 285, "w": 16, "h": 16 } @@ -5442,8 +5862,8 @@ "h": 16 }, "frame": { - "x": 317, - "y": 212, + "x": 315, + "y": 301, "w": 16, "h": 16 } @@ -5463,8 +5883,8 @@ "h": 16 }, "frame": { - "x": 317, - "y": 228, + "x": 315, + "y": 317, "w": 16, "h": 16 } @@ -5484,8 +5904,8 @@ "h": 16 }, "frame": { - "x": 322, - "y": 244, + "x": 315, + "y": 333, "w": 16, "h": 16 } @@ -5505,8 +5925,8 @@ "h": 16 }, "frame": { - "x": 324, - "y": 260, + "x": 331, + "y": 272, "w": 16, "h": 16 } @@ -5526,8 +5946,8 @@ "h": 16 }, "frame": { - "x": 325, - "y": 276, + "x": 331, + "y": 288, "w": 16, "h": 16 } @@ -5547,8 +5967,8 @@ "h": 16 }, "frame": { - "x": 325, - "y": 292, + "x": 331, + "y": 304, "w": 16, "h": 16 } @@ -5568,8 +5988,8 @@ "h": 16 }, "frame": { - "x": 325, - "y": 308, + "x": 331, + "y": 320, "w": 16, "h": 16 } @@ -5589,8 +6009,8 @@ "h": 16 }, "frame": { - "x": 325, - "y": 324, + "x": 331, + "y": 336, "w": 16, "h": 16 } @@ -5601,6 +6021,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:6ebdeaa256dae3c85615b653f5f4467a:7739977ebe25a40fef999e70ae9591a6:110e074689c9edd2c54833ce2e4d9270$" + "smartupdate": "$TexturePacker:SmartUpdate:2497ac4c2655c9964bdd1688037f70ad:afe1c3244c4d1319915c5dba32e71a8e:110e074689c9edd2c54833ce2e4d9270$" } } diff --git a/public/images/items.png b/public/images/items.png index 51e425a4aa91e6c57925083ada8a7aaf41c55c77..8814e579aa1feab4b21452fad8a0e6cf0b941c34 100644 GIT binary patch literal 40990 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 diff --git a/public/images/items/bug_tera_shard.png b/public/images/items/bug_tera_shard.png new file mode 100644 index 0000000000000000000000000000000000000000..c08a3f29ffd1d2d5774ade0681231a1a0663eb1b GIT binary patch literal 349 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCil&0(?STf%O0X|37};vh(e^nNRm!cz7^-iSz6SFY<2B2TE0jDgj9bu96_X zV4yMxVAym<=R8o9v%n*=n1O-sFbFdq&tH)O6x`(L;uvD#e|6$Tp~DIsEDv>B{`}|v ze(9n{*6r)lY*G%bYnQUzf8{;brQ6nyE??j2Hwi4R5!$j~N)uby!@vWZrWtZCI>+%i zxYtv__RdtsUjL?y9meyn`dM*yD6j`hc`%t56nYhY-^|b|+5V+LrDN7?)`|)D{Fu^< zf17;@+|lQ7M%!!ktJy~xDpG8?_9)9}{tazrII{7B-UoH|&#%MRUwg=)7ynZs=cB@# gLh*aozopr0Onzh;s5{u literal 0 HcmV?d00001 diff --git a/public/images/items/dark_tera_shard.png b/public/images/items/dark_tera_shard.png new file mode 100644 index 0000000000000000000000000000000000000000..4060f9142f63b552d6de93a261298dcefd059ec8 GIT binary patch literal 349 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCil&0(?STf%O0X|2J;E{BqU&6-!ploH|oi$MA%QWlGL+pw#DeQ;q^Du96_X zV4yMxVAym<=R8o9v%n*=n1O-sFbFdq&tH)O6x`(L;uvD#e|6$Tp~DIsEDv>B{`}|v ze(9n{*6r)lY*G%bYnQUzf8{;brQ6nyE??j2Hwi4R5!$j~N)uby!@vWZrWtZCI>+%i zxYtv__RdtsUjL?y9meyn`dM*yD6j`hc`%t56nYhY-^|b|+5V+LrDN7?)`|)D{Fu^< zf17;@+|lQ7M%!!ktJy~xDpG8?_9)9}{tazrII{7B-UoH|&#%MRUwg=)7ynZs=cB@# gLh*aozopr0O8n-0{{R3 literal 0 HcmV?d00001 diff --git a/public/images/items/dragon_tera_shard.png b/public/images/items/dragon_tera_shard.png new file mode 100644 index 0000000000000000000000000000000000000000..8c16e2f8eb601f07e583555b93278c72ff124f5c GIT binary patch literal 349 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCil&0(?STf%O0X|Bv5&{cz`vQ(b!|?YW`g-EzIJZLMVwQ0j`(<*7i5t0c%T z7^n;a7&e{JIS&-&EbxddW?o0LQA+NCV_UwO}U>9)0_%hz}MO#+K+gtjc0(!>__Fz~>pX@=a3&T%{r z?)4O~y)%`u*S{%ahw;3tepZ|v3hcpB9!%y1g6kT}wPM0OKc@8J z-)5fzcl0@&(e_&XYW7iviWD2JJ<2kge?yxYj%@s(_d%Wg^Xu^S*B&zH#s5^u`Ka)w gQ2gFCd5-5lS-wikdo`>N0tFj`r>mdKI;Vst0BNF)cmMzZ literal 0 HcmV?d00001 diff --git a/public/images/items/electric_tera_shard.png b/public/images/items/electric_tera_shard.png new file mode 100644 index 0000000000000000000000000000000000000000..e4e1003edbcd45ba76b6d5bcccff8b6a85e0502d GIT binary patch literal 349 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCil&0(?STf%O0X|L?qe{`33Z&!5+Qdc5x9Z1%O+k|&1)Wf(T3&pHaExJrWj zf`Q5)fML@ao%29Z&H|6fVg?4j!ywFfJby(BP;ir{i(`m||J8{Xg$^rlusqah`SYLu z`=yH-S+}oGvq?F$u3gG<|CRS#mu_1-x_o`7-z2cOMrg}|DNSr)4+9Tunr6to=p4u6 z;9gGw+dESkd;Oa-b{NmQ>Sx8-p}-z2<-ufLQ0P_oeKSL=Wc!x}m5y1nSt};o^J7Xc z{%!Uta7UlR8EvoCuVx=*s7SHl+M_I^`8Twg;mF1hdLPu;KfexNf9)ZIUi?pmoR11` h3dQeTljnH;ljWP}~ literal 0 HcmV?d00001 diff --git a/public/images/items/fairy_tera_shard.png b/public/images/items/fairy_tera_shard.png new file mode 100644 index 0000000000000000000000000000000000000000..83e19aeaeba3f2a49f63ecd3856c8c960573ee8a GIT binary patch literal 349 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCil&0(?STf%O0X|F1sy{Q3Bm?&c+X&c51hmj7_+)JK!o0HtQX^br73TqQw% z!9ZmYz_96z&Uv6HXMsm#F#`kNVGw3Kp1&dmD7eYf#WBRf|LVkxLWdPNSRU%M{Q1xS z{nAB^tlQV8*`yp=*Dhtb|H^x=OSi2ZUB154ZxUEsBeZ3~lqR;Yhk*w+O*7T~dnu6ODhcun z1}cL9hD~R5&I3g`3p^r=85sBugD~Uq{1quc!A+hnjv*HQS0`Q+I;_CK@=&Mc&wu{! zmo92#-M&7}Cgsq&b}7sKSKf17x^3;~^7Wm5lfdE{p)CuhG_i#}3_P%Dnj!b1a~zL@ zdp!kg?@VRv^>519VLb1upA~0^0(-EO2a|b0p;zJe%?z!Q?Oz&HI%dsgt(b7nk14(Q zx7nw_9eoaGw7pipntha^BE^PlkFt#B-_T};BO5>HeNbor{5pL7wTBFP@jn%EJ}SH^ g6u);(p5ysXmao$CUJdJmK*7e~>FVdQ&MBb@0L<}=(*OVf literal 0 HcmV?d00001 diff --git a/public/images/items/fire_tera_shard.png b/public/images/items/fire_tera_shard.png new file mode 100644 index 0000000000000000000000000000000000000000..74a04df16804ee75e7a8a2b7e3735362ea522f1b GIT binary patch literal 349 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCil&0(?STf%O0X|6d-z{(0-f7dvlBSEK+1H+i}^hFJJtop@2~umXp(qS%uE{}20? zXNkVuc3rpj!<3lj6>s9d>~8q-NmyY~)pc=)jKwufTNX@dN?UUv%pvmh4939pmXEtT zI0e?eJJs;azae9X@w}|behf-4nl;aQFz^@rYI(FSoq@~P>?I?ofT=lm!Gt(JhU(8h zZolY1V99i)!Zq{y)*zk+_igSCqh0`+;WLf zT@vIM3{(jP3|{_>pMb)g1s;*b3=DjSL74G){)!Z!;AT%3#}Etus}nDZ9ai9QR^;>g z{a=1hiTmn|?R)cHHZOl7!(;np<&A&?-8Iq#^@O_xr{PXMj)uA^UZim-1 mcop;hZQ)S75Th= z|CirW;=Vd#``)~l&C8!ixjg-`=sxR`>F*f?udd$5;3WN2cmeBD5tC$AIo2s#dn5%) z-6ZyV`82$EwvH#`A4^A@_2ZRhFIg0t>}Fi*VfnzY++Sl|725)Xz2Q^Ju1-y2u-RnGv`0Bd^Y2ndhNS2}d>yst literal 0 HcmV?d00001 diff --git a/public/images/items/grass_tera_shard.png b/public/images/items/grass_tera_shard.png new file mode 100644 index 0000000000000000000000000000000000000000..01bf4bde64043219f681ad59d5c18679f37ab708 GIT binary patch literal 339 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCil21AIbUf%O0X|1ZBhbn4~W)eny|EcE~XzGeCCZlHLh{V{hS#aR;M7YtMb z1`NUe6+$4v0*}aI1_r*vAk26?e?^{)Uw`u;gU49$m literal 0 HcmV?d00001 diff --git a/public/images/items/ground_tera_shard.png b/public/images/items/ground_tera_shard.png new file mode 100644 index 0000000000000000000000000000000000000000..153bbd9058cc171b42c70e44aa7a38a33e6b6d4b GIT binary patch literal 349 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCil&0(?STf%O0X|6g3Ya`EiO8^_i?JimT^2E&<4*Y<4d14Sx8-p}-z2<-ufLQ0P_oeKSL=Wc!x}m5y1nSt};o^J7Xc z{%!Uta7UlR8EvoCuVx=*s7SHl+M_I^`8Twg;mF1hdLPu;KfexNf9)ZIUi?pmoR11` h3dQeTljnH;ljWcoRWhZQ(n7#;uo*FU#xvE!9( z*Qd!CJ+u`!y|VAhdoGc;lO2xy`C{JKu(U>Khli#s+YMHSDSbVm3T7@E^YV0<3Qdz) zc=mA|$!n{)V)0U`!+M88YJ*Awvw8aye|zpji@FpAC$J=$hKkFm-10n-lM|nA$NgQf zq0lumw0^OG!ZXS9Oz%9hyy~y2bX44};P`Q}@6SI`Q!9yvr`GdZl;^b=^F7S{+j!v? Z>$N}9XI-oh_W<3_;OXk;vd$@?2>|Lzgk}H$ literal 0 HcmV?d00001 diff --git a/public/images/items/normal_tera_shard.png b/public/images/items/normal_tera_shard.png new file mode 100644 index 0000000000000000000000000000000000000000..fe2b9b93fd6159465198f585306dcef13a1c503e GIT binary patch literal 349 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCil&0(?STf%O0X|37|w`sUV&ySJ}DxOZ#*q}KIk9^5~=3@FtiY`_AfxJrWj zf`Q5)fML@ao%29Z&H|6fVg?4j!ywFfJby(BP;ir{i(`m||J8{Xg$^rlusqah`SYLu z`=yH-S+}oGvq?F$u3gG<|CRS#mu_1-x_o`7-z2cOMrg}|DNSr)4+9Tunr6to=p4u6 z;9gGw+dESkd;Oa-b{NmQ>Sx8-p}-z2<-ufLQ0P_oeKSL=Wc!x}m5y1nSt};o^J7Xc z{%!Uta7UlR8EvoCuVx=*s7SHl+M_I^`8Twg;mF1hdLPu;KfexNf9)ZIUi?pmoR11` h3dQeTljnH;ljW$lS>O>_%)r2R7=#&*=dVZs3U2araSXBWzdG@v&|w7*mWMhmfBy4- zzjRR}>-P0&HYtbJwM$vin*yH(+s&6o#S{M z-0LY|duJ+RuYXg<4&!-O{j4}U6xf5MJebT23cU)yZ)RwfZ2!`r(lKi`YsG|neoX1b zzs)`c?&xzkqwTf&)$F4T6)84cdz57~|Asa*9NG9m?}Iw~=hxxuuRUbYi~p&R^HJeV gq4>RP@*K~9vV4`6_i9)l1PV3=Pgg&ebxsLQ03$<Z=S4ogx zFi;r;Fl;)ba~>$lS>O>_%)r2R7=#&*=dVZs3U2araSXBWzdG@v&|w7*mWMhmfBy4- zzjRR}>-P0&HYtbJwM$vin*yH(+s&6o#S{M z-0LY|duJ+RuYXg<4&!-O{j4}U6xf5MJebT23cU)yZ)RwfZ2!`r(lKi`YsG|neoX1b zzs)`c?&xzkqwTf&)$F4T6)84cdz57~|Asa*9NG9m?}Iw~=hxxuuRUbYi~p&R^HJeV gq4>RP@*K~9vV4`6_i9)l1PV3=Pgg&ebxsLQ04s=&GXMYp literal 0 HcmV?d00001 diff --git a/public/images/items/rock_tera_shard.png b/public/images/items/rock_tera_shard.png new file mode 100644 index 0000000000000000000000000000000000000000..b4e6f8a29cfe7e1e51e551bf768e44cf2245c526 GIT binary patch literal 349 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCil&0(?STf%O0X{~upkdtmp&)k`j3Tr+>ZrO@i`&DGT){UNjeeg#roB|(0{ zKxGiXu<4A>d7vm~fk$L90|Vb-5N14{zaj-FxXIJSF~q|E>copehZQ(j9_qCG`Op9T z(nXD|+t;Vrq#Rn;E@ip@%6qO$x2+vrzP{6M5?EX#v}M7RCbqDLfd@8CGvr=$j^lA~ zucv_RovDny{!JM>jOShTv*PSfU=Nn^U@|W#^eX(mnW0s({Y!&N$E?|`6%+3HF{Ky( zHv1H~qtD@tw%6)cvyU=Vq}XunQI^sC8`{ipWa9_D59;inUx%;1_K-m@{-;9DM};?q g;`gq}b3Fga@>N>it6_Z*DA*W0UHx3vIVCg!0O^8`0RR91 literal 0 HcmV?d00001 diff --git a/public/images/items/steel_tera_shard.png b/public/images/items/steel_tera_shard.png new file mode 100644 index 0000000000000000000000000000000000000000..b0b2ccb173711a311a9e81269e9cd286b043dfe5 GIT binary patch literal 349 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCil&0(?STf%O0X|L;70c;w>Q72Efox^UgnIda>qw#vz~fl_7*R(Jp@u96_X zV4yMxVAym<=R8o9v%n*=n1O-sFbFdq&tH)O6x`(L;uvD#e|6$Tp~DIsEDv>B{`}|v ze(9n{*6r)lY*G%bYnQUzf8{;brQ6nyE??j2Hwi4R5!$j~N)uby!@vWZrWtZCI>+%i zxYtv__RdtsUjL?y9meyn`dM*yD6j`hc`%t56nYhY-^|b|+5V+LrDN7?)`|)D{Fu^< zf17;@+|lQ7M%!!ktJy~xDpG8?_9)9}{tazrII{7B-UoH|&#%MRUwg=)7ynZs=cB@# gLh*aozopr05)okJ^%m! literal 0 HcmV?d00001 diff --git a/public/images/items/stellar_tera_shard.png b/public/images/items/stellar_tera_shard.png new file mode 100644 index 0000000000000000000000000000000000000000..b6625066e16fed879dfc2f804942713f7d95af35 GIT binary patch literal 408 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCik_0(?STf%O0X|L?qe{`33Z&!5+Qdc2Ndq5uE)Ez56rUw(OL^~2*AXR}WZ zXE<==m8J9E&cl!IetUZI_`Btj?R#_Y+^kp%)Xv=0Qv{^MN`m}?fkt5h2F6PVo&Z&F z7I;J!GcfQS24TkI`72U@f_pt(978PpulAo7YgXWK5ndq}5>WH!|9Z2p94s5&Zj%jv z6351TeEOet43#zN3<}FCl^K$k+HUi`X|SSREd9_3b~sg5|(Gj-3jh zyckSe${hUeY!O;xc;>3bGE=U``UgkPE?H)x&)Quk(GjAj!Q$|I?riZdGp8SVv^V;O zPz+bY=JYq0n9`RBT-%VRI*sXp+_%te^97waZr}T$!_e0IdwsCqoDa-3d!IV(IO??H hcx1(Fdx5^koS`>8Dy{z=PX>B~!PC{xWt~$(69CWRw?6;? literal 0 HcmV?d00001 diff --git a/public/images/items/tera_orb.png b/public/images/items/tera_orb.png new file mode 100644 index 0000000000000000000000000000000000000000..f4b6e47398e2d64b37104ff4fc22b7bd488c53ee GIT binary patch literal 391 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCikd1AIbUfpnmzcam+4lZT@*i}uN#$MeFnLOf#>G?o7U|L<-TM1MG8>xgr|#Rh=u>% zN!~&&3Op{KoeNps*WY>R;!?7v$bN6bggTRzLAT<*^fR>HO1xg7l+^g6iKq0&s)(F7 z+hjwVN@f+eY3pvHJFB7XM?su}z=7PIt@w T%5x4tKQVZ^`njxgN@xNA1KmF)sjTqQw% z!9ZmYz_96z&Uv6HXMsm#F#`kNVGw3Kp1&dmD7eYf#WBRf|LVkxLWdPNSRU%M{Q1xS z{nAB^tlQV8*`yp=*Dhtb|H^x=OSi2ZUB154ZxUEsBeZ3~lqR;Yhk*w+O*7iKpKjm;ivzO>h5O=l`T_0EpfH|Hn%Ik@vdE|CQ43@sX<}e+IKjL_t(&-j$i> zW7Aj+z(tou(k5v}TU^546w*>?;V1_j^Vpl?_MZR$_tSgQTehQDge*Tl{Ve%OapD?) zqpAQLJ*di2IGB+D6a~hn1{8<|2Gax_G(KnQ0GjDw8m_^(Vp9h&HBAu`(+~j@QwOFL z>WJ&wi4amWM~Dnouc6?%m`VWC%NeV|B!E(=b=|)Xu&xSqfAfMWD|bx-;YLqJlaR0 zbh!v{Q5EXuVO7ZAQ{^!9GD3hSp#e|GOnXMjsUGtYr208U`-Y3<^fg6 zKdZ_Cn9T?S{^xAgZbt1<05EQ+13F|R)LU0uAu?& zH)aE1FW4+(mN(G=XoXtW{rmad%-sFZ)7#z4d>rTlA$#9Xv++>{sPvPh3W&ApPES)H z1BEm76cRyF9QfQ6D0vvDufm4p8&h@_V0xiub^k16J`mK+Gpdk(QI#{Wm=OZxcaskI zsly%^f3j0_cJTz$Nmlu(zoN z&_*}1Xf+z~MP>@s()}%fmMYZEOa@rgBP?bzP!4Np$t_XZ_|T37kjk~258}3Q)wPWMu4e*qy(Ug#+Yd~$R+^tE#CEyoLy8>bb|>gLUb}+ zXB;5ibUQ&wSsK27$WVswc1Fkh$@-M<2` zq6&5Mq$=c}Q{^PgWh4M**>k)ZTL;odpax*hoQ!h@X-*-4h4Cjd^ULft&13iQv;%t;}lp)(W#~A_`gh2z@~%_BCFd)#_aQjn$i6;ka;;s-8`!b`3I_;g+WFL zFv~R-c@&PU8X$S{sl3@^U|@${k&gnvWp-X4-6E1AI(@(?QeZF$KrtA203*QNf0fDC zt*inKFfe&gj5{)#FVw2;-_KLfIaSC%ROK8DGeUq_y|Fkn#gV~KMixlkgv($kBL?_X zhuDFeaw%+ahXU9s8A%EnhEK~d&Lb(v42R+3Fc=Tm{+XdPawvT@0NPxVhX+o1nVCYZ z>Hht^3(EX5LtlS4*w4H>Tv!mmf0Wi(F{}wteH5w#3o=bcka`LSNUo+7AxteooI)<7 z4#c-*^&$~jalsna7*GneqWkyr6qNnlY^!nz+8JSh*4|FvTGK=X#9y=Cq(B?dSUVkz z2TXbGTv2$F0Bsx6DteQoXt#@O3X~M_QsNY7OuO;|J^)&wQ1>GMszTk&e>`Ww+_EZj zu$&PK6lm3M(f>hKfLcqLh=FCV%YGjNHmamqo|b}#XiXe}KV(`8jDdhVfI^xpUv`S_ z$N_4hQ1|broA2JefB)#wqfeinJbCip-+%u6{k?nlUcY|v;-`-vA3uH!@bA{n?(X*X z)vGseUcdg;x8HnuafjmPQk2ig>!b2&RwfR3Mv?cn%5t|% zWy6?BS^7e4Hx-I11;6Q~{tMvc%jeJU-o5+k)q@8Q{`mdZUw*uQ|NfgdZ{Pm#@ZrM` aAK-r-3(V0#z@_&90000#EXJwOd0VIC~ ziAh93RA}CnnTKN9Kny^YFsuM!7|2eWru+YYuv)i`j;gYJK0Ql534`MTyt@MMe&@S_65@d$kWM8Tm!pu(*jtUsR)Ich=7G@feVFt^ZjoCZ>|8q zS69ftaOEp3Iue0_dblv9Z356nF06l>Q@|nu3v^S^zv&47lVTDW_@fd{3y=fFnrVQG zh5F+AzW{u3g}S+Qh5Wa!Y~i*e25=SFqK;Gxpu97ufLoh36Z|E>;Wb6{R}oT*=?Iy@ z`WgnE%c%n3Ufzl(Qvgn(UVQ%xz>6!?%|EV?|Ln>iIClijTmm)c(x?(pH!^=3-V1P+ zQ8IRN30R&Xo@t{Lp-RyLQ^rzgBg1sMJ;N%vcW2SKKcD0Hd_|#r`3vyZ73$`zE9Bq1 z@(TNo5MUMF+i0(wmR|v`fC4(oRe^nF5ZS6~3fzYjHriX7m|`DOq;s7VLz5!i`qs_@ zz*6{_Cr$f>TKfJaz|s}!=5K#j$baw3Z@BM>0#bl`-L#GO+~5po+gJl?GOYlMZr z_Yzr8w?u9VoofO8d^UhYBNIBR;|%Z$_2m1X0G?c-Zr->;{+TN`Fzbi{@#kzN8><{8 z0P}VVz{4CcOKK5pE~UU(2(9-|1t10>eA(7ON@3S90mK_~0+0*lh0K3+GfjY3s2AUV z&F^OC?uWhK?tSOuKpzO($A0prM-@=@lcWaBiiXq66sW)uOq;?YSc;qfO@Wq2fp!%V zQg2M#Rlwy!&3yk1Iv)t?<_}lMzj5UUY&t@K{ch5MK6S_etIRQ=eKY{|vu{HKHqpd$ zWr#5aRse>_p_oDe4x4`gZ3?jhUs;7W_Us(|z`E8%RPr%2Js z*h~WK`*oE+(G~#3l>nxX?-UWK;u(keKzZPTl`P^b^z{{isf3U%|@74rM9{+>Ip2De+- z4k#*{jqMN(7^*iwLp&^iZ8X`Tr5M6YOkrUfAUiovfmMHsZIfaf|1v27NeNp-)v(J9 z@B4+i_5HWdc{xbk{OJn$kFNZLV@C+!<+4Q`r6W-WiYK4y&7J~B8Ae4tN`RI*cw=-y zEJb$uQB#z_@tA<&c#HsMK)5T5uUlIMGH~QPXeJ!7_6zms`>%Nl`sE7wPp>22gTY9vuYLWp)bnhS7gFICkD0E|&&yY1x`lEr9w_s0Efb zO~#NmMF1?^x_|{NTzQ4jmC-KvCJU|AVZ6rlm^cz#-}(?sGt*TAIV96gosPc?A8C wc_}I|2NE6t3dvV~2#Vn-0B)hs_xHQ`57kL`Oehs(Bme*a07*qoM6N<$f(>@Mw*UYD diff --git a/public/images/types/stellar.png b/public/images/types/stellar.png new file mode 100644 index 0000000000000000000000000000000000000000..d10d1babe4e4de3113d46794aab1afa9e3ab198b GIT binary patch literal 813 zcmV+|1JeA7P)o`fNktk&l948O3#x;7t4m=L9fAnDsOV*5#`3ZuLXfgxo+|28 zgb;y-)uC@JF{oB!qYzz8H&FN0ZEZTdvopJ?6+VY~p83yzp3ixoQ2@*y(*!_XAqz)5 zQvJwxpx0$E>V@$68UTwgrf{Lo zAwq``p(+gD9dLg{^lOOg*@yvw;cZ3q3Pi8Kdr45=CV0Bg%7rGu$;aK&vl1d+8%G~( z$q3%i7^k5z&hS_Z`)8{0H%IU{M{u8iPIvS$0IIlloS+^6prf-3Ll1yHOh;#zjRP5W zhPcNwZmSn%#Wly`8GeI0bfo!7VQT6{W42HRw``HZ=PDgLdP0uq*G`0uI&%luH}A7s z3}9rBrZLxIYETc*(b**dJ%BMA17Z&Q*DK((%?auOjJZnSv<#jMacR;A^^#ukZ4b=n zBdjX_44&a(WM$ zV&7KJK}CoGi!)jN0j)@rhw48@;0o#iL|;3iuidHAwaZ~AYn;}Fsu2Ae#| zNh;=<2i5}iO0{Zf)3feIOy7nBTc-)<-dnQ?|FwwHmy!Bq=qo#p9@x|>{_I{@x9W+k zjrtL_6PYQP;pJEq1z=*!kO{E5A_FgMb>i~KMZ=_LhdKX8UfdP;Fbi?upR%~a^k>DHPJA=#uq+>g==Qr?I>eQa zu9dsGr02}x3TK9euQQeX&gkS%YWo-R0M$(+ic8n*)t{xa*Sjz%Al{CiAQbO;+sMw`4TwnrsB7X0YKsG#811S72%8(9gW#>a message = Phaser.Math.RND.pick(encounterMessages), this.scene.currentBattle.waveIndex); + this.scene.executeWithSeedOffset(() => message = Utils.randSeedItem(encounterMessages), this.scene.currentBattle.waveIndex); this.scene.ui.showDialogue(message, trainer.getName(), null, doSummon); } } @@ -1699,9 +1699,12 @@ export class BattleEndPhase extends BattlePhase { this.scene.clearEnemyHeldItemModifiers(); - const lapsingModifiers = this.scene.findModifiers(m => m instanceof LapsingPersistentModifier) as LapsingPersistentModifier[]; + const lapsingModifiers = this.scene.findModifiers(m => m instanceof LapsingPersistentModifier || m instanceof LapsingPokemonHeldItemModifier) as (LapsingPersistentModifier | LapsingPokemonHeldItemModifier)[]; for (let m of lapsingModifiers) { - if (!m.lapse()) + const args: any[] = []; + if (m instanceof LapsingPokemonHeldItemModifier) + args.push(this.scene.getPokemonById(m.pokemonId)); + if (!m.lapse(args)) this.scene.removeModifier(m); } @@ -2322,7 +2325,7 @@ export class WeatherEffectPhase extends CommonAnimPhase { }; this.executeForAll((pokemon: Pokemon) => { - const immune = !pokemon || !!pokemon.getTypes().filter(t => this.weather.isTypeDamageImmune(t)).length; + const immune = !pokemon || !!pokemon.getTypes(true).filter(t => this.weather.isTypeDamageImmune(t)).length; if (!immune) inflictDamage(pokemon); }); @@ -2753,7 +2756,7 @@ export class TrainerVictoryPhase extends BattlePhase { let showMessageAndEnd = () => this.end(); if (victoryMessages?.length) { let message: string; - this.scene.executeWithSeedOffset(() => message = Phaser.Math.RND.pick(victoryMessages), this.scene.currentBattle.waveIndex); + this.scene.executeWithSeedOffset(() => message = Utils.randSeedItem(victoryMessages), this.scene.currentBattle.waveIndex); const messagePages = message.split(/\$/g).map(m => m.trim()); for (let p = messagePages.length - 1; p >= 0; p--) { diff --git a/src/battle-scene.ts b/src/battle-scene.ts index c16aaf9d5..276b74f10 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -4,7 +4,7 @@ import { EncounterPhase, SummonPhase, NextEncounterPhase, NewBiomeEncounterPhase import Pokemon, { PlayerPokemon, EnemyPokemon } from './pokemon'; import PokemonSpecies, { PokemonSpeciesFilter, allSpecies, getPokemonSpecies, initSpecies, speciesStarters } from './data/pokemon-species'; import * as Utils from './utils'; -import { Modifier, ModifierBar, ConsumablePokemonModifier, ConsumableModifier, PokemonHpRestoreModifier, HealingBoosterModifier, PersistentModifier, PokemonHeldItemModifier, ModifierPredicate, DoubleBattleChanceBoosterModifier, FusePokemonModifier, PokemonFormChangeItemModifier } from './modifier/modifier'; +import { Modifier, ModifierBar, ConsumablePokemonModifier, ConsumableModifier, PokemonHpRestoreModifier, HealingBoosterModifier, PersistentModifier, PokemonHeldItemModifier, ModifierPredicate, DoubleBattleChanceBoosterModifier, FusePokemonModifier, PokemonFormChangeItemModifier, TerastallizeModifier } from './modifier/modifier'; import { PokeballType } from './data/pokeball'; import { initAutoPlay } from './system/auto-play'; import { initCommonAnims, initMoveAnim, loadCommonAnimAssets, loadMoveAnimAssets, populateAnims } from './data/battle-anims'; @@ -49,6 +49,8 @@ import { Nature } from './data/nature'; import { SpeciesFormChangeTimeOfDayTrigger, SpeciesFormChangeTrigger, pokemonFormChanges } from './data/pokemon-forms'; import { FormChangePhase, QuietFormChangePhase } from './form-change-phase'; import { BattleSpec } from './enums/battle-spec'; +import { getTypeRgb } from './data/type'; +import PokemonSpriteSparkleHandler from './sprite/pokemon-sprite-sparkle-handler'; const enableAuto = true; const quickStart = false; @@ -141,6 +143,8 @@ export default class BattleScene extends Phaser.Scene { public seed: string; public waveSeed: string; + private spriteSparkleHandler: PokemonSpriteSparkleHandler; + public fieldSpritePipeline: FieldSpritePipeline; public spritePipeline: SpritePipeline; @@ -235,6 +239,8 @@ export default class BattleScene extends Phaser.Scene { this.loadImage('achv_bar_4', 'ui'); this.loadImage('shiny_star', 'ui', 'shiny.png'); this.loadImage('icon_spliced', 'ui'); + this.loadImage('icon_tera', 'ui'); + this.loadImage('type_tera', 'ui'); this.loadImage('pb_tray_overlay_player', 'ui'); this.loadImage('pb_tray_overlay_enemy', 'ui'); @@ -318,8 +324,10 @@ export default class BattleScene extends Phaser.Scene { this.loadImage(`pkmn__sub`, 'pokemon', 'sub.png'); this.loadAtlas('battle_stats', 'effects'); this.loadAtlas('shiny', 'effects'); + this.loadImage('tera', 'effects'); this.loadAtlas('pb_particles', 'effects'); this.loadImage('evo_sparkle', 'effects'); + this.loadAtlas('tera_sparkle', 'effects'); this.load.video('evo_bg', 'images/effects/evo_bg.mp4', true); this.loadAtlas('pb', ''); @@ -501,6 +509,9 @@ export default class BattleScene extends Phaser.Scene { this.updateUIPositions(); + this.spriteSparkleHandler = new PokemonSpriteSparkleHandler(); + this.spriteSparkleHandler.setup(this); + this.party = []; let loadPokemonAssets = []; @@ -537,6 +548,15 @@ export default class BattleScene extends Phaser.Scene { showOnStart: true }); + this.anims.create({ + key: 'tera_sparkle', + frames: this.anims.generateFrameNumbers('tera_sparkle', { start: 0, end: 12 }), + frameRate: 18, + repeat: 0, + showOnStart: true, + hideOnComplete: true + }); + this.reset(); if (this.quickStart) { @@ -1036,6 +1056,18 @@ export default class BattleScene extends Phaser.Scene { return ret; } + addPokemonSprite(pokemon: Pokemon, x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number, hasShadow: boolean = false, ignoreOverride: boolean = false): Phaser.GameObjects.Sprite { + const ret = this.addFieldSprite(x, y, texture, frame); + this.initPokemonSprite(ret, pokemon); + return ret; + } + + initPokemonSprite(sprite: Phaser.GameObjects.Sprite, pokemon?: Pokemon, hasShadow: boolean = false, ignoreOverride: boolean = false): Phaser.GameObjects.Sprite { + sprite.setPipeline(this.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: hasShadow, ignoreOverride: ignoreOverride, teraColor: pokemon ? getTypeRgb(pokemon.getTeraType()) : undefined }); + this.spriteSparkleHandler.add(sprite); + return sprite; + } + showFieldOverlay(duration: integer): Promise { return new Promise(resolve => { this.tweens.add({ @@ -1460,10 +1492,13 @@ export default class BattleScene extends Phaser.Scene { return new Promise(resolve => { const soundName = modifier.type.soundName; this.validateAchvs(ModifierAchv, modifier); + const modifiersToRemove: PersistentModifier[] = []; if (modifier instanceof PersistentModifier) { + if (modifier instanceof TerastallizeModifier) + modifiersToRemove.push(...(this.findModifiers(m => m instanceof TerastallizeModifier && m.pokemonId === modifier.pokemonId))); if ((modifier as PersistentModifier).add(this.modifiers, !!virtual, this)) { - if (modifier instanceof PokemonFormChangeItemModifier) - modifier.apply([ this.getPokemonById(modifier.pokemonId) ]); + if (modifier instanceof PokemonFormChangeItemModifier || modifier instanceof TerastallizeModifier) + modifier.apply([ this.getPokemonById(modifier.pokemonId), true ]); if (playSound && !this.sound.get(soundName)) this.playSound(soundName); } else if (!virtual) { @@ -1471,6 +1506,9 @@ export default class BattleScene extends Phaser.Scene { this.queueMessage(`The stack for this item is full.\n You will receive ${defaultModifierType.name} instead.`, null, true); return this.addModifier(defaultModifierType.newModifier(), ignoreUpdate, playSound, false, instant).then(() => resolve()); } + + for (let rm of modifiersToRemove) + this.removeModifier(rm); if (!ignoreUpdate && !virtual) return this.updateModifiers(true, instant).then(() => resolve()); @@ -1509,9 +1547,17 @@ export default class BattleScene extends Phaser.Scene { }); } - addEnemyModifier(itemModifier: PersistentModifier, ignoreUpdate?: boolean, instant?: boolean): Promise { + addEnemyModifier(modifier: PersistentModifier, ignoreUpdate?: boolean, instant?: boolean): Promise { return new Promise(resolve => { - itemModifier.add(this.enemyModifiers, false, this); + const modifiersToRemove: PersistentModifier[] = []; + if (modifier instanceof TerastallizeModifier) + modifiersToRemove.push(...(this.findModifiers(m => m instanceof TerastallizeModifier && m.pokemonId === modifier.pokemonId, false))); + if ((modifier as PersistentModifier).add(this.enemyModifiers, false, this)) { + if (modifier instanceof PokemonFormChangeItemModifier || modifier instanceof TerastallizeModifier) + modifier.apply([ this.getPokemonById(modifier.pokemonId), true ]); + for (let rm of modifiersToRemove) + this.removeModifier(rm, true); + } if (!ignoreUpdate) this.updateModifiers(false, instant).then(() => resolve()); else @@ -1586,7 +1632,15 @@ export default class BattleScene extends Phaser.Scene { else modifierChance = !isBoss ? 12 : 4; - this.getEnemyParty().forEach((enemyPokemon: EnemyPokemon, i: integer) => { + const party = this.getEnemyParty(); + + if (this.currentBattle.trainer) { + const modifiers = this.currentBattle.trainer.genModifiers(party); + for (let modifier of modifiers) + this.addEnemyModifier(modifier, true, true); + } + + party.forEach((enemyPokemon: EnemyPokemon, i: integer) => { let pokemonModifierChance = modifierChance; if (this.currentBattle.battleType === BattleType.TRAINER) pokemonModifierChance = Math.ceil(pokemonModifierChance * this.currentBattle.trainer.getPartyMemberModifierChanceMultiplier(i)); @@ -1657,33 +1711,27 @@ export default class BattleScene extends Phaser.Scene { const modifierIndex = modifiers.indexOf(modifier); if (modifierIndex > -1) { modifiers.splice(modifierIndex, 1); + if (modifier instanceof PokemonFormChangeItemModifier || modifier instanceof TerastallizeModifier) + modifier.apply([ this.getPokemonById(modifier.pokemonId), false ]); return true; } return false; } - getModifiers(modifierType: { new(...args: any[]): Modifier }, player?: boolean): PersistentModifier[] { - if (player === undefined) - player = true; + getModifiers(modifierType: { new(...args: any[]): Modifier }, player: boolean = true): PersistentModifier[] { return (player ? this.modifiers : this.enemyModifiers).filter(m => m instanceof modifierType); } - findModifiers(modifierFilter: ModifierPredicate, player?: boolean): PersistentModifier[] { - if (player === undefined) - player = true; + findModifiers(modifierFilter: ModifierPredicate, player: boolean = true): PersistentModifier[] { return (player ? this.modifiers : this.enemyModifiers).filter(m => (modifierFilter as ModifierPredicate)(m)); } - findModifier(modifierFilter: ModifierPredicate, player?: boolean): PersistentModifier { - if (player === undefined) - player = true; + findModifier(modifierFilter: ModifierPredicate, player: boolean = true): PersistentModifier { return (player ? this.modifiers : this.enemyModifiers).find(m => (modifierFilter as ModifierPredicate)(m)); } - applyModifiers(modifierType: { new(...args: any[]): Modifier }, player?: boolean, ...args: any[]): void { - if (player === undefined) - player = true; + applyModifiers(modifierType: { new(...args: any[]): Modifier }, player: boolean = true, ...args: any[]): void { const modifiers = (player ? this.modifiers : this.enemyModifiers).filter(m => m instanceof modifierType && m.shouldApply(args)); for (let modifier of modifiers) { if (modifier.apply(args)) @@ -1691,9 +1739,7 @@ export default class BattleScene extends Phaser.Scene { } } - applyModifier(modifierType: { new(...args: any[]): Modifier }, player?: boolean, ...args: any[]): PersistentModifier { - if (player === undefined) - player = true; + applyModifier(modifierType: { new(...args: any[]): Modifier }, player: boolean = true, ...args: any[]): PersistentModifier { const modifiers = (player ? this.modifiers : this.enemyModifiers).filter(m => m instanceof modifierType && m.shouldApply(args)); for (let modifier of modifiers) { if (modifier.apply(args)) { diff --git a/src/battle.ts b/src/battle.ts index 4834bbda3..48f6db50a 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -216,7 +216,7 @@ function getRandomTrainerFunc(trainerPool: (TrainerType | TrainerType[])[]): Get const trainerTypes: TrainerType[] = []; for (let trainerPoolEntry of trainerPool) { const trainerType = Array.isArray(trainerPoolEntry) - ? Phaser.Math.RND.pick(trainerPoolEntry) + ? Utils.randSeedItem(trainerPoolEntry) : trainerPoolEntry; trainerTypes.push(trainerType); } diff --git a/src/data/ability.ts b/src/data/ability.ts index 1253b92ed..13b0357fe 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -322,7 +322,7 @@ export class PostDefendTypeChangeAbAttr extends PostDefendAbAttr { applyPostDefend(pokemon: Pokemon, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean { if (hitResult < HitResult.NO_EFFECT) { const type = move.getMove().type; - const pokemonTypes = pokemon.getTypes(); + const pokemonTypes = pokemon.getTypes(true); if (pokemonTypes.length !== 1 || pokemonTypes[0] !== type) { pokemon.summonData.types = [ type ]; return true; @@ -333,7 +333,7 @@ export class PostDefendTypeChangeAbAttr extends PostDefendAbAttr { } getTriggerMessage(pokemon: Pokemon, ...args: any[]): string { - return getPokemonMessage(pokemon, `'s ${pokemon.getAbility().name}\nmade it the ${Utils.toReadableString(Type[pokemon.getTypes()[0]])} type!`); + return getPokemonMessage(pokemon, `'s ${pokemon.getAbility().name}\nmade it the ${Utils.toReadableString(Type[pokemon.getTypes(true)[0]])} type!`); } } @@ -656,7 +656,7 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr { const targets = pokemon.getOpponents(); let target: Pokemon; if (targets.length > 1) - pokemon.scene.executeWithSeedOffset(() => target = Phaser.Math.RND.pick(targets), pokemon.scene.currentBattle.waveIndex); + pokemon.scene.executeWithSeedOffset(() => target = Utils.randSeedItem(targets), pokemon.scene.currentBattle.waveIndex); else target = targets[0]; diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index 1c24e10f8..9e419c369 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -6,6 +6,7 @@ import * as Utils from "../utils"; import { BattlerIndex } from "../battle"; import stringify, { Element } from "json-stable-stringify"; import { Moves } from "./enums/moves"; +import { getTypeRgb } from "./type"; //import fs from 'vite-plugin-fs/browser'; export enum AnimFrameTarget { @@ -764,8 +765,7 @@ export abstract class BattleAnim { const spriteSource = isUser ? userSprite : targetSprite; if ((isUser ? u : t) === sprites.length) { let sprite: Phaser.GameObjects.Sprite; - sprite = scene.addFieldSprite(0, 0, spriteSource.texture, spriteSource.frame.name); - sprite.setPipeline(scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: true }); + sprite = scene.addPokemonSprite(isUser ? user : target, 0, 0, spriteSource.texture, spriteSource.frame.name, true); [ 'spriteColors', 'fusionSpriteColors' ].map(k => sprite.pipelineData[k] = (isUser ? user : target).getSprite().pipelineData[k]); spriteSource.on('animationupdate', (_anim, frame) => sprite.setFrame(frame.textureFrame)); scene.field.add(sprite); diff --git a/src/data/egg.ts b/src/data/egg.ts index 3ee5ed752..6aed81310 100644 --- a/src/data/egg.ts +++ b/src/data/egg.ts @@ -98,7 +98,7 @@ export function getLegendaryGachaSpeciesForTimestamp(scene: BattleScene, timesta let ret: Species; scene.executeWithSeedOffset(() => { - ret = Phaser.Math.RND.pick(legendarySpecies); + ret = Utils.randSeedItem(legendarySpecies); }, Utils.getSunday(new Date(timestamp)).getTime(), EGG_SEED.toString()); return ret; @@ -109,7 +109,7 @@ export function getTypeGachaTypeForTimestamp(scene: BattleScene, timestamp: inte let ret: Type; scene.executeWithSeedOffset(() => { - ret = Phaser.Math.RND.pick(types); + ret = Utils.randSeedItem(types); }, Utils.getSunday(new Date(timestamp)).getTime(), EGG_SEED.toString()); return ret; diff --git a/src/data/move.ts b/src/data/move.ts index e33002001..cf24bd125 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -1813,7 +1813,7 @@ export class CopyTypeAttr extends MoveEffectAttr { if (!super.apply(user, target, move, args)) return false; - user.summonData.types = target.getTypes(); + user.summonData.types = target.getTypes(true); user.scene.queueMessage(getPokemonMessage(user, `'s type\nchanged to match ${target.name}'s!`)); diff --git a/src/data/pokemon-evolutions.ts b/src/data/pokemon-evolutions.ts index 303968b1b..bee2bc185 100644 --- a/src/data/pokemon-evolutions.ts +++ b/src/data/pokemon-evolutions.ts @@ -841,7 +841,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.GOGOAT, 32, null, null) ], [Species.PANCHAM]: [ - new SpeciesEvolution(Species.PANGORO, 32, null, new SpeciesEvolutionCondition(p => !!p.scene.getParty().find(p => p.getTypes(true).indexOf(Type.DARK) > -1)), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.PANGORO, 32, null, new SpeciesEvolutionCondition(p => !!p.scene.getParty().find(p => p.getTypes(false, true).indexOf(Type.DARK) > -1)), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.ESPURR]: [ new SpeciesFormEvolution(Species.MEOWSTIC, '', '', 25, null, new SpeciesEvolutionCondition(p => p.gender === Gender.MALE, p => p.gender = Gender.MALE)), diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 6caec2643..3ba9f5d0a 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -2372,6 +2372,7 @@ export const speciesStarters = { [Species.TOGEPI]: 3, [Species.NATU]: 2, [Species.MAREEP]: 3, + [Species.MARILL]: 4, [Species.HOPPIP]: 1, [Species.AIPOM]: 3, [Species.SUNKERN]: 1, diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 70a77b2a2..9523e8628 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -11,6 +11,7 @@ import { Species } from "./enums/species"; import { tmSpecies } from "./tms"; import { Type } from "./type"; import { initTrainerTypeDialogue } from "./dialogue"; +import { PersistentModifier, TerastallizeModifier } from "../modifier/modifier"; export enum TrainerPoolTier { COMMON, @@ -163,6 +164,7 @@ export const trainerPartyTemplates = { type PartyTemplateFunc = (scene: BattleScene) => TrainerPartyTemplate; type PartyMemberFunc = (scene: BattleScene, level: integer) => EnemyPokemon; +type GenModifiersFunc = (party: EnemyPokemon[]) => PersistentModifier[]; export interface PartyMemberFuncs { [key: integer]: PartyMemberFunc @@ -183,6 +185,7 @@ export class TrainerConfig { public encounterBgm: string; public femaleEncounterBgm: string; public victoryBgm: string; + public genModifiersFunc: GenModifiersFunc; public modifierRewardFuncs: ModifierTypeFunc[] = []; public partyTemplates: TrainerPartyTemplate[]; public partyTemplateFunc: PartyTemplateFunc; @@ -325,11 +328,16 @@ export class TrainerConfig { return this; } + setGenModifiersFunc(genModifiersFunc: GenModifiersFunc): TrainerConfig { + this.genModifiersFunc = genModifiersFunc; + return this; + } + setModifierRewardFuncs(...modifierTypeFuncs: (() => ModifierTypeFunc)[]): TrainerConfig { this.modifierRewardFuncs = modifierTypeFuncs.map(func => () => { const modifierTypeFunc = func(); const modifierType = modifierTypeFunc(); - modifierType.id = Object.keys(modifierTypes).find(k => modifierTypes[k] === modifierTypeFunc); + modifierType.withIdFromFunc(modifierTypeFunc); return modifierType; }); return this; @@ -352,6 +360,10 @@ export class TrainerConfig { this.setStaticParty(); this.setBattleBgm('battle_gym'); this.setVictoryBgm('victory_gym'); + this.setGenModifiersFunc(party => { + const waveIndex = party[0].scene.currentBattle.waveIndex; + return getRandomTeraModifiers(party, waveIndex >= 100 ? 1 : 0, specialtyTypes.length ? specialtyTypes : null); + }); return this; } @@ -373,6 +385,7 @@ export class TrainerConfig { this.setStaticParty(); this.setBattleBgm('battle_elite'); this.setVictoryBgm('victory_gym'); + this.setGenModifiersFunc(party => getRandomTeraModifiers(party, 2, specialtyTypes.length ? specialtyTypes : null)); return this; } @@ -390,6 +403,7 @@ export class TrainerConfig { this.setStaticParty(); this.setBattleBgm('battle_champion'); this.setVictoryBgm('victory_champion'); + this.setGenModifiersFunc(party => getRandomTeraModifiers(party, 3)); return this; } @@ -447,7 +461,7 @@ function getGymLeaderPartyTemplate(scene: BattleScene) { function getRandomPartyMemberFunc(speciesPool: Species[], postProcess?: (enemyPokemon: EnemyPokemon) => void): PartyMemberFunc { return (scene: BattleScene, level: integer) => { - const species = getPokemonSpecies(Phaser.Math.RND.pick(speciesPool)).getSpeciesForLevel(level, true, true, scene.currentBattle.trainer.config.isBoss); + const species = getPokemonSpecies(Utils.randSeedItem(speciesPool)).getSpeciesForLevel(level, true, true, scene.currentBattle.trainer.config.isBoss); return scene.addEnemyPokemon(getPokemonSpecies(species), level, true, undefined, undefined, postProcess); }; } @@ -461,6 +475,17 @@ function getSpeciesFilterRandomPartyMemberFunc(speciesFilter: PokemonSpeciesFilt }; } +function getRandomTeraModifiers(party: EnemyPokemon[], count: integer, types?: Type[]): PersistentModifier[] { + const ret: PersistentModifier[] = []; + const partyMemberIndexes = new Array(party.length).fill(null).map((_, i) => i); + for (let t = 0; t < Math.min(count, party.length); t++) { + const randomIndex = Utils.randSeedItem(partyMemberIndexes); + partyMemberIndexes.splice(partyMemberIndexes.indexOf(randomIndex), 1); + ret.push(modifierTypes.TERA_SHARD().generateType(null, [ Utils.randSeedItem(types ? types : party[randomIndex].getTypes()) ]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(party[randomIndex]) as PersistentModifier); + } + return ret; +} + export const trainerConfigs: TrainerConfigs = { [TrainerType.UNKNOWN]: new TrainerConfig(0).setHasGenders(), [TrainerType.ACE_TRAINER]: new TrainerConfig(++t).setHasGenders().setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.ACE_TRAINER) @@ -753,7 +778,11 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ])) .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) - .setSpeciesFilter(species => species.baseTotal >= 540), + .setSpeciesFilter(species => species.baseTotal >= 540) + .setGenModifiersFunc(party => { + const starter = party[0]; + return [ modifierTypes.TERA_SHARD().generateType(null, [ starter.species.type1 ]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier ]; + }), [TrainerType.RIVAL_5]: new TrainerConfig(++t).setName('Finn').setHasGenders('Ivy').setTitle('Rival').setBoss().setStaticParty().setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm('battle_rival_3').setPartyTemplates(trainerPartyTemplates.RIVAL_5) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ])) @@ -762,7 +791,11 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.RAYQUAZA ], p => { p.setBoss(); p.pokeball = PokeballType.MASTER_BALL; - })), + })) + .setGenModifiersFunc(party => { + const starter = party[0]; + return [ modifierTypes.TERA_SHARD().generateType(null, [ starter.species.type1 ]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier ]; + }), [TrainerType.RIVAL_6]: new TrainerConfig(++t).setName('Finn').setHasGenders('Ivy').setTitle('Rival').setBoss().setStaticParty().setMoneyMultiplier(3).setEncounterBgm('final').setBattleBgm('battle_rival_3').setPartyTemplates(trainerPartyTemplates.RIVAL_6) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT ])) @@ -772,7 +805,11 @@ export const trainerConfigs: TrainerConfigs = { p.setBoss(); p.pokeball = PokeballType.MASTER_BALL; p.formIndex = 1; - })), + })) + .setGenModifiersFunc(party => { + const starter = party[0]; + return [ modifierTypes.TERA_SHARD().generateType(null, [ starter.species.type1 ]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier ]; + }), }; (function() { diff --git a/src/data/type.ts b/src/data/type.ts index 51aa94c8d..9fb2c9c1b 100644 --- a/src/data/type.ts +++ b/src/data/type.ts @@ -17,7 +17,8 @@ export enum Type { ICE, DRAGON, DARK, - FAIRY + FAIRY, + STELLAR }; export type TypeDamageMultiplier = 0 | 0.25 | 0.5 | 1 | 2 | 4; @@ -491,5 +492,52 @@ export function getTypeDamageMultiplier(attackType: integer, defType: integer): default: return 0; } + case Type.STELLAR: + return 1; } +} + +export function getTypeRgb(type: Type): [ integer, integer, integer ] { + switch (type) { + case Type.NORMAL: + return [ 168, 168, 120 ]; + case Type.FIGHTING: + return [ 192, 48, 40 ]; + case Type.FLYING: + return [ 168, 144, 240 ]; + case Type.POISON: + return [ 160, 64, 160 ]; + case Type.GROUND: + return [ 224, 192, 104 ]; + case Type.ROCK: + return [ 184, 160, 56 ]; + case Type.BUG: + return [ 168, 184, 32 ]; + case Type.GHOST: + return [ 112, 88, 152 ]; + case Type.STEEL: + return [ 184, 184, 208 ]; + case Type.FIRE: + return [ 240, 128, 48 ]; + case Type.WATER: + return [ 104, 144, 240 ]; + case Type.GRASS: + return [ 120, 200, 80 ]; + case Type.ELECTRIC: + return [ 248, 208, 48 ]; + case Type.PSYCHIC: + return [ 248, 88, 136 ]; + case Type.ICE: + return [ 152, 216, 216 ]; + case Type.DRAGON: + return [ 112, 56, 248 ]; + case Type.DARK: + return [ 112, 88, 72 ]; + case Type.FAIRY: + return [ 232, 136, 200 ]; + case Type.STELLAR: + return [ 255, 255, 255 ]; + default: + return [ 0, 0, 0 ]; + } } \ No newline at end of file diff --git a/src/evolution-phase.ts b/src/evolution-phase.ts index 3e5c0bdc0..1bc0b9441 100644 --- a/src/evolution-phase.ts +++ b/src/evolution-phase.ts @@ -8,6 +8,7 @@ import { Mode } from "./ui/ui"; import { LearnMovePhase } from "./battle-phases"; import { cos, sin } from "./anims"; import { PlayerPokemon } from "./pokemon"; +import { getTypeRgb } from "./data/type"; export class EvolutionPhase extends BattlePhase { protected pokemon: PlayerPokemon; @@ -70,7 +71,7 @@ export class EvolutionPhase extends BattlePhase { this.evolutionBgOverlay.setAlpha(0); this.evolutionContainer.add(this.evolutionBgOverlay); - const getPokemonSprite = () => this.scene.addFieldSprite(this.evolutionBaseBg.displayWidth / 2, this.evolutionBaseBg.displayHeight / 2, `pkmn__sub`); + const getPokemonSprite = () => this.scene.addPokemonSprite(this.pokemon, this.evolutionBaseBg.displayWidth / 2, this.evolutionBaseBg.displayHeight / 2, `pkmn__sub`); this.evolutionContainer.add((this.pokemonSprite = getPokemonSprite())); this.evolutionContainer.add((this.pokemonTintSprite = getPokemonSprite())); @@ -90,7 +91,7 @@ export class EvolutionPhase extends BattlePhase { [ this.pokemonSprite, this.pokemonTintSprite, this.pokemonEvoSprite, this.pokemonEvoTintSprite ].map(sprite => { sprite.play(this.pokemon.getSpriteKey(true)); - sprite.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false }); + sprite.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(this.pokemon.getTeraType()) }); sprite.pipelineData['ignoreTimeTint'] = true; [ 'spriteColors', 'fusionSpriteColors' ].map(k => { if (this.pokemon.summonData?.speciesForm) diff --git a/src/form-change-phase.ts b/src/form-change-phase.ts index 44b3e2b8e..a44cdd6cb 100644 --- a/src/form-change-phase.ts +++ b/src/form-change-phase.ts @@ -10,6 +10,7 @@ import PartyUiHandler from "./ui/party-ui-handler"; import { BattlePhase } from "./battle-phase"; import { BattleSpec } from "./enums/battle-spec"; import { MovePhase, PokemonHealPhase } from "./battle-phases"; +import { getTypeRgb } from "./data/type"; export class FormChangePhase extends EvolutionPhase { private formChange: SpeciesFormChange; @@ -184,10 +185,10 @@ export class QuietFormChangePhase extends BattlePhase { const preName = this.pokemon.name; const getPokemonSprite = () => { - const sprite = this.scene.addFieldSprite(this.pokemon.x + this.pokemon.getSprite().x, this.pokemon.y + this.pokemon.getSprite().y, `pkmn__sub`); + const sprite = this.scene.addPokemonSprite(this.pokemon, this.pokemon.x + this.pokemon.getSprite().x, this.pokemon.y + this.pokemon.getSprite().y, `pkmn__sub`); sprite.setOrigin(0.5, 1); sprite.play(this.pokemon.getSpriteKey()).stop(); - sprite.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false }); + sprite.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(this.pokemon.getTeraType()) }); [ 'spriteColors', 'fusionSpriteColors' ].map(k => { if (this.pokemon.summonData?.speciesForm) k += 'Base'; diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index b132003a4..7a9edb83a 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -59,6 +59,11 @@ export class ModifierType { this.tier = tier; } + withIdFromFunc(func: ModifierTypeFunc): ModifierType { + this.id = Object.keys(modifierTypes).find(k => modifierTypes[k] === func); + return this; + } + newModifier(...args: any[]): Modifier { return this.newModifierFunc(this, args); } @@ -615,6 +620,20 @@ class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator { } } +export class TerastallizeModifierType extends PokemonHeldItemModifierType implements GeneratedPersistentModifierType { + private teraType: Type; + + constructor(teraType: Type) { + super(`${Utils.toReadableString(Type[teraType])} Tera Shard`, `${Utils.toReadableString(Type[teraType])} Terastallizes the holder for up to 10 battles`, (type, args) => new Modifiers.TerastallizeModifier(type as TerastallizeModifierType, (args[0] as Pokemon).id, teraType), null, 'tera_shard'); + + this.teraType = teraType; + } + + getPregenArgs(): any[] { + return [ this.teraType ]; + } +} + export class ContactHeldItemTransferChanceModifierType extends PokemonHeldItemModifierType { constructor(name: string, chancePercent: integer, iconImage?: string, group?: string, soundName?: string) { super(name, `Upon attacking, there is a ${chancePercent}% chance the foe's held item will be stolen`, (type, args) => new Modifiers.ContactHeldItemTransferChanceModifier(type, (args[0] as Pokemon).id, chancePercent), iconImage, group, soundName); @@ -670,7 +689,8 @@ export const modifierTypes = { FORM_CHANGE_ITEM: () => new FormChangeItemModifierTypeGenerator(), MEGA_BRACELET: () => new ModifierType('Mega Bracelet', 'Mega stones become available', (type, _args) => new Modifiers.MegaEvolutionAccessModifier(type)), - DYNAMAX_BAND: () => new ModifierType('Dynamax Band', 'Gigantamaxing becomes available', (type, _args) => new Modifiers.GigantamaxAccessModifier(type)), + DYNAMAX_BAND: () => new ModifierType('Dynamax Band', 'Max Mushrooms become available', (type, _args) => new Modifiers.GigantamaxAccessModifier(type)), + TERA_ORB: () => new ModifierType('Tera Orb', 'Tera Shards become available', (type, _args) => new Modifiers.TerastallizeAccessModifier(type)), MAP: () => new ModifierType('Map', 'Allows you to choose your destination at a crossroads', (type, _args) => new Modifiers.MapModifier(type)), @@ -721,6 +741,20 @@ export const modifierTypes = { ATTACK_TYPE_BOOSTER: () => new AttackTypeBoosterModifierTypeGenerator(), + TERA_SHARD: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { + if (pregenArgs) + return new TerastallizeModifierType(pregenArgs[0] as Type); + if (!party[0].scene.getModifiers(Modifiers.TerastallizeAccessModifier).length) + return null; + let type: Type; + if (!Utils.randInt(3)) { + const partyMemberTypes = party.map(p => p.getTypes(false, true)).flat(); + type = Utils.randSeedItem(partyMemberTypes); + } else + type = Utils.randSeedInt(64) ? Utils.randSeedInt(18) as Type : Type.STELLAR; + return new TerastallizeModifierType(type); + }), + BERRY: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { if (pregenArgs) return new BerryModifierType(pregenArgs[0] as BerryType); @@ -902,6 +936,7 @@ const modifierPool = { return Math.min(Math.ceil(highestPartyLevel / 20), 4); }), new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 3), + new WeightedModifierType(modifierTypes.TERA_SHARD, 1), new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => party[0].scene.gameMode === GameMode.SPLICED_ENDLESS && party.filter(p => !p.fusionSpecies).length > 1 ? 4 : 0), new WeightedModifierType(modifierTypes.REVERSE_DNA_SPLICERS, (party: Pokemon[]) => party[0].scene.gameMode === GameMode.SPLICED_ENDLESS && party.filter(p => p.fusionSpecies).length ? 6 : 0), ].map(m => { m.setTier(ModifierTier.GREAT); return m; }), @@ -934,6 +969,7 @@ const modifierPool = { new WeightedModifierType(modifierTypes.OVAL_CHARM, 2), new WeightedModifierType(modifierTypes.ABILITY_CHARM, 2), new WeightedModifierType(modifierTypes.IV_SCANNER, 2), + new WeightedModifierType(modifierTypes.TERA_ORB, 3), new WeightedModifierType(modifierTypes.EXP_BALANCE, 1), new WeightedModifierType(modifierTypes.FORM_CHANGE_ITEM, 1), new WeightedModifierType(modifierTypes.REVERSE_DNA_SPLICERS, (party: Pokemon[]) => party[0].scene.gameMode !== GameMode.SPLICED_ENDLESS && party.filter(p => p.fusionSpecies).length ? 3 : 0), @@ -1054,7 +1090,10 @@ export function regenerateModifierPoolThresholds(party: Pokemon[], poolType: Mod pool[t].reduce((total: integer, modifierType: WeightedModifierType) => { const weightedModifierType = modifierType as WeightedModifierType; const existingModifiers = party[0].scene.findModifiers(m => (m.type.generatorId || m.type.id) === weightedModifierType.modifierType.id, player); - const weight = !existingModifiers.length || existingModifiers.filter(m => m.stackCount < m.getMaxStackCount(party[0].scene, true)).length + const weight = !existingModifiers.length + || weightedModifierType.modifierType instanceof PokemonHeldItemModifierType + || (weightedModifierType.modifierType instanceof ModifierTypeGenerator && weightedModifierType.modifierType.generateType(party) instanceof PokemonHeldItemModifierType) + || existingModifiers.find(m => m.stackCount < m.getMaxStackCount(party[0].scene, true)) ? weightedModifierType.weight instanceof Function ? (weightedModifierType.weight as Function)(party) : weightedModifierType.weight as integer diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index b1772f9de..0d8b81b43 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -265,7 +265,7 @@ export abstract class LapsingPersistentModifier extends PersistentModifier { this.battlesLeft = battlesLeft; } - lapse(): boolean { + lapse(args: any[]): boolean { return !!--this.battlesLeft; } @@ -281,6 +281,10 @@ export abstract class LapsingPersistentModifier extends PersistentModifier { return container; } + getBattlesLeft(): integer { + return this.battlesLeft; + } + getMaxStackCount(scene: BattleScene, forThreshold?: boolean): number { return 99; } @@ -404,6 +408,24 @@ export class GigantamaxAccessModifier extends PersistentModifier { } } +export class TerastallizeAccessModifier extends PersistentModifier { + constructor(type: ModifierType, stackCount?: integer) { + super(type, stackCount); + } + + clone(): TerastallizeAccessModifier { + return new TerastallizeAccessModifier(this.type, this.stackCount); + } + + apply(args: any[]): boolean { + return true; + } + + getMaxStackCount(scene: BattleScene): integer { + return 1; + } +} + export abstract class PokemonHeldItemModifier extends PersistentModifier { public pokemonId: integer; @@ -481,6 +503,85 @@ export abstract class PokemonHeldItemModifier extends PersistentModifier { abstract getMaxHeldItemCount(pokemon: Pokemon): integer } +export abstract class LapsingPokemonHeldItemModifier extends PokemonHeldItemModifier { + protected battlesLeft: integer; + + constructor(type: ModifierTypes.ModifierType, pokemonId: integer, battlesLeft?: integer, stackCount?: integer) { + super(type, pokemonId, stackCount); + + this.battlesLeft = battlesLeft; + } + + lapse(args: any[]): boolean { + return !!--this.battlesLeft; + } + + getIcon(scene: BattleScene, forSummary?: boolean): Phaser.GameObjects.Container { + const container = super.getIcon(scene, forSummary); + + if (this.getPokemon(scene).isPlayer()) { + const battleCountText = addTextObject(scene, 27, 0, this.battlesLeft.toString(), TextStyle.PARTY, { fontSize: '66px', color: '#f89890' }); + battleCountText.setShadow(0, 0, null); + battleCountText.setStroke('#984038', 16) + battleCountText.setOrigin(1, 0); + container.add(battleCountText); + } + + return container; + } + + getBattlesLeft(): integer { + return this.battlesLeft; + } + + getMaxStackCount(scene: BattleScene, forThreshold?: boolean): number { + return 1; + } +} + +export class TerastallizeModifier extends LapsingPokemonHeldItemModifier { + public teraType: Type; + + constructor(type: ModifierTypes.TerastallizeModifierType, pokemonId: integer, teraType: Type, battlesLeft?: integer, stackCount?: integer) { + super(type, pokemonId, battlesLeft || 10, stackCount); + + this.teraType = teraType; + } + + matchType(modifier: Modifier): boolean { + if (modifier instanceof TerastallizeModifier && modifier.teraType === this.teraType) + return true; + return false; + } + + clone(): TerastallizeModifier { + return new TerastallizeModifier(this.type as ModifierTypes.TerastallizeModifierType, this.pokemonId, this.teraType, this.battlesLeft, this.stackCount); + } + + getArgs(): any[] { + return [ this.pokemonId, this.teraType, this.battlesLeft ]; + } + + apply(args: any[]): boolean { + const pokemon = args[0] as Pokemon; + pokemon.updateSpritePipelineData(); + return true; + } + + lapse(args: any[]): boolean { + const ret = super.lapse(args); + if (!ret) { + const pokemon = args[0] as Pokemon; + pokemon.updateSpritePipelineData(); + } + return ret; + } + + getMaxHeldItemCount(pokemon: Pokemon): integer { + return 1; + } +} + export class PokemonBaseStatModifier extends PokemonHeldItemModifier { protected stat: Stat; @@ -1323,8 +1424,19 @@ export class PokemonFormChangeItemModifier extends PokemonHeldItemModifier { apply(args: any[]): boolean { const pokemon = args[0] as Pokemon; + const active = args[1] as boolean; - return pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeItemTrigger); + let switchActive = this.active && !active; + + if (switchActive) + this.active = false; + + const ret = pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeItemTrigger); + + if (switchActive) + this.active = true; + + return ret; } getMaxHeldItemCount(pokemon: Pokemon): integer { diff --git a/src/pipelines/field-sprite.ts b/src/pipelines/field-sprite.ts index a0885307d..5fdf8f438 100644 --- a/src/pipelines/field-sprite.ts +++ b/src/pipelines/field-sprite.ts @@ -34,8 +34,7 @@ vec3 blendHardLight(vec3 base, vec3 blend) { return blendOverlay(blend, base); } -void main() -{ +void main() { vec4 texture; %forloop% @@ -83,13 +82,11 @@ void main() `; const spriteVertShader = ` -#ifdef GL_FRAGMENT_PRECISION_HIGH -precision highp float; -#else precision mediump float; -#endif uniform mat4 uProjectionMatrix; +uniform int uRoundPixels; +uniform vec2 uResolution; attribute vec2 inPosition; attribute vec2 inTexCoord; @@ -99,15 +96,19 @@ attribute vec4 inTint; varying vec2 outTexCoord; varying float outTexId; +varying vec2 outPosition; varying float outTintEffect; varying vec4 outTint; -void main() -{ +void main() { gl_Position = uProjectionMatrix * vec4(inPosition, 1.0, 1.0); - + if (uRoundPixels == 1) + { + gl_Position.xy = floor(((gl_Position.xy + 1.0) * 0.5 * uResolution) + 0.5) / uResolution * 2.0 - 1.0; + } outTexCoord = inTexCoord; outTexId = inTexId; + outPosition = inPosition; outTint = inTint; outTintEffect = inTintEffect; } diff --git a/src/pipelines/sprite.ts b/src/pipelines/sprite.ts index 2a3bf79e6..e9f2a51e7 100644 --- a/src/pipelines/sprite.ts +++ b/src/pipelines/sprite.ts @@ -23,12 +23,16 @@ uniform int isOutside; uniform vec3 dayTint; uniform vec3 duskTint; uniform vec3 nightTint; +uniform float teraTime; +uniform vec3 teraColor; uniform int hasShadow; uniform int yCenter; uniform float fieldScale; uniform float vCutoff; uniform vec2 relPosition; +uniform vec2 texFrameUv; uniform vec2 size; +uniform vec2 texSize; uniform float yOffset; uniform vec4 tone; uniform ivec4 spriteColors[32]; @@ -48,11 +52,107 @@ vec3 blendHardLight(vec3 base, vec3 blend) { return blendOverlay(blend, base); } -void main() -{ - vec4 texture; +float hue2rgb(float f1, float f2, float hue) { + if (hue < 0.0) + hue += 1.0; + else if (hue > 1.0) + hue -= 1.0; + float res; + if ((6.0 * hue) < 1.0) + res = f1 + (f2 - f1) * 6.0 * hue; + else if ((2.0 * hue) < 1.0) + res = f2; + else if ((3.0 * hue) < 2.0) + res = f1 + (f2 - f1) * ((2.0 / 3.0) - hue) * 6.0; + else + res = f1; + return res; +} - %forloop% +vec3 rgb2hsl(vec3 color) { + vec3 hsl; + + float fmin = min(min(color.r, color.g), color.b); + float fmax = max(max(color.r, color.g), color.b); + float delta = fmax - fmin; + + hsl.z = (fmax + fmin) / 2.0; + + if (delta == 0.0) { + hsl.x = 0.0; + hsl.y = 0.0; + } else { + if (hsl.z < 0.5) + hsl.y = delta / (fmax + fmin); + else + hsl.y = delta / (2.0 - fmax - fmin); + + float deltaR = (((fmax - color.r) / 6.0) + (delta / 2.0)) / delta; + float deltaG = (((fmax - color.g) / 6.0) + (delta / 2.0)) / delta; + float deltaB = (((fmax - color.b) / 6.0) + (delta / 2.0)) / delta; + + if (color.r == fmax ) + hsl.x = deltaB - deltaG; + else if (color.g == fmax) + hsl.x = (1.0 / 3.0) + deltaR - deltaB; + else if (color.b == fmax) + hsl.x = (2.0 / 3.0) + deltaG - deltaR; + + if (hsl.x < 0.0) + hsl.x += 1.0; + else if (hsl.x > 1.0) + hsl.x -= 1.0; + } + + return hsl; +} + +vec3 hsl2rgb(vec3 hsl) { + vec3 rgb; + + if (hsl.y == 0.0) + rgb = vec3(hsl.z); + else { + float f2; + + if (hsl.z < 0.5) + f2 = hsl.z * (1.0 + hsl.y); + else + f2 = (hsl.z + hsl.y) - (hsl.y * hsl.z); + + float f1 = 2.0 * hsl.z - f2; + + rgb.r = hue2rgb(f1, f2, hsl.x + (1.0/3.0)); + rgb.g = hue2rgb(f1, f2, hsl.x); + rgb.b= hue2rgb(f1, f2, hsl.x - (1.0/3.0)); + } + + return rgb; +} + +vec3 blendHue(vec3 base, vec3 blend) { + vec3 baseHSL = rgb2hsl(base); + return hsl2rgb(vec3(rgb2hsl(blend).r, baseHSL.g, baseHSL.b)); +} + +vec3 rgb2hsv(vec3 c) { + vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); + vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); + + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); +} + +vec3 hsv2rgb(vec3 c) { + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} + +void main() { + vec4 texture = texture2D(uMainSampler[0], outTexCoord); for (int i = 0; i < 32; i++) { if (spriteColors[i][3] == 0) @@ -73,6 +173,24 @@ void main() // Multiply texture tint vec4 color = texture * texel; + if (color.a > 0.0 && teraColor.r > 0.0 && teraColor.g > 0.0 && teraColor.b > 0.0) { + vec2 relUv = vec2((outTexCoord.x - texFrameUv.x) / (size.x / texSize.x), (outTexCoord.y - texFrameUv.y) / (size.y / texSize.y)); + vec2 teraTexCoord = vec2(relUv.x * (size.x / 200.0), relUv.y * (size.y / 120.0)); + vec4 teraCol = texture2D(uMainSampler[1], teraTexCoord); + float floorValue = 86.0 / 255.0; + vec3 teraPatternHsv = rgb2hsv(teraCol.rgb); + teraCol.rgb = hsv2rgb(vec3((teraPatternHsv.b - floorValue) * 4.0 + teraTexCoord.x * fieldScale / 2.0 + teraTexCoord.y * fieldScale / 2.0 + teraTime * 255.0, teraPatternHsv.b, teraPatternHsv.b)); + + color.rgb = mix(color.rgb, blendHue(color.rgb, teraColor), 0.625); + teraCol.rgb = mix(teraCol.rgb, teraColor, 0.5); + color.rgb = blendOverlay(color.rgb, teraCol.rgb); + + if (teraColor.r < 1.0 || teraColor.g < 1.0 || teraColor.b < 1.0) { + vec3 teraColHsv = rgb2hsv(teraColor); + color.rgb = mix(color.rgb, teraColor, (1.0 - teraColHsv.g) / 2.0); + } + } + if (outTintEffect == 1.0) { // Solid color + texture alpha color.rgb = mix(texture.rgb, outTint.bgr * outTint.a, texture.a); @@ -110,7 +228,7 @@ void main() dayNightTint = mix(duskTint, dayTint, (time - 0.875) / 0.125); } - color = vec4(blendHardLight(color.rgb, dayNightTint), color.a); + color.rgb = blendHardLight(color.rgb, dayNightTint); } if (hasShadow == 1) { @@ -144,13 +262,11 @@ void main() `; const spriteVertShader = ` -#ifdef GL_FRAGMENT_PRECISION_HIGH -precision highp float; -#else precision mediump float; -#endif uniform mat4 uProjectionMatrix; +uniform int uRoundPixels; +uniform vec2 uResolution; attribute vec2 inPosition; attribute vec2 inTexCoord; @@ -159,6 +275,7 @@ attribute float inTintEffect; attribute vec4 inTint; varying vec2 outTexCoord; +varying vec2 outtexFrameUv; varying float outTexId; varying vec2 outPosition; varying float outTintEffect; @@ -167,7 +284,10 @@ varying vec4 outTint; void main() { gl_Position = uProjectionMatrix * vec4(inPosition, 1.0, 1.0); - + if (uRoundPixels == 1) + { + gl_Position.xy = floor(((gl_Position.xy + 1.0) * 0.5 * uResolution) + 0.5) / uResolution * 2.0 - 1.0; + } outTexCoord = inTexCoord; outTexId = inTexId; outPosition = inPosition; @@ -193,10 +313,14 @@ export default class SpritePipeline extends FieldSpritePipeline { onPreRender(): void { super.onPreRender(); + this.set1f('teraTime', 0); + this.set3fv('teraColor', [ 0, 0, 0 ]); this.set1i('hasShadow', 0); this.set1i('yCenter', 0); this.set2f('relPosition', 0, 0); + this.set2f('texFrameUv', 0, 0); this.set2f('size', 0, 0); + this.set2f('texSize', 0, 0); this.set1f('yOffset', 0); this.set4fv('tone', this._tone); } @@ -208,6 +332,7 @@ export default class SpritePipeline extends FieldSpritePipeline { const data = sprite.pipelineData; const tone = data['tone'] as number[]; + const teraColor = data['teraColor'] as integer[] ?? [ 0, 0, 0 ]; const hasShadow = data['hasShadow'] as boolean; const ignoreOverride = data['ignoreOverride'] as boolean; const spriteColors = (ignoreOverride && data['spriteColorsBase']) || data['spriteColors'] || [] as number[][]; @@ -215,7 +340,6 @@ export default class SpritePipeline extends FieldSpritePipeline { const isEntityObj = sprite.parentContainer instanceof Pokemon || sprite.parentContainer instanceof Trainer; const field = isEntityObj ? sprite.parentContainer.parentContainer : sprite.parentContainer; - const fieldScaleRatio = field.scale / 6; const position = isEntityObj ? [ sprite.parentContainer.x, sprite.parentContainer.y ] : [ sprite.x, sprite.y ]; @@ -224,13 +348,18 @@ export default class SpritePipeline extends FieldSpritePipeline { position[0] += -(sprite.width - (sprite.frame.width)) / 2 + sprite.frame.x; if (sprite.originY === 0.5) position[1] += (sprite.height / 2) * ((isEntityObj ? sprite.parentContainer : sprite).scale - 1); + this.set1f('teraTime', (this.game.getTime() % 500000) / 500000); + this.set3fv('teraColor', teraColor.map(c => c / 255)); this.set1i('hasShadow', hasShadow ? 1 : 0); this.set1i('yCenter', sprite.originY === 0.5 ? 1 : 0); this.set1f('fieldScale', field.scale); this.set2f('relPosition', position[0], position[1]); + this.set2f('texFrameUv', sprite.frame.u0, sprite.frame.v0); this.set2f('size', sprite.frame.width, sprite.height); + this.set2f('texSize', sprite.texture.source[0].width, sprite.texture.source[0].height); this.set1f('yOffset', sprite.height - sprite.frame.height * (isEntityObj ? sprite.parentContainer.scale : sprite.scale)); this.set4fv('tone', tone); + this.bindTexture(this.game.textures.get('tera').source[0].glTexture, 1); const emptyColors = [ 0, 0, 0, 0 ]; const flatSpriteColors: integer[] = []; const flatFusionSpriteColors: integer[] = []; diff --git a/src/pokemon.ts b/src/pokemon.ts index 9edc208de..6465a683e 100644 --- a/src/pokemon.ts +++ b/src/pokemon.ts @@ -2,13 +2,13 @@ import Phaser from 'phaser'; import BattleScene, { AnySound } from './battle-scene'; import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from './ui/battle-info'; import { Moves } from "./data/enums/moves"; -import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariablePowerAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, AttackMove, AddBattlerTagAttr, OneHitKOAttr } from "./data/move"; +import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariablePowerAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, MultiHitAttr } from "./data/move"; import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies } from './data/pokemon-species'; import * as Utils from './utils'; -import { Type, TypeDamageMultiplier, getTypeDamageMultiplier } from './data/type'; +import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from './data/type'; import { getLevelTotalExp } from './data/exp'; import { Stat } from './data/pokemon-stat'; -import { AttackTypeBoosterModifier, DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, HiddenAbilityRateBoosterModifier, PokemonBaseStatModifier, PokemonHeldItemModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempBattleStatBoosterModifier } from './modifier/modifier'; +import { AttackTypeBoosterModifier, DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, HiddenAbilityRateBoosterModifier, PokemonBaseStatModifier, PokemonHeldItemModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempBattleStatBoosterModifier, TerastallizeModifier } from './modifier/modifier'; import { PokeballType } from './data/pokeball'; import { Gender } from './data/gender'; import { initMoveAnim, loadMoveAnimAssets } from './data/battle-anims'; @@ -203,9 +203,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.scene.fieldUI.addAt(this.battleInfo, 0); const getSprite = (hasShadow?: boolean) => { - const ret = this.scene.addFieldSprite(0, 0, `pkmn__${this.isPlayer() ? 'back__' : ''}sub`); + const ret = this.scene.addPokemonSprite(this, 0, 0, `pkmn__${this.isPlayer() ? 'back__' : ''}sub`, undefined, true); ret.setOrigin(0.5, 1); - ret.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: !!hasShadow }); + ret.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: !!hasShadow, teraColor: getTypeRgb(this.getTeraType()) }); return ret; }; @@ -406,6 +406,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return 1; } + updateSpritePipelineData(): void { + [ this.getSprite(), this.getTintSprite() ].map(s => s.pipelineData['teraColor'] = getTypeRgb(this.getTeraType())); + this.updateInfo(true); + } + initShinySparkle(): void { const shinySparkle = this.scene.addFieldSprite(0, 0, 'shiny'); shinySparkle.setVisible(false); @@ -614,26 +619,32 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return this.getLevelMoves(1, true).filter(lm => !this.moveset.filter(m => m.moveId === lm).length).filter((move: Moves, i: integer, array: Moves[]) => array.indexOf(move) === i); } - getTypes(ignoreOverride?: boolean): Type[] { + getTypes(includeTeraType = false, ignoreOverride?: boolean): Type[] { const types = []; - if (!ignoreOverride && this.summonData?.types) - this.summonData.types.forEach(t => types.push(t)); - else { - const speciesForm = this.getSpeciesForm(); - - types.push(speciesForm.type1); + if (includeTeraType) { + const teraType = this.getTeraType(); + if (teraType != Type.UNKNOWN) + types.push(teraType); + } else { + if (!ignoreOverride && this.summonData?.types) + this.summonData.types.forEach(t => types.push(t)); + else { + const speciesForm = this.getSpeciesForm(); + + types.push(speciesForm.type1); - const fusionSpeciesForm = this.getFusionSpeciesForm(); - if (fusionSpeciesForm) { - if (fusionSpeciesForm.type2 !== null && fusionSpeciesForm.type2 !== speciesForm.type1) - types.push(fusionSpeciesForm.type2); - else if (fusionSpeciesForm.type1 !== speciesForm.type1) - types.push(fusionSpeciesForm.type1); + const fusionSpeciesForm = this.getFusionSpeciesForm(); + if (fusionSpeciesForm) { + if (fusionSpeciesForm.type2 !== null && fusionSpeciesForm.type2 !== speciesForm.type1) + types.push(fusionSpeciesForm.type2); + else if (fusionSpeciesForm.type1 !== speciesForm.type1) + types.push(fusionSpeciesForm.type1); + } + + if (types.length === 1 && speciesForm.type2 !== null) + types.push(speciesForm.type2); } - - if (types.length === 1 && speciesForm.type2 !== null) - types.push(speciesForm.type2); } if (this.getTag(BattlerTagType.IGNORE_FLYING) || this.scene.arena.getTag(ArenaTagType.GRAVITY)) { @@ -649,7 +660,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } isOfType(type: Type) { - return this.getTypes().indexOf(type) > -1; + return this.getTypes(true).indexOf(type) > -1; } getAbility(): Ability { @@ -677,14 +688,29 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return weight.value; } + getTeraType(): Type { + const teraModifier = this.scene.findModifier(m => m instanceof TerastallizeModifier + && m.pokemonId === this.id && !!m.getBattlesLeft(), this.isPlayer()) as TerastallizeModifier; + if (teraModifier) + return teraModifier.teraType; + + return Type.UNKNOWN; + } + + isTerastallized(): boolean { + return this.getTeraType() !== Type.UNKNOWN; + } + getAttackMoveEffectiveness(moveType: Type): TypeDamageMultiplier { - const types = this.getTypes(); + if (moveType === Type.STELLAR) + return this.isTerastallized() ? 2 : 1; + const types = this.getTypes(true); return getTypeDamageMultiplier(moveType, types[0]) * (types.length > 1 ? getTypeDamageMultiplier(moveType, types[1]) : 1) as TypeDamageMultiplier; } getMatchupScore(pokemon: Pokemon): number { - const types = this.getTypes(); - const enemyTypes = pokemon.getTypes(); + const types = this.getTypes(true); + const enemyTypes = pokemon.getTypes(true); let atkScore = pokemon.getAttackMoveEffectiveness(types[0]); let defScore = 1 / this.getAttackMoveEffectiveness(enemyTypes[0]); if (types.length > 1) @@ -965,7 +991,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const cancelled = new Utils.BooleanHolder(false); const typeless = !!move.getAttrs(TypelessAttr).length; - const types = this.getTypes(); + const types = this.getTypes(true); const typeMultiplier = new Utils.NumberHolder(!typeless && moveCategory !== MoveCategory.STATUS ? getTypeDamageMultiplier(move.type, types[0]) * (types.length > 1 ? getTypeDamageMultiplier(move.type, types[1]) : 1) : 1); @@ -977,6 +1003,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { case MoveCategory.SPECIAL: const isPhysical = moveCategory === MoveCategory.PHYSICAL; const power = new Utils.NumberHolder(move.power); + const sourceTeraType = source.getTeraType(); + if (sourceTeraType !== Type.UNKNOWN && sourceTeraType === move.type && power.value < 60 && move.priority <= 0 && !move.getAttrs(MultiHitAttr).length) + power.value = 60; applyPreAttackAbAttrs(VariableMovePowerAbAttr, source, this, battlerMove, power); if (!typeless) @@ -1011,13 +1040,21 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } const sourceAtk = source.getBattleStat(isPhysical ? Stat.ATK : Stat.SPATK, this); const targetDef = this.getBattleStat(isPhysical ? Stat.DEF : Stat.SPDEF, source); - const sourceTypes = source.getTypes(); - const stabMultiplier = new Utils.NumberHolder(sourceTypes[0] === move.type || (sourceTypes.length > 1 && sourceTypes[1] === move.type) ? 1.5 : 1); const criticalMultiplier = isCritical ? 2 : 1; const isTypeImmune = (typeMultiplier.value * weatherTypeMultiplier) === 0; + const sourceTypes = source.getTypes(); + const matchesSourceType = sourceTypes[0] === move.type || (sourceTypes.length > 1 && sourceTypes[1] === move.type); + let stabMultiplier = new Utils.NumberHolder(1); + if (sourceTeraType === Type.UNKNOWN && matchesSourceType) + stabMultiplier.value += 0.5; + else if (sourceTeraType !== Type.UNKNOWN && sourceTeraType === move.type) + stabMultiplier.value += 0.5; applyAbAttrs(StabBoostAbAttr, source, null, stabMultiplier); + if (sourceTeraType !== Type.UNKNOWN && matchesSourceType) + stabMultiplier.value = Math.min(stabMultiplier.value + 0.5, 2.25); + if (!isTypeImmune) { damage.value = Math.ceil(((((2 * source.level / 5 + 2) * power.value * sourceAtk / targetDef) / 50) + 2) * stabMultiplier.value * typeMultiplier.value * weatherTypeMultiplier * ((this.scene.currentBattle.randSeedInt(15) + 85) / 100)) * criticalMultiplier; if (isPhysical && source.status && source.status.effect === StatusEffect.BURN) diff --git a/src/ui/pokemon-icon-anim-handler.ts b/src/sprite/pokemon-icon-anim-handler.ts similarity index 100% rename from src/ui/pokemon-icon-anim-handler.ts rename to src/sprite/pokemon-icon-anim-handler.ts diff --git a/src/sprite/pokemon-sprite-sparkle-handler.ts b/src/sprite/pokemon-sprite-sparkle-handler.ts new file mode 100644 index 000000000..2e6f7b223 --- /dev/null +++ b/src/sprite/pokemon-sprite-sparkle-handler.ts @@ -0,0 +1,70 @@ +import BattleScene from "../battle-scene"; +import Pokemon from "../pokemon"; +import * as Utils from "../utils"; + +export default class PokemonSpriteSparkleHandler { + private sprites: Set; + + setup(scene: BattleScene): void { + this.sprites = new Set(); + + scene.tweens.addCounter({ + duration: Utils.fixedInt(200), + from: 0, + to: 1, + yoyo: true, + repeat: -1, + onRepeat: () => this.onLapse() + }); + } + + onLapse(): void { + Array.from(this.sprites.values()).filter(s => !s.scene).map(s => this.sprites.delete(s)); + for (let s of this.sprites.values()) { + if (!s.pipelineData['teraColor'] || !(s.pipelineData['teraColor'] as number[]).find(c => c)) + continue; + if (!s.visible || (s.parentContainer instanceof Pokemon && !s.parentContainer.parentContainer)) + continue; + const pokemon = s.parentContainer instanceof Pokemon ? s.parentContainer as Pokemon : null; + const parent = (pokemon || s).parentContainer; + const texture = s.texture; + const [ width, height ] = [ texture.source[0].width, texture.source[0].height ]; + const [ pixelX, pixelY ] = [ Utils.randInt(width), Utils.randInt(height) ]; + const ratioX = s.width / width; + const ratioY = s.height / height; + const pixel = texture.manager.getPixel(pixelX, pixelY, texture.key, '__BASE'); + if (pixel.alpha) { + const [ xOffset, yOffset ] = [ -s.originX * s.width, -s.originY * s.height]; + const sparkle = (s.scene as BattleScene).addFieldSprite(((pokemon?.x || 0) + s.x + pixelX * ratioX + xOffset), ((pokemon?.y || 0) + s.y + pixelY * ratioY + yOffset), 'tera_sparkle'); + sparkle.pipelineData['ignoreTimeTint'] = s.pipelineData['ignoreTimeTint']; + sparkle.play('tera_sparkle'); + const teraColor = s.pipelineData['teraColor'] as number[]; + parent.add(sparkle); + s.scene.time.delayedCall(Utils.fixedInt(Math.floor((1000 / 12) * 13)), () => sparkle.destroy()); + } + } + } + + add(sprites: Phaser.GameObjects.Sprite | Phaser.GameObjects.Sprite[]): void { + if (!Array.isArray(sprites)) + sprites = [ sprites ]; + for (let s of sprites) { + if (this.sprites.has(s)) + continue; + this.sprites.add(s); + } + } + + remove(sprites: Phaser.GameObjects.Sprite | Phaser.GameObjects.Sprite[]): void { + if (!Array.isArray(sprites)) + sprites = [ sprites ]; + for (let s of sprites) { + this.sprites.delete(s); + } + } + + removeAll(): void { + for (let s of this.sprites.values()) + this.sprites.delete(s); + } +} \ No newline at end of file diff --git a/src/system/achv.ts b/src/system/achv.ts index d9f3912bc..c17d8b669 100644 --- a/src/system/achv.ts +++ b/src/system/achv.ts @@ -125,6 +125,9 @@ export const achvs = { TRANSFER_MAX_BATTLE_STAT: new Achv('Teamwork', 'Baton pass to another party member with at least one stat maxed out', 'stick', 20), MAX_FRIENDSHIP: new Achv('Friendmaxxing', 'Reach max friendship on a Pokémon', 'soothe_bell', 25), MEGA_EVOLVE: new Achv('Megamorph', 'Mega evolve a Pokémon', 'mega_bracelet', 50), + GIGANTAMAX: new Achv('Absolute Unit', 'Gigantamax a Pokémon', 'dynamax_band', 50), + TERASTALLIZE: new Achv('STAB Enthusiast', 'Terastallize a Pokémon', 'tera_orb', 25), + STELLAR_TERASTALLIZE: new Achv('The Hidden Type', 'Stellar Terastallize a Pokémon', 'stellar_tera_shard', 25).setSecret(true), SPLICE: new Achv('Infinite Fusion', 'Splice two Pokémon together with DNA Splicers', 'dna_splicers', 10), MINI_BLACK_HOLE: new ModifierAchv('A Hole Lot of Items', 'Acquire a Mini Black Hole', 'mini_black_hole', 25, modifier => modifier instanceof TurnHeldItemTransferModifier).setSecret(), CATCH_MYTHICAL: new Achv('Mythical', 'Catch a mythical Pokémon', 'strange_ball', 50).setSecret(), diff --git a/src/system/game-data.ts b/src/system/game-data.ts index cd319be1c..339e24eac 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -763,7 +763,7 @@ export class GameData { this.scene.executeWithSeedOffset(() => { const neutralNatures = [ Nature.HARDY, Nature.DOCILE, Nature.SERIOUS, Nature.BASHFUL, Nature.QUIRKY ]; for (let s = 0; s < defaultStarters.length; s++) - defaultStarterNatures.push(Phaser.Math.RND.pick(neutralNatures)); + defaultStarterNatures.push(Utils.randSeedItem(neutralNatures)); }, 0, 'default'); for (let ds = 0; ds < defaultStarters.length; ds++) { diff --git a/src/trainer.ts b/src/trainer.ts index 65bacf89c..5a2374ca6 100644 --- a/src/trainer.ts +++ b/src/trainer.ts @@ -5,6 +5,7 @@ import { TrainerConfig, TrainerPartyCompoundTemplate, TrainerPartyMemberStrength import { TrainerType } from "./data/enums/trainer-type"; import { EnemyPokemon } from "./pokemon"; import * as Utils from "./utils"; +import { PersistentModifier } from "./modifier/modifier"; export default class Trainer extends Phaser.GameObjects.Container { public config: TrainerConfig; @@ -17,7 +18,7 @@ export default class Trainer extends Phaser.GameObjects.Container { ? trainerConfigs[trainerType] : trainerConfigs[TrainerType.ACE_TRAINER]; this.female = female; - this.partyTemplateIndex = Math.min(partyTemplateIndex !== undefined ? partyTemplateIndex : Phaser.Math.RND.weightedPick(this.config.partyTemplates.map((_, i) => i)), + this.partyTemplateIndex = Math.min(partyTemplateIndex !== undefined ? partyTemplateIndex : Utils.randSeedWeightedItem(this.config.partyTemplates.map((_, i) => i)), this.config.partyTemplates.length - 1); // TODO: Remove when Phaser weightedPick bug is fixed @@ -174,7 +175,7 @@ export default class Trainer extends Phaser.GameObjects.Container { tier--; } const tierPool = this.config.speciesPools[tier]; - species = getPokemonSpecies(Phaser.Math.RND.pick(tierPool)); + species = getPokemonSpecies(Utils.randSeedItem(tierPool)); } else species = this.scene.randomSpecies(battle.waveIndex, level, false, this.config.speciesFilter); @@ -186,7 +187,7 @@ export default class Trainer extends Phaser.GameObjects.Container { if (pokemonPrevolutions.hasOwnProperty(species.speciesId) && ret.speciesId !== species.speciesId) retry = true; else if (template.isBalanced(battle.enemyParty.length)) { - const partyMemberTypes = battle.enemyParty.map(p => p.getTypes()).flat(); + const partyMemberTypes = battle.enemyParty.map(p => p.getTypes(true)).flat(); if (partyMemberTypes.indexOf(ret.type1) > -1 || (ret.type2 !== null && partyMemberTypes.indexOf(ret.type2) > -1)) retry = true; } @@ -271,6 +272,12 @@ export default class Trainer extends Phaser.GameObjects.Container { } } + genModifiers(party: EnemyPokemon[]): PersistentModifier[] { + if (this.config.genModifiersFunc) + return this.config.genModifiersFunc(party); + return []; + } + loadAssets(): Promise { return this.config.loadAssets(this.scene, this.female); } diff --git a/src/ui/battle-info.ts b/src/ui/battle-info.ts index 04c8705ee..89ef9630b 100644 --- a/src/ui/battle-info.ts +++ b/src/ui/battle-info.ts @@ -5,6 +5,7 @@ import { addTextObject, TextStyle } from './text'; import { getGenderSymbol, getGenderColor, Gender } from '../data/gender'; import { StatusEffect } from '../data/status-effect'; import BattleScene from '../battle-scene'; +import { Type, getTypeRgb } from '../data/type'; export default class BattleInfo extends Phaser.GameObjects.Container { private player: boolean; @@ -13,6 +14,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { private bossSegments: integer; private offset: boolean; private lastName: string; + private lastTeraType: Type; private lastStatus: StatusEffect; private lastHp: integer; private lastMaxHp: integer; @@ -26,6 +28,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { private nameText: Phaser.GameObjects.Text; private genderText: Phaser.GameObjects.Text; private ownedIcon: Phaser.GameObjects.Sprite; + private teraIcon: Phaser.GameObjects.Sprite; private splicedIcon: Phaser.GameObjects.Sprite; private shinyIcon: Phaser.GameObjects.Sprite; private statusIndicator: Phaser.GameObjects.Sprite; @@ -43,6 +46,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.boss = false; this.offset = false; this.lastName = null; + this.lastTeraType = Type.UNKNOWN; this.lastStatus = StatusEffect.NONE; this.lastHp = -1; this.lastMaxHp = -1; @@ -75,11 +79,19 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.add(this.ownedIcon); } + this.teraIcon = this.scene.add.sprite(0, 0, 'icon_tera'); + this.teraIcon.setVisible(false); + this.teraIcon.setOrigin(0, 0); + this.teraIcon.setScale(0.5); + this.teraIcon.setPositionRelative(this.nameText, 0, 2); + this.teraIcon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 14, 15), Phaser.Geom.Rectangle.Contains); + this.add(this.teraIcon); + this.splicedIcon = this.scene.add.sprite(0, 0, 'icon_spliced'); this.splicedIcon.setVisible(false); this.splicedIcon.setOrigin(0, 0); this.splicedIcon.setPositionRelative(this.nameText, 0, 2); - this.splicedIcon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 5, 7), Phaser.Geom.Rectangle.Contains); + this.splicedIcon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 5, 8), Phaser.Geom.Rectangle.Contains); this.add(this.splicedIcon); this.statusIndicator = this.scene.add.sprite(0, 0, 'statuses'); @@ -130,7 +142,17 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.genderText.setColor(getGenderColor(pokemon.gender)); this.genderText.setPositionRelative(this.nameText, nameTextWidth, 0); - this.splicedIcon.setPositionRelative(this.nameText, nameTextWidth + this.genderText.displayWidth + 1, 1); + this.lastTeraType = pokemon.getTeraType(); + + this.teraIcon.setPositionRelative(this.nameText, nameTextWidth + this.genderText.displayWidth + 1, 2); + this.teraIcon.setVisible(this.lastTeraType !== Type.UNKNOWN); + this.teraIcon.on('pointerover', () => { + if (this.lastTeraType !== Type.UNKNOWN) + (this.scene as BattleScene).ui.showTooltip(null, `${Utils.toReadableString(Type[this.lastTeraType])} Terastallized`); + }); + this.teraIcon.on('pointerout', () => (this.scene as BattleScene).ui.hideTooltip()); + + this.splicedIcon.setPositionRelative(this.nameText, nameTextWidth + this.genderText.displayWidth + 1 + (this.teraIcon.visible ? this.teraIcon.displayWidth + 1 : 0), 1); this.splicedIcon.setVisible(!!pokemon.fusionSpecies); if (this.splicedIcon.visible) { this.splicedIcon.on('pointerover', () => (this.scene as BattleScene).ui.showTooltip(null, `${pokemon.species.getName(pokemon.formIndex)}/${pokemon.fusionSpecies.getName(pokemon.fusionFormIndex)}`)); @@ -197,7 +219,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { if (boss !== this.boss) { this.boss = boss; - [ this.nameText, this.genderText, this.splicedIcon, this.ownedIcon, this.statusIndicator, this.levelContainer ].map(e => e.x += 48 * (boss ? -1 : 1)); + [ this.nameText, this.genderText, this.teraIcon, this.splicedIcon, this.ownedIcon, this.statusIndicator, this.levelContainer ].map(e => e.x += 48 * (boss ? -1 : 1)); this.hpBar.x += 38 * (boss ? -1 : 1); this.hpBar.y += 2 * (this.boss ? -1 : 1); this.hpBar.setTexture(`overlay_hp${boss ? '_boss' : ''}`); @@ -240,12 +262,25 @@ export default class BattleInfo extends Phaser.GameObjects.Container { if (!this.scene) return resolve(); - if (this.lastName !== pokemon.name) { + const nameUpdated = this.lastName !== pokemon.name; + + if (nameUpdated) { this.updateNameText(pokemon); - const nameTextWidth = this.nameText.displayWidth; - this.genderText.setPositionRelative(this.nameText, nameTextWidth, 0); - this.splicedIcon.setPositionRelative(this.nameText, nameTextWidth + this.genderText.displayWidth + 1, 1); + this.genderText.setPositionRelative(this.nameText, this.nameText.displayWidth, 0); } + + const teraType = pokemon.getTeraType(); + const teraTypeUpdated = this.lastTeraType !== teraType; + + if (teraTypeUpdated) { + this.teraIcon.setVisible(teraType !== Type.UNKNOWN); + this.teraIcon.setPositionRelative(this.nameText, this.nameText.displayWidth + this.genderText.displayWidth + 1, 2); + this.teraIcon.setTintFill(Phaser.Display.Color.GetColor(...getTypeRgb(teraType))); + this.lastTeraType = teraType; + } + + if (nameUpdated || teraTypeUpdated) + this.splicedIcon.setPositionRelative(this.nameText, this.nameText.displayWidth + this.genderText.displayWidth + 1 + (this.teraIcon.visible ? this.teraIcon.displayWidth + 1 : 0), 1); if (this.lastStatus !== (pokemon.status?.effect || StatusEffect.NONE)) { this.lastStatus = pokemon.status?.effect || StatusEffect.NONE; diff --git a/src/ui/battle-message-ui-handler.ts b/src/ui/battle-message-ui-handler.ts index d50f66a0f..5ad7f798d 100644 --- a/src/ui/battle-message-ui-handler.ts +++ b/src/ui/battle-message-ui-handler.ts @@ -192,7 +192,7 @@ export default class BattleMessageUiHandler extends MessageUiHandler { if (shownIvsCount < 6) { let statsPool = stats.slice(0); for (let i = 0; i < shownIvsCount; i++) { - const shownStat = Phaser.Math.RND.pick(statsPool); + const shownStat = Utils.randSeedItem(statsPool); shownStats.push(shownStat); statsPool.splice(statsPool.indexOf(shownStat), 1); } diff --git a/src/ui/egg-list-ui-handler.ts b/src/ui/egg-list-ui-handler.ts index 489566651..eebabf2f0 100644 --- a/src/ui/egg-list-ui-handler.ts +++ b/src/ui/egg-list-ui-handler.ts @@ -1,6 +1,6 @@ import BattleScene, { Button } from "../battle-scene"; import { Mode } from "./ui"; -import PokemonIconAnimHandler, { PokemonIconAnimMode } from "./pokemon-icon-anim-handler"; +import PokemonIconAnimHandler, { PokemonIconAnimMode } from "../sprite/pokemon-icon-anim-handler"; import { TextStyle, addTextObject } from "./text"; import MessageUiHandler from "./message-ui-handler"; import { EGG_SEED, Egg, GachaType, getEggGachaTypeDescriptor, getEggHatchWavesMessage, getEggDescriptor } from "../data/egg"; diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index f6a22c4cc..b1d2789a0 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -11,7 +11,7 @@ import { allMoves } from "../data/move"; import { Moves } from "../data/enums/moves"; import { getGenderColor, getGenderSymbol } from "../data/gender"; import { StatusEffect } from "../data/status-effect"; -import PokemonIconAnimHandler, { PokemonIconAnimMode } from "./pokemon-icon-anim-handler"; +import PokemonIconAnimHandler, { PokemonIconAnimMode } from "../sprite/pokemon-icon-anim-handler"; import { pokemonEvolutions } from "../data/pokemon-evolutions"; import { addWindow } from "./window"; import { SpeciesFormChangeItemTrigger } from "../data/pokemon-forms"; @@ -102,7 +102,7 @@ export default class PartyUiHandler extends MessageUiHandler { private static FilterAllMoves = (_pokemonMove: PokemonMove) => null; public static FilterItemMaxStacks = (pokemon: PlayerPokemon, modifier: PokemonHeldItemModifier) => { - const matchingModifier = pokemon.scene.findModifier(m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).matchType(modifier)) as PokemonHeldItemModifier; + const matchingModifier = pokemon.scene.findModifier(m => m instanceof PokemonHeldItemModifier && m.pokemonId === pokemon.id && m.matchType(modifier)) as PokemonHeldItemModifier; if (matchingModifier && matchingModifier.stackCount === matchingModifier.getMaxStackCount(pokemon.scene)) return `${pokemon.name} has too many\nof this item!`; return null; diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 9be22375b..f5f5fb79e 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -11,13 +11,14 @@ import { Unlockables } from "../system/unlockables"; import { GrowthRate, getGrowthRateColor } from "../data/exp"; import { DexAttr, DexEntry } from "../system/game-data"; import * as Utils from "../utils"; -import PokemonIconAnimHandler, { PokemonIconAnimMode } from "./pokemon-icon-anim-handler"; +import PokemonIconAnimHandler, { PokemonIconAnimMode } from "../sprite/pokemon-icon-anim-handler"; import { StatsContainer } from "./stats-container"; import { addWindow } from "./window"; import { Nature, getNatureName } from "../data/nature"; import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { pokemonFormChanges } from "../data/pokemon-forms"; import { Tutorial, handleTutorial } from "../tutorial"; +import PokemonSpriteSparkleHandler from "../sprite/pokemon-sprite-sparkle-handler"; export type StarterSelectCallback = (starters: Starter[]) => void; @@ -310,7 +311,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { let pokerusCursor: integer; const generateSpecies = () => { - randomSpeciesId = Phaser.Math.RND.pick(starterSpecies); + randomSpeciesId = Utils.randSeedItem(starterSpecies); species = getPokemonSpecies(randomSpeciesId); pokerusCursor = this.genSpecies[species.generation - 1].indexOf(species); }; diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index 1ed34dbb5..664ea3816 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -3,7 +3,7 @@ import { Mode } from "./ui"; import UiHandler from "./ui-handler"; import * as Utils from "../utils"; import { PlayerPokemon } from "../pokemon"; -import { Type } from "../data/type"; +import { Type, getTypeRgb } from "../data/type"; import { TextStyle, addBBCodeTextObject, addTextObject, getBBCodeFrag, getTextColor } from "./text"; import Move, { MoveCategory } from "../data/move"; import { getPokeballAtlasKey } from "../data/pokeball"; @@ -98,8 +98,7 @@ export default class SummaryUiHandler extends UiHandler { this.numberText.setOrigin(0, 1); this.summaryContainer.add(this.numberText); - this.pokemonSprite = this.scene.add.sprite(56, -106, `pkmn__sub`); - this.pokemonSprite.setPipeline(this.scene.spritePipeline, { ignoreOverride: true, tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false }); + this.pokemonSprite = this.scene.initPokemonSprite(this.scene.add.sprite(56, -106, `pkmn__sub`), null, false, true); this.summaryContainer.add(this.pokemonSprite); this.nameText = addTextObject(this.scene, 6, -54, '', TextStyle.SUMMARY); @@ -201,6 +200,7 @@ export default class SummaryUiHandler extends UiHandler { this.numberText.setShadowColor(getTextColor(!this.pokemon.isShiny() ? TextStyle.SUMMARY : TextStyle.SUMMARY_GOLD, true)); this.pokemonSprite.play(this.pokemon.getSpriteKey(true)); + this.pokemonSprite.pipelineData['teraColor'] = getTypeRgb(this.pokemon.getTeraType()); this.pokemonSprite.pipelineData['ignoreTimeTint'] = true; [ 'spriteColors', 'fusionSpriteColors' ].map(k => { delete this.pokemonSprite.pipelineData[`${k}Base`]; @@ -489,16 +489,26 @@ export default class SummaryUiHandler extends UiHandler { typeLabel.setOrigin(0, 0); profileContainer.add(typeLabel); - const getTypeIcon = (index: integer, type: Type) => { - const typeIcon = this.scene.add.sprite(39 + 34 * index, 42, 'types', Type[type].toLowerCase()); + const getTypeIcon = (index: integer, type: Type, tera: boolean = false) => { + const xCoord = 39 + 34 * index; + const typeIcon = !tera + ? this.scene.add.sprite(xCoord, 42, 'types', Type[type].toLowerCase()) + : this.scene.add.sprite(xCoord, 42, 'type_tera'); + if (tera) { + typeIcon.setScale(0.5); + const typeRgb = getTypeRgb(type); + typeIcon.setTint(Phaser.Display.Color.GetColor(typeRgb[0], typeRgb[1], typeRgb[2])); + } typeIcon.setOrigin(0, 1); return typeIcon; }; - const types = this.pokemon.getTypes(true); + const types = this.pokemon.getTypes(false, true); profileContainer.add(getTypeIcon(0, types[0])); if (types.length > 1) profileContainer.add(getTypeIcon(1, types[1])); + if (this.pokemon.isTerastallized()) + profileContainer.add(getTypeIcon(types.length, this.pokemon.getTeraType(), true)); const ability = this.pokemon.getAbility(); @@ -534,7 +544,7 @@ export default class SummaryUiHandler extends UiHandler { }); } - let memoString = `${getBBCodeFrag(Utils.toReadableString(Nature[this.pokemon.nature]), TextStyle.SUMMARY_RED)} nature,\n${getBBCodeFrag(`${this.pokemon.metBiome === -1 ? 'apparently ' : ''}met at Lv`, TextStyle.WINDOW)}${getBBCodeFrag(this.pokemon.metLevel.toString(), TextStyle.SUMMARY_RED)}${getBBCodeFrag(',', TextStyle.WINDOW)}\n${getBBCodeFrag(getBiomeName(this.pokemon.metBiome), TextStyle.SUMMARY_RED)}${getBBCodeFrag('.', TextStyle.WINDOW)}`; + let memoString = `${getBBCodeFrag(Utils.toReadableString(Nature[this.pokemon.nature]), TextStyle.SUMMARY_RED)}${getBBCodeFrag(' nature,', TextStyle.WINDOW)}\n${getBBCodeFrag(`${this.pokemon.metBiome === -1 ? 'apparently ' : ''}met at Lv`, TextStyle.WINDOW)}${getBBCodeFrag(this.pokemon.metLevel.toString(), TextStyle.SUMMARY_RED)}${getBBCodeFrag(',', TextStyle.WINDOW)}\n${getBBCodeFrag(getBiomeName(this.pokemon.metBiome), TextStyle.SUMMARY_RED)}${getBBCodeFrag('.', TextStyle.WINDOW)}`; const memoText = addBBCodeTextObject(this.scene, 7, 113, memoString, TextStyle.WINDOW); memoText.setOrigin(0, 0); diff --git a/src/utils.ts b/src/utils.ts index 495d5d207..3a310493a 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -72,6 +72,18 @@ export function randIntRange(min: integer, max: integer): integer { return randInt(max - min, min); } +export function randSeedItem(items: T[]): T { + return items.length === 1 + ? items[0] + : Phaser.Math.RND.pick(items); +} + +export function randSeedWeightedItem(items: T[]): T { + return items.length === 1 + ? items[0] + : Phaser.Math.RND.weightedPick(items); +} + export function getSunday(date: Date): Date { const day = date.getDay(), diff = date.getDate() - day;