From b11e391e7a7f6c2e1ba96d2f2399578685e54e35 Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Fri, 14 Apr 2023 18:21:33 -0400 Subject: [PATCH] Add evolution items and new modifiers --- public/images/items.json | 2608 ++++++++++++++---------- public/images/items.png | Bin 28846 -> 34585 bytes public/images/items/black_belt.png | Bin 0 -> 258 bytes public/images/items/charcoal.png | Bin 0 -> 253 bytes public/images/items/clefairy_doll.png | Bin 0 -> 329 bytes public/images/items/dragon_fang.png | Bin 0 -> 289 bytes public/images/items/hard_stone.png | Bin 0 -> 269 bytes public/images/items/linking_cord.png | Bin 0 -> 571 bytes public/images/items/magnet.png | Bin 0 -> 272 bytes public/images/items/metronome.png | Bin 0 -> 252 bytes public/images/items/miracle_seed.png | Bin 0 -> 227 bytes public/images/items/muscle_band.png | Bin 0 -> 347 bytes public/images/items/mystic_water.png | Bin 0 -> 238 bytes public/images/items/never_melt_ice.png | Bin 0 -> 274 bytes public/images/items/poison_barb.png | Bin 0 -> 200 bytes public/images/items/sharp_beak.png | Bin 0 -> 261 bytes public/images/items/silk_scarf.png | Bin 0 -> 308 bytes public/images/items/silver_powder.png | Bin 0 -> 242 bytes public/images/items/soft_sand.png | Bin 0 -> 287 bytes public/images/items/spell_tag.png | Bin 0 -> 242 bytes public/images/items/twisted_spoon.png | Bin 0 -> 222 bytes public/images/items/wise_glasses.png | Bin 0 -> 222 bytes src/battle-scene.ts | 8 +- src/biome.ts | 16 + src/main.ts | 2 +- src/modifier-type.ts | 224 +- src/modifier.ts | 65 +- src/pokemon-evolutions.ts | 200 +- src/pokemon.ts | 60 +- src/ui/command-ui-handler.ts | 2 +- src/ui/fight-ui-handler.ts | 6 +- src/ui/party-ui-handler.ts | 4 +- 32 files changed, 1949 insertions(+), 1246 deletions(-) create mode 100644 public/images/items/black_belt.png create mode 100644 public/images/items/charcoal.png create mode 100644 public/images/items/clefairy_doll.png create mode 100644 public/images/items/dragon_fang.png create mode 100644 public/images/items/hard_stone.png create mode 100644 public/images/items/linking_cord.png create mode 100644 public/images/items/magnet.png create mode 100644 public/images/items/metronome.png create mode 100644 public/images/items/miracle_seed.png create mode 100644 public/images/items/muscle_band.png create mode 100644 public/images/items/mystic_water.png create mode 100644 public/images/items/never_melt_ice.png create mode 100644 public/images/items/poison_barb.png create mode 100644 public/images/items/sharp_beak.png create mode 100644 public/images/items/silk_scarf.png create mode 100644 public/images/items/silver_powder.png create mode 100644 public/images/items/soft_sand.png create mode 100644 public/images/items/spell_tag.png create mode 100644 public/images/items/twisted_spoon.png create mode 100644 public/images/items/wise_glasses.png diff --git a/public/images/items.json b/public/images/items.json index 70d7ce02d..7b11c1d77 100644 --- a/public/images/items.json +++ b/public/images/items.json @@ -4,11 +4,32 @@ "image": "items.png", "format": "RGBA8888", "size": { - "w": 200, - "h": 206 + "w": 229, + "h": 229 }, "scale": 1, "frames": [ + { + "filename": "linking_cord", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 27, + "h": 26 + }, + "frame": { + "x": 0, + "y": 0, + "w": 27, + "h": 26 + } + }, { "filename": "choice_scarf", "rotated": false, @@ -24,7 +45,49 @@ "h": 24 }, "frame": { - "x": 0, + "x": 27, + "y": 0, + "w": 24, + "h": 24 + } + }, + { + "filename": "muscle_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 51, + "y": 0, + "w": 24, + "h": 24 + } + }, + { + "filename": "silk_scarf", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 75, "y": 0, "w": 24, "h": 24 @@ -45,14 +108,14 @@ "h": 24 }, "frame": { - "x": 0, - "y": 24, + "x": 99, + "y": 0, "w": 24, "h": 24 } }, { - "filename": "big_root", + "filename": "clefairy_doll", "rotated": false, "trimmed": true, "sourceSize": { @@ -61,15 +124,15 @@ }, "spriteSourceSize": { "x": 4, - "y": 4, - "w": 23, - "h": 24 + "y": 5, + "w": 24, + "h": 23 }, "frame": { - "x": 24, + "x": 123, "y": 0, - "w": 23, - "h": 24 + "w": 24, + "h": 23 } }, { @@ -87,33 +150,12 @@ "h": 23 }, "frame": { - "x": 0, - "y": 48, + "x": 147, + "y": 0, "w": 24, "h": 23 } }, - { - "filename": "kings_rock", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 24, - "y": 24, - "w": 23, - "h": 24 - } - }, { "filename": "scope-lens", "rotated": false, @@ -129,14 +171,14 @@ "h": 23 }, "frame": { - "x": 47, + "x": 171, "y": 0, "w": 24, "h": 23 } }, { - "filename": "exp_share", + "filename": "twisted_spoon", "rotated": false, "trimmed": true, "sourceSize": { @@ -147,17 +189,38 @@ "x": 4, "y": 5, "w": 24, - "h": 22 + "h": 23 }, "frame": { - "x": 0, - "y": 71, + "x": 195, + "y": 0, "w": 24, - "h": 22 + "h": 23 } }, { - "filename": "max_revive", + "filename": "big_root", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 123, + "y": 23, + "w": 23, + "h": 24 + } + }, + { + "filename": "kings_rock", "rotated": false, "trimmed": true, "sourceSize": { @@ -167,13 +230,13 @@ "spriteSourceSize": { "x": 5, "y": 4, - "w": 22, + "w": 23, "h": 24 }, "frame": { - "x": 24, - "y": 48, - "w": 22, + "x": 146, + "y": 23, + "w": 23, "h": 24 } }, @@ -192,12 +255,159 @@ "h": 23 }, "frame": { - "x": 47, + "x": 169, "y": 23, "w": 23, "h": 23 } }, + { + "filename": "exp_share", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 22 + }, + "frame": { + "x": 192, + "y": 23, + "w": 24, + "h": 22 + } + }, + { + "filename": "revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 12, + "h": 17 + }, + "frame": { + "x": 216, + "y": 23, + "w": 12, + "h": 17 + } + }, + { + "filename": "max_revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 192, + "y": 45, + "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": 214, + "y": 45, + "w": 15, + "h": 23 + } + }, + { + "filename": "prism_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 214, + "y": 68, + "w": 15, + "h": 15 + } + }, + { + "filename": "healing_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 23, + "h": 22 + }, + "frame": { + "x": 169, + "y": 46, + "w": 23, + "h": 22 + } + }, + { + "filename": "black_belt", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 27, + "y": 24, + "w": 22, + "h": 23 + } + }, { "filename": "fire_stone", "rotated": false, @@ -213,8 +423,8 @@ "h": 23 }, "frame": { - "x": 71, - "y": 0, + "x": 0, + "y": 26, "w": 22, "h": 23 } @@ -234,14 +444,14 @@ "h": 23 }, "frame": { - "x": 0, - "y": 93, + "x": 49, + "y": 24, "w": 22, "h": 23 } }, { - "filename": "healing_charm", + "filename": "never_melt_ice", "rotated": false, "trimmed": true, "sourceSize": { @@ -251,35 +461,14 @@ "spriteSourceSize": { "x": 5, "y": 5, - "w": 23, - "h": 22 + "w": 22, + "h": 23 }, "frame": { - "x": 70, - "y": 23, - "w": 23, - "h": 22 - } - }, - { - "filename": "oval_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 93, - "y": 0, - "w": 21, - "h": 24 + "x": 71, + "y": 24, + "w": 22, + "h": 23 } }, { @@ -297,12 +486,33 @@ "h": 23 }, "frame": { - "x": 0, - "y": 116, + "x": 93, + "y": 24, "w": 22, "h": 23 } }, + { + "filename": "oval_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 22, + "y": 47, + "w": 21, + "h": 24 + } + }, { "filename": "shiny_charm", "rotated": false, @@ -318,12 +528,33 @@ "h": 24 }, "frame": { - "x": 114, - "y": 0, + "x": 0, + "y": 49, "w": 21, "h": 24 } }, + { + "filename": "charcoal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 43, + "y": 47, + "w": 22, + "h": 22 + } + }, { "filename": "electirizer", "rotated": false, @@ -339,8 +570,8 @@ "h": 22 }, "frame": { - "x": 0, - "y": 139, + "x": 65, + "y": 47, "w": 22, "h": 22 } @@ -360,8 +591,407 @@ "h": 22 }, "frame": { - "x": 135, - "y": 0, + "x": 87, + "y": 47, + "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": 109, + "y": 47, + "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": 131, + "y": 47, + "w": 22, + "h": 22 + } + }, + { + "filename": "calcium", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 153, + "y": 47, + "w": 16, + "h": 24 + } + }, + { + "filename": "thunder_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 169, + "y": 68, + "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": 191, + "y": 69, + "w": 22, + "h": 22 + } + }, + { + "filename": "carbos", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 213, + "y": 83, + "w": 16, + "h": 24 + } + }, + { + "filename": "tm_dark", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 43, + "y": 69, + "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": 21, + "y": 71, + "w": 22, + "h": 22 + } + }, + { + "filename": "dragon_fang", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 0, + "y": 73, + "w": 21, + "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": 65, + "y": 69, + "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": 87, + "y": 69, + "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": 109, + "y": 69, + "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": 131, + "y": 69, + "w": 22, + "h": 22 + } + }, + { + "filename": "hp_up", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 153, + "y": 71, + "w": 16, + "h": 24 + } + }, + { + "filename": "tm_flying", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 169, + "y": 90, + "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": 191, + "y": 91, + "w": 22, + "h": 22 + } + }, + { + "filename": "iron", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 213, + "y": 107, + "w": 16, + "h": 24 + } + }, + { + "filename": "tm_grass", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 43, + "y": 91, + "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": 21, + "y": 93, "w": 22, "h": 22 } @@ -382,599 +1012,11 @@ }, "frame": { "x": 0, - "y": 161, + "y": 96, "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": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 44, - "y": 113, - "w": 16, - "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": 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": 22, - "h": 22 - }, - "frame": { - "x": 44, - "y": 177, - "w": 22, - "h": 22 - } - }, - { - "filename": "black_glasses", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 47, - "y": 46, - "w": 23, - "h": 17 - } - }, - { - "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": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 24, - "h": 18 - }, - "frame": { - "x": 70, - "y": 45, - "w": 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, @@ -990,33 +1032,12 @@ "h": 22 }, "frame": { - "x": 82, - "y": 107, + "x": 65, + "y": 91, "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, @@ -1032,8 +1053,8 @@ "h": 22 }, "frame": { - "x": 112, - "y": 64, + "x": 87, + "y": 91, "w": 22, "h": 22 } @@ -1053,33 +1074,12 @@ "h": 22 }, "frame": { - "x": 112, - "y": 86, + "x": 109, + "y": 91, "w": 22, "h": 22 } }, - { - "filename": "elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 140, - "y": 44, - "w": 18, - "h": 24 - } - }, { "filename": "tm_psychic", "rotated": false, @@ -1095,14 +1095,14 @@ "h": 22 }, "frame": { - "x": 158, - "y": 43, + "x": 131, + "y": 91, "w": 22, "h": 22 } }, { - "filename": "gb", + "filename": "pp_max", "rotated": false, "trimmed": true, "sourceSize": { @@ -1110,37 +1110,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 + "x": 8, + "y": 4, + "w": 16, + "h": 24 }, "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 + "x": 153, + "y": 95, + "w": 16, + "h": 24 } }, { @@ -1158,33 +1137,12 @@ "h": 22 }, "frame": { - "x": 158, - "y": 65, + "x": 169, + "y": 112, "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, @@ -1200,12 +1158,33 @@ "h": 22 }, "frame": { - "x": 134, - "y": 68, + "x": 191, + "y": 113, "w": 22, "h": 22 } }, + { + "filename": "pp_up", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 213, + "y": 131, + "w": 16, + "h": 24 + } + }, { "filename": "tm_water", "rotated": false, @@ -1221,8 +1200,8 @@ "h": 22 }, "frame": { - "x": 134, - "y": 90, + "x": 43, + "y": 113, "w": 22, "h": 22 } @@ -1242,14 +1221,224 @@ "h": 22 }, "frame": { - "x": 156, - "y": 87, + "x": 21, + "y": 115, "w": 22, "h": 22 } }, { - "filename": "upgrade", + "filename": "sharp_beak", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 0, + "y": 119, + "w": 21, + "h": 23 + } + }, + { + "filename": "moon_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 65, + "y": 113, + "w": 23, + "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": 88, + "y": 113, + "w": 24, + "h": 20 + } + }, + { + "filename": "soft_sand", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 112, + "y": 113, + "w": 24, + "h": 20 + } + }, + { + "filename": "hyper_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 136, + "y": 113, + "w": 17, + "h": 23 + } + }, + { + "filename": "protein", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 153, + "y": 119, + "w": 16, + "h": 24 + } + }, + { + "filename": "deep_sea_tooth", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 169, + "y": 134, + "w": 22, + "h": 21 + } + }, + { + "filename": "mystic_water", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 20, + "h": 23 + }, + "frame": { + "x": 191, + "y": 135, + "w": 20, + "h": 23 + } + }, + { + "filename": "elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 211, + "y": 155, + "w": 18, + "h": 24 + } + }, + { + "filename": "binding_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 23, + "h": 20 + }, + "frame": { + "x": 88, + "y": 133, + "w": 23, + "h": 20 + } + }, + { + "filename": "shell_bell", "rotated": false, "trimmed": true, "sourceSize": { @@ -1259,14 +1448,140 @@ "spriteSourceSize": { "x": 5, "y": 7, - "w": 22, - "h": 19 + "w": 23, + "h": 20 }, "frame": { - "x": 178, - "y": 102, + "x": 65, + "y": 134, + "w": 23, + "h": 20 + } + }, + { + "filename": "dusk_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 43, + "y": 135, + "w": 21, + "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": 21, + "y": 137, + "w": 21, + "h": 21 + } + }, + { + "filename": "shiny_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 0, + "y": 142, + "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": 111, + "y": 133, + "w": 21, + "h": 21 + } + }, + { + "filename": "deep_sea_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, "w": 22, - "h": 19 + "h": 20 + }, + "frame": { + "x": 88, + "y": 153, + "w": 22, + "h": 20 + } + }, + { + "filename": "choice_specs", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 24, + "h": 18 + }, + "frame": { + "x": 64, + "y": 154, + "w": 24, + "h": 18 } }, { @@ -1284,8 +1599,8 @@ "h": 24 }, "frame": { - "x": 66, - "y": 129, + "x": 42, + "y": 156, "w": 18, "h": 24 } @@ -1305,8 +1620,8 @@ "h": 24 }, "frame": { - "x": 84, - "y": 129, + "x": 21, + "y": 158, "w": 18, "h": 24 } @@ -1326,14 +1641,14 @@ "h": 24 }, "frame": { - "x": 68, - "y": 153, + "x": 0, + "y": 163, "w": 18, "h": 24 } }, { - "filename": "metal_coat", + "filename": "dragon_scale", "rotated": false, "trimmed": true, "sourceSize": { @@ -1341,121 +1656,16 @@ "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, + "x": 4, "y": 8, - "w": 20, - "h": 17 + "w": 24, + "h": 18 }, "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 + "x": 60, + "y": 172, + "w": 24, + "h": 18 } }, { @@ -1473,33 +1683,12 @@ "h": 24 }, "frame": { - "x": 159, - "y": 109, + "x": 39, + "y": 180, "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, @@ -1515,75 +1704,12 @@ "h": 24 }, "frame": { - "x": 159, - "y": 133, + "x": 18, + "y": 182, "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, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 102, - "y": 129, - "w": 16, - "h": 24 - } - }, - { - "filename": "iron", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 102, - "y": 153, - "w": 16, - "h": 24 - } - }, { "filename": "potion", "rotated": false, @@ -1599,14 +1725,14 @@ "h": 23 }, "frame": { - "x": 102, - "y": 177, + "x": 0, + "y": 187, "w": 17, "h": 23 } }, { - "filename": "pp_max", + "filename": "dawn_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -1614,58 +1740,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 + "x": 6, + "y": 6, + "w": 20, + "h": 21 }, "frame": { - "x": 118, - "y": 129, - "w": 16, - "h": 24 - } - }, - { - "filename": "pp_up", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 118, - "y": 153, - "w": 16, - "h": 24 - } - }, - { - "filename": "protein", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 119, - "y": 177, - "w": 16, - "h": 24 + "x": 132, + "y": 136, + "w": 20, + "h": 21 } }, { @@ -1683,14 +1767,56 @@ "h": 23 }, "frame": { - "x": 134, - "y": 135, + "x": 152, + "y": 143, "w": 17, "h": 23 } }, { - "filename": "oval_stone", + "filename": "dubious_disc", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 169, + "y": 155, + "w": 22, + "h": 19 + } + }, + { + "filename": "metal_coat", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 191, + "y": 158, + "w": 19, + "h": 22 + } + }, + { + "filename": "spell_tag", "rotated": false, "trimmed": true, "sourceSize": { @@ -1699,17 +1825,59 @@ }, "spriteSourceSize": { "x": 7, + "y": 6, + "w": 19, + "h": 21 + }, + "frame": { + "x": 210, + "y": 179, + "w": 19, + "h": 21 + } + }, + { + "filename": "upgrade", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, "y": 7, - "w": 18, + "w": 22, "h": 19 }, "frame": { - "x": 134, - "y": 158, - "w": 18, + "x": 110, + "y": 154, + "w": 22, "h": 19 } }, + { + "filename": "gb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 132, + "y": 157, + "w": 20, + "h": 20 + } + }, { "filename": "zinc", "rotated": false, @@ -1725,12 +1893,264 @@ "h": 24 }, "frame": { - "x": 135, - "y": 177, + "x": 152, + "y": 166, "w": 16, "h": 24 } }, + { + "filename": "magnet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 168, + "y": 174, + "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": 188, + "y": 180, + "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": 84, + "y": 173, + "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": 57, + "y": 190, + "w": 20, + "h": 20 + } + }, + { + "filename": "ub", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 36, + "y": 204, + "w": 20, + "h": 20 + } + }, + { + "filename": "hard_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 20 + }, + "frame": { + "x": 17, + "y": 206, + "w": 19, + "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": 104, + "y": 173, + "w": 23, + "h": 17 + } + }, + { + "filename": "wise_glasses", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 127, + "y": 177, + "w": 23, + "h": 17 + } + }, + { + "filename": "metronome", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 150, + "y": 190, + "w": 17, + "h": 22 + } + }, + { + "filename": "razor_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 167, + "y": 194, + "w": 20, + "h": 19 + } + }, + { + "filename": "miracle_seed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 19, + "h": 19 + }, + "frame": { + "x": 104, + "y": 190, + "w": 19, + "h": 19 + } + }, + { + "filename": "silver_powder", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 24, + "h": 15 + }, + "frame": { + "x": 123, + "y": 194, + "w": 24, + "h": 15 + } + }, { "filename": "razor_fang", "rotated": false, @@ -1746,12 +2166,33 @@ "h": 20 }, "frame": { - "x": 152, - "y": 157, + "x": 77, + "y": 193, "w": 18, "h": 20 } }, + { + "filename": "oval_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 19 + }, + "frame": { + "x": 56, + "y": 210, + "w": 18, + "h": 19 + } + }, { "filename": "golden_egg", "rotated": false, @@ -1767,8 +2208,8 @@ "h": 20 }, "frame": { - "x": 151, - "y": 177, + "x": 95, + "y": 209, "w": 17, "h": 20 } @@ -1788,14 +2229,14 @@ "h": 20 }, "frame": { - "x": 170, - "y": 160, + "x": 112, + "y": 209, "w": 17, "h": 20 } }, { - "filename": "prism_scale", + "filename": "everstone", "rotated": false, "trimmed": true, "sourceSize": { @@ -1803,36 +2244,15 @@ "h": 32 }, "spriteSourceSize": { - "x": 9, + "x": 6, "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, + "w": 20, "h": 17 }, "frame": { - "x": 187, - "y": 160, - "w": 12, + "x": 129, + "y": 209, + "w": 20, "h": 17 } } @@ -1842,6 +2262,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a1f518d9e1139553a9c9fe056f7c0328:d09d41adca58aa2c39234c6ca54e35ee:110e074689c9edd2c54833ce2e4d9270$" + "smartupdate": "$TexturePacker:SmartUpdate:ca7cdcfb7349d9ec8808e68c4d81012a:b87049b08a6be17ff53c8bfbe63513db:110e074689c9edd2c54833ce2e4d9270$" } } diff --git a/public/images/items.png b/public/images/items.png index a78812ac7e019ba0122a9a0a11ca27cfb1232d21..8c5750cd0bbe1cdaf10aa37f88a097beba693527 100644 GIT binary patch literal 34585 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�Nk8 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 Hu0mjfpx2Yg literal 28846 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 UOmi#qTL1t607*qoM6N<$f`Lh{KmY&$ diff --git a/public/images/items/black_belt.png b/public/images/items/black_belt.png new file mode 100644 index 0000000000000000000000000000000000000000..70d13097882b747c4d77d0f2d944cd571c5a972e GIT binary patch literal 258 zcmV+d0sa1oP) zK@NZ*35=YGV9PM{=<(%n&h3(~h)?5mrWGIr zu7)lF5W#KTE?EU30L#223n3^Kz>7<2#X@lbu&lcUfrT`2D|j&gwlpSA2atkzuGn(z z-cZD2&nx!KQk`jHSk1(-6TaO|#L;lV%O+?3sJP~IxjR7V!Z literal 0 HcmV?d00001 diff --git a/public/images/items/charcoal.png b/public/images/items/charcoal.png new file mode 100644 index 0000000000000000000000000000000000000000..4d2511773efd510bf6f910389484f6962493a439 GIT binary patch literal 253 zcmVkdg0002QNklZ|unseIHhKbHt`#cRCQX`Lh{lh5PY};`Yu`n?1V0mifP5_IFbhd6 zDc~e1_f65qtXSfG?}1~WIEm94!7+K<)*YuwvA`_@)Y)*X3BXggnH5JJCBZXJUVHfv zk2vkP2?}kDa7yt>0AA~;o&Df4{6zrz8EWued35%vfLuXhvK1a=z>b68g7 z(G9{d3`8?ZS7DW|!U~MQ2wkPWjKOb^D;+vcj@lTvU$JyTt%CjH+D=LtHf&g@P196a zmj*M{_4U>ISgN-s4bU9Sx3cLu-+zL?mvxgtn6Qp@8h{11X9iFRWan=HIA#C@$1i6C z!BYVcj8pFcFi1*)niF%VJ4cWfKw5`r)dK?3f>em~;QEfA(?3HmfCmu<;Nnw=mJn2D zLrk*IMI~u9Y}z{6b%(419%WTig_KM8~iTx{f{_q0i;|?yexP(9tB9frXAVIrFX<( b!_Ke|-&P&M4>pjB00000NkvXXu0mjf;6H#m literal 0 HcmV?d00001 diff --git a/public/images/items/dragon_fang.png b/public/images/items/dragon_fang.png new file mode 100644 index 0000000000000000000000000000000000000000..33659e5030775fbb07b68e95652e2a987e21059e GIT binary patch literal 289 zcmV++0p9+JP)#)Gfr{1h`$N_8|mZo^#&-@7LNVfQ9Qh9uMsT2y~w=8(Qbb_dPs-0Kf&MdcB7R zsKK&rzx(_FVx4q=R$9}4ZUHQCPXc3C`1v&c=83I1Y{1>BXTA!6382plAOW-{yH>9a zRgr9i$ON#RasBRTzc$t81feT*fi?F_hl2+UTOjiex$)`|*vj=37>8Uodn2%iE%d4- ngdKx^hlA@7wVQxbsaE;`vkC|DE(G<<00000NkvXXu0mjfUXyw@ literal 0 HcmV?d00001 diff --git a/public/images/items/hard_stone.png b/public/images/items/hard_stone.png new file mode 100644 index 0000000000000000000000000000000000000000..604b44f99156fdb87663e20ecdc11fcb1f17caad GIT binary patch literal 269 zcmV+o0rLKdP)gAuBdoX!00<2L1b^o1{%fcKYTxf08kYzemx%CxL@kaz?VI4T50admoQU}X)iGQ` Tc(l`V00000NkvXXu0mjflge{3 literal 0 HcmV?d00001 diff --git a/public/images/items/linking_cord.png b/public/images/items/linking_cord.png new file mode 100644 index 0000000000000000000000000000000000000000..0cdadd29f59b5c25f4b6381a188c59e02cc5fbd0 GIT binary patch literal 571 zcmV-B0>u4^P)tqk8pXvq_}&BlMDMK`vD>p1&S!-wpwZg&7|?J z_6P=J>@?@8mJ!Q*^L_IJaJBbttj+oG@P*X*>FJSO5`fhfoPXw~i!KSmYIFYl{sX^X z|0o9juLMiiBWL00XORnJX>u_JZu(xZ?fK{+W=-`1$kGILS)DDzrR&kB4<8SLXsZDx zWkD))DT`6TZF`Q}`#ap;-?bKWs{~n^FewX6X4BEZC$lNOetX30FM&2DtV18j(gbEP zo?>PKtCw|aL0erNB66{p!lNcbLyPxNH+2Env%sOKH2k!5y-q+<7W!USD_cD}>hpT_ ztbI|;QJ0koip&6NmWW*RGG=uZk+X2jmSie>lM#^%*!CRGg3~@zlk$W6rq}!+BtHlV z07Wq;0OSXuKAV2ULKJg~VopofqfwJ^>3TGoO|jc<004DaA&R*v1p~n9vU(%a*_Khu zz90Y!kfwCE-6&vM^P#PKbHqC|nN87^tqQL69}OT&6DD#2KL~Zu-FDN=j#M{{*_c+} z3@|%kUkjvKut~Wegs97E5ST6r*n0J>`#p*|loZBr(O^~K4qaaCn5E(@96gBCFlsBd zQ>0+W&V)u6kOEPc6{IXq9y&)~X#T35>vwJFWg2<^YFGQm{sNKMCpEA$SKI&q002ov JPDHLkV1mgB0yh8v literal 0 HcmV?d00001 diff --git a/public/images/items/magnet.png b/public/images/items/magnet.png new file mode 100644 index 0000000000000000000000000000000000000000..7a07f557ec4dc2cbe3e5fe9ce6b828180b4b3914 GIT binary patch literal 272 zcmV+r0q_2aP)-(oFG~!|@gLC2TX}k*e(Kn^nxv-4{5dk>?`P{9BYYBPou|N%%>cPzguHdV4 z4Y2+MHC)!8z4s7+QVw`6AkFXQ!$d%;7LdlytwEA#;H%xRjm=bAda!bE_S^ zmhjPoLueWj5n|l1?gTe~DWM4f(t}_^ literal 0 HcmV?d00001 diff --git a/public/images/items/miracle_seed.png b/public/images/items/miracle_seed.png new file mode 100644 index 0000000000000000000000000000000000000000..f5bc766545a63343aacda01423f1d25ab22f6862 GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJRh}-6ArXh)PP@q2V8G+@x1?v? z1FLn9($il{^<5Cv66EvZ3EdFxSXA)i`RV^8F?}(&Da*J3no$%J( zah1Weq3t!>uEVc^Zfm`M-=XJoW{cz34J?af<+db9t_@f}k5ADzf%nVg>hkY@^G`he a)yfyNIM$?QM>8kT)eN4lelF{r5}E*^i(Fm+ literal 0 HcmV?d00001 diff --git a/public/images/items/muscle_band.png b/public/images/items/muscle_band.png new file mode 100644 index 0000000000000000000000000000000000000000..011716e71247884b689ee60b0769ae32449ef95b GIT binary patch literal 347 zcmV-h0i^zkP) z!41MN3`IKz$6h%yLa&U%3LSwJI5GlP#^@RxxrVyZt6VE-)#4N(CDK;}RQb=2ZCX`j zmG!TyuIr$+yZPgGoM<-)F$&=xUfpRhzP9I4yJQ6b5vJ@KENfOU!+_6X%AOU1s3lrm z4`fDXf$X?ey%=CFJ0?VoTmY;ok#jh^2C9kV*^6sp?*(g33F zd6*0tEBRgI4gdrOQC)iV&$|P>n`TfF0ArLR0|JmTCPOg*x7k05UPX*~R)8f4n|=V? t|9)w=*+T4<{oOD%2Y&KWT2@(}>jU22uPb((csKw6002ovPDHLkV1h>ukU#(c literal 0 HcmV?d00001 diff --git a/public/images/items/mystic_water.png b/public/images/items/mystic_water.png new file mode 100644 index 0000000000000000000000000000000000000000..f944fac1a9c7b1add524976635c712aac73b040a GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJt)4E9ArY-_r(EQ1P~dTqY^{`N zyeZRYD$^Jr=BSt%#2Fe8RbO@TsLSMgo99U^4q6#^N^){^ciZ_p;+*1*5|aO{8MIyU zHx#EcPCUv`kig#|`apBRziD>_l+Q;htl9dXaZ15^Wy>jAFE@R#J(iWlox>m?=d|kj zJ+Tvye`+(dh>J2bWNbgc#c*&l!|8i<-anI8vFjeW^mY1szJ0n$#X8;0I-+^@Ey1!0 m?FYoTj|<#b^iWH5JKz1%FXj8B5`2LkVDNPHb6Mw<&;$U4Jz8A= literal 0 HcmV?d00001 diff --git a/public/images/items/never_melt_ice.png b/public/images/items/never_melt_ice.png new file mode 100644 index 0000000000000000000000000000000000000000..bec7cc0e5d4514e00a19e03ac111bbced73e6e88 GIT binary patch literal 274 zcmV+t0qy>YP)v&z00ZL zi-??txHbUcI_~57d&IQ?91g%1A|1B};K0<2$^jk#h}R-w*MA^%0f6A99PR-akpfsd zS_a_VBEkS}=p8kO@?5`+Fo44W@OEfH8lD2Mh;IQ14}Xdt1_3r4Kdx}_9%gH_s;Ymg YH)^cjNZ4upvj6}907*qoM6N<$g5lM0ZU6uP literal 0 HcmV?d00001 diff --git a/public/images/items/poison_barb.png b/public/images/items/poison_barb.png new file mode 100644 index 0000000000000000000000000000000000000000..913ede4d8190679511ffbc8397e6b96421fcc5a0 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJeoq(2kch)?ryk@ypupoQd-SH! zGQ06<4F%*&bfmfkD6wYGt+>S|bHrH@U_f}n{RSKb|} zGYWH1-SW_Xo%#l|kR!L5T5q=1F-qu6{#mNGU8&<*t zu?>ST5JedyrPrX$8YwARg%vVFR>&A>Q!;{Eql@yR)5#Vo{LjsO=_CY_-#ak2rzsMN zbWTdCNDYJM_pOxu?k}O??gAG6ddz+TH8_ec0XPISoGzf@Qh;iqlAjz23)clOs=I&; zCQxG7nfdQrMctg*2k%(swj7#|@0@r%>00000 LNkvXXu0mjfiEV5m literal 0 HcmV?d00001 diff --git a/public/images/items/silk_scarf.png b/public/images/items/silk_scarf.png new file mode 100644 index 0000000000000000000000000000000000000000..2eaea7aa435b2aa367ca93dfc31b79f42fd8680d GIT binary patch literal 308 zcmV-40n7f0P) zJr2S!4264?oR5`}D>3#8jJ*P5M#ip2MtbPsIu#Ims1!?gZ} z7S3DEtKP17w08+;B?MUO0f#H$C!n_@Ai#4(pHuGuuHJ*ER&N&{+s+F%RRDva}nv=lnbb!)vYIdK5y#xq%qtd zF%AMD5JmSWT*E7P3`<+CV#yIKy@n-Mu-tN6%s2U)4??vA7Bb0?kz(F+7I2qk)~s2x z49Yo|$_xdEOZZB65j2k>ruDIA!CEOY46YI?Vk*Irt3YcKT_n)RpZp#|YH)J_!nHZS zmtfPqz#ZM%Y&wY={E&biGaWkv8LScBI+BOs$nARmM90oh!VF#t0Q|iBJ)8y~M=4-- z5upj-+bd)ODnbGCs~C*{PFu{P0+54%`Hk0tbB%C)&fR~xO4J1O$eIb%J~{rbf4^)D lphn?8d)XKUpEc_*>J1C9alT3a*s=fs002ovPDHLkV1k%}c0m9D literal 0 HcmV?d00001 diff --git a/public/images/items/spell_tag.png b/public/images/items/spell_tag.png new file mode 100644 index 0000000000000000000000000000000000000000..ccf071e122d3f3b663d627a53f141b762e412b27 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJot`d^ArXh)PIKgHH4t#N^*Vn= zxnh}K_1yh$O7C2o&p%OdM~T&snGO!-XJ=nY+O9j*Yj5n*DV*(0U+$$#a5!bJweJuR zFk=7`xexe`*xre9oW{^&c+LF4UiTel3HM_eCH~#~emduf=mEd`QL~RHVtE+HtcU&e4Lt3dY*B(obniqh-(JV_Ag{>lcEQYf0z6mPzTEtJ=XIFI ql}+>e&4h}?6Ea@pYE1pbJ$J|Yv%C-M>NWvA!QkoY=d#Wzp$PyJ?_l=; literal 0 HcmV?d00001 diff --git a/public/images/items/twisted_spoon.png b/public/images/items/twisted_spoon.png new file mode 100644 index 0000000000000000000000000000000000000000..54a96de7d0340ce60b4b9ab8789e58a6bae6c89e GIT binary patch literal 222 zcmV<403rX0P)zym?>u4x-f$;!$yu39UF!UqwBNC1v3 zm*5Y+$5RsP4*6vC`buq?5z^@KYqH$S`nT++ZcBq!{!`1&J@hK=j!1*?TD}h^xuFeu ztIsk1dDCCTtRTn4*HFWu#9?xDvr zGwkH#QeHG6X1~9l66*=&RiC2X+1Vv@e7wNBwRTau&0U59;R)56zYYI)X-& m instanceof modifierType); } + findModifier(modifierFilter: ModifierPredicate): Modifier { + return this.modifiers.find(m => (modifierFilter as ModifierPredicate)(m)); + } + applyModifiers(modifierType: { new(...args: any[]): Modifier }, ...args: any[]): void { const modifiers = this.modifiers.filter(m => m instanceof modifierType && m.shouldApply(args)); for (let modifier of modifiers) { diff --git a/src/biome.ts b/src/biome.ts index 688b6738f..8a53c239f 100644 --- a/src/biome.ts +++ b/src/biome.ts @@ -187,6 +187,22 @@ export class BiomeArena { return Biome[this.biomeType].toLowerCase(); } + isDaytime() { + switch (this.biomeType) { + case Biome.PLAINS: + case Biome.GRASS: + case Biome.SEA: + case Biome.BEACH: + case Biome.LAKE: + case Biome.MOUNTAIN: + case Biome.LAND: + case Biome.DESERT: + case Biome.MEADOW: + case Biome.DOJO: + return true; + } + } + preloadBgm(): void { this.scene.loadBgm(this.bgm); } diff --git a/src/main.ts b/src/main.ts index 86d6e9050..d991cc360 100644 --- a/src/main.ts +++ b/src/main.ts @@ -15,7 +15,7 @@ const config: Phaser.Types.Core.GameConfig = { scene: [ BattleScene ] }; -const setPositionRelative = function(guideObject: any, x: number, y: number) { +const setPositionRelative = function (guideObject: any, x: number, y: number) { if (guideObject && guideObject.hasOwnProperty('width') && guideObject.hasOwnProperty('height')) { const offsetX = guideObject.width * (-0.5 + (0.5 - guideObject.originX)); const offsetY = guideObject.height * (-0.5 + (0.5 - guideObject.originY)); diff --git a/src/modifier-type.ts b/src/modifier-type.ts index 7b2fccae0..b47353fa5 100644 --- a/src/modifier-type.ts +++ b/src/modifier-type.ts @@ -1,7 +1,8 @@ import * as Modifiers from './modifier'; -import { Moves, allMoves } from './move'; +import { AttackMove, Moves, allMoves } from './move'; import { PokeballType, getPokeballName } from './pokeball'; import { PlayerPokemon, PokemonMove } from './pokemon'; +import { EvolutionItem, pokemonEvolutions } from './pokemon-evolutions'; import { Stat, getStatName } from './pokemon-stat'; import { tmSpecies } from './tms'; import { Type } from './type'; @@ -137,6 +138,61 @@ export class PokemonAllMovePpRestoreModifierType extends PokemonModifierType { } } +function getAttackTypeBoosterItemName(type: Type) { + switch (type) { + case Type.NORMAL: + return 'Silk Scarf'; + case Type.FIGHTING: + return 'Black Belt'; + case Type.FLYING: + return 'Sharp Beak'; + case Type.POISON: + return 'Poison Barb'; + case Type.GROUND: + return 'Soft Sand'; + case Type.ROCK: + return 'Hard Stone'; + case Type.BUG: + return 'Silver Powder'; + case Type.GHOST: + return 'Spell Tag'; + case Type.STEEL: + return 'Metal Coat'; + case Type.FIRE: + return 'Charcoal'; + case Type.WATER: + return 'Mystic Water'; + case Type.GRASS: + return 'Miracle Seed'; + case Type.ELECTRIC: + return 'Magnet'; + case Type.PSYCHIC: + return 'Twisted Spoon'; + case Type.ICE: + return 'Never-Melt Ice' + case Type.DRAGON: + return 'Dragon Fang'; + case Type.DARK: + return 'Black Glasses'; + case Type.FAIRY: + return 'Clefairy Doll'; + } +} + +export class AttackTypeBoosterModifierType extends PokemonModifierType { + public moveType: Type; + public boostPercent: integer; + + constructor(moveType: Type, boostPercent: integer) { + super(getAttackTypeBoosterItemName(moveType), `Inceases the power of a POKéMON's ${Type[moveType]}-type moves by 20%`, + (_type, args) => new Modifiers.AttackTypeBoosterModifier(this, (args[0] as PlayerPokemon).id, moveType, boostPercent), + null, `${getAttackTypeBoosterItemName(moveType).replace(/[ \-]/g, '_').toLowerCase()}`); + + this.moveType = moveType; + this.boostPercent = boostPercent; + } +} + export class PokemonLevelIncrementModifierType extends PokemonModifierType { constructor(name: string, iconImage?: string) { super(name, `Increase a POKéMON\'s level by 1`, (_type, args) => new Modifiers.PokemonLevelIncrementModifier(this, (args[0] as PlayerPokemon).id), @@ -187,6 +243,50 @@ export class TmModifierType extends PokemonModifierType { } } +function getEvolutionItemName(evolutionItem: EvolutionItem) { + switch (evolutionItem) { + case EvolutionItem.LINKING_CORD: + return 'Linking Cord'; + case EvolutionItem.SUN_STONE: + return 'Sun Stone'; + case EvolutionItem.MOON_STONE: + return 'Moon Stone'; + case EvolutionItem.LEAF_STONE: + return 'Leaf Stone'; + case EvolutionItem.FIRE_STONE: + return 'Fire Stone'; + case EvolutionItem.WATER_STONE: + return 'Water Stone'; + case EvolutionItem.THUNDER_STONE: + return 'Thunder Stone'; + case EvolutionItem.ICE_STONE: + return 'Ice Stone'; + case EvolutionItem.DUSK_STONE: + return 'Dusk Stone'; + case EvolutionItem.DAWN_STONE: + return 'Dawn Stone'; + case EvolutionItem.SHINY_STONE: + return 'Shiny Stone'; + } +} + +export class EvolutionItemModifierType extends PokemonModifierType { + public evolutionItem: EvolutionItem; + + constructor(evolutionItem: EvolutionItem) { + super(getEvolutionItemName(evolutionItem), `Causes certain POKéMON to evolve`, (_type, args) => new Modifiers.EvolutionItemModifier(this, (args[0] as PlayerPokemon).id), + (pokemon: PlayerPokemon) => { + if (pokemonEvolutions.hasOwnProperty(pokemon.species.speciesId) && pokemonEvolutions[pokemon.species.speciesId].filter(e => e.item === this.evolutionItem + && (!e.condition || e.condition.predicate(pokemon))).length) + return null; + + return PartyUiHandler.NoEffectMessage; + }, getEvolutionItemName(evolutionItem).replace(/[ \-]/g, '_').toLowerCase()); + + this.evolutionItem = evolutionItem; + } +} + class ModifierTypeGenerator extends ModifierType { private genTypeFunc: Function; @@ -197,11 +297,69 @@ class ModifierTypeGenerator extends ModifierType { generateType(party: PlayerPokemon[]) { const ret = this.genTypeFunc(party); - ret.setTier(this.tier); + if (ret) { + console.log(ret); + ret.setTier(this.tier); + } return ret; } } +class AttackTypeBoosterModifierTypeGenerator extends ModifierTypeGenerator { + constructor() { + super((party: PlayerPokemon[]) => { + const attackMoveTypes = party.map(p => p.moveset.map(m => m.getMove()).filter(m => m instanceof AttackMove).map(m => m.type)).flat(); + const attackMoveTypeWeights = new Map(); + let totalWeight = 0; + for (let t of attackMoveTypes) { + if (attackMoveTypeWeights.has(t)) { + if (attackMoveTypeWeights.get(t) < 3) + attackMoveTypeWeights.set(t, attackMoveTypeWeights.get(t) + 1); + else + continue; + } else + attackMoveTypeWeights.set(t, 1); + totalWeight++; + } + + if (!totalWeight) + return null; + + let type: Type; + + const randInt = Utils.randInt(totalWeight); + let weight = 0; + + for (let t of attackMoveTypeWeights.keys()) { + const typeWeight = attackMoveTypeWeights.get(t); + if (randInt <= weight + typeWeight) { + type = t; + break; + } + weight += typeWeight; + } + + return new AttackTypeBoosterModifierType(type, 20); + }); + } +} + +class EvolutionItemModifierTypeGenerator extends ModifierTypeGenerator { + constructor() { + super((party: PlayerPokemon[]) => { + const evolutionItemPool = party.filter(p => pokemonEvolutions.hasOwnProperty(p.species.speciesId)).map(p => { + const evolutions = pokemonEvolutions[p.species.speciesId] + return evolutions.filter(e => e.item !== EvolutionItem.NONE && (!e.condition || e.condition.predicate(p))); + }).flat().flatMap(e => e.item); + + if (!evolutionItemPool.length) + return null; + + return new EvolutionItemModifierType(evolutionItemPool[Utils.randInt(evolutionItemPool.length)]); + }); + } +} + class WeightedModifierType { public modifierType: ModifierType; public weight: integer | Function; @@ -237,56 +395,58 @@ const modifierPool = { }) ].map(m => { m.setTier(ModifierTier.COMMON); return m; }), [ModifierTier.GREAT]: [ - new WeightedModifierType(new AddPokeballModifierType(PokeballType.GREAT_BALL, 5, 'gb'), 3), + new WeightedModifierType(new AddPokeballModifierType(PokeballType.GREAT_BALL, 5, 'gb'), 12), new WeightedModifierType(new PokemonReviveModifierType('REVIVE', 50), (party: PlayerPokemon[]) => { const faintedPartyMemberCount = party.filter(p => !p.hp).length; - return faintedPartyMemberCount * 3; + return faintedPartyMemberCount * 6; }), new WeightedModifierType(new PokemonReviveModifierType('MAX REVIVE', 100), (party: PlayerPokemon[]) => { const faintedPartyMemberCount = party.filter(p => !p.hp).length; - return faintedPartyMemberCount; + return faintedPartyMemberCount * 2; + }), + new WeightedModifierType(new AllPokemonFullReviveModifierType('SACRED ASH'), (party: PlayerPokemon[]) => { + return party.filter(p => !p.hp).length >= Math.ceil(party.length / 2) ? 1 : 0; }), new WeightedModifierType(new PokemonHpRestoreModifierType('HYPER POTION', 200), (party: PlayerPokemon[]) => { const thresholdPartyMemberCount = party.filter(p => p.getInverseHp() >= 100 || p.getHpRatio() <= 0.625).length; - return thresholdPartyMemberCount; + return thresholdPartyMemberCount * 2; }), new WeightedModifierType(new PokemonHpRestoreModifierType('MAX POTION', 100, true), (party: PlayerPokemon[]) => { const thresholdPartyMemberCount = party.filter(p => p.getInverseHp() >= 150 || p.getHpRatio() <= 0.5).length; - return Math.ceil(thresholdPartyMemberCount / 3); + return Math.ceil(thresholdPartyMemberCount / 1.5); }), new WeightedModifierType(new PokemonAllMovePpRestoreModifierType('ELIXIR', 10), (party: PlayerPokemon[]) => { const thresholdPartyMemberCount = party.filter(p => p.moveset.filter(m => m.ppUsed >= 5).length).length; - return thresholdPartyMemberCount; + return thresholdPartyMemberCount * 2; }), new WeightedModifierType(new PokemonAllMovePpRestoreModifierType('MAX ELIXIR', -1), (party: PlayerPokemon[]) => { const thresholdPartyMemberCount = party.filter(p => p.moveset.filter(m => m.ppUsed > 10).length).length; - return Math.ceil(thresholdPartyMemberCount / 3); + return Math.ceil(thresholdPartyMemberCount / 1.5); }), new WeightedModifierType(new ModifierTypeGenerator((party: PlayerPokemon[]) => { const partyMemberCompatibleTms = party.map(p => p.compatibleTms); const uniqueCompatibleTms = partyMemberCompatibleTms.flat().filter((tm, i, array) => array.indexOf(tm) === i); const randTmIndex = Utils.randInt(uniqueCompatibleTms.length); return new TmModifierType(uniqueCompatibleTms[randTmIndex]); - }), 2), - new PokemonLevelIncrementModifierType('RARE CANDY'), - new PokemonBaseStatBoosterModifierType('HP-UP', Stat.HP), - new PokemonBaseStatBoosterModifierType('PROTEIN', Stat.ATK), - new PokemonBaseStatBoosterModifierType('IRON', Stat.DEF), - new PokemonBaseStatBoosterModifierType('CALCIUM', Stat.SPATK), - new PokemonBaseStatBoosterModifierType('ZINC', Stat.SPDEF), - new PokemonBaseStatBoosterModifierType('CARBOS', Stat.SPD) + }), 4), + new WeightedModifierType(new PokemonLevelIncrementModifierType('RARE CANDY'), 4), + new WeightedModifierType(new PokemonBaseStatBoosterModifierType('HP-UP', Stat.HP), 1), + new WeightedModifierType(new PokemonBaseStatBoosterModifierType('PROTEIN', Stat.ATK), 1), + new WeightedModifierType(new PokemonBaseStatBoosterModifierType('IRON', Stat.DEF), 1), + new WeightedModifierType(new PokemonBaseStatBoosterModifierType('CALCIUM', Stat.SPATK), 1), + new WeightedModifierType(new PokemonBaseStatBoosterModifierType('ZINC', Stat.SPDEF), 1), + new WeightedModifierType(new PokemonBaseStatBoosterModifierType('CARBOS', Stat.SPD), 1) ].map(m => { m.setTier(ModifierTier.GREAT); return m; }), [ModifierTier.ULTRA]: [ - new AddPokeballModifierType(PokeballType.ULTRA_BALL, 5, 'ub'), - new WeightedModifierType(new AllPokemonFullReviveModifierType('SACRED ASH'), (party: PlayerPokemon[]) => { - return party.filter(p => !p.hp).length >= Math.ceil(party.length / 2) ? 1 : 0; - }), + new WeightedModifierType(new AddPokeballModifierType(PokeballType.ULTRA_BALL, 5, 'ub'), 8), + new WeightedModifierType(new EvolutionItemModifierTypeGenerator(), 5), + new WeightedModifierType(new AttackTypeBoosterModifierTypeGenerator(), 3), 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 Modifiers.PartyShareModifier(type), 'oval_charm'), new ModifierType('HEALING CHARM', 'Doubles the effectiveness of HP restoring moves and items (excludes revives)', (type, _args) => new Modifiers.HealingBoosterModifier(type, 2), 'healing_charm'), - new WeightedModifierType(new PokemonModifierType('SHELL BELL', 'Heals 1/8 of a POKéMON\'s damage dealt', (type, args) => new Modifiers.HitHealModifier(type, (args[0] as PlayerPokemon).id)), 8), - 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 Modifiers.ExpShareModifier(type), 'exp_share') + new WeightedModifierType(new PokemonModifierType('SHELL BELL', 'Heals 1/8 of a POKéMON\'s dealt damage', (type, args) => new Modifiers.HitHealModifier(type, (args[0] as PlayerPokemon).id)), 8), + new WeightedModifierType(new ExpBoosterModifierType('LUCKY EGG', 25), 4), + new WeightedModifierType(new ModifierType('EXP. SHARE', 'All POKéMON in your party gain an additional 10% of a battle\'s EXP. Points', (type, _args) => new Modifiers.ExpShareModifier(type), 'exp_share'), 3) ].map(m => { m.setTier(ModifierTier.ULTRA); return m; }), [ModifierTier.MASTER]: [ new AddPokeballModifierType(PokeballType.MASTER_BALL, 1, 'mb'), @@ -335,10 +495,12 @@ export function getModifierTypeOptionsForWave(waveIndex: integer, count: integer return new Array(count).fill(0).map(() => getNewModifierTypeOption(party)); } -function getNewModifierTypeOption(party: PlayerPokemon[]): ModifierTypeOption { +function getNewModifierTypeOption(party: PlayerPokemon[], tier?: ModifierTier, upgrade?: boolean): ModifierTypeOption { const tierValue = Utils.randInt(256); - const upgrade = Utils.randInt(32) === 0; - const tier: ModifierTier = (tierValue >= 52 ? ModifierTier.COMMON : tierValue >= 8 ? ModifierTier.GREAT : tierValue >= 1 ? ModifierTier.ULTRA : ModifierTier.MASTER) + (upgrade ? 1 : 0); + if (tier === undefined) { + tier = (tierValue >= 52 ? ModifierTier.COMMON : tierValue >= 8 ? ModifierTier.GREAT : tierValue >= 1 ? ModifierTier.ULTRA : ModifierTier.MASTER) + (upgrade ? 1 : 0); + upgrade = Utils.randInt(32) === 0; + } const thresholds = Object.keys(modifierPoolThresholds[tier]); const totalWeight = parseInt(thresholds[thresholds.length - 1]); const value = Utils.randInt(totalWeight); @@ -354,8 +516,14 @@ function getNewModifierTypeOption(party: PlayerPokemon[]): ModifierTypeOption { let modifierType: ModifierType | WeightedModifierType = modifierPool[tier][index]; if (modifierType instanceof WeightedModifierType) modifierType = (modifierType as WeightedModifierType).modifierType; - if (modifierType instanceof ModifierTypeGenerator) + if (modifierType instanceof ModifierTypeGenerator) { modifierType = (modifierType as ModifierTypeGenerator).generateType(party); + if (modifierType === null) { + console.log(ModifierTier[tier], upgrade); + return getNewModifierTypeOption(party, tier, upgrade); + } + } + console.log(modifierType); return new ModifierTypeOption(modifierType as ModifierType, upgrade); } diff --git a/src/modifier.ts b/src/modifier.ts index 6ab1acd85..6faef5421 100644 --- a/src/modifier.ts +++ b/src/modifier.ts @@ -1,5 +1,5 @@ import * as ModifierTypes from './modifier-type'; -import { CommonAnimPhase, LearnMovePhase, LevelUpPhase, MessagePhase, PokemonHealPhase } from "./battle-phases"; +import { LearnMovePhase, LevelUpPhase, MessagePhase, PokemonHealPhase } from "./battle-phases"; import BattleScene from "./battle-scene"; import { getLevelTotalExp } from "./exp"; import { PokeballType } from "./pokeball"; @@ -7,9 +7,12 @@ import Pokemon, { PlayerPokemon } from "./pokemon"; import { Stat } from "./pokemon-stat"; import { addTextObject, TextStyle } from "./text"; import * as Utils from "./utils"; -import { CommonAnim } from './battle-anims'; +import { Type } from './type'; +import { EvolutionPhase } from './evolution-phase'; +import { pokemonEvolutions } from './pokemon-evolutions'; type ModifierType = ModifierTypes.ModifierType; +export type ModifierPredicate = (modifier: Modifier) => boolean; export class ModifierBar extends Phaser.GameObjects.Container { constructor(scene: BattleScene) { @@ -253,6 +256,36 @@ export class PokemonBaseStatModifier extends PokemonHeldItemModifier { } } +export class AttackTypeBoosterModifier extends PokemonHeldItemModifier { + private moveType: Type; + private boostMultiplier: number; + + constructor(type: ModifierType, pokemonId: integer, moveType: Type, boostPercent: integer) { + super(type, pokemonId); + + this.moveType = moveType; + this.boostMultiplier = boostPercent * 0.01; + } + + match(modifier: Modifier) { + return modifier instanceof AttackTypeBoosterModifier; + } + + clone() { + return new AttackTypeBoosterModifier(this.type, this.pokemonId, this.moveType, this.boostMultiplier * 100); + } + + shouldApply(args: any[]): boolean { + return super.shouldApply(args) && args.length === 2 && args[1] instanceof Utils.NumberHolder; + } + + apply(args: any[]): boolean { + (args[1] as Utils.NumberHolder).value = Math.floor((args[1] as Utils.NumberHolder).value * (1 + (this.getStackCount() * this.boostMultiplier))); + + return true; + } +} + export class HitHealModifier extends PokemonHeldItemModifier { constructor(type: ModifierType, pokemonId: integer) { super(type, pokemonId); @@ -270,7 +303,7 @@ export class HitHealModifier extends PokemonHeldItemModifier { const pokemon = args[0] as PlayerPokemon; if (pokemon.turnData.damageDealt && pokemon.getHpRatio() < 1) { - const scene = pokemon.scene as BattleScene; + const scene = pokemon.scene; const hpRestoreMultiplier = new Utils.IntegerHolder(1); scene.applyModifiers(HealingBoosterModifier, hpRestoreMultiplier); @@ -388,8 +421,7 @@ export class PokemonLevelIncrementModifier extends ConsumablePokemonModifier { pokemon.exp = getLevelTotalExp(pokemon.level, pokemon.species.growthRate); pokemon.levelExp = 0; - const scene = pokemon.scene as BattleScene; - scene.unshiftPhase(new LevelUpPhase(scene, scene.getParty().indexOf(pokemon), pokemon.level - 1, pokemon.level)); + pokemon.scene.unshiftPhase(new LevelUpPhase(pokemon.scene, pokemon.scene.getParty().indexOf(pokemon), pokemon.level - 1, pokemon.level)); return true; } @@ -403,13 +435,32 @@ export class TmModifier extends ConsumablePokemonModifier { apply(args: any[]): boolean { const pokemon = args[0] as PlayerPokemon; - const scene = pokemon.scene as BattleScene; - scene.unshiftPhase(new LearnMovePhase(scene, scene.getParty().indexOf(pokemon), (this.type as ModifierTypes.TmModifierType).moveId)); + pokemon.scene.unshiftPhase(new LearnMovePhase(pokemon.scene, pokemon.scene.getParty().indexOf(pokemon), (this.type as ModifierTypes.TmModifierType).moveId)); return true; } } +export class EvolutionItemModifier extends ConsumablePokemonModifier { + constructor(type: ModifierTypes.EvolutionItemModifierType, pokemonId: integer) { + super(type, pokemonId); + } + + apply(args: any[]): boolean { + const pokemon = args[0] as PlayerPokemon; + + const matchingEvolution = pokemonEvolutions[pokemon.species.speciesId].find(e => e.item === (this.type as ModifierTypes.EvolutionItemModifierType).evolutionItem + && (!e.condition || e.condition.predicate(pokemon))); + + if (matchingEvolution) { + pokemon.scene.unshiftPhase(new EvolutionPhase(pokemon.scene, pokemon.scene.getParty().indexOf(pokemon), matchingEvolution, pokemon.level - 1)); + return true; + } + + return false; + } +} + export class PartyShareModifier extends PersistentModifier { constructor(type: ModifierType) { super(type); diff --git a/src/pokemon-evolutions.ts b/src/pokemon-evolutions.ts index 73c305a2a..6ab5ae950 100644 --- a/src/pokemon-evolutions.ts +++ b/src/pokemon-evolutions.ts @@ -1,6 +1,13 @@ +import { Biome } from "./biome"; +import { AttackTypeBoosterModifier } from "./modifier"; +import { AttackTypeBoosterModifierType } from "./modifier-type"; +import { Moves } from "./move"; +import { PokeballType } from "./pokeball"; import Pokemon from "./pokemon"; import { Stat } from "./pokemon-stat"; import { Species } from "./species"; +import { Type } from "./type"; +import * as Utils from "./utils"; export enum SpeciesWildEvolutionDelay { NONE, @@ -10,17 +17,32 @@ export enum SpeciesWildEvolutionDelay { VERY_LONG } +export enum EvolutionItem { + NONE, + LINKING_CORD, + SUN_STONE, + MOON_STONE, + LEAF_STONE, + FIRE_STONE, + WATER_STONE, + THUNDER_STONE, + ICE_STONE, + DUSK_STONE, + DAWN_STONE, + SHINY_STONE +} + export class SpeciesEvolution { public speciesId: Species; public level: integer; - public item: string; - public condition: SpeciesEvolutionCondition | string; + public item: EvolutionItem; + public condition: SpeciesEvolutionCondition; public wildDelay: SpeciesWildEvolutionDelay; - constructor(speciesId: Species, level: integer, item: string, condition: SpeciesEvolutionCondition | string, wildDelay?: SpeciesWildEvolutionDelay) { + constructor(speciesId: Species, level: integer, item: EvolutionItem, condition: SpeciesEvolutionCondition, wildDelay?: SpeciesWildEvolutionDelay) { this.speciesId = speciesId; this.level = level; - this.item = item; + this.item = item || EvolutionItem.NONE; this.condition = condition; this.wildDelay = wildDelay || SpeciesWildEvolutionDelay.NONE; } @@ -142,7 +164,7 @@ export const pokemonEvolutions: PokemonEvolutions = { ], [Species.SLOWPOKE]: [ new SpeciesEvolution(Species.SLOWBRO, 37, null, null), - new SpeciesEvolution(Species.SLOWKING, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* King's rock*/), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.SLOWKING, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition((p: Pokemon) => true /* King's rock*/), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.MAGNEMITE]: [ new SpeciesEvolution(Species.MAGNETON, 30, null, null) @@ -324,8 +346,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.LINOONE, 20, null, null) ], [Species.WURMPLE]: [ - new SpeciesEvolution(Species.SILCOON, 7, null, 'random based on personality'), - new SpeciesEvolution(Species.CASCOON, 7, null, 'random based on personality') + new SpeciesEvolution(Species.SILCOON, 7, null, new SpeciesEvolutionCondition((p: Pokemon) => Utils.randInt(2) === 0, true)), // TODO: Improve these conditions + new SpeciesEvolution(Species.CASCOON, 7, null, new SpeciesEvolutionCondition((p: Pokemon) => Utils.randInt(2) === 0, true)) ], [Species.SILCOON]: [ new SpeciesEvolution(Species.BEAUTIFLY, 10, null, null) @@ -350,7 +372,7 @@ export const pokemonEvolutions: PokemonEvolutions = { ], [Species.KIRLIA]: [ new SpeciesEvolution(Species.GARDEVOIR, 30, null, new SpeciesEvolutionCondition((p: Pokemon) => !p.gender, true)), - new SpeciesEvolution(Species.GALLADE, 1, "Dawn Stone", new SpeciesEvolutionCondition((p: Pokemon) => p.gender, true), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.GALLADE, 1, EvolutionItem.DAWN_STONE, new SpeciesEvolutionCondition((p: Pokemon) => p.gender, true), SpeciesWildEvolutionDelay.LONG) ], [Species.SURSKIT]: [ new SpeciesEvolution(Species.MASQUERAIN, 22, null, null) @@ -366,7 +388,7 @@ export const pokemonEvolutions: PokemonEvolutions = { ], [Species.NINCADA]: [ new SpeciesEvolution(Species.NINJASK, 20, null, null), - new SpeciesEvolution(Species.SHEDINJA, 20, null, 'empty spot in party, Pokéball in bag') + new SpeciesEvolution(Species.SHEDINJA, 20, null, new SpeciesEvolutionCondition((p: Pokemon) => p.scene.getParty().length < 6 && p.scene.pokeballCounts[PokeballType.POKEBALL], true)) ], [Species.WHISMUR]: [ new SpeciesEvolution(Species.LOUDRED, 20, null, null) @@ -439,7 +461,7 @@ export const pokemonEvolutions: PokemonEvolutions = { ], [Species.SNORUNT]: [ new SpeciesEvolution(Species.GLALIE, 42, null, null), - new SpeciesEvolution(Species.FROSLASS, 1, "Dawn Stone", new SpeciesEvolutionCondition((p: Pokemon) => !p.gender, true), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.FROSLASS, 1, EvolutionItem.DAWN_STONE, new SpeciesEvolutionCondition((p: Pokemon) => !p.gender, true), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.SPHEAL]: [ new SpeciesEvolution(Species.SEALEO, 32, null, null) @@ -503,9 +525,9 @@ export const pokemonEvolutions: PokemonEvolutions = { ], [Species.BURMY]: [ new SpeciesEvolution(Species.MOTHIM, 20, null, new SpeciesEvolutionCondition((p: Pokemon) => p.gender, true)), - new SpeciesEvolution(Species.WORMADAM, 20, null, new SpeciesEvolutionCondition((p: Pokemon) => !p.gender/* && grass*/, true)), - new SpeciesEvolution(Species.WORMADAM, 20, null, new SpeciesEvolutionCondition((p: Pokemon) => !p.gender/* && cave*/, true)), - new SpeciesEvolution(Species.WORMADAM, 20, null, new SpeciesEvolutionCondition((p: Pokemon) => !p.gender/* && building*/, true)) + new SpeciesEvolution(Species.WORMADAM, 20, null, new SpeciesEvolutionCondition((p: Pokemon) => !p.gender && p.scene.arena.biomeType === Biome.FOREST, true)), + new SpeciesEvolution(Species.WORMADAM, 20, null, new SpeciesEvolutionCondition((p: Pokemon) => !p.gender && p.scene.arena.biomeType === Biome.CAVE, true)), + new SpeciesEvolution(Species.WORMADAM, 20, null, new SpeciesEvolutionCondition((p: Pokemon) => !p.gender && p.scene.arena.biomeType === Biome.CITY, true)) ], [Species.COMBEE]: [ new SpeciesEvolution(Species.VESPIQUEN, 21, null, new SpeciesEvolutionCondition((p: Pokemon) => !p.gender, true)) @@ -730,199 +752,203 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.VOLCARONA, 59, null, null) ], [Species.PIKACHU]: [ - new SpeciesEvolution(Species.RAICHU, 1, "Thunder Stone", null, SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.RAICHU, 1, EvolutionItem.THUNDER_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.NIDORINA]: [ - new SpeciesEvolution(Species.NIDOQUEEN, 1, "Moon Stone", null, SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.NIDOQUEEN, 1, EvolutionItem.MOON_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.NIDORINO]: [ - new SpeciesEvolution(Species.NIDOKING, 1, "Moon Stone", null, SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.NIDOKING, 1, EvolutionItem.MOON_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.CLEFAIRY]: [ - new SpeciesEvolution(Species.CLEFABLE, 1, "Moon Stone", null, SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.CLEFABLE, 1, EvolutionItem.MOON_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.VULPIX]: [ - new SpeciesEvolution(Species.NINETALES, 1, "Fire Stone", null, SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.NINETALES, 1, EvolutionItem.FIRE_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.JIGGLYPUFF]: [ - new SpeciesEvolution(Species.WIGGLYTUFF, 1, "Moon Stone", null, SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.WIGGLYTUFF, 1, EvolutionItem.MOON_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.GLOOM]: [ - new SpeciesEvolution(Species.VILEPLUME, 1, "Leaf Stone", null, SpeciesWildEvolutionDelay.LONG), - new SpeciesEvolution(Species.BELLOSSOM, 1, "Sun Stone", null, SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.VILEPLUME, 1, EvolutionItem.LEAF_STONE, null, SpeciesWildEvolutionDelay.LONG), + new SpeciesEvolution(Species.BELLOSSOM, 1, EvolutionItem.SUN_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.GROWLITHE]: [ - new SpeciesEvolution(Species.ARCANINE, 1, "Fire Stone", null, SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.ARCANINE, 1, EvolutionItem.FIRE_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.POLIWHIRL]: [ - new SpeciesEvolution(Species.POLIWRATH, 1, "Water Stone", null, SpeciesWildEvolutionDelay.LONG), - new SpeciesEvolution(Species.POLITOED, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* King's rock*/), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.POLIWRATH, 1, EvolutionItem.WATER_STONE, null, SpeciesWildEvolutionDelay.LONG), + new SpeciesEvolution(Species.POLITOED, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition((p: Pokemon) => true /* King's rock*/), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.WEEPINBELL]: [ - new SpeciesEvolution(Species.VICTREEBEL, 1, "Leaf Stone", null, SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.VICTREEBEL, 1, EvolutionItem.LEAF_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.MAGNETON]: [ - new SpeciesEvolution(Species.MAGNEZONE, 1, "Thunder Stone", null, SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.MAGNEZONE, 1, EvolutionItem.THUNDER_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.SHELLDER]: [ - new SpeciesEvolution(Species.CLOYSTER, 1, "Water Stone", null, SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.CLOYSTER, 1, EvolutionItem.WATER_STONE, null, SpeciesWildEvolutionDelay.MEDIUM) ], [Species.EXEGGCUTE]: [ - new SpeciesEvolution(Species.EXEGGUTOR, 1, "Leaf Stone", null, SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.EXEGGUTOR, 1, EvolutionItem.LEAF_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.TANGELA]: [ - new SpeciesEvolution(Species.TANGROWTH, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => true /* Ancient power learned*/), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.TANGROWTH, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.moveset.filter(m => m.moveId === Moves.ANCIENT_POWER).length), SpeciesWildEvolutionDelay.LONG) ], [Species.LICKITUNG]: [ - new SpeciesEvolution(Species.LICKILICKY, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => true /* Rollout learned*/), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.LICKILICKY, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.moveset.filter(m => m.moveId === Moves.ROLLOUT).length), SpeciesWildEvolutionDelay.LONG) ], [Species.STARYU]: [ - new SpeciesEvolution(Species.STARMIE, 1, "Water Stone", null, SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.STARMIE, 1, EvolutionItem.WATER_STONE, null, SpeciesWildEvolutionDelay.MEDIUM) ], [Species.EEVEE]: [ - new SpeciesEvolution(Species.ESPEON, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10 /* daytime */), SpeciesWildEvolutionDelay.MEDIUM), - new SpeciesEvolution(Species.UMBREON, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10 /* nighttime */), SpeciesWildEvolutionDelay.MEDIUM), - new SpeciesEvolution(Species.VAPOREON, 1, "Water Stone", null, SpeciesWildEvolutionDelay.MEDIUM), - new SpeciesEvolution(Species.JOLTEON, 1, "Thunder Stone", null, SpeciesWildEvolutionDelay.MEDIUM), - new SpeciesEvolution(Species.FLAREON, 1, "Fire Stone", null, SpeciesWildEvolutionDelay.MEDIUM), - new SpeciesEvolution(Species.LEAFEON, 1, "Leaf Stone", null, SpeciesWildEvolutionDelay.MEDIUM), - new SpeciesEvolution(Species.GLACEON, 1, "Ice Stone", null, SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.ESPEON, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10 && p.scene.arena.isDaytime()), SpeciesWildEvolutionDelay.MEDIUM), + new SpeciesEvolution(Species.UMBREON, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10 && !p.scene.arena.isDaytime()), SpeciesWildEvolutionDelay.MEDIUM), + new SpeciesEvolution(Species.VAPOREON, 1, EvolutionItem.WATER_STONE, null, SpeciesWildEvolutionDelay.MEDIUM), + new SpeciesEvolution(Species.JOLTEON, 1, EvolutionItem.THUNDER_STONE, null, SpeciesWildEvolutionDelay.MEDIUM), + new SpeciesEvolution(Species.FLAREON, 1, EvolutionItem.FIRE_STONE, null, SpeciesWildEvolutionDelay.MEDIUM), + new SpeciesEvolution(Species.LEAFEON, 1, EvolutionItem.LEAF_STONE, null, SpeciesWildEvolutionDelay.MEDIUM), + new SpeciesEvolution(Species.GLACEON, 1, EvolutionItem.ICE_STONE, null, SpeciesWildEvolutionDelay.MEDIUM) ], [Species.TOGETIC]: [ - new SpeciesEvolution(Species.TOGEKISS, 1, "Shiny Stone", null, SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.TOGEKISS, 1, EvolutionItem.SHINY_STONE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.AIPOM]: [ - new SpeciesEvolution(Species.AMBIPOM, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => true /* Double hit learned*/), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.AMBIPOM, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.moveset.filter(m => m.moveId === Moves.DOUBLE_HIT).length), SpeciesWildEvolutionDelay.LONG) ], [Species.SUNKERN]: [ - new SpeciesEvolution(Species.SUNFLORA, 1, "Sun Stone", null, SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.SUNFLORA, 1, EvolutionItem.SUN_STONE, null, SpeciesWildEvolutionDelay.MEDIUM) ], [Species.YANMA]: [ - new SpeciesEvolution(Species.YANMEGA, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => true /* Rollout learned*/), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.YANMEGA, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.moveset.filter(m => m.moveId === Moves.ROLLOUT).length), SpeciesWildEvolutionDelay.LONG) ], [Species.MURKROW]: [ - new SpeciesEvolution(Species.HONCHKROW, 1, "Dusk Stone", null, SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.HONCHKROW, 1, EvolutionItem.DUSK_STONE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.MISDREAVUS]: [ - new SpeciesEvolution(Species.MISMAGIUS, 1, "Dusk Stone", null, SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.MISMAGIUS, 1, EvolutionItem.DUSK_STONE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.GLIGAR]: [ - new SpeciesEvolution(Species.GLISCOR, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => true /* Razor fang at night*/), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.GLISCOR, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => !p.scene.arena.isDaytime() /* Razor fang at night*/), SpeciesWildEvolutionDelay.LONG) ], [Species.SNEASEL]: [ - new SpeciesEvolution(Species.WEAVILE, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => true /* Razor claw at night*/), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.WEAVILE, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => !p.scene.arena.isDaytime() /* Razor claw at night*/), SpeciesWildEvolutionDelay.LONG) ], [Species.PILOSWINE]: [ - new SpeciesEvolution(Species.MAMOSWINE, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => true /* Ancient power learned*/), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.MAMOSWINE, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.moveset.filter(m => m.moveId === Moves.ANCIENT_POWER).length), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.LOMBRE]: [ - new SpeciesEvolution(Species.LUDICOLO, 1, "Water Stone", null, SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.LUDICOLO, 1, EvolutionItem.WATER_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.NUZLEAF]: [ - new SpeciesEvolution(Species.SHIFTRY, 1, "Leaf Stone", null, SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.SHIFTRY, 1, EvolutionItem.LEAF_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.NOSEPASS]: [ - new SpeciesEvolution(Species.PROBOPASS, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => true /* Magnetic field??*/), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.PROBOPASS, 1, EvolutionItem.THUNDER_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.SKITTY]: [ - new SpeciesEvolution(Species.DELCATTY, 1, "Moon Stone", null, SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.DELCATTY, 1, EvolutionItem.MOON_STONE, null, SpeciesWildEvolutionDelay.MEDIUM) ], [Species.ROSELIA]: [ - new SpeciesEvolution(Species.ROSERADE, 1, "Shiny Stone", null, SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.ROSERADE, 1, EvolutionItem.SHINY_STONE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.BONSLY]: [ - new SpeciesEvolution(Species.SUDOWOODO, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => true /* Mimic learned */), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.SUDOWOODO, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.moveset.filter(m => m.moveId === Moves.MIMIC).length), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.MIME_JR]: [ - new SpeciesEvolution(Species.MR_MIME, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => true /* Mimic learned */), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.MR_MIME, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.moveset.filter(m => m.moveId === Moves.MIMIC).length), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.MANTYKE]: [ - new SpeciesEvolution(Species.MANTINE, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => true /* Remoraid in party */), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.MANTINE, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.scene.getParty().find(p => p.species.speciesId === Species.REMORAID)), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.PANSAGE]: [ - new SpeciesEvolution(Species.SIMISAGE, 1, "Leaf Stone", null, SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.SIMISAGE, 1, EvolutionItem.LEAF_STONE, null, SpeciesWildEvolutionDelay.MEDIUM) ], [Species.PANSEAR]: [ - new SpeciesEvolution(Species.SIMISEAR, 1, "Fire Stone", null, SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.SIMISEAR, 1, EvolutionItem.FIRE_STONE, null, SpeciesWildEvolutionDelay.MEDIUM) ], [Species.PANPOUR]: [ - new SpeciesEvolution(Species.SIMIPOUR, 1, "Water Stone", null, SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.SIMIPOUR, 1, EvolutionItem.WATER_STONE, null, SpeciesWildEvolutionDelay.MEDIUM) ], [Species.MUNNA]: [ - new SpeciesEvolution(Species.MUSHARNA, 1, "Moon Stone", null, SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.MUSHARNA, 1, EvolutionItem.MOON_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.COTTONEE]: [ - new SpeciesEvolution(Species.WHIMSICOTT, 1, "Sun Stone", null, SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.WHIMSICOTT, 1, EvolutionItem.SUN_STONE, null, SpeciesWildEvolutionDelay.MEDIUM) ], [Species.PETILIL]: [ - new SpeciesEvolution(Species.LILLIGANT, 1, "Sun Stone", null, SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.LILLIGANT, 1, EvolutionItem.SUN_STONE, null, SpeciesWildEvolutionDelay.MEDIUM) ], [Species.MINCCINO]: [ - new SpeciesEvolution(Species.CINCCINO, 1, "Shiny Stone", null, SpeciesWildEvolutionDelay.SHORT) + new SpeciesEvolution(Species.CINCCINO, 1, EvolutionItem.SHINY_STONE, null, SpeciesWildEvolutionDelay.SHORT) ], [Species.EELEKTRIK]: [ - new SpeciesEvolution(Species.EELEKTROSS, 1, "Thunder Stone", null, SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.EELEKTROSS, 1, EvolutionItem.THUNDER_STONE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.LAMPENT]: [ - new SpeciesEvolution(Species.CHANDELURE, 1, "Dusk Stone", null, SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.CHANDELURE, 1, EvolutionItem.DUSK_STONE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.KADABRA]: [ - new SpeciesEvolution(Species.ALAKAZAM, 1, "Link Cable", null, SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.ALAKAZAM, 1, EvolutionItem.LINKING_CORD, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.MACHOKE]: [ - new SpeciesEvolution(Species.MACHAMP, 1, "Link Cable", null, SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.MACHAMP, 1, EvolutionItem.LINKING_CORD, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.GRAVELER]: [ - new SpeciesEvolution(Species.GOLEM, 1, "Link Cable", null, SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.GOLEM, 1, EvolutionItem.LINKING_CORD, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.HAUNTER]: [ - new SpeciesEvolution(Species.GENGAR, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.GENGAR, 1, EvolutionItem.LINKING_CORD, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.ONIX]: [ - new SpeciesEvolution(Species.STEELIX, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* Metal coat*/ ), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.STEELIX, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition( + (p: Pokemon) => p.scene.findModifier(m => m instanceof AttackTypeBoosterModifier && (m.type as AttackTypeBoosterModifierType).moveType === Type.STEEL)), + SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.RHYDON]: [ - new SpeciesEvolution(Species.RHYPERIOR, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* Protector */), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.RHYPERIOR, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition((p: Pokemon) => true /* Protector */), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.SEADRA]: [ - new SpeciesEvolution(Species.KINGDRA, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* Dragon scale*/), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.KINGDRA, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition((p: Pokemon) => true /* Dragon scale*/), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.SCYTHER]: [ - new SpeciesEvolution(Species.SCIZOR, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* Metal coat*/), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.SCIZOR, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition( + (p: Pokemon) => p.scene.findModifier(m => m instanceof AttackTypeBoosterModifier && (m.type as AttackTypeBoosterModifierType).moveType === Type.STEEL) ), + SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.ELECTABUZZ]: [ - new SpeciesEvolution(Species.ELECTIVIRE, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* Electirizer*/), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.ELECTIVIRE, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition((p: Pokemon) => true /* Electirizer*/), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.MAGMAR]: [ - new SpeciesEvolution(Species.MAGMORTAR, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* Magmarizer*/), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.MAGMORTAR, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition((p: Pokemon) => true /* Magmarizer*/), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.PORYGON]: [ - new SpeciesEvolution(Species.PORYGON2, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /*Upgrade*/), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.PORYGON2, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition((p: Pokemon) => true /*Upgrade*/), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.PORYGON2]: [ - new SpeciesEvolution(Species.PORYGON_Z, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* Dubious disc*/), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.PORYGON_Z, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition((p: Pokemon) => true /* Dubious disc*/), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.FEEBAS]: [ - new SpeciesEvolution(Species.MILOTIC, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* Prism scale*/), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.MILOTIC, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition((p: Pokemon) => true /* Prism scale*/), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.DUSCLOPS]: [ - new SpeciesEvolution(Species.DUSKNOIR, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* Reaper cloth*/), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.DUSKNOIR, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition((p: Pokemon) => true /* Reaper cloth*/), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.CLAMPERL]: [ - new SpeciesEvolution(Species.HUNTAIL, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* Deep sea tooth*/), SpeciesWildEvolutionDelay.MEDIUM), - new SpeciesEvolution(Species.GOREBYSS, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* Deep sea scale*/), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.HUNTAIL, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition((p: Pokemon) => true /* Deep sea tooth*/), SpeciesWildEvolutionDelay.MEDIUM), + new SpeciesEvolution(Species.GOREBYSS, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition((p: Pokemon) => true /* Deep sea scale*/), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.BOLDORE]: [ - new SpeciesEvolution(Species.GIGALITH, 1, "Link Cable", null, SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.GIGALITH, 1, EvolutionItem.LINKING_CORD, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.GURDURR]: [ - new SpeciesEvolution(Species.CONKELDURR, 1, "Link Cable", null, SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.CONKELDURR, 1, EvolutionItem.LINKING_CORD, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.KARRABLAST]: [ - new SpeciesEvolution(Species.ESCAVALIER, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* Trade with shelmet??*/), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.ESCAVALIER, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition((p: Pokemon) => p.scene.getParty().find(p => p.species.speciesId === Species.SHELMET)), SpeciesWildEvolutionDelay.LONG) ], [Species.SHELMET]: [ - new SpeciesEvolution(Species.ACCELGOR, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* Trade with karrablast??*/), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.ACCELGOR, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition((p: Pokemon) => p.scene.getParty().find(p => p.species.speciesId === Species.KARRABLAST)), SpeciesWildEvolutionDelay.LONG) ], [Species.PICHU]: [ new SpeciesEvolution(Species.PIKACHU, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10), SpeciesWildEvolutionDelay.SHORT) @@ -949,16 +975,16 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.MARILL, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10), SpeciesWildEvolutionDelay.SHORT) ], [Species.BUDEW]: [ - new SpeciesEvolution(Species.ROSELIA, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount > 10 /* daytime */), SpeciesWildEvolutionDelay.SHORT) + new SpeciesEvolution(Species.ROSELIA, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount > 10 && p.scene.arena.isDaytime()), SpeciesWildEvolutionDelay.SHORT) ], [Species.CHINGLING]: [ - new SpeciesEvolution(Species.CHIMECHO, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10 /* nighttime */), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.CHIMECHO, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10 && !p.scene.arena.isDaytime()), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.BUNEARY]: [ new SpeciesEvolution(Species.LOPUNNY, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.RIOLU]: [ - new SpeciesEvolution(Species.LUCARIO, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10 /* daytime */), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.LUCARIO, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10 && p.scene.arena.isDaytime()), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.WOOBAT]: [ new SpeciesEvolution(Species.SWOOBAT, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10), SpeciesWildEvolutionDelay.MEDIUM) diff --git a/src/pokemon.ts b/src/pokemon.ts index 65c78f137..2cfe24aa6 100644 --- a/src/pokemon.ts +++ b/src/pokemon.ts @@ -8,7 +8,7 @@ import * as Utils from './utils'; import { Type, getTypeDamageMultiplier } from './type'; import { getLevelTotalExp } from './exp'; import { Stat } from './pokemon-stat'; -import { PokemonBaseStatModifier as PokemonBaseStatBoosterModifier, ShinyRateBoosterModifier } from './modifier'; +import { AttackTypeBoosterModifier, PokemonBaseStatModifier as PokemonBaseStatBoosterModifier, ShinyRateBoosterModifier } from './modifier'; import { PokeballType } from './pokeball'; import { Gender } from './gender'; import { initMoveAnim, loadMoveAnimAssets } from './battle-anims'; @@ -18,6 +18,7 @@ import { pokemonEvolutions, SpeciesEvolution, SpeciesEvolutionCondition } from ' import { MessagePhase } from './battle-phases'; import { BattleStat } from './battle-stat'; import { BattleTag, BattleTagLapseType, BattleTagType } from './battle-tag'; +import { Species } from './species'; export default abstract class Pokemon extends Phaser.GameObjects.Container { public id: integer; @@ -95,11 +96,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const rand1 = Utils.binToDec(Utils.decToBin(this.id).substring(0, 16)); const rand2 = Utils.binToDec(Utils.decToBin(this.id).substring(16, 32)); - const E = (this.scene as BattleScene).trainerId ^ (this.scene as BattleScene).secretId; + const E = this.scene.trainerId ^ this.scene.secretId; const F = rand1 ^ rand2; let shinyThreshold = new Utils.IntegerHolder(32); - (this.scene as BattleScene).applyModifiers(ShinyRateBoosterModifier, shinyThreshold); + this.scene.applyModifiers(ShinyRateBoosterModifier, shinyThreshold); console.log(shinyThreshold.value); this.shiny = (E ^ F) < shinyThreshold.value; @@ -113,11 +114,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.winCount = 0; } - //this.setPipeline((this.scene as BattleScene).spritePipeline); + //this.setPipeline(this.scene).spritePipeline); this.calculateStats(); - (scene as BattleScene).fieldUI.addAt(this.battleInfo, 0); + scene.fieldUI.addAt(this.battleInfo, 0); this.battleInfo.initInfo(this); @@ -163,10 +164,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const moveIds = this.moveset.map(m => m.getMove().id); Promise.allSettled(moveIds.map(m => initMoveAnim(m))) .then(() => { - loadMoveAnimAssets(this.scene as BattleScene, moveIds); - this.species.loadAssets(this.scene as BattleScene, this.gender === Gender.FEMALE); + loadMoveAnimAssets(this.scene, moveIds); + this.species.loadAssets(this.scene, this.gender === Gender.FEMALE); if (this.isPlayer()) - (this.scene as BattleScene).loadAtlas(this.getBattleSpriteKey(), 'pokemon', this.getBattleSpriteAtlasPath()); + this.scene.loadAtlas(this.getBattleSpriteKey(), 'pokemon', this.getBattleSpriteAtlasPath()); this.scene.load.once(Phaser.Loader.Events.COMPLETE, () => { if (this.isPlayer()) { const originalWarn = console.warn; @@ -260,7 +261,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.stats = [ 0, 0, 0, 0, 0, 0 ]; const baseStats = this.species.baseStats.slice(0); console.log(this.id); - (this.scene as BattleScene).applyModifiers(PokemonBaseStatBoosterModifier, this, baseStats); + this.scene.applyModifiers(PokemonBaseStatBoosterModifier, this, baseStats); const stats = Utils.getEnumValues(Stat); for (let s of stats) { const isHp = s === Stat.HP; @@ -412,7 +413,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { apply(source: Pokemon, battlerMove: PokemonMove): Promise { return new Promise(resolve => { - const battleScene = this.scene as BattleScene; let result: MoveResult = MoveResult.STATUS; let success = false; const move = battlerMove.getMove(); @@ -422,15 +422,17 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { case MoveCategory.PHYSICAL: case MoveCategory.SPECIAL: const isPhysical = moveCategory === MoveCategory.PHYSICAL; + const power = new Utils.NumberHolder(move.power); + this.scene.applyModifiers(AttackTypeBoosterModifier, source, power); const critChance = new Utils.IntegerHolder(16); - applyMoveAttrs(HighCritAttr, this.scene as BattleScene, source, this, move, critChance); + applyMoveAttrs(HighCritAttr, this.scene, source, this, move, critChance); const isCritical = Utils.randInt(critChance.value) === 0; const sourceAtk = source.getBattleStat(isPhysical ? Stat.ATK : Stat.SPATK); const targetDef = this.getBattleStat(isPhysical ? Stat.DEF : Stat.SPDEF); const stabMultiplier = source.species.type1 === move.type || (source.species.type2 > -1 && source.species.type2 === move.type) ? 1.5 : 1; const typeMultiplier = getTypeDamageMultiplier(move.type, this.species.type1) * (this.species.type2 > -1 ? getTypeDamageMultiplier(move.type, this.species.type2) : 1); const criticalMultiplier = isCritical ? 2 : 1; - damage = Math.ceil(((((2 * source.level / 5 + 2) * move.power * sourceAtk / targetDef) / 50) + 2) * stabMultiplier * typeMultiplier * ((Utils.randInt(15) + 85) / 100)) * criticalMultiplier; + damage = Math.ceil(((((2 * source.level / 5 + 2) * power.value * sourceAtk / targetDef) / 50) + 2) * stabMultiplier * typeMultiplier * ((Utils.randInt(15) + 85) / 100)) * criticalMultiplier; if (isPhysical && source.status && source.status.effect === StatusEffect.BURN) damage = Math.floor(damage / 2); move.getAttrs(HitsTagAttr).map(hta => hta as HitsTagAttr).filter(hta => hta.doubleDamage).forEach(hta => { @@ -444,7 +446,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.hp = Math.max(this.hp - damage, 0); source.turnData.damageDealt += damage; if (isCritical) - battleScene.unshiftPhase(new MessagePhase(battleScene, 'A critical hit!')); + this.scene.unshiftPhase(new MessagePhase(this.scene, 'A critical hit!')); } if (typeMultiplier >= 2) result = MoveResult.SUPER_EFFECTIVE; @@ -462,16 +464,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { break; case MoveResult.SUPER_EFFECTIVE: this.scene.sound.play('hit_strong'); - battleScene.unshiftPhase(new MessagePhase(battleScene, 'It\'s super effective!')); + this.scene.unshiftPhase(new MessagePhase(this.scene, 'It\'s super effective!')); success = true; break; case MoveResult.NOT_VERY_EFFECTIVE: this.scene.sound.play('hit_weak'); - battleScene.unshiftPhase(new MessagePhase(battleScene, 'It\'s not very effective!')) + this.scene.unshiftPhase(new MessagePhase(this.scene, 'It\'s not very effective!')) success = true; break; case MoveResult.NO_EFFECT: - battleScene.unshiftPhase(new MessagePhase(battleScene, `It doesn\'t affect ${this.name}!`)) + this.scene.unshiftPhase(new MessagePhase(this.scene, `It doesn\'t affect ${this.name}!`)) success = true; break; } @@ -546,7 +548,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } cry(soundConfig?: Phaser.Types.Sound.SoundConfig): integer { - return this.species.cry(this.scene as BattleScene, soundConfig); + return this.species.cry(this.scene, soundConfig); } faintCry(callback: Function) { @@ -724,6 +726,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } +export default interface Pokemon { + scene: BattleScene +} + export class PlayerPokemon extends Pokemon { public compatibleTms: Moves[]; @@ -760,9 +766,10 @@ export class PlayerPokemon extends Pokemon { evolve(evolution: SpeciesEvolution): Promise { return new Promise(resolve => { + this.handleSpecialEvolutions(evolution); this.species = getPokemonSpecies(evolution.speciesId); this.name = this.species.name.toUpperCase(); - this.species.generateIconAnim(this.scene as BattleScene); + this.species.generateIconAnim(this.scene); this.compatibleTms.splice(0, this.compatibleTms.length); this.generateCompatibleTms(); this.loadAssets().then(() => { @@ -771,6 +778,17 @@ export class PlayerPokemon extends Pokemon { }); }); } + + private handleSpecialEvolutions(evolution: SpeciesEvolution) { + if (this.species.speciesId === Species.NINCADA && evolution.speciesId === Species.NINJASK) { + const newEvolution = pokemonEvolutions[this.species.speciesId][1]; + if (newEvolution.condition.predicate(this)) { + const newPokemon = new PlayerPokemon(this.scene, this.species, this.level); + this.scene.getParty().push(newPokemon); + newPokemon.evolve(newEvolution); + } + } + } } export class EnemyPokemon extends Pokemon { @@ -798,7 +816,7 @@ export class EnemyPokemon extends Pokemon { return movePool[Utils.randInt(movePool.length)]; case AiType.SMART_RANDOM: case AiType.SMART: - const target = (this.scene as BattleScene).getPlayerPokemon(); + const target = this.scene.getPlayerPokemon(); const moveScores = movePool.map(() => 0); for (let m in movePool) { const pokemonMove = movePool[m]; @@ -868,11 +886,11 @@ export class EnemyPokemon extends Pokemon { } addToParty() { - const party = (this.scene as BattleScene).getParty(); + const party = this.scene.getParty(); let ret: PlayerPokemon = null; if (party.length < 6) { - const newPokemon = new PlayerPokemon(this.scene as BattleScene, this.species, this.level, this); + const newPokemon = new PlayerPokemon(this.scene, this.species, this.level, this); party.push(newPokemon); ret = newPokemon; } diff --git a/src/ui/command-ui-handler.ts b/src/ui/command-ui-handler.ts index f9ada8aec..d39c3cb0b 100644 --- a/src/ui/command-ui-handler.ts +++ b/src/ui/command-ui-handler.ts @@ -43,7 +43,7 @@ export default class CommandUiHandler extends UiHandler { const messageHandler = this.getUi().getMessageHandler(); messageHandler.bg.setTexture('bg_command'); messageHandler.message.setWordWrapWidth(1110); - messageHandler.showText(`What will\n${(this.scene as BattleScene).getPlayerPokemon().name} do?`, 0); + messageHandler.showText(`What will\n${this.scene.getPlayerPokemon().name} do?`, 0); this.setCursor(this.cursor); } diff --git a/src/ui/fight-ui-handler.ts b/src/ui/fight-ui-handler.ts index 712116d0e..20d51f37c 100644 --- a/src/ui/fight-ui-handler.ts +++ b/src/ui/fight-ui-handler.ts @@ -49,7 +49,7 @@ export default class FightUiHandler extends UiHandler { if (button === Button.CANCEL || button === Button.ACTION) { if (button === Button.ACTION) { - if (((this.scene as BattleScene).getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, this.cursor)) + if ((this.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, this.cursor)) success = true; else ui.playError(); @@ -91,7 +91,7 @@ export default class FightUiHandler extends UiHandler { ui.add(this.cursorObj); } - const moveset = (this.scene as BattleScene).getPlayerPokemon().moveset; + const moveset = this.scene.getPlayerPokemon().moveset; const hasMove = cursor < moveset.length; @@ -114,7 +114,7 @@ export default class FightUiHandler extends UiHandler { } displayMoves() { - const moveset = (this.scene as BattleScene).getPlayerPokemon().moveset; + const moveset = this.scene.getPlayerPokemon().moveset; for (let m = 0; m < 4; m++) { const moveText = addTextObject(this.scene, m % 2 === 0 ? 0 : 100, m < 2 ? 0 : 16, '-', TextStyle.WINDOW); if (m < moveset.length) diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 6875d3a95..919422184 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -280,7 +280,7 @@ export default class PartyUiHandler extends MessageUiHandler { } populatePartySlots() { - const party = (this.scene as BattleScene).getParty(); + const party = this.scene.getParty(); if (this.cursor < 6 && this.cursor >= party.length) this.cursor = party.length - 1; @@ -289,7 +289,7 @@ export default class PartyUiHandler extends MessageUiHandler { for (let p in party) { const slotIndex = parseInt(p); - const partySlot = new PartySlot(this.scene as BattleScene, slotIndex, party[p]); + const partySlot = new PartySlot(this.scene, slotIndex, party[p]); this.scene.add.existing(partySlot); this.partySlotsContainer.add(partySlot); this.partySlots.push(partySlot);