Merge pull request #3894 from ben-lear/uncommon-breed

[Feature] Uncommon Breed Mystery Encounter
This commit is contained in:
ImperialSympathizer 2024-08-29 12:55:13 -04:00 committed by GitHub
commit 494ef4435e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
180 changed files with 5936 additions and 2754 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -4,198 +4,198 @@
"image": "chest_blue.png", "image": "chest_blue.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": { "size": {
"w": 58, "w": 54,
"h": 528 "h": 492
}, },
"scale": 1, "scale": 1,
"frames": [ "frames": [
{ {
"filename": "0000.png", "filename": "0000.png",
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 75, "w": 46,
"h": 75 "h": 39
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 14, "x": 0,
"y": 30, "y": 0,
"w": 48, "w": 46,
"h": 41 "h": 39
}, },
"frame": { "frame": {
"x": 1, "x": 0,
"y": 1, "y": 0,
"w": 48, "w": 46,
"h": 41 "h": 39
} }
}, },
{ {
"filename": "0001.png", "filename": "0001.png",
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 75, "w": 47,
"h": 75 "h": 35
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 14, "x": 0,
"y": 34, "y": 0,
"w": 49, "w": 47,
"h": 37 "h": 35
}, },
"frame": { "frame": {
"x": 1, "x": 0,
"y": 44, "y": 39,
"w": 49, "w": 47,
"h": 37 "h": 35
} }
}, },
{ {
"filename": "0002.png", "filename": "0002.png",
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 75, "w": 46,
"h": 75 "h": 39
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 14, "x": 0,
"y": 30, "y": 0,
"w": 48, "w": 46,
"h": 41 "h": 39
}, },
"frame": { "frame": {
"x": 1, "x": 0,
"y": 83, "y": 74,
"w": 48, "w": 46,
"h": 41 "h": 39
} }
}, },
{ {
"filename": "0003.png", "filename": "0003.png",
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 75, "w": 46,
"h": 75 "h": 46
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 14, "x": 0,
"y": 23, "y": 0,
"w": 48, "w": 46,
"h": 48 "h": 46
}, },
"frame": { "frame": {
"x": 1, "x": 0,
"y": 126, "y": 113,
"w": 48, "w": 46,
"h": 48 "h": 46
} }
}, },
{ {
"filename": "0004.png", "filename": "0004.png",
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 75, "w": 53,
"h": 75 "h": 65
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 13, "x": 0,
"y": 4, "y": 0,
"w": 55, "w": 53,
"h": 67 "h": 65
}, },
"frame": { "frame": {
"x": 1, "x": 0,
"y": 176, "y": 159,
"w": 55, "w": 53,
"h": 67 "h": 65
} }
}, },
{ {
"filename": "0005.png", "filename": "0005.png",
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 75, "w": 54,
"h": 75 "h": 67
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 15, "x": 0,
"y": 2, "y": 0,
"w": 56, "w": 54,
"h": 69 "h": 67
}, },
"frame": { "frame": {
"x": 1, "x": 0,
"y": 245, "y": 224,
"w": 56, "w": 54,
"h": 69 "h": 67
} }
}, },
{ {
"filename": "0006.png", "filename": "0006.png",
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 75, "w": 54,
"h": 75 "h": 67
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 15, "x": 0,
"y": 2, "y": 0,
"w": 56, "w": 54,
"h": 69 "h": 67
}, },
"frame": { "frame": {
"x": 1, "x": 0,
"y": 316, "y": 291,
"w": 56, "w": 54,
"h": 69 "h": 67
} }
}, },
{ {
"filename": "0007.png", "filename": "0007.png",
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 75, "w": 54,
"h": 75 "h": 67
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 13, "x": 0,
"y": 2, "y": 0,
"w": 56, "w": 54,
"h": 69 "h": 67
}, },
"frame": { "frame": {
"x": 1, "x": 0,
"y": 387, "y": 358,
"w": 56, "w": 54,
"h": 69 "h": 67
} }
}, },
{ {
"filename": "0008.png", "filename": "0008.png",
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 75, "w": 54,
"h": 75 "h": 67
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 13, "x": 0,
"y": 2, "y": 0,
"w": 56, "w": 54,
"h": 69 "h": 67
}, },
"frame": { "frame": {
"x": 1, "x": 0,
"y": 458, "y": 425,
"w": 56, "w": 54,
"h": 69 "h": 67
} }
} }
] ]
@ -204,6 +204,6 @@
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.codeandweb.com/texturepacker",
"version": "3.0", "version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:5f36000f6160ee6f397afe5a6fd60b73:cf6f4b08e23400447813583c322eb6c7:f4f3c064e6c93b8d1290f93bee927f60$" "smartupdate": "$TexturePacker:SmartUpdate:017ecc2437e580a185f9843f97e80da5:f44ef1c27a4a17183a5bcf1f7fc8ce6a:f4f3c064e6c93b8d1290f93bee927f60$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -4,30 +4,198 @@
"image": "chest_red.png", "image": "chest_red.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": { "size": {
"w": 76, "w": 54,
"h": 57 "h": 492
}, },
"scale": 1, "scale": 1,
"frames": [ "frames": [
{
"filename": "0000.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 46,
"h": 39
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 46,
"h": 39
},
"frame": {
"x": 0,
"y": 0,
"w": 46,
"h": 39
}
},
{ {
"filename": "0001.png", "filename": "0001.png",
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"sourceSize": { "sourceSize": {
"w": 76, "w": 47,
"h": 57 "h": 35
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 10, "x": 0,
"y": 3, "y": 0,
"w": 56, "w": 47,
"h": 54 "h": 35
}, },
"frame": { "frame": {
"x": 8, "x": 0,
"y": 39,
"w": 47,
"h": 35
}
},
{
"filename": "0002.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 46,
"h": 39
},
"spriteSourceSize": {
"x": 0,
"y": 0, "y": 0,
"w": 56, "w": 46,
"h": 54 "h": 39
},
"frame": {
"x": 0,
"y": 74,
"w": 46,
"h": 39
}
},
{
"filename": "0003.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 46,
"h": 46
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 46,
"h": 46
},
"frame": {
"x": 0,
"y": 113,
"w": 46,
"h": 46
}
},
{
"filename": "0004.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 53,
"h": 65
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 53,
"h": 65
},
"frame": {
"x": 0,
"y": 159,
"w": 53,
"h": 65
}
},
{
"filename": "0005.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 54,
"h": 67
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 54,
"h": 67
},
"frame": {
"x": 0,
"y": 224,
"w": 54,
"h": 67
}
},
{
"filename": "0006.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 54,
"h": 67
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 54,
"h": 67
},
"frame": {
"x": 0,
"y": 291,
"w": 54,
"h": 67
}
},
{
"filename": "0007.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 54,
"h": 67
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 54,
"h": 67
},
"frame": {
"x": 0,
"y": 358,
"w": 54,
"h": 67
}
},
{
"filename": "0008.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 54,
"h": 67
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 54,
"h": 67
},
"frame": {
"x": 0,
"y": 425,
"w": 54,
"h": 67
} }
} }
] ]
@ -36,6 +204,6 @@
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.codeandweb.com/texturepacker",
"version": "3.0", "version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:895f0a79b89fa0fb44167f4584fd9a22:357b46953b7e17c6b2f43a62d52855d8:cc1ed0e4f90aaa9dcf1b39a0af1283b0$" "smartupdate": "$TexturePacker:SmartUpdate:2a0b6c93c5be115efa635d40780603f0:b5fde49f991c2ecc49afedd80cc8a544:a163d960e9966469ae4dde4b53c13496$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -4312,6 +4312,11 @@
1, 1,
1 1
], ],
"99-gigantamax": [
0,
1,
1
],
"100": [ "100": [
0, 0,
1, 1,
@ -9940,12 +9945,12 @@
], ],
"672": [ "672": [
0, 0,
2, 1,
1 1
], ],
"673": [ "673": [
0, 0,
2, 1,
1 1
], ],
"677": [ "677": [
@ -10806,7 +10811,7 @@
"962": [ "962": [
1, 1,
1, 1,
2 1
], ],
"967": [ "967": [
0, 0,

View File

@ -0,0 +1,32 @@
{
"1": {
"c56a5a": "6232a9",
"f6c58b": "9f60d5",
"832908": "3b1c69",
"ee8b4a": "8853bf",
"101010": "101010",
"735210": "534681",
"fdfdfd": "ffdbdb",
"e1d0db": "d5869b",
"ffe6b4": "c3d6ff",
"eebd8b": "9ba3d9",
"b47b5a": "7c72b6",
"b5a6b5": "b65782",
"9a859a": "872d65"
},
"2": {
"c56a5a": "2d6f9e",
"f6c58b": "75e0e8",
"832908": "22447d",
"ee8b4a": "43adc4",
"101010": "101010",
"735210": "1e1743",
"fdfdfd": "b1f1cf",
"e1d0db": "73c1c2",
"ffe6b4": "464d89",
"eebd8b": "31296f",
"b47b5a": "231b4e",
"b5a6b5": "44778a",
"9a859a": "2f4c6b"
}
}

View File

@ -1,4 +1,20 @@
{ {
"1": {
"3d3128": "69112a",
"000000": "000000",
"67615b": "9e2c3d",
"615140": "89431b",
"7e6d5a": "b3743e",
"554538": "642509",
"efeded": "f8e2b7",
"beb8b6": "e3a378",
"0e5d58": "8c6859",
"09a77c": "f8f0e2",
"0d8374": "d2af94",
"c16a3f": "321512",
"c6b379": "552d30",
"a8905c": "4b2525"
},
"2": { "2": {
"3d3128": "161526", "3d3128": "161526",
"000000": "000000", "000000": "000000",

View File

@ -1,965 +0,0 @@
{
"textures": [
{
"image": "672_2.png",
"format": "RGBA8888",
"size": {
"w": 282,
"h": 282
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 41,
"h": 42
},
"frame": {
"x": 0,
"y": 0,
"w": 41,
"h": 42
}
},
{
"filename": "0002.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 41,
"h": 42
},
"frame": {
"x": 0,
"y": 0,
"w": 41,
"h": 42
}
},
{
"filename": "0021.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 41,
"h": 42
},
"frame": {
"x": 0,
"y": 0,
"w": 41,
"h": 42
}
},
{
"filename": "0022.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 41,
"h": 42
},
"frame": {
"x": 0,
"y": 0,
"w": 41,
"h": 42
}
},
{
"filename": "0023.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 41,
"h": 42
},
"frame": {
"x": 0,
"y": 0,
"w": 41,
"h": 42
}
},
{
"filename": "0024.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 41,
"h": 42
},
"frame": {
"x": 0,
"y": 0,
"w": 41,
"h": 42
}
},
{
"filename": "0045.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 41,
"h": 42
},
"frame": {
"x": 0,
"y": 0,
"w": 41,
"h": 42
}
},
{
"filename": "0003.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 41,
"h": 42
},
"frame": {
"x": 0,
"y": 42,
"w": 41,
"h": 42
}
},
{
"filename": "0004.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 41,
"h": 42
},
"frame": {
"x": 0,
"y": 42,
"w": 41,
"h": 42
}
},
{
"filename": "0005.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 41,
"h": 42
},
"frame": {
"x": 0,
"y": 84,
"w": 41,
"h": 42
}
},
{
"filename": "0006.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 41,
"h": 42
},
"frame": {
"x": 0,
"y": 126,
"w": 41,
"h": 42
}
},
{
"filename": "0007.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 41,
"h": 42
},
"frame": {
"x": 0,
"y": 168,
"w": 41,
"h": 42
}
},
{
"filename": "0018.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 41,
"h": 42
},
"frame": {
"x": 0,
"y": 210,
"w": 41,
"h": 42
}
},
{
"filename": "0019.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 41,
"h": 42
},
"frame": {
"x": 41,
"y": 0,
"w": 41,
"h": 42
}
},
{
"filename": "0020.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 41,
"h": 42
},
"frame": {
"x": 82,
"y": 0,
"w": 41,
"h": 42
}
},
{
"filename": "0025.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 41,
"h": 42
},
"frame": {
"x": 123,
"y": 0,
"w": 41,
"h": 42
}
},
{
"filename": "0026.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 41,
"h": 42
},
"frame": {
"x": 164,
"y": 0,
"w": 41,
"h": 42
}
},
{
"filename": "0027.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 41,
"h": 42
},
"frame": {
"x": 205,
"y": 0,
"w": 41,
"h": 42
}
},
{
"filename": "0042.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 41,
"h": 42
},
"frame": {
"x": 41,
"y": 42,
"w": 41,
"h": 42
}
},
{
"filename": "0043.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 41,
"h": 42
},
"frame": {
"x": 41,
"y": 84,
"w": 41,
"h": 42
}
},
{
"filename": "0044.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 41,
"h": 42
},
"frame": {
"x": 41,
"y": 126,
"w": 41,
"h": 42
}
},
{
"filename": "0008.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 41,
"h": 41
},
"frame": {
"x": 41,
"y": 168,
"w": 41,
"h": 41
}
},
{
"filename": "0009.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 41,
"h": 41
},
"frame": {
"x": 41,
"y": 209,
"w": 41,
"h": 41
}
},
{
"filename": "0010.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 41,
"h": 41
},
"frame": {
"x": 82,
"y": 42,
"w": 41,
"h": 41
}
},
{
"filename": "0015.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 41,
"h": 41
},
"frame": {
"x": 123,
"y": 42,
"w": 41,
"h": 41
}
},
{
"filename": "0016.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 41,
"h": 41
},
"frame": {
"x": 164,
"y": 42,
"w": 41,
"h": 41
}
},
{
"filename": "0017.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 41,
"h": 41
},
"frame": {
"x": 205,
"y": 42,
"w": 41,
"h": 41
}
},
{
"filename": "0028.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 41,
"h": 41
},
"frame": {
"x": 82,
"y": 83,
"w": 41,
"h": 41
}
},
{
"filename": "0029.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 41,
"h": 41
},
"frame": {
"x": 82,
"y": 124,
"w": 41,
"h": 41
}
},
{
"filename": "0040.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 1,
"y": 0,
"w": 40,
"h": 42
},
"frame": {
"x": 82,
"y": 165,
"w": 40,
"h": 42
}
},
{
"filename": "0041.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 1,
"y": 0,
"w": 40,
"h": 42
},
"frame": {
"x": 82,
"y": 207,
"w": 40,
"h": 42
}
},
{
"filename": "0011.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 40,
"h": 41
},
"frame": {
"x": 122,
"y": 165,
"w": 40,
"h": 41
}
},
{
"filename": "0012.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 40,
"h": 41
},
"frame": {
"x": 122,
"y": 206,
"w": 40,
"h": 41
}
},
{
"filename": "0013.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 40,
"h": 41
},
"frame": {
"x": 123,
"y": 83,
"w": 40,
"h": 41
}
},
{
"filename": "0014.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 1,
"w": 40,
"h": 41
},
"frame": {
"x": 123,
"y": 124,
"w": 40,
"h": 41
}
},
{
"filename": "0037.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 1,
"y": 1,
"w": 40,
"h": 41
},
"frame": {
"x": 162,
"y": 165,
"w": 40,
"h": 41
}
},
{
"filename": "0038.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 1,
"y": 1,
"w": 40,
"h": 41
},
"frame": {
"x": 162,
"y": 206,
"w": 40,
"h": 41
}
},
{
"filename": "0039.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 1,
"y": 1,
"w": 40,
"h": 41
},
"frame": {
"x": 163,
"y": 83,
"w": 40,
"h": 41
}
},
{
"filename": "0030.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 2,
"w": 41,
"h": 40
},
"frame": {
"x": 163,
"y": 124,
"w": 41,
"h": 40
}
},
{
"filename": "0031.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 0,
"y": 2,
"w": 41,
"h": 40
},
"frame": {
"x": 203,
"y": 83,
"w": 41,
"h": 40
}
},
{
"filename": "0032.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 1,
"y": 2,
"w": 40,
"h": 40
},
"frame": {
"x": 202,
"y": 164,
"w": 40,
"h": 40
}
},
{
"filename": "0033.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 1,
"y": 2,
"w": 40,
"h": 40
},
"frame": {
"x": 204,
"y": 123,
"w": 40,
"h": 40
}
},
{
"filename": "0034.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 1,
"y": 2,
"w": 40,
"h": 40
},
"frame": {
"x": 242,
"y": 163,
"w": 40,
"h": 40
}
},
{
"filename": "0035.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 1,
"y": 2,
"w": 40,
"h": 40
},
"frame": {
"x": 242,
"y": 203,
"w": 40,
"h": 40
}
},
{
"filename": "0036.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 41,
"h": 42
},
"spriteSourceSize": {
"x": 1,
"y": 2,
"w": 40,
"h": 40
},
"frame": {
"x": 202,
"y": 204,
"w": 40,
"h": 40
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:b36f1de558a8fa8ac8b56a9ba43a0dfd:5fe84a3f522e543bfbbfe0837355266b:2e4767b7cd134fc0ab1bb6e9eee82bc7$"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

View File

@ -1,4 +1,20 @@
{ {
"1": {
"3d3128": "5a0e24",
"000000": "000000",
"554538": "471405",
"67615b": "8f2837",
"0d835a": "d2af94",
"0e5d58": "8c6352",
"74593a": "61240a",
"09a766": "f8f0e2",
"cabfbb": "e3a378",
"efeded": "f8e2b7",
"a8905c": "9e4e21",
"c6b379": "ce8648",
"ae492a": "321512",
"c16a3f": "552d30"
},
"2": { "2": {
"3d3128": "121123", "3d3128": "121123",
"000000": "000000", "000000": "000000",

View File

@ -1,965 +0,0 @@
{
"textures": [
{
"image": "673_2.png",
"format": "RGBA8888",
"size": {
"w": 384,
"h": 384
},
"scale": 1,
"frames": [
{
"filename": "0029.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 62,
"h": 65
},
"frame": {
"x": 0,
"y": 0,
"w": 62,
"h": 65
}
},
{
"filename": "0039.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 62,
"h": 65
},
"frame": {
"x": 0,
"y": 0,
"w": 62,
"h": 65
}
},
{
"filename": "0030.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 62,
"h": 65
},
"frame": {
"x": 62,
"y": 0,
"w": 62,
"h": 65
}
},
{
"filename": "0038.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 62,
"h": 65
},
"frame": {
"x": 62,
"y": 0,
"w": 62,
"h": 65
}
},
{
"filename": "0031.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 62,
"h": 65
},
"frame": {
"x": 124,
"y": 0,
"w": 62,
"h": 65
}
},
{
"filename": "0032.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 62,
"h": 65
},
"frame": {
"x": 186,
"y": 0,
"w": 62,
"h": 65
}
},
{
"filename": "0033.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 62,
"h": 65
},
"frame": {
"x": 248,
"y": 0,
"w": 62,
"h": 65
}
},
{
"filename": "0035.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 62,
"h": 65
},
"frame": {
"x": 248,
"y": 0,
"w": 62,
"h": 65
}
},
{
"filename": "0034.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 62,
"h": 65
},
"frame": {
"x": 310,
"y": 0,
"w": 62,
"h": 65
}
},
{
"filename": "0036.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 62,
"h": 65
},
"frame": {
"x": 0,
"y": 65,
"w": 62,
"h": 65
}
},
{
"filename": "0037.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 62,
"h": 65
},
"frame": {
"x": 62,
"y": 65,
"w": 62,
"h": 65
}
},
{
"filename": "0028.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 61,
"h": 65
},
"frame": {
"x": 124,
"y": 65,
"w": 61,
"h": 65
}
},
{
"filename": "0040.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 61,
"h": 65
},
"frame": {
"x": 124,
"y": 65,
"w": 61,
"h": 65
}
},
{
"filename": "0026.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 1,
"y": 0,
"w": 60,
"h": 65
},
"frame": {
"x": 185,
"y": 65,
"w": 60,
"h": 65
}
},
{
"filename": "0027.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 1,
"y": 0,
"w": 60,
"h": 65
},
"frame": {
"x": 245,
"y": 65,
"w": 60,
"h": 65
}
},
{
"filename": "0041.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 1,
"y": 0,
"w": 60,
"h": 65
},
"frame": {
"x": 305,
"y": 65,
"w": 60,
"h": 65
}
},
{
"filename": "0042.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 1,
"y": 0,
"w": 60,
"h": 65
},
"frame": {
"x": 0,
"y": 130,
"w": 60,
"h": 65
}
},
{
"filename": "0013.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 0,
"y": 3,
"w": 60,
"h": 62
},
"frame": {
"x": 60,
"y": 130,
"w": 60,
"h": 62
}
},
{
"filename": "0001.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 1,
"y": 0,
"w": 59,
"h": 65
},
"frame": {
"x": 120,
"y": 130,
"w": 59,
"h": 65
}
},
{
"filename": "0023.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 1,
"y": 0,
"w": 59,
"h": 65
},
"frame": {
"x": 120,
"y": 130,
"w": 59,
"h": 65
}
},
{
"filename": "0024.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 1,
"y": 0,
"w": 59,
"h": 65
},
"frame": {
"x": 120,
"y": 130,
"w": 59,
"h": 65
}
},
{
"filename": "0045.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 1,
"y": 0,
"w": 59,
"h": 65
},
"frame": {
"x": 120,
"y": 130,
"w": 59,
"h": 65
}
},
{
"filename": "0002.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 1,
"y": 0,
"w": 59,
"h": 65
},
"frame": {
"x": 60,
"y": 192,
"w": 59,
"h": 65
}
},
{
"filename": "0022.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 1,
"y": 0,
"w": 59,
"h": 65
},
"frame": {
"x": 60,
"y": 192,
"w": 59,
"h": 65
}
},
{
"filename": "0025.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 1,
"y": 0,
"w": 59,
"h": 65
},
"frame": {
"x": 60,
"y": 192,
"w": 59,
"h": 65
}
},
{
"filename": "0043.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 1,
"y": 0,
"w": 59,
"h": 65
},
"frame": {
"x": 60,
"y": 192,
"w": 59,
"h": 65
}
},
{
"filename": "0021.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 1,
"y": 0,
"w": 59,
"h": 65
},
"frame": {
"x": 0,
"y": 195,
"w": 59,
"h": 65
}
},
{
"filename": "0044.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 1,
"y": 0,
"w": 59,
"h": 65
},
"frame": {
"x": 179,
"y": 130,
"w": 59,
"h": 65
}
},
{
"filename": "0003.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 2,
"y": 1,
"w": 58,
"h": 64
},
"frame": {
"x": 238,
"y": 130,
"w": 58,
"h": 64
}
},
{
"filename": "0004.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 2,
"y": 1,
"w": 58,
"h": 64
},
"frame": {
"x": 238,
"y": 130,
"w": 58,
"h": 64
}
},
{
"filename": "0005.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 2,
"y": 1,
"w": 58,
"h": 64
},
"frame": {
"x": 238,
"y": 194,
"w": 58,
"h": 64
}
},
{
"filename": "0006.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 2,
"y": 1,
"w": 58,
"h": 64
},
"frame": {
"x": 59,
"y": 257,
"w": 58,
"h": 64
}
},
{
"filename": "0019.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 2,
"y": 1,
"w": 58,
"h": 64
},
"frame": {
"x": 0,
"y": 260,
"w": 58,
"h": 64
}
},
{
"filename": "0020.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 2,
"y": 1,
"w": 58,
"h": 64
},
"frame": {
"x": 117,
"y": 257,
"w": 58,
"h": 64
}
},
{
"filename": "0012.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 2,
"y": 3,
"w": 58,
"h": 62
},
"frame": {
"x": 119,
"y": 195,
"w": 58,
"h": 62
}
},
{
"filename": "0018.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 3,
"y": 1,
"w": 57,
"h": 64
},
"frame": {
"x": 175,
"y": 257,
"w": 57,
"h": 64
}
},
{
"filename": "0014.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 2,
"y": 3,
"w": 58,
"h": 62
},
"frame": {
"x": 177,
"y": 195,
"w": 58,
"h": 62
}
},
{
"filename": "0007.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 3,
"y": 2,
"w": 57,
"h": 63
},
"frame": {
"x": 232,
"y": 258,
"w": 57,
"h": 63
}
},
{
"filename": "0008.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 3,
"y": 2,
"w": 57,
"h": 63
},
"frame": {
"x": 289,
"y": 258,
"w": 57,
"h": 63
}
},
{
"filename": "0009.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 3,
"y": 2,
"w": 57,
"h": 63
},
"frame": {
"x": 296,
"y": 130,
"w": 57,
"h": 63
}
},
{
"filename": "0017.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 3,
"y": 2,
"w": 57,
"h": 63
},
"frame": {
"x": 296,
"y": 193,
"w": 57,
"h": 63
}
},
{
"filename": "0015.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 4,
"y": 2,
"w": 56,
"h": 63
},
"frame": {
"x": 58,
"y": 321,
"w": 56,
"h": 63
}
},
{
"filename": "0016.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 4,
"y": 2,
"w": 56,
"h": 63
},
"frame": {
"x": 114,
"y": 321,
"w": 56,
"h": 63
}
},
{
"filename": "0010.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 4,
"y": 3,
"w": 56,
"h": 62
},
"frame": {
"x": 170,
"y": 321,
"w": 56,
"h": 62
}
},
{
"filename": "0011.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 62,
"h": 65
},
"spriteSourceSize": {
"x": 4,
"y": 3,
"w": 56,
"h": 62
},
"frame": {
"x": 226,
"y": 321,
"w": 56,
"h": 62
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:05149e465b79b92adcb764d8f903ce8d:523fbed3890bc743f1863e6db3150ddb:5d92dd5d09b0875a1d8f3606df775958$"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

View File

@ -28,5 +28,20 @@
"fffbff": "edf8e6", "fffbff": "edf8e6",
"7b827b": "6a856a", "7b827b": "6a856a",
"a7aba7": "98a798" "a7aba7": "98a798"
},
"2": {
"342930": "754156",
"0f0f0f": "0f0f0f",
"4a3942": "a5777f",
"937d85": "2f2655",
"b9aaaf": "453863",
"665b60": "211f45",
"efe3e1": "67548a",
"a7aba7": "ddac84",
"fffbff": "f7e5d0",
"e64c62": "aba7a8",
"993e49": "797877",
"501d25": "545151",
"7b827b": "a96c4b"
} }
} }

View File

@ -1,167 +0,0 @@
{
"textures": [
{
"image": "962_3.png",
"format": "RGBA8888",
"size": {
"w": 224,
"h": 224
},
"scale": 1,
"frames": [
{
"filename": "0003.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 97
},
"spriteSourceSize": {
"x": 1,
"y": 0,
"w": 82,
"h": 86
},
"frame": {
"x": 0,
"y": 0,
"w": 82,
"h": 86
}
},
{
"filename": "0002.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 97
},
"spriteSourceSize": {
"x": 1,
"y": 4,
"w": 87,
"h": 79
},
"frame": {
"x": 0,
"y": 86,
"w": 87,
"h": 79
}
},
{
"filename": "0001.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 97
},
"spriteSourceSize": {
"x": 1,
"y": 6,
"w": 92,
"h": 74
},
"frame": {
"x": 82,
"y": 0,
"w": 92,
"h": 74
}
},
{
"filename": "0006.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 97
},
"spriteSourceSize": {
"x": 1,
"y": 38,
"w": 91,
"h": 59
},
"frame": {
"x": 0,
"y": 165,
"w": 91,
"h": 59
}
},
{
"filename": "0007.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 97
},
"spriteSourceSize": {
"x": 1,
"y": 36,
"w": 91,
"h": 60
},
"frame": {
"x": 87,
"y": 74,
"w": 91,
"h": 60
}
},
{
"filename": "0004.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 97
},
"spriteSourceSize": {
"x": 0,
"y": 41,
"w": 101,
"h": 41
},
"frame": {
"x": 91,
"y": 134,
"w": 101,
"h": 41
}
},
{
"filename": "0005.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 101,
"h": 97
},
"spriteSourceSize": {
"x": 0,
"y": 40,
"w": 100,
"h": 38
},
"frame": {
"x": 91,
"y": 175,
"w": 100,
"h": 38
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:ee54d59ae73a6775b5d1d9b10f273445:828dff0b1dc45966e927a7a1419412f2:1e70eb3d02dd5c47565da4b5d26e2400$"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "aether_grunt_f.png",
"format": "RGBA8888",
"size": {
"w": 69,
"h": 69
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 23,
"y": 10,
"w": 35,
"h": 69
},
"frame": {
"x": 0,
"y": 0,
"w": 35,
"h": 69
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:0c9e77856d3b434e719021572bcb93de:f9c45dc5d67009b134dd1bbc5593f6ec:a694f8828aff21c718e5161e2fd63ade$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 849 B

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "aether_grunt_m.png",
"format": "RGBA8888",
"size": {
"w": 65,
"h": 65
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 16,
"y": 14,
"w": 47,
"h": 65
},
"frame": {
"x": 0,
"y": 0,
"w": 47,
"h": 65
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:963887cf29549ad3c123b8055cb4d701:68004c4a6e04c93bd21c26a6f8921f0c:d2241fc11d0fc31b26ecbedae6da74f4$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 819 B

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "faba.png",
"format": "RGBA8888",
"size": {
"w": 74,
"h": 74
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 25,
"y": 5,
"w": 31,
"h": 74
},
"frame": {
"x": 0,
"y": 0,
"w": 31,
"h": 74
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:47622708d99a504998950bd9c389a504:fe1c51be191dd9fafb5b6f309c08ae1a:8d64db18930325b8b513740c1d83ce4c$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 814 B

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "guzma.png",
"format": "RGBA8888",
"size": {
"w": 58,
"h": 58
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 21,
"y": 20,
"w": 37,
"h": 58
},
"frame": {
"x": 0,
"y": 0,
"w": 37,
"h": 58
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:c3b08a562a2882d1ca8b5e031e245da9:72a8305e547f091d15abccd2b142e401:3b302c7f9eb6ea81b65bcaeead4a95a9$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 848 B

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "lusamine.png",
"format": "RGBA8888",
"size": {
"w": 74,
"h": 74
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 22,
"y": 5,
"w": 36,
"h": 74
},
"frame": {
"x": 0,
"y": 0,
"w": 36,
"h": 74
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:41da3a1299e3831be70016dc91e49313:2413ba06767fb10fdc6fde8cc736c51c:4012333084c529872232c8d052561dc1$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 996 B

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "macro_grunt_f.png",
"format": "RGBA8888",
"size": {
"w": 74,
"h": 74
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 24,
"y": 5,
"w": 31,
"h": 74
},
"frame": {
"x": 0,
"y": 0,
"w": 31,
"h": 74
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:a015c43d80f8fd1932758e0e2cfcec61:59fc8205ea5ca04295831b4a2eb623ec:30df2ea8e9dac9e95f70534ec43d5ecd$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 837 B

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "macro_grunt_m.png",
"format": "RGBA8888",
"size": {
"w": 75,
"h": 75
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 15,
"y": 4,
"w": 48,
"h": 75
},
"frame": {
"x": 0,
"y": 0,
"w": 48,
"h": 75
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:52fccff2a0675b4e10139ddb7067d4cf:10d254175d2d8a9111cce096ffb55fa3:d57016467aa07cafdfaf13e0ff643c1b$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 919 B

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "oleana.png",
"format": "RGBA8888",
"size": {
"w": 79,
"h": 79
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 10,
"y": 1,
"w": 53,
"h": 79
},
"frame": {
"x": 0,
"y": 0,
"w": 53,
"h": 79
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:30987a671771127a38491a588c465964:38b28effcfd5c6cbc0f358912a775af3:82e2a1f8afed29be57f6c2473f4c5be2$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "plumeria.png",
"format": "RGBA8888",
"size": {
"w": 72,
"h": 72
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 23,
"y": 7,
"w": 36,
"h": 72
},
"frame": {
"x": 0,
"y": 0,
"w": 36,
"h": 72
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:5527e7b646932d429928b53f055e9d27:c0640510780d2974f9b74a7f8e6b29aa:7bfec029bae78c9d483f59c35b73afad$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 934 B

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "rose.png",
"format": "RGBA8888",
"size": {
"w": 79,
"h": 79
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 16,
"y": 1,
"w": 52,
"h": 79
},
"frame": {
"x": 0,
"y": 0,
"w": 52,
"h": 79
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:2b4ccaff7255c7d72661eac13de83ff8:72ee3660cdf470bd67375d355307e19d:8d35b104fc841baa4443581e6cea979e$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 864 B

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "skull_grunt_f.png",
"format": "RGBA8888",
"size": {
"w": 69,
"h": 69
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 27,
"y": 9,
"w": 29,
"h": 69
},
"frame": {
"x": 0,
"y": 0,
"w": 29,
"h": 69
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:2e44c39efe8e78ec75d9119731b9b1cb:4923b5197ea74a9ed0b861e2408f595b:9035f560a0ab0d45bcc084aba7172990$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 792 B

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "skull_grunt_m.png",
"format": "RGBA8888",
"size": {
"w": 67,
"h": 67
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 28,
"y": 11,
"w": 26,
"h": 67
},
"frame": {
"x": 0,
"y": 0,
"w": 26,
"h": 67
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:688a83ff13a77c6923f038db8c7e5e84:d0ece3ab82602eb0c5003bacc26dbd9f:1ff10b395daf6ebfa377680a6404f816$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 723 B

View File

@ -22,7 +22,7 @@ import {
getModifierPoolForType, getModifierPoolForType,
getModifierType, getModifierType,
getPartyLuckValue, getPartyLuckValue,
modifierTypes modifierTypes, PokemonHeldItemModifierType
} from "./modifier/modifier-type"; } from "./modifier/modifier-type";
import AbilityBar from "./ui/ability-bar"; import AbilityBar from "./ui/ability-bar";
import { BlockItemTheftAbAttr, DoubleBattleChanceAbAttr, ChangeMovePriorityAbAttr, PostBattleInitAbAttr, applyAbAttrs, applyPostBattleInitAbAttrs } from "./data/ability"; import { BlockItemTheftAbAttr, DoubleBattleChanceAbAttr, ChangeMovePriorityAbAttr, PostBattleInitAbAttr, applyAbAttrs, applyPostBattleInitAbAttrs } from "./data/ability";
@ -143,6 +143,7 @@ export default class BattleScene extends SceneBase {
public bgmVolume: number = 1; public bgmVolume: number = 1;
public fieldVolume: number = 1; public fieldVolume: number = 1;
public seVolume: number = 1; public seVolume: number = 1;
public uiVolume: number = 1;
public gameSpeed: integer = 1; public gameSpeed: integer = 1;
public damageNumbersMode: integer = 0; public damageNumbersMode: integer = 0;
public reroll: boolean = false; public reroll: boolean = false;
@ -863,14 +864,13 @@ export default class BattleScene extends SceneBase {
if (Overrides.OPP_SPECIES_OVERRIDE) { if (Overrides.OPP_SPECIES_OVERRIDE) {
species = getPokemonSpecies(Overrides.OPP_SPECIES_OVERRIDE); species = getPokemonSpecies(Overrides.OPP_SPECIES_OVERRIDE);
} }
const pokemon = new EnemyPokemon(this, species, level, trainerSlot, boss, dataSource);
if (Overrides.OPP_LEVEL_OVERRIDE !== 0) { if (Overrides.OPP_LEVEL_OVERRIDE !== 0) {
pokemon.level = Overrides.OPP_LEVEL_OVERRIDE; level = Overrides.OPP_LEVEL_OVERRIDE;
} }
if (Overrides.OPP_GENDER_OVERRIDE !== null) { const pokemon = new EnemyPokemon(this, species, level, trainerSlot, boss, dataSource);
pokemon.gender = Overrides.OPP_GENDER_OVERRIDE;
}
overrideModifiers(this, false); overrideModifiers(this, false);
overrideHeldItems(this, pokemon, false); overrideHeldItems(this, pokemon, false);
if (boss && !dataSource) { if (boss && !dataSource) {
@ -1834,6 +1834,7 @@ export default class BattleScene extends SceneBase {
} else { } else {
const soundDetails = sound.key.split("/"); const soundDetails = sound.key.split("/");
switch (soundDetails[0]) { switch (soundDetails[0]) {
case "battle_anims": case "battle_anims":
case "cry": case "cry":
if (soundDetails[1].startsWith("PRSFX- ")) { if (soundDetails[1].startsWith("PRSFX- ")) {
@ -1870,17 +1871,29 @@ export default class BattleScene extends SceneBase {
try { try {
const keyDetails = key.split("/"); const keyDetails = key.split("/");
switch (keyDetails[0]) { switch (keyDetails[0]) {
case "level_up_fanfare":
case "item_fanfare":
case "minor_fanfare":
case "heal":
case "evolution":
case "evolution_fanfare":
// These sounds are loaded in as BGM, but played as sound effects
// When these sounds are updated in updateVolume(), they are treated as BGM however because they are placed in the BGM Cache through being called by playSoundWithoutBGM()
config["volume"] = this.masterVolume * this.bgmVolume;
break;
case "battle_anims": case "battle_anims":
case "cry": case "cry":
config["volume"] = this.masterVolume * this.fieldVolume; config["volume"] = this.masterVolume * this.fieldVolume;
//PRSFX sound files are unusually loud //PRSFX sound files are unusually loud
if (key.startsWith("PRSFX- ")) { if (keyDetails[1].startsWith("PRSFX- ")) {
config["volume"] *= 0.5; config["volume"] *= 0.5;
} }
break; break;
case "se":
case "ui": case "ui":
default: //As of, right now this applies to the "select", "menu_open", "error" sound effects
config["volume"] = this.masterVolume * this.uiVolume;
break;
case "se":
config["volume"] = this.masterVolume * this.seVolume; config["volume"] = this.masterVolume * this.seVolume;
break; break;
} }
@ -2069,6 +2082,18 @@ export default class BattleScene extends SceneBase {
return 12.974; return 12.974;
case "battle_flare_grunt": //XY Team Flare Battle case "battle_flare_grunt": //XY Team Flare Battle
return 4.228; return 4.228;
case "battle_aether_grunt": // SM Aether Foundation Battle
return 16.00;
case "battle_skull_grunt": // SM Team Skull Battle
return 20.87;
case "battle_macro_grunt": // SWSH Trainer Battle
return 11.56;
case "battle_galactic_admin": //BDSP Team Galactic Admin Battle
return 11.997;
case "battle_skull_admin": //SM Team Skull Admin Battle
return 15.463;
case "battle_oleana": //SWSH Oleana Battle
return 14.110;
case "battle_rocket_boss": //USUM Giovanni Battle case "battle_rocket_boss": //USUM Giovanni Battle
return 9.115; return 9.115;
case "battle_aqua_magma_boss": //ORAS Archie & Maxie Battle case "battle_aqua_magma_boss": //ORAS Archie & Maxie Battle
@ -2079,6 +2104,12 @@ export default class BattleScene extends SceneBase {
return 25.624; return 25.624;
case "battle_flare_boss": //XY Lysandre Battle case "battle_flare_boss": //XY Lysandre Battle
return 8.085; return 8.085;
case "battle_aether_boss": //SM Lusamine Battle
return 11.33;
case "battle_skull_boss": //SM Guzma Battle
return 13.13;
case "battle_macro_boss": //SWSH Rose Battle
return 11.42;
} }
return 0; return 0;
@ -2521,13 +2552,19 @@ export default class BattleScene extends SceneBase {
party.forEach((enemyPokemon: EnemyPokemon, i: integer) => { party.forEach((enemyPokemon: EnemyPokemon, i: integer) => {
if (heldModifiersConfigs && i < heldModifiersConfigs.length && heldModifiersConfigs[i] && heldModifiersConfigs[i].length > 0) { if (heldModifiersConfigs && i < heldModifiersConfigs.length && heldModifiersConfigs[i] && heldModifiersConfigs[i].length > 0) {
heldModifiersConfigs[i].forEach(mt => { heldModifiersConfigs[i].forEach(mt => {
if (mt.modifier instanceof PokemonHeldItemModifierType) {
const stackCount = mt.stackCount ?? 1; const stackCount = mt.stackCount ?? 1;
// const isTransferable = mt.isTransferable ?? true; // const isTransferable = mt.isTransferable ?? true;
const modifier = mt.modifierType.newModifier(enemyPokemon); const modifier = mt.modifier.newModifier(enemyPokemon);
modifier.stackCount = stackCount; modifier.stackCount = stackCount;
// TODO: set isTransferable // TODO: set isTransferable
// modifier.setIsTransferable(isTransferable); // modifier.setIsTransferable(isTransferable);
this.addEnemyModifier(modifier, true); this.addEnemyModifier(modifier, true);
} else {
const modifier = mt.modifier as PokemonHeldItemModifier;
modifier.pokemonId = enemyPokemon.id;
this.addEnemyModifier(modifier, true);
}
}); });
} else { } else {
const isBoss = enemyPokemon.isBoss() || (this.currentBattle.battleType === BattleType.TRAINER && !!this.currentBattle.trainer?.config.isBoss); const isBoss = enemyPokemon.isBoss() || (this.currentBattle.battleType === BattleType.TRAINER && !!this.currentBattle.trainer?.config.isBoss);

View File

@ -499,27 +499,27 @@ export const classicFixedBattles: FixedBattleConfigs = {
[25]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) [25]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
.setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_2, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_2, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)),
[35]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) [35]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ], true)), .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT ], true)),
[55]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) [55]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
.setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_3, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_3, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)),
[62]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) [62]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35)
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ], true)), .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT ], true)),
[64]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) [64]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35)
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ], true)), .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT ], true)),
[66]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) [66]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35)
.setGetTrainerFunc(getRandomTrainerFunc([[ TrainerType.ARCHER, TrainerType.ARIANA, TrainerType.PROTON, TrainerType.PETREL ], [ TrainerType.TABITHA, TrainerType.COURTNEY ], [ TrainerType.MATT, TrainerType.SHELLY ], [ TrainerType.JUPITER, TrainerType.MARS, TrainerType.SATURN ], [ TrainerType.ZINZOLIN, TrainerType.ROOD ], [ TrainerType.XEROSIC, TrainerType.BRYONY ] ], true)), .setGetTrainerFunc(getRandomTrainerFunc([[ TrainerType.ARCHER, TrainerType.ARIANA, TrainerType.PROTON, TrainerType.PETREL ], [ TrainerType.TABITHA, TrainerType.COURTNEY ], [ TrainerType.MATT, TrainerType.SHELLY ], [ TrainerType.JUPITER, TrainerType.MARS, TrainerType.SATURN ], [ TrainerType.ZINZOLIN, TrainerType.ROOD ], [ TrainerType.XEROSIC, TrainerType.BRYONY ], TrainerType.FABA, TrainerType.PLUMERIA, TrainerType.OLEANA ], true)),
[95]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) [95]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
.setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_4, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_4, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)),
[112]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) [112]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35)
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ], true)), .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT ], true)),
[114]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) [114]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35)
.setGetTrainerFunc(getRandomTrainerFunc([[ TrainerType.ARCHER, TrainerType.ARIANA, TrainerType.PROTON, TrainerType.PETREL ], [ TrainerType.TABITHA, TrainerType.COURTNEY ], [ TrainerType.MATT, TrainerType.SHELLY ], [ TrainerType.JUPITER, TrainerType.MARS, TrainerType.SATURN ], [ TrainerType.ZINZOLIN, TrainerType.ROOD ], [ TrainerType.XEROSIC, TrainerType.BRYONY ] ], true, 1)), .setGetTrainerFunc(getRandomTrainerFunc([[ TrainerType.ARCHER, TrainerType.ARIANA, TrainerType.PROTON, TrainerType.PETREL ], [ TrainerType.TABITHA, TrainerType.COURTNEY ], [ TrainerType.MATT, TrainerType.SHELLY ], [ TrainerType.JUPITER, TrainerType.MARS, TrainerType.SATURN ], [ TrainerType.ZINZOLIN, TrainerType.ROOD ], [ TrainerType.XEROSIC, TrainerType.BRYONY ], TrainerType.FABA, TrainerType.PLUMERIA, TrainerType.OLEANA ], true, 1)),
[115]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) [115]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35)
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_1, TrainerType.MAXIE, TrainerType.ARCHIE, TrainerType.CYRUS, TrainerType.GHETSIS, TrainerType.LYSANDRE ])), .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_1, TrainerType.MAXIE, TrainerType.ARCHIE, TrainerType.CYRUS, TrainerType.GHETSIS, TrainerType.LYSANDRE, TrainerType.LUSAMINE, TrainerType.GUZMA, TrainerType.ROSE ])),
[145]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) [145]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
.setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_5, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_5, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)),
[165]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) [165]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35)
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_2, TrainerType.MAXIE_2, TrainerType.ARCHIE_2, TrainerType.CYRUS_2, TrainerType.GHETSIS_2, TrainerType.LYSANDRE_2 ])), .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_2, TrainerType.MAXIE_2, TrainerType.ARCHIE_2, TrainerType.CYRUS_2, TrainerType.GHETSIS_2, TrainerType.LYSANDRE_2, TrainerType.LUSAMINE_2, TrainerType.GUZMA_2, TrainerType.ROSE_2 ])),
[182]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) [182]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.LORELEI, TrainerType.WILL, TrainerType.SIDNEY, TrainerType.AARON, TrainerType.SHAUNTAL, TrainerType.MALVA, [ TrainerType.HALA, TrainerType.MOLAYNE ], TrainerType.MARNIE_ELITE, TrainerType.RIKA, TrainerType.CRISPIN ])), .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.LORELEI, TrainerType.WILL, TrainerType.SIDNEY, TrainerType.AARON, TrainerType.SHAUNTAL, TrainerType.MALVA, [ TrainerType.HALA, TrainerType.MOLAYNE ], TrainerType.MARNIE_ELITE, TrainerType.RIKA, TrainerType.CRISPIN ])),
[184]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182) [184]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182)

View File

@ -1107,12 +1107,13 @@ export abstract class BattleAnim {
let r = anim!.frames.length; let r = anim!.frames.length;
let f = 0; let f = 0;
const existingFieldSprites = [...scene.field.getAll()]; let existingFieldSprites = scene.field.getAll().slice(0);
scene.tweens.addCounter({ scene.tweens.addCounter({
duration: Utils.getFrameMs(3) * frameTimeMult, duration: Utils.getFrameMs(3) * frameTimeMult,
repeat: anim!.frames.length, repeat: anim!.frames.length,
onRepeat: () => { onRepeat: () => {
existingFieldSprites = scene.field.getAll().slice(0);
const spriteFrames = anim!.frames[f]; const spriteFrames = anim!.frames[f];
const frameData = this.getGraphicFrameDataWithoutTarget(anim!.frames[f], targetInitialX, targetInitialY); const frameData = this.getGraphicFrameDataWithoutTarget(anim!.frames[f], targetInitialX, targetInitialY);
const u = 0; const u = 0;
@ -1139,7 +1140,8 @@ export abstract class BattleAnim {
const setSpritePriority = (priority: integer) => { const setSpritePriority = (priority: integer) => {
if (existingFieldSprites.length > priority) { if (existingFieldSprites.length > priority) {
// Move to specified priority index // Move to specified priority index
scene.field.moveTo(moveSprite, scene.field.getIndex(existingFieldSprites[priority])); const index = scene.field.getIndex(existingFieldSprites[priority]);
scene.field.moveTo(moveSprite, index);
} else { } else {
// Move to top of scene // Move to top of scene
scene.field.moveTo(moveSprite, scene.field.getAll().length - 1); scene.field.moveTo(moveSprite, scene.field.getAll().length - 1);

View File

@ -49,7 +49,8 @@ export function getDailyRunStarters(scene: BattleScene, seed: string): Starter[]
const costSpecies = Object.keys(speciesStarters) const costSpecies = Object.keys(speciesStarters)
.map(s => parseInt(s) as Species) .map(s => parseInt(s) as Species)
.filter(s => speciesStarters[s] === cost); .filter(s => speciesStarters[s] === cost);
const starterSpecies = getPokemonSpecies(getPokemonSpecies(Utils.randSeedItem(costSpecies)).getTrainerSpeciesForLevel(startingLevel, true, PartyMemberStrength.STRONGER)); const randPkmSpecies = getPokemonSpecies(Utils.randSeedItem(costSpecies));
const starterSpecies = getPokemonSpecies(randPkmSpecies.getTrainerSpeciesForLevel(startingLevel, true, PartyMemberStrength.STRONGER));
starters.push(getDailyRunStarter(scene, starterSpecies, startingLevel)); starters.push(getDailyRunStarter(scene, starterSpecies, startingLevel));
} }
}, 0, seed); }, 0, seed);

View File

@ -753,6 +753,98 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
] ]
} }
], ],
[TrainerType.AETHER_GRUNT]: [
{
encounter: [
"dialogue:aether_grunt.encounter.1",
"dialogue:aether_grunt.encounter.2",
"dialogue:aether_grunt.encounter.3",
"dialogue:aether_grunt.encounter.4",
"dialogue:aether_grunt.encounter.5",
],
victory: [
"dialogue:aether_grunt.victory.1",
"dialogue:aether_grunt.victory.2",
"dialogue:aether_grunt.victory.3",
"dialogue:aether_grunt.victory.4",
"dialogue:aether_grunt.victory.5",
]
}
],
[TrainerType.FABA]: [
{
encounter: [
"dialogue:faba.encounter.1",
"dialogue:faba.encounter.2",
"dialogue:faba.encounter.3",
],
victory: [
"dialogue:faba.victory.1",
"dialogue:faba.victory.2",
"dialogue:faba.victory.3",
]
}
],
[TrainerType.SKULL_GRUNT]: [
{
encounter: [
"dialogue:skull_grunt.encounter.1",
"dialogue:skull_grunt.encounter.2",
"dialogue:skull_grunt.encounter.3",
"dialogue:skull_grunt.encounter.4",
"dialogue:skull_grunt.encounter.5",
],
victory: [
"dialogue:skull_grunt.victory.1",
"dialogue:skull_grunt.victory.2",
"dialogue:skull_grunt.victory.3",
"dialogue:skull_grunt.victory.4",
"dialogue:skull_grunt.victory.5",
]
}
],
[TrainerType.PLUMERIA]: [
{
encounter: [
"dialogue:plumeria.encounter.1",
"dialogue:plumeria.encounter.2",
"dialogue:plumeria.encounter.3",
],
victory: [
"dialogue:plumeria.victory.1",
"dialogue:plumeria.victory.2",
"dialogue:plumeria.victory.3",
]
}
],
[TrainerType.MACRO_GRUNT]: [
{
encounter: [
"dialogue:macro_grunt.encounter.1",
"dialogue:macro_grunt.encounter.2",
"dialogue:macro_grunt.encounter.3",
],
victory: [
"dialogue:macro_grunt.victory.1",
"dialogue:macro_grunt.victory.2",
"dialogue:macro_grunt.victory.3",
]
}
],
[TrainerType.OLEANA]: [
{
encounter: [
"dialogue:oleana.encounter.1",
"dialogue:oleana.encounter.2",
"dialogue:oleana.encounter.3",
],
victory: [
"dialogue:oleana.victory.1",
"dialogue:oleana.victory.2",
"dialogue:oleana.victory.3",
]
}
],
[TrainerType.ROCKET_BOSS_GIOVANNI_1]: [ [TrainerType.ROCKET_BOSS_GIOVANNI_1]: [
{ {
encounter: [ encounter: [
@ -909,6 +1001,84 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
] ]
} }
], ],
[TrainerType.LUSAMINE]: [
{
encounter: [
"dialogue:aether_boss_lusamine_1.encounter.1"
],
victory: [
"dialogue:aether_boss_lusamine_1.victory.1"
],
defeat: [
"dialogue:aether_boss_lusamine_1.defeat.1"
]
}
],
[TrainerType.LUSAMINE_2]: [
{
encounter: [
"dialogue:aether_boss_lusamine_2.encounter.1"
],
victory: [
"dialogue:aether_boss_lusamine_2.victory.1"
],
defeat: [
"dialogue:aether_boss_lusamine_2.defeat.1"
]
}
],
[TrainerType.GUZMA]: [
{
encounter: [
"dialogue:skull_boss_guzma_1.encounter.1"
],
victory: [
"dialogue:skull_boss_guzma_1.victory.1"
],
defeat: [
"dialogue:skull_boss_guzma_1.defeat.1"
]
}
],
[TrainerType.GUZMA_2]: [
{
encounter: [
"dialogue:skull_boss_guzma_2.encounter.1"
],
victory: [
"dialogue:skull_boss_guzma_2.victory.1"
],
defeat: [
"dialogue:skull_boss_guzma_2.defeat.1"
]
}
],
[TrainerType.ROSE]: [
{
encounter: [
"dialogue:macro_boss_rose_1.encounter.1"
],
victory: [
"dialogue:macro_boss_rose_1.victory.1"
],
defeat: [
"dialogue:macro_boss_rose_1.defeat.1"
]
}
],
[TrainerType.ROSE_2]: [
{
encounter: [
"dialogue:macro_boss_rose_2.encounter.1"
],
victory: [
"dialogue:macro_boss_rose_2.victory.1"
],
defeat: [
"dialogue:macro_boss_rose_2.defeat.1"
]
}
],
[TrainerType.BUCK]: [ [TrainerType.BUCK]: [
{ {
encounter: [ encounter: [

View File

@ -601,11 +601,13 @@ export default class Move implements Localizable {
return true; return true;
} }
} }
break;
case MoveFlags.IGNORE_PROTECT: case MoveFlags.IGNORE_PROTECT:
if (user.hasAbilityWithAttr(IgnoreProtectOnContactAbAttr) && if (user.hasAbilityWithAttr(IgnoreProtectOnContactAbAttr) &&
this.checkFlag(MoveFlags.MAKES_CONTACT, user, target)) { this.checkFlag(MoveFlags.MAKES_CONTACT, user, target)) {
return true; return true;
} }
break;
} }
return !!(this.flags & flag); return !!(this.flags & flag);
@ -8568,7 +8570,8 @@ export function initMoves() {
new AttackMove(Moves.BODY_PRESS, Type.FIGHTING, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 8) new AttackMove(Moves.BODY_PRESS, Type.FIGHTING, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 8)
.attr(DefAtkAttr), .attr(DefAtkAttr),
new StatusMove(Moves.DECORATE, Type.FAIRY, -1, 15, -1, 0, 8) new StatusMove(Moves.DECORATE, Type.FAIRY, -1, 15, -1, 0, 8)
.attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK ], 2), .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK ], 2)
.ignoresProtect(),
new AttackMove(Moves.DRUM_BEATING, Type.GRASS, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 8) new AttackMove(Moves.DRUM_BEATING, Type.GRASS, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 8)
.attr(StatChangeAttr, BattleStat.SPD, -1) .attr(StatChangeAttr, BattleStat.SPD, -1)
.makesContact(false), .makesContact(false),

View File

@ -13,6 +13,8 @@ import { IEggOptions } from "#app/data/egg";
import { EggSourceType } from "#enums/egg-source-types"; import { EggSourceType } from "#enums/egg-source-types";
import { EggTier } from "#enums/egg-type"; import { EggTier } from "#enums/egg-type";
import { PartyHealPhase } from "#app/phases/party-heal-phase"; import { PartyHealPhase } from "#app/phases/party-heal-phase";
import { ModifierTier } from "#app/modifier/modifier-tier";
import { modifierTypes } from "#app/modifier/modifier-type";
/** the i18n namespace for the encounter */ /** the i18n namespace for the encounter */
const namespace = "mysteryEncounter:aTrainersTest"; const namespace = "mysteryEncounter:aTrainersTest";
@ -136,7 +138,7 @@ export const ATrainersTestEncounter: MysteryEncounter =
}, },
async (scene: BattleScene) => { async (scene: BattleScene) => {
const encounter = scene.currentBattle.mysteryEncounter!; const encounter = scene.currentBattle.mysteryEncounter!;
// Spawn standard trainer battle with memory mushroom reward // Battle the stat trainer for an Egg and great rewards
const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0];
await transitionMysteryEncounterIntroVisuals(scene); await transitionMysteryEncounterIntroVisuals(scene);
@ -149,7 +151,7 @@ export const ATrainersTestEncounter: MysteryEncounter =
tier: EggTier.ULTRA tier: EggTier.ULTRA
}; };
encounter.setDialogueToken("eggType", i18next.t(`${namespace}.eggTypes.epic`)); encounter.setDialogueToken("eggType", i18next.t(`${namespace}.eggTypes.epic`));
setEncounterRewards(scene, { fillRemaining: true }, [eggOptions]); setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.SACRED_ASH], guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ULTRA], fillRemaining: true }, [eggOptions]);
return initBattleWithEnemyConfig(scene, config); return initBattleWithEnemyConfig(scene, config);
} }

View File

@ -175,7 +175,7 @@ export const AbsoluteAvariceEncounter: MysteryEncounter =
.withOnInit((scene: BattleScene) => { .withOnInit((scene: BattleScene) => {
const encounter = scene.currentBattle.mysteryEncounter!; const encounter = scene.currentBattle.mysteryEncounter!;
scene.loadSe("PRSFX- Bug Bite", "battle_anims"); scene.loadSe("PRSFX- Bug Bite", "battle_anims", "PRSFX- Bug Bite.wav");
scene.loadSe("Follow Me", "battle_anims", "Follow Me.mp3"); scene.loadSe("Follow Me", "battle_anims", "Follow Me.mp3");
// Get all player berry items, remove from party, and store reference // Get all player berry items, remove from party, and store reference
@ -199,7 +199,7 @@ export const AbsoluteAvariceEncounter: MysteryEncounter =
// Overflow berries will be "lost" on the boss, but it's un-catchable anyway // Overflow berries will be "lost" on the boss, but it's un-catchable anyway
for (let i = 0; i < berryMod.stackCount; i++) { for (let i = 0; i < berryMod.stackCount; i++) {
const modifierType = generateModifierType(scene, modifierTypes.BERRY, [berryMod.berryType]) as PokemonHeldItemModifierType; const modifierType = generateModifierType(scene, modifierTypes.BERRY, [berryMod.berryType]) as PokemonHeldItemModifierType;
bossModifierConfigs.push({ modifierType }); bossModifierConfigs.push({ modifier: modifierType });
} }
scene.removeModifier(berryMod); scene.removeModifier(berryMod);
@ -351,7 +351,7 @@ function doGreedentSpriteSteal(scene: BattleScene) {
const greedentSprites = scene.currentBattle.mysteryEncounter!.introVisuals?.getSpriteAtIndex(1); const greedentSprites = scene.currentBattle.mysteryEncounter!.introVisuals?.getSpriteAtIndex(1);
scene.playSound("battle-anims/Follow Me"); scene.playSound("battle_anims/Follow Me");
scene.tweens.chain({ scene.tweens.chain({
targets: greedentSprites, targets: greedentSprites,
tweens: [ tweens: [

View File

@ -131,7 +131,7 @@ export const BerriesAboundEncounter: MysteryEncounter =
const doBerryRewards = async () => { const doBerryRewards = async () => {
const berryText = numBerries + " " + i18next.t(`${namespace}.berries`); const berryText = numBerries + " " + i18next.t(`${namespace}.berries`);
scene.playSound("bgm/item_fanfare"); scene.playSound("item_fanfare");
queueEncounterMessage(scene, i18next.t("battle:rewardGain", { modifierName: berryText })); queueEncounterMessage(scene, i18next.t("battle:rewardGain", { modifierName: berryText }));
// Generate a random berry and give it to the first Pokemon with room for it // Generate a random berry and give it to the first Pokemon with room for it
@ -182,7 +182,7 @@ export const BerriesAboundEncounter: MysteryEncounter =
const doBerryRewards = async () => { const doBerryRewards = async () => {
const berryText = numBerries + " " + i18next.t(`${namespace}.berries`); const berryText = numBerries + " " + i18next.t(`${namespace}.berries`);
scene.playSound("bgm/item_fanfare"); scene.playSound("item_fanfare");
queueEncounterMessage(scene, i18next.t("battle:rewardGain", { modifierName: berryText })); queueEncounterMessage(scene, i18next.t("battle:rewardGain", { modifierName: berryText }));
// Generate a random berry and give it to the first Pokemon with room for it // Generate a random berry and give it to the first Pokemon with room for it
@ -208,7 +208,7 @@ export const BerriesAboundEncounter: MysteryEncounter =
const doFasterBerryRewards = async () => { const doFasterBerryRewards = async () => {
const berryText = numBerriesGrabbed + " " + i18next.t(`${namespace}.berries`); const berryText = numBerriesGrabbed + " " + i18next.t(`${namespace}.berries`);
scene.playSound("bgm/item_fanfare"); scene.playSound("item_fanfare");
queueEncounterMessage(scene, i18next.t("battle:rewardGain", { modifierName: berryText })); queueEncounterMessage(scene, i18next.t("battle:rewardGain", { modifierName: berryText }));
// Generate a random berry and give it to the first Pokemon with room for it (trying to give to fastest first) // Generate a random berry and give it to the first Pokemon with room for it (trying to give to fastest first)

View File

@ -1,5 +1,5 @@
import { EnemyPartyConfig, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { EnemyPartyConfig, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils";
import Pokemon, { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import Pokemon, { EnemyPokemon, PlayerPokemon, PokemonMove } from "#app/field/pokemon";
import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type";
import { Species } from "#enums/species"; import { Species } from "#enums/species";
import BattleScene from "#app/battle-scene"; import BattleScene from "#app/battle-scene";
@ -88,7 +88,7 @@ export const DancingLessonsEncounter: MysteryEncounter =
.withAutoHideIntroVisuals(false) .withAutoHideIntroVisuals(false)
.withCatchAllowed(true) .withCatchAllowed(true)
.withOnVisualsStart((scene: BattleScene) => { .withOnVisualsStart((scene: BattleScene) => {
const danceAnim = new EncounterBattleAnim(EncounterAnim.DANCE, scene.getEnemyPokemon()!, scene.getPlayerPokemon()); const danceAnim = new EncounterBattleAnim(EncounterAnim.DANCE, scene.getEnemyPokemon()!, scene.getParty()[0]);
danceAnim.play(scene); danceAnim.play(scene);
return true; return true;
@ -105,7 +105,8 @@ export const DancingLessonsEncounter: MysteryEncounter =
const encounter = scene.currentBattle.mysteryEncounter!; const encounter = scene.currentBattle.mysteryEncounter!;
const species = getPokemonSpecies(Species.ORICORIO); const species = getPokemonSpecies(Species.ORICORIO);
const enemyPokemon = scene.addEnemyPokemon(species, scene.currentBattle.enemyLevels![0], TrainerSlot.NONE, false); const level = (scene.currentBattle.enemyLevels?.[0] ?? scene.currentBattle.waveIndex) + Math.max(Math.round((scene.currentBattle.waveIndex / 10)), 0);
const enemyPokemon = new EnemyPokemon(scene, species, level, TrainerSlot.NONE, false);
if (!enemyPokemon.moveset.some(m => m && m.getMove().id === Moves.REVELATION_DANCE)) { if (!enemyPokemon.moveset.some(m => m && m.getMove().id === Moves.REVELATION_DANCE)) {
if (enemyPokemon.moveset.length < 4) { if (enemyPokemon.moveset.length < 4) {
enemyPokemon.moveset.push(new PokemonMove(Moves.REVELATION_DANCE)); enemyPokemon.moveset.push(new PokemonMove(Moves.REVELATION_DANCE));
@ -130,10 +131,11 @@ export const DancingLessonsEncounter: MysteryEncounter =
} }
const oricorioData = new PokemonData(enemyPokemon); const oricorioData = new PokemonData(enemyPokemon);
const oricorio = scene.addEnemyPokemon(species, scene.currentBattle.enemyLevels![0], TrainerSlot.NONE, false, oricorioData);
// Adds a real Pokemon sprite to the field (required for the animation) // Adds a real Pokemon sprite to the field (required for the animation)
scene.currentBattle.enemyParty[0] = enemyPokemon; scene.currentBattle.enemyParty[0] = oricorio;
scene.field.add(enemyPokemon); scene.field.add(oricorio);
const config: EnemyPartyConfig = { const config: EnemyPartyConfig = {
levelAdditiveMultiplier: 1, levelAdditiveMultiplier: 1,
@ -141,11 +143,11 @@ export const DancingLessonsEncounter: MysteryEncounter =
species: species, species: species,
dataSource: oricorioData, dataSource: oricorioData,
isBoss: true, isBoss: true,
// Gets +1 to all stats on battle start // Gets +1 to all stats except SPD on battle start
tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON],
mysteryEncounterBattleEffects: (pokemon: Pokemon) => { mysteryEncounterBattleEffects: (pokemon: Pokemon) => {
queueEncounterMessage(pokemon.scene, `${namespace}.option.1.boss_enraged`); queueEncounterMessage(pokemon.scene, `${namespace}.option.1.boss_enraged`);
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF], 1));
} }
}], }],
}; };

View File

@ -12,6 +12,7 @@ import { getRandomPlayerPokemon, getRandomSpeciesByStarterTier } from "#app/data
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
import { ModifierRewardPhase } from "#app/phases/modifier-reward-phase"; import { ModifierRewardPhase } from "#app/phases/modifier-reward-phase";
import { PokemonFormChangeItemModifier, PokemonHeldItemModifier } from "#app/modifier/modifier";
/** i18n namespace for encounter */ /** i18n namespace for encounter */
const namespace = "mysteryEncounter:darkDeal"; const namespace = "mysteryEncounter:darkDeal";
@ -125,25 +126,27 @@ export const DarkDealEncounter: MysteryEncounter =
// Removes random pokemon (including fainted) from party and adds name to dialogue data tokens // Removes random pokemon (including fainted) from party and adds name to dialogue data tokens
// Will never return last battle able mon and instead pick fainted/unable to battle // Will never return last battle able mon and instead pick fainted/unable to battle
const removedPokemon = getRandomPlayerPokemon(scene, false, true); const removedPokemon = getRandomPlayerPokemon(scene, false, true);
// Get all the pokemon's held items
const modifiers = removedPokemon.getHeldItems().filter(m => !(m instanceof PokemonFormChangeItemModifier));
scene.removePokemonFromPlayerParty(removedPokemon); scene.removePokemonFromPlayerParty(removedPokemon);
const encounter = scene.currentBattle.mysteryEncounter!; const encounter = scene.currentBattle.mysteryEncounter!;
encounter.setDialogueToken("pokeName", removedPokemon.getNameToRender()); encounter.setDialogueToken("pokeName", removedPokemon.getNameToRender());
// Store removed pokemon types // Store removed pokemon types
encounter.misc = [ encounter.misc = {
removedPokemon.species.type1, removedTypes: removedPokemon.getTypes(),
]; modifiers
if (removedPokemon.species.type2) { };
encounter.misc.push(removedPokemon.species.type2);
}
}) })
.withOptionPhase(async (scene: BattleScene) => { .withOptionPhase(async (scene: BattleScene) => {
// Give the player 5 Rogue Balls // Give the player 5 Rogue Balls
const encounter = scene.currentBattle.mysteryEncounter!;
scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.ROGUE_BALL)); scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.ROGUE_BALL));
// Start encounter with random legendary (7-10 starter strength) that has level additive // Start encounter with random legendary (7-10 starter strength) that has level additive
const bossTypes = scene.currentBattle.mysteryEncounter!.misc as Type[]; const bossTypes: Type[] = encounter.misc.removedTypes;
const bossModifiers: PokemonHeldItemModifier[] = encounter.misc.modifiers;
// Starter egg tier, 35/50/10/5 %odds for tiers 6/7/8/9+ // Starter egg tier, 35/50/10/5 %odds for tiers 6/7/8/9+
const roll = randSeedInt(100); const roll = randSeedInt(100);
const starterTier: number | [number, number] = const starterTier: number | [number, number] =
@ -152,6 +155,11 @@ export const DarkDealEncounter: MysteryEncounter =
const pokemonConfig: EnemyPokemonConfig = { const pokemonConfig: EnemyPokemonConfig = {
species: bossSpecies, species: bossSpecies,
isBoss: true, isBoss: true,
modifierConfigs: bossModifiers.map(m => {
return {
modifier: m
};
})
}; };
if (!isNullOrUndefined(bossSpecies.forms) && bossSpecies.forms.length > 0) { if (!isNullOrUndefined(bossSpecies.forms) && bossSpecies.forms.length > 0) {
pokemonConfig.formIndex = 0; pokemonConfig.formIndex = 0;

View File

@ -115,7 +115,7 @@ export const DelibirdyEncounter: MysteryEncounter =
// At max stacks, give the first party pokemon a Shell Bell instead // At max stacks, give the first party pokemon a Shell Bell instead
const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType;
await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell); await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell);
scene.playSound("bgm/item_fanfare"); scene.playSound("item_fanfare");
await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), undefined, true); await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), undefined, true);
} else { } else {
scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.ABILITY_CHARM)); scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.ABILITY_CHARM));
@ -190,7 +190,7 @@ export const DelibirdyEncounter: MysteryEncounter =
// At max stacks, give the first party pokemon a Shell Bell instead // At max stacks, give the first party pokemon a Shell Bell instead
const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType;
await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell); await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell);
scene.playSound("bgm/item_fanfare"); scene.playSound("item_fanfare");
await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), undefined, true); await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), undefined, true);
} else { } else {
scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.CANDY_JAR)); scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.CANDY_JAR));
@ -203,7 +203,7 @@ export const DelibirdyEncounter: MysteryEncounter =
// At max stacks, give the first party pokemon a Shell Bell instead // At max stacks, give the first party pokemon a Shell Bell instead
const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType;
await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell); await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell);
scene.playSound("bgm/item_fanfare"); scene.playSound("item_fanfare");
await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), undefined, true); await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), undefined, true);
} else { } else {
scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.HEALING_CHARM)); scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.HEALING_CHARM));
@ -283,7 +283,7 @@ export const DelibirdyEncounter: MysteryEncounter =
// At max stacks, give the first party pokemon a Shell Bell instead // At max stacks, give the first party pokemon a Shell Bell instead
const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType;
await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell); await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell);
scene.playSound("bgm/item_fanfare"); scene.playSound("item_fanfare");
await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), undefined, true); await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), undefined, true);
} else { } else {
scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.BERRY_POUCH)); scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.BERRY_POUCH));

View File

@ -6,7 +6,7 @@ import {
setEncounterRewards setEncounterRewards
} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; } from "#app/data/mystery-encounters/utils/encounter-phase-utils";
import { STEALING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; import { STEALING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups";
import { EnemyPokemon } from "#app/field/pokemon"; import Pokemon, { EnemyPokemon } from "#app/field/pokemon";
import { ModifierTier } from "#app/modifier/modifier-tier"; import { ModifierTier } from "#app/modifier/modifier-tier";
import { import {
getPartyLuckValue, getPartyLuckValue,
@ -24,6 +24,10 @@ import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode
import { TrainerSlot } from "#app/data/trainer-config"; import { TrainerSlot } from "#app/data/trainer-config";
import { getSpriteKeysFromPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { getSpriteKeysFromPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils";
import PokemonData from "#app/system/pokemon-data"; import PokemonData from "#app/system/pokemon-data";
import { BattlerTagType } from "#enums/battler-tag-type";
import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
import { StatChangePhase } from "#app/phases/stat-change-phase";
import { randSeedInt } from "#app/utils";
/** the i18n namespace for the encounter */ /** the i18n namespace for the encounter */
const namespace = "mysteryEncounter:fightOrFlight"; const namespace = "mysteryEncounter:fightOrFlight";
@ -58,13 +62,19 @@ export const FightOrFlightEncounter: MysteryEncounter =
level: level, level: level,
species: bossSpecies, species: bossSpecies,
dataSource: new PokemonData(bossPokemon), dataSource: new PokemonData(bossPokemon),
isBoss: true isBoss: true,
tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON],
mysteryEncounterBattleEffects: (pokemon: Pokemon) => {
queueEncounterMessage(pokemon.scene, `${namespace}.option.1.stat_boost`);
// Randomly boost 1 stat 2 stages
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [randSeedInt(8)], 2));
}
}], }],
}; };
encounter.enemyPartyConfigs = [config]; encounter.enemyPartyConfigs = [config];
// Calculate item // Calculate item
// 10-40 GREAT, 60-120 ULTRA, 120-160 ROGUE, 160-180 MASTER // Waves 10-40 GREAT, 60-120 ULTRA, 120-160 ROGUE, 160-180 MASTER
const tier = const tier =
scene.currentBattle.waveIndex > 160 scene.currentBattle.waveIndex > 160
? ModifierTier.MASTER ? ModifierTier.MASTER
@ -122,6 +132,7 @@ export const FightOrFlightEncounter: MysteryEncounter =
}, },
async (scene: BattleScene) => { async (scene: BattleScene) => {
// Pick battle // Pick battle
// Pokemon will randomly boost 1 stat by 2 stages
const item = scene.currentBattle.mysteryEncounter!.misc as ModifierTypeOption; const item = scene.currentBattle.mysteryEncounter!.misc as ModifierTypeOption;
setEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false }); setEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false });
await initBattleWithEnemyConfig(scene, scene.currentBattle.mysteryEncounter!.enemyPartyConfigs[0]); await initBattleWithEnemyConfig(scene, scene.currentBattle.mysteryEncounter!.enemyPartyConfigs[0]);

View File

@ -21,18 +21,27 @@ const namespace = "mysteryEncounter:mysteriousChest";
export const MysteriousChestEncounter: MysteryEncounter = export const MysteriousChestEncounter: MysteryEncounter =
MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.MYSTERIOUS_CHEST) MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.MYSTERIOUS_CHEST)
.withEncounterTier(MysteryEncounterTier.COMMON) .withEncounterTier(MysteryEncounterTier.COMMON)
.withSceneWaveRangeRequirement(10, 180) // waves 2 to 180 .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180
.withAutoHideIntroVisuals(false) .withAutoHideIntroVisuals(false)
.withIntroSpriteConfigs([ .withIntroSpriteConfigs([
{ {
spriteKey: "chest_blue", spriteKey: "chest_blue",
fileRoot: "mystery-encounters", fileRoot: "mystery-encounters",
hasShadow: true, hasShadow: true,
x: 4, y: 8,
y: 10, yShadow: 6,
yShadow: 3, alpha: 1,
disableAnimation: true, // Re-enabled after option select disableAnimation: true, // Re-enabled after option select
}, },
{
spriteKey: "chest_red",
fileRoot: "mystery-encounters",
hasShadow: false,
y: 8,
yShadow: 6,
alpha: 0,
disableAnimation: true, // Re-enabled after option select
}
]) ])
.withIntroDialogue([ .withIntroDialogue([
{ {
@ -56,14 +65,30 @@ export const MysteriousChestEncounter: MysteryEncounter =
}) })
.withPreOptionPhase(async (scene: BattleScene) => { .withPreOptionPhase(async (scene: BattleScene) => {
// Play animation // Play animation
const introVisuals = const encounter = scene.currentBattle.mysteryEncounter!;
scene.currentBattle.mysteryEncounter!.introVisuals!; const introVisuals = encounter.introVisuals!;
// Determine roll first
const roll = randSeedInt(100);
encounter.misc = {
roll
};
if (roll <= 35) {
// Chest is springing trap, change to red chest sprite
const blueChestSprites = introVisuals.getSpriteAtIndex(0);
const redChestSprites = introVisuals.getSpriteAtIndex(1);
redChestSprites[0].setAlpha(1);
blueChestSprites[0].setAlpha(0.001);
}
introVisuals.spriteConfigs[0].disableAnimation = false; introVisuals.spriteConfigs[0].disableAnimation = false;
introVisuals.spriteConfigs[1].disableAnimation = false;
introVisuals.playAnim(); introVisuals.playAnim();
}) })
.withOptionPhase(async (scene: BattleScene) => { .withOptionPhase(async (scene: BattleScene) => {
// Open the chest // Open the chest
const roll = randSeedInt(100); const encounter = scene.currentBattle.mysteryEncounter!;
const roll = encounter.misc.roll;
if (roll > 60) { if (roll > 60) {
// Choose between 2 COMMON / 2 GREAT tier items (40%) // Choose between 2 COMMON / 2 GREAT tier items (40%)
setEncounterRewards(scene, { setEncounterRewards(scene, {
@ -106,14 +131,14 @@ export const MysteriousChestEncounter: MysteryEncounter =
queueEncounterMessage(scene, `${namespace}.option.1.amazing`); queueEncounterMessage(scene, `${namespace}.option.1.amazing`);
leaveEncounterWithoutBattle(scene); leaveEncounterWithoutBattle(scene);
} else { } else {
// Your highest level unfainted Pok<EFBFBD>mon gets OHKO. Progress with no rewards (35%) // Your highest level unfainted Pokemon gets OHKO. Progress with no rewards (35%)
const highestLevelPokemon = getHighestLevelPlayerPokemon( const highestLevelPokemon = getHighestLevelPlayerPokemon(
scene, scene,
true true
); );
koPlayerPokemon(scene, highestLevelPokemon); koPlayerPokemon(scene, highestLevelPokemon);
scene.currentBattle.mysteryEncounter!.setDialogueToken("pokeName", highestLevelPokemon.getNameToRender()); encounter.setDialogueToken("pokeName", highestLevelPokemon.getNameToRender());
// Show which Pokemon was KOed, then leave encounter with no rewards // Show which Pokemon was KOed, then leave encounter with no rewards
// Does this synchronously so that game over doesn't happen over result message // Does this synchronously so that game over doesn't happen over result message
await showEncounterText(scene, `${namespace}.option.1.bad`); await showEncounterText(scene, `${namespace}.option.1.bad`);

View File

@ -24,6 +24,8 @@ const namespace = "mysteryEncounter:safariZone";
const TRAINER_THROW_ANIMATION_TIMES = [512, 184, 768]; const TRAINER_THROW_ANIMATION_TIMES = [512, 184, 768];
const SAFARI_MONEY_MULTIPLIER = 2.75;
/** /**
* Safari Zone encounter. * Safari Zone encounter.
* @see {@link https://github.com/pagefaultgames/pokerogue/issues/3800 | GitHub Issue #3800} * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3800 | GitHub Issue #3800}
@ -33,7 +35,7 @@ export const SafariZoneEncounter: MysteryEncounter =
MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.SAFARI_ZONE) MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.SAFARI_ZONE)
.withEncounterTier(MysteryEncounterTier.GREAT) .withEncounterTier(MysteryEncounterTier.GREAT)
.withSceneWaveRangeRequirement(10, 180) .withSceneWaveRangeRequirement(10, 180)
.withSceneRequirement(new MoneyRequirement(0, 2.75)) // Cost equal to 1 Max Revive .withSceneRequirement(new MoneyRequirement(0, SAFARI_MONEY_MULTIPLIER)) // Cost equal to 1 Max Revive
.withIntroSpriteConfigs([ .withIntroSpriteConfigs([
{ {
spriteKey: "safari_zone", spriteKey: "safari_zone",
@ -53,7 +55,7 @@ export const SafariZoneEncounter: MysteryEncounter =
.withQuery(`${namespace}.query`) .withQuery(`${namespace}.query`)
.withOption(MysteryEncounterOptionBuilder .withOption(MysteryEncounterOptionBuilder
.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT)
.withSceneRequirement(new MoneyRequirement(0, 2.75)) // Cost equal to 1 Max Revive .withSceneRequirement(new MoneyRequirement(0, SAFARI_MONEY_MULTIPLIER)) // Cost equal to 1 Max Revive
.withDialogue({ .withDialogue({
buttonLabel: `${namespace}.option.1.label`, buttonLabel: `${namespace}.option.1.label`,
buttonTooltip: `${namespace}.option.1.tooltip`, buttonTooltip: `${namespace}.option.1.tooltip`,
@ -72,9 +74,9 @@ export const SafariZoneEncounter: MysteryEncounter =
}; };
updatePlayerMoney(scene, -(encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney); updatePlayerMoney(scene, -(encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney);
// Load bait/mud assets // Load bait/mud assets
scene.loadSe("PRSFX- Bug Bite", "battle_anims"); scene.loadSe("PRSFX- Bug Bite", "battle_anims", "PRSFX- Bug Bite.wav");
scene.loadSe("PRSFX- Sludge Bomb2", "battle_anims"); scene.loadSe("PRSFX- Sludge Bomb2", "battle_anims", "PRSFX- Sludge Bomb2.wav");
scene.loadSe("PRSFX- Taunt2", "battle_anims"); scene.loadSe("PRSFX- Taunt2", "battle_anims", "PRSFX- Taunt2.wav");
scene.loadAtlas("bait", "mystery-encounters"); scene.loadAtlas("bait", "mystery-encounters");
scene.loadAtlas("mud", "mystery-encounters"); scene.loadAtlas("mud", "mystery-encounters");
await summonSafariPokemon(scene); await summonSafariPokemon(scene);
@ -351,12 +353,12 @@ async function throwBait(scene: BattleScene, pokemon: EnemyPokemon): Promise<boo
y: originalY - 5, y: originalY - 5,
loop: 6, loop: 6,
onStart: () => { onStart: () => {
scene.playSound("battle-anims/PRSFX- Bug Bite"); scene.playSound("battle_anims/PRSFX- Bug Bite");
bait.setFrame("0002.png"); bait.setFrame("0002.png");
}, },
onLoop: () => { onLoop: () => {
if (index % 2 === 0) { if (index % 2 === 0) {
scene.playSound("battle-anims/PRSFX- Bug Bite"); scene.playSound("battle_anims/PRSFX- Bug Bite");
} }
if (index === 4) { if (index === 4) {
bait.setFrame("0003.png"); bait.setFrame("0003.png");
@ -407,7 +409,7 @@ async function throwMud(scene: BattleScene, pokemon: EnemyPokemon): Promise<bool
duration: 500, duration: 500,
onComplete: () => { onComplete: () => {
// Mud frame 2 // Mud frame 2
scene.playSound("battle-anims/PRSFX- Sludge Bomb2"); scene.playSound("battle_anims/PRSFX- Sludge Bomb2");
mud.setFrame("0002.png"); mud.setFrame("0002.png");
// Mud splat // Mud splat
scene.time.delayedCall(200, () => { scene.time.delayedCall(200, () => {
@ -433,10 +435,10 @@ async function throwMud(scene: BattleScene, pokemon: EnemyPokemon): Promise<bool
y: originalY - 20, y: originalY - 20,
loop: 1, loop: 1,
onStart: () => { onStart: () => {
scene.playSound("battle-anims/PRSFX- Taunt2"); scene.playSound("battle_anims/PRSFX- Taunt2");
}, },
onLoop: () => { onLoop: () => {
scene.playSound("battle-anims/PRSFX- Taunt2"); scene.playSound("battle_anims/PRSFX- Taunt2");
}, },
onComplete: () => { onComplete: () => {
resolve(true); resolve(true);

View File

@ -6,7 +6,7 @@ import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"
import { getPokemonSpecies } from "#app/data/pokemon-species"; import { getPokemonSpecies } from "#app/data/pokemon-species";
import { Species } from "#enums/species"; import { Species } from "#enums/species";
import { Nature } from "#app/data/nature"; import { Nature } from "#app/data/nature";
import Pokemon, { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import Pokemon, { PokemonMove } from "#app/field/pokemon";
import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
import { modifyPlayerPokemonBST } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { modifyPlayerPokemonBST } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils";
import { Moves } from "#enums/moves"; import { Moves } from "#enums/moves";
@ -30,6 +30,7 @@ export const TheStrongStuffEncounter: MysteryEncounter =
MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.THE_STRONG_STUFF) MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.THE_STRONG_STUFF)
.withEncounterTier(MysteryEncounterTier.COMMON) .withEncounterTier(MysteryEncounterTier.COMMON)
.withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180
.withScenePartySizeRequirement(3, 6) // Must have at least 3 pokemon in party
.withHideWildIntroMessage(true) .withHideWildIntroMessage(true)
.withAutoHideIntroVisuals(false) .withAutoHideIntroVisuals(false)
.withIntroSpriteConfigs([ .withIntroSpriteConfigs([
@ -76,16 +77,16 @@ export const TheStrongStuffEncounter: MysteryEncounter =
moveSet: [Moves.INFESTATION, Moves.SALT_CURE, Moves.GASTRO_ACID, Moves.HEAL_ORDER], moveSet: [Moves.INFESTATION, Moves.SALT_CURE, Moves.GASTRO_ACID, Moves.HEAL_ORDER],
modifierConfigs: [ modifierConfigs: [
{ {
modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.SITRUS]) as PokemonHeldItemModifierType modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.SITRUS]) as PokemonHeldItemModifierType
}, },
{ {
modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.APICOT]) as PokemonHeldItemModifierType modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.APICOT]) as PokemonHeldItemModifierType
}, },
{ {
modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.GANLON]) as PokemonHeldItemModifierType modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.GANLON]) as PokemonHeldItemModifierType
}, },
{ {
modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LUM]) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LUM]) as PokemonHeldItemModifierType,
stackCount: 2 stackCount: 2
} }
], ],
@ -124,35 +125,21 @@ export const TheStrongStuffEncounter: MysteryEncounter =
transitionMysteryEncounterIntroVisuals(scene, true, true, 50); transitionMysteryEncounterIntroVisuals(scene, true, true, 50);
}); });
// -20 to all base stats of highest BST, +10 to all base stats of rest of party // -15 to all base stats of highest BST (halved for HP), +10 to all base stats of rest of party (halved for HP)
// Get highest BST mon // Sort party by bst (inverted to pop 2 highest off end)
const party = scene.getParty(); const sortedParty = scene.getParty().slice(0)
let highestBst: PlayerPokemon | null = null; .sort((pokemon1, pokemon2) => {
let statTotal = 0; const pokemon1Bst = pokemon1.calculateBaseStats().reduce((a, b) => a + b, 0);
for (const pokemon of party) { const pokemon2Bst = pokemon2.calculateBaseStats().reduce((a, b) => a + b, 0);
if (!highestBst) { return pokemon1Bst - pokemon2Bst;
highestBst = pokemon; });
statTotal = pokemon.getSpeciesForm().getBaseStatTotal();
continue;
}
const total = pokemon.getSpeciesForm().getBaseStatTotal();
if (total > statTotal) {
highestBst = pokemon;
statTotal = total;
}
}
if (!highestBst) {
highestBst = party[0];
}
modifyPlayerPokemonBST(highestBst, -20);
for (const pokemon of party) {
if (highestBst.id === pokemon.id) {
continue;
}
const highestBst = sortedParty.pop()!;
const highestBst2 = sortedParty.pop()!;
modifyPlayerPokemonBST(highestBst, -15);
modifyPlayerPokemonBST(highestBst2, -15);
// +10 for the rest
for (const pokemon of sortedParty) {
modifyPlayerPokemonBST(pokemon, 10); modifyPlayerPokemonBST(pokemon, 10);
} }

View File

@ -32,7 +32,7 @@ const namespace = "mysteryEncounter:theWinstrateChallenge";
export const TheWinstrateChallengeEncounter: MysteryEncounter = export const TheWinstrateChallengeEncounter: MysteryEncounter =
MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.THE_WINSTRATE_CHALLENGE) MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.THE_WINSTRATE_CHALLENGE)
.withEncounterTier(MysteryEncounterTier.ROGUE) .withEncounterTier(MysteryEncounterTier.ROGUE)
.withSceneWaveRangeRequirement(80, 180) .withSceneWaveRangeRequirement(100, 180)
.withIntroSpriteConfigs([ .withIntroSpriteConfigs([
{ {
spriteKey: "vito", spriteKey: "vito",
@ -221,11 +221,11 @@ function getVictorTrainerConfig(scene: BattleScene): EnemyPartyConfig {
moveSet: [Moves.FACADE, Moves.BRAVE_BIRD, Moves.PROTECT, Moves.QUICK_ATTACK], moveSet: [Moves.FACADE, Moves.BRAVE_BIRD, Moves.PROTECT, Moves.QUICK_ATTACK],
modifierConfigs: [ modifierConfigs: [
{ {
modifierType: generateModifierType(scene, modifierTypes.FLAME_ORB) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.FLAME_ORB) as PokemonHeldItemModifierType,
isTransferable: false isTransferable: false
}, },
{ {
modifierType: generateModifierType(scene, modifierTypes.FOCUS_BAND) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.FOCUS_BAND) as PokemonHeldItemModifierType,
stackCount: 2, stackCount: 2,
isTransferable: false isTransferable: false
}, },
@ -239,11 +239,11 @@ function getVictorTrainerConfig(scene: BattleScene): EnemyPartyConfig {
moveSet: [Moves.FACADE, Moves.OBSTRUCT, Moves.NIGHT_SLASH, Moves.FIRE_PUNCH], moveSet: [Moves.FACADE, Moves.OBSTRUCT, Moves.NIGHT_SLASH, Moves.FIRE_PUNCH],
modifierConfigs: [ modifierConfigs: [
{ {
modifierType: generateModifierType(scene, modifierTypes.FLAME_ORB) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.FLAME_ORB) as PokemonHeldItemModifierType,
isTransferable: false isTransferable: false
}, },
{ {
modifierType: generateModifierType(scene, modifierTypes.LEFTOVERS) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.LEFTOVERS) as PokemonHeldItemModifierType,
stackCount: 2, stackCount: 2,
isTransferable: false isTransferable: false
} }
@ -265,11 +265,11 @@ function getVictoriaTrainerConfig(scene: BattleScene): EnemyPartyConfig {
moveSet: [Moves.SYNTHESIS, Moves.SLUDGE_BOMB, Moves.GIGA_DRAIN, Moves.SLEEP_POWDER], moveSet: [Moves.SYNTHESIS, Moves.SLUDGE_BOMB, Moves.GIGA_DRAIN, Moves.SLEEP_POWDER],
modifierConfigs: [ modifierConfigs: [
{ {
modifierType: generateModifierType(scene, modifierTypes.SOUL_DEW) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.SOUL_DEW) as PokemonHeldItemModifierType,
isTransferable: false isTransferable: false
}, },
{ {
modifierType: generateModifierType(scene, modifierTypes.QUICK_CLAW) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.QUICK_CLAW) as PokemonHeldItemModifierType,
stackCount: 2, stackCount: 2,
isTransferable: false isTransferable: false
} }
@ -283,12 +283,12 @@ function getVictoriaTrainerConfig(scene: BattleScene): EnemyPartyConfig {
moveSet: [Moves.PSYSHOCK, Moves.MOONBLAST, Moves.SHADOW_BALL, Moves.WILL_O_WISP], moveSet: [Moves.PSYSHOCK, Moves.MOONBLAST, Moves.SHADOW_BALL, Moves.WILL_O_WISP],
modifierConfigs: [ modifierConfigs: [
{ {
modifierType: generateModifierType(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.PSYCHIC]) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.PSYCHIC]) as PokemonHeldItemModifierType,
stackCount: 1, stackCount: 1,
isTransferable: false isTransferable: false
}, },
{ {
modifierType: generateModifierType(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.FAIRY]) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.FAIRY]) as PokemonHeldItemModifierType,
stackCount: 1, stackCount: 1,
isTransferable: false isTransferable: false
} }
@ -310,12 +310,12 @@ function getViviTrainerConfig(scene: BattleScene): EnemyPartyConfig {
moveSet: [Moves.WATERFALL, Moves.MEGAHORN, Moves.KNOCK_OFF, Moves.REST], moveSet: [Moves.WATERFALL, Moves.MEGAHORN, Moves.KNOCK_OFF, Moves.REST],
modifierConfigs: [ modifierConfigs: [
{ {
modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LUM]) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LUM]) as PokemonHeldItemModifierType,
stackCount: 2, stackCount: 2,
isTransferable: false isTransferable: false
}, },
{ {
modifierType: generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER, [Stat.HP]) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER, [Stat.HP]) as PokemonHeldItemModifierType,
stackCount: 4, stackCount: 4,
isTransferable: false isTransferable: false
} }
@ -329,12 +329,12 @@ function getViviTrainerConfig(scene: BattleScene): EnemyPartyConfig {
moveSet: [Moves.SPORE, Moves.SWORDS_DANCE, Moves.SEED_BOMB, Moves.DRAIN_PUNCH], moveSet: [Moves.SPORE, Moves.SWORDS_DANCE, Moves.SEED_BOMB, Moves.DRAIN_PUNCH],
modifierConfigs: [ modifierConfigs: [
{ {
modifierType: generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER, [Stat.HP]) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER, [Stat.HP]) as PokemonHeldItemModifierType,
stackCount: 4, stackCount: 4,
isTransferable: false isTransferable: false
}, },
{ {
modifierType: generateModifierType(scene, modifierTypes.TOXIC_ORB) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.TOXIC_ORB) as PokemonHeldItemModifierType,
isTransferable: false isTransferable: false
} }
] ]
@ -347,7 +347,7 @@ function getViviTrainerConfig(scene: BattleScene): EnemyPartyConfig {
moveSet: [Moves.EARTH_POWER, Moves.FIRE_BLAST, Moves.YAWN, Moves.PROTECT], moveSet: [Moves.EARTH_POWER, Moves.FIRE_BLAST, Moves.YAWN, Moves.PROTECT],
modifierConfigs: [ modifierConfigs: [
{ {
modifierType: generateModifierType(scene, modifierTypes.QUICK_CLAW) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.QUICK_CLAW) as PokemonHeldItemModifierType,
stackCount: 3, stackCount: 3,
isTransferable: false isTransferable: false
}, },
@ -369,7 +369,7 @@ function getVickyTrainerConfig(scene: BattleScene): EnemyPartyConfig {
moveSet: [Moves.AXE_KICK, Moves.ICE_PUNCH, Moves.ZEN_HEADBUTT, Moves.BULLET_PUNCH], moveSet: [Moves.AXE_KICK, Moves.ICE_PUNCH, Moves.ZEN_HEADBUTT, Moves.BULLET_PUNCH],
modifierConfigs: [ modifierConfigs: [
{ {
modifierType: generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType,
isTransferable: false isTransferable: false
} }
] ]
@ -390,7 +390,7 @@ function getVitoTrainerConfig(scene: BattleScene): EnemyPartyConfig {
moveSet: [Moves.THUNDERBOLT, Moves.GIGA_DRAIN, Moves.FOUL_PLAY, Moves.THUNDER_WAVE], moveSet: [Moves.THUNDERBOLT, Moves.GIGA_DRAIN, Moves.FOUL_PLAY, Moves.THUNDER_WAVE],
modifierConfigs: [ modifierConfigs: [
{ {
modifierType: generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER, [Stat.SPD]) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER, [Stat.SPD]) as PokemonHeldItemModifierType,
stackCount: 2, stackCount: 2,
isTransferable: false isTransferable: false
} }
@ -404,47 +404,47 @@ function getVitoTrainerConfig(scene: BattleScene): EnemyPartyConfig {
moveSet: [Moves.SLUDGE_BOMB, Moves.GIGA_DRAIN, Moves.ICE_BEAM, Moves.EARTHQUAKE], moveSet: [Moves.SLUDGE_BOMB, Moves.GIGA_DRAIN, Moves.ICE_BEAM, Moves.EARTHQUAKE],
modifierConfigs: [ modifierConfigs: [
{ {
modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.SITRUS]) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.SITRUS]) as PokemonHeldItemModifierType,
stackCount: 2, stackCount: 2,
}, },
{ {
modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.APICOT]) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.APICOT]) as PokemonHeldItemModifierType,
stackCount: 2, stackCount: 2,
}, },
{ {
modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.GANLON]) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.GANLON]) as PokemonHeldItemModifierType,
stackCount: 2, stackCount: 2,
}, },
{ {
modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.STARF]) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.STARF]) as PokemonHeldItemModifierType,
stackCount: 2, stackCount: 2,
}, },
{ {
modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.SALAC]) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.SALAC]) as PokemonHeldItemModifierType,
stackCount: 2, stackCount: 2,
}, },
{ {
modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LUM]) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LUM]) as PokemonHeldItemModifierType,
stackCount: 2, stackCount: 2,
}, },
{ {
modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LANSAT]) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LANSAT]) as PokemonHeldItemModifierType,
stackCount: 2, stackCount: 2,
}, },
{ {
modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LIECHI]) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LIECHI]) as PokemonHeldItemModifierType,
stackCount: 2, stackCount: 2,
}, },
{ {
modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.PETAYA]) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.PETAYA]) as PokemonHeldItemModifierType,
stackCount: 2, stackCount: 2,
}, },
{ {
modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.ENIGMA]) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.ENIGMA]) as PokemonHeldItemModifierType,
stackCount: 2, stackCount: 2,
}, },
{ {
modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LEPPA]) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LEPPA]) as PokemonHeldItemModifierType,
stackCount: 2, stackCount: 2,
} }
] ]
@ -457,7 +457,7 @@ function getVitoTrainerConfig(scene: BattleScene): EnemyPartyConfig {
moveSet: [Moves.DRILL_PECK, Moves.QUICK_ATTACK, Moves.THRASH, Moves.KNOCK_OFF], moveSet: [Moves.DRILL_PECK, Moves.QUICK_ATTACK, Moves.THRASH, Moves.KNOCK_OFF],
modifierConfigs: [ modifierConfigs: [
{ {
modifierType: generateModifierType(scene, modifierTypes.KINGS_ROCK) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.KINGS_ROCK) as PokemonHeldItemModifierType,
stackCount: 2, stackCount: 2,
isTransferable: false isTransferable: false
} }
@ -471,7 +471,7 @@ function getVitoTrainerConfig(scene: BattleScene): EnemyPartyConfig {
moveSet: [Moves.PSYCHIC, Moves.SHADOW_BALL, Moves.FOCUS_BLAST, Moves.THUNDERBOLT], moveSet: [Moves.PSYCHIC, Moves.SHADOW_BALL, Moves.FOCUS_BLAST, Moves.THUNDERBOLT],
modifierConfigs: [ modifierConfigs: [
{ {
modifierType: generateModifierType(scene, modifierTypes.WIDE_LENS) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.WIDE_LENS) as PokemonHeldItemModifierType,
stackCount: 2, stackCount: 2,
isTransferable: false isTransferable: false
}, },
@ -485,7 +485,7 @@ function getVitoTrainerConfig(scene: BattleScene): EnemyPartyConfig {
moveSet: [Moves.EARTHQUAKE, Moves.U_TURN, Moves.FLARE_BLITZ, Moves.ROCK_SLIDE], moveSet: [Moves.EARTHQUAKE, Moves.U_TURN, Moves.FLARE_BLITZ, Moves.ROCK_SLIDE],
modifierConfigs: [ modifierConfigs: [
{ {
modifierType: generateModifierType(scene, modifierTypes.QUICK_CLAW) as PokemonHeldItemModifierType, modifier: generateModifierType(scene, modifierTypes.QUICK_CLAW) as PokemonHeldItemModifierType,
stackCount: 2, stackCount: 2,
isTransferable: false isTransferable: false
}, },

View File

@ -4,7 +4,7 @@ import { getNatureName, Nature } from "#app/data/nature";
import { speciesStarters } from "#app/data/pokemon-species"; import { speciesStarters } from "#app/data/pokemon-species";
import { getStatName } from "#app/data/pokemon-stat"; import { getStatName } from "#app/data/pokemon-stat";
import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; import Pokemon, { PlayerPokemon } from "#app/field/pokemon";
import { PokemonHeldItemModifier } from "#app/modifier/modifier"; import { PokemonFormChangeItemModifier, PokemonHeldItemModifier } from "#app/modifier/modifier";
import { AbilityAttr } from "#app/system/game-data"; import { AbilityAttr } from "#app/system/game-data";
import PokemonData from "#app/system/pokemon-data"; import PokemonData from "#app/system/pokemon-data";
import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler";
@ -247,9 +247,10 @@ export const TrainingSessionEncounter: MysteryEncounter =
playerPokemon.setNature(encounter.misc.chosenNature); playerPokemon.setNature(encounter.misc.chosenNature);
scene.gameData.setPokemonCaught(playerPokemon, false); scene.gameData.setPokemonCaught(playerPokemon, false);
// Add pokemon and mods back // Add pokemon and modifiers back
scene.getParty().push(playerPokemon); scene.getParty().push(playerPokemon);
for (const mod of modifiers.value) { for (const mod of modifiers.value) {
mod.pokemonId = playerPokemon.id;
scene.addModifier(mod, true, false, false, true); scene.addModifier(mod, true, false, false, true);
} }
scene.updateModifiers(true); scene.updateModifiers(true);
@ -385,10 +386,10 @@ function getEnemyConfig(scene: BattleScene, playerPokemon: PlayerPokemon, segmen
playerPokemon.resetSummonData(); playerPokemon.resetSummonData();
// Passes modifiers by reference // Passes modifiers by reference
modifiers.value = scene.findModifiers((m) => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).pokemonId === playerPokemon.id) as PokemonHeldItemModifier[]; modifiers.value = playerPokemon.getHeldItems().filter(m => !(m instanceof PokemonFormChangeItemModifier));
const modifierConfigs = modifiers.value.map((mod) => { const modifierConfigs = modifiers.value.map((mod) => {
return { return {
modifierType: mod.type modifier: mod
}; };
}) as HeldModifierConfig[]; }) as HeldModifierConfig[];

View File

@ -31,7 +31,7 @@ const SOUND_EFFECT_WAIT_TIME = 700;
export const TrashToTreasureEncounter: MysteryEncounter = export const TrashToTreasureEncounter: MysteryEncounter =
MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.TRASH_TO_TREASURE) MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.TRASH_TO_TREASURE)
.withEncounterTier(MysteryEncounterTier.ULTRA) .withEncounterTier(MysteryEncounterTier.ULTRA)
.withSceneWaveRangeRequirement(10, 180) .withSceneWaveRangeRequirement(60, 180)
.withMaxAllowedEncounters(1) .withMaxAllowedEncounters(1)
.withIntroSpriteConfigs([ .withIntroSpriteConfigs([
{ {
@ -177,7 +177,7 @@ async function tryApplyDigRewardItems(scene: BattleScene) {
} }
} }
scene.playSound("bgm/item_fanfare"); scene.playSound("item_fanfare");
await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: "2 " + leftovers.name }), undefined, true); await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: "2 " + leftovers.name }), undefined, true);
// First Shell bell // First Shell bell
@ -204,17 +204,17 @@ async function tryApplyDigRewardItems(scene: BattleScene) {
} }
} }
scene.playSound("bgm/item_fanfare"); scene.playSound("item_fanfare");
await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: "2 " + shellBell.name }), undefined, true); await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: "2 " + shellBell.name }), undefined, true);
} }
async function doGarbageDig(scene: BattleScene) { async function doGarbageDig(scene: BattleScene) {
scene.playSound("battle-anims/PRSFX- Dig2"); scene.playSound("battle_anims/PRSFX- Dig2");
scene.time.delayedCall(SOUND_EFFECT_WAIT_TIME, () => { scene.time.delayedCall(SOUND_EFFECT_WAIT_TIME, () => {
scene.playSound("battle-anims/PRSFX- Dig2"); scene.playSound("battle_anims/PRSFX- Dig2");
scene.playSound("battle-anims/PRSFX- Venom Drench", { volume: 2 }); scene.playSound("battle_anims/PRSFX- Venom Drench", { volume: 2 });
}); });
scene.time.delayedCall(SOUND_EFFECT_WAIT_TIME * 2, () => { scene.time.delayedCall(SOUND_EFFECT_WAIT_TIME * 2, () => {
scene.playSound("battle-anims/PRSFX- Dig2"); scene.playSound("battle_anims/PRSFX- Dig2");
}); });
} }

View File

@ -0,0 +1,265 @@
import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option";
import { EnemyPartyConfig, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards } from "#app/data/mystery-encounters/utils/encounter-phase-utils";
import { CHARMING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups";
import Pokemon, { EnemyPokemon, PokemonMove } from "#app/field/pokemon";
import { getPartyLuckValue } from "#app/modifier/modifier-type";
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
import BattleScene from "#app/battle-scene";
import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter";
import { MoveRequirement, PersistentModifierRequirement } from "../mystery-encounter-requirements";
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
import { TrainerSlot } from "#app/data/trainer-config";
import { catchPokemon, getHighestLevelPlayerPokemon, getSpriteKeysFromPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils";
import PokemonData from "#app/system/pokemon-data";
import { speciesEggMoves } from "#app/data/egg-moves";
import { isNullOrUndefined, randSeedInt } from "#app/utils";
import { Moves } from "#enums/moves";
import { BattlerIndex } from "#app/battle";
import { SelfStatusMove } from "#app/data/move";
import { PokeballType } from "#enums/pokeball";
import { BattlerTagType } from "#enums/battler-tag-type";
import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
import { StatChangePhase } from "#app/phases/stat-change-phase";
import { BattleStat } from "#app/data/battle-stat";
import { BerryModifier } from "#app/modifier/modifier";
/** the i18n namespace for the encounter */
const namespace = "mysteryEncounter:uncommonBreed";
/**
* Uncommon Breed encounter.
* @see {@link https://github.com/pagefaultgames/pokerogue/issues/3811 | GitHub Issue #3811}
* @see For biome requirements check {@linkcode mysteryEncountersByBiome}
*/
export const UncommonBreedEncounter: MysteryEncounter =
MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.UNCOMMON_BREED)
.withEncounterTier(MysteryEncounterTier.COMMON)
.withSceneWaveRangeRequirement(10, 180) // waves 10 to 180
.withCatchAllowed(true)
.withHideWildIntroMessage(true)
.withIntroSpriteConfigs([]) // Set in onInit()
.withIntroDialogue([
{
text: `${namespace}.intro`,
},
])
.withOnInit((scene: BattleScene) => {
const encounter = scene.currentBattle.mysteryEncounter!;
// Calculate boss mon
// Level equal to 2 below highest party member
const level = getHighestLevelPlayerPokemon(scene).level - 2;
const species = scene.arena.randomSpecies(scene.currentBattle.waveIndex, level, 0, getPartyLuckValue(scene.getParty()), true);
const pokemon = new EnemyPokemon(scene, species, level, TrainerSlot.NONE, true);
const speciesRootForm = pokemon.species.getRootSpeciesId();
encounter.misc = {
pokemon
};
// Pokemon will always have one of its egg moves in its moveset
if (speciesEggMoves.hasOwnProperty(speciesRootForm)) {
const eggMoves: Moves[] = speciesEggMoves[speciesRootForm];
const eggMoveIndex = randSeedInt(4);
const randomEggMove: Moves = eggMoves[eggMoveIndex];
encounter.misc.eggMove = randomEggMove;
if (pokemon.moveset.length < 4) {
pokemon.moveset.push(new PokemonMove(randomEggMove));
} else {
pokemon.moveset[0] = new PokemonMove(randomEggMove);
}
}
const config: EnemyPartyConfig = {
pokemonConfigs: [{
level: level,
species: species,
dataSource: new PokemonData(pokemon),
isBoss: false,
tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON],
mysteryEncounterBattleEffects: (pokemon: Pokemon) => {
queueEncounterMessage(pokemon.scene, `${namespace}.option.1.stat_boost`);
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1));
}
}],
};
encounter.enemyPartyConfigs = [config];
const { spriteKey, fileRoot } = getSpriteKeysFromPokemon(pokemon);
encounter.spriteConfigs = [
{
spriteKey: spriteKey,
fileRoot: fileRoot,
hasShadow: true,
x: -5,
repeat: true,
isPokemon: true
},
];
encounter.setDialogueToken("enemyPokemon", pokemon.getNameToRender());
scene.loadSe("PRSFX- Spotlight2", "battle_anims", "PRSFX- Spotlight2.wav");
return true;
})
.withOnVisualsStart((scene: BattleScene) => {
// Animate the pokemon
const encounter = scene.currentBattle.mysteryEncounter!;
const pokemonSprite = encounter.introVisuals!.getSprites();
scene.tweens.add({ // Bounce at the end
targets: pokemonSprite,
duration: 300,
ease: "Cubic.easeOut",
yoyo: true,
y: "-=20",
loop: 1,
});
scene.time.delayedCall(500, () => scene.playSound("battle_anims/PRSFX- Spotlight2"));
return true;
})
.withTitle(`${namespace}.title`)
.withDescription(`${namespace}.description`)
.withQuery(`${namespace}.query`)
.withSimpleOption(
{
buttonLabel: `${namespace}.option.1.label`,
buttonTooltip: `${namespace}.option.1.tooltip`,
selected: [
{
text: `${namespace}.option.1.selected`,
},
],
},
async (scene: BattleScene) => {
// Pick battle
const encounter = scene.currentBattle.mysteryEncounter!;
const eggMove = encounter.misc.eggMove;
if (!isNullOrUndefined(eggMove)) {
// Check what type of move the egg move is to determine target
const pokemonMove = new PokemonMove(eggMove);
const move = pokemonMove.getMove();
const target = move instanceof SelfStatusMove ? BattlerIndex.ENEMY : BattlerIndex.PLAYER;
encounter.startOfBattleEffects.push(
{
sourceBattlerIndex: BattlerIndex.ENEMY,
targets: [target],
move: pokemonMove,
ignorePp: true
});
}
setEncounterRewards(scene, { fillRemaining: true });
await initBattleWithEnemyConfig(scene, encounter.enemyPartyConfigs[0]);
}
)
.withOption(
MysteryEncounterOptionBuilder
.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL)
.withSceneRequirement(new PersistentModifierRequirement("BerryModifier", 4)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically
.withDialogue({
buttonLabel: `${namespace}.option.2.label`,
buttonTooltip: `${namespace}.option.2.tooltip`,
disabledButtonTooltip: `${namespace}.option.2.disabled_tooltip`,
selected: [
{
text: `${namespace}.option.2.selected`
}
]
})
.withOptionPhase(async (scene: BattleScene) => {
// Give it some food
// Remove 4 random berries from player's party
// Get all player berry items, remove from party, and store reference
let berryItems: BerryModifier[] = scene.findModifiers(m => m instanceof BerryModifier) as BerryModifier[];
for (let i = 0; i < 4; i++) {
berryItems = scene.findModifiers(m => m instanceof BerryModifier) as BerryModifier[];
const randBerry = berryItems[randSeedInt(berryItems.length)];
randBerry.stackCount--;
if (randBerry.stackCount === 0) {
scene.removeModifier(randBerry);
}
scene.updateModifiers(true, true);
}
// Pokemon joins the team, with 2 egg moves
const encounter = scene.currentBattle.mysteryEncounter!;
const pokemon = encounter.misc.pokemon;
// Give 1 additional egg move
const previousEggMove = encounter.misc.eggMove;
const speciesRootForm = pokemon.species.getRootSpeciesId();
if (speciesEggMoves.hasOwnProperty(speciesRootForm)) {
const eggMoves: Moves[] = speciesEggMoves[speciesRootForm];
let randomEggMove: Moves = eggMoves[randSeedInt(4)];
while (randomEggMove === previousEggMove) {
randomEggMove = eggMoves[randSeedInt(4)];
}
if (pokemon.moveset.length < 4) {
pokemon.moveset.push(new PokemonMove(randomEggMove));
} else {
pokemon.moveset[1] = new PokemonMove(randomEggMove);
}
}
await catchPokemon(scene, pokemon, null, PokeballType.POKEBALL, false);
setEncounterRewards(scene, { fillRemaining: true });
leaveEncounterWithoutBattle(scene);
})
.build()
)
.withOption(
MysteryEncounterOptionBuilder
.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL)
.withPrimaryPokemonRequirement(new MoveRequirement(CHARMING_MOVES)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically
.withDialogue({
buttonLabel: `${namespace}.option.3.label`,
buttonTooltip: `${namespace}.option.3.tooltip`,
disabledButtonTooltip: `${namespace}.option.3.disabled_tooltip`,
selected: [
{
text: `${namespace}.option.3.selected`
}
]
})
.withOptionPhase(async (scene: BattleScene) => {
// Attract the pokemon with a move
// Pokemon joins the team, with 2 egg moves and IVs rolled an additional time
const encounter = scene.currentBattle.mysteryEncounter!;
const pokemon = encounter.misc.pokemon;
// Give 1 additional egg move
const previousEggMove = encounter.misc.eggMove;
const speciesRootForm = pokemon.species.getRootSpeciesId();
if (speciesEggMoves.hasOwnProperty(speciesRootForm)) {
const eggMoves: Moves[] = speciesEggMoves[speciesRootForm];
let randomEggMove: Moves = eggMoves[randSeedInt(4)];
while (randomEggMove === previousEggMove) {
randomEggMove = eggMoves[randSeedInt(4)];
}
if (pokemon.moveset.length < 4) {
pokemon.moveset.push(new PokemonMove(randomEggMove));
} else {
pokemon.moveset[1] = new PokemonMove(randomEggMove);
}
}
// Roll IVs a second time
pokemon.ivs = pokemon.ivs.map(iv => {
const newValue = randSeedInt(31);
return newValue > iv ? newValue : iv;
});
await catchPokemon(scene, pokemon, null, PokeballType.POKEBALL, false);
if (encounter.selectedOption?.primaryPokemon?.id) {
setEncounterExp(scene, encounter.selectedOption.primaryPokemon.id, pokemon.getExpValue(), false);
}
setEncounterRewards(scene, { fillRemaining: true });
leaveEncounterWithoutBattle(scene);
})
.build()
)
.build();

View File

@ -94,6 +94,7 @@ const STANDARD_BST_TRANSFORM_BASE_VALUES = [40, 50];
export const WeirdDreamEncounter: MysteryEncounter = export const WeirdDreamEncounter: MysteryEncounter =
MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.WEIRD_DREAM) MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.WEIRD_DREAM)
.withEncounterTier(MysteryEncounterTier.ROGUE) .withEncounterTier(MysteryEncounterTier.ROGUE)
.withSceneWaveRangeRequirement(10, 180)
.withIntroSpriteConfigs([ .withIntroSpriteConfigs([
{ {
spriteKey: "girawitch", spriteKey: "girawitch",
@ -111,7 +112,6 @@ export const WeirdDreamEncounter: MysteryEncounter =
text: `${namespace}.intro_dialogue`, text: `${namespace}.intro_dialogue`,
}, },
]) ])
.withSceneWaveRangeRequirement(10, 180)
.withTitle(`${namespace}.title`) .withTitle(`${namespace}.title`)
.withDescription(`${namespace}.description`) .withDescription(`${namespace}.description`)
.withQuery(`${namespace}.query`) .withQuery(`${namespace}.query`)

View File

@ -29,6 +29,7 @@ import { TheWinstrateChallengeEncounter } from "#app/data/mystery-encounters/enc
import { TeleportingHijinksEncounter } from "#app/data/mystery-encounters/encounters/teleporting-hijinks-encounter"; import { TeleportingHijinksEncounter } from "#app/data/mystery-encounters/encounters/teleporting-hijinks-encounter";
import { BugTypeSuperfanEncounter } from "#app/data/mystery-encounters/encounters/bug-type-superfan-encounter"; import { BugTypeSuperfanEncounter } from "#app/data/mystery-encounters/encounters/bug-type-superfan-encounter";
import { FunAndGamesEncounter } from "#app/data/mystery-encounters/encounters/fun-and-games-encounter"; import { FunAndGamesEncounter } from "#app/data/mystery-encounters/encounters/fun-and-games-encounter";
import { UncommonBreedEncounter } from "#app/data/mystery-encounters/encounters/uncommon-breed-encounter";
// Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * <number of missed spawns>) / 256 // Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * <number of missed spawns>) / 256
export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1;
@ -175,7 +176,8 @@ const anyBiomeEncounters: MysteryEncounterType[] = [
MysteryEncounterType.CLOWNING_AROUND, MysteryEncounterType.CLOWNING_AROUND,
MysteryEncounterType.WEIRD_DREAM, MysteryEncounterType.WEIRD_DREAM,
MysteryEncounterType.TELEPORTING_HIJINKS, MysteryEncounterType.TELEPORTING_HIJINKS,
MysteryEncounterType.BUG_TYPE_SUPERFAN MysteryEncounterType.BUG_TYPE_SUPERFAN,
MysteryEncounterType.UNCOMMON_BREED
]; ];
/** /**
@ -282,6 +284,7 @@ export function initMysteryEncounters() {
allMysteryEncounters[MysteryEncounterType.TELEPORTING_HIJINKS] = TeleportingHijinksEncounter; allMysteryEncounters[MysteryEncounterType.TELEPORTING_HIJINKS] = TeleportingHijinksEncounter;
allMysteryEncounters[MysteryEncounterType.BUG_TYPE_SUPERFAN] = BugTypeSuperfanEncounter; allMysteryEncounters[MysteryEncounterType.BUG_TYPE_SUPERFAN] = BugTypeSuperfanEncounter;
allMysteryEncounters[MysteryEncounterType.FUN_AND_GAMES] = FunAndGamesEncounter; allMysteryEncounters[MysteryEncounterType.FUN_AND_GAMES] = FunAndGamesEncounter;
allMysteryEncounters[MysteryEncounterType.UNCOMMON_BREED] = UncommonBreedEncounter;
// Add extreme encounters to biome map // Add extreme encounters to biome map
extremeBiomeEncounters.forEach(encounter => { extremeBiomeEncounters.forEach(encounter => {

View File

@ -886,7 +886,7 @@ export function handleMysteryEncounterBattleStartEffects(scene: BattleScene) {
/** /**
* Can queue extra phases or logic during {@link TurnInitPhase} * Can queue extra phases or logic during {@link TurnInitPhase}
* Mostly useful for allowing MysteryEncounter enemies to "cheat" and use moves before the first turn * Should mostly just be used for injecting custom phases into the battle system on turn start
* @param scene * @param scene
* @return boolean - if true, will skip the remainder of the {@link TurnInitPhase} * @return boolean - if true, will skip the remainder of the {@link TurnInitPhase}
*/ */

View File

@ -1582,7 +1582,8 @@ export const pokemonEvolutions: PokemonEvolutions = {
new SpeciesEvolution(Species.BLISSEY, 1, null, new SpeciesFriendshipEvolutionCondition(200), SpeciesWildEvolutionDelay.LONG) new SpeciesEvolution(Species.BLISSEY, 1, null, new SpeciesFriendshipEvolutionCondition(200), SpeciesWildEvolutionDelay.LONG)
], ],
[Species.PICHU]: [ [Species.PICHU]: [
new SpeciesEvolution(Species.PIKACHU, 1, null, new SpeciesFriendshipEvolutionCondition(90), SpeciesWildEvolutionDelay.SHORT) new SpeciesFormEvolution(Species.PIKACHU, "spiky", "partner", 1, null, new SpeciesFriendshipEvolutionCondition(90), SpeciesWildEvolutionDelay.SHORT),
new SpeciesFormEvolution(Species.PIKACHU, "", "", 1, null, new SpeciesFriendshipEvolutionCondition(90), SpeciesWildEvolutionDelay.SHORT),
], ],
[Species.CLEFFA]: [ [Species.CLEFFA]: [
new SpeciesEvolution(Species.CLEFAIRY, 1, null, new SpeciesFriendshipEvolutionCondition(160), SpeciesWildEvolutionDelay.SHORT) new SpeciesEvolution(Species.CLEFAIRY, 1, null, new SpeciesFriendshipEvolutionCondition(160), SpeciesWildEvolutionDelay.SHORT)

View File

@ -1,24 +1,21 @@
import { Localizable } from "#app/interfaces/locales";
import { Abilities } from "#enums/abilities";
import { PartyMemberStrength } from "#enums/party-member-strength";
import { Species } from "#enums/species";
import { QuantizerCelebi, argbFromRgba, rgbaFromArgb } from "@material/material-color-utilities";
import i18next from "i18next";
import BattleScene, { AnySound } from "../battle-scene"; import BattleScene, { AnySound } from "../battle-scene";
import { Variant, variantColorCache } from "./variant"; import { GameMode } from "../game-mode";
import { variantData } from "./variant"; import { StarterMoveset } from "../system/game-data";
import * as Utils from "../utils";
import { uncatchableSpecies } from "./biomes";
import { speciesEggMoves } from "./egg-moves";
import { GrowthRate } from "./exp"; import { GrowthRate } from "./exp";
import { EvolutionLevel, SpeciesWildEvolutionDelay, pokemonEvolutions, pokemonPrevolutions } from "./pokemon-evolutions"; import { EvolutionLevel, SpeciesWildEvolutionDelay, pokemonEvolutions, pokemonPrevolutions } from "./pokemon-evolutions";
import { Type } from "./type"; import { Type } from "./type";
import { LevelMoves, pokemonFormLevelMoves, pokemonFormLevelMoves as pokemonSpeciesFormLevelMoves, pokemonSpeciesLevelMoves } from "./pokemon-level-moves"; import { LevelMoves, pokemonFormLevelMoves, pokemonFormLevelMoves as pokemonSpeciesFormLevelMoves, pokemonSpeciesLevelMoves } from "./pokemon-level-moves";
import { uncatchableSpecies } from "./biomes";
import * as Utils from "../utils";
import { StarterMoveset } from "../system/game-data";
import { speciesEggMoves } from "./egg-moves";
import { GameMode } from "../game-mode";
import { QuantizerCelebi, argbFromRgba, rgbaFromArgb } from "@material/material-color-utilities";
import { VariantSet } from "./variant";
import i18next from "i18next";
import { Localizable } from "#app/interfaces/locales";
import { Stat } from "./pokemon-stat"; import { Stat } from "./pokemon-stat";
import { Abilities } from "#enums/abilities"; import { Variant, VariantSet, variantColorCache, variantData } from "./variant";
import { PartyMemberStrength } from "#enums/party-member-strength";
import { Species } from "#enums/species";
export enum Region { export enum Region {
NORMAL, NORMAL,
@ -28,7 +25,15 @@ export enum Region {
PALDEA PALDEA
} }
export function getPokemonSpecies(species: Species | Species[]): PokemonSpecies { /**
* Gets the {@linkcode PokemonSpecies} object associated with the {@linkcode Species} enum given
* @param species The species to fetch
* @returns The associated {@linkcode PokemonSpecies} object
*/
export function getPokemonSpecies(species: Species | Species[] | undefined): PokemonSpecies {
if (!species) {
throw new Error("`species` must not be undefined in `getPokemonSpecies()`");
}
// If a special pool (named trainers) is used here it CAN happen that they have a array as species (which means choose one of those two). So we catch that with this code block // If a special pool (named trainers) is used here it CAN happen that they have a array as species (which means choose one of those two). So we catch that with this code block
if (Array.isArray(species)) { if (Array.isArray(species)) {
// Pick a random species from the list // Pick a random species from the list
@ -309,7 +314,7 @@ export abstract class PokemonSpeciesForm {
let variantDataIndex: integer | string = this.speciesId; let variantDataIndex: integer | string = this.speciesId;
const species = getPokemonSpecies(this.speciesId); const species = getPokemonSpecies(this.speciesId);
if (species.forms.length > 0 && formIndex !== undefined) { if (species.forms.length > 0 && formIndex !== undefined) {
formkey = species.forms[formIndex]?.formSpriteKey; formkey = species.forms[formIndex]?.getFormSpriteKey(formIndex);
if (formkey) { if (formkey) {
variantDataIndex = `${this.speciesId}-${formkey}`; variantDataIndex = `${this.speciesId}-${formkey}`;
} }
@ -656,8 +661,8 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali
return this.getSpeciesForLevel(level, allowEvolving, false, (isBoss ? PartyMemberStrength.WEAKER : PartyMemberStrength.AVERAGE) + (gameMode?.isEndless ? 1 : 0)); return this.getSpeciesForLevel(level, allowEvolving, false, (isBoss ? PartyMemberStrength.WEAKER : PartyMemberStrength.AVERAGE) + (gameMode?.isEndless ? 1 : 0));
} }
getTrainerSpeciesForLevel(level: integer, allowEvolving: boolean = false, strength: PartyMemberStrength): Species { getTrainerSpeciesForLevel(level: integer, allowEvolving: boolean = false, strength: PartyMemberStrength, currentWave: number = 0): Species {
return this.getSpeciesForLevel(level, allowEvolving, true, strength); return this.getSpeciesForLevel(level, allowEvolving, true, strength, currentWave);
} }
private getStrengthLevelDiff(strength: PartyMemberStrength): integer { private getStrengthLevelDiff(strength: PartyMemberStrength): integer {
@ -677,7 +682,7 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali
} }
} }
getSpeciesForLevel(level: integer, allowEvolving: boolean = false, forTrainer: boolean = false, strength: PartyMemberStrength = PartyMemberStrength.WEAKER): Species { getSpeciesForLevel(level: integer, allowEvolving: boolean = false, forTrainer: boolean = false, strength: PartyMemberStrength = PartyMemberStrength.WEAKER, currentWave: number = 0): Species {
const prevolutionLevels = this.getPrevolutionLevels(); const prevolutionLevels = this.getPrevolutionLevels();
if (prevolutionLevels.length) { if (prevolutionLevels.length) {
@ -738,6 +743,11 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali
evolutionChance = Math.min(0.65 * easeInFunc(Math.min(Math.max(level - evolutionLevel, 0), preferredMinLevel) / preferredMinLevel) + 0.35 * easeOutFunc(Math.min(Math.max(level - evolutionLevel, 0), preferredMinLevel * 2.5) / (preferredMinLevel * 2.5)), 1); evolutionChance = Math.min(0.65 * easeInFunc(Math.min(Math.max(level - evolutionLevel, 0), preferredMinLevel) / preferredMinLevel) + 0.35 * easeOutFunc(Math.min(Math.max(level - evolutionLevel, 0), preferredMinLevel * 2.5) / (preferredMinLevel * 2.5)), 1);
} }
} }
/* (Most) Trainers shouldn't be using unevolved Pokemon by the third gym leader / wave 80. Exceptions to this include Breeders, whose large teams are balanced by the use of weaker pokemon */
if (currentWave >= 80 && forTrainer && strength > PartyMemberStrength.WEAKER) {
evolutionChance = 1;
noEvolutionChance = 0;
}
if (evolutionChance > 0) { if (evolutionChance > 0) {
if (isRegionalEvolution) { if (isRegionalEvolution) {
@ -762,7 +772,7 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali
for (const weight of evolutionPool.keys()) { for (const weight of evolutionPool.keys()) {
if (randValue < weight) { if (randValue < weight) {
return getPokemonSpecies(evolutionPool.get(weight)!).getSpeciesForLevel(level, true, forTrainer, strength); // TODO: is the bang correct? return getPokemonSpecies(evolutionPool.get(weight)).getSpeciesForLevel(level, true, forTrainer, strength, currentWave);
} }
} }

View File

@ -16,6 +16,7 @@ import {Moves} from "#enums/moves";
import {PartyMemberStrength} from "#enums/party-member-strength"; import {PartyMemberStrength} from "#enums/party-member-strength";
import {Species} from "#enums/species"; import {Species} from "#enums/species";
import {TrainerType} from "#enums/trainer-type"; import {TrainerType} from "#enums/trainer-type";
import {Gender} from "./gender";
export enum TrainerPoolTier { export enum TrainerPoolTier {
COMMON, COMMON,
@ -142,7 +143,7 @@ export const trainerPartyTemplates = {
FIVE_WEAK_BALANCED: new TrainerPartyTemplate(5, PartyMemberStrength.WEAK, false, true), FIVE_WEAK_BALANCED: new TrainerPartyTemplate(5, PartyMemberStrength.WEAK, false, true),
SIX_WEAKER: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER), SIX_WEAKER: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER),
SIX_WEAKER_SAME: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER, true), SIX_WEAKER_SAME: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER, true),
SIX_WEAK_SAME: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER, true), SIX_WEAK_SAME: new TrainerPartyTemplate(6, PartyMemberStrength.WEAK, true),
SIX_WEAK_BALANCED: new TrainerPartyTemplate(6, PartyMemberStrength.WEAK, false, true), SIX_WEAK_BALANCED: new TrainerPartyTemplate(6, PartyMemberStrength.WEAK, false, true),
GYM_LEADER_1: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), GYM_LEADER_1: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)),
@ -323,6 +324,15 @@ export class TrainerConfig {
case TrainerType.LYSANDRE_2: case TrainerType.LYSANDRE_2:
trainerType = TrainerType.LYSANDRE; trainerType = TrainerType.LYSANDRE;
break; break;
case TrainerType.LUSAMINE_2:
trainerType = TrainerType.LUSAMINE;
break;
case TrainerType.GUZMA_2:
trainerType = TrainerType.GUZMA;
break;
case TrainerType.ROSE_2:
trainerType = TrainerType.ROSE;
break;
case TrainerType.MARNIE_ELITE: case TrainerType.MARNIE_ELITE:
trainerType = TrainerType.MARNIE; trainerType = TrainerType.MARNIE;
break; break;
@ -553,9 +563,9 @@ export class TrainerConfig {
} }
case "magma": { case "magma": {
return { return {
[TrainerPoolTier.COMMON]: [Species.NUMEL, Species.POOCHYENA, Species.SLUGMA, Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA, Species.PHANPY, Species.SWINUB, Species.GLIGAR], [TrainerPoolTier.COMMON]: [Species.NUMEL, Species.POOCHYENA, Species.SLUGMA, Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA, Species.PHANPY, Species.ROLYCOLY, Species.GLIGAR],
[TrainerPoolTier.UNCOMMON]: [Species.TRAPINCH, Species.HEATMOR], [TrainerPoolTier.UNCOMMON]: [Species.TRAPINCH, Species.HEATMOR],
[TrainerPoolTier.RARE]: [Species.TURTONATOR, Species.CHARCADET] [TrainerPoolTier.RARE]: [Species.CAPSAKID, Species.CHARCADET]
}; };
} }
case "aqua": { case "aqua": {
@ -586,6 +596,27 @@ export class TrainerConfig {
[TrainerPoolTier.RARE]: [Species.NOIVERN, Species.DRUDDIGON] [TrainerPoolTier.RARE]: [Species.NOIVERN, Species.DRUDDIGON]
}; };
} }
case "aether": {
return {
[TrainerPoolTier.COMMON]: [ Species.BRUXISH, Species.SLOWPOKE, Species.BALTOY, Species.EXEGGCUTE, Species.ABRA, Species.ALOLA_RAICHU, Species.ELGYEM, Species.NATU],
[TrainerPoolTier.UNCOMMON]: [Species.GALAR_SLOWKING, Species.MEDITITE, Species.BELDUM, Species.ORANGURU, Species.HATTERENE, Species.INKAY, Species.RALTS],
[TrainerPoolTier.RARE]: [Species.ARMAROUGE, Species.GIRAFARIG, Species.PORYGON]
};
}
case "skull": {
return {
[TrainerPoolTier.COMMON]: [ Species.MAREANIE, Species.ALOLA_GRIMER, Species.GASTLY, Species.ZUBAT, Species.LURANTIS, Species.VENIPEDE, Species.BUDEW, Species.KOFFING],
[TrainerPoolTier.UNCOMMON]: [Species.GALAR_SLOWBRO, Species.SKORUPI, Species.PALDEA_WOOPER, Species.NIDORAN_F, Species.CROAGUNK, Species.MANDIBUZZ],
[TrainerPoolTier.RARE]: [Species.DRAGALGE, Species.HISUI_SNEASEL]
};
}
case "macro": {
return {
[TrainerPoolTier.COMMON]: [ Species.HATTERENE, Species.MILOTIC, Species.TSAREENA, Species.SALANDIT, Species.GALAR_PONYTA, Species.GOTHITA, Species.FROSLASS],
[TrainerPoolTier.UNCOMMON]: [Species.MANDIBUZZ, Species.MAREANIE, Species.ALOLA_VULPIX, Species.TOGEPI, Species.GALAR_CORSOLA, Species.SINISTEA, Species.APPLIN],
[TrainerPoolTier.RARE]: [Species.TINKATINK, Species.HISUI_LILLIGANT]
};
}
} }
console.warn(`Evil team admin for ${team} not found. Returning empty species pools.`); console.warn(`Evil team admin for ${team} not found. Returning empty species pools.`);
@ -1060,7 +1091,7 @@ function getRandomPartyMemberFunc(speciesPool: Species[], trainerSlot: TrainerSl
return (scene: BattleScene, level: integer, strength: PartyMemberStrength) => { return (scene: BattleScene, level: integer, strength: PartyMemberStrength) => {
let species = Utils.randSeedItem(speciesPool); let species = Utils.randSeedItem(speciesPool);
if (!ignoreEvolution) { if (!ignoreEvolution) {
species = getPokemonSpecies(species).getTrainerSpeciesForLevel(level, true, strength); species = getPokemonSpecies(species).getTrainerSpeciesForLevel(level, true, strength, scene.currentBattle.waveIndex);
} }
return scene.addEnemyPokemon(getPokemonSpecies(species), level, trainerSlot, undefined, undefined, postProcess); return scene.addEnemyPokemon(getPokemonSpecies(species), level, trainerSlot, undefined, undefined, postProcess);
}; };
@ -1070,7 +1101,7 @@ function getSpeciesFilterRandomPartyMemberFunc(speciesFilter: PokemonSpeciesFilt
const originalSpeciesFilter = speciesFilter; const originalSpeciesFilter = speciesFilter;
speciesFilter = (species: PokemonSpecies) => (allowLegendaries || (!species.legendary && !species.subLegendary && !species.mythical)) && !species.isTrainerForbidden() && originalSpeciesFilter(species); speciesFilter = (species: PokemonSpecies) => (allowLegendaries || (!species.legendary && !species.subLegendary && !species.mythical)) && !species.isTrainerForbidden() && originalSpeciesFilter(species);
return (scene: BattleScene, level: integer, strength: PartyMemberStrength) => { return (scene: BattleScene, level: integer, strength: PartyMemberStrength) => {
const ret = scene.addEnemyPokemon(getPokemonSpecies(scene.randomSpecies(scene.currentBattle.waveIndex, level, false, speciesFilter).getTrainerSpeciesForLevel(level, true, strength)), level, trainerSlot, undefined, undefined, postProcess); const ret = scene.addEnemyPokemon(getPokemonSpecies(scene.randomSpecies(scene.currentBattle.waveIndex, level, false, speciesFilter).getTrainerSpeciesForLevel(level, true, strength, scene.currentBattle.waveIndex)), level, trainerSlot, undefined, undefined, postProcess);
return ret; return ret;
}; };
} }
@ -1404,9 +1435,9 @@ export const trainerConfigs: TrainerConfigs = {
[TrainerType.MAGMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Magma Grunt Female").setHasDouble("Magma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) [TrainerType.MAGMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Magma Grunt Female").setHasDouble("Magma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
.setSpeciesPools({ .setSpeciesPools({
[TrainerPoolTier.COMMON]: [Species.SLUGMA, Species.POOCHYENA, Species.NUMEL, Species.ZIGZAGOON, Species.DIGLETT, Species.MAGBY, Species.TORKOAL, Species.BALTOY, Species.BARBOACH], [TrainerPoolTier.COMMON]: [Species.SLUGMA, Species.POOCHYENA, Species.NUMEL, Species.ZIGZAGOON, Species.DIGLETT, Species.MAGBY, Species.TORKOAL, Species.BALTOY, Species.BARBOACH],
[TrainerPoolTier.UNCOMMON]: [Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA, Species.PHANPY, Species.SWINUB, Species.GLIGAR], [TrainerPoolTier.UNCOMMON]: [Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA, Species.PHANPY, Species.ROLYCOLY, Species.GLIGAR],
[TrainerPoolTier.RARE]: [Species.TRAPINCH, Species.HEATMOR], [TrainerPoolTier.RARE]: [Species.TRAPINCH, Species.HEATMOR],
[TrainerPoolTier.SUPER_RARE]: [Species.TURTONATOR, Species.CHARCADET] [TrainerPoolTier.SUPER_RARE]: [Species.CAPSAKID, Species.CHARCADET]
}), }),
[TrainerType.TABITHA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("magma_admin", "magma", [Species.CAMERUPT]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), [TrainerType.TABITHA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("magma_admin", "magma", [Species.CAMERUPT]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
[TrainerType.COURTNEY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("magma_admin_female", "magma", [Species.CAMERUPT]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), [TrainerType.COURTNEY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("magma_admin_female", "magma", [Species.CAMERUPT]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
@ -1426,10 +1457,9 @@ export const trainerConfigs: TrainerConfigs = {
[TrainerPoolTier.RARE]: [Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.HISUI_SNEASEL], [TrainerPoolTier.RARE]: [Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.HISUI_SNEASEL],
[TrainerPoolTier.SUPER_RARE]: [Species.HISUI_ZORUA, Species.HISUI_SLIGGOO] [TrainerPoolTier.SUPER_RARE]: [Species.HISUI_ZORUA, Species.HISUI_SLIGGOO]
}), }),
[TrainerType.JUPITER]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander_female", "galactic", [Species.SKUNTANK]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
[TrainerType.JUPITER]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander_female", "galactic", [Species.SKUNTANK]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), [TrainerType.MARS]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander_female", "galactic", [Species.PURUGLY]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
[TrainerType.MARS]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander_female", "galactic", [Species.PURUGLY]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), [TrainerType.SATURN]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander", "galactic", [Species.TOXICROAK]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
[TrainerType.SATURN]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander", "galactic", [Species.TOXICROAK]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
[TrainerType.PLASMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Plasma Grunt Female").setHasDouble("Plasma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) [TrainerType.PLASMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Plasma Grunt Female").setHasDouble("Plasma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
.setSpeciesPools({ .setSpeciesPools({
[TrainerPoolTier.COMMON]: [Species.PATRAT, Species.LILLIPUP, Species.PURRLOIN, Species.SCRAFTY, Species.WOOBAT, Species.VANILLITE, Species.SANDILE, Species.TRUBBISH], [TrainerPoolTier.COMMON]: [Species.PATRAT, Species.LILLIPUP, Species.PURRLOIN, Species.SCRAFTY, Species.WOOBAT, Species.VANILLITE, Species.SANDILE, Species.TRUBBISH],
@ -1439,7 +1469,6 @@ export const trainerConfigs: TrainerConfigs = {
}), }),
[TrainerType.ZINZOLIN]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("plasma_sage", "plasma", [Species.CRYOGONAL]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), [TrainerType.ZINZOLIN]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("plasma_sage", "plasma", [Species.CRYOGONAL]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
[TrainerType.ROOD]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("plasma_sage", "plasma", [Species.SWOOBAT]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), [TrainerType.ROOD]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("plasma_sage", "plasma", [Species.SWOOBAT]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
[TrainerType.FLARE_GRUNT]: new TrainerConfig(++t).setHasGenders("Flare Grunt Female").setHasDouble("Flare Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) [TrainerType.FLARE_GRUNT]: new TrainerConfig(++t).setHasGenders("Flare Grunt Female").setHasDouble("Flare Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
.setSpeciesPools({ .setSpeciesPools({
[TrainerPoolTier.COMMON]: [Species.FLETCHLING, Species.LITLEO, Species.PONYTA, Species.INKAY, Species.HOUNDOUR, Species.SKORUPI, Species.SCRAFTY, Species.CROAGUNK], [TrainerPoolTier.COMMON]: [Species.FLETCHLING, Species.LITLEO, Species.PONYTA, Species.INKAY, Species.HOUNDOUR, Species.SKORUPI, Species.SCRAFTY, Species.CROAGUNK],
@ -1449,6 +1478,31 @@ export const trainerConfigs: TrainerConfigs = {
}), }),
[TrainerType.BRYONY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("flare_admin_female", "flare", [Species.LIEPARD]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), [TrainerType.BRYONY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("flare_admin_female", "flare", [Species.LIEPARD]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
[TrainerType.XEROSIC]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("flare_admin", "flare", [Species.MALAMAR]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), [TrainerType.XEROSIC]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("flare_admin", "flare", [Species.MALAMAR]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
[TrainerType.AETHER_GRUNT]: new TrainerConfig(++t).setHasGenders("Aether Grunt Female").setHasDouble("Aether Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aether_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [ Species.PIKIPEK, Species.ROCKRUFF, Species.ALOLA_DIGLETT, Species.YUNGOOS, Species.CORSOLA, Species.ALOLA_GEODUDE, Species.BOUNSWEET, Species.LILLIPUP, Species.ALOLA_MAROWAK],
[TrainerPoolTier.UNCOMMON]: [ Species.POLIWAG, Species.STUFFUL, Species.ALOLA_EXEGGUTOR, Species.CRABRAWLER, Species.CUTIEFLY, Species.ALOLA_RAICHU, Species.ORICORIO, Species.MUDBRAY],
[TrainerPoolTier.RARE]: [ Species.ORANGURU, Species.PASSIMIAN, Species.GALAR_CORSOLA, Species.ALOLA_SANDSHREW, Species.ALOLA_VULPIX, Species.TURTONATOR, Species.DRAMPA],
[TrainerPoolTier.SUPER_RARE]: [Species.JANGMO_O, Species.PORYGON]
}),
[TrainerType.FABA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aether_admin", "aether", [Species.HYPNO]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aether_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
[TrainerType.SKULL_GRUNT]: new TrainerConfig(++t).setHasGenders("Skull Grunt Female").setHasDouble("Skull Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_skull_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [ Species.SALANDIT, Species.ALOLA_RATTATA, Species.ALOLA_MEOWTH, Species.SCRAGGY, Species.KOFFING, Species.ALOLA_GRIMER, Species.MAREANIE, Species.SPINARAK, Species.TRUBBISH],
[TrainerPoolTier.UNCOMMON]: [ Species.FOMANTIS, Species.SABLEYE, Species.SANDILE, Species.ALOLA_MAROWAK, Species.PANCHAM, Species.DROWZEE, Species.ZUBAT, Species.VENIPEDE, Species.VULLABY],
[TrainerPoolTier.RARE]: [Species.SANDYGAST, Species.PAWNIARD, Species.MIMIKYU, Species.DHELMISE, Species.GASTLY, Species.WISHIWASHI],
[TrainerPoolTier.SUPER_RARE]: [Species.GRUBBIN, Species.DEWPIDER]
}),
[TrainerType.PLUMERIA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("skull_admin", "skull", [Species.SALAZZLE]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_skull_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
[TrainerType.MACRO_GRUNT]: new TrainerConfig(++t).setHasGenders("Macro Grunt Female").setHasDouble("Macro Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_macro_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [ Species.CUFANT, Species.GALAR_MEOWTH, Species.KLINK, Species.ROOKIDEE, Species.CRAMORANT, Species.GALAR_ZIGZAGOON, Species.SKWOVET, Species.STEELIX, Species.MAWILE, Species.FERROSEED],
[TrainerPoolTier.UNCOMMON]: [ Species.DRILBUR, Species.MAGNEMITE, Species.HATENNA, Species.ARROKUDA, Species.APPLIN, Species.GALAR_PONYTA, Species.GALAR_YAMASK, Species.SINISTEA, Species.RIOLU],
[TrainerPoolTier.RARE]: [Species.FALINKS, Species.BELDUM, Species.GALAR_FARFETCHD, Species.GALAR_MR_MIME, Species.HONEDGE, Species.SCIZOR, Species.GALAR_DARUMAKA],
[TrainerPoolTier.SUPER_RARE]: [Species.DURALUDON, Species.DREEPY]
}),
[TrainerType.OLEANA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("macro_admin", "macro", [Species.GARBODOR]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_oleana").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
[TrainerType.BROCK]: new TrainerConfig((t = TrainerType.BROCK)).initForGymLeader(signatureSpecies["BROCK"], true, Type.ROCK).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), [TrainerType.BROCK]: new TrainerConfig((t = TrainerType.BROCK)).initForGymLeader(signatureSpecies["BROCK"], true, Type.ROCK).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
[TrainerType.MISTY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MISTY"], false, Type.WATER).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), [TrainerType.MISTY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MISTY"], false, Type.WATER).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
[TrainerType.LT_SURGE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LT_SURGE"], true, Type.ELECTRIC).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), [TrainerType.LT_SURGE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LT_SURGE"], true, Type.ELECTRIC).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
@ -1825,7 +1879,7 @@ export const trainerConfigs: TrainerConfigs = {
p.generateName(); p.generateName();
})), })),
[TrainerType.ARCHIE_2]: new TrainerConfig(++t).setName("Archie").initForEvilTeamLeader("Aqua Boss", [], true).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma") [TrainerType.ARCHIE_2]: new TrainerConfig(++t).setName("Archie").initForEvilTeamLeader("Aqua Boss", [], true).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.KINGDRA, Species.LUDICOLO], TrainerSlot.TRAINER, true, p => { .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.EMPOLEON, Species.LUDICOLO], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2); p.setBoss(true, 2);
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL; p.pokeball = PokeballType.ULTRA_BALL;
@ -1838,9 +1892,9 @@ export const trainerConfigs: TrainerConfigs = {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.abilityIndex = 2; // Swift Swim p.abilityIndex = 2; // Swift Swim
})) }))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.HUNTAIL, Species.GOREBYSS], TrainerSlot.TRAINER, true, p => { .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.OVERQWIL ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.abilityIndex = 0; // Swift Swim p.abilityIndex = 1; // Swift Swim
})) }))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.SHARPEDO], TrainerSlot.TRAINER, true, p => { .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.SHARPEDO], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2); p.setBoss(true, 2);
@ -1855,11 +1909,11 @@ export const trainerConfigs: TrainerConfigs = {
p.pokeball = PokeballType.MASTER_BALL; p.pokeball = PokeballType.MASTER_BALL;
})), })),
[TrainerType.CYRUS]: new TrainerConfig(++t).setName("Cyrus").initForEvilTeamLeader("Galactic Boss", []).setMixedBattleBgm("battle_galactic_boss").setVictoryBgm("victory_team_plasma") [TrainerType.CYRUS]: new TrainerConfig(++t).setName("Cyrus").initForEvilTeamLeader("Galactic Boss", []).setMixedBattleBgm("battle_galactic_boss").setVictoryBgm("victory_team_plasma")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.GYARADOS, Species.BASCULEGION])) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GYARADOS ]))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.HONCHKROW, Species.HISUI_BRAVIARY])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HONCHKROW, Species.HISUI_BRAVIARY ]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.CROBAT, Species.OVERQWIL])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.CROBAT, Species.GLISCOR ]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.AZELF, Species.UXIE, Species.MESPRIT])) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.AZELF, Species.UXIE, Species.MESPRIT ]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.HOUNDOOM], TrainerSlot.TRAINER, true, p => { .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HOUNDOOM ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL; p.pokeball = PokeballType.ULTRA_BALL;
p.formIndex = 1; p.formIndex = 1;
@ -1905,15 +1959,20 @@ export const trainerConfigs: TrainerConfigs = {
p.pokeball = PokeballType.ULTRA_BALL; p.pokeball = PokeballType.ULTRA_BALL;
})), })),
[TrainerType.GHETSIS_2]: new TrainerConfig(++t).setName("Ghetsis").initForEvilTeamLeader("Plasma Boss", [], true).setMixedBattleBgm("battle_plasma_boss").setVictoryBgm("victory_team_plasma") [TrainerType.GHETSIS_2]: new TrainerConfig(++t).setName("Ghetsis").initForEvilTeamLeader("Plasma Boss", [], true).setMixedBattleBgm("battle_plasma_boss").setVictoryBgm("victory_team_plasma")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.SLITHER_WING, Species.IRON_MOTH], TrainerSlot.TRAINER, true, p => { .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GENESECT ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2); p.setBoss(true, 2);
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL; p.pokeball = PokeballType.MASTER_BALL;
p.formIndex = Utils.randSeedInt(5);
})) }))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.DURANT])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BASCULEGION, Species.JELLICENT ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.DARMANITAN, Species.GALAR_DARMANITAN])) p.generateAndPopulateMoveset();
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.KINGAMBIT])) p.gender = Gender.MALE;
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.HYDREIGON, Species.IRON_JUGULIS], TrainerSlot.TRAINER, true, p => { p.formIndex = 1;
}))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.KINGAMBIT ]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.VOLCARONA, Species.SLITHER_WING ]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HYDREIGON, Species.IRON_JUGULIS ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2); p.setBoss(true, 2);
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL; p.pokeball = PokeballType.ULTRA_BALL;
@ -1924,12 +1983,15 @@ export const trainerConfigs: TrainerConfigs = {
p.pokeball = PokeballType.MASTER_BALL; p.pokeball = PokeballType.MASTER_BALL;
})), })),
[TrainerType.LYSANDRE]: new TrainerConfig(++t).setName("Lysandre").initForEvilTeamLeader("Flare Boss", []).setMixedBattleBgm("battle_flare_boss").setVictoryBgm("victory_team_plasma") [TrainerType.LYSANDRE]: new TrainerConfig(++t).setName("Lysandre").initForEvilTeamLeader("Flare Boss", []).setMixedBattleBgm("battle_flare_boss").setVictoryBgm("victory_team_plasma")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.MIENSHAO])) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.MIENSHAO ]))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.HONCHKROW, Species.TALONFLAME])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HONCHKROW, Species.TALONFLAME ]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.PYROAR])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.PYROAR ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.MILOTIC])) p.generateAndPopulateMoveset();
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.HELIOLISK])) p.gender = Gender.MALE;
.setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.GYARADOS], TrainerSlot.TRAINER, true, p => { }))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.CLAWITZER, Species.DRAGALGE ]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HELIOLISK, Species.MALAMAR ]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GYARADOS ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2); p.setBoss(true, 2);
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL; p.pokeball = PokeballType.ULTRA_BALL;
@ -1942,10 +2004,13 @@ export const trainerConfigs: TrainerConfigs = {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL; p.pokeball = PokeballType.ULTRA_BALL;
})) }))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.GHOLDENGO, Species.AEGISLASH])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PYROAR ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.PYROAR])) p.generateAndPopulateMoveset();
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.GOODRA, Species.HISUI_GOODRA])) p.gender = Gender.MALE;
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.GYARADOS], TrainerSlot.TRAINER, true, p => { }))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.IRON_MOTH ]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GOODRA, Species.HISUI_GOODRA ]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GYARADOS ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2); p.setBoss(true, 2);
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL; p.pokeball = PokeballType.ULTRA_BALL;
@ -1957,7 +2022,113 @@ export const trainerConfigs: TrainerConfigs = {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL; p.pokeball = PokeballType.MASTER_BALL;
})), })),
// TODO: use signature species? [TrainerType.LUSAMINE]: new TrainerConfig(++t).setName("Lusamine").initForEvilTeamLeader("Aether Boss", []).setMixedBattleBgm("battle_aether_boss").setVictoryBgm("victory_team_plasma")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CLEFABLE ]))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.LILLIGANT, Species.HISUI_LILLIGANT ]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.MILOTIC, Species.PRIMARINA ]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GALAR_SLOWBRO, Species.GALAR_SLOWKING ]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.BEWEAR ]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.NIHILEGO ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
[TrainerType.LUSAMINE_2]: new TrainerConfig(++t).setName("Lusamine").initForEvilTeamLeader("Aether Boss", [], true).setMixedBattleBgm("battle_aether_boss").setVictoryBgm("victory_team_plasma")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CLEFABLE ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
}))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.MILOTIC, Species.PRIMARINA ]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.PHEROMOSA ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL;
}))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.STAKATAKA, Species.CELESTEELA, Species.GUZZLORD ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL;
}))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.NIHILEGO ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL;
}))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.NECROZMA ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL;
})),
[TrainerType.GUZMA]: new TrainerConfig(++t).setName("Guzma").initForEvilTeamLeader("Skull Boss", []).setMixedBattleBgm("battle_skull_boss").setVictoryBgm("victory_team_plasma")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LOKIX, Species.YANMEGA ]))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HERACROSS ]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SCIZOR, Species.KLEAVOR ]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GALVANTULA, Species.VIKAVOLT]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.PINSIR ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.formIndex = 1;
p.generateName();
}))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GOLISOPOD ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
[TrainerType.GUZMA_2]: new TrainerConfig(++t).setName("Guzma").initForEvilTeamLeader("Skull Boss", [], true).setMixedBattleBgm("battle_skull_boss").setVictoryBgm("victory_team_plasma")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GOLISOPOD ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.abilityIndex = 2; //Anticipation
}))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HISUI_SAMUROTT, Species.CRAWDAUNT ], TrainerSlot.TRAINER, true, p => {
p.abilityIndex = 2; //Sharpness, Adaptability
}))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SCIZOR, Species.KLEAVOR ]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.PINSIR ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.formIndex = 1;
p.generateName();
}))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.BUZZWOLE ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL;
}))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.XURKITREE ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL;
})),
[TrainerType.ROSE]: new TrainerConfig(++t).setName("Rose").initForEvilTeamLeader("Macro Boss", []).setMixedBattleBgm("battle_macro_boss").setVictoryBgm("victory_team_plasma")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCHALUDON ]))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.FERROTHORN, Species.ESCAVALIER ]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SIRFETCHD, Species.MR_RIME ]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.CORVIKNIGHT ]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.PERRSERKER, Species.KLINKLANG ]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.COPPERAJAH ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.formIndex = 1;
p.generateName();
})),
[TrainerType.ROSE_2]: new TrainerConfig(++t).setName("Rose").initForEvilTeamLeader("Macro Boss", [], true).setMixedBattleBgm("battle_macro_boss").setVictoryBgm("victory_team_plasma")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCHALUDON ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
}))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.AEGISLASH, Species.GHOLDENGO ]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.DRACOVISH, Species.DRACOZOLT ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.abilityIndex = 1; //Strong Jaw, Hustle
}))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.MELMETAL ]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GALAR_ARTICUNO, Species.GALAR_ZAPDOS, Species.GALAR_MOLTRES ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL;
}))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.COPPERAJAH ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.formIndex = 1;
p.generateName();
})),
[TrainerType.BUCK]: new TrainerConfig(++t).setName("Buck").initForStatTrainer([], true) [TrainerType.BUCK]: new TrainerConfig(++t).setName("Buck").initForStatTrainer([], true)
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CLAYDOL ], TrainerSlot.TRAINER, true, p => { .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CLAYDOL ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 3); p.setBoss(true, 3);

View File

@ -26,5 +26,6 @@ export enum MysteryEncounterType {
THE_WINSTRATE_CHALLENGE, THE_WINSTRATE_CHALLENGE,
TELEPORTING_HIJINKS, TELEPORTING_HIJINKS,
BUG_TYPE_SUPERFAN, BUG_TYPE_SUPERFAN,
FUN_AND_GAMES FUN_AND_GAMES,
UNCOMMON_BREED
} }

View File

@ -72,6 +72,12 @@ export enum TrainerType {
FLARE_GRUNT, FLARE_GRUNT,
BRYONY, BRYONY,
XEROSIC, XEROSIC,
AETHER_GRUNT,
FABA,
SKULL_GRUNT,
PLUMERIA,
MACRO_GRUNT,
OLEANA,
ROCKET_BOSS_GIOVANNI_1, ROCKET_BOSS_GIOVANNI_1,
ROCKET_BOSS_GIOVANNI_2, ROCKET_BOSS_GIOVANNI_2,
MAXIE, MAXIE,
@ -84,6 +90,12 @@ export enum TrainerType {
GHETSIS_2, GHETSIS_2,
LYSANDRE, LYSANDRE,
LYSANDRE_2, LYSANDRE_2,
LUSAMINE,
LUSAMINE_2,
GUZMA,
GUZMA_2,
ROSE,
ROSE_2,
BUCK, BUCK,
CHERYL, CHERYL,
MARLEY, MARLEY,

View File

@ -10,7 +10,7 @@ import * as Utils from "../utils";
import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from "../data/type"; import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from "../data/type";
import { getLevelTotalExp } from "../data/exp"; import { getLevelTotalExp } from "../data/exp";
import { Stat } from "../data/pokemon-stat"; import { Stat } from "../data/pokemon-stat";
import { DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, PokemonBaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempBattleStatBoosterModifier, StatBoosterModifier, CritBoosterModifier, TerastallizeModifier, PokemonBaseStatTotalModifier, PokemonIncrementingStatModifier } from "../modifier/modifier"; import { DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, PokemonBaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempBattleStatBoosterModifier, StatBoosterModifier, CritBoosterModifier, TerastallizeModifier, PokemonBaseStatTotalModifier, PokemonIncrementingStatModifier, PokemonBaseStatFlatModifier } from "../modifier/modifier";
import { PokeballType } from "../data/pokeball"; import { PokeballType } from "../data/pokeball";
import { Gender } from "../data/gender"; import { Gender } from "../data/gender";
import { initMoveAnim, loadMoveAnimAssets } from "../data/battle-anims"; import { initMoveAnim, loadMoveAnimAssets } from "../data/battle-anims";
@ -778,19 +778,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
if (!this.stats) { if (!this.stats) {
this.stats = [ 0, 0, 0, 0, 0, 0 ]; this.stats = [ 0, 0, 0, 0, 0, 0 ];
} }
const baseStats = this.getSpeciesForm().baseStats.slice(0); const baseStats = this.calculateBaseStats();
this.scene.applyModifiers(PokemonBaseStatTotalModifier, this.isPlayer(), this, baseStats);
if (this.fusionSpecies) {
const fusionBaseStats = this.getFusionSpeciesForm().baseStats;
for (let s = 0; s < this.stats.length; s++) {
baseStats[s] = Math.ceil((baseStats[s] + fusionBaseStats[s]) / 2);
}
} else if (this.scene.gameMode.isSplicedOnly) {
for (let s = 0; s < this.stats.length; s++) {
baseStats[s] = Math.ceil(baseStats[s] / 2);
}
}
this.scene.applyModifiers(PokemonBaseStatModifier, this.isPlayer(), this, baseStats);
const stats = Utils.getEnumValues(Stat); const stats = Utils.getEnumValues(Stat);
for (const s of stats) { for (const s of stats) {
const isHp = s === Stat.HP; const isHp = s === Stat.HP;
@ -822,6 +810,27 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
this.scene.applyModifier(PokemonIncrementingStatModifier, this.isPlayer(), this, this.stats); this.scene.applyModifier(PokemonIncrementingStatModifier, this.isPlayer(), this, this.stats);
} }
calculateBaseStats(): number[] {
const baseStats = this.getSpeciesForm().baseStats.slice(0);
// Shuckle Juice
this.scene.applyModifiers(PokemonBaseStatTotalModifier, this.isPlayer(), this, baseStats);
// Old Gateau
this.scene.applyModifiers(PokemonBaseStatFlatModifier, this.isPlayer(), this, baseStats);
if (this.fusionSpecies) {
const fusionBaseStats = this.getFusionSpeciesForm().baseStats;
for (let s = 0; s < this.stats.length; s++) {
baseStats[s] = Math.ceil((baseStats[s] + fusionBaseStats[s]) / 2);
}
} else if (this.scene.gameMode.isSplicedOnly) {
for (let s = 0; s < this.stats.length; s++) {
baseStats[s] = Math.ceil(baseStats[s] / 2);
}
}
// Vitamins
this.scene.applyModifiers(PokemonBaseStatModifier, this.isPlayer(), this, baseStats);
return baseStats;
}
getNature(): Nature { getNature(): Nature {
return this.natureOverride !== -1 ? this.natureOverride : this.nature; return this.natureOverride !== -1 ? this.natureOverride : this.nature;
} }
@ -2679,7 +2688,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
} }
private fusionFaintCry(callback: Function): void { private fusionFaintCry(callback: Function): void {
const key = this.getSpeciesForm().getCryKey(this.formIndex); const key = `cry/${this.getSpeciesForm().getCryKey(this.formIndex)}`;
let i = 0; let i = 0;
let rate = 0.85; let rate = 0.85;
const cry = this.scene.playSound(key, { rate: rate }) as AnySound; const cry = this.scene.playSound(key, { rate: rate }) as AnySound;
@ -2687,7 +2696,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
const tintSprite = this.getTintSprite(); const tintSprite = this.getTintSprite();
let duration = cry.totalDuration * 1000; let duration = cry.totalDuration * 1000;
let fusionCry = this.scene.playSound(this.getFusionSpeciesForm().getCryKey(this.fusionFormIndex), { rate: rate }) as AnySound; const fusionCryKey = `cry/${this.getFusionSpeciesForm().getCryKey(this.fusionFormIndex)}`;
let fusionCry = this.scene.playSound(fusionCryKey, { rate: rate }) as AnySound;
fusionCry.stop(); fusionCry.stop();
duration = Math.min(duration, fusionCry.totalDuration * 1000); duration = Math.min(duration, fusionCry.totalDuration * 1000);
fusionCry.destroy(); fusionCry.destroy();
@ -2731,7 +2741,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
} }
if (i === transitionIndex) { if (i === transitionIndex) {
SoundFade.fadeOut(this.scene, cry, Utils.fixedInt(Math.ceil((duration / rate) * 0.2))); SoundFade.fadeOut(this.scene, cry, Utils.fixedInt(Math.ceil((duration / rate) * 0.2)));
fusionCry = this.scene.playSound(this.getFusionSpeciesForm().getCryKey(this.fusionFormIndex), Object.assign({ seek: Math.max(fusionCry.totalDuration * 0.4, 0), rate: rate })); fusionCry = this.scene.playSound(fusionCryKey, Object.assign({ seek: Math.max(fusionCry.totalDuration * 0.4, 0), rate: rate }));
SoundFade.fadeIn(this.scene, fusionCry, Utils.fixedInt(Math.ceil((duration / rate) * 0.2)), this.scene.masterVolume * this.scene.seVolume, 0); SoundFade.fadeIn(this.scene, fusionCry, Utils.fixedInt(Math.ceil((duration / rate) * 0.2)), this.scene.masterVolume * this.scene.seVolume, 0);
} }
rate *= 0.99; rate *= 0.99;
@ -3795,6 +3805,18 @@ export class EnemyPokemon extends Pokemon {
this.status = new Status(Overrides.OPP_STATUS_OVERRIDE); this.status = new Status(Overrides.OPP_STATUS_OVERRIDE);
} }
if (Overrides.OPP_GENDER_OVERRIDE) {
this.gender = Overrides.OPP_GENDER_OVERRIDE;
}
const speciesId = this.species.speciesId;
if (speciesId in Overrides.OPP_FORM_OVERRIDES
&& Overrides.OPP_FORM_OVERRIDES[speciesId]
&& this.species.forms[Overrides.OPP_FORM_OVERRIDES[speciesId]]) {
this.formIndex = Overrides.OPP_FORM_OVERRIDES[speciesId] ?? 0;
}
if (!dataSource) { if (!dataSource) {
this.generateAndPopulateMoveset(); this.generateAndPopulateMoveset();

View File

@ -364,12 +364,12 @@ export default class Trainer extends Phaser.GameObjects.Container {
let species = useNewSpeciesPool let species = useNewSpeciesPool
? getPokemonSpecies(newSpeciesPool[Math.floor(Math.random() * newSpeciesPool.length)]) ? getPokemonSpecies(newSpeciesPool[Math.floor(Math.random() * newSpeciesPool.length)])
: template.isSameSpecies(index) && index > offset : template.isSameSpecies(index) && index > offset
? getPokemonSpecies(battle.enemyParty[offset].species.getTrainerSpeciesForLevel(level, false, template.getStrength(offset))) ? getPokemonSpecies(battle.enemyParty[offset].species.getTrainerSpeciesForLevel(level, false, template.getStrength(offset), this.scene.currentBattle.waveIndex))
: this.genNewPartyMemberSpecies(level, strength); : this.genNewPartyMemberSpecies(level, strength);
// If the species is from newSpeciesPool, we need to adjust it based on the level and strength // If the species is from newSpeciesPool, we need to adjust it based on the level and strength
if (newSpeciesPool) { if (newSpeciesPool) {
species = getPokemonSpecies(species.getSpeciesForLevel(level, true, true, strength)); species = getPokemonSpecies(species.getSpeciesForLevel(level, true, true, strength, this.scene.currentBattle.waveIndex));
} }
ret = this.scene.addEnemyPokemon(species, level, !this.isDouble() || !(index % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER); ret = this.scene.addEnemyPokemon(species, level, !this.isDouble() || !(index % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER);
@ -398,7 +398,7 @@ export default class Trainer extends Phaser.GameObjects.Container {
species = this.scene.randomSpecies(battle.waveIndex, level, false, this.config.speciesFilter); species = this.scene.randomSpecies(battle.waveIndex, level, false, this.config.speciesFilter);
} }
let ret = getPokemonSpecies(species.getTrainerSpeciesForLevel(level, true, strength)); let ret = getPokemonSpecies(species.getTrainerSpeciesForLevel(level, true, strength, this.scene.currentBattle.waveIndex));
let retry = false; let retry = false;
console.log(ret.getName()); console.log(ret.getName());
@ -417,7 +417,7 @@ export default class Trainer extends Phaser.GameObjects.Container {
console.log("Attempting reroll of species evolution to fit specialty type..."); console.log("Attempting reroll of species evolution to fit specialty type...");
let evoAttempt = 0; let evoAttempt = 0;
while (retry && evoAttempt++ < 10) { while (retry && evoAttempt++ < 10) {
ret = getPokemonSpecies(species.getTrainerSpeciesForLevel(level, true, strength)); ret = getPokemonSpecies(species.getTrainerSpeciesForLevel(level, true, strength, this.scene.currentBattle.waveIndex));
console.log(ret.name); console.log(ret.name);
if (this.config.specialtyTypes.find(t => ret.isOfType(t))) { if (this.config.specialtyTypes.find(t => ret.isOfType(t))) {
retry = false; retry = false;

View File

@ -1,7 +1,8 @@
import { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import { PokemonHeldItemModifierType } from "#app/modifier/modifier-type";
import { PokemonHeldItemModifier } from "#app/modifier/modifier";
export default interface HeldModifierConfig { export default interface HeldModifierConfig {
modifierType: PokemonHeldItemModifierType; modifier: PokemonHeldItemModifierType | PokemonHeldItemModifier;
stackCount?: number; stackCount?: number;
isTransferable?: boolean; isTransferable?: boolean;
} }

View File

@ -38,7 +38,7 @@
"learnMoveNotLearned": "{{pokemonName}} hat {{moveName}} nicht erlernt.", "learnMoveNotLearned": "{{pokemonName}} hat {{moveName}} nicht erlernt.",
"learnMoveForgetQuestion": "Welche Attacke soll vergessen werden?", "learnMoveForgetQuestion": "Welche Attacke soll vergessen werden?",
"learnMoveForgetSuccess": "{{pokemonName}} hat {{moveName}} vergessen.", "learnMoveForgetSuccess": "{{pokemonName}} hat {{moveName}} vergessen.",
"countdownPoof": "@d{32}Eins, @d{15}zwei @d{15}und@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}schwupp!", "countdownPoof": "@d{32}Eins, @d{15}zwei @d{15}und@d{15}… @d{15}… @d{15}… @d{15}@s{se/pb_bounce_1}schwupp!",
"learnMoveAnd": "Und…", "learnMoveAnd": "Und…",
"levelCapUp": "Die Levelbeschränkung wurde auf {{levelCap}} erhöht!", "levelCapUp": "Die Levelbeschränkung wurde auf {{levelCap}} erhöht!",
"moveNotImplemented": "{{moveName}} ist noch nicht implementiert und kann nicht ausgewählt werden.", "moveNotImplemented": "{{moveName}} ist noch nicht implementiert und kann nicht ausgewählt werden.",

View File

@ -80,11 +80,21 @@
"battle_galactic_grunt": "BDSP Vs. Team Galaktik Rüpel", "battle_galactic_grunt": "BDSP Vs. Team Galaktik Rüpel",
"battle_plasma_grunt": "SW Vs. Team Plasma Rüpel", "battle_plasma_grunt": "SW Vs. Team Plasma Rüpel",
"battle_flare_grunt": "XY Vs. Team Flare Rüpel", "battle_flare_grunt": "XY Vs. Team Flare Rüpel",
"battle_aether_grunt": "SM Vs. Æther Foundation",
"battle_skull_grunt": "SM Vs. Team Skull Rüpel",
"battle_macro_grunt": "SWSH Vs. Trainer",
"battle_galactic_admin": "BDSP Vs. Team Galactic Commander",
"battle_skull_admin": "SM Vs. Team Skull Vorstand",
"battle_oleana": "SWSH Vs. Oleana",
"battle_rocket_boss": "USUM Vs. Giovanni", "battle_rocket_boss": "USUM Vs. Giovanni",
"battle_aqua_magma_boss": "ORAS Vs. Team Aqua & Magma Boss", "battle_aqua_magma_boss": "ORAS Vs. Team Aqua & Magma Boss",
"battle_galactic_boss": "BDSP Vs. Zyrus", "battle_galactic_boss": "BDSP Vs. Zyrus",
"battle_plasma_boss": "S2W2 Vs. G-Cis", "battle_plasma_boss": "S2W2 Vs. G-Cis",
"battle_flare_boss": "XY Vs. Flordelis", "battle_flare_boss": "XY Vs. Flordelis",
"battle_aether_boss": "SM Vs. Samantha",
"battle_skull_boss": "SM Vs. Bromley",
"battle_macro_boss": "SWSH Vs. Rose",
"abyss": "PMD Erkundungsteam Himmel Dunkelkrater", "abyss": "PMD Erkundungsteam Himmel Dunkelkrater",
"badlands": "PMD Erkundungsteam Himmel Kargtal", "badlands": "PMD Erkundungsteam Himmel Kargtal",
"beach": "PMD Erkundungsteam Himmel Feuchtklippe", "beach": "PMD Erkundungsteam Himmel Feuchtklippe",

View File

@ -355,6 +355,30 @@
"1": "Ich werde für das nächste Rennen tunen." "1": "Ich werde für das nächste Rennen tunen."
} }
}, },
"firebreather": {
"encounter": {
"1": "Meine Flammen werden dich verschlingen!",
"2": "Meine Seele hat Feuer gefangen. Ich werde dir zeigen, wie heiß sie brennt!",
"3": "Komm näher und sieh dir meine Flammen an!"
},
"victory": {
"1": "Verbrannt bis zur Asche...",
"2": "Yow! Das ist heiß!",
"3": "Auuu! Ich habe mir die Nasenspitze verbrannt!"
}
},
"sailor": {
"encounter": {
"1": "Matrose, du gehst über Bord, wenn du verlierst!",
"2": "Komm schon! Mein Stolz als Seemann steht auf dem Spiel!",
"3": "Ahoj! Bist du seekrank?"
},
"victory": {
"1": "Argh! Von einem Kind besiegt!",
"2": "Dein Geist hat mich versenkt!",
"3": "Ich glaube, ich bin der der seekrank ist..."
}
},
"archer": { "archer": {
"encounter": { "encounter": {
"1": "Bevor du weitergehst, lass uns sehen, wie du dich gegen uns, Team Rocket, schlägst!", "1": "Bevor du weitergehst, lass uns sehen, wie du dich gegen uns, Team Rocket, schlägst!",
@ -417,7 +441,7 @@
}, },
"courtney": { "courtney": {
"encounter": { "encounter": {
"1": "Das Ding... Das Ding, das du hältst... Das ist es, was...\n$Das ist es, wonach wir von Team Magma suchen...", "1": "Stellt euch...Mir NICHT...IN DEN WEEEG...!!",
"2": "... Nun dann... Auslöschen...", "2": "... Nun dann... Auslöschen...",
"3": "...?! Du... Hm... ♪ Das trifft sich ausgezeichnet... ♪\n$Dann hole ich mir eben zuerst deine Pokémon... Her damit..." "3": "...?! Du... Hm... ♪ Das trifft sich ausgezeichnet... ♪\n$Dann hole ich mir eben zuerst deine Pokémon... Her damit..."
}, },
@ -446,7 +470,7 @@
"3": "Was machst du hier? Bist du uns gefolgt?" "3": "Was machst du hier? Bist du uns gefolgt?"
}, },
"victory": { "victory": {
"1": "Na gut, bis der Boss Zeit für dich hat, werde ich dein Gegner sein!", "1": "Bwaarharharharhar!! Ich hab zwar verloren, aber das hat Spaß gemacht!",
"2": "Ich kann es fühlen! Ich kann es spüren, das ist klar! Die Stärke, die von dir ausgeht!\n$Mehr! Ich will noch mehr! Aber es sieht so aus, als hätten wir keine Zeit mehr...", "2": "Ich kann es fühlen! Ich kann es spüren, das ist klar! Die Stärke, die von dir ausgeht!\n$Mehr! Ich will noch mehr! Aber es sieht so aus, als hätten wir keine Zeit mehr...",
"3": "Das war Spaß! Ich wusste, dass du mir eine gute Zeit bieten würdest!\n$Ich freue mich darauf, dich eines Tages wieder zu treffen!" "3": "Das war Spaß! Ich wusste, dass du mir eine gute Zeit bieten würdest!\n$Ich freue mich darauf, dich eines Tages wieder zu treffen!"
} }
@ -535,30 +559,6 @@
"3": "Wunderbar! Bemerkenswert! Deine Fähigkeiten und dein Mut sind lobenswert." "3": "Wunderbar! Bemerkenswert! Deine Fähigkeiten und dein Mut sind lobenswert."
} }
}, },
"firebreather": {
"encounter": {
"1": "Meine Flammen werden dich verschlingen!",
"2": "Meine Seele hat Feuer gefangen. Ich werde dir zeigen, wie heiß sie brennt!",
"3": "Komm näher und sieh dir meine Flammen an!"
},
"victory": {
"1": "Verbrannt bis zur Asche...",
"2": "Yow! Das ist heiß!",
"3": "Auuu! Ich habe mir die Nasenspitze verbrannt!"
}
},
"sailor": {
"encounter": {
"1": "Matrose, du gehst über Bord, wenn du verlierst!",
"2": "Komm schon! Mein Stolz als Seemann steht auf dem Spiel!",
"3": "Ahoj! Bist du seekrank?"
},
"victory": {
"1": "Argh! Von einem Kind besiegt!",
"2": "Dein Geist hat mich versenkt!",
"3": "Ich glaube, ich bin der der seekrank ist..."
}
},
"rocket_grunt": { "rocket_grunt": {
"encounter": { "encounter": {
"1": "Jetzt gibt es Ärger!…\n$und es kommt noch härter!\n$Wir wollen über die Erde regieren…\n$und naja du kennst den Rest…!", "1": "Jetzt gibt es Ärger!…\n$und es kommt noch härter!\n$Wir wollen über die Erde regieren…\n$und naja du kennst den Rest…!",
@ -655,6 +655,86 @@
"5": "Du hast mich besiegt, aber Team Flare wird immer in Glanz und Stil erstrahlen." "5": "Du hast mich besiegt, aber Team Flare wird immer in Glanz und Stil erstrahlen."
} }
}, },
"aether_grunt": {
"encounter": {
"1": "Ich werde dich mit allem, was ich habe, bekämpfen. Ich werde dich auslöschen!",
"2": "Mir ist egal, ob du ein simpler Trainer bist oder nicht.\n$Ich werde dich hochkant rauswerfen, wenn du uns bedrohst!",
"3": "Mir wurde gesagt, Trainer abzuweisen, egal wer sie sind!",
"4": "Ich zeige dir die Macht des Æther-Paradies",
"5": "Jetzt da du die Wahre Natur des Æther-Paradies kennst, müssen wir dich leider beseitigen!"
},
"victory": {
"1": "Hmph! Du scheinst ziemlich geschickt zu sein.",
"2": "Was hat das zu bedeuten? Was hat das zu bedeuten!",
"3": "Hey, du bist so stark, dass ich dich nicht abweisen kann!",
"4": "Hmm... Es scheint, als hätte ich verloren.",
"5": "Ich hätte das Blitzdings benutzen sollen..."
}
},
"faba": {
"encounter": {
"1": "Ich bin Regionalleiter Fabian und ich werde dir zeigen, wie hart die Welt sein kann!",
"2": "Die letzte Verteidigungslinie des Æther-Paradieses kämpft gegen einen simplen Trainer?",
"3": "Ich Fabian, bin der Regionalleiter der Æther Foundation.\n$Der einzige auf der Welt, ich bin unersetzlich."
},
"victory": {
"1": "Aiyee!",
"2": "W-w-wie kann das sein?! Wie konnte dieser Trainer...",
"3": "Das ist der Grund... warum ich andere Menschen nicht ausstehen kann."
}
},
"skull_grunt": {
"encounter": {
"1": "Wir sind nicht böse, wir sind einfach nur nicht nett!",
"2": "Willst du Stress, oder was? Das ist unsere Art, Hallo zu sagen! Tschüss, du Punk!",
"3": "Wir sind nur ein paar Typen und Mädels mit großem Interesse an den Pokémon anderer Leute!",
"4": "Wieso machst du einen auf hart, wenn wir schon hart wie Knochen sind, Homie?",
"5": "Yo, platz hier nich rein, ♪ wien wildes Kleinstein! ♪ Wenn du meinst, dass Team Skull ♪\n$an nix denkt als Krawall, ♪ hast du leider nen Knall, ♪ denn das is nich der Fall! ♪\n$Wir wolln hier nur gammeln ♪ und gechillt Staub ansammeln! ♪"
},
"victory": {
"1": "Wie jetzt? Schon vorbei?",
"2": "Woah, lass uns lieber die Kurve kratzen, yo! Kein Bock, hier meinen Schädel zu riskieren...",
"3": "Wir brauchen deine schwachen Pokémon eh nicht!",
"4": "Was? Deine Stärke spür ich bis in die Knochen...",
"5": "Mein Homie und ich sind also weniger wert als Pokémon? Willste uns dissen, oder was?"
}
},
"plumeria": {
"encounter": {
"1": "..Hmph. Du siehst nicht so aus, als wärst du etwas Besonderes.",
"2": "Die blöden Rüpel brauchen viel zu lange, um mit euch gewöhnlichen Trainern fertig zu werden...",
"3": "Lege dich mit irgendjemandem in Team Skull an, und ich zeige dir, wie ernst ich werden kann."
},
"victory": {
"1": "Du bist ziemlich stark. Das muss ich zugeben.",
"2": "Jetzt versteh ich, warum meine Rüpel so viel Zeit damit verschwenden...",
"3": "Ich denke, ich muss diese Niederlage einfach hinnehmen."
}
},
"macro_grunt": {
"encounter": {
"1": "Achtung hier ist Endstation für dich!",
"2": "Du bist ein Trainer, oder? Wir von MC Wertpapiere wissen so etwas.\n$Ich fürchte, das gibt dir trotzdem nicht das Recht, sich in unsere Arbeit einzumischen.",
"3": "Ich bin von MC Versicherungen! Hast du eine Lebensversicherung?"
},
"victory": {
"1": "Ich habe keine andere Wahl, als respektvoll zurückzutreten.",
"2": "Mein Erspartes aufzugeben bringt mich in die roten Zahlen...",
"3": "Okay zurück an die Arbeit. Versicherungen verkauft sich nicht von alleine."
}
},
"oleana": {
"encounter": {
"1": "Ich werde keine Störung von Präsident Roses Plänen zulassen!",
"2": "Du hast es also durch die Mitarbeiter der Tochterunternehmen geschafft,\n$die ich beauftragt habe, um dich aufzuhalten. Ich hätte nichts anderes erwartet.",
"3": "Für den Präsidenten! Ich werde nicht verlieren! \n$Mach dich bereit mit Macro Cosmos Airlines nach Hause zu fliegen!"
},
"victory": {
"1": "Ich habe es nicht geschafft... Olivia... du bist wirklich eine hoffnungslose Frau.",
"2": "Arghhh! Das ist unentschuldbar... Was habe ich mir dabei gedacht...\n$Jeder Trainer, der es so weit geschafft hat, muss ein harter Brocken sein...",
"3": "Ich bin eine müde Olivia... Ob es Macro Cosmos Betten gibt?"
}
},
"rocket_boss_giovanni_1": { "rocket_boss_giovanni_1": {
"encounter": { "encounter": {
"1": "Ich bin beeindruckt, du hast es bis hierher geschafft!\n$Ich bin Giovanni, der Anführer von Team Rocket!\n$Wir regieren den Untergrund von Kanto!\n$Und wir lassen sicherlich nicht zu, dass ein Kind uns aufhält!" "1": "Ich bin beeindruckt, du hast es bis hierher geschafft!\n$Ich bin Giovanni, der Anführer von Team Rocket!\n$Wir regieren den Untergrund von Kanto!\n$Und wir lassen sicherlich nicht zu, dass ein Kind uns aufhält!"
@ -787,6 +867,72 @@
"1": "Narren ohne Vision werden weiterhin diese wunderschöne Welt verunreinigen." "1": "Narren ohne Vision werden weiterhin diese wunderschöne Welt verunreinigen."
} }
}, },
"aether_boss_lusamine_1": {
"encounter": {
"1": "Du wirst mein süßes Biest erschrecken! Wie kannst du nur? Ultra-Besiten sind so niedlich!\n$Es sieht so aus, als müsste ich dich zuerst zum Schweigen bringen."
},
"victory": {
"1": "Wie kann eine Person nur so grausam sein?!"
},
"defeat": {
"1": "Und jetzt, mein süßes Biest, komm zu Mama!"
}
},
"aether_boss_lusamine_2": {
"encounter": {
"1": "Wieso musst du mich weiterhin belästigen?! Ich habe die Nase voll von dir.\n$Du machst mich krank! Genug mit diesem nutzlosen Gerede... \n$Mit der Kraft von Anego, von uns als UB-01 Schmarotzer klassifiziert,\n$werde ich dir zeigen, wie falsch du warst, hierher zu kommen!"
},
"victory": {
"1": "Aaauuuggghhhhhhhhh!!!"
},
"defeat": {
"1": "Alles, was ich will, ist mein kostbares Biest! Der Rest von euch ist mir egal!"
}
},
"skull_boss_guzma_1": {
"encounter": {
"1": "Kein Erbarmen! Keine Gnade! Ich bin dein schlimmster Alptraum! \n$Oh yeah, ich bin der große, böse Bromley!"
},
"victory": {
"1": "Irgendwann mach ich dich platt! Ich hab noch ein Ass im Ärmel. Du wirst schon sehen."
},
"defeat": {
"1": "Du hast den langen Weg hierher DAFÜR aufgenommen? Pah!"
}
},
"skull_boss_guzma_2": {
"encounter": {
"1": "Mir ist egal, wer du bist. Ich mach dich platt!! Das schreibt mir mein Ego vor. Ich bin Bromley!"
},
"victory": {
"1": "Bromley!!! Was ist falsch mit dir?!"
},
"defeat": {
"1": "Ihr seid wirklich selten dämlich."
}
},
"macro_boss_rose_1": {
"encounter": {
"1": "Mein Name ist Rose. Ich bin der Präsident der Galar Pokémon-Liga und Geschäftsführer von Macro Cosmos\n$Ich habe eine Aufgabe, eine Berufung! Ich muss die Galar-Region mit unbegrenzter Energie versorgen,\n$damit sie sich bis in alle Ewigkeit in Frieden fortentwickeln kann!"
},
"victory": {
"1": "Du versteht es einfach nicht...So können wir die Geschichte nicht verändern!"
},
"defeat": {
"1": "Ohne deine Einmischung kann ich jetzt endlich weiterarbeiten!"
}
},
"macro_boss_rose_2": {
"encounter": {
"1": "Ich bin fest entschlossen, das Energieproblem in der Galar-Region\n$und natürlich auf der ganzen Welt zu lösen.\n$Meine Erfahrungen und Erfolge, die Macro Cosmos zu einem Erfolg gemacht haben,\n$sind der Beweis, dass meine Methoden funktionieren.\n$Ich habe nicht vor, meine Meinung zu ändern, selbst wenn ich verliere."
},
"victory": {
"1": "Ich hatte vergessen, wie großartig Pokémon-Kämpfe sind! Es ist so lange her, dass ich gekämpft habe...\n$Das war wirklich befriedigend, ich akzeptiere die Niederlage für diesen Kampf."
},
"defeat": {
"1": "Ich nehme an, es muss den Anschein haben, dass ich etwas Schreckliches tue.\n$Ich erwarte nicht, dass du es verstehst. Aber ich muss der Galar-Region grenzenlose Energie\n$bereitstellen, um ewigen Wohlstand zu gewährleisten."
}
},
"brock": { "brock": {
"encounter": { "encounter": {
"1": "Meine Expertise in Bezug auf Gesteins-Pokémon wird dich besiegen! Komm schon!", "1": "Meine Expertise in Bezug auf Gesteins-Pokémon wird dich besiegen! Komm schon!",
@ -2455,7 +2601,7 @@
"1": "@c{smile}Hey, du auch hier?\n@c{smile_eclosed}Immernoch ungeschlagen, hmm…?\n$@c{serious_mopen_fists}Ich weiß es sieht so aus, als wäre ich dir hierher gefolgt, aber das ist so nicht ganz richtig.\n$@c{serious_smile_fists}Ehrlicherweise kann ich es, seit du mich damals besiegt hast, garnicht erwarten erneut gegen dich zu kämpfen.\n$Ich habe selbst hart traniert. Ich werde dir diesesmal also ein würdigerer Gegner sein!.\n$@c{serious_mopen_fists}Halt dich nicht zurück, genauso wie beim letzten Mal!\nLos gehts!" "1": "@c{smile}Hey, du auch hier?\n@c{smile_eclosed}Immernoch ungeschlagen, hmm…?\n$@c{serious_mopen_fists}Ich weiß es sieht so aus, als wäre ich dir hierher gefolgt, aber das ist so nicht ganz richtig.\n$@c{serious_smile_fists}Ehrlicherweise kann ich es, seit du mich damals besiegt hast, garnicht erwarten erneut gegen dich zu kämpfen.\n$Ich habe selbst hart traniert. Ich werde dir diesesmal also ein würdigerer Gegner sein!.\n$@c{serious_mopen_fists}Halt dich nicht zurück, genauso wie beim letzten Mal!\nLos gehts!"
}, },
"victory": { "victory": {
"1": "@c{neutral_eclosed}Oh. Ich war also zu sehr von mir überzeugt.\n$@c{smile}Das ist Ok. Ich hatte mir schon gedacht, dass sowas passiert.\n\n$@c{serious_mopen_fists}Es bedeutet einfach, dass ich mich beim nächsten Mal mehr anstrengen muss!\n\n$@c{smile}Nicht, dass du wirklich Hilfe benötigen würdest, aber ich habe hier noch eins von diesen Dingern herumliegen.\n$Du kannst es haben.\n\n$@c{serious_smile_fists}Erwarte aber nicht, dass ich dir noch mehr gebe!\nIch kann meinen Rivalen doch keine Vorteile verschaffen.\n$@c{smile}Egal, pass auf dich auf und genieße das Event!" "1": "@c{neutral_eclosed}Oh. Ich war also zu sehr von mir überzeugt.\n$@c{smile}Das ist Ok. Ich hatte mir schon gedacht, dass sowas passiert.\n\n$@c{serious_mopen_fists}Es bedeutet einfach, dass ich mich beim nächsten Mal mehr anstrengen muss!\n\n$@c{smile}Nicht, dass du wirklich Hilfe benötigen würdest, aber ich habe hier noch eins von diesen Dingern herumliegen.\n$Du kannst es haben.\n\n$@c{serious_smile_fists}Erwarte aber nicht, dass ich dir noch mehr gebe!\nIch kann meinen Rivalen doch keine Vorteile verschaffen.\n$@c{smile}Egal, pass auf dich auf!"
} }
}, },
"rival_2_female": { "rival_2_female": {
@ -2463,7 +2609,7 @@
"1": "@c{smile_wave}Oh, wie schön dich hier zu trefen. Sieht so aus als wärst du noch ungeschlagen. @c{angry_mopen}Hmm… Nicht schlecht!\n$@c{angry_mopen}Ich weiß was du denkst, und nein, ich habe dich nicht verfolgt. @c{smile_eclosed}Ich bin einfach in der Gegend gewesen.\n$@c{smile_ehalf}Ich freu mich für dich, aber ich muss dich wissen lassen, dass es auch Ok ist ab und zu mal zu verlieren.\n$@c{smile}Wir lernen oft mehr aus unseren Fehlern, als aus unseren Erfolgen.\n$@c{angry_mopen}Auf jeden Fall habe ich für unseren Rückkampf hart traniert. Also zeig mir was du drauf hast!" "1": "@c{smile_wave}Oh, wie schön dich hier zu trefen. Sieht so aus als wärst du noch ungeschlagen. @c{angry_mopen}Hmm… Nicht schlecht!\n$@c{angry_mopen}Ich weiß was du denkst, und nein, ich habe dich nicht verfolgt. @c{smile_eclosed}Ich bin einfach in der Gegend gewesen.\n$@c{smile_ehalf}Ich freu mich für dich, aber ich muss dich wissen lassen, dass es auch Ok ist ab und zu mal zu verlieren.\n$@c{smile}Wir lernen oft mehr aus unseren Fehlern, als aus unseren Erfolgen.\n$@c{angry_mopen}Auf jeden Fall habe ich für unseren Rückkampf hart traniert. Also zeig mir was du drauf hast!"
}, },
"victory": { "victory": {
"1": "@c{neutral}Ich… sollte dieses Mal doch nicht verlieren…\n$@c{smile}Na gut. Das bedeutet ich muss noch härter tranieren!\n$@c{smile_wave}Ich habe noch eins von diesen Dingern!\n@c{smile_wave_wink}Kein Grund mir zu danken~.\n$@c{angry_mopen}Das ist aber das Letzte! Du bekommst ab jett keine Geschenke mehr von mir!\n$@c{smile_wave}Bleib stark und genieße das Event!" "1": "@c{neutral}Ich… sollte dieses Mal doch nicht verlieren…\n$@c{smile}Na gut. Das bedeutet ich muss noch härter tranieren!\n$@c{smile_wave}Ich habe noch eins von diesen Dingern!\n@c{smile_wave_wink}Kein Grund mir zu danken~.\n$@c{angry_mopen}Das ist aber das Letzte! Du bekommst ab jett keine Geschenke mehr von mir!\n$@c{smile_wave}Bleib stark!"
}, },
"defeat": { "defeat": {
"1": "Es ist Ok manchmal zu verlieren…" "1": "Es ist Ok manchmal zu verlieren…"

View File

@ -355,6 +355,30 @@
"1": "Ich werde für das nächste Rennen tunen." "1": "Ich werde für das nächste Rennen tunen."
} }
}, },
"firebreather": {
"encounter": {
"1": "Meine Flammen werden dich verschlingen!",
"2": "Meine Seele hat Feuer gefangen. Ich werde dir zeigen, wie heiß sie brennt!",
"3": "Komm näher und sieh dir meine Flammen an!"
},
"victory": {
"1": "Verbrannt bis zur Asche...",
"2": "Yow! Das ist heiß!",
"3": "Auuu! Ich habe mir die Nasenspitze verbrannt!"
}
},
"sailor": {
"encounter": {
"1": "Matrose, du gehst über Bord, wenn du verlierst!",
"2": "Komm schon! Mein Stolz als Seemann steht auf dem Spiel!",
"3": "Ahoj! Bist du seekrank?"
},
"victory": {
"1": "Argh! Von einem Kind besiegt!",
"2": "Dein Geist hat mich versenkt!",
"3": "Ich glaube, ich bin der der seekrank ist..."
}
},
"archer": { "archer": {
"encounter": { "encounter": {
"1": "Bevor du weitergehst, lass uns sehen, wie du dich gegen uns, Team Rocket, schlägst!", "1": "Bevor du weitergehst, lass uns sehen, wie du dich gegen uns, Team Rocket, schlägst!",
@ -417,7 +441,7 @@
}, },
"courtney": { "courtney": {
"encounter": { "encounter": {
"1": "Das Ding... Das Ding, das du hältst... Das ist es, was...\n$Das ist es, wonach wir von Team Magma suchen...", "1": "Stellt euch...Mir NICHT...IN DEN WEEEG...!!",
"2": "... Nun dann... Auslöschen...", "2": "... Nun dann... Auslöschen...",
"3": "...?! Du... Hm... ♪ Das trifft sich ausgezeichnet... ♪\n$Dann hole ich mir eben zuerst deine Pokémon... Her damit..." "3": "...?! Du... Hm... ♪ Das trifft sich ausgezeichnet... ♪\n$Dann hole ich mir eben zuerst deine Pokémon... Her damit..."
}, },
@ -446,7 +470,7 @@
"3": "Was machst du hier? Bist du uns gefolgt?" "3": "Was machst du hier? Bist du uns gefolgt?"
}, },
"victory": { "victory": {
"1": "Na gut, bis der Boss Zeit für dich hat, werde ich dein Gegner sein!", "1": "Bwaarharharharhar!! Ich hab zwar verloren, aber das hat Spaß gemacht!",
"2": "Ich kann es fühlen! Ich kann es spüren, das ist klar! Die Stärke, die von dir ausgeht!\n$Mehr! Ich will noch mehr! Aber es sieht so aus, als hätten wir keine Zeit mehr...", "2": "Ich kann es fühlen! Ich kann es spüren, das ist klar! Die Stärke, die von dir ausgeht!\n$Mehr! Ich will noch mehr! Aber es sieht so aus, als hätten wir keine Zeit mehr...",
"3": "Das war Spaß! Ich wusste, dass du mir eine gute Zeit bieten würdest!\n$Ich freue mich darauf, dich eines Tages wieder zu treffen!" "3": "Das war Spaß! Ich wusste, dass du mir eine gute Zeit bieten würdest!\n$Ich freue mich darauf, dich eines Tages wieder zu treffen!"
} }
@ -535,30 +559,6 @@
"3": "Wunderbar! Bemerkenswert! Deine Fähigkeiten und dein Mut sind lobenswert." "3": "Wunderbar! Bemerkenswert! Deine Fähigkeiten und dein Mut sind lobenswert."
} }
}, },
"firebreather": {
"encounter": {
"1": "Meine Flammen werden dich verschlingen!",
"2": "Meine Seele hat Feuer gefangen. Ich werde dir zeigen, wie heiß sie brennt!",
"3": "Komm näher und sieh dir meine Flammen an!"
},
"victory": {
"1": "Verbrannt bis zur Asche...",
"2": "Yow! Das ist heiß!",
"3": "Auuu! Ich habe mir die Nasenspitze verbrannt!"
}
},
"sailor": {
"encounter": {
"1": "Matrose, du gehst über Bord, wenn du verlierst!",
"2": "Komm schon! Mein Stolz als Seemann steht auf dem Spiel!",
"3": "Ahoj! Bist du seekrank?"
},
"victory": {
"1": "Argh! Von einem Kind besiegt!",
"2": "Dein Geist hat mich versenkt!",
"3": "Ich glaube, ich bin der der seekrank ist..."
}
},
"rocket_grunt": { "rocket_grunt": {
"encounter": { "encounter": {
"1": "Jetzt gibt es Ärger!…\n$und es kommt noch härter!\n$Wir wollen über die Erde regieren…\n$und naja du kennst den Rest…!", "1": "Jetzt gibt es Ärger!…\n$und es kommt noch härter!\n$Wir wollen über die Erde regieren…\n$und naja du kennst den Rest…!",
@ -655,6 +655,86 @@
"5": "Du hast mich besiegt, aber Team Flare wird immer in Glanz und Stil erstrahlen." "5": "Du hast mich besiegt, aber Team Flare wird immer in Glanz und Stil erstrahlen."
} }
}, },
"aether_grunt": {
"encounter": {
"1": "Ich werde dich mit allem, was ich habe, bekämpfen. Ich werde dich auslöschen!",
"2": "Mir ist egal, ob du ein simpler Trainer bist oder nicht.\n$Ich werde dich hochkant rauswerfen, wenn du uns bedrohst!",
"3": "Mir wurde gesagt, Trainer abzuweisen, egal wer sie sind!",
"4": "Ich zeige dir die Macht des Æther-Paradies",
"5": "Jetzt da du die Wahre Natur des Æther-Paradies kennst, müssen wir dich leider beseitigen!"
},
"victory": {
"1": "Hmph! Du scheinst ziemlich geschickt zu sein.",
"2": "Was hat das zu bedeuten? Was hat das zu bedeuten!",
"3": "Hey, du bist so stark, dass ich dich nicht abweisen kann!",
"4": "Hmm... Es scheint, als hätte ich verloren.",
"5": "Ich hätte das Blitzdings benutzen sollen..."
}
},
"faba": {
"encounter": {
"1": "Ich bin Regionalleiter Fabian und ich werde dir zeigen, wie hart die Welt sein kann!",
"2": "Die letzte Verteidigungslinie des Æther-Paradieses kämpft gegen einen simplen Trainer?",
"3": "Ich Fabian, bin der Regionalleiter der Æther Foundation.\n$Der einzige auf der Welt, ich bin unersetzlich."
},
"victory": {
"1": "Aiyee!",
"2": "W-w-wie kann das sein?! Wie konnte dieser Trainer...",
"3": "Das ist der Grund... warum ich andere Menschen nicht ausstehen kann."
}
},
"skull_grunt": {
"encounter": {
"1": "Wir sind nicht böse, wir sind einfach nur nicht nett!",
"2": "Willst du Stress, oder was? Das ist unsere Art, Hallo zu sagen! Tschüss, du Punk!",
"3": "Wir sind nur ein paar Typen und Mädels mit großem Interesse an den Pokémon anderer Leute!",
"4": "Wieso machst du einen auf hart, wenn wir schon hart wie Knochen sind, Homie?",
"5": "Yo, platz hier nich rein, ♪ wien wildes Kleinstein! ♪ Wenn du meinst, dass Team Skull ♪\n$an nix denkt als Krawall, ♪ hast du leider nen Knall, ♪ denn das is nich der Fall! ♪\n$Wir wolln hier nur gammeln ♪ und gechillt Staub ansammeln! ♪"
},
"victory": {
"1": "Wie jetzt? Schon vorbei?",
"2": "Woah, lass uns lieber die Kurve kratzen, yo! Kein Bock, hier meinen Schädel zu riskieren...",
"3": "Wir brauchen deine schwachen Pokémon eh nicht!",
"4": "Was? Deine Stärke spür ich bis in die Knochen...",
"5": "Mein Homie und ich sind also weniger wert als Pokémon? Willste uns dissen, oder was?"
}
},
"plumeria": {
"encounter": {
"1": "..Hmph. Du siehst nicht so aus, als wärst du etwas Besonderes.",
"2": "Die blöden Rüpel brauchen viel zu lange, um mit euch gewöhnlichen Trainern fertig zu werden...",
"3": "Lege dich mit irgendjemandem in Team Skull an, und ich zeige dir, wie ernst ich werden kann."
},
"victory": {
"1": "Du bist ziemlich stark. Das muss ich zugeben.",
"2": "Jetzt versteh ich, warum meine Rüpel so viel Zeit damit verschwenden...",
"3": "Ich denke, ich muss diese Niederlage einfach hinnehmen."
}
},
"macro_grunt": {
"encounter": {
"1": "Achtung hier ist Endstation für dich!",
"2": "Du bist ein Trainer, oder? Wir von MC Wertpapiere wissen so etwas.\n$Ich fürchte, das gibt dir trotzdem nicht das Recht, sich in unsere Arbeit einzumischen.",
"3": "Ich bin von MC Versicherungen! Hast du eine Lebensversicherung?"
},
"victory": {
"1": "Ich habe keine andere Wahl, als respektvoll zurückzutreten.",
"2": "Mein Erspartes aufzugeben bringt mich in die roten Zahlen...",
"3": "Okay zurück an die Arbeit. Versicherungen verkauft sich nicht von alleine."
}
},
"oleana": {
"encounter": {
"1": "Ich werde keine Störung von Präsident Roses Plänen zulassen!",
"2": "Du hast es also durch die Mitarbeiter der Tochterunternehmen geschafft,\n$die ich beauftragt habe, um dich aufzuhalten. Ich hätte nichts anderes erwartet.",
"3": "Für den Präsidenten! Ich werde nicht verlieren! \n$Mach dich bereit mit Macro Cosmos Airlines nach Hause zu fliegen!"
},
"victory": {
"1": "Ich habe es nicht geschafft... Olivia... du bist wirklich eine hoffnungslose Frau.",
"2": "Arghhh! Das ist unentschuldbar... Was habe ich mir dabei gedacht...\n$Jeder Trainer, der es so weit geschafft hat, muss ein harter Brocken sein...",
"3": "Ich bin eine müde Olivia... Ob es Macro Cosmos Betten gibt?"
}
},
"rocket_boss_giovanni_1": { "rocket_boss_giovanni_1": {
"encounter": { "encounter": {
"1": "Ich bin beeindruckt, du hast es bis hierher geschafft!\n$Ich bin Giovanni, der Anführer von Team Rocket!\n$Wir regieren den Untergrund von Kanto!\n$Und wir lassen sicherlich nicht zu, dass ein Kind uns aufhält!" "1": "Ich bin beeindruckt, du hast es bis hierher geschafft!\n$Ich bin Giovanni, der Anführer von Team Rocket!\n$Wir regieren den Untergrund von Kanto!\n$Und wir lassen sicherlich nicht zu, dass ein Kind uns aufhält!"
@ -787,6 +867,72 @@
"1": "Narren ohne Vision werden weiterhin diese wunderschöne Welt verunreinigen." "1": "Narren ohne Vision werden weiterhin diese wunderschöne Welt verunreinigen."
} }
}, },
"aether_boss_lusamine_1": {
"encounter": {
"1": "Du wirst mein süßes Biest erschrecken! Wie kannst du nur? Ultra-Besiten sind so niedlich!\n$Es sieht so aus, als müsste ich dich zuerst zum Schweigen bringen."
},
"victory": {
"1": "Wie kann eine Person nur so grausam sein?!"
},
"defeat": {
"1": "Und jetzt, mein süßes Biest, komm zu Mama!"
}
},
"aether_boss_lusamine_2": {
"encounter": {
"1": "Wieso musst du mich weiterhin belästigen?! Ich habe die Nase voll von dir.\n$Du machst mich krank! Genug mit diesem nutzlosen Gerede... \n$Mit der Kraft von Anego, von uns als UB-01 Schmarotzer klassifiziert,\n$werde ich dir zeigen, wie falsch du warst, hierher zu kommen!"
},
"victory": {
"1": "Aaauuuggghhhhhhhhh!!!"
},
"defeat": {
"1": "Alles, was ich will, ist mein kostbares Biest! Der Rest von euch ist mir egal!"
}
},
"skull_boss_guzma_1": {
"encounter": {
"1": "Kein Erbarmen! Keine Gnade! Ich bin dein schlimmster Alptraum! \n$Oh yeah, ich bin der große, böse Bromley!"
},
"victory": {
"1": "Irgendwann mach ich dich platt! Ich hab noch ein Ass im Ärmel. Du wirst schon sehen."
},
"defeat": {
"1": "Du hast den langen Weg hierher DAFÜR aufgenommen? Pah!"
}
},
"skull_boss_guzma_2": {
"encounter": {
"1": "Mir ist egal, wer du bist. Ich mach dich platt!! Das schreibt mir mein Ego vor. Ich bin Bromley!"
},
"victory": {
"1": "Bromley!!! Was ist falsch mit dir?!"
},
"defeat": {
"1": "Ihr seid wirklich selten dämlich."
}
},
"macro_boss_rose_1": {
"encounter": {
"1": "Mein Name ist Rose. Ich bin der Präsident der Galar Pokémon-Liga und Geschäftsführer von Macro Cosmos\n$Ich habe eine Aufgabe, eine Berufung! Ich muss die Galar-Region mit unbegrenzter Energie versorgen,\n$damit sie sich bis in alle Ewigkeit in Frieden fortentwickeln kann!"
},
"victory": {
"1": "Du versteht es einfach nicht...So können wir die Geschichte nicht verändern!"
},
"defeat": {
"1": "Ohne deine Einmischung kann ich jetzt endlich weiterarbeiten!"
}
},
"macro_boss_rose_2": {
"encounter": {
"1": "Ich bin fest entschlossen, das Energieproblem in der Galar-Region\n$und natürlich auf der ganzen Welt zu lösen.\n$Meine Erfahrungen und Erfolge, die Macro Cosmos zu einem Erfolg gemacht haben,\n$sind der Beweis, dass meine Methoden funktionieren.\n$Ich habe nicht vor, meine Meinung zu ändern, selbst wenn ich verliere."
},
"victory": {
"1": "Ich hatte vergessen, wie großartig Pokémon-Kämpfe sind! Es ist so lange her, dass ich gekämpft habe...\n$Das war wirklich befriedigend, ich akzeptiere die Niederlage für diesen Kampf."
},
"defeat": {
"1": "Ich nehme an, es muss den Anschein haben, dass ich etwas Schreckliches tue.\n$Ich erwarte nicht, dass du es verstehst. Aber ich muss der Galar-Region grenzenlose Energie\n$bereitstellen, um ewigen Wohlstand zu gewährleisten."
}
},
"brock": { "brock": {
"encounter": { "encounter": {
"1": "Meine Expertise in Bezug auf Gesteins-Pokémon wird dich besiegen! Komm schon!", "1": "Meine Expertise in Bezug auf Gesteins-Pokémon wird dich besiegen! Komm schon!",
@ -2439,7 +2585,7 @@
"1": "@c{smile}Hey, ich habe dich gesucht! Ich weiß, dass du es nicht erwarten konntest loszugehen,\n$aber hättest ja wenigstens Tschüss sagen können...\n$@c{smile_eclosed}Du verfolgst also wirklich deinen Traum?\nIch kann es kaum glauben.\n$@c{serious_smile_fists}Da wir schon einmal hier sind, wie wäre es mit einem Kampf?\nImmerhin muss ich doch sicherstellen, dass du bereit bist.\n$@c{serious_mopen_fists}Halte dich nicht zurück, zeig mir alles was du hast!" "1": "@c{smile}Hey, ich habe dich gesucht! Ich weiß, dass du es nicht erwarten konntest loszugehen,\n$aber hättest ja wenigstens Tschüss sagen können...\n$@c{smile_eclosed}Du verfolgst also wirklich deinen Traum?\nIch kann es kaum glauben.\n$@c{serious_smile_fists}Da wir schon einmal hier sind, wie wäre es mit einem Kampf?\nImmerhin muss ich doch sicherstellen, dass du bereit bist.\n$@c{serious_mopen_fists}Halte dich nicht zurück, zeig mir alles was du hast!"
}, },
"victory": { "victory": {
"1": "@c{shock}Wow…Du hast mich komplett überrumpelt.\nBist du wirklich ein Anfänger?\n$@c{smile}Vielleicht war es einfach etwas Glück, aber…\nWer weiß, vielleicht schaffst du es irgendwann\n$ja wirklich ganz groß raus zu kommen.\n$Übrigens, der Professor hat mich gebeten dir diese Items zu geben. Die sehen wirklich cool aus.\n$@c{serious_smile_fists}Viel Glück da draußen!\n$@c{smile}Oh-und genieße das Event!" "1": "@c{shock}Wow…Du hast mich komplett überrumpelt.\nBist du wirklich ein Anfänger?\n$@c{smile}Vielleicht war es einfach etwas Glück, aber…\nWer weiß, vielleicht schaffst du es irgendwann\n$ja wirklich ganz groß raus zu kommen.\n$Übrigens, der Professor hat mich gebeten dir diese Items zu geben. Die sehen wirklich cool aus.\n$@c{serious_smile_fists}Viel Glück da draußen!"
} }
}, },
"rival_female": { "rival_female": {
@ -2447,7 +2593,7 @@
"1": "@c{smile_wave}Da bist du! Ich habe schon überall nach dir gesucht!\n@c{angry_mopen}Hast du etwas vergessen\n$deiner besten Freundin Tschüss zu sagen?\n$@c{smile_ehalf}Du folgst deinem Traum, oder?\nDas ist wirklich heute…\n$@c{smile}Naja, ich vergeben dir, dass du mich vergessen hast, aber nur unter einer Bedingung. @c{smile_wave_wink}Du musst gegen mich kämpfen!\n$@c{angry_mopen}Gib alles! Wir wollen doch nicht, dass dein Abenteuer endet bevor es begonnen hat, richtig?" "1": "@c{smile_wave}Da bist du! Ich habe schon überall nach dir gesucht!\n@c{angry_mopen}Hast du etwas vergessen\n$deiner besten Freundin Tschüss zu sagen?\n$@c{smile_ehalf}Du folgst deinem Traum, oder?\nDas ist wirklich heute…\n$@c{smile}Naja, ich vergeben dir, dass du mich vergessen hast, aber nur unter einer Bedingung. @c{smile_wave_wink}Du musst gegen mich kämpfen!\n$@c{angry_mopen}Gib alles! Wir wollen doch nicht, dass dein Abenteuer endet bevor es begonnen hat, richtig?"
}, },
"victory": { "victory": {
"1": "@c{shock}Du hast gerade erst angefangen und bist schon so stark?!@d{96} @c{angry}Du hast sowas von betrogen, oder?\n$@c{smile_wave_wink}Ich mach nur Spaß!@d{64} @c{smile_eclosed}Ich habe ehrlich verloren… Ich habe das Gefühl, dass du es dort draußen weit bringen wirst.\n$@c{smile}Übrigens, der Professor hat mich gebeten dir diese Items zu geben. Ich hoffe sie sind hilfreich!\n$@c{smile_wave}Gib wie immer dein Bestes! Ich glaube an dich!\n$@c{smile}Oh-und genieße das Event!" "1": "@c{shock}Du hast gerade erst angefangen und bist schon so stark?!@d{96} @c{angry}Du hast sowas von betrogen, oder?\n$@c{smile_wave_wink}Ich mach nur Spaß!@d{64} @c{smile_eclosed}Ich habe ehrlich verloren… Ich habe das Gefühl, dass du es dort draußen weit bringen wirst.\n$@c{smile}Übrigens, der Professor hat mich gebeten dir diese Items zu geben. Ich hoffe sie sind hilfreich!\n$@c{smile_wave}Gib wie immer dein Bestes! Ich glaube an dich!"
} }
}, },
"rival_2": { "rival_2": {
@ -2455,7 +2601,7 @@
"1": "@c{smile}Hey, du auch hier?\n@c{smile_eclosed}Immernoch ungeschlagen, hmm…?\n$@c{serious_mopen_fists}Ich weiß es sieht so aus, als wäre ich dir hierher gefolgt, aber das ist so nicht ganz richtig.\n$@c{serious_smile_fists}Ehrlicherweise kann ich es, seit du mich damals besiegt hast, garnicht erwarten erneut gegen dich zu kämpfen.\n$Ich habe selbst hart traniert. Ich werde dir diesesmal also ein würdigerer Gegner sein!.\n$@c{serious_mopen_fists}Halt dich nicht zurück, genauso wie beim letzten Mal!\nLos gehts!" "1": "@c{smile}Hey, du auch hier?\n@c{smile_eclosed}Immernoch ungeschlagen, hmm…?\n$@c{serious_mopen_fists}Ich weiß es sieht so aus, als wäre ich dir hierher gefolgt, aber das ist so nicht ganz richtig.\n$@c{serious_smile_fists}Ehrlicherweise kann ich es, seit du mich damals besiegt hast, garnicht erwarten erneut gegen dich zu kämpfen.\n$Ich habe selbst hart traniert. Ich werde dir diesesmal also ein würdigerer Gegner sein!.\n$@c{serious_mopen_fists}Halt dich nicht zurück, genauso wie beim letzten Mal!\nLos gehts!"
}, },
"victory": { "victory": {
"1": "@c{neutral_eclosed}Oh. Ich war also zu sehr von mir überzeugt.\n$@c{smile}Das ist Ok. Ich hatte mir schon gedacht, dass sowas passiert.\n\n$@c{serious_mopen_fists}Es bedeutet einfach, dass ich mich beim nächsten Mal mehr anstrengen muss!\n\n$@c{smile}Nicht, dass du wirklich Hilfe benötigen würdest, aber ich habe hier noch eins von diesen Dingern herumliegen.\n$Du kannst es haben.\n\n$@c{serious_smile_fists}Erwarte aber nicht, dass ich dir noch mehr gebe!\nIch kann meinen Rivalen doch keine Vorteile verschaffen.\n$@c{smile}Egal, pass auf dich auf und genieße das Event!" "1": "@c{neutral_eclosed}Oh. Ich war also zu sehr von mir überzeugt.\n$@c{smile}Das ist Ok. Ich hatte mir schon gedacht, dass sowas passiert.\n\n$@c{serious_mopen_fists}Es bedeutet einfach, dass ich mich beim nächsten Mal mehr anstrengen muss!\n\n$@c{smile}Nicht, dass du wirklich Hilfe benötigen würdest, aber ich habe hier noch eins von diesen Dingern herumliegen.\n$Du kannst es haben.\n\n$@c{serious_smile_fists}Erwarte aber nicht, dass ich dir noch mehr gebe!\nIch kann meinen Rivalen doch keine Vorteile verschaffen.\n$@c{smile}Egal, pass auf dich auf!"
} }
}, },
"rival_2_female": { "rival_2_female": {
@ -2463,7 +2609,7 @@
"1": "@c{smile_wave}Oh, wie schön dich hier zu trefen. Sieht so aus als wärst du noch ungeschlagen. @c{angry_mopen}Hmm… Nicht schlecht!\n$@c{angry_mopen}Ich weiß was du denkst, und nein, ich habe dich nicht verfolgt. @c{smile_eclosed}Ich bin einfach in der Gegend gewesen.\n$@c{smile_ehalf}Ich freu mich für dich, aber ich muss dich wissen lassen, dass es auch Ok ist ab und zu mal zu verlieren.\n$@c{smile}Wir lernen oft mehr aus unseren Fehlern, als aus unseren Erfolgen.\n$@c{angry_mopen}Auf jeden Fall habe ich für unseren Rückkampf hart traniert. Also zeig mir was du drauf hast!" "1": "@c{smile_wave}Oh, wie schön dich hier zu trefen. Sieht so aus als wärst du noch ungeschlagen. @c{angry_mopen}Hmm… Nicht schlecht!\n$@c{angry_mopen}Ich weiß was du denkst, und nein, ich habe dich nicht verfolgt. @c{smile_eclosed}Ich bin einfach in der Gegend gewesen.\n$@c{smile_ehalf}Ich freu mich für dich, aber ich muss dich wissen lassen, dass es auch Ok ist ab und zu mal zu verlieren.\n$@c{smile}Wir lernen oft mehr aus unseren Fehlern, als aus unseren Erfolgen.\n$@c{angry_mopen}Auf jeden Fall habe ich für unseren Rückkampf hart traniert. Also zeig mir was du drauf hast!"
}, },
"victory": { "victory": {
"1": "@c{neutral}Ich… sollte dieses Mal doch nicht verlieren…\n$@c{smile}Na gut. Das bedeutet ich muss noch härter tranieren!\n$@c{smile_wave}Ich habe noch eins von diesen Dingern!\n@c{smile_wave_wink}Kein Grund mir zu danken~.\n$@c{angry_mopen}Das ist aber das Letzte! Du bekommst ab jett keine Geschenke mehr von mir!\n$@c{smile_wave}Bleib stark und genieße das Event!" "1": "@c{neutral}Ich… sollte dieses Mal doch nicht verlieren…\n$@c{smile}Na gut. Das bedeutet ich muss noch härter tranieren!\n$@c{smile_wave}Ich habe noch eins von diesen Dingern!\n@c{smile_wave_wink}Kein Grund mir zu danken~.\n$@c{angry_mopen}Das ist aber das Letzte! Du bekommst ab jett keine Geschenke mehr von mir!\n$@c{smile_wave}Bleib stark!"
}, },
"defeat": { "defeat": {
"1": "Es ist Ok manchmal zu verlieren…" "1": "Es ist Ok manchmal zu verlieren…"

View File

@ -13,5 +13,32 @@
"metFragment": { "metFragment": {
"normal": "Herkunft: {{biome}}\nMit Lv. {{level}} erhalten.", "normal": "Herkunft: {{biome}}\nMit Lv. {{level}} erhalten.",
"apparently": "Herkunft: {{biome}}\nOffenbar mit Lv. {{level}} erhalten." "apparently": "Herkunft: {{biome}}\nOffenbar mit Lv. {{level}} erhalten."
},
"natureFragment": {
"Hardy": "{{nature}}",
"Lonely": "{{nature}}",
"Brave": "{{nature}}",
"Adamant": "{{nature}}",
"Naughty": "{{nature}}",
"Bold": "{{nature}}",
"Docile": "{{nature}}",
"Relaxed": "{{nature}}",
"Impish": "{{nature}}",
"Lax": "{{nature}}",
"Timid": "{{nature}}",
"Hasty": "{{nature}}",
"Serious": "{{nature}}",
"Jolly": "{{nature}}",
"Naive": "{{nature}}",
"Modest": "{{nature}}",
"Mild": "{{nature}}",
"Quiet": "{{nature}}",
"Bashful": "{{nature}}",
"Rash": "{{nature}}",
"Calm": "{{nature}}",
"Gentle": "{{nature}}",
"Sassy": "{{nature}}",
"Careful": "{{nature}}",
"Quirky": "{{nature}}"
} }
} }

View File

@ -63,6 +63,7 @@
"bgmVolume": "Hintergrundmusik", "bgmVolume": "Hintergrundmusik",
"fieldVolume": "Rufe & Attacken", "fieldVolume": "Rufe & Attacken",
"seVolume": "Spezialeffekte", "seVolume": "Spezialeffekte",
"uiVolume": "Benutzeroberfläche",
"musicPreference": "Musik Präferenz", "musicPreference": "Musik Präferenz",
"mixed": "Gemischt", "mixed": "Gemischt",
"gamepadPleasePlug": "Bitte einen Controller anschließen oder eine Taste drücken.", "gamepadPleasePlug": "Bitte einen Controller anschließen oder eine Taste drücken.",

View File

@ -117,5 +117,14 @@
"plasma_grunts": "Rüpel von Team Plasma", "plasma_grunts": "Rüpel von Team Plasma",
"flare_grunt": "Rüpel von Team Flare", "flare_grunt": "Rüpel von Team Flare",
"flare_grunt_female": "Rüpel von Team Flare", "flare_grunt_female": "Rüpel von Team Flare",
"flare_grunts": "Rüpel von Team Flare" "flare_grunts": "Rüpel von Team Flare",
"aether_grunt": "Æther Foundation Personal",
"aether_grunt_female": "Æther Foundation Personal",
"aether_grunts": "Æther Foundation Personal",
"skull_grunt": "Rüpel von Team Skull",
"skull_grunt_female": "Rüpel von Team Skull",
"skull_grunts": "Rüpel von Team Skull",
"macro_grunt": "Angestellter von Macro Cosmos",
"macro_grunt_female": "Angestellte von Macro Cosmos",
"macro_grunts": "Angestellte von Macro Cosmos"
} }

View File

@ -139,12 +139,18 @@
"rood": "Rubius", "rood": "Rubius",
"xerosic": "Xeros", "xerosic": "Xeros",
"bryony": "Begonia", "bryony": "Begonia",
"faba": "Fabian",
"plumeria": "Fran",
"oleana": "Olivia",
"maxie": "Marc", "maxie": "Marc",
"archie": "Adrian", "archie": "Adrian",
"cyrus": "Zyrus", "cyrus": "Zyrus",
"ghetsis": "G-Cis", "ghetsis": "G-Cis",
"lysandre": "Flordelis", "lysandre": "Flordelis",
"lusamine": "Samantha",
"guzma": "Bromley",
"rose": "Rose",
"blue_red_double": "Blau & Rot", "blue_red_double": "Blau & Rot",
"red_blue_double": "Rot & Blau", "red_blue_double": "Rot & Blau",

View File

@ -16,6 +16,9 @@
"galactic_boss": "Galaktik-Boss", "galactic_boss": "Galaktik-Boss",
"plasma_boss": "Weiser von Team Plasma", "plasma_boss": "Weiser von Team Plasma",
"flare_boss": "Flare-Boss", "flare_boss": "Flare-Boss",
"aether_boss": "Æther-Präsidentin",
"skull_boss": "Skull-Boss",
"macro_boss": "Geschäftsführer von Macro Cosmos",
"rocket_admin": "Team Rocket Vorstand", "rocket_admin": "Team Rocket Vorstand",
"rocket_admin_female": "Team Rocket Vorstand", "rocket_admin_female": "Team Rocket Vorstand",
"magma_admin": "Team Magma Vorstand", "magma_admin": "Team Magma Vorstand",
@ -27,5 +30,9 @@
"plasma_sage": "Weiser von Team Plasma", "plasma_sage": "Weiser von Team Plasma",
"plasma_admin": "Team Plasma Vorstand", "plasma_admin": "Team Plasma Vorstand",
"flare_admin": "Team Flare Vorstand", "flare_admin": "Team Flare Vorstand",
"flare_admin_female": "Team Flare Vorstand" "flare_admin_female": "Team Flare Vorstand",
"aether_admin": "Æther-Regionalleiter",
"skull_admin": "Team Skull Vorstand",
"macro_admin": "Vizepräsidentin von Macro Cosmos"
} }

View File

@ -42,7 +42,7 @@
"learnMoveNotLearned": "{{pokemonName}} did not learn the\nmove {{moveName}}.", "learnMoveNotLearned": "{{pokemonName}} did not learn the\nmove {{moveName}}.",
"learnMoveForgetQuestion": "Which move should be forgotten?", "learnMoveForgetQuestion": "Which move should be forgotten?",
"learnMoveForgetSuccess": "{{pokemonName}} forgot how to\nuse {{moveName}}.", "learnMoveForgetSuccess": "{{pokemonName}} forgot how to\nuse {{moveName}}.",
"countdownPoof": "@d{32}1, @d{15}2, and@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}Poof!", "countdownPoof": "@d{32}1, @d{15}2, and@d{15}… @d{15}… @d{15}… @d{15}@s{se/pb_bounce_1}Poof!",
"learnMoveAnd": "And…", "learnMoveAnd": "And…",
"levelCapUp": "The level cap\nhas increased to {{levelCap}}!", "levelCapUp": "The level cap\nhas increased to {{levelCap}}!",
"moveNotImplemented": "{{moveName}} is not yet implemented and cannot be selected.", "moveNotImplemented": "{{moveName}} is not yet implemented and cannot be selected.",

View File

@ -80,11 +80,21 @@
"battle_galactic_grunt": "BDSP Team Galactic Battle", "battle_galactic_grunt": "BDSP Team Galactic Battle",
"battle_plasma_grunt": "BW Team Plasma Battle", "battle_plasma_grunt": "BW Team Plasma Battle",
"battle_flare_grunt": "XY Team Flare Battle", "battle_flare_grunt": "XY Team Flare Battle",
"battle_aether_grunt": "SM Aether Foundation Battle",
"battle_skull_grunt": "SM Team Skull Battle",
"battle_macro_grunt": "SWSH Trainer Battle",
"battle_galactic_admin": "BDSP Team Galactic Admin Battle",
"battle_skull_admin": "SM Team Skull Admin Battle",
"battle_oleana": "SWSH Oleana Battle",
"battle_rocket_boss": "USUM Giovanni Battle", "battle_rocket_boss": "USUM Giovanni Battle",
"battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle",
"battle_galactic_boss": "BDSP Cyrus Battle", "battle_galactic_boss": "BDSP Cyrus Battle",
"battle_plasma_boss": "B2W2 Ghetsis Battle", "battle_plasma_boss": "B2W2 Ghetsis Battle",
"battle_flare_boss": "XY Lysandre Battle", "battle_flare_boss": "XY Lysandre Battle",
"battle_aether_boss": "SM Lusamine Battle",
"battle_skull_boss": "SM Guzma Battle",
"battle_macro_boss": "SWSH Rose Battle",
"abyss": "PMD EoS Dark Crater", "abyss": "PMD EoS Dark Crater",
"badlands": "PMD EoS Barren Valley", "badlands": "PMD EoS Barren Valley",
"beach": "PMD EoS Drenched Bluff", "beach": "PMD EoS Drenched Bluff",

View File

@ -655,6 +655,86 @@
"5": "You may have beaten me, but when I lose, I go out in style!" "5": "You may have beaten me, but when I lose, I go out in style!"
} }
}, },
"aether_grunt": {
"encounter": {
"1": "I'll fight you with all I have to wipe you out!",
"2": "I don't care if you're a kid or what. I'll send you flying if you threaten us!",
"3": "I was told to turn away Trainers, whomever they might be!",
"4": "I'll show you the power of Aether Paradise!",
"5": "Now that you've learned of the darkness at the heart of Aether Paradise, we'll need you to conveniently disappear!"
},
"victory": {
"1": "Hmph! You seem to have a lot of skill.",
"2": "What does this mean? What does this mean!",
"3": "Hey! You're so strong that there's no way I can turn you away!",
"4": "Hmm... It seems as though I may have lost.",
"5": "Here's an impression for you: Aiyee!"
}
},
"faba": {
"encounter": {
"1": "I, Branch Chief Faba, shall show you the harshness of the real world!",
"2": "The man who is called Aether Paradise's last line of defense is to battle a mere child?",
"3": "I, Faba, am the Aether Branch Chief. The only one in the world, I'm irreplaceable."
},
"victory": {
"1": "Aiyee!",
"2": "H-h-how can this be?! How could this child...",
"3": "This is why... This is why I can't bring myself to like children."
}
},
"skull_grunt": {
"encounter": {
"1": "We're not bad-we're just hard!",
"2": "You want some? That's how we say hello! Nice knowing you, punks!",
"3": "We're just a bunch of guys and gals with a great interest in other people's Pokémon!",
"4": "Why you trying to act hard when we're already hard as bones out here, homie?",
"5": "Team Skull represent! We can't pay the rent! Had a lot of fun, but our youth was misspent!"
},
"victory": {
"1": "Huh? Is it over already?",
"2": "Time for us to break out, yo! Gotta tell y'all peace out, yo!",
"3": "We don't need your wack Pokémon anyway!",
"4": "Wha-?! This kid's way too strong-no bones about it!",
"5": "So, what? I'm lower than a Pokémon?! I already got self-esteem issues, man."
}
},
"plumeria": {
"encounter": {
"1": " ...Hmph. You don't look like anything special to me.",
"2": "It takes these dumb Grunts way too long to deal with you kids...",
"3": "Mess with anyone in Team Skull, and I'll show you how serious I can get."
},
"victory": {
"1": "Hmmph! You're pretty strong. I'll give you that.",
"2": "Hmmph. Guess you are pretty tough. Now I understand why my Grunts waste so much time battling kids.",
"3": "Hmmph! I guess I just have to hold that loss."
}
},
"macro_grunt": {
"encounter": {
"1": "It looks like this is the end of the line for you!",
"2": "You are a trainer aren't you? I'm afraid that doesn't give you the right to interfere in our work.",
"3": "I'm from Macro Cosmos Insurance! Do you have a life insurance policy?"
},
"victory": {
"1": "I have little choice but to respectfully retreat.",
"2": "Having to give up my pocket money... Losing means I'm back in the red...",
"3": "Nobody can beat Macro Cosmos when it comes to our dedication to our work!"
}
},
"oleana": {
"encounter": {
"1": "I won't let anyone interfere with Mr. Rose's plan!",
"2": "So, you got through all of the special staff that I had ordered to stop you. I would expect nothing less.",
"3": "For the chairman! I won't lose!"
},
"victory": {
"1": "*sigh* I wasn't able to win... Oleana...you really are a hopeless woman.",
"2": "Arghhh! This is inexcusable... What was I thinking... Any trainer who's made it this far would be no pushover..",
"3": "*sigh* I am one tired Oleana..."
}
},
"rocket_boss_giovanni_1": { "rocket_boss_giovanni_1": {
"encounter": { "encounter": {
"1": "So! I must say, I am impressed you got here!" "1": "So! I must say, I am impressed you got here!"
@ -787,6 +867,72 @@
"1": "Fools with no vision will continue to befoul this beautiful world." "1": "Fools with no vision will continue to befoul this beautiful world."
} }
}, },
"aether_boss_lusamine_1": {
"encounter": {
"1": "You're going to startle my sweet beast! It looks like I'll need to silence you first."
},
"victory": {
"1": "How... how can you be so awful!"
},
"defeat": {
"1": "Hmph..."
}
},
"aether_boss_lusamine_2": {
"encounter": {
"1": "Why must you continue to pester me?! I am sick of you. Sick through and through!\n$Enough with this useless talk.. with Nihilego's power I will show you how wrong you were to come here!"
},
"victory": {
"1": "Aaauuuggghhhhhhhhh!!!"
},
"defeat": {
"1": "All that I want is my precious beast! I don't care about any of the rest of you!"
}
},
"skull_boss_guzma_1": {
"encounter": {
"1": "The hated boss who beats you down and beats you down and never lets up...\n$Yeah. Big bad Guzma is here!"
},
"victory": {
"1": "Tch. I'm gonna beat you down one of these days!"
},
"defeat": {
"1": "And you came all the way out here just for that, huh?"
}
},
"skull_boss_guzma_2": {
"encounter": {
"1": "Doesn't matter who I'm up against, I'm gonna beat them down!\n$That's what big bad Guzma is all about!"
},
"victory": {
"1": "Guzma!!! What is wrong with you?!"
},
"defeat": {
"1": "Y'all are stupid!"
}
},
"macro_boss_rose_1": {
"encounter": {
"1": "I must provide limitless energy to ensure everlasting prosperity for everyone...\n$It is my purpose, my duty, my destiny!"
},
"victory": {
"1": "You still don't understand, trainer...\n$We... No, I am going to change the course of history!"
},
"defeat": {
"1": "You still don't understand a thing!"
}
},
"macro_boss_rose_2": {
"encounter": {
"1": "I'm committed to solving the energy problem in the Galar region—and, of course, around the world.\n$My experience and accomplishments that made Macro Cosmos a success are proof my methods work.\n$I don't intend to change my mind, even if I lose."
},
"victory": {
"1": "I'd forgotten how great Pokémon battles are! It's been so long since I battled...\n$That sure was satisfying, I accept defeat for this battle."
},
"defeat": {
"1": "I suppose it must seem that I am doing something terrible. I don't expect you to understand.\n$But I must provide the Galar region with limitless energy to ensure everlasting prosperity."
}
},
"stat_trainer_buck": { "stat_trainer_buck": {
"encounter": { "encounter": {
"1": "...I'm telling you right now. I'm seriously tough. Act surprised!", "1": "...I'm telling you right now. I'm seriously tough. Act surprised!",

View File

@ -655,6 +655,86 @@
"5": "You may have beaten me, but when I lose, I go out in style!" "5": "You may have beaten me, but when I lose, I go out in style!"
} }
}, },
"aether_grunt": {
"encounter": {
"1": "I'll fight you with all I have to wipe you out!",
"2": "I don't care if you're a kid or what. I'll send you flying if you threaten us!",
"3": "I was told to turn away Trainers, whomever they might be!",
"4": "I'll show you the power of Aether Paradise!",
"5": "Now that you've learned of the darkness at the heart of Aether Paradise, we'll need you to conveniently disappear!"
},
"victory": {
"1": "Hmph! You seem to have a lot of skill.",
"2": "What does this mean? What does this mean!",
"3": "Hey! You're so strong that there's no way I can turn you away!",
"4": "Hmm... It seems as though I may have lost.",
"5": "Here's an impression for you: Aiyee!"
}
},
"faba": {
"encounter": {
"1": "I, Branch Chief Faba, shall show you the harshness of the real world!",
"2": "The man who is called Aether Paradise's last line of defense is to battle a mere child?",
"3": "I, Faba, am the Aether Branch Chief. The only one in the world, I'm irreplaceable."
},
"victory": {
"1": "Aiyee!",
"2": "H-h-how can this be?! How could this child...",
"3": "This is why... This is why I can't bring myself to like children."
}
},
"skull_grunt": {
"encounter": {
"1": "We're not bad-we're just hard!",
"2": "You want some? That's how we say hello! Nice knowing you, punks!",
"3": "We're just a bunch of guys and gals with a great interest in other people's Pokémon!",
"4": "Why you trying to act hard when we're already hard as bones out here, homie?",
"5": "Team Skull represent! We can't pay the rent! Had a lot of fun, but our youth was misspent!"
},
"victory": {
"1": "Huh? Is it over already?",
"2": "Time for us to break out, yo! Gotta tell y'all peace out, yo!",
"3": "We don't need your wack Pokémon anyway!",
"4": "Wha-?! This kid's way too strong-no bones about it!",
"5": "So, what? I'm lower than a Pokémon?! I already got self-esteem issues, man."
}
},
"plumeria": {
"encounter": {
"1": " ...Hmph. You don't look like anything special to me.",
"2": "It takes these dumb Grunts way too long to deal with you kids..",
"3": "Mess with anyone in Team Skull, and I'll show you how serious I can get."
},
"victory": {
"1": "Hmmph! You're pretty strong. I'll give you that.",
"2": "Hmmph. Guess you are pretty tough. Now I understand why my Grunts waste so much time battling kids.",
"3": "Hmmph! I guess I just have to hold that loss."
}
},
"macro_grunt": {
"encounter": {
"1": "It looks like this is the end of the line for you!",
"2": "You are a trainer aren't you? I'm afraid that doesn't give you the right to interfere in our work.",
"3": "I'm from Macro Cosmos Insurance! Do you have a life insurance policy?"
},
"victory": {
"1": "I have little choice but to respectfully retreat.",
"2": "Having to give up my pocket money... Losing means I'm back in the red...",
"3": "Nobody can beat Macro Cosmos when it comes to our dedication to our work!"
}
},
"oleana": {
"encounter": {
"1": "I won't let anyone interfere with Mr. Rose's plan!",
"2": "So, you got through all of the special staff that I had ordered to stop you. I would expect nothing less.",
"3": "For the chairman! I won't lose!"
},
"victory": {
"1": "*sigh* I wasn't able to win... Oleana...you really are a hopeless woman.",
"2": "Arghhh! This is inexcusable... What was I thinking... Any trainer who's made it this far would be no pushover..",
"3": "*sigh* I am one tired Oleana..."
}
},
"rocket_boss_giovanni_1": { "rocket_boss_giovanni_1": {
"encounter": { "encounter": {
"1": "So! I must say, I am impressed you got here!" "1": "So! I must say, I am impressed you got here!"
@ -787,6 +867,72 @@
"1": "Fools with no vision will continue to befoul this beautiful world." "1": "Fools with no vision will continue to befoul this beautiful world."
} }
}, },
"aether_boss_lusamine_1": {
"encounter": {
"1": "You're going to startle my sweet beast! It looks like I'll need to silence you first."
},
"victory": {
"1": "How... how can you be so awful!"
},
"defeat": {
"1": "Hmph..."
}
},
"aether_boss_lusamine_2": {
"encounter": {
"1": "Why must you continue to pester me?! I am sick of you. Sick through and through!\n$Enough with this useless talk.. with Nihilego's power I will show you how wrong you were to come here!"
},
"victory": {
"1": "Aaauuuggghhhhhhhhh!!!"
},
"defeat": {
"1": "All that I want is my precious beast! I don't care about any of the rest of you!"
}
},
"skull_boss_guzma_1": {
"encounter": {
"1": "The hated boss who beats you down and beats you down and never lets up...\n$Yeah. Big bad Guzma is here!"
},
"victory": {
"1": "Tch. I'm gonna beat you down one of these days!"
},
"defeat": {
"1": "And you came all the way out here just for that, huh?"
}
},
"skull_boss_guzma_2": {
"encounter": {
"1": "Doesn't matter who I'm up against, I'm gonna beat them down!\n$That's what big bad Guzma is all about!"
},
"victory": {
"1": "Guzma!!! What is wrong with you?!"
},
"defeat": {
"1": "Y'all are stupid!"
}
},
"macro_boss_rose_1": {
"encounter": {
"1": "I must provide limitless energy to ensure everlasting prosperity for everyone...\n$It is my purpose, my duty, my destiny!"
},
"victory": {
"1": "You still don't understand, trainer...\n$We... No, I am going to change the course of history!"
},
"defeat": {
"1": "You still don't understand a thing!"
}
},
"macro_boss_rose_2": {
"encounter": {
"1": "I'm committed to solving the energy problem in the Galar region—and, of course, around the world.\n$My experience and accomplishments that made Macro Cosmos a success are proof my methods work.\n$I don't intend to change my mind, even if I lose."
},
"victory": {
"1": "I'd forgotten how great Pokémon battles are! It's been so long since I battled...\n$That sure was satisfying, I accept defeat for this battle."
},
"defeat": {
"1": "I suppose it must seem that I am doing something terrible. I don't expect you to understand.\n$But I must provide the Galar region with limitless energy to ensure everlasting prosperity."
}
},
"stat_trainer_buck": { "stat_trainer_buck": {
"encounter": { "encounter": {
"1": "...I'm telling you right now. I'm seriously tough. Act surprised!", "1": "...I'm telling you right now. I'm seriously tough. Act surprised!",

View File

@ -1,31 +1,32 @@
import lostAtSeaDialogue from "./mystery-encounters/lost-at-sea-dialogue.json"; import lostAtSea from "./mystery-encounters/lost-at-sea-dialogue.json";
import mysteriousChestDialogue from "#app/locales/en/mystery-encounters/mysterious-chest-dialogue.json"; import mysteriousChest from "#app/locales/en/mystery-encounters/mysterious-chest-dialogue.json";
import mysteriousChallengersDialogue from "#app/locales/en/mystery-encounters/mysterious-challengers-dialogue.json"; import mysteriousChallengers from "#app/locales/en/mystery-encounters/mysterious-challengers-dialogue.json";
import darkDealDialogue from "#app/locales/en/mystery-encounters/dark-deal-dialogue.json"; import darkDeal from "#app/locales/en/mystery-encounters/dark-deal-dialogue.json";
import departmentStoreSaleDialogue from "#app/locales/en/mystery-encounters/department-store-sale-dialogue.json"; import departmentStoreSale from "#app/locales/en/mystery-encounters/department-store-sale-dialogue.json";
import fieldTripDialogue from "#app/locales/en/mystery-encounters/field-trip-dialogue.json"; import fieldTrip from "#app/locales/en/mystery-encounters/field-trip-dialogue.json";
import fieryFalloutDialogue from "#app/locales/en/mystery-encounters/fiery-fallout-dialogue.json"; import fieryFallout from "#app/locales/en/mystery-encounters/fiery-fallout-dialogue.json";
import fightOrFlightDialogue from "#app/locales/en/mystery-encounters/fight-or-flight-dialogue.json"; import fightOrFlight from "#app/locales/en/mystery-encounters/fight-or-flight-dialogue.json";
import safariZoneDialogue from "#app/locales/en/mystery-encounters/safari-zone-dialogue.json"; import safariZone from "#app/locales/en/mystery-encounters/safari-zone-dialogue.json";
import shadyVitaminDealerDialogue from "#app/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.json"; import shadyVitaminDealer from "#app/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.json";
import slumberingSnorlaxDialogue from "#app/locales/en/mystery-encounters/slumbering-snorlax-dialogue.json"; import slumberingSnorlax from "#app/locales/en/mystery-encounters/slumbering-snorlax-dialogue.json";
import trainingSessionDialogue from "#app/locales/en/mystery-encounters/training-session-dialogue.json"; import trainingSession from "#app/locales/en/mystery-encounters/training-session-dialogue.json";
import theStrongStuffDialogue from "#app/locales/en/mystery-encounters/the-strong-stuff-dialogue.json"; import theStrongStuff from "#app/locales/en/mystery-encounters/the-strong-stuff-dialogue.json";
import thePokemonSalesmanDialogue from "#app/locales/en/mystery-encounters/the-pokemon-salesman-dialogue.json"; import pokemonSalesman from "#app/locales/en/mystery-encounters/the-pokemon-salesman-dialogue.json";
import anOfferYouCantRefuseDialogue from "#app/locales/en/mystery-encounters/an-offer-you-cant-refuse-dialogue.json"; import offerYouCantRefuse from "#app/locales/en/mystery-encounters/an-offer-you-cant-refuse-dialogue.json";
import delibirdyDialogue from "#app/locales/en/mystery-encounters/delibirdy-dialogue.json"; import delibirdy from "#app/locales/en/mystery-encounters/delibirdy-dialogue.json";
import absoluteAvariceDialogue from "#app/locales/en/mystery-encounters/absolute-avarice-dialogue.json"; import absoluteAvarice from "#app/locales/en/mystery-encounters/absolute-avarice-dialogue.json";
import aTrainersTestDialogue from "#app/locales/en/mystery-encounters/a-trainers-test-dialogue.json"; import aTrainersTest from "#app/locales/en/mystery-encounters/a-trainers-test-dialogue.json";
import trashToTreasureDialogue from "#app/locales/en/mystery-encounters/trash-to-treasure-dialogue.json"; import trashToTreasure from "#app/locales/en/mystery-encounters/trash-to-treasure-dialogue.json";
import berriesAboundDialogue from "#app/locales/en/mystery-encounters/berries-abound-dialogue.json"; import berriesAbound from "#app/locales/en/mystery-encounters/berries-abound-dialogue.json";
import clowningAroundDialogue from "#app/locales/en/mystery-encounters/clowning-around-dialogue.json"; import clowningAround from "#app/locales/en/mystery-encounters/clowning-around-dialogue.json";
import partTimerDialogue from "#app/locales/en/mystery-encounters/part-timer-dialogue.json"; import partTimer from "#app/locales/en/mystery-encounters/part-timer-dialogue.json";
import dancingLessonsDialogue from "#app/locales/en/mystery-encounters/dancing-lessons-dialogue.json"; import dancingLessons from "#app/locales/en/mystery-encounters/dancing-lessons-dialogue.json";
import weirdDreamDialogue from "#app/locales/en/mystery-encounters/weird-dream-dialogue.json"; import weirdDream from "#app/locales/en/mystery-encounters/weird-dream-dialogue.json";
import theWinstrateChallengeDialogue from "#app/locales/en/mystery-encounters/the-winstrate-challenge-dialogue.json"; import theWinstrateChallenge from "#app/locales/en/mystery-encounters/the-winstrate-challenge-dialogue.json";
import teleportingHijinksDialogue from "#app/locales/en/mystery-encounters/teleporting-hijinks-dialogue.json"; import teleportingHijinks from "#app/locales/en/mystery-encounters/teleporting-hijinks-dialogue.json";
import bugTypeSuperfanDialogue from "#app/locales/en/mystery-encounters/bug-type-superfan-dialogue.json"; import bugTypeSuperfan from "#app/locales/en/mystery-encounters/bug-type-superfan-dialogue.json";
import funAndGamesDialogue from "#app/locales/en/mystery-encounters/fun-and-games-dialogue.json"; import funAndGames from "#app/locales/en/mystery-encounters/fun-and-games-dialogue.json";
import uncommonBreed from "#app/locales/en/mystery-encounters/uncommon-breed-dialogue.json";
/** /**
* Injection patterns that can be used: * Injection patterns that can be used:
@ -46,32 +47,33 @@ export const mysteryEncounter = {
// DO NOT REMOVE // DO NOT REMOVE
"unit_test_dialogue": "{{test}}{{test}} {{test{{test}}}} {{test1}} {{test\}} {{test\\}} {{test\\\}} {test}}", "unit_test_dialogue": "{{test}}{{test}} {{test{{test}}}} {{test1}} {{test\}} {{test\\}} {{test\\\}} {test}}",
mysteriousChallengers: mysteriousChallengersDialogue, mysteriousChallengers,
mysteriousChest: mysteriousChestDialogue, mysteriousChest,
darkDeal: darkDealDialogue, darkDeal,
fightOrFlight: fightOrFlightDialogue, fightOrFlight,
slumberingSnorlax: slumberingSnorlaxDialogue, slumberingSnorlax,
trainingSession: trainingSessionDialogue, trainingSession,
departmentStoreSale: departmentStoreSaleDialogue, departmentStoreSale,
shadyVitaminDealer: shadyVitaminDealerDialogue, shadyVitaminDealer,
fieldTrip: fieldTripDialogue, fieldTrip,
safariZone: safariZoneDialogue, safariZone,
lostAtSea: lostAtSeaDialogue, lostAtSea,
fieryFallout: fieryFalloutDialogue, fieryFallout,
theStrongStuff: theStrongStuffDialogue, theStrongStuff,
pokemonSalesman: thePokemonSalesmanDialogue, pokemonSalesman,
offerYouCantRefuse: anOfferYouCantRefuseDialogue, offerYouCantRefuse,
delibirdy: delibirdyDialogue, delibirdy,
absoluteAvarice: absoluteAvariceDialogue, absoluteAvarice,
aTrainersTest: aTrainersTestDialogue, aTrainersTest,
trashToTreasure: trashToTreasureDialogue, trashToTreasure,
berriesAbound: berriesAboundDialogue, berriesAbound,
clowningAround: clowningAroundDialogue, clowningAround,
partTimer: partTimerDialogue, partTimer,
dancingLessons: dancingLessonsDialogue, dancingLessons,
weirdDream: weirdDreamDialogue, weirdDream,
theWinstrateChallenge: theWinstrateChallengeDialogue, theWinstrateChallenge,
teleportingHijinks: teleportingHijinksDialogue, teleportingHijinks,
bugTypeSuperfan: bugTypeSuperfanDialogue, bugTypeSuperfan,
funAndGames: funAndGamesDialogue funAndGames,
uncommonBreed,
} as const; } as const;

View File

@ -7,7 +7,8 @@
"1": { "1": {
"label": "Battle the Pokémon", "label": "Battle the Pokémon",
"tooltip": "(-) Hard Battle\n(+) New Item", "tooltip": "(-) Hard Battle\n(+) New Item",
"selected": "You approach the\nPokémon without fear." "selected": "You approach the\nPokémon without fear.",
"stat_boost": "The {{enemyPokemon}} latent strength boosted one of its stats!"
}, },
"2": { "2": {
"label": "Steal the Item", "label": "Steal the Item",

View File

@ -0,0 +1,26 @@
{
"intro": "That isn't just an ordinary Pokémon!",
"title": "Uncommon Breed",
"description": "That {{enemyPokemon}} looks special compared to others of its kind. @[TOOLTIP_TITLE]{Perhaps it knows a special move?} You could battle and catch it outright, but there might also be a way to befriend it.",
"query": "What will you do?",
"option": {
"1": {
"label": "Battle the Pokémon",
"tooltip": "(-) Tricky Battle\n(+) Strong Catchable Foe",
"selected": "You approach the\n{{enemyPokemon}} without fear.",
"stat_boost": "The {{enemyPokemon}} heightened abilities boost its stats!"
},
"2": {
"label": "Give It Food",
"disabled_tooltip": "You need 4 berry items to choose this",
"tooltip": "(-) Give 4 Berries\n(+) The {{enemyPokemon}} Likes You",
"selected": "You toss the berries at the {{enemyPokemon}}!$It eats them happily!$The {{enemyPokemon}} wants to join your party!"
},
"3": {
"label": "Befriend It",
"disabled_tooltip": "Your Pokémon need to know certain moves to choose this",
"tooltip": "(+) {{option3PrimaryName}} uses {{option3PrimaryMove}}\n(+) The {{enemyPokemon}} Likes You",
"selected": "Your {{option3PrimaryName}} uses {{option3PrimaryMove}} to charm the {{enemyPokemon}}!$The {{enemyPokemon}} wants to join your party!"
}
}
}

View File

@ -13,5 +13,32 @@
"metFragment": { "metFragment": {
"normal": "met at Lv{{level}},\n{{biome}}.", "normal": "met at Lv{{level}},\n{{biome}}.",
"apparently": "apparently met at Lv{{level}},\n{{biome}}." "apparently": "apparently met at Lv{{level}},\n{{biome}}."
},
"natureFragment": {
"Hardy": "{{nature}}",
"Lonely": "{{nature}}",
"Brave": "{{nature}}",
"Adamant": "{{nature}}",
"Naughty": "{{nature}}",
"Bold": "{{nature}}",
"Docile": "{{nature}}",
"Relaxed": "{{nature}}",
"Impish": "{{nature}}",
"Lax": "{{nature}}",
"Timid": "{{nature}}",
"Hasty": "{{nature}}",
"Serious": "{{nature}}",
"Jolly": "{{nature}}",
"Naive": "{{nature}}",
"Modest": "{{nature}}",
"Mild": "{{nature}}",
"Quiet": "{{nature}}",
"Bashful": "{{nature}}",
"Rash": "{{nature}}",
"Calm": "{{nature}}",
"Gentle": "{{nature}}",
"Sassy": "{{nature}}",
"Careful": "{{nature}}",
"Quirky": "{{nature}}"
} }
} }

View File

@ -63,6 +63,7 @@
"bgmVolume": "BGM Volume", "bgmVolume": "BGM Volume",
"fieldVolume": "Field Volume", "fieldVolume": "Field Volume",
"seVolume": "SE Volume", "seVolume": "SE Volume",
"uiVolume": "UI Volume",
"musicPreference": "Music Preference", "musicPreference": "Music Preference",
"mixed": "Mixed", "mixed": "Mixed",
"gamepadPleasePlug": "Please Plug in a Gamepad or Press a Button", "gamepadPleasePlug": "Please Plug in a Gamepad or Press a Button",

View File

@ -117,5 +117,14 @@
"plasma_grunts": "Plasma Grunts", "plasma_grunts": "Plasma Grunts",
"flare_grunt": "Flare Grunt", "flare_grunt": "Flare Grunt",
"flare_grunt_female": "Flare Grunt", "flare_grunt_female": "Flare Grunt",
"flare_grunts": "Flare Grunts" "flare_grunts": "Flare Grunts",
"aether_grunt": "Aether Foundation Employee",
"aether_grunt_female": "Aether Foundation Employee",
"aether_grunts": "Aether Foundation Employees",
"skull_grunt": "Team Skull Grunt",
"skull_grunt_female": "Team Skull Grunt",
"skull_grunts": "Team Skull Grunts",
"macro_grunt": "Macro Cosmos Trainer",
"macro_grunt_female": "Macro Cosmos Trainer",
"macro_grunts": "Macro Cosmos Trainers"
} }

Some files were not shown because too many files have changed in this diff Show More