From 15105231baa75b76f54b41b81effbf30c9a96319 Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Sun, 9 Apr 2023 19:15:21 -0400 Subject: [PATCH] Refactor modifiers --- public/images/items.json | 2670 +++++++++++++------------ public/images/items.png | Bin 27502 -> 28846 bytes public/images/items/healing_charm.png | Bin 0 -> 347 bytes public/images/items/oval_charm.png | Bin 0 -> 245 bytes src/battle-info.ts | 169 +- src/battle-phase.ts | 21 +- src/battle-scene.ts | 92 +- src/modifier.ts | 318 ++- src/pokemon-species.ts | 70 +- src/pokemon.ts | 27 +- src/ui/modifier-select-ui-handler.ts | 12 +- src/ui/party-ui-handler.ts | 6 +- src/ui/starter-select-ui-handler.ts | 75 + src/ui/ui.ts | 10 +- 14 files changed, 1919 insertions(+), 1551 deletions(-) create mode 100644 public/images/items/healing_charm.png create mode 100644 public/images/items/oval_charm.png create mode 100644 src/ui/starter-select-ui-handler.ts diff --git a/public/images/items.json b/public/images/items.json index 63b6cf58b..70d7ce02d 100644 --- a/public/images/items.json +++ b/public/images/items.json @@ -5,12 +5,12 @@ "format": "RGBA8888", "size": { "w": 200, - "h": 200 + "h": 206 }, "scale": 1, "frames": [ { - "filename": "prism_scale", + "filename": "choice_scarf", "rotated": false, "trimmed": true, "sourceSize": { @@ -18,20 +18,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 15, - "h": 15 + "x": 4, + "y": 4, + "w": 24, + "h": 24 }, "frame": { "x": 0, "y": 0, - "w": 15, - "h": 15 + "w": 24, + "h": 24 } }, { - "filename": "black_glasses", + "filename": "sun_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -40,397 +40,19 @@ }, "spriteSourceSize": { "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 15, - "y": 0, - "w": 23, - "h": 17 - } - }, - { - "filename": "everstone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 17 - }, - "frame": { - "x": 38, - "y": 0, - "w": 20, - "h": 17 - } - }, - { - "filename": "revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 12, - "h": 17 - }, - "frame": { - "x": 58, - "y": 0, - "w": 12, - "h": 17 - } - }, - { - "filename": "choice_specs", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, + "y": 4, "w": 24, - "h": 18 - }, - "frame": { - "x": 70, - "y": 0, - "w": 24, - "h": 18 - } - }, - { - "filename": "dragon_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 24, - "h": 18 - }, - "frame": { - "x": 94, - "y": 0, - "w": 24, - "h": 18 - } - }, - { - "filename": "dubious_disc", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 19 - }, - "frame": { - "x": 118, - "y": 0, - "w": 22, - "h": 19 - } - }, - { - "filename": "oval_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 19 - }, - "frame": { - "x": 140, - "y": 0, - "w": 18, - "h": 19 - } - }, - { - "filename": "razor_claw", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 20, - "h": 19 - }, - "frame": { - "x": 158, - "y": 0, - "w": 20, - "h": 19 - } - }, - { - "filename": "upgrade", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 19 - }, - "frame": { - "x": 178, - "y": 0, - "w": 22, - "h": 19 - } - }, - { - "filename": "binding_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 23, - "h": 20 + "h": 24 }, "frame": { "x": 0, - "y": 17, - "w": 23, - "h": 20 + "y": 24, + "w": 24, + "h": 24 } }, { - "filename": "deep_sea_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 23, - "y": 17, - "w": 22, - "h": 20 - } - }, - { - "filename": "gb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 45, - "y": 17, - "w": 20, - "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": 65, - "y": 18, - "w": 17, - "h": 20 - } - }, - { - "filename": "lucky_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 17, - "h": 20 - }, - "frame": { - "x": 82, - "y": 18, - "w": 17, - "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": 99, - "y": 18, - "w": 18, - "h": 20 - } - }, - { - "filename": "mb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 117, - "y": 19, - "w": 20, - "h": 20 - } - }, - { - "filename": "pb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 137, - "y": 19, - "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": 157, - "y": 19, - "w": 20, - "h": 20 - } - }, - { - "filename": "shell_bell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 23, - "h": 20 - }, - "frame": { - "x": 177, - "y": 19, - "w": 23, - "h": 20 - } - }, - { - "filename": "sacred_ash", + "filename": "big_root", "rotated": false, "trimmed": true, "sourceSize": { @@ -439,103 +61,19 @@ }, "spriteSourceSize": { "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 0, - "y": 37, - "w": 24, - "h": 20 - } - }, - { - "filename": "ub", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 + "y": 4, + "w": 23, + "h": 24 }, "frame": { "x": 24, - "y": 37, - "w": 20, - "h": 20 + "y": 0, + "w": 23, + "h": 24 } }, { - "filename": "dawn_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 21 - }, - "frame": { - "x": 44, - "y": 37, - "w": 20, - "h": 21 - } - }, - { - "filename": "deep_sea_tooth", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 64, - "y": 38, - "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": 86, - "y": 38, - "w": 21, - "h": 21 - } - }, - { - "filename": "moon_stone", + "filename": "expert_belt", "rotated": false, "trimmed": true, "sourceSize": { @@ -544,19 +82,40 @@ }, "spriteSourceSize": { "x": 4, - "y": 6, + "y": 4, + "w": 24, + "h": 23 + }, + "frame": { + "x": 0, + "y": 48, + "w": 24, + "h": 23 + } + }, + { + "filename": "kings_rock", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, "w": 23, - "h": 21 + "h": 24 }, "frame": { - "x": 107, - "y": 39, + "x": 24, + "y": 24, "w": 23, - "h": 21 + "h": 24 } }, { - "filename": "shiny_stone", + "filename": "scope-lens", "rotated": false, "trimmed": true, "sourceSize": { @@ -564,58 +123,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 130, - "y": 39, - "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": 151, - "y": 39, - "w": 21, - "h": 21 - } - }, - { - "filename": "electirizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, + "x": 4, "y": 5, - "w": 22, - "h": 22 + "w": 24, + "h": 23 }, "frame": { - "x": 172, - "y": 39, - "w": 22, - "h": 22 + "x": 47, + "y": 0, + "w": 24, + "h": 23 } }, { @@ -634,13 +151,13 @@ }, "frame": { "x": 0, - "y": 57, + "y": 71, "w": 24, "h": 22 } }, { - "filename": "metal_coat", + "filename": "max_revive", "rotated": false, "trimmed": true, "sourceSize": { @@ -648,587 +165,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 19, - "h": 22 + "x": 5, + "y": 4, + "w": 22, + "h": 24 }, "frame": { "x": 24, - "y": 57, - "w": 19, - "h": 22 + "y": 48, + "w": 22, + "h": 24 } }, { - "filename": "full_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 15, - "h": 23 - }, - "frame": { - "x": 43, - "y": 58, - "w": 15, - "h": 23 - } - }, - { - "filename": "ice_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 58, - "y": 59, - "w": 22, - "h": 22 - } - }, - { - "filename": "magmarizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 80, - "y": 59, - "w": 22, - "h": 22 - } - }, - { - "filename": "protector", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 102, - "y": 60, - "w": 22, - "h": 22 - } - }, - { - "filename": "thunder_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 124, - "y": 60, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_bug", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 146, - "y": 60, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_dark", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 168, - "y": 61, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_dragon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 0, - "y": 79, - "w": 22, - "h": 22 - } - }, - { - "filename": "hyper_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 22, - "y": 79, - "w": 17, - "h": 23 - } - }, - { - "filename": "tm_electric", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 39, - "y": 81, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_fairy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 61, - "y": 81, - "w": 22, - "h": 22 - } - }, - { - "filename": "potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 83, - "y": 81, - "w": 17, - "h": 23 - } - }, - { - "filename": "tm_fighting", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 100, - "y": 82, - "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": 122, - "y": 82, - "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": 144, - "y": 82, - "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": 166, - "y": 83, - "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": 0, - "y": 101, - "w": 22, - "h": 22 - } - }, - { - "filename": "super_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 22, - "y": 102, - "w": 17, - "h": 23 - } - }, - { - "filename": "tm_ground", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 39, - "y": 103, - "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": 61, - "y": 103, - "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": 83, - "y": 104, - "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": 105, - "y": 104, - "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": 127, - "y": 104, - "w": 22, - "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": 149, - "y": 105, - "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": 171, - "y": 105, - "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": 0, - "y": 123, - "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": 22, - "y": 125, - "w": 22, - "h": 22 - } - }, - { - "filename": "expert_belt", + "filename": "rare_candy", "rotated": false, "trimmed": true, "sourceSize": { @@ -1237,14 +187,14 @@ }, "spriteSourceSize": { "x": 4, - "y": 4, - "w": 24, + "y": 5, + "w": 23, "h": 23 }, "frame": { - "x": 44, - "y": 125, - "w": 24, + "x": 47, + "y": 23, + "w": 23, "h": 23 } }, @@ -1263,8 +213,8 @@ "h": 23 }, "frame": { - "x": 68, - "y": 126, + "x": 71, + "y": 0, "w": 22, "h": 23 } @@ -1284,14 +234,14 @@ "h": 23 }, "frame": { - "x": 90, - "y": 126, + "x": 0, + "y": 93, "w": 22, "h": 23 } }, { - "filename": "leaf_stone", + "filename": "healing_charm", "rotated": false, "trimmed": true, "sourceSize": { @@ -1301,18 +251,18 @@ "spriteSourceSize": { "x": 5, "y": 5, - "w": 21, - "h": 23 + "w": 23, + "h": 22 }, "frame": { - "x": 112, - "y": 126, - "w": 21, - "h": 23 + "x": 70, + "y": 23, + "w": 23, + "h": 22 } }, { - "filename": "calcium", + "filename": "oval_charm", "rotated": false, "trimmed": true, "sourceSize": { @@ -1320,39 +270,18 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, + "x": 6, "y": 4, - "w": 16, + "w": 21, "h": 24 }, "frame": { - "x": 133, - "y": 126, - "w": 16, + "x": 93, + "y": 0, + "w": 21, "h": 24 } }, - { - "filename": "rare_candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 149, - "y": 127, - "w": 23, - "h": 23 - } - }, { "filename": "reaper_cloth", "rotated": false, @@ -1368,14 +297,392 @@ "h": 23 }, "frame": { - "x": 172, - "y": 127, + "x": 0, + "y": 116, "w": 22, "h": 23 } }, { - "filename": "carbos", + "filename": "shiny_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 114, + "y": 0, + "w": 21, + "h": 24 + } + }, + { + "filename": "electirizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 0, + "y": 139, + "w": 22, + "h": 22 + } + }, + { + "filename": "ice_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 135, + "y": 0, + "w": 22, + "h": 22 + } + }, + { + "filename": "leaf_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 0, + "y": 161, + "w": 21, + "h": 23 + } + }, + { + "filename": "magmarizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 0, + "y": 184, + "w": 22, + "h": 22 + } + }, + { + "filename": "moon_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 93, + "y": 24, + "w": 23, + "h": 21 + } + }, + { + "filename": "protector", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 157, + "y": 0, + "w": 22, + "h": 22 + } + }, + { + "filename": "dusk_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 179, + "y": 0, + "w": 21, + "h": 21 + } + }, + { + "filename": "deep_sea_tooth", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 24, + "y": 72, + "w": 22, + "h": 21 + } + }, + { + "filename": "sacred_ash", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 22, + "y": 93, + "w": 24, + "h": 20 + } + }, + { + "filename": "thunder_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 22, + "y": 113, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_bug", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 22, + "y": 135, + "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": 179, + "y": 21, + "w": 21, + "h": 21 + } + }, + { + "filename": "dawn_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 21 + }, + "frame": { + "x": 116, + "y": 24, + "w": 20, + "h": 21 + } + }, + { + "filename": "tm_dark", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 136, + "y": 22, + "w": 22, + "h": 22 + } + }, + { + "filename": "zoom_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 158, + "y": 22, + "w": 21, + "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": 22, + "y": 157, + "w": 23, + "h": 20 + } + }, + { + "filename": "tm_dragon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 22, + "y": 177, + "w": 22, + "h": 22 + } + }, + { + "filename": "calcium", "rotated": false, "trimmed": true, "sourceSize": { @@ -1389,14 +696,14 @@ "h": 24 }, "frame": { - "x": 0, - "y": 145, + "x": 44, + "y": 113, "w": 16, "h": 24 } }, { - "filename": "scope-lens", + "filename": "deep_sea_scale", "rotated": false, "trimmed": true, "sourceSize": { @@ -1404,20 +711,62 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 44, + "y": 137, + "w": 22, + "h": 20 + } + }, + { + "filename": "shell_bell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 23, + "h": 20 + }, + "frame": { + "x": 45, + "y": 157, + "w": 23, + "h": 20 + } + }, + { + "filename": "tm_electric", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, "y": 5, - "w": 24, - "h": 23 + "w": 22, + "h": 22 }, "frame": { - "x": 16, - "y": 147, - "w": 24, - "h": 23 + "x": 44, + "y": 177, + "w": 22, + "h": 22 } }, { - "filename": "big_root", + "filename": "black_glasses", "rotated": false, "trimmed": true, "sourceSize": { @@ -1426,19 +775,61 @@ }, "spriteSourceSize": { "x": 4, - "y": 4, + "y": 8, "w": 23, - "h": 24 + "h": 17 }, "frame": { - "x": 40, - "y": 148, + "x": 47, + "y": 46, "w": 23, - "h": 24 + "h": 17 } }, { - "filename": "choice_scarf", + "filename": "tm_fairy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 46, + "y": 63, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_fighting", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 46, + "y": 85, + "w": 22, + "h": 22 + } + }, + { + "filename": "choice_specs", "rotated": false, "trimmed": true, "sourceSize": { @@ -1447,15 +838,225 @@ }, "spriteSourceSize": { "x": 4, - "y": 4, + "y": 8, "w": 24, - "h": 24 + "h": 18 }, "frame": { - "x": 63, - "y": 149, + "x": 70, + "y": 45, "w": 24, - "h": 24 + "h": 18 + } + }, + { + "filename": "tm_fire", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 68, + "y": 63, + "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": 68, + "y": 85, + "w": 22, + "h": 22 + } + }, + { + "filename": "dragon_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 24, + "h": 18 + }, + "frame": { + "x": 94, + "y": 45, + "w": 24, + "h": 18 + } + }, + { + "filename": "tm_ghost", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 90, + "y": 63, + "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": 90, + "y": 85, + "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": 60, + "y": 107, + "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": 82, + "y": 107, + "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": 118, + "y": 45, + "w": 22, + "h": 19 + } + }, + { + "filename": "tm_normal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 112, + "y": 64, + "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": 112, + "y": 86, + "w": 22, + "h": 22 } }, { @@ -1473,12 +1074,201 @@ "h": 24 }, "frame": { - "x": 87, - "y": 149, + "x": 140, + "y": 44, "w": 18, "h": 24 } }, + { + "filename": "tm_psychic", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 158, + "y": 43, + "w": 22, + "h": 22 + } + }, + { + "filename": "gb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 180, + "y": 42, + "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": 180, + "y": 62, + "w": 20, + "h": 20 + } + }, + { + "filename": "tm_rock", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 158, + "y": 65, + "w": 22, + "h": 22 + } + }, + { + "filename": "pb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 180, + "y": 82, + "w": 20, + "h": 20 + } + }, + { + "filename": "tm_steel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 134, + "y": 68, + "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": 134, + "y": 90, + "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": 156, + "y": 87, + "w": 22, + "h": 22 + } + }, + { + "filename": "upgrade", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 178, + "y": 102, + "w": 22, + "h": 19 + } + }, { "filename": "ether", "rotated": false, @@ -1494,8 +1284,8 @@ "h": 24 }, "frame": { - "x": 105, - "y": 149, + "x": 66, + "y": 129, "w": 18, "h": 24 } @@ -1515,12 +1305,243 @@ "h": 24 }, "frame": { - "x": 123, - "y": 150, + "x": 84, + "y": 129, "w": 18, "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": 68, + "y": 153, + "w": 18, + "h": 24 + } + }, + { + "filename": "metal_coat", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 66, + "y": 177, + "w": 19, + "h": 22 + } + }, + { + "filename": "carbos", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 86, + "y": 153, + "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": 85, + "y": 177, + "w": 17, + "h": 23 + } + }, + { + "filename": "pb_gold", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 104, + "y": 108, + "w": 20, + "h": 20 + } + }, + { + "filename": "everstone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 17 + }, + "frame": { + "x": 124, + "y": 112, + "w": 20, + "h": 17 + } + }, + { + "filename": "full_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 15, + "h": 23 + }, + "frame": { + "x": 144, + "y": 112, + "w": 15, + "h": 23 + } + }, + { + "filename": "max_ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 159, + "y": 109, + "w": 18, + "h": 24 + } + }, + { + "filename": "razor_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 177, + "y": 121, + "w": 20, + "h": 19 + } + }, + { + "filename": "max_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 159, + "y": 133, + "w": 18, + "h": 24 + } + }, + { + "filename": "ub", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 177, + "y": 140, + "w": 20, + "h": 20 + } + }, { "filename": "hp_up", "rotated": false, @@ -1536,8 +1557,8 @@ "h": 24 }, "frame": { - "x": 141, - "y": 150, + "x": 102, + "y": 129, "w": 16, "h": 24 } @@ -1557,14 +1578,14 @@ "h": 24 }, "frame": { - "x": 157, - "y": 150, + "x": 102, + "y": 153, "w": 16, "h": 24 } }, { - "filename": "kings_rock", + "filename": "potion", "rotated": false, "trimmed": true, "sourceSize": { @@ -1572,16 +1593,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 23, - "h": 24 + "x": 8, + "y": 5, + "w": 17, + "h": 23 }, "frame": { - "x": 173, - "y": 150, - "w": 23, - "h": 24 + "x": 102, + "y": 177, + "w": 17, + "h": 23 } }, { @@ -1599,96 +1620,12 @@ "h": 24 }, "frame": { - "x": 0, - "y": 169, + "x": 118, + "y": 129, "w": 16, "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": 16, - "y": 170, - "w": 18, - "h": 24 - } - }, - { - "filename": "max_ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 34, - "y": 172, - "w": 18, - "h": 24 - } - }, - { - "filename": "max_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 52, - "y": 173, - "w": 18, - "h": 24 - } - }, - { - "filename": "max_revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 70, - "y": 173, - "w": 22, - "h": 24 - } - }, { "filename": "pp_up", "rotated": false, @@ -1704,8 +1641,8 @@ "h": 24 }, "frame": { - "x": 92, - "y": 173, + "x": 118, + "y": 153, "w": 16, "h": 24 } @@ -1725,14 +1662,14 @@ "h": 24 }, "frame": { - "x": 108, - "y": 174, + "x": 119, + "y": 177, "w": 16, "h": 24 } }, { - "filename": "shiny_charm", + "filename": "super_potion", "rotated": false, "trimmed": true, "sourceSize": { @@ -1740,20 +1677,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 21, - "h": 24 + "x": 8, + "y": 5, + "w": 17, + "h": 23 }, "frame": { - "x": 124, - "y": 174, - "w": 21, - "h": 24 + "x": 134, + "y": 135, + "w": 17, + "h": 23 } }, { - "filename": "sun_stone", + "filename": "oval_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -1761,16 +1698,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 + "x": 7, + "y": 7, + "w": 18, + "h": 19 }, "frame": { - "x": 145, - "y": 174, - "w": 24, - "h": 24 + "x": 134, + "y": 158, + "w": 18, + "h": 19 } }, { @@ -1788,11 +1725,116 @@ "h": 24 }, "frame": { - "x": 169, - "y": 174, + "x": 135, + "y": 177, "w": 16, "h": 24 } + }, + { + "filename": "razor_fang", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 18, + "h": 20 + }, + "frame": { + "x": 152, + "y": 157, + "w": 18, + "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": 151, + "y": 177, + "w": 17, + "h": 20 + } + }, + { + "filename": "lucky_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 17, + "h": 20 + }, + "frame": { + "x": 170, + "y": 160, + "w": 17, + "h": 20 + } + }, + { + "filename": "prism_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 168, + "y": 180, + "w": 15, + "h": 15 + } + }, + { + "filename": "revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 12, + "h": 17 + }, + "frame": { + "x": 187, + "y": 160, + "w": 12, + "h": 17 + } } ] } @@ -1800,6 +1842,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3889167d88090ae39e2045efa02511c8:4c63b4982a1c6c6f3ea59eb1f10d0968:110e074689c9edd2c54833ce2e4d9270$" + "smartupdate": "$TexturePacker:SmartUpdate:a1f518d9e1139553a9c9fe056f7c0328:d09d41adca58aa2c39234c6ca54e35ee:110e074689c9edd2c54833ce2e4d9270$" } } diff --git a/public/images/items.png b/public/images/items.png index 1202be0f486c8e5ee0d750204f74fc629618d8b1..a78812ac7e019ba0122a9a0a11ca27cfb1232d21 100644 GIT binary patch literal 28846 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 UOmi#qTL1t607*qoM6N<$f`Lh{KmY&$ literal 27502 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 literal 0 HcmV?d00001 diff --git a/public/images/items/oval_charm.png b/public/images/items/oval_charm.png new file mode 100644 index 0000000000000000000000000000000000000000..3b82611b5ae254753b821e78d91712f5dae62880 GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJJ)SO(ArXg@6C_v{Cs;7BvbO$z zF=O2{bN0K=8wHLm?{?l0*>_gaq@2Od{er4Ug2e3P3^}eJGS21f54z?t79ME$Ehomr zEc`#bzsWFGr#&(v& z5o&w7AY)-AE6X=qgME&gvNr`ow#!62Gl%U^cwRco)Wv~q-N|44$2V+}J+dsjnfYeY tjHe~K*C*;OtA1*vz@G}UF-k= literal 0 HcmV?d00001 diff --git a/src/battle-info.ts b/src/battle-info.ts index 0cf7d5267..ac9263109 100644 --- a/src/battle-info.ts +++ b/src/battle-info.ts @@ -101,24 +101,77 @@ export default class BattleInfo extends Phaser.GameObjects.Container { } } - updateInfo(pokemon: Pokemon, callback?: Function) { - if (!this.scene) { - if (callback) - callback(); - return; - } + updateInfo(pokemon: Pokemon): Promise { + return new Promise(resolve => { + if (!this.scene) { + resolve(); + return; + } - const updatePokemonHp = () => { - const duration = Utils.clampInt(Math.abs((this.lastHp) - pokemon.hp) * 5, 250, 5000); + const updatePokemonHp = () => { + const duration = Utils.clampInt(Math.abs((this.lastHp) - pokemon.hp) * 5, 250, 5000); + this.scene.tweens.add({ + targets: this.hpBar, + ease: 'Sine.easeOut', + scaleX: pokemon.getHpRatio(), + duration: duration, + onUpdate: () => { + if (this.player && this.lastHp !== pokemon.hp) { + const tweenHp = Math.ceil(this.hpBar.scaleX * pokemon.getMaxHp()); + this.setHpNumbers(tweenHp, pokemon.getMaxHp()) + this.lastHp = tweenHp; + } + + const hpFrame = this.hpBar.scaleX > 0.5 ? 'high' : this.hpBar.scaleX > 0.25 ? 'medium' : 'low'; + if (hpFrame !== this.lastHpFrame) { + this.hpBar.setFrame(hpFrame); + this.lastHpFrame = hpFrame; + } + }, + onComplete: () => { + resolve(); + } + }); + if (!this.player) + this.lastHp = pokemon.hp; + this.lastMaxHp = pokemon.getMaxHp(); + }; + + if (this.player && this.lastExp !== pokemon.exp) { + const originalResolve = resolve; + resolve = () => this.updatePokemonExp(pokemon).then(() => originalResolve()); + } + + if (this.lastHp !== pokemon.hp || this.lastMaxHp !== pokemon.getMaxHp()) { + updatePokemonHp(); + return; + } else if (!this.player && this.lastLevel !== pokemon.level) { + this.setLevel(pokemon.level); + this.lastLevel = pokemon.level; + } + + resolve(); + }); + } + + updatePokemonExp(battler: Pokemon): Promise { + return new Promise(resolve => { + const levelUp = this.lastLevel < battler.level; + const relLevelExp = getLevelRelExp(this.lastLevel + 1, battler.species.growthRate); + const levelExp = levelUp ? relLevelExp : battler.levelExp; + let ratio = levelExp / relLevelExp; + let duration = this.visible ? ((levelExp - this.lastLevelExp) / relLevelExp) * 1650 : 0; + if (duration) + this.scene.sound.play('exp'); this.scene.tweens.add({ - targets: this.hpBar, - ease: 'Sine.easeOut', - scaleX: pokemon.getHpRatio(), + targets: this.expBar, + ease: 'Sine.easeIn', + scaleX: ratio, duration: duration, onUpdate: () => { - if (this.player && this.lastHp !== pokemon.hp) { - const tweenHp = Math.ceil(this.hpBar.scaleX * pokemon.getMaxHp()); - this.setHpNumbers(tweenHp, pokemon.getMaxHp()) + if (this.player && this.lastHp !== battler.hp) { + const tweenHp = Math.ceil(this.hpBar.scaleX * battler.getMaxHp()); + this.setHpNumbers(tweenHp, battler.getMaxHp()); this.lastHp = tweenHp; } @@ -129,81 +182,25 @@ export default class BattleInfo extends Phaser.GameObjects.Container { } }, onComplete: () => { - if (callback) { - callback(); - callback = null; + if (duration) + this.scene.sound.stopByKey('exp'); + if (ratio === 1) { + this.lastLevelExp = 0; + this.lastLevel++; + this.scene.sound.play('level_up'); + this.setLevel(this.lastLevel); + this.scene.time.delayedCall(500, () => { + this.expBar.setScale(0, 1); + this.updateInfo(battler).then(() => resolve()); + }); + return; + } else { + this.lastExp = battler.exp; + this.lastLevelExp = battler.levelExp; } + resolve(); } }); - if (!this.player) - this.lastHp = pokemon.hp; - this.lastMaxHp = pokemon.getMaxHp(); - }; - - if (this.player && this.lastExp !== pokemon.exp) { - const originalCallback = callback; - callback = () => this.updatePokemonExp(pokemon, originalCallback); - } - - if (this.lastHp !== pokemon.hp || this.lastMaxHp !== pokemon.getMaxHp()) - updatePokemonHp(); - else if (!this.player && this.lastLevel !== pokemon.level) { - this.setLevel(pokemon.level); - this.lastLevel = pokemon.level; - if (callback) - callback(); - } else if (callback) - callback(); - } - - updatePokemonExp(battler: Pokemon, callback?: Function) { - const levelUp = this.lastLevel < battler.level; - const relLevelExp = getLevelRelExp(this.lastLevel + 1, battler.species.growthRate); - const levelExp = levelUp ? relLevelExp : battler.levelExp; - let ratio = levelExp / relLevelExp; - let duration = this.visible ? ((levelExp - this.lastLevelExp) / relLevelExp) * 1650 : 0; - if (duration) - this.scene.sound.play('exp'); - this.scene.tweens.add({ - targets: this.expBar, - ease: 'Sine.easeIn', - scaleX: ratio, - duration: duration, - onUpdate: () => { - if (this.player && this.lastHp !== battler.hp) { - const tweenHp = Math.ceil(this.hpBar.scaleX * battler.getMaxHp()); - this.setHpNumbers(tweenHp, battler.getMaxHp()); - this.lastHp = tweenHp; - } - - const hpFrame = this.hpBar.scaleX > 0.5 ? 'high' : this.hpBar.scaleX > 0.25 ? 'medium' : 'low'; - if (hpFrame !== this.lastHpFrame) { - this.hpBar.setFrame(hpFrame); - this.lastHpFrame = hpFrame; - } - }, - onComplete: () => { - if (duration) - this.scene.sound.stopByKey('exp'); - if (ratio === 1) { - this.lastLevelExp = 0; - this.lastLevel++; - this.scene.sound.play('level_up'); - this.setLevel(this.lastLevel); - this.scene.time.delayedCall(500, () => { - this.expBar.setScale(0, 1); - this.updateInfo(battler, callback); - }); - return; - } else { - this.lastExp = battler.exp; - this.lastLevelExp = battler.levelExp; - } - if (callback) { - callback(); - callback = null; - } - } }); } diff --git a/src/battle-phase.ts b/src/battle-phase.ts index 24b2b088c..cd21eb0ed 100644 --- a/src/battle-phase.ts +++ b/src/battle-phase.ts @@ -29,6 +29,18 @@ export class BattlePhase { } } +export class SelectStarterPhase extends BattlePhase { + constructor(scene: BattleScene) { + super(scene); + } + + start() { + super.start(); + + this.scene.ui.setMode(Mode.STARTER_SELECT); + } +} + export class EncounterPhase extends BattlePhase { constructor(scene: BattleScene) { super(scene); @@ -722,7 +734,7 @@ export class ExpPhase extends PartyMemberPokemonPhase { newLevel = pokemon.level; if (newLevel > lastLevel) this.scene.unshiftPhase(new LevelUpPhase(this.scene, this.partyMemberIndex, newLevel)); - pokemon.updateInfo(() => this.end()); + pokemon.updateInfo().then(() => this.end()); }, null, true); } @@ -1016,7 +1028,7 @@ export class SelectModifierPhase extends BattlePhase { this.scene.applyModifiers(ExtraModifierModifier, modifierCount); const types: Array = getModifierTypesForWave(this.scene.currentBattle.waveIndex - 1, modifierCount.value, party); - this.scene.ui.setMode(Mode.MODIFIER_SELECT, types, (cursor: integer) => { + const modifierSelectCallback = (cursor: integer) => { if (cursor < 0) { this.scene.ui.setMode(Mode.MESSAGE); super.end(); @@ -1033,14 +1045,15 @@ export class SelectModifierPhase extends BattlePhase { this.scene.ui.clearText(); this.scene.ui.setMode(Mode.MESSAGE); } else - this.scene.ui.setMode(Mode.MODIFIER_SELECT); + this.scene.ui.setMode(Mode.MODIFIER_SELECT, types, modifierSelectCallback); }, pokemonModifierType.selectFilter); } else { this.scene.addModifier(types[cursor].newModifier()).then(() => super.end()); this.scene.ui.clearText(); this.scene.ui.setMode(Mode.MESSAGE); } - }); + }; + this.scene.ui.setMode(Mode.MODIFIER_SELECT, types, modifierSelectCallback); } } diff --git a/src/battle-scene.ts b/src/battle-scene.ts index b57607aae..e4cd58a7b 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1,16 +1,17 @@ import Phaser from 'phaser'; import { Biome, BiomeArena } from './biome'; import UI from './ui/ui'; -import { BattlePhase, EncounterPhase, SummonPhase, CommandPhase, NextEncounterPhase, SwitchBiomePhase, NewBiomeEncounterPhase, LearnMovePhase } from './battle-phase'; +import { BattlePhase, EncounterPhase, SummonPhase, CommandPhase, NextEncounterPhase, SwitchBiomePhase, NewBiomeEncounterPhase } from './battle-phase'; import { PlayerPokemon, EnemyPokemon } from './pokemon'; import PokemonSpecies, { allSpecies, getPokemonSpecies } from './pokemon-species'; import * as Utils from './utils'; -import { Modifier, ModifierBar, ConsumablePokemonModifier, ConsumableModifier, PokemonModifier} from './modifier'; +import { Modifier, ModifierBar, ConsumablePokemonModifier, ConsumableModifier, PartyShareModifier, PokemonHpRestoreModifier, HealingBoosterModifier, PersistentModifier, PokemonBaseStatBoosterModifierType, PokemonBaseStatModifier } from './modifier'; import { PokeballType } from './pokeball'; import { Species } from './species'; import { initAutoPlay } from './auto-play'; import { Battle } from './battle'; import { populateAnims } from './battle-anims'; +import { Stat } from './pokemon-stat'; const enableAuto = true; @@ -36,7 +37,7 @@ export default class BattleScene extends Phaser.Scene { public pokeballCounts = Object.fromEntries(Utils.getEnumValues(PokeballType).filter(p => p <= PokeballType.MASTER_BALL).map(t => [ t, 0 ])); private party: PlayerPokemon[]; private modifierBar: ModifierBar; - private modifiers: Modifier[]; + private modifiers: PersistentModifier[]; public uiContainer: Phaser.GameObjects.Container; public ui: UI; @@ -301,6 +302,10 @@ export default class BattleScene extends Phaser.Scene { this.plusKey = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.PLUS); this.minusKey = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.MINUS); + for (let a = 0; a < 3; a++) { + this.addModifier(new PokemonBaseStatModifier(new PokemonBaseStatBoosterModifierType('HP-UP', Stat.HP), this.getParty()[0].id, Stat.HP)); + } + Promise.all(loadPokemonAssets).then(() => { if (enableAuto) initAutoPlay.apply(this); @@ -341,6 +346,7 @@ export default class BattleScene extends Phaser.Scene { this.unshiftPhase(new NewBiomeEncounterPhase(this)); } } else { + //this.pushPhase(new SelectStarterPhase(this)); this.pushPhase(new EncounterPhase(this)); this.pushPhase(new SummonPhase(this)); } @@ -443,43 +449,71 @@ export default class BattleScene extends Phaser.Scene { this.phaseQueue.push(new CommandPhase(this)); } - addModifier(modifier: Modifier): Promise { + addModifier(modifier: Modifier, virtual?: boolean): Promise { return new Promise(resolve => { - if (modifier.add(this.modifierBar, this.modifiers)) + if (modifier instanceof PersistentModifier) { + if ((modifier as PersistentModifier).add(this.modifiers, !!virtual) && !virtual) + this.sound.play('restore'); + + if (!virtual) + this.updateModifiers().then(() => resolve()); + } else if (modifier instanceof ConsumableModifier) { this.sound.play('restore'); - if (modifier instanceof ConsumableModifier) { - const args = [ this ]; - if (modifier.shouldApply(args)) - modifier.apply(args); - resolve(); - return; - } + if (modifier instanceof ConsumablePokemonModifier) { + for (let p in this.party) { + const pokemon = this.party[p]; - let pokemonToUpdate = 0; - - if (modifier instanceof PokemonModifier) { - for (let p in this.party) { - const pokemon = this.party[p]; - - if (modifier instanceof ConsumablePokemonModifier) { - const args = [ pokemon ]; + const args: any[] = [ pokemon ]; + if (modifier instanceof PokemonHpRestoreModifier) { + const hpRestoreMultiplier = new Utils.IntegerHolder(1); + this.applyModifiers(HealingBoosterModifier, hpRestoreMultiplier); + args.push(hpRestoreMultiplier.value); + } if (modifier.shouldApply(args)) modifier.apply(args); } - - pokemonToUpdate++; - - pokemon.calculateStats(); - pokemon.updateInfo(() => { - if (!(--pokemonToUpdate)) - resolve(); - }); + + Promise.allSettled(this.party.map(p => p.updateInfo())).then(() => resolve()); + } else { + const args = [ this ]; + if (modifier.shouldApply(args)) + modifier.apply(args); + + resolve(); } } + }); + } - if (!pokemonToUpdate) + updatePartyForModifiers(): Promise { + return new Promise(resolve => { + Promise.allSettled(this.party.map(p => { + p.calculateStats(); + return p.updateInfo(); + })).then(() => resolve()); + }); + } + + updateModifiers(): Promise { + return new Promise(resolve => { + for (let modifier of this.modifiers) { + if (modifier instanceof PersistentModifier) + (modifier as PersistentModifier).virtualStackCount = 0; + } + + this.applyModifiers(PartyShareModifier, this, this.modifiers); + + const modifiers = this.modifiers.slice(0); + for (let modifier of modifiers) { + if (!modifier.getStackCount()) + this.modifiers.splice(this.modifiers.indexOf(modifier), 1); + } + + this.updatePartyForModifiers().then(() => { + this.modifierBar.updateModifiers(this.modifiers); resolve(); + }); }); } diff --git a/src/modifier.ts b/src/modifier.ts index ed2e7e2ec..69e0d5830 100644 --- a/src/modifier.ts +++ b/src/modifier.ts @@ -18,19 +18,13 @@ export class ModifierBar extends Phaser.GameObjects.Container { this.setScale(0.5); } - addModifier(modifier: Modifier) { - const icon = modifier.getIcon(this.scene as BattleScene); - this.add(icon); - this.setModifierIconPosition(icon); - } + updateModifiers(modifiers: PersistentModifier[]) { + this.removeAll(true); - updateModifier(modifier: Modifier, modifiers: Modifier[]) { - const index = modifiers.indexOf(modifier); - if (index > -1) { - this.getAt(index).destroy(); - const newIcon = modifier.getIcon(this.scene as BattleScene); - this.addAt(newIcon, index); - this.setModifierIconPosition(newIcon); + for (let modifier of modifiers) { + const icon = modifier.getIcon(this.scene as BattleScene); + this.add(icon); + this.setModifierIconPosition(icon); } } @@ -44,19 +38,13 @@ export class ModifierBar extends Phaser.GameObjects.Container { export abstract class Modifier { public type: ModifierType; - public stackCount: integer; constructor(type: ModifierType) { this.type = type; - this.stackCount = 1; } - add(modifierBar: ModifierBar, modifiers: Modifier[]): boolean { - modifiers.push(this); - - modifierBar.addModifier(this); - - return true; + match(_modifier: Modifier): boolean { + return false; } shouldApply(_args: any[]): boolean { @@ -64,10 +52,47 @@ export abstract class Modifier { } abstract apply(args: any[]): boolean; +} - incrementStack(): void { - if (this.stackCount < this.getMaxStackCount()) - this.stackCount++; +export abstract class PersistentModifier extends Modifier { + public stackCount: integer; + public virtualStackCount: integer; + + constructor(type: ModifierType) { + super(type); + this.stackCount = 1; + this.virtualStackCount = 0; + } + + add(modifiers: PersistentModifier[], virtual: boolean): boolean { + for (let modifier of modifiers) { + if (this.match(modifier)) { + modifier.incrementStack(virtual); + return true; + } + } + + if (virtual) { + this.virtualStackCount += this.stackCount; + this.stackCount = 0; + } + modifiers.push(this); + return true; + } + + abstract clone(): PersistentModifier; + + incrementStack(virtual: boolean): void { + if (this.getStackCount() < this.getMaxStackCount()) { + if (!virtual) + this.stackCount++; + else + this.virtualStackCount++; + } + } + + getStackCount(): integer { + return this.stackCount + this.virtualStackCount; } getMaxStackCount(): integer { @@ -86,16 +111,34 @@ export abstract class Modifier { if (stackText) container.add(stackText); + const virtualStackText = this.getIconStackText(scene, true); + if (virtualStackText) + container.add(virtualStackText); + return container; } - getIconStackText(scene: BattleScene): Phaser.GameObjects.Text { - if (this.stackCount <= 1) + getIconStackText(scene: BattleScene, virtual?: boolean): Phaser.GameObjects.Text { + if (this.getMaxStackCount() === 1 || (virtual && !this.virtualStackCount)) return null; - const text = addTextObject(scene, 16, 12, this.stackCount.toString(), TextStyle.PARTY, { fontSize: '66px', color: this.stackCount < this.getMaxStackCount() ? '#f8f8f8' : '#e64a18' }); + const isStackMax = this.getStackCount() >= this.getMaxStackCount(); + const maxColor = '#f89890'; + const maxStrokeColor = '#984038'; + + if (virtual) { + const virtualText = addTextObject(scene, 1 * 11 + 16, 12, `+${this.virtualStackCount.toString()}`, TextStyle.PARTY, { fontSize: '66px', color: !isStackMax ? '#40c8f8' : maxColor }); + virtualText.setShadow(0, 0, null); + virtualText.setStroke(!isStackMax ? '#006090' : maxStrokeColor, 16) + virtualText.setOrigin(1, 0); + + return virtualText; + } + + const text = addTextObject(scene, 8, 12, this.stackCount.toString(), TextStyle.PARTY, { fontSize: '66px', color: !isStackMax ? '#f8f8f8' : maxColor }); + text.setShadow(0, 0, null); text.setStroke('#424242', 16) - text.setOrigin(1, 0); + text.setOrigin(0, 0); return text; } @@ -106,7 +149,7 @@ export abstract class ConsumableModifier extends Modifier { super(type); } - add(_modifierBar: ModifierBar, _modifiers: Modifier[]): boolean { + add(_modifiers: Modifier[]): boolean { return true; } @@ -134,7 +177,7 @@ class AddPokeballModifier extends ConsumableModifier { } } -export abstract class PokemonModifier extends Modifier { +export abstract class PokemonHeldItemModifier extends PersistentModifier { public pokemonId: integer; constructor(type: ModifierType, pokemonId: integer) { @@ -144,7 +187,6 @@ export abstract class PokemonModifier extends Modifier { } shouldApply(args: any[]): boolean { - console.log(args[0]); return super.shouldApply(args) && args.length && args[0] instanceof Pokemon && (this.pokemonId === -1 || (args[0] as Pokemon).id === this.pokemonId); } @@ -152,8 +194,8 @@ export abstract class PokemonModifier extends Modifier { const container = scene.add.container(0, 0); const pokemon = this.getPokemon(scene); - const pokemonIcon = scene.add.sprite(0, 8, pokemon.getIconAtlasKey()); - pokemonIcon.play(pokemon.getIconKey()).stop(); + const pokemonIcon = scene.add.sprite(0, 8, pokemon.species.getIconAtlasKey()); + pokemonIcon.play(pokemon.species.getIconKey()).stop(); pokemonIcon.setOrigin(0, 0.5); container.add(pokemonIcon); @@ -166,7 +208,7 @@ export abstract class PokemonModifier extends Modifier { } } -export class PokemonBaseStatModifier extends PokemonModifier { +export class PokemonBaseStatModifier extends PokemonHeldItemModifier { protected stat: Stat; constructor(type: PokemonBaseStatBoosterModifierType, pokemonId: integer, stat: Stat) { @@ -174,19 +216,16 @@ export class PokemonBaseStatModifier extends PokemonModifier { this.stat = stat; } - add(modifierBar: ModifierBar, modifiers: Modifier[]): boolean { - for (let modifier of modifiers) { - if (modifier instanceof PokemonBaseStatModifier) { - const pokemonStatModifier = modifier as PokemonBaseStatModifier; - if (pokemonStatModifier.pokemonId === this.pokemonId && pokemonStatModifier.stat === this.stat) { - pokemonStatModifier.incrementStack(); - modifierBar.updateModifier(pokemonStatModifier, modifiers); - return true; - } - } + match(modifier: Modifier): boolean { + if (modifier instanceof PokemonBaseStatModifier) { + const pokemonStatModifier = modifier as PokemonBaseStatModifier; + return pokemonStatModifier.pokemonId === this.pokemonId && pokemonStatModifier.stat === this.stat; } + return false; + } - return super.add(modifierBar, modifiers); + clone(): PersistentModifier { + return new PokemonBaseStatModifier(this.type as PokemonBaseStatBoosterModifierType, this.pokemonId, this.stat); } shouldApply(args: any[]): boolean { @@ -194,7 +233,7 @@ export class PokemonBaseStatModifier extends PokemonModifier { } apply(args: any[]): boolean { - args[1][this.stat] = Math.min(Math.floor(args[1][this.stat] * (1 + this.stackCount * 0.2)), 999999); + args[1][this.stat] = Math.min(Math.floor(args[1][this.stat] * (1 + this.getStackCount() * 0.2)), 999999); return true; } @@ -202,7 +241,7 @@ export class PokemonBaseStatModifier extends PokemonModifier { getIcon(scene: BattleScene): Phaser.GameObjects.Container { const container = super.getIcon(scene); - const item = scene.add.sprite(16, 16, 'items'); + const item = scene.add.sprite(16, this.virtualStackCount ? 8 : 16, 'items'); item.setScale(0.5); item.setOrigin(0, 0.5); item.setTexture('items', this.type.iconImage); @@ -212,35 +251,57 @@ export class PokemonBaseStatModifier extends PokemonModifier { if (stackText) container.add(stackText); + const virtualStackText = this.getIconStackText(scene, true); + if (virtualStackText) + container.add(virtualStackText); + return container; } } -export abstract class ConsumablePokemonModifier extends PokemonModifier { +export abstract class ConsumablePokemonModifier extends ConsumableModifier { + public pokemonId: integer; + constructor(type: ModifierType, pokemonId: integer) { - super(type, pokemonId); + super(type); + + this.pokemonId = pokemonId; } - add(_modifierBar: ModifierBar, _modifiers: Modifier[]): boolean { - return true; + shouldApply(args: any[]): boolean { + return args.length && args[0] instanceof Pokemon && (this.pokemonId === -1 || (args[0] as Pokemon).id === this.pokemonId); + } + + getPokemon(scene: BattleScene) { + return scene.getParty().find(p => p.id === this.pokemonId); } } export class PokemonHpRestoreModifier extends ConsumablePokemonModifier { - private restorePercent: integer; + private restorePoints: integer; + private percent: boolean; private fainted: boolean; - constructor(type: ModifierType, pokemonId: integer, restorePercent: integer, fainted?: boolean) { + constructor(type: ModifierType, pokemonId: integer, restorePoints: integer, percent: boolean, fainted?: boolean) { super(type, pokemonId); - this.restorePercent = restorePercent; + this.restorePoints = restorePoints; + this.percent = percent; this.fainted = !!fainted; } + shouldApply(args: any[]): boolean { + return super.shouldApply(args) && (this.fainted || (args.length > 1 && typeof(args[1]) === 'number')); + } + apply(args: any[]): boolean { const pokemon = args[0] as Pokemon; - if (!pokemon.hp === this.fainted) - pokemon.hp = Math.min(pokemon.hp + Math.max((this.restorePercent * 0.01) * pokemon.getMaxHp(), this.restorePercent), pokemon.getMaxHp()); + if (!pokemon.hp === this.fainted) { + let restorePoints = this.restorePoints; + if (!this.fainted) + restorePoints = Math.floor(restorePoints * (args[1] as number)); + pokemon.hp = Math.min(pokemon.hp + (this.percent ? (restorePoints * 0.01) * pokemon.getMaxHp() : restorePoints), pokemon.getMaxHp()); + } return true; } @@ -302,7 +363,79 @@ export class TmModifier extends ConsumablePokemonModifier { } } -export class ExpBoosterModifier extends Modifier { +export class PartyShareModifier extends PersistentModifier { + constructor(type: ModifierType) { + super(type); + } + + match(modifier: Modifier) { + return modifier instanceof PartyShareModifier; + } + + clone(): PartyShareModifier { + return new PartyShareModifier(this.type); + } + + shouldApply(args: any[]): boolean { + return super.shouldApply(args) && args.length === 2 && args[0] instanceof BattleScene && args[1] instanceof Array; + } + + apply(args: any[]): boolean { + const scene = args[0] as BattleScene; + const modifiers = args[1] as Modifier[]; + const party = scene.getParty(); + for (let modifier of modifiers) { + if (modifier instanceof PokemonHeldItemModifier) { + const heldItemModifier = modifier as PokemonHeldItemModifier; + const extraStacks = Math.floor(modifier.stackCount / Math.max(party.length - (this.getStackCount() - 1), 1)); + for (let s = 0; s < extraStacks; s++) { + for (let p of party) { + if (p.id === heldItemModifier.pokemonId) + continue; + const newHeldItemModifier = heldItemModifier.clone() as PokemonHeldItemModifier; + newHeldItemModifier.pokemonId = p.id; + scene.addModifier(newHeldItemModifier, true); + } + } + } + } + + return true; + } + + getMaxStackCount(): number { + return 6; + } +} + +export class HealingBoosterModifier extends PersistentModifier { + private multiplier: number; + + constructor(type: ModifierType, multiplier: number) { + super(type); + + this.multiplier = multiplier; + } + + match(modifier: Modifier): boolean { + return modifier instanceof HealingBoosterModifier; + } + + clone(): HealingBoosterModifier { + return new HealingBoosterModifier(this.type, this.multiplier); + } + + apply(args: any[]): boolean { + const healingMultiplier = args[0] as Utils.IntegerHolder; + for (let s = 0; s < this.getStackCount(); s++) + healingMultiplier.value *= this.multiplier; + healingMultiplier.value = Math.floor(healingMultiplier.value); + + return true; + } +} + +export class ExpBoosterModifier extends PersistentModifier { private boostMultiplier: integer; constructor(type: ModifierType, boostPercent: integer) { @@ -311,29 +444,26 @@ export class ExpBoosterModifier extends Modifier { this.boostMultiplier = boostPercent * 0.01; } - add(modifierBar: ModifierBar, modifiers: Modifier[]): boolean { - for (let modifier of modifiers) { - if (modifier instanceof ExpBoosterModifier) { - const expModifier = modifier as ExpBoosterModifier; - if (expModifier.boostMultiplier === this.boostMultiplier) { - expModifier.incrementStack(); - modifierBar.updateModifier(expModifier, modifiers); - return true; - } - } + match(modifier: Modifier): boolean { + if (modifier instanceof ExpBoosterModifier) { + const expModifier = modifier as ExpBoosterModifier; + return expModifier.boostMultiplier === this.boostMultiplier; } + return false; + } - return super.add(modifierBar, modifiers); + clone(): ExpBoosterModifier { + return new ExpBoosterModifier(this.type, this.boostMultiplier * 100); } apply(args: any[]): boolean { - (args[0] as Utils.NumberHolder).value = Math.floor((args[0] as Utils.NumberHolder).value * (1 + (this.stackCount * (this.boostMultiplier)))); + (args[0] as Utils.NumberHolder).value = Math.floor((args[0] as Utils.NumberHolder).value * (1 + (this.getStackCount() * this.boostMultiplier))); return true; } } -export class ExpShareModifier extends Modifier { +export class ExpShareModifier extends PersistentModifier { constructor(type: ModifierType) { super(type); } @@ -342,31 +472,30 @@ export class ExpShareModifier extends Modifier { return true; } + clone(): ExpShareModifier { + return new ExpShareModifier(this.type); + } + getMaxStackCount(): integer { return 5; } } -export class ShinyRateBoosterModifier extends Modifier { +export class ShinyRateBoosterModifier extends PersistentModifier { constructor(type: ModifierType) { super(type); } - add(modifierBar: ModifierBar, modifiers: Modifier[]): boolean { - for (let modifier of modifiers) { - if (modifier instanceof ShinyRateBoosterModifier) { - const shinyRateModifier = modifier as ShinyRateBoosterModifier; - shinyRateModifier.incrementStack(); - modifierBar.updateModifier(shinyRateModifier, modifiers); - return true; - } - } + match(modifier: Modifier): boolean { + return modifier instanceof ShinyRateBoosterModifier; + } - return super.add(modifierBar, modifiers); + clone(): ShinyRateBoosterModifier { + return new ShinyRateBoosterModifier(this.type); } apply(args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value = Math.pow((args[0] as Utils.IntegerHolder).value * 0.5, this.stackCount + 1); + (args[0] as Utils.IntegerHolder).value = Math.pow((args[0] as Utils.IntegerHolder).value * 0.5, this.getStackCount() + 1); return true; } @@ -376,13 +505,17 @@ export class ShinyRateBoosterModifier extends Modifier { } } -export class ExtraModifierModifier extends Modifier { +export class ExtraModifierModifier extends PersistentModifier { constructor(type: ModifierType) { super(type); } + clone(): ExtraModifierModifier { + return new ExtraModifierModifier(this.type); + } + apply(args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value += this.stackCount; + (args[0] as Utils.IntegerHolder).value += this.getStackCount(); return true; } @@ -436,24 +569,26 @@ export abstract class PokemonModifierType extends ModifierType { } export class PokemonHpRestoreModifierType extends PokemonModifierType { - protected restorePercent: integer; + protected restorePoints: integer; + protected percent: boolean; - constructor(name: string, restorePercent: integer, newModifierFunc?: Function, selectFilter?: Function, iconImage?: string) { - super(name, `Restore ${restorePercent} HP or ${restorePercent}% HP for one POKéMON, whichever is higher`, - newModifierFunc || ((_type, args) => new PokemonHpRestoreModifier(this, (args[0] as PlayerPokemon).id, this.restorePercent, false)), + constructor(name: string, restorePoints: integer, percent?: boolean, newModifierFunc?: Function, selectFilter?: Function, iconImage?: string) { + super(name, `Restore ${restorePoints}${percent ? '%' : ''} HP for one POKéMON`, + newModifierFunc || ((_type, args) => new PokemonHpRestoreModifier(this, (args[0] as PlayerPokemon).id, this.restorePoints, this.percent, false)), selectFilter || ((pokemon: PlayerPokemon) => { if (!pokemon.hp || pokemon.hp >= pokemon.getMaxHp()) return PartyUiHandler.NoEffectMessage; return null; }), iconImage); - this.restorePercent = restorePercent; + this.restorePoints = restorePoints; + this.percent = !!percent; } } export class PokemonReviveModifierType extends PokemonHpRestoreModifierType { constructor(name: string, restorePercent: integer, iconImage?: string) { - super(name, restorePercent, (_type, args) => new PokemonHpRestoreModifier(this, (args[0] as PlayerPokemon).id, this.restorePercent, true), + super(name, restorePercent, true, (_type, args) => new PokemonHpRestoreModifier(this, (args[0] as PlayerPokemon).id, this.restorePoints, true, true), ((pokemon: PlayerPokemon) => { if (pokemon.hp) return PartyUiHandler.NoEffectMessage; @@ -583,7 +718,7 @@ const modifierPool = { const faintedPartyMemberCount = party.filter(p => !p.hp).length; return faintedPartyMemberCount; }), - new WeightedModifierType(new PokemonHpRestoreModifierType('HYPER POTION', 80), (party: PlayerPokemon[]) => { + new WeightedModifierType(new PokemonHpRestoreModifierType('HYPER POTION', 200), (party: PlayerPokemon[]) => { const thresholdPartyMemberCount = party.filter(p => p.getHpRatio() <= 0.6).length; return thresholdPartyMemberCount; }), @@ -610,6 +745,9 @@ const modifierPool = { new WeightedModifierType(new AllPokemonFullReviveModifierType('SACRED ASH'), (party: PlayerPokemon[]) => { return party.filter(p => !p.hp).length >= Math.ceil(party.length / 2) ? 1 : 0; }), + new ModifierType('OVAL CHARM', 'For every X (no. of party members) items in a POKéMON\'s held item stack, give one to each other party member', + (type, _args) => new PartyShareModifier(type), 'oval_charm'), + new ModifierType('HEALING CHARM', 'Doubles the effectiveness of HP restoring items (excludes revives)', (type, _args) => new HealingBoosterModifier(type, 2), 'healing_charm'), new ExpBoosterModifierType('LUCKY EGG', 25), new ModifierType('EXP. SHARE', 'All POKéMON in your party gain an additional 10% of a battle\'s EXP. Points', (type, _args) => new ExpShareModifier(type), 'exp_share') ].map(m => { m.setTier(ModifierTier.ULTRA); return m; }), diff --git a/src/pokemon-species.ts b/src/pokemon-species.ts index 35f62b9d2..eb83395ac 100644 --- a/src/pokemon-species.ts +++ b/src/pokemon-species.ts @@ -1,3 +1,4 @@ +import BattleScene from './battle-scene'; import { GrowthRate } from './exp'; import { pokemonEvolutions } from './pokemon-evolutions'; import { Species } from './species'; @@ -160,7 +161,6 @@ export default class PokemonSpecies { const subPrevolutionLevels = getPokemonSpecies(speciesId).getPrevolutionLevels(); for (let spl of subPrevolutionLevels) prevolutionLevels.push(spl); - console.log(Species[speciesId]) } } } @@ -168,6 +168,72 @@ export default class PokemonSpecies { return prevolutionLevels; } + + getIconAtlasKey(): string { + return `pokemon_icons_${this.generation}`; + } + + getIconId(): string { + let ret = `${Utils.padInt(this.speciesId, 3)}`; + + switch (this.speciesId) { + case Species.UNOWN: + ret += 'a'; + break; + case Species.BURMY: + case Species.WORMADAM: + ret += 'plant'; + break; + case Species.SHELLOS: + case Species.GASTRODON: + ret += 'east'; + break; + case Species.GIRATINA: + ret += 'altered'; + break; + case Species.SHAYMIN: + ret += 'land'; + break; + case Species.BASCULIN: + ret += 'redstriped'; + break; + case Species.DEERLING: + case Species.SAWSBUCK: + ret += 'spring'; + break; + case Species.FRILLISH: + case Species.JELLICENT: + ret += 'm'; + break; + case Species.TORNADUS: + case Species.THUNDURUS: + case Species.LANDORUS: + ret += 'incarnate'; + break; + case Species.KELDEO: + ret += 'ordinary'; + break; + case Species.MELOETTA: + ret += 'aria'; + break; + } + + return ret; + } + + getIconKey(): string { + return `pkmn_icon__${this.getIconId()}`; + } + + generateIconAnim(scene: BattleScene): void { + const frameNames = scene.anims.generateFrameNames(this.getIconAtlasKey(), { prefix: `${this.getIconId()}_`, zeroPad: 2, suffix: '.png', start: 1, end: 34 }); + scene.anims.create({ + key: this.getIconKey(), + frames: frameNames, + frameRate: 128, + repeat: -1 + }); + } } class PokemonForm extends PokemonSpecies { @@ -718,7 +784,7 @@ export const allSpecies = [ ] ], [ Species.ARCEUS, "Arceus", 4, 0, 0, 1, "Alpha Pokémon", Type.NORMAL, -1, 3.2, 320, "Multitype", null, null, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ], - [ Species.VICTINI, "Victini", 5, 0, 0, 1, "Victory Pokémon", Type.PSYCHIC, Type.FIRE, 0.4, 4, "Victory Star", null, null, 600, 100, 100, 100, 100, 100, 100, 3, 100, 270, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ], + [ Species.VICTINI, "Victini", 4, 0, 0, 1, "Victory Pokémon", Type.PSYCHIC, Type.FIRE, 0.4, 4, "Victory Star", null, null, 600, 100, 100, 100, 100, 100, 100, 3, 100, 270, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ], [ Species.SNIVY, "Snivy", 5, 0, 0, 0, "Grass Snake Pokémon", Type.GRASS, -1, 0.6, 8.1, "Overgrow", null, "Contrary", 308, 45, 45, 55, 45, 55, 63, 45, 70, 62, GrowthRate.MEDIUM_SLOW, "Field", "Grass", 87.5, 20, 0 ], [ Species.SERVINE, "Servine", 5, 0, 0, 0, "Grass Snake Pokémon", Type.GRASS, -1, 0.8, 16, "Overgrow", null, "Contrary", 413, 60, 60, 75, 60, 75, 83, 45, 70, 145, GrowthRate.MEDIUM_SLOW, "Field", "Grass", 87.5, 20, 0 ], [ Species.SERPERIOR, "Serperior", 5, 0, 0, 0, "Regal Pokémon", Type.GRASS, -1, 3.3, 63, "Overgrow", null, "Contrary", 528, 75, 75, 95, 75, 95, 113, 45, 70, 238, GrowthRate.MEDIUM_SLOW, "Field", "Grass", 87.5, 20, 0 ], diff --git a/src/pokemon.ts b/src/pokemon.ts index 6e5c02982..81fbacffd 100644 --- a/src/pokemon.ts +++ b/src/pokemon.ts @@ -220,12 +220,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return `pkmn__${this.getBattleSpriteId()}`; } - getIconAtlasKey(): string { - return `pokemon_icons_${this.species.generation}`; - } - getIconId(): string { - return `${Utils.padInt(this.species.speciesId, 3)}`; + // TODO: Add form special cases + return this.species.getIconId(); } getIconKey(): string { @@ -355,8 +352,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } - updateInfo(callback?: Function) { - this.battleInfo.updateInfo(this, callback); + updateInfo(): Promise { + return this.battleInfo.updateInfo(this); } addExp(exp: integer) { @@ -434,7 +431,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { callback: () => { this.getSprite().setVisible(flashTimer.repeatCount % 2 === 0); if (!flashTimer.repeatCount) { - this.battleInfo.updateInfo(this, () => { + this.battleInfo.updateInfo(this).then(() => { if (callback) callback(); }); @@ -442,7 +439,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } }); } else { - this.battleInfo.updateInfo(this, () => { + this.battleInfo.updateInfo(this).then(() => { if (callback) callback(); }); @@ -579,7 +576,7 @@ export class PlayerPokemon extends Pokemon { constructor(scene: BattleScene, species: PokemonSpecies, level: integer, dataSource?: Pokemon) { super(scene, 106, 148, species, level, dataSource); - this.generateIconAnim(); + this.species.generateIconAnim(scene); this.generateCompatibleTms(); } @@ -587,16 +584,6 @@ export class PlayerPokemon extends Pokemon { return true; } - generateIconAnim(): void { - const frameNames = this.scene.anims.generateFrameNames(this.getIconAtlasKey(), { prefix: `${this.getIconId()}_`, zeroPad: 2, suffix: '.png', start: 1, end: 34 }); - this.scene.anims.create({ - key: this.getIconKey(), - frames: frameNames, - frameRate: 128, - repeat: -1 - }); - } - generateCompatibleTms(): void { this.compatibleTms = []; diff --git a/src/ui/modifier-select-ui-handler.ts b/src/ui/modifier-select-ui-handler.ts index e94565669..13b324b29 100644 --- a/src/ui/modifier-select-ui-handler.ts +++ b/src/ui/modifier-select-ui-handler.ts @@ -33,7 +33,15 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { } show(args: any[]) { - if (this.active || args.length !== 2 || !(args[0] instanceof Array) || !args[0].length || !(args[1] instanceof Function)) + if (this.active) { + if (args.length === 2) { + this.awaitingActionInput = true; + this.onActionInput = args[1]; + } + return; + } + + if (args.length !== 2 || !(args[0] instanceof Array) || !args[0].length || !(args[1] instanceof Function)) return; super.show(args); @@ -92,6 +100,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { success = true; if (this.onActionInput) { const originalOnActionInput = this.onActionInput; + this.awaitingActionInput = false; this.onActionInput = null; originalOnActionInput(this.cursor); } @@ -99,6 +108,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { success = true; if (this.onActionInput) { const originalOnActionInput = this.onActionInput; + this.awaitingActionInput = false; this.onActionInput = null; originalOnActionInput(-1); } diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 512552e52..7e9d358e9 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -158,6 +158,8 @@ export default class PartyUiHandler extends MessageUiHandler { selectCallback(this.cursor); } else if (this.cursor) (this.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.POKEMON, this.cursor); + if (this.partyUiMode !== PartyUiMode.MODIFIER) + ui.playSelect(); return; } else { this.clearOptions(); @@ -396,9 +398,9 @@ class PartySlot extends Phaser.GameObjects.Container { this.add(slotPb); - const pokemonIcon = this.scene.add.sprite(slotPb.x, slotPb.y, this.pokemon.getIconAtlasKey()); + const pokemonIcon = this.scene.add.sprite(slotPb.x, slotPb.y, this.pokemon.species.getIconAtlasKey()); console.log(pokemonIcon) - pokemonIcon.play(this.pokemon.getIconKey()); + pokemonIcon.play(this.pokemon.species.getIconKey()); this.slotPokemonIcon = pokemonIcon; this.add(pokemonIcon); diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts new file mode 100644 index 000000000..6021c0989 --- /dev/null +++ b/src/ui/starter-select-ui-handler.ts @@ -0,0 +1,75 @@ +import BattleScene from "../battle-scene"; +import { allSpecies } from "../pokemon-species"; +import { Mode } from "./ui"; +import UiHandler from "./uiHandler"; + +export default class StarterSelectUiHandler extends UiHandler { + private starterSelectContainer: Phaser.GameObjects.Container; + + constructor(scene: BattleScene) { + super(scene, Mode.STARTER_SELECT); + } + + setup() { + const ui = this.getUi(); + + this.starterSelectContainer = this.scene.add.container(0, -this.scene.game.canvas.height / 6); + this.starterSelectContainer.setVisible(false); + ui.add(this.starterSelectContainer); + + let s = 0; + + for (let species of allSpecies) { + if (species.getSpeciesForLevel(1) !== species.speciesId || species.generation >= 6) + continue; + species.generateIconAnim(this.scene); + const x = (s % 24) * 13; + const y = Math.floor(s / 24) * 13; + const icon = this.scene.add.sprite(x, y, species.getIconAtlasKey()); + icon.setScale(0.5); + icon.setOrigin(0, 0); + icon.play(species.getIconKey()).stop(); + this.starterSelectContainer.add(icon); + s++; + } + } + + show(args: any[]) { + super.show(args); + + this.starterSelectContainer.setVisible(true); + this.setCursor(0); + } + + processInput(keyCode: integer) { + const ui = this.getUi(); + const keyCodes = Phaser.Input.Keyboard.KeyCodes; + + let success = false; + + if (keyCode === keyCodes.Z) { + } else if (keyCode === keyCodes.X) { + } else { + } + + if (success) + ui.playSelect(); + } + + setCursor(cursor: integer): boolean { + let changed: boolean = this.cursor !== cursor; + + if (changed) { + const forward = this.cursor < cursor; + this.cursor = cursor; + } + + return changed; + } + + clear() { + super.clear(); + this.cursor = -1; + this.starterSelectContainer.setVisible(false); + } + } \ No newline at end of file diff --git a/src/ui/ui.ts b/src/ui/ui.ts index ccf51b0eb..1e48f4328 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -9,6 +9,7 @@ import ConfirmUiHandler from './confirm-ui-handler'; import ModifierSelectUiHandler from './modifier-select-ui-handler'; import BallUiHandler from './ball-ui-handler'; import SummaryUiHandler from './summary-ui-handler'; +import StarterSelectUiHandler from './starter-select-ui-handler'; export enum Mode { MESSAGE = 0, @@ -18,12 +19,14 @@ export enum Mode { CONFIRM, MODIFIER_SELECT, PARTY, - SUMMARY + SUMMARY, + STARTER_SELECT, }; const transitionModes = [ Mode.PARTY, - Mode.SUMMARY + Mode.SUMMARY, + Mode.STARTER_SELECT, ]; export default class UI extends Phaser.GameObjects.Container { @@ -45,7 +48,8 @@ export default class UI extends Phaser.GameObjects.Container { new ConfirmUiHandler(scene), new ModifierSelectUiHandler(scene), new PartyUiHandler(scene), - new SummaryUiHandler(scene) + new SummaryUiHandler(scene), + new StarterSelectUiHandler(scene) ]; }