diff --git a/public/images/items.json b/public/images/items.json index 91d9ed7c65c..86792e23cc0 100644 --- a/public/images/items.json +++ b/public/images/items.json @@ -72,6 +72,27 @@ "h": 28 } }, + { + "filename": "ribbon-gen4", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 30, + "h": 28 + }, + "frame": { + "x": 29, + "y": 27, + "w": 30, + "h": 28 + } + }, { "filename": "ribbon_gen4", "rotated": false, @@ -93,6 +114,27 @@ "h": 28 } }, + { + "filename": "ribbon-gen2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 28, + "h": 28 + }, + "frame": { + "x": 0, + "y": 58, + "w": 28, + "h": 28 + } + }, { "filename": "ribbon_gen2", "rotated": false, @@ -240,6 +282,27 @@ "h": 31 } }, + { + "filename": "ribbon-gen3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 22, + "h": 29 + }, + "frame": { + "x": 0, + "y": 241, + "w": 22, + "h": 29 + } + }, { "filename": "ribbon_gen3", "rotated": false, @@ -261,6 +324,27 @@ "h": 29 } }, + { + "filename": "ribbon-gen7", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 22, + "h": 29 + }, + "frame": { + "x": 0, + "y": 270, + "w": 22, + "h": 29 + } + }, { "filename": "ribbon_gen7", "rotated": false, @@ -282,6 +366,27 @@ "h": 29 } }, + { + "filename": "ribbon-gen9", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 22, + "h": 29 + }, + "frame": { + "x": 0, + "y": 299, + "w": 22, + "h": 29 + } + }, { "filename": "ribbon_gen9", "rotated": false, @@ -324,6 +429,27 @@ "h": 26 } }, + { + "filename": "ribbon-gen1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 22, + "h": 28 + }, + "frame": { + "x": 0, + "y": 328, + "w": 22, + "h": 28 + } + }, { "filename": "ribbon_gen1", "rotated": false, @@ -345,6 +471,27 @@ "h": 28 } }, + { + "filename": "ribbon-gen5", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 22, + "h": 28 + }, + "frame": { + "x": 0, + "y": 356, + "w": 22, + "h": 28 + } + }, { "filename": "ribbon_gen5", "rotated": false, @@ -366,6 +513,27 @@ "h": 28 } }, + { + "filename": "ribbon-gen6", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 22, + "h": 28 + }, + "frame": { + "x": 0, + "y": 384, + "w": 22, + "h": 28 + } + }, { "filename": "ribbon_gen6", "rotated": false, @@ -744,6 +912,27 @@ "h": 30 } }, + { + "filename": "ribbon-gen8", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 22, + "h": 28 + }, + "frame": { + "x": 22, + "y": 209, + "w": 22, + "h": 28 + } + }, { "filename": "ribbon_gen8", "rotated": false, @@ -6289,16 +6478,16 @@ } }, { - "filename": "razor_claw", + "filename": "power_herb", "rotated": false, "trimmed": true, "sourceSize": { - "w": 32, - "h": 32 + "w": 24, + "h": 24 }, "spriteSourceSize": { - "x": 6, - "y": 7, + "x": 2, + "y": 3, "w": 20, "h": 19 }, @@ -6330,6 +6519,27 @@ "h": 16 } }, + { + "filename": "razor_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 149, + "y": 366, + "w": 20, + "h": 19 + } + }, { "filename": "smooth_meteorite", "rotated": false, @@ -6345,12 +6555,75 @@ "h": 20 }, "frame": { - "x": 149, - "y": 366, + "x": 170, + "y": 309, "w": 20, "h": 20 } }, + { + "filename": "strange_ball", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 169, + "y": 329, + "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": 169, + "y": 349, + "w": 20, + "h": 20 + } + }, + { + "filename": "white_herb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 24, + "h": 24 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 20, + "h": 19 + }, + "frame": { + "x": 169, + "y": 369, + "w": 20, + "h": 19 + } + }, { "filename": "eviolite", "rotated": false, @@ -6373,7 +6646,7 @@ } }, { - "filename": "strange_ball", + "filename": "wl_ability_urge", "rotated": false, "trimmed": true, "sourceSize": { @@ -6382,36 +6655,15 @@ }, "spriteSourceSize": { "x": 6, - "y": 6, + "y": 8, "w": 20, - "h": 20 + "h": 18 }, "frame": { - "x": 170, - "y": 309, + "x": 149, + "y": 385, "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": 169, - "y": 329, - "w": 20, - "h": 20 + "h": 18 } }, { @@ -6429,14 +6681,14 @@ "h": 20 }, "frame": { - "x": 169, - "y": 349, + "x": 148, + "y": 403, "w": 19, "h": 20 } }, { - "filename": "miracle_seed", + "filename": "golden_egg", "rotated": false, "trimmed": true, "sourceSize": { @@ -6444,83 +6696,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 19, - "h": 19 + "x": 7, + "y": 6, + "w": 17, + "h": 20 }, "frame": { - "x": 169, - "y": 369, - "w": 19, - "h": 19 + "x": 167, + "y": 403, + "w": 17, + "h": 20 } }, { - "filename": "wl_ability_urge", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 149, - "y": 386, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_antidote", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 148, - "y": 404, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_awakening", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 169, - "y": 388, - "w": 20, - "h": 18 - } - }, - { - "filename": "absolite", + "filename": "candy_overlay", "rotated": false, "trimmed": true, "sourceSize": { @@ -6529,19 +6718,61 @@ }, "spriteSourceSize": { "x": 8, - "y": 8, + "y": 12, "w": 16, - "h": 16 + "h": 15 }, "frame": { - "x": 168, - "y": 406, + "x": 169, + "y": 388, "w": 16, - "h": 16 + "h": 15 } }, { - "filename": "aerodactylite", + "filename": "lucky_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 17, + "h": 20 + }, + "frame": { + "x": 184, + "y": 403, + "w": 17, + "h": 20 + } + }, + { + "filename": "prism_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 185, + "y": 388, + "w": 15, + "h": 15 + } + }, + { + "filename": "absolite", "rotated": false, "trimmed": true, "sourceSize": { @@ -6583,7 +6814,7 @@ } }, { - "filename": "wl_burn_heal", + "filename": "wl_antidote", "rotated": false, "trimmed": true, "sourceSize": { @@ -6604,7 +6835,7 @@ } }, { - "filename": "golden_egg", + "filename": "miracle_seed", "rotated": false, "trimmed": true, "sourceSize": { @@ -6612,20 +6843,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 17, - "h": 20 + "x": 6, + "y": 7, + "w": 19, + "h": 19 }, "frame": { "x": 190, "y": 309, - "w": 17, - "h": 20 + "w": 19, + "h": 19 } }, { - "filename": "lucky_egg", + "filename": "wl_awakening", "rotated": false, "trimmed": true, "sourceSize": { @@ -6633,16 +6864,37 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 17, - "h": 20 + "x": 6, + "y": 8, + "w": 20, + "h": 18 }, "frame": { - "x": 189, - "y": 329, - "w": 17, - "h": 20 + "x": 209, + "y": 308, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_burn_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 229, + "y": 308, + "w": 20, + "h": 18 } }, { @@ -6660,7 +6912,7 @@ "h": 18 }, "frame": { - "x": 207, + "x": 249, "y": 308, "w": 20, "h": 18 @@ -6681,8 +6933,8 @@ "h": 18 }, "frame": { - "x": 227, - "y": 308, + "x": 328, + "y": 306, "w": 20, "h": 18 } @@ -6702,12 +6954,33 @@ "h": 18 }, "frame": { - "x": 247, - "y": 308, + "x": 348, + "y": 306, "w": 20, "h": 18 } }, + { + "filename": "aerodactylite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 368, + "y": 316, + "w": 16, + "h": 16 + } + }, { "filename": "light_stone", "rotated": false, @@ -6723,54 +6996,12 @@ "h": 18 }, "frame": { - "x": 188, - "y": 349, + "x": 384, + "y": 325, "w": 18, "h": 18 } }, - { - "filename": "toxic_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 188, - "y": 367, - "w": 18, - "h": 18 - } - }, - { - "filename": "aggronite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 267, - "y": 308, - "w": 16, - "h": 16 - } - }, { "filename": "wl_ether", "rotated": false, @@ -6786,8 +7017,8 @@ "h": 18 }, "frame": { - "x": 283, - "y": 309, + "x": 402, + "y": 335, "w": 20, "h": 18 } @@ -6807,12 +7038,33 @@ "h": 18 }, "frame": { - "x": 189, - "y": 385, + "x": 269, + "y": 309, "w": 20, "h": 18 } }, + { + "filename": "toxic_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 289, + "y": 309, + "w": 18, + "h": 18 + } + }, { "filename": "wl_full_restore", "rotated": false, @@ -6828,8 +7080,8 @@ "h": 18 }, "frame": { - "x": 189, - "y": 403, + "x": 307, + "y": 308, "w": 20, "h": 18 } @@ -6849,7 +7101,7 @@ "h": 18 }, "frame": { - "x": 207, + "x": 209, "y": 326, "w": 20, "h": 18 @@ -6870,7 +7122,7 @@ "h": 18 }, "frame": { - "x": 227, + "x": 229, "y": 326, "w": 20, "h": 18 @@ -6891,7 +7143,7 @@ "h": 18 }, "frame": { - "x": 247, + "x": 249, "y": 326, "w": 20, "h": 18 @@ -6912,8 +7164,8 @@ "h": 18 }, "frame": { - "x": 206, - "y": 344, + "x": 269, + "y": 327, "w": 20, "h": 18 } @@ -6933,8 +7185,8 @@ "h": 18 }, "frame": { - "x": 206, - "y": 362, + "x": 289, + "y": 327, "w": 20, "h": 18 } @@ -6954,8 +7206,8 @@ "h": 18 }, "frame": { - "x": 226, - "y": 344, + "x": 309, + "y": 326, "w": 20, "h": 18 } @@ -6975,8 +7227,8 @@ "h": 18 }, "frame": { - "x": 226, - "y": 362, + "x": 329, + "y": 324, "w": 20, "h": 18 } @@ -6996,8 +7248,8 @@ "h": 18 }, "frame": { - "x": 246, - "y": 344, + "x": 189, + "y": 329, "w": 20, "h": 18 } @@ -7017,33 +7269,12 @@ "h": 18 }, "frame": { - "x": 246, - "y": 362, + "x": 189, + "y": 347, "w": 20, "h": 18 } }, - { - "filename": "alakazite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 267, - "y": 324, - "w": 16, - "h": 16 - } - }, { "filename": "wl_paralyze_heal", "rotated": false, @@ -7060,7 +7291,7 @@ }, "frame": { "x": 209, - "y": 380, + "y": 344, "w": 20, "h": 18 } @@ -7080,8 +7311,8 @@ "h": 18 }, "frame": { - "x": 209, - "y": 398, + "x": 189, + "y": 365, "w": 20, "h": 18 } @@ -7102,7 +7333,7 @@ }, "frame": { "x": 229, - "y": 380, + "y": 344, "w": 20, "h": 18 } @@ -7122,8 +7353,8 @@ "h": 18 }, "frame": { - "x": 229, - "y": 398, + "x": 249, + "y": 344, "w": 20, "h": 18 } @@ -7143,12 +7374,54 @@ "h": 18 }, "frame": { - "x": 249, - "y": 380, + "x": 209, + "y": 362, "w": 20, "h": 18 } }, + { + "filename": "aggronite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 349, + "y": 324, + "w": 16, + "h": 16 + } + }, + { + "filename": "alakazite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 269, + "y": 345, + "w": 16, + "h": 16 + } + }, { "filename": "altarianite", "rotated": false, @@ -7164,8 +7437,8 @@ "h": 16 }, "frame": { - "x": 249, - "y": 398, + "x": 229, + "y": 362, "w": 16, "h": 16 } @@ -7185,8 +7458,8 @@ "h": 16 }, "frame": { - "x": 283, - "y": 327, + "x": 285, + "y": 345, "w": 16, "h": 16 } @@ -7206,8 +7479,8 @@ "h": 16 }, "frame": { - "x": 267, - "y": 340, + "x": 245, + "y": 362, "w": 16, "h": 16 } @@ -7227,8 +7500,8 @@ "h": 16 }, "frame": { - "x": 266, - "y": 356, + "x": 301, + "y": 345, "w": 16, "h": 16 } @@ -7248,8 +7521,8 @@ "h": 16 }, "frame": { - "x": 283, - "y": 343, + "x": 317, + "y": 344, "w": 16, "h": 16 } @@ -7269,8 +7542,8 @@ "h": 16 }, "frame": { - "x": 282, - "y": 359, + "x": 333, + "y": 342, "w": 16, "h": 16 } @@ -7290,8 +7563,8 @@ "h": 16 }, "frame": { - "x": 265, - "y": 398, + "x": 349, + "y": 340, "w": 16, "h": 16 } @@ -7311,8 +7584,8 @@ "h": 16 }, "frame": { - "x": 299, - "y": 327, + "x": 365, + "y": 332, "w": 16, "h": 16 } @@ -7332,8 +7605,8 @@ "h": 16 }, "frame": { - "x": 299, - "y": 343, + "x": 261, + "y": 362, "w": 16, "h": 16 } @@ -7353,8 +7626,8 @@ "h": 16 }, "frame": { - "x": 298, - "y": 359, + "x": 277, + "y": 361, "w": 16, "h": 16 } @@ -7374,8 +7647,8 @@ "h": 16 }, "frame": { - "x": 303, - "y": 309, + "x": 293, + "y": 361, "w": 16, "h": 16 } @@ -7395,8 +7668,8 @@ "h": 16 }, "frame": { - "x": 319, - "y": 308, + "x": 365, + "y": 348, "w": 16, "h": 16 } @@ -7416,8 +7689,8 @@ "h": 16 }, "frame": { - "x": 335, - "y": 306, + "x": 381, + "y": 343, "w": 16, "h": 16 } @@ -7437,33 +7710,12 @@ "h": 16 }, "frame": { - "x": 351, - "y": 306, + "x": 349, + "y": 356, "w": 16, "h": 16 } }, - { - "filename": "candy_overlay", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 12, - "w": 16, - "h": 15 - }, - "frame": { - "x": 367, - "y": 316, - "w": 16, - "h": 15 - } - }, { "filename": "gengarite", "rotated": false, @@ -7479,8 +7731,8 @@ "h": 16 }, "frame": { - "x": 383, - "y": 325, + "x": 333, + "y": 358, "w": 16, "h": 16 } @@ -7500,8 +7752,8 @@ "h": 16 }, "frame": { - "x": 399, - "y": 335, + "x": 317, + "y": 360, "w": 16, "h": 16 } @@ -7521,8 +7773,8 @@ "h": 16 }, "frame": { - "x": 315, - "y": 325, + "x": 365, + "y": 364, "w": 16, "h": 16 } @@ -7542,8 +7794,8 @@ "h": 16 }, "frame": { - "x": 315, - "y": 341, + "x": 381, + "y": 359, "w": 16, "h": 16 } @@ -7563,8 +7815,8 @@ "h": 16 }, "frame": { - "x": 331, - "y": 324, + "x": 397, + "y": 353, "w": 16, "h": 16 } @@ -7584,8 +7836,8 @@ "h": 16 }, "frame": { - "x": 331, - "y": 340, + "x": 349, + "y": 372, "w": 16, "h": 16 } @@ -7605,8 +7857,8 @@ "h": 16 }, "frame": { - "x": 347, - "y": 322, + "x": 333, + "y": 374, "w": 16, "h": 16 } @@ -7626,8 +7878,8 @@ "h": 16 }, "frame": { - "x": 347, - "y": 338, + "x": 365, + "y": 380, "w": 16, "h": 16 } @@ -7647,8 +7899,8 @@ "h": 16 }, "frame": { - "x": 363, - "y": 331, + "x": 381, + "y": 375, "w": 16, "h": 16 } @@ -7668,8 +7920,8 @@ "h": 16 }, "frame": { - "x": 363, - "y": 347, + "x": 397, + "y": 369, "w": 16, "h": 16 } @@ -7689,8 +7941,8 @@ "h": 16 }, "frame": { - "x": 379, - "y": 341, + "x": 349, + "y": 388, "w": 16, "h": 16 } @@ -7710,8 +7962,8 @@ "h": 16 }, "frame": { - "x": 347, - "y": 354, + "x": 365, + "y": 396, "w": 16, "h": 16 } @@ -7731,8 +7983,8 @@ "h": 16 }, "frame": { - "x": 331, - "y": 356, + "x": 381, + "y": 391, "w": 16, "h": 16 } @@ -7752,8 +8004,8 @@ "h": 16 }, "frame": { - "x": 315, - "y": 357, + "x": 381, + "y": 407, "w": 16, "h": 16 } @@ -7773,8 +8025,8 @@ "h": 16 }, "frame": { - "x": 363, - "y": 363, + "x": 397, + "y": 385, "w": 16, "h": 16 } @@ -7794,8 +8046,8 @@ "h": 16 }, "frame": { - "x": 379, - "y": 357, + "x": 397, + "y": 401, "w": 16, "h": 16 } @@ -7815,8 +8067,8 @@ "h": 16 }, "frame": { - "x": 395, - "y": 351, + "x": 200, + "y": 383, "w": 16, "h": 16 } @@ -7836,8 +8088,8 @@ "h": 16 }, "frame": { - "x": 347, - "y": 370, + "x": 201, + "y": 399, "w": 16, "h": 16 } @@ -7857,8 +8109,8 @@ "h": 16 }, "frame": { - "x": 331, - "y": 372, + "x": 216, + "y": 380, "w": 16, "h": 16 } @@ -7878,8 +8130,8 @@ "h": 16 }, "frame": { - "x": 363, - "y": 379, + "x": 232, + "y": 378, "w": 16, "h": 16 } @@ -7899,8 +8151,8 @@ "h": 16 }, "frame": { - "x": 379, - "y": 373, + "x": 248, + "y": 378, "w": 16, "h": 16 } @@ -7920,8 +8172,8 @@ "h": 16 }, "frame": { - "x": 395, - "y": 367, + "x": 264, + "y": 378, "w": 16, "h": 16 } @@ -7941,8 +8193,8 @@ "h": 16 }, "frame": { - "x": 347, - "y": 386, + "x": 280, + "y": 377, "w": 16, "h": 16 } @@ -7962,8 +8214,8 @@ "h": 16 }, "frame": { - "x": 363, - "y": 395, + "x": 296, + "y": 377, "w": 16, "h": 16 } @@ -7983,8 +8235,8 @@ "h": 16 }, "frame": { - "x": 379, - "y": 389, + "x": 217, + "y": 396, "w": 16, "h": 16 } @@ -8004,8 +8256,8 @@ "h": 16 }, "frame": { - "x": 395, - "y": 383, + "x": 233, + "y": 394, "w": 16, "h": 16 } @@ -8025,8 +8277,8 @@ "h": 16 }, "frame": { - "x": 379, - "y": 405, + "x": 249, + "y": 394, "w": 16, "h": 16 } @@ -8046,8 +8298,8 @@ "h": 16 }, "frame": { - "x": 395, - "y": 399, + "x": 265, + "y": 394, "w": 16, "h": 16 } @@ -8067,8 +8319,8 @@ "h": 16 }, "frame": { - "x": 314, - "y": 373, + "x": 281, + "y": 393, "w": 16, "h": 16 } @@ -8088,8 +8340,8 @@ "h": 16 }, "frame": { - "x": 330, - "y": 388, + "x": 297, + "y": 393, "w": 16, "h": 16 } @@ -8109,8 +8361,8 @@ "h": 16 }, "frame": { - "x": 346, - "y": 402, + "x": 312, + "y": 376, "w": 16, "h": 16 } @@ -8130,32 +8382,11 @@ "h": 16 }, "frame": { - "x": 281, - "y": 375, + "x": 313, + "y": 392, "w": 16, "h": 16 } - }, - { - "filename": "prism_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 15, - "h": 15 - }, - "frame": { - "x": 297, - "y": 375, - "w": 15, - "h": 15 - } } ] } @@ -8163,6 +8394,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:7ddaa91855ce79db7a72977126d431b4:c362d5547935cdfe138ac39e53b02773:110e074689c9edd2c54833ce2e4d9270$" + "smartupdate": "$TexturePacker:SmartUpdate:b317e2cd3502364fcdae296cd439ac4d:ae80196191516a8cb098a8467c6faa2f:110e074689c9edd2c54833ce2e4d9270$" } } diff --git a/public/images/items.png b/public/images/items.png index ddad2bad9d8..831576e45af 100644 Binary files a/public/images/items.png and b/public/images/items.png differ diff --git a/public/images/items/power_herb.png b/public/images/items/power_herb.png new file mode 100644 index 00000000000..8e68b62278f Binary files /dev/null and b/public/images/items/power_herb.png differ diff --git a/public/images/items/white_herb.png b/public/images/items/white_herb.png new file mode 100644 index 00000000000..25cfc652109 Binary files /dev/null and b/public/images/items/white_herb.png differ diff --git a/src/data/move.ts b/src/data/move.ts index 4e0841fcbd8..a2b879a388b 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -5898,6 +5898,8 @@ export const allMoves: Move[] = [ new SelfStatusMove(Moves.NONE, Type.NORMAL, MoveCategory.STATUS, -1, -1, 0, 1), ]; +export const selfStatLowerMoves: Moves[] = []; + export function initMoves() { allMoves.push( new AttackMove(Moves.POUND, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 35, -1, 0, 1), @@ -8689,4 +8691,9 @@ export function initMoves() { new AttackMove(Moves.MALIGNANT_CHAIN, Type.POISON, MoveCategory.SPECIAL, 100, 100, 5, 50, 0, 9) .attr(StatusEffectAttr, StatusEffect.TOXIC) ); + allMoves.map(m=>{ + if (m.getAttrs(StatChangeAttr).some(a=> a.selfTarget && a.levels < 0)) { + selfStatLowerMoves.push(m.id); + } + }); } diff --git a/src/locales/de/modifier-type.ts b/src/locales/de/modifier-type.ts index 2451224ef25..90ac9413466 100644 --- a/src/locales/de/modifier-type.ts +++ b/src/locales/de/modifier-type.ts @@ -153,6 +153,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "REVIVER_SEED": { name: "Belebersamen", description: "Belebt den Träger mit der Hälfte seiner KP wieder, sollte er durch einen direkten Treffer kampfunfähig werden." }, + "WHITE_HERB": { name: "Schlohkraut", description: "Ein Item zum Tragen. Es hebt einmalig jede negative Statuswertveränderung auf." }, + "ETHER": { name: "Äther" }, "MAX_ETHER": { name: "Top-Äther" }, diff --git a/src/locales/de/modifier.ts b/src/locales/de/modifier.ts index c1a282ee5f1..50b7e80b252 100644 --- a/src/locales/de/modifier.ts +++ b/src/locales/de/modifier.ts @@ -5,6 +5,7 @@ export const modifier: SimpleTranslationEntries = { "turnHealApply": "{{typeName}} von {{pokemonNameWithAffix}} füllt einige KP auf!", "hitHealApply": "{{typeName}} von {{pokemonNameWithAffix}} füllt einige KP auf!", "pokemonInstantReviveApply": "{{pokemonNameWithAffix}} wurde durch {{typeName}} wiederbelebt!", + "pokemonResetNegativeStatStageApply": "Die negative Statuswertveränderung von {{pokemonNameWithAffix}} wurde durch {{typeName}} aufgehoben!", "moneyInterestApply": "Du erhählst {{moneyAmount}} ₽ durch das Item {{typeName}}!", "turnHeldItemTransferApply": "{{itemName}} von {{pokemonNameWithAffix}} wurde durch {{typeName}} von {{pokemonName}} absorbiert!", "contactHeldItemTransferApply": "{{itemName}} von {{pokemonNameWithAffix}} wurde durch {{typeName}} von {{pokemonName}} geklaut!", diff --git a/src/locales/en/modifier-type.ts b/src/locales/en/modifier-type.ts index b3f34a20386..c6c98e44a92 100644 --- a/src/locales/en/modifier-type.ts +++ b/src/locales/en/modifier-type.ts @@ -153,6 +153,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "REVIVER_SEED": { name: "Reviver Seed", description: "Revives the holder for 1/2 HP upon fainting from a direct hit." }, + "WHITE_HERB": { name: "White Herb", description: "An item to be held by a Pokémon. It will restore any lowered stat in battle." }, + "ETHER": { name: "Ether" }, "MAX_ETHER": { name: "Max Ether" }, diff --git a/src/locales/en/modifier.ts b/src/locales/en/modifier.ts index d3da4c2150b..85098cdaaec 100644 --- a/src/locales/en/modifier.ts +++ b/src/locales/en/modifier.ts @@ -5,6 +5,7 @@ export const modifier: SimpleTranslationEntries = { "turnHealApply": "{{pokemonNameWithAffix}} restored a little HP using\nits {{typeName}}!", "hitHealApply": "{{pokemonNameWithAffix}} restored a little HP using\nits {{typeName}}!", "pokemonInstantReviveApply": "{{pokemonNameWithAffix}} was revived\nby its {{typeName}}!", + "pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}'s lowered stats were restored\nby its {{typeName}}!", "moneyInterestApply": "You received interest of ₽{{moneyAmount}}\nfrom the {{typeName}}!", "turnHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was absorbed\nby {{pokemonName}}'s {{typeName}}!", "contactHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was snatched\nby {{pokemonName}}'s {{typeName}}!", diff --git a/src/locales/es/modifier-type.ts b/src/locales/es/modifier-type.ts index c3a2fb5d66a..d2bd44a0f06 100644 --- a/src/locales/es/modifier-type.ts +++ b/src/locales/es/modifier-type.ts @@ -153,6 +153,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "REVIVER_SEED": { name: "Semilla Revivir", description: "Revive al portador con la mitad de sus PS al debilitarse por un golpe directo." }, + "WHITE_HERB": { name: "White Herb", description: "An item to be held by a Pokémon. It will restore any lowered stat in battle." }, + "ETHER": { name: "Éter" }, "MAX_ETHER": { name: "Éter Máx." }, diff --git a/src/locales/es/modifier.ts b/src/locales/es/modifier.ts index d3da4c2150b..85098cdaaec 100644 --- a/src/locales/es/modifier.ts +++ b/src/locales/es/modifier.ts @@ -5,6 +5,7 @@ export const modifier: SimpleTranslationEntries = { "turnHealApply": "{{pokemonNameWithAffix}} restored a little HP using\nits {{typeName}}!", "hitHealApply": "{{pokemonNameWithAffix}} restored a little HP using\nits {{typeName}}!", "pokemonInstantReviveApply": "{{pokemonNameWithAffix}} was revived\nby its {{typeName}}!", + "pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}'s lowered stats were restored\nby its {{typeName}}!", "moneyInterestApply": "You received interest of ₽{{moneyAmount}}\nfrom the {{typeName}}!", "turnHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was absorbed\nby {{pokemonName}}'s {{typeName}}!", "contactHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was snatched\nby {{pokemonName}}'s {{typeName}}!", diff --git a/src/locales/fr/modifier-type.ts b/src/locales/fr/modifier-type.ts index be9aa17b9ea..671a122f992 100644 --- a/src/locales/fr/modifier-type.ts +++ b/src/locales/fr/modifier-type.ts @@ -153,6 +153,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "REVIVER_SEED": { name: "Résugraine", description: "Réanime et restaure la moitié des PV de son porteur s’il est mis K.O. par une capacité directe." }, + "WHITE_HERB": { name: "White Herb", description: "An item to be held by a Pokémon. It will restore any lowered stat in battle." }, + "ETHER": { name: "Huile" }, "MAX_ETHER": { name: "Huile Max" }, diff --git a/src/locales/fr/modifier.ts b/src/locales/fr/modifier.ts index f215e258a76..3cc72600f91 100644 --- a/src/locales/fr/modifier.ts +++ b/src/locales/fr/modifier.ts @@ -5,6 +5,7 @@ export const modifier: SimpleTranslationEntries = { "turnHealApply": "Les PV de {{pokemonNameWithAffix}}\nsont un peu restaurés par les {{typeName}} !", "hitHealApply": "Les PV de {{pokemonNameWithAffix}}\nsont un peu restaurés par le {{typeName}} !", "pokemonInstantReviveApply": "{{pokemonNameWithAffix}} a repris connaissance\navec sa {{typeName}} et est prêt à se battre de nouveau !", + "pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}'s lowered stats were restored\nby its {{typeName}}!", "moneyInterestApply": "La {{typeName}} vous rapporte\n{{moneyAmount}} ₽ d’intérêts !", "turnHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} est absorbé·e\npar le {{typeName}} de {{pokemonName}} !", "contactHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} est volé·e\npar l’{{typeName}} de {{pokemonName}} !", diff --git a/src/locales/it/modifier-type.ts b/src/locales/it/modifier-type.ts index 54ff0ba0e45..618d19395e5 100644 --- a/src/locales/it/modifier-type.ts +++ b/src/locales/it/modifier-type.ts @@ -153,6 +153,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "REVIVER_SEED": { name: "Revitalseme", description: "Il possessore recupera 1/2 di PS in caso di KO causato da un colpo diretto." }, + "WHITE_HERB": { name: "Erbachiara", description: "An item to be held by a Pokémon. It will restore any lowered stat in battle." }, + "ETHER": { name: "Etere" }, "MAX_ETHER": { name: "Etere max" }, diff --git a/src/locales/it/modifier.ts b/src/locales/it/modifier.ts index d3da4c2150b..85098cdaaec 100644 --- a/src/locales/it/modifier.ts +++ b/src/locales/it/modifier.ts @@ -5,6 +5,7 @@ export const modifier: SimpleTranslationEntries = { "turnHealApply": "{{pokemonNameWithAffix}} restored a little HP using\nits {{typeName}}!", "hitHealApply": "{{pokemonNameWithAffix}} restored a little HP using\nits {{typeName}}!", "pokemonInstantReviveApply": "{{pokemonNameWithAffix}} was revived\nby its {{typeName}}!", + "pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}'s lowered stats were restored\nby its {{typeName}}!", "moneyInterestApply": "You received interest of ₽{{moneyAmount}}\nfrom the {{typeName}}!", "turnHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was absorbed\nby {{pokemonName}}'s {{typeName}}!", "contactHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was snatched\nby {{pokemonName}}'s {{typeName}}!", diff --git a/src/locales/ko/modifier-type.ts b/src/locales/ko/modifier-type.ts index cc09d7763a9..28df422645a 100644 --- a/src/locales/ko/modifier-type.ts +++ b/src/locales/ko/modifier-type.ts @@ -153,6 +153,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "REVIVER_SEED": { name: "부활의씨앗", description: "포켓몬이 공격을 받고 쓰러지려 할 때 HP를 절반 회복한다." }, + "WHITE_HERB": { name: "White Herb", description: "An item to be held by a Pokémon. It will restore any lowered stat in battle." }, + "ETHER": { name: "PP에이드" }, "MAX_ETHER": { name: "PP회복" }, diff --git a/src/locales/ko/modifier.ts b/src/locales/ko/modifier.ts index c61d2b3def0..71508f774c7 100644 --- a/src/locales/ko/modifier.ts +++ b/src/locales/ko/modifier.ts @@ -5,6 +5,7 @@ export const modifier: SimpleTranslationEntries = { "turnHealApply": "{{pokemonNameWithAffix}}[[는]]\n{{typeName}}[[로]] 인해 조금 회복했다.", "hitHealApply": "{{pokemonNameWithAffix}}[[는]]\n{{typeName}}[[로]] 인해 조금 회복했다.", "pokemonInstantReviveApply": "{{pokemonNameWithAffix}}[[는]] {{typeName}}[[로]]\n정신을 차려 싸울 수 있게 되었다!", + "pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}'s lowered stats were restored\nby its {{typeName}}!", "moneyInterestApply": "{{typeName}}[[로]]부터\n₽{{moneyAmount}}[[를]] 받았다!", "turnHeldItemTransferApply": "{{pokemonName}}의 {{typeName}}[[는]]\n{{pokemonNameWithAffix}}의 {{itemName}}[[를]] 흡수했다!", "contactHeldItemTransferApply": "{{pokemonName}}의 {{typeName}}[[는]]\n{{pokemonNameWithAffix}}의 {{itemName}}[[를]] 가로챘다!", diff --git a/src/locales/pt_BR/modifier-type.ts b/src/locales/pt_BR/modifier-type.ts index db46ad3f567..fb12a99a971 100644 --- a/src/locales/pt_BR/modifier-type.ts +++ b/src/locales/pt_BR/modifier-type.ts @@ -153,6 +153,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "REVIVER_SEED": { name: "Semente Reanimadora", description: "Após desmaiar por um ataque direto, reanima com 50% de PS." }, + "WHITE_HERB": { name: "White Herb", description: "An item to be held by a Pokémon. It will restore any lowered stat in battle." }, + "ETHER": { name: "Éter" }, "MAX_ETHER": { name: "Éter Máximo" }, diff --git a/src/locales/pt_BR/modifier.ts b/src/locales/pt_BR/modifier.ts index 7cc90df5caa..c805c52d1d1 100644 --- a/src/locales/pt_BR/modifier.ts +++ b/src/locales/pt_BR/modifier.ts @@ -5,6 +5,7 @@ export const modifier: SimpleTranslationEntries = { "turnHealApply": "{{pokemonNameWithAffix}} restaurou um pouco de PS usando\nsuas {{typeName}}!", "hitHealApply": "{{pokemonNameWithAffix}} restaurou um pouco de PS usando\nsua {{typeName}}!", "pokemonInstantReviveApply": "{{pokemonNameWithAffix}} foi revivido\npor sua {{typeName}}!", + "pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}'s lowered stats were restored\nby its {{typeName}}!", "moneyInterestApply": "Você recebeu um juros de ₽{{moneyAmount}}\nde sua {{typeName}}!", "turnHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} foi absorvido(a)\npelo {{typeName}} de {{pokemonName}}!", "contactHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} foi pego(a)\npela {{typeName}} de {{pokemonName}}!", diff --git a/src/locales/zh_CN/modifier-type.ts b/src/locales/zh_CN/modifier-type.ts index 8d37e7336dc..fcdaf9e8d9f 100644 --- a/src/locales/zh_CN/modifier-type.ts +++ b/src/locales/zh_CN/modifier-type.ts @@ -153,6 +153,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "REVIVER_SEED": { name: "复活种子", description: "受到技能攻击伤害濒死时,\n恢复该宝可梦的HP至1/2。" }, + "WHITE_HERB": { name: "White Herb", description: "An item to be held by a Pokémon. It will restore any lowered stat in battle." }, + "ETHER": { name: "PP单项小补剂" }, "MAX_ETHER": { name: "PP单项全补剂" }, diff --git a/src/locales/zh_CN/modifier.ts b/src/locales/zh_CN/modifier.ts index fabd17465b2..458931ed9b5 100644 --- a/src/locales/zh_CN/modifier.ts +++ b/src/locales/zh_CN/modifier.ts @@ -5,6 +5,7 @@ export const modifier: SimpleTranslationEntries = { "turnHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回复了体力!", "hitHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回复了体力!", "pokemonInstantReviveApply": "{{pokemonNameWithAffix}}用{{typeName}}\n恢复了活力!", + "pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}'s lowered stats were restored\nby its {{typeName}}!", "moneyInterestApply": "用{{typeName}}\n获得了 ₽{{moneyAmount}} 利息!", "turnHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}吸收了!", "contactHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}夺取了!", diff --git a/src/locales/zh_TW/modifier-type.ts b/src/locales/zh_TW/modifier-type.ts index 5e8a32161ce..3d56deca3d7 100644 --- a/src/locales/zh_TW/modifier-type.ts +++ b/src/locales/zh_TW/modifier-type.ts @@ -155,6 +155,10 @@ export const modifierType: ModifierTypeTranslationEntries = { name: "復活種子", description: "受到技能攻擊傷害瀕死時,\n恢復該瀕死寶可夢的HP至1/2。", }, + WHITE_HERB: { + name: "White Herb", + description: "An item to be held by a Pokémon. It will restore any lowered stat in battle.", + }, ETHER: { name: "PP單項小補劑" }, MAX_ETHER: { name: "PP單項全補劑" }, ELIXIR: { name: "PP多項小補劑" }, diff --git a/src/locales/zh_TW/modifier.ts b/src/locales/zh_TW/modifier.ts index 01de87827c0..5174ae68362 100644 --- a/src/locales/zh_TW/modifier.ts +++ b/src/locales/zh_TW/modifier.ts @@ -5,6 +5,7 @@ export const modifier: SimpleTranslationEntries = { "turnHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回復了體力!", "hitHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回復了體力!", "pokemonInstantReviveApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回復了活力!", + "pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}'s lowered stats were restored\nby its {{typeName}}!", "moneyInterestApply": "用{{typeName}}\n獲得了 ₽{{moneyAmount}} 利息!", "turnHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}吸收了!", "contactHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}奪取了!", diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 046b88d96cc..fb2264fab8f 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1,5 +1,5 @@ import * as Modifiers from "./modifier"; -import { AttackMove, allMoves } from "../data/move"; +import { AttackMove, allMoves, selfStatLowerMoves } from "../data/move"; import { MAX_PER_TYPE_POKEBALLS, PokeballType, getPokeballCatchMultiplier, getPokeballName } from "../data/pokeball"; import Pokemon, { EnemyPokemon, PlayerPokemon, PokemonMove } from "../field/pokemon"; import { EvolutionItem, pokemonEvolutions } from "../data/pokemon-evolutions"; @@ -1252,6 +1252,7 @@ export const modifierTypes = { SACRED_ASH: () => new AllPokemonFullReviveModifierType("modifierType:ModifierType.SACRED_ASH", "sacred_ash"), REVIVER_SEED: () => new PokemonHeldItemModifierType("modifierType:ModifierType.REVIVER_SEED", "reviver_seed", (type, args) => new Modifiers.PokemonInstantReviveModifier(type, (args[0] as Pokemon).id)), + WHITE_HERB: () => new PokemonHeldItemModifierType("modifierType:ModifierType.WHITE_HERB", "white_herb", (type, args) => new Modifiers.PokemonResetNegativeStatStageModifier(type, (args[0] as Pokemon).id)), ETHER: () => new PokemonPpRestoreModifierType("modifierType:ModifierType.ETHER", "ether", 10), MAX_ETHER: () => new PokemonPpRestoreModifierType("modifierType:ModifierType.MAX_ETHER", "max_ether", -1), @@ -1562,6 +1563,14 @@ const modifierPool: ModifierPool = { // If a party member doesn't already have one of these two orbs and has one of the above moves or abilities, the orb can appear return party.some(p => !p.getHeldItems().some(i => i instanceof Modifiers.TurnStatusEffectModifier) && (checkedAbilities.some(a => p.hasAbility(a, false, true)) || p.getMoveset(true).some(m => checkedMoves.includes(m.moveId)))) ? 10 : 0; }, 10), + new WeightedModifierType(modifierTypes.WHITE_HERB, (party: Pokemon[]) => { + const checkedAbilities = [Abilities.WEAK_ARMOR, Abilities.CONTRARY, Abilities.MOODY, Abilities.ANGER_SHELL, Abilities.COMPETITIVE, Abilities.DEFIANT]; + const weightMultiplier = party.filter( + p => !p.getHeldItems().some(i => i instanceof Modifiers.PokemonResetNegativeStatStageModifier && i.stackCount >= i.getMaxHeldItemCount(p)) && + (checkedAbilities.some(a => p.hasAbility(a, false, true)) || p.getMoveset(true).some(m => selfStatLowerMoves.includes(m.moveId)))).length; + // If a party member has one of the above moves or abilities and doesn't have max herbs, the herb will appear more frequently + return 3*(weightMultiplier? 2: 1)+(weightMultiplier? weightMultiplier-1: 0); + }, 10), new WeightedModifierType(modifierTypes.REVIVER_SEED, 4), new WeightedModifierType(modifierTypes.CANDY_JAR, 5), new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 9), @@ -1628,6 +1637,7 @@ const wildModifierPool: ModifierPool = { }), [ModifierTier.ULTRA]: [ new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 10), + new WeightedModifierType(modifierTypes.WHITE_HERB, 2) ].map(m => { m.setTier(ModifierTier.ULTRA); return m; }), @@ -1656,7 +1666,8 @@ const trainerModifierPool: ModifierPool = { m.setTier(ModifierTier.GREAT); return m; }), [ModifierTier.ULTRA]: [ - new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 1), + new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 5), + new WeightedModifierType(modifierTypes.WHITE_HERB, 1), ].map(m => { m.setTier(ModifierTier.ULTRA); return m; }), diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 9515bd2bf6b..4467f82cb85 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -1391,6 +1391,47 @@ export class PokemonInstantReviveModifier extends PokemonHeldItemModifier { } } +/** + * Modifier used for White Herb, which resets negative {@linkcode Stat} changes + * @extends PokemonHeldItemModifier + * @see {@linkcode apply} + */ +export class PokemonResetNegativeStatStageModifier extends PokemonHeldItemModifier { + constructor(type: ModifierType, pokemonId: integer, stackCount?: integer) { + super(type, pokemonId, stackCount); + } + + matchType(modifier: Modifier) { + return modifier instanceof PokemonResetNegativeStatStageModifier; + } + + clone() { + return new PokemonResetNegativeStatStageModifier(this.type, this.pokemonId, this.stackCount); + } + + /** + * Restores any negative stat stages of the mon to 0 + * @param args args[0] is the {@linkcode Pokemon} whose stat stages are being checked + * @returns true if any stat changes were applied (item was used), false otherwise + */ + apply(args: any[]): boolean { + const pokemon = args[0] as Pokemon; + const loweredStats = pokemon.summonData.battleStats.filter(s => s < 0); + if (loweredStats.length) { + for (let s = 0; s < pokemon.summonData.battleStats.length; s++) { + pokemon.summonData.battleStats[s] = Math.max(0, pokemon.summonData.battleStats[s]); + } + pokemon.scene.queueMessage(i18next.t("modifier:pokemonResetNegativeStatStageApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name })); + return true; + } + return false; + } + + getMaxHeldItemCount(pokemon: Pokemon): integer { + return 2; + } +} + export abstract class ConsumablePokemonModifier extends ConsumableModifier { public pokemonId: integer; diff --git a/src/phases.ts b/src/phases.ts index d4bc1dc5c2a..d0c0804541b 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -5,7 +5,7 @@ import { allMoves, applyMoveAttrs, BypassSleepAttr, ChargeAttr, applyFilteredMov import { Mode } from "./ui/ui"; import { Command } from "./ui/command-ui-handler"; import { Stat } from "./data/pokemon-stat"; -import { BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, HealingBoosterModifier, HitHealModifier, LapsingPersistentModifier, MapModifier, Modifier, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, SwitchEffectTransferModifier, TurnHealModifier, TurnHeldItemTransferModifier, MoneyMultiplierModifier, MoneyInterestModifier, IvScannerModifier, LapsingPokemonHeldItemModifier, PokemonMultiHitModifier, overrideModifiers, overrideHeldItems, BypassSpeedChanceModifier, TurnStatusEffectModifier } from "./modifier/modifier"; +import { BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, HealingBoosterModifier, HitHealModifier, LapsingPersistentModifier, MapModifier, Modifier, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, SwitchEffectTransferModifier, TurnHealModifier, TurnHeldItemTransferModifier, MoneyMultiplierModifier, MoneyInterestModifier, IvScannerModifier, LapsingPokemonHeldItemModifier, PokemonMultiHitModifier, overrideModifiers, overrideHeldItems, BypassSpeedChanceModifier, TurnStatusEffectModifier, PokemonResetNegativeStatStageModifier } from "./modifier/modifier"; import PartyUiHandler, { PartyOption, PartyUiMode } from "./ui/party-ui-handler"; import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getPokeballTintColor, PokeballType } from "./data/pokeball"; import { CommonAnim, CommonBattleAnim, MoveAnim, initMoveAnim, loadMoveAnimAssets } from "./data/battle-anims"; @@ -3321,6 +3321,21 @@ export class StatChangePhase extends PokemonPhase { applyPostStatChangeAbAttrs(PostStatChangeAbAttr, pokemon, filteredStats, this.levels, this.selfTarget); + //Look for any other stat change phases; if this is the last one, do White Herb check + const existingPhase = this.scene.findPhase(p => p instanceof StatChangePhase && p.battlerIndex === this.battlerIndex); + if (!(existingPhase instanceof StatChangePhase)) { + // Apply White Herb if needed + const whiteHerb = this.scene.applyModifier(PokemonResetNegativeStatStageModifier, this.player, pokemon) as PokemonResetNegativeStatStageModifier; + // If the White Herb was applied, consume it + if (whiteHerb) { + --whiteHerb.stackCount; + if (whiteHerb.stackCount <= 0) { + this.scene.removeModifier(whiteHerb); + } + this.scene.updateModifiers(this.player); + } + } + pokemon.updateInfo(); handleTutorial(this.scene, Tutorial.Stat_Change).then(() => super.end());