diff --git a/README.md b/README.md index 44696972404..06b203eeb81 100644 --- a/README.md +++ b/README.md @@ -17,17 +17,12 @@ - Critical capture - Save data - Pokedex -- Battle info - - Owned icon - - Status effect indicator - Modifiers - PP Up - - Type enhancers - Various mainline game items for various enhancements - Items that cause effects on hit (?) - Capture rate booster - Balancing - - Modifiers - Biome pools - Custom art - Battle bases and backgrounds diff --git a/public/images/items.json b/public/images/items.json index 7b11c1d7756..0afac3bbe1a 100644 --- a/public/images/items.json +++ b/public/images/items.json @@ -4,8 +4,8 @@ "image": "items.png", "format": "RGBA8888", "size": { - "w": 229, - "h": 229 + "w": 234, + "h": 234 }, "scale": 1, "frames": [ @@ -45,8 +45,8 @@ "h": 24 }, "frame": { - "x": 27, - "y": 0, + "x": 0, + "y": 26, "w": 24, "h": 24 } @@ -66,7 +66,7 @@ "h": 24 }, "frame": { - "x": 51, + "x": 27, "y": 0, "w": 24, "h": 24 @@ -87,8 +87,8 @@ "h": 24 }, "frame": { - "x": 75, - "y": 0, + "x": 0, + "y": 50, "w": 24, "h": 24 } @@ -108,12 +108,33 @@ "h": 24 }, "frame": { - "x": 99, + "x": 51, "y": 0, "w": 24, "h": 24 } }, + { + "filename": "big_root", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 0, + "y": 74, + "w": 23, + "h": 24 + } + }, { "filename": "clefairy_doll", "rotated": false, @@ -129,7 +150,7 @@ "h": 23 }, "frame": { - "x": 123, + "x": 75, "y": 0, "w": 24, "h": 23 @@ -150,12 +171,33 @@ "h": 23 }, "frame": { - "x": 147, + "x": 99, "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": 0, + "y": 98, + "w": 23, + "h": 24 + } + }, { "filename": "scope-lens", "rotated": false, @@ -171,7 +213,7 @@ "h": 23 }, "frame": { - "x": 171, + "x": 123, "y": 0, "w": 24, "h": 23 @@ -192,75 +234,12 @@ "h": 23 }, "frame": { - "x": 195, + "x": 147, "y": 0, "w": 24, "h": 23 } }, - { - "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": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 146, - "y": 23, - "w": 23, - "h": 24 - } - }, - { - "filename": "rare_candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 169, - "y": 23, - "w": 23, - "h": 23 - } - }, { "filename": "exp_share", "rotated": false, @@ -276,33 +255,12 @@ "h": 22 }, "frame": { - "x": 192, - "y": 23, + "x": 171, + "y": 0, "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, @@ -318,75 +276,12 @@ "h": 24 }, "frame": { - "x": 192, - "y": 45, + "x": 0, + "y": 122, "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, @@ -402,8 +297,8 @@ "h": 23 }, "frame": { - "x": 27, - "y": 24, + "x": 0, + "y": 146, "w": 22, "h": 23 } @@ -424,7 +319,7 @@ }, "frame": { "x": 0, - "y": 26, + "y": 169, "w": 22, "h": 23 } @@ -444,14 +339,35 @@ "h": 23 }, "frame": { - "x": 49, - "y": 24, + "x": 0, + "y": 192, "w": 22, "h": 23 } }, { - "filename": "never_melt_ice", + "filename": "dubious_disc", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 0, + "y": 215, + "w": 22, + "h": 19 + } + }, + { + "filename": "healing_charm", "rotated": false, "trimmed": true, "sourceSize": { @@ -461,18 +377,18 @@ "spriteSourceSize": { "x": 5, "y": 5, - "w": 22, - "h": 23 + "w": 23, + "h": 22 }, "frame": { - "x": 71, - "y": 24, - "w": 22, - "h": 23 + "x": 195, + "y": 0, + "w": 23, + "h": 22 } }, { - "filename": "reaper_cloth", + "filename": "calcium", "rotated": false, "trimmed": true, "sourceSize": { @@ -480,18 +396,81 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 218, + "y": 0, + "w": 16, + "h": 24 + } + }, + { + "filename": "carbos", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 24, + "y": 26, + "w": 16, + "h": 24 + } + }, + { + "filename": "rare_candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, "y": 5, - "w": 22, + "w": 23, "h": 23 }, "frame": { - "x": 93, + "x": 40, "y": 24, - "w": 22, + "w": 23, "h": 23 } }, + { + "filename": "elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 24, + "y": 50, + "w": 18, + "h": 24 + } + }, { "filename": "oval_charm", "rotated": false, @@ -507,8 +486,8 @@ "h": 24 }, "frame": { - "x": 22, - "y": 47, + "x": 23, + "y": 74, "w": 21, "h": 24 } @@ -528,12 +507,54 @@ "h": 24 }, "frame": { - "x": 0, - "y": 49, + "x": 23, + "y": 98, "w": 21, "h": 24 } }, + { + "filename": "never_melt_ice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 22, + "y": 122, + "w": 22, + "h": 23 + } + }, + { + "filename": "reaper_cloth", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 22, + "y": 145, + "w": 22, + "h": 23 + } + }, { "filename": "charcoal", "rotated": false, @@ -549,8 +570,29 @@ "h": 22 }, "frame": { - "x": 43, - "y": 47, + "x": 22, + "y": 168, + "w": 22, + "h": 22 + } + }, + { + "filename": "dire_hit", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 22, + "y": 190, "w": 22, "h": 22 } @@ -570,197 +612,8 @@ "h": 22 }, "frame": { - "x": 65, - "y": 47, - "w": 22, - "h": 22 - } - }, - { - "filename": "ice_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 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, + "x": 22, + "y": 212, "w": 22, "h": 22 } @@ -780,810 +633,12 @@ "h": 23 }, "frame": { - "x": 0, - "y": 73, + "x": 42, + "y": 47, "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 - } - }, - { - "filename": "leaf_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 0, - "y": 96, - "w": 21, - "h": 23 - } - }, - { - "filename": "tm_ice", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 65, - "y": 91, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_normal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 87, - "y": 91, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_poison", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 109, - "y": 91, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_psychic", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 131, - "y": 91, - "w": 22, - "h": 22 - } - }, - { - "filename": "pp_max", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 153, - "y": 95, - "w": 16, - "h": 24 - } - }, - { - "filename": "tm_rock", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 169, - "y": 112, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_steel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 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, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 43, - "y": 113, - "w": 22, - "h": 22 - } - }, - { - "filename": "water_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 21, - "y": 115, - "w": 22, - "h": 22 - } - }, - { - "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": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 23, - "h": 20 - }, - "frame": { - "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": 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 - } - }, { "filename": "ether", "rotated": false, @@ -1599,8 +654,8 @@ "h": 24 }, "frame": { - "x": 42, - "y": 156, + "x": 44, + "y": 70, "w": 18, "h": 24 } @@ -1620,8 +675,8 @@ "h": 24 }, "frame": { - "x": 21, - "y": 158, + "x": 44, + "y": 94, "w": 18, "h": 24 } @@ -1641,33 +696,12 @@ "h": 24 }, "frame": { - "x": 0, - "y": 163, + "x": 44, + "y": 118, "w": 18, "h": 24 } }, - { - "filename": "dragon_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 24, - "h": 18 - }, - "frame": { - "x": 60, - "y": 172, - "w": 24, - "h": 18 - } - }, { "filename": "max_ether", "rotated": false, @@ -1683,8 +717,8 @@ "h": 24 }, "frame": { - "x": 39, - "y": 180, + "x": 44, + "y": 142, "w": 18, "h": 24 } @@ -1704,14 +738,161 @@ "h": 24 }, "frame": { - "x": 18, - "y": 182, + "x": 44, + "y": 166, "w": 18, "h": 24 } }, { - "filename": "potion", + "filename": "leaf_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 44, + "y": 190, + "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": 44, + "y": 213, + "w": 23, + "h": 21 + } + }, + { + "filename": "hp_up", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 63, + "y": 24, + "w": 16, + "h": 24 + } + }, + { + "filename": "guard_spec", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 79, + "y": 23, + "w": 22, + "h": 22 + } + }, + { + "filename": "ice_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 101, + "y": 23, + "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": 123, + "y": 23, + "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": 145, + "y": 23, + "w": 22, + "h": 22 + } + }, + { + "filename": "hyper_potion", "rotated": false, "trimmed": true, "sourceSize": { @@ -1725,12 +906,306 @@ "h": 23 }, "frame": { - "x": 0, - "y": 187, + "x": 63, + "y": 48, "w": 17, "h": 23 } }, + { + "filename": "sacred_ash", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 80, + "y": 45, + "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": 104, + "y": 45, + "w": 24, + "h": 20 + } + }, + { + "filename": "binding_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 23, + "h": 20 + }, + "frame": { + "x": 128, + "y": 45, + "w": 23, + "h": 20 + } + }, + { + "filename": "mystic_water", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 20, + "h": 23 + }, + "frame": { + "x": 62, + "y": 71, + "w": 20, + "h": 23 + } + }, + { + "filename": "sharp_beak", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 62, + "y": 94, + "w": 21, + "h": 23 + } + }, + { + "filename": "thunder_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 62, + "y": 117, + "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": 62, + "y": 139, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_dark", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 62, + "y": 161, + "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": 82, + "y": 65, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_electric", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 104, + "y": 65, + "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": 126, + "y": 65, + "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": 83, + "y": 87, + "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": 105, + "y": 87, + "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": 127, + "y": 87, + "w": 22, + "h": 22 + } + }, { "filename": "dawn_stone", "rotated": false, @@ -1746,35 +1221,14 @@ "h": 21 }, "frame": { - "x": 132, - "y": 136, + "x": 151, + "y": 45, "w": 20, "h": 21 } }, { - "filename": "super_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 152, - "y": 143, - "w": 17, - "h": 23 - } - }, - { - "filename": "dubious_disc", + "filename": "deep_sea_tooth", "rotated": false, "trimmed": true, "sourceSize": { @@ -1783,15 +1237,288 @@ }, "spriteSourceSize": { "x": 5, - "y": 7, + "y": 6, "w": 22, - "h": 19 + "h": 21 }, "frame": { - "x": 169, - "y": 155, + "x": 148, + "y": 66, "w": 22, - "h": 19 + "h": 21 + } + }, + { + "filename": "tm_ghost", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 149, + "y": 87, + "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": 84, + "y": 109, + "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": 84, + "y": 131, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_ice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 106, + "y": 109, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_normal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 84, + "y": 153, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_poison", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 106, + "y": 131, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_psychic", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 128, + "y": 109, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_rock", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 106, + "y": 153, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_steel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 128, + "y": 131, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_water", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 128, + "y": 153, + "w": 22, + "h": 22 + } + }, + { + "filename": "water_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 150, + "y": 109, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_accuracy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 150, + "y": 131, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_attack", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 150, + "y": 153, + "w": 22, + "h": 22 } }, { @@ -1809,14 +1536,14 @@ "h": 22 }, "frame": { - "x": 191, - "y": 158, + "x": 65, + "y": 183, "w": 19, "h": 22 } }, { - "filename": "spell_tag", + "filename": "x_defense", "rotated": false, "trimmed": true, "sourceSize": { @@ -1824,16 +1551,100 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 19, - "h": 21 + "x": 5, + "y": 5, + "w": 22, + "h": 22 }, "frame": { - "x": 210, - "y": 179, - "w": 19, - "h": 21 + "x": 84, + "y": 175, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_sp_atk", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 106, + "y": 175, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_sp_def", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 128, + "y": 175, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_speed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 150, + "y": 175, + "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": 84, + "y": 197, + "w": 24, + "h": 18 } }, { @@ -1851,12 +1662,348 @@ "h": 19 }, "frame": { - "x": 110, - "y": 154, + "x": 67, + "y": 215, "w": 22, "h": 19 } }, + { + "filename": "razor_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 89, + "y": 215, + "w": 20, + "h": 19 + } + }, + { + "filename": "dragon_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 24, + "h": 18 + }, + "frame": { + "x": 108, + "y": 197, + "w": 24, + "h": 18 + } + }, + { + "filename": "miracle_seed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 19, + "h": 19 + }, + "frame": { + "x": 109, + "y": 215, + "w": 19, + "h": 19 + } + }, + { + "filename": "oval_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 19 + }, + "frame": { + "x": 128, + "y": 215, + "w": 18, + "h": 19 + } + }, + { + "filename": "black_glasses", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 132, + "y": 197, + "w": 23, + "h": 17 + } + }, + { + "filename": "shell_bell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 23, + "h": 20 + }, + "frame": { + "x": 146, + "y": 214, + "w": 23, + "h": 20 + } + }, + { + "filename": "everstone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 17 + }, + "frame": { + "x": 155, + "y": 197, + "w": 20, + "h": 17 + } + }, + { + "filename": "deep_sea_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 169, + "y": 214, + "w": 22, + "h": 20 + } + }, + { + "filename": "metronome", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 167, + "y": 23, + "w": 17, + "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": 184, + "y": 22, + "w": 21, + "h": 21 + } + }, + { + "filename": "full_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 15, + "h": 23 + }, + "frame": { + "x": 171, + "y": 45, + "w": 15, + "h": 23 + } + }, + { + "filename": "iron", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 186, + "y": 43, + "w": 16, + "h": 24 + } + }, + { + "filename": "wise_glasses", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 170, + "y": 68, + "w": 23, + "h": 17 + } + }, + { + "filename": "poison_barb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 171, + "y": 85, + "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": 172, + "y": 106, + "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": 172, + "y": 127, + "w": 21, + "h": 21 + } + }, { "filename": "gb", "rotated": false, @@ -1872,33 +2019,12 @@ "h": 20 }, "frame": { - "x": 132, - "y": 157, + "x": 172, + "y": 148, "w": 20, "h": 20 } }, - { - "filename": "zinc", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 152, - "y": 166, - "w": 16, - "h": 24 - } - }, { "filename": "magnet", "rotated": false, @@ -1914,14 +2040,14 @@ "h": 20 }, "frame": { - "x": 168, - "y": 174, + "x": 172, + "y": 168, "w": 20, "h": 20 } }, { - "filename": "mb", + "filename": "potion", "rotated": false, "trimmed": true, "sourceSize": { @@ -1929,20 +2055,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 + "x": 8, + "y": 5, + "w": 17, + "h": 23 }, "frame": { - "x": 188, - "y": 180, - "w": 20, - "h": 20 + "x": 175, + "y": 188, + "w": 17, + "h": 23 } }, { - "filename": "pb", + "filename": "super_potion", "rotated": false, "trimmed": true, "sourceSize": { @@ -1950,20 +2076,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 + "x": 8, + "y": 5, + "w": 17, + "h": 23 }, "frame": { - "x": 84, - "y": 173, - "w": 20, - "h": 20 + "x": 191, + "y": 211, + "w": 17, + "h": 23 } }, { - "filename": "pb_gold", + "filename": "revive", "rotated": false, "trimmed": true, "sourceSize": { @@ -1971,20 +2097,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 + "x": 10, + "y": 8, + "w": 12, + "h": 17 }, "frame": { - "x": 57, - "y": 190, - "w": 20, - "h": 20 + "x": 205, + "y": 22, + "w": 12, + "h": 17 } }, { - "filename": "ub", + "filename": "golden_egg", "rotated": false, "trimmed": true, "sourceSize": { @@ -1992,15 +2118,15 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, + "x": 7, "y": 6, - "w": 20, + "w": 17, "h": 20 }, "frame": { - "x": 36, - "y": 204, - "w": 20, + "x": 217, + "y": 24, + "w": 17, "h": 20 } }, @@ -2019,117 +2145,12 @@ "h": 20 }, "frame": { - "x": 17, - "y": 206, + "x": 193, + "y": 67, "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, @@ -2145,8 +2166,8 @@ "h": 15 }, "frame": { - "x": 123, - "y": 194, + "x": 192, + "y": 87, "w": 24, "h": 15 } @@ -2166,14 +2187,14 @@ "h": 20 }, "frame": { - "x": 77, - "y": 193, + "x": 216, + "y": 44, "w": 18, "h": 20 } }, { - "filename": "oval_stone", + "filename": "mb", "rotated": false, "trimmed": true, "sourceSize": { @@ -2181,36 +2202,57 @@ "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, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, + "x": 6, "y": 6, - "w": 17, + "w": 20, "h": 20 }, "frame": { - "x": 95, - "y": 209, - "w": 17, + "x": 193, + "y": 102, + "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": 193, + "y": 122, + "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": 212, + "y": 64, + "w": 20, "h": 20 } }, @@ -2229,14 +2271,56 @@ "h": 20 }, "frame": { - "x": 112, - "y": 209, + "x": 216, + "y": 84, "w": 17, "h": 20 } }, { - "filename": "everstone", + "filename": "pp_max", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 213, + "y": 104, + "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": 213, + "y": 128, + "w": 16, + "h": 24 + } + }, + { + "filename": "ub", "rotated": false, "trimmed": true, "sourceSize": { @@ -2245,15 +2329,99 @@ }, "spriteSourceSize": { "x": 6, - "y": 8, + "y": 6, "w": 20, - "h": 17 + "h": 20 }, "frame": { - "x": 129, - "y": 209, + "x": 193, + "y": 142, "w": 20, - "h": 17 + "h": 20 + } + }, + { + "filename": "protein", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 192, + "y": 162, + "w": 16, + "h": 24 + } + }, + { + "filename": "zinc", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 192, + "y": 186, + "w": 16, + "h": 24 + } + }, + { + "filename": "spell_tag", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 19, + "h": 21 + }, + "frame": { + "x": 208, + "y": 162, + "w": 19, + "h": 21 + } + }, + { + "filename": "prism_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 208, + "y": 183, + "w": 15, + "h": 15 } } ] @@ -2262,6 +2430,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:ca7cdcfb7349d9ec8808e68c4d81012a:b87049b08a6be17ff53c8bfbe63513db:110e074689c9edd2c54833ce2e4d9270$" + "smartupdate": "$TexturePacker:SmartUpdate:b7cd9da26f45d03f815f0dd3e58a0e20:36ec8d239bc31067ead6e048a333cd97:110e074689c9edd2c54833ce2e4d9270$" } } diff --git a/public/images/items.png b/public/images/items.png index 8c5750cd0bb..05408871b29 100644 Binary files a/public/images/items.png and b/public/images/items.png differ diff --git a/public/images/items/dire_hit.png b/public/images/items/dire_hit.png new file mode 100644 index 00000000000..5917fd02d99 Binary files /dev/null and b/public/images/items/dire_hit.png differ diff --git a/public/images/items/guard_spec.png b/public/images/items/guard_spec.png new file mode 100644 index 00000000000..3efc9448404 Binary files /dev/null and b/public/images/items/guard_spec.png differ diff --git a/public/images/items/x_accuracy.png b/public/images/items/x_accuracy.png new file mode 100644 index 00000000000..d119a75f1bb Binary files /dev/null and b/public/images/items/x_accuracy.png differ diff --git a/public/images/items/x_attack.png b/public/images/items/x_attack.png new file mode 100644 index 00000000000..36c76da9486 Binary files /dev/null and b/public/images/items/x_attack.png differ diff --git a/public/images/items/x_defense.png b/public/images/items/x_defense.png new file mode 100644 index 00000000000..2eb14b06ffb Binary files /dev/null and b/public/images/items/x_defense.png differ diff --git a/public/images/items/x_sp_atk.png b/public/images/items/x_sp_atk.png new file mode 100644 index 00000000000..772f9fe3315 Binary files /dev/null and b/public/images/items/x_sp_atk.png differ diff --git a/public/images/items/x_sp_def.png b/public/images/items/x_sp_def.png new file mode 100644 index 00000000000..8c9baf03a4c Binary files /dev/null and b/public/images/items/x_sp_def.png differ diff --git a/public/images/items/x_speed.png b/public/images/items/x_speed.png new file mode 100644 index 00000000000..cbd1747142f Binary files /dev/null and b/public/images/items/x_speed.png differ diff --git a/src/battle-phases.ts b/src/battle-phases.ts index 5becd815cd3..7ababcdd304 100644 --- a/src/battle-phases.ts +++ b/src/battle-phases.ts @@ -5,18 +5,18 @@ import { allMoves, applyMoveAttrs, BypassSleepAttr, ChargeAttr, ConditionalMoveA import { Mode } from './ui/ui'; import { Command } from "./ui/command-ui-handler"; import { Stat } from "./pokemon-stat"; -import { ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, HitHealModifier } from "./modifier"; +import { ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, HitHealModifier, TempBattleStatBoosterModifier } from "./modifier"; import PartyUiHandler, { PartyOption, PartyUiMode } from "./ui/party-ui-handler"; import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getPokeballTintColor, PokeballType } from "./pokeball"; import { CommonAnim, CommonBattleAnim, MoveAnim, initMoveAnim, loadMoveAnimAssets } from "./battle-anims"; -import { StatusEffect, getStatusEffectActivationText, getStatusEffectHealText, getStatusEffectObtainText, getStatusEffectOverlapText } from "./status-effect"; +import { StatusEffect, getStatusEffectActivationText, getStatusEffectCatchRateMultiplier, getStatusEffectHealText, getStatusEffectObtainText, getStatusEffectOverlapText } from "./status-effect"; import { SummaryUiMode } from "./ui/summary-ui-handler"; import EvolutionSceneHandler from "./ui/evolution-scene-handler"; import { EvolutionPhase } from "./evolution-phase"; import { BattlePhase } from "./battle-phase"; import { BattleStat, getBattleStatLevelChangeDescription, getBattleStatName } from "./battle-stat"; import { Biome, biomeLinks } from "./biome"; -import { ModifierTypeOption, PokemonModifierType, PokemonMoveModifierType, getModifierTypeOptionsForWave, regenerateModifierPoolThresholds } from "./modifier-type"; +import { ModifierTypeOption, PokemonModifierType, PokemonMoveModifierType, TempBattleStat, getModifierTypeOptionsForWave, regenerateModifierPoolThresholds } from "./modifier-type"; import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; import { BattleTagLapseType, BattleTagType, HideSpriteTag as HiddenTag } from "./battle-tag"; import { getPokemonMessage } from "./messages"; @@ -103,6 +103,7 @@ export class EncounterPhase extends BattlePhase { end() { if (this.scene.getEnemyPokemon().shiny) this.scene.unshiftPhase(new ShinySparklePhase(this.scene, false)); + // TODO: Remove //this.scene.unshiftPhase(new SelectModifierPhase(this.scene)); @@ -531,6 +532,8 @@ export class TurnEndPhase extends BattlePhase { } start() { + super.start(); + const playerPokemon = this.scene.getPlayerPokemon(); const enemyPokemon = this.scene.getEnemyPokemon(); @@ -548,6 +551,24 @@ export class TurnEndPhase extends BattlePhase { } } +export class BattleEndPhase extends BattlePhase { + constructor(scene: BattleScene) { + super(scene); + } + + start() { + super.start(); + + const tempBattleStatBoosterModifiers = this.scene.getModifiers(TempBattleStatBoosterModifier) as TempBattleStatBoosterModifier[]; + for (let m of tempBattleStatBoosterModifiers) { + if (!m.lapse()) + this.scene.removeModifier(m); + } + + this.scene.updateModifiers().then(() => this.end()); + } +} + export abstract class PokemonPhase extends BattlePhase { protected player: boolean; @@ -805,14 +826,16 @@ abstract class MoveEffectPhase extends PokemonPhase { } if (this.move.getMove().category !== MoveCategory.STATUS) { - const userAccuracyLevel = this.getUserPokemon().summonData.battleStats[BattleStat.ACC]; - const targetEvasionLevel = this.getTargetPokemon().summonData.battleStats[BattleStat.EVA]; + const userAccuracyLevel = new Utils.IntegerHolder(this.getUserPokemon().summonData.battleStats[BattleStat.ACC]); + const targetEvasionLevel = new Utils.IntegerHolder(this.getTargetPokemon().summonData.battleStats[BattleStat.EVA]); + if (this.getUserPokemon().isPlayer()) + this.scene.applyModifiers(TempBattleStatBoosterModifier, TempBattleStat.ACC, userAccuracyLevel); const rand = Utils.randInt(100, 1); let accuracyMultiplier = 1; - if (userAccuracyLevel !== targetEvasionLevel) { - accuracyMultiplier = userAccuracyLevel > targetEvasionLevel - ? (3 + Math.min(userAccuracyLevel - targetEvasionLevel, 6)) / 3 - : 3 / (3 + Math.min(targetEvasionLevel - userAccuracyLevel, 6)); + if (userAccuracyLevel.value !== targetEvasionLevel.value) { + accuracyMultiplier = userAccuracyLevel.value > targetEvasionLevel.value + ? (3 + Math.min(userAccuracyLevel.value - targetEvasionLevel.value, 6)) / 3 + : 3 / (3 + Math.min(targetEvasionLevel.value - userAccuracyLevel.value, 6)); } return rand <= this.move.getMove().accuracy * accuracyMultiplier; } @@ -1172,7 +1195,7 @@ export class VictoryPhase extends PokemonPhase { const participantIds = this.scene.currentBattle.playerParticipantIds; const party = this.scene.getParty(); - const expShareModifier = this.scene.getModifier(ExpShareModifier) as ExpShareModifier; + const expShareModifier = this.scene.findModifier(m => m instanceof ExpShareModifier) as ExpShareModifier; const expValue = this.scene.getEnemyPokemon().getExpValue(); for (let pm = 0; pm < party.length; pm++) { const pokemon = party[pm]; @@ -1192,6 +1215,8 @@ export class VictoryPhase extends PokemonPhase { this.scene.unshiftPhase(new ExpPhase(this.scene, pm, expValue * expMultiplier)); } } + + this.scene.pushPhase(new BattleEndPhase(this.scene)); this.scene.pushPhase(new SelectModifierPhase(this.scene)); this.scene.newBattle(); @@ -1434,7 +1459,7 @@ export class AttemptCapturePhase extends BattlePhase { const _2h = 2 * pokemon.hp; const catchRate = pokemon.species.catchRate; const pokeballMultiplier = getPokeballCatchMultiplier(this.pokeballType); - const statusMultiplier = 1; + const statusMultiplier = pokemon.status ? getStatusEffectCatchRateMultiplier(pokemon.status.effect) : 1; const x = Math.round((((_3m - _2h) * catchRate * pokeballMultiplier) / _3m) * statusMultiplier); const y = Math.round(65536 / Math.sqrt(Math.sqrt(255 / x))); diff --git a/src/battle-scene.ts b/src/battle-scene.ts index f1e3c1d399a..acadfbca2a0 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -645,8 +645,18 @@ export default class BattleScene extends Phaser.Scene { }); } - getModifier(modifierType: { new(...args: any[]): Modifier }): Modifier { - return this.modifiers.find(m => m instanceof modifierType); + removeModifier(modifier: PersistentModifier): boolean { + const modifierIndex = this.modifiers.indexOf(modifier); + if (modifierIndex > -1) { + this.modifiers.splice(modifierIndex, 1); + return true; + } + + return false; + } + + getModifiers(modifierType: { new(...args: any[]): Modifier }): Modifier[] { + return this.modifiers.filter(m => m instanceof modifierType); } findModifier(modifierFilter: ModifierPredicate): Modifier { diff --git a/src/modifier-type.ts b/src/modifier-type.ts index 8fcca001650..133fa8aa16f 100644 --- a/src/modifier-type.ts +++ b/src/modifier-type.ts @@ -1,3 +1,4 @@ +import { BattleStat, getBattleStatName } from './battle-stat'; import * as Modifiers from './modifier'; import { AttackMove, Moves, allMoves } from './move'; import { PokeballType, getPokeballName } from './pokeball'; @@ -25,13 +26,15 @@ export class ModifierType { public name: string; public description: string; public iconImage: string; + public group: string; public tier: ModifierTier; private newModifierFunc: NewModifierFunc; - constructor(name: string, description: string, newModifierFunc: NewModifierFunc, iconImage?: string) { + constructor(name: string, description: string, newModifierFunc: NewModifierFunc, iconImage?: string, group?: string,) { this.name = name; this.description = description; this.iconImage = iconImage || name?.replace(/[ \-]/g, '_')?.toLowerCase(); + this.group = group || ''; this.newModifierFunc = newModifierFunc; } @@ -46,15 +49,15 @@ export class ModifierType { class AddPokeballModifierType extends ModifierType { constructor(pokeballType: PokeballType, count: integer, iconImage?: string) { - super(`${count}x ${getPokeballName(pokeballType)}`, `Receive ${getPokeballName(pokeballType)} x${count}`, (_type, _args) => new Modifiers.AddPokeballModifier(this, pokeballType, count), iconImage); + super(`${count}x ${getPokeballName(pokeballType)}`, `Receive ${getPokeballName(pokeballType)} x${count}`, (_type, _args) => new Modifiers.AddPokeballModifier(this, pokeballType, count), iconImage, 'pb'); } } export class PokemonModifierType extends ModifierType { public selectFilter: PokemonSelectFilter; - constructor(name: string, description: string, newModifierFunc: NewModifierFunc, selectFilter?: PokemonSelectFilter, iconImage?: string) { - super(name, description, newModifierFunc, iconImage); + constructor(name: string, description: string, newModifierFunc: NewModifierFunc, selectFilter?: PokemonSelectFilter, iconImage?: string, group?: string) { + super(name, description, newModifierFunc, iconImage, group); this.selectFilter = selectFilter; } @@ -64,14 +67,14 @@ export class PokemonHpRestoreModifierType extends PokemonModifierType { protected restorePoints: integer; protected percent: boolean; - constructor(name: string, restorePoints: integer, percent?: boolean, newModifierFunc?: NewModifierFunc, selectFilter?: PokemonSelectFilter, iconImage?: string) { + constructor(name: string, restorePoints: integer, percent?: boolean, newModifierFunc?: NewModifierFunc, selectFilter?: PokemonSelectFilter, iconImage?: string, group?: string) { super(name, `Restore ${restorePoints}${percent ? '%' : ''} HP for one POKéMON`, newModifierFunc || ((_type, args) => new Modifiers.PokemonHpRestoreModifier(this, (args[0] as PlayerPokemon).id, this.restorePoints, this.percent, false)), selectFilter || ((pokemon: PlayerPokemon) => { if (!pokemon.hp || pokemon.hp >= pokemon.getMaxHp()) return PartyUiHandler.NoEffectMessage; return null; - }), iconImage); + }), iconImage, group || 'potion'); this.restorePoints = restorePoints; this.percent = !!percent; @@ -85,7 +88,7 @@ export class PokemonReviveModifierType extends PokemonHpRestoreModifierType { if (pokemon.hp) return PartyUiHandler.NoEffectMessage; return null; - }), iconImage); + }), iconImage, 'revive'); this.description = `Revive one POKéMON and restore ${restorePercent}% HP`; this.selectFilter = (pokemon: PlayerPokemon) => { @@ -99,8 +102,9 @@ export class PokemonReviveModifierType extends PokemonHpRestoreModifierType { export abstract class PokemonMoveModifierType extends PokemonModifierType { public moveSelectFilter: PokemonMoveSelectFilter; - constructor(name: string, description: string, newModifierFunc: NewModifierFunc, selectFilter?: PokemonSelectFilter, moveSelectFilter?: PokemonMoveSelectFilter, iconImage?: string) { - super(name, description, newModifierFunc, selectFilter, iconImage); + constructor(name: string, description: string, newModifierFunc: NewModifierFunc, selectFilter?: PokemonSelectFilter, moveSelectFilter?: PokemonMoveSelectFilter, + iconImage?: string, group?: string) { + super(name, description, newModifierFunc, selectFilter, iconImage, group); this.moveSelectFilter = moveSelectFilter; } @@ -117,7 +121,7 @@ export class PokemonPpRestoreModifierType extends PokemonMoveModifierType { if (!pokemonMove.ppUsed) return PartyUiHandler.NoEffectMessage; return null; - }, iconImage); + }, iconImage, 'ether'); this.restorePoints = this.restorePoints; } @@ -132,12 +136,60 @@ export class PokemonAllMovePpRestoreModifierType extends PokemonModifierType { if (!pokemon.moveset.filter(m => m.ppUsed).length) return PartyUiHandler.NoEffectMessage; return null; - }, iconImage); + }, iconImage, 'elixir'); this.restorePoints = this.restorePoints; } } +export enum TempBattleStat { + ATK, + DEF, + SPATK, + SPDEF, + SPD, + ACC, + CRIT +} + +function getTempBattleStatName(tempBattleStat: TempBattleStat) { + if (tempBattleStat === TempBattleStat.CRIT) + return 'critical-hit ratio'; + return getBattleStatName(tempBattleStat as integer as BattleStat); +} + +function getTempBattleStatBoosterItemName(tempBattleStat: TempBattleStat) { + switch (tempBattleStat) { + case TempBattleStat.ATK: + return 'X Attack'; + case TempBattleStat.DEF: + return 'X Defense'; + case TempBattleStat.SPATK: + return 'X Sp. Atk'; + case TempBattleStat.SPDEF: + return 'X Sp. Def'; + case TempBattleStat.SPD: + return 'X Speed'; + case TempBattleStat.ACC: + return 'X Accuracy'; + case TempBattleStat.CRIT: + return 'Dire Hit'; + } +} + +export class TempBattleStatBoosterModifierType extends ModifierType { + public tempBattleStat: TempBattleStat; + + constructor(tempBattleStat: TempBattleStat) { + super(Utils.toPokemonUpperCase(getTempBattleStatBoosterItemName(tempBattleStat)), + `Increases the ${getTempBattleStatName(tempBattleStat)} of all party members by 1 stage for 5 battles`, + (_type, _args) => new Modifiers.TempBattleStatBoosterModifier(this, this.tempBattleStat), + getTempBattleStatBoosterItemName(tempBattleStat).replace(/\./g, '').replace(/[ ]/g, '_').toLowerCase()); + + this.tempBattleStat = tempBattleStat; + } +} + function getAttackTypeBoosterItemName(type: Type) { switch (type) { case Type.NORMAL: @@ -184,7 +236,7 @@ export class AttackTypeBoosterModifierType extends PokemonModifierType { 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%`, + super(Utils.toPokemonUpperCase(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()}`); @@ -200,6 +252,23 @@ export class PokemonLevelIncrementModifierType extends PokemonModifierType { } } +function getBaseStatBoosterItemName(stat: Stat) { + switch (stat) { + case Stat.HP: + return 'HP-UP'; + case Stat.ATK: + return 'PROTEIN'; + case Stat.DEF: + return 'IRON'; + case Stat.SPATK: + return 'CALCIUM'; + case Stat.SPDEF: + return 'ZINC'; + case Stat.SPD: + return 'CARBOS'; + } +} + export class PokemonBaseStatBoosterModifierType extends PokemonModifierType { private stat: Stat; @@ -237,7 +306,7 @@ export class TmModifierType extends PokemonModifierType { if (pokemon.compatibleTms.indexOf(moveId) === -1 || pokemon.moveset.filter(m => m?.moveId === moveId).length) return PartyUiHandler.NoEffectMessage; return null; - }, `tm_${Type[allMoves[moveId - 1].type].toLowerCase()}`); + }, `tm_${Type[allMoves[moveId - 1].type].toLowerCase()}`, 'tm'); this.moveId = moveId; } @@ -297,10 +366,8 @@ class ModifierTypeGenerator extends ModifierType { generateType(party: PlayerPokemon[]) { const ret = this.genTypeFunc(party); - if (ret) { - console.log(ret); + if (ret) ret.setTier(this.tier); - } return ret; } } @@ -374,25 +441,43 @@ class WeightedModifierType { } } +class WeightedModifierTypeGroup { + public modifierTypes: WeightedModifierType[]; + + constructor(...modifierTypes: WeightedModifierType[]) { + this.modifierTypes = modifierTypes; + } + + setTier(tier: ModifierTier) { + for (let modifierType of this.modifierTypes) + modifierType.setTier(tier); + } +} + const modifierPool = { [ModifierTier.COMMON]: [ - new WeightedModifierType(new AddPokeballModifierType(PokeballType.POKEBALL, 5, 'pb'), 2), + new WeightedModifierType(new AddPokeballModifierType(PokeballType.POKEBALL, 5, 'pb'), 6), + new WeightedModifierType(new PokemonLevelIncrementModifierType('RARE CANDY'), 2), new WeightedModifierType(new PokemonHpRestoreModifierType('POTION', 20), (party: PlayerPokemon[]) => { const thresholdPartyMemberCount = party.filter(p => p.getInverseHp() >= 10 || p.getHpRatio() <= 0.875).length; - return thresholdPartyMemberCount; + return thresholdPartyMemberCount * 3; }), new WeightedModifierType(new PokemonHpRestoreModifierType('SUPER POTION', 50), (party: PlayerPokemon[]) => { const thresholdPartyMemberCount = party.filter(p => p.getInverseHp() >= 25 || p.getHpRatio() <= 0.75).length; - return Math.ceil(thresholdPartyMemberCount / 3); - }), - new WeightedModifierType(new PokemonPpRestoreModifierType('ETHER', 10), (party: PlayerPokemon[]) => { - const thresholdPartyMemberCount = party.filter(p => p.moveset.filter(m => m.ppUsed >= 5).length).length; return thresholdPartyMemberCount; }), + new WeightedModifierType(new PokemonPpRestoreModifierType('ETHER', 10), (party: PlayerPokemon[]) => { + const thresholdPartyMemberCount = party.filter(p => p.hp && p.moveset.filter(m => (m.getMove().pp - m.ppUsed) <= 5).length).length; + return thresholdPartyMemberCount * 3; + }), new WeightedModifierType(new PokemonPpRestoreModifierType('MAX ETHER', -1), (party: PlayerPokemon[]) => { - const thresholdPartyMemberCount = party.filter(p => p.moveset.filter(m => m.ppUsed > 10).length).length; - return Math.ceil(thresholdPartyMemberCount / 3); - }) + const thresholdPartyMemberCount = party.filter(p => p.hp && p.moveset.filter(m => (m.getMove().pp - m.ppUsed) <= 5).length).length; + return thresholdPartyMemberCount; + }), + new WeightedModifierType(new ModifierTypeGenerator((party: PlayerPokemon[]) => { + const randTempBattleStat = Utils.randInt(7) as TempBattleStat; + return new TempBattleStatBoosterModifierType(randTempBattleStat); + }), 4) ].map(m => { m.setTier(ModifierTier.COMMON); return m; }), [ModifierTier.GREAT]: [ new WeightedModifierType(new AddPokeballModifierType(PokeballType.GREAT_BALL, 5, 'gb'), 12), @@ -416,11 +501,11 @@ const modifierPool = { 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; + const thresholdPartyMemberCount = party.filter(p => p.hp && p.moveset.filter(m => (m.getMove().pp - m.ppUsed) <= 5).length).length; 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; + const thresholdPartyMemberCount = party.filter(p => p.hp && p.moveset.filter(m => (m.getMove().pp - m.ppUsed) <= 5).length).length; return Math.ceil(thresholdPartyMemberCount / 1.5); }), new WeightedModifierType(new ModifierTypeGenerator((party: PlayerPokemon[]) => { @@ -429,13 +514,11 @@ const modifierPool = { const randTmIndex = Utils.randInt(uniqueCompatibleTms.length); return new TmModifierType(uniqueCompatibleTms[randTmIndex]); }), 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) + 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'), 2), + new WeightedModifierType(new ModifierTypeGenerator((party: PlayerPokemon[]) => { + const randStat = Utils.randInt(6) as Stat; + return new PokemonBaseStatBoosterModifierType(getBaseStatBoosterItemName(randStat), randStat); + }), 4) ].map(m => { m.setTier(ModifierTier.GREAT); return m; }), [ModifierTier.ULTRA]: [ new WeightedModifierType(new AddPokeballModifierType(PokeballType.ULTRA_BALL, 5, 'ub'), 8), @@ -444,9 +527,8 @@ const modifierPool = { 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 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) + 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)), 2), + new WeightedModifierType(new ExpBoosterModifierType('LUCKY EGG', 25), 4) ].map(m => { m.setTier(ModifierTier.ULTRA); return m; }), [ModifierTier.MASTER]: [ new AddPokeballModifierType(PokeballType.MASTER_BALL, 1, 'mb'), @@ -486,13 +568,21 @@ export function regenerateModifierPoolThresholds(party: PlayerPokemon[]) { }, 0); return [ t, Object.fromEntries(thresholds) ] }))); - console.log(modifierPoolThresholds) } export function getModifierTypeOptionsForWave(waveIndex: integer, count: integer, party: PlayerPokemon[]): ModifierTypeOption[] { if (waveIndex % 10 === 0) return modifierPool[ModifierTier.LUXURY].map(m => new ModifierTypeOption(m, false)); - return new Array(count).fill(0).map(() => getNewModifierTypeOption(party)); + const options: ModifierTypeOption[] = []; + const retryCount = Math.min(count * 5, 50); + new Array(count).fill(0).map(() => { + let candidate = getNewModifierTypeOption(party); + let r = 0; + while (options.length && ++r < retryCount && options.filter(o => o.type.name === candidate.type.name || o.type.group === candidate.type.group).length) + candidate = getNewModifierTypeOption(party, candidate.type.tier, candidate.upgraded); + options.push(candidate); + }); + return options; } function getNewModifierTypeOption(party: PlayerPokemon[], tier?: ModifierTier, upgrade?: boolean): ModifierTypeOption { diff --git a/src/modifier.ts b/src/modifier.ts index 20a8d1f8852..7a992e82c67 100644 --- a/src/modifier.ts +++ b/src/modifier.ts @@ -131,7 +131,7 @@ export abstract class PersistentModifier extends Modifier { const maxStrokeColor = '#984038'; if (virtual) { - const virtualText = addTextObject(scene, 1 * 11 + 16, 12, `+${this.virtualStackCount.toString()}`, TextStyle.PARTY, { fontSize: '66px', color: !isStackMax ? '#40c8f8' : maxColor }); + const virtualText = addTextObject(scene, 27, 12, `+${this.virtualStackCount.toString()}`, TextStyle.PARTY, { fontSize: '66px', color: !isStackMax ? '#40c8f8' : maxColor }); virtualText.setShadow(0, 0, null); virtualText.setStroke(!isStackMax ? '#006090' : maxStrokeColor, 16) virtualText.setOrigin(1, 0); @@ -181,6 +181,50 @@ export class AddPokeballModifier extends ConsumableModifier { } } +export class TempBattleStatBoosterModifier extends PersistentModifier { + private tempBattleStat: ModifierTypes.TempBattleStat; + private battlesLeft: integer; + + constructor(type: ModifierTypes.TempBattleStatBoosterModifierType, tempBattleStat: ModifierTypes.TempBattleStat) { + super(type); + + this.tempBattleStat = tempBattleStat; + this.battlesLeft = 5; + } + + clone(): TempBattleStatBoosterModifier { + return new TempBattleStatBoosterModifier(this.type as ModifierTypes.TempBattleStatBoosterModifierType, this.tempBattleStat); + } + + apply(args: any[]): boolean { + const tempBattleStat = args[0] as ModifierTypes.TempBattleStat; + + if (tempBattleStat === this.tempBattleStat) { + const statLevel = args[1] as Utils.IntegerHolder; + statLevel.value = Math.min(statLevel.value + 1, 6); + return true; + } + + return false; + } + + lapse(): boolean { + return !!--this.battlesLeft; + } + + getIcon(scene: BattleScene): Phaser.GameObjects.Container { + const container = super.getIcon(scene); + + const battleCountText = addTextObject(scene, 27, 0, this.battlesLeft.toString(), TextStyle.PARTY, { fontSize: '66px', color: '#f89890' }); + battleCountText.setShadow(0, 0, null); + battleCountText.setStroke('#984038', 16) + battleCountText.setOrigin(1, 0); + container.add(battleCountText); + + return container; + } +} + export abstract class PokemonHeldItemModifier extends PersistentModifier { public pokemonId: integer; @@ -387,7 +431,6 @@ export class PokemonPpRestoreModifier extends ConsumablePokemonMoveModifier { apply(args: any[]): boolean { const pokemon = args[0] as Pokemon; const move = pokemon.moveset[this.moveIndex]; - console.log(move.ppUsed, this.restorePoints, this.restorePoints >= -1 ? Math.max(move.ppUsed - this.restorePoints, 0) : 0); move.ppUsed = this.restorePoints >= -1 ? Math.max(move.ppUsed - this.restorePoints, 0) : 0; return true; diff --git a/src/move.ts b/src/move.ts index 233e33a95d5..de9e23058a2 100644 --- a/src/move.ts +++ b/src/move.ts @@ -1,7 +1,7 @@ import { ChargeAnim, MoveChargeAnim, initMoveAnim, loadMoveAnimAssets } from "./battle-anims"; import { DamagePhase, EnemyMovePhase, MessagePhase, ObtainStatusEffectPhase, PlayerMovePhase, PokemonHealPhase, StatChangePhase } from "./battle-phases"; import { BattleStat } from "./battle-stat"; -import { BattleTagType, ProtectedTag } from "./battle-tag"; +import { BattleTagType } from "./battle-tag"; import { getPokemonMessage } from "./messages"; import Pokemon, { EnemyPokemon, MoveResult, PlayerPokemon, PokemonMove, TurnMove } from "./pokemon"; import { StatusEffect } from "./status-effect"; @@ -684,8 +684,7 @@ export class MoveHitEffectAttr extends MoveAttr { export class HighCritAttr extends MoveAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const critChance = args[0] as Utils.IntegerHolder; - critChance.value /= 2; + (args[0] as Utils.IntegerHolder).value++; return true; } diff --git a/src/pokemon.ts b/src/pokemon.ts index 4ab358e6d82..b2417c40aa2 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 { AttackTypeBoosterModifier, PokemonBaseStatModifier as PokemonBaseStatBoosterModifier, ShinyRateBoosterModifier } from './modifier'; +import { AttackTypeBoosterModifier, PokemonBaseStatModifier as PokemonBaseStatBoosterModifier, ShinyRateBoosterModifier, TempBattleStatBoosterModifier } from './modifier'; import { PokeballType } from './pokeball'; import { Gender } from './gender'; import { initMoveAnim, loadMoveAnimAssets } from './battle-anims'; @@ -20,6 +20,7 @@ import { BattleStat } from './battle-stat'; import { BattleTag, BattleTagLapseType, BattleTagType, getBattleTag } from './battle-tag'; import { Species } from './species'; import { WeatherType } from './weather'; +import { TempBattleStat } from './modifier-type'; export default abstract class Pokemon extends Phaser.GameObjects.Container { public id: integer; @@ -263,8 +264,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { getBattleStat(stat: Stat): integer { if (stat === Stat.HP) return this.stats[Stat.HP]; - const statLevel = this.summonData.battleStats[(stat - 1) as BattleStat]; - let ret = this.stats[stat] * (Math.max(2, 2 + statLevel) / Math.max(2, 2 - statLevel)); + const battleStat = (stat - 1) as BattleStat; + const statLevel = new Utils.IntegerHolder(this.summonData.battleStats[battleStat]); + if (this.isPlayer()) + this.scene.applyModifiers(TempBattleStatBoosterModifier, battleStat as integer as TempBattleStat, statLevel); + let ret = this.stats[stat] * (Math.max(2, 2 + statLevel.value) / Math.max(2, 2 - statLevel.value)); if (stat === Stat.SPDEF && this.scene.arena.weather?.weatherType === WeatherType.SANDSTORM) ret *= 1.5; if (this.status && this.status.effect === StatusEffect.PARALYSIS) @@ -461,9 +465,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const weatherTypeMultiplier = this.scene.arena.getAttackTypeMultiplier(move.type); applyMoveAttrs(VariablePowerAttr, source, this, move, power); this.scene.applyModifiers(AttackTypeBoosterModifier, source, power); - const critChance = new Utils.IntegerHolder(16); - applyMoveAttrs(HighCritAttr, source, this, move, critChance); - let isCritical = Utils.randInt(critChance.value) === 0; + const critLevel = new Utils.IntegerHolder(0); + applyMoveAttrs(HighCritAttr, source, this, move, critLevel); + if (source.isPlayer()) + this.scene.applyModifiers(TempBattleStatBoosterModifier, TempBattleStat.CRIT, critLevel); + const critChance = Math.ceil(16 / Math.pow(2, critLevel.value)); + let isCritical = critChance === 1 || !Utils.randInt(critChance); 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 !== null && source.species.type2 === move.type) ? 1.5 : 1; diff --git a/src/status-effect.ts b/src/status-effect.ts index a829b9f7af2..96d6109f84d 100644 --- a/src/status-effect.ts +++ b/src/status-effect.ts @@ -103,4 +103,19 @@ export function getStatusEffectHealText(statusEffect: StatusEffect) { } return ''; +} + +export function getStatusEffectCatchRateMultiplier(statusEffect: StatusEffect) { + switch (statusEffect) { + case StatusEffect.POISON: + case StatusEffect.TOXIC: + case StatusEffect.PARALYSIS: + case StatusEffect.BURN: + return 1.5; + case StatusEffect.SLEEP: + case StatusEffect.FREEZE: + return 2.5; + } + + return 1; } \ No newline at end of file