diff --git a/README.md b/README.md index 3b74ab5e..d88b7350 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ reuses the build's digests. All state lives in `.build/`. $ pnpm build # build every deploy's rules, GC stale state $ pnpm deploy # list the deploys in deploy.json5 $ pnpm deploy assets # run a named deploy -$ node tools/deploy/index.ts build ps.build.ts # build one deploy's rules +$ node tools/deploy/index.ts build smogon.build.ts # build one deploy's rules $ node tools/deploy/index.ts run smogon.build.ts -o deploy/smogon $ node tools/deploy/index.ts inspect src/minisprites/items/ileftovers.png -o /tmp/out ``` @@ -99,10 +99,10 @@ for eyeballing what would ship. {subset: ["**"], cmd: "smogonctl assets upload sprites"}, ], }, - ps: { - buildFile: "ps.build.ts", + smogon: { + buildFile: "smogon.build.ts", deploy: [ - {subset: ["ani/**"], dir: true, cmd: "rsync -a %d/ani/ ps:sprites/ani/"}, + {subset: ["xy/**"], dir: true, cmd: "rsync -a --delete-after %d/xy/ smogon:/smog2/sprites/xy"}, ], }, } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f5388390..5a205613 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -58,12 +58,6 @@ importers: specifier: ^3.0.0 version: 3.2.0 - tools/sheet: - dependencies: - '@types/node': - specifier: ^24.10.7 - version: 24.13.3 - tools/smogdexspritesheet: dependencies: '@smogon/sprite-data': @@ -79,18 +73,6 @@ importers: specifier: ^3.4.1 version: 3.5.1 - tools/spritedata: - dependencies: - '@smogon/sprite-data': - specifier: workspace:* - version: link:../../data/lib - '@smogon/sprite-root': - specifier: workspace:* - version: link:../../lib/root - '@types/node': - specifier: ^24.10.7 - version: 24.13.3 - tools/trim: dependencies: '@types/node': diff --git a/ps-items.sheet.mjs b/ps-items.sheet.mjs deleted file mode 100644 index 86face99..00000000 --- a/ps-items.sheet.mjs +++ /dev/null @@ -1,580 +0,0 @@ - -import fs from 'fs'; -import path from 'path'; -import * as spritedata from '@smogon/sprite-data/index.ts'; -import root from '@smogon/sprite-root/index.ts'; - -const itemsDir = path.join(root, "src/minisprites/items"); - -// Derived from pokemon-showdown/data/items.ts -const ITEMS = { - "absorbbulb": 2, - "adamantorb": 4, - "aguavberry": 5, - "airballoon": 6, - "apicotberry": 10, - "armorfossil": 12, - "aspearberry": 13, - //"burntberry": 13, - "babiriberry": 17, - "belueberry": 21, - "berryjuice": 22, - "bignugget": 27, - "bigroot": 29, - "bindingband": 31, - "blackbelt": 32, - "blacksludge": 34, - "blackglasses": 35, - "blueorb": 41, - "blukberry": 44, - "brightpowder": 51, - "buggem": 53, - "burndrive": 54, - "cellbattery": 60, - "charcoal": 61, - "chartiberry": 62, - "cheriberry": 63, - //"przcureberry": 63, - "cherishball": 64, - "chestoberry": 65, - //"mintberry": 65, - "chilanberry": 66, - "chilldrive": 67, - "choiceband": 68, - "choicescarf": 69, - "choicespecs": 70, - "chopleberry": 71, - "clawfossil": 72, - "cobaberry": 76, - "colburberry": 78, - "cornnberry": 81, - "coverfossil": 85, - "custapberry": 86, - "damprock": 88, - "darkgem": 89, - "dawnstone": 92, - "deepseascale": 93, - "deepseatooth": 94, - "destinyknot": 95, - "diveball": 101, - "domefossil": 102, - "dousedrive": 103, - "dracoplate": 105, - "dragonfang": 106, - "dragongem": 107, - "dragonscale": 108, - "dreadplate": 110, - "dreamball": 111, - "dubiousdisc": 113, - "durinberry": 114, - "duskball": 115, - "duskstone": 116, - "earthplate": 117, - "ejectbutton": 118, - "electirizer": 119, - "electricgem": 120, - "enigmaberry": 124, - "eviolite": 130, - "expertbelt": 132, - "fastball": 137, - "fightinggem": 139, - "figyberry": 140, - "firegem": 141, - "firestone": 142, - "fistplate": 143, - "flameorb": 145, - "flameplate": 146, - "floatstone": 147, - "flyinggem": 149, - "focusband": 150, - "focussash": 151, - "friendball": 153, - "fullincense": 155, - "ganlonberry": 158, - "ghostgem": 161, - "grassgem": 172, - "greatball": 174, - "grepaberry": 178, - "gripclaw": 179, - "griseousorb": 180, - "groundgem": 182, - "habanberry": 185, - "hardstone": 187, - "healball": 188, - "heatrock": 193, - "heavyball": 194, - "helixfossil": 195, - "hondewberry": 213, - "iapapaberry": 217, - "icegem": 218, - "icicleplate": 220, - "icyrock": 221, - "insectplate": 223, - "ironball": 224, - "ironplate": 225, - "jabocaberry": 230, - "kasibberry": 233, - "kebiaberry": 234, - "kelpsyberry": 235, - "kingsrock": 236, - "laggingtail": 237, - "lansatberry": 238, - "laxincense": 240, - "leafstone": 241, - "leftovers": 242, - "leppaberry": 244, - //"mysteryberry": 244, - "levelball": 246, - "liechiberry": 248, - "lifeorb": 249, - "lightball": 251, - "lightclay": 252, - "loveball": 258, - "luckypunch": 261, - "lumberry": 262, - //"miracleberry": 262, - "lureball": 264, - "lustrousorb": 265, - "luxuryball": 266, - "machobrace": 269, - "magmarizer": 272, - "magnet": 273, - "magoberry": 274, - "magostberry": 275, - "masterball": 276, - "meadowplate": 282, - "mentalherb": 285, - "metalcoat": 286, - "metalpowder": 287, - "metronome": 289, - "micleberry": 290, - "mindplate": 291, - "miracleseed": 292, - "moonball": 294, - "moonstone": 295, - "muscleband": 297, - "mysticwater": 300, - "nanabberry": 302, - "nestball": 303, - "netball": 304, - "nevermeltice": 305, - "nomelberry": 306, - "normalgem": 307, - "strangeball": 308, - "occaberry": 311, - "oddincense": 312, - "oldamber": 314, - "oranberry": 319, - //"berry": 319, - "ovalstone": 321, - "pamtreberry": 323, - "parkball": 325, - "passhoberry": 329, - "payapaberry": 330, - "pechaberry": 333, - //"psncureberry": 333, - "persimberry": 334, - //"bitterberry": 334, - "petayaberry": 335, - "pinapberry": 337, - "plumefossil": 339, - "poisonbarb": 343, - "poisongem": 344, - "pokeball": 345, - "pomegberry": 351, - "poweranklet": 354, - "powerband": 355, - "powerbelt": 356, - "powerbracer": 357, - "powerherb": 358, - "powerlens": 359, - "powerweight": 360, - "premierball": 363, - "prismscale": 365, - "protector": 367, - "psychicgem": 369, - "qualotberry": 371, - "quickball": 372, - "quickclaw": 373, - "quickpowder": 374, - "rabutaberry": 375, - "rarebone": 379, - "rawstberry": 381, - //"iceberry": 381, - "razorclaw": 382, - "razorfang": 383, - "razzberry": 384, - "reapercloth": 385, - "redcard": 387, - "berserkgene": 388, - "redorb": 390, - "repeatball": 401, - "mail": 403, - "rindoberry": 409, - "ringtarget": 410, - "rockgem": 415, - "rockincense": 416, - "rockyhelmet": 417, - "rootfossil": 418, - "roseincense": 419, - "rowapberry": 420, - "safariball": 425, - "salacberry": 426, - "scopelens": 429, - "seaincense": 430, - "sharpbeak": 436, - "shedshell": 437, - "shellbell": 438, - "shinystone": 439, - "shockdrive": 442, - "shucaberry": 443, - "silkscarf": 444, - //"pinkbow": 444, - //"polkadotbow": 444, - "silverpowder": 447, - "sitrusberry": 448, - //"goldberry": 448, - "skullfossil": 449, - "skyplate": 450, - "smoothrock": 453, - "softsand": 456, - "souldew": 459, - "spelltag": 461, - "spelonberry": 462, - "splashplate": 463, - "spookyplate": 464, - "sportball": 465, - "starfberry": 472, - "steelgem": 473, - "leek": 475, - //"stick": 475, - "stickybarb": 476, - "stoneplate": 477, - "sunstone": 480, - "tamatoberry": 486, - "tangaberry": 487, - "thickclub": 491, - "thunderstone": 492, - "timerball": 494, - "toxicorb": 515, - "toxicplate": 516, - "twistedspoon": 520, - "ultraball": 521, - "upgrade": 523, - "wacanberry": 526, - "watergem": 528, - "waterstone": 529, - "watmelberry": 530, - "waveincense": 531, - "wepearberry": 533, - "whiteherb": 535, - "widelens": 537, - "wikiberry": 538, - "wiseglasses": 539, - "yacheberry": 567, - "zapplate": 572, - "zoomlens": 574, - "abomasite": 575, - "absolite": 576, - "aerodactylite": 577, - "crucibellite": 577, - "aggronite": 578, - "alakazite": 579, - "ampharosite": 580, - "assaultvest": 581, - "banettite": 582, - "blastoisinite": 583, - "blazikenite": 584, - "charizarditex": 585, - "charizarditey": 586, - "gardevoirite": 587, - "gengarite": 588, - // FIXME garchompite & gyaradosite should not be same spritenum - "garchompite": 589, - "gyaradosite": 589, - "heracronite": 590, - "houndoominite": 591, - "kangaskhanite": 592, - "keeberry": 593, - "lucarionite": 594, - "luminousmoss": 595, - "manectite": 596, - "marangaberry": 597, - "mawilite": 598, - "medichamite": 599, - "mewtwonitex": 600, - "mewtwonitey": 601, - "pinsirite": 602, - "roseliberry": 603, - "safetygoggles": 604, - "scizorite": 605, - "snowball": 606, - "tyranitarite": 607, - "venusaurite": 608, - "weaknesspolicy": 609, - "pixieplate": 610, - "fairygem": 611, - "swampertite": 612, - "sceptilite": 613, - "sablenite": 614, - "altarianite": 615, - "galladite": 616, - "audinite": 617, - "metagrossite": 618, - "sharpedonite": 619, - "slowbronite": 620, - "steelixite": 621, - "pidgeotite": 622, - "glalitite": 623, - "diancite": 624, - "cameruptite": 625, - "lopunnite": 626, - "salamencite": 627, - "beedrillite": 628, - "latiasite": 629, - "latiosite": 630, - "normaliumz": 631, - "firiumz": 632, - "wateriumz": 633, - "electriumz": 634, - "grassiumz": 635, - "iciumz": 636, - "fightiniumz": 637, - "poisoniumz": 638, - "groundiumz": 639, - "flyiniumz": 640, - "psychiumz": 641, - "buginiumz": 642, - "rockiumz": 643, - "ghostiumz": 644, - "dragoniumz": 645, - "darkiniumz": 646, - "steeliumz": 647, - "fairiumz": 648, - "pikaniumz": 649, - "decidiumz": 650, - "inciniumz": 651, - "primariumz": 652, - "tapuniumz": 653, - "marshadiumz": 654, - "aloraichiumz": 655, - "snorliumz": 656, - "eeviumz": 657, - "mewniumz": 658, - "pikashuniumz": 659, - "adrenalineorb": 660, - "beastball": 661, - "terrainextender": 662, - "protectivepads": 663, - "electricseed": 664, - "psychicseed": 665, - "mistyseed": 666, - "grassyseed": 667, - "fightingmemory": 668, - "flyingmemory": 669, - "poisonmemory": 670, - "groundmemory": 671, - "rockmemory": 672, - "bugmemory": 673, - "ghostmemory": 674, - "steelmemory": 675, - "firememory": 676, - "watermemory": 677, - "grassmemory": 678, - "electricmemory": 679, - "psychicmemory": 680, - "icememory": 681, - "dragonmemory": 682, - "darkmemory": 683, - "fairymemory": 684, - "solganiumz": 685, - "lunaliumz": 686, - "ultranecroziumz": 687, - "mimikiumz": 688, - "lycaniumz": 689, - "kommoniumz": 690, - "sachet": 691, - "whippeddream": 692, - "icestone": 693, - "jawfossil": 694, - "sailfossil": 695, - "bottlecap": 696, - "goldbottlecap": 697, - "rustedsword": 698, - "rustedshield": 699, - "fossilizedbird": 700, - "fossilizedfish": 701, - "fossilizeddrake": 702, - "fossilizeddino": 703, - "strawberrysweet": 704, - "lovesweet": 705, - "berrysweet": 706, - "cloversweet": 707, - "flowersweet": 708, - "starsweet": 709, - "ribbonsweet": 710, - "sweetapple": 711, - "tartapple": 712, - "throatspray": 713, - "ejectpack": 714, - "heavydutyboots": 715, - "blunderpolicy": 716, - "roomservice": 717, - "utilityumbrella": 718, - "crackedpot": 719, - "chippedpot": 720, - "tr00": 721, - "tr01": 721, - "tr13": 721, - "tr14": 721, - "tr19": 721, - "tr20": 721, - "tr26": 721, - "tr27": 721, - "tr29": 721, - "tr30": 721, - "tr35": 721, - "tr42": 721, - "tr85": 721, - "tr07": 722, - "tr21": 722, - "tr39": 722, - "tr48": 722, - "tr53": 722, - "tr56": 722, - "tr64": 722, - "tr99": 722, - "tr66": 723, - "tr89": 723, - "tr22": 724, - "tr54": 724, - "tr57": 724, - "tr73": 724, - "tr78": 724, - "tr91": 724, - "tr10": 725, - "tr23": 725, - "tr67": 725, - "tr87": 725, - "tr94": 725, - "tr63": 726, - "tr75": 726, - "tr76": 726, - "tr18": 727, - "tr28": 727, - "tr60": 727, - "tr61": 727, - "tr96": 727, - "tr33": 728, - "tr31": 729, - "tr46": 729, - "tr52": 729, - "tr70": 729, - "tr74": 729, - "tr79": 729, - "tr02": 730, - "tr15": 730, - "tr36": 730, - "tr41": 730, - "tr43": 730, - "tr55": 730, - "tr88": 730, - "tr03": 731, - "tr04": 731, - "tr16": 731, - "tr45": 731, - "tr84": 731, - "tr98": 731, - "tr50": 732, - "tr59": 732, - "tr65": 732, - "tr71": 732, - "tr72": 732, - "tr77": 732, - "tr08": 733, - "tr09": 733, - "tr80": 733, - "tr86": 733, - "tr11": 734, - "tr12": 734, - "tr17": 734, - "tr25": 734, - "tr34": 734, - "tr38": 734, - "tr40": 734, - "tr44": 734, - "tr49": 734, - "tr69": 734, - "tr82": 734, - "tr83": 734, - "tr97": 734, - "tr05": 735, - "tr06": 735, - "tr24": 736, - "tr47": 736, - "tr51": 736, - "tr62": 736, - "tr32": 737, - "tr37": 737, - "tr58": 737, - "tr68": 737, - "tr81": 737, - "tr93": 737, - "tr95": 737, - "tr90": 738, - "tr92": 738, - "galaricacuff": 739, - "galaricawreath": 740, - "adamantcrystal": 741, - "lustrousglobe": 742, - "griseouscore": 743, - "maliciousarmor": 744, - "boosterenergy": 745, - "abilityshield": 746, - "clearamulet": 747, - "mirrorherb": 748, - "punchingglove": 749, - "covertcloak": 750, - "loadeddice": 751, - "vilevial": 752, - "auspiciousarmor": 753, - "fairyfeather": 754, - "syrupyapple": 755, - "unremarkableteacup": 756, - "masterpieceteacup": 757, - "cornerstonemask": 758, - "wellspringmask": 759, - "hearthflamemask": 760, - "metalalloy": 761, -}; - -const found = new Map; - -for (const filename of fs.readdirSync(itemsDir)) { - const sn = spritedata.parseFilename(path.parse(filename).name); - if (sn.kind !== 'i') continue; - for (const name of [sn.name, ...spritedata.ITEM_ALIASES[sn.name] ?? []]) { - found.set(spritedata.psid(name), path.join(itemsDir, filename)); - } -} - -const entries = []; - -for (const [id, num] of Object.entries(ITEMS)) { - const filename = found.get(id); - if (!filename) - throw new Error(`can't find: ${id}`); - entries[num] = filename; -} - -for (let i = 0; i < entries.length; i++) { - if (entries[i] === undefined) - entries[i] = null; -} - -export default { - width: 24, - height: 24, - tile: 16, - entries -}; diff --git a/ps-pokemon.dexnums.mjs b/ps-pokemon.dexnums.mjs deleted file mode 100644 index 5c1a33b3..00000000 --- a/ps-pokemon.dexnums.mjs +++ /dev/null @@ -1,1125 +0,0 @@ -// Generated by tools/spritedata/dexnums.ts; do not edit. -// PS id of every base species -> its national dex number. - -export const DEX_NUMS = { - bulbasaur: 1, - ivysaur: 2, - venusaur: 3, - charmander: 4, - charmeleon: 5, - charizard: 6, - squirtle: 7, - wartortle: 8, - blastoise: 9, - caterpie: 10, - metapod: 11, - butterfree: 12, - weedle: 13, - kakuna: 14, - beedrill: 15, - pidgey: 16, - pidgeotto: 17, - pidgeot: 18, - rattata: 19, - raticate: 20, - spearow: 21, - fearow: 22, - ekans: 23, - arbok: 24, - pikachu: 25, - raichu: 26, - sandshrew: 27, - sandslash: 28, - nidoranf: 29, - nidorina: 30, - nidoqueen: 31, - nidoranm: 32, - nidorino: 33, - nidoking: 34, - clefairy: 35, - clefable: 36, - vulpix: 37, - ninetales: 38, - jigglypuff: 39, - wigglytuff: 40, - zubat: 41, - golbat: 42, - oddish: 43, - gloom: 44, - vileplume: 45, - paras: 46, - parasect: 47, - venonat: 48, - venomoth: 49, - diglett: 50, - dugtrio: 51, - meowth: 52, - persian: 53, - psyduck: 54, - golduck: 55, - mankey: 56, - primeape: 57, - growlithe: 58, - arcanine: 59, - poliwag: 60, - poliwhirl: 61, - poliwrath: 62, - abra: 63, - kadabra: 64, - alakazam: 65, - machop: 66, - machoke: 67, - machamp: 68, - bellsprout: 69, - weepinbell: 70, - victreebel: 71, - tentacool: 72, - tentacruel: 73, - geodude: 74, - graveler: 75, - golem: 76, - ponyta: 77, - rapidash: 78, - slowpoke: 79, - slowbro: 80, - magnemite: 81, - magneton: 82, - farfetchd: 83, - doduo: 84, - dodrio: 85, - seel: 86, - dewgong: 87, - grimer: 88, - muk: 89, - shellder: 90, - cloyster: 91, - gastly: 92, - haunter: 93, - gengar: 94, - onix: 95, - drowzee: 96, - hypno: 97, - krabby: 98, - kingler: 99, - voltorb: 100, - electrode: 101, - exeggcute: 102, - exeggutor: 103, - cubone: 104, - marowak: 105, - hitmonlee: 106, - hitmonchan: 107, - lickitung: 108, - koffing: 109, - weezing: 110, - rhyhorn: 111, - rhydon: 112, - chansey: 113, - tangela: 114, - kangaskhan: 115, - horsea: 116, - seadra: 117, - goldeen: 118, - seaking: 119, - staryu: 120, - starmie: 121, - mrmime: 122, - scyther: 123, - jynx: 124, - electabuzz: 125, - magmar: 126, - pinsir: 127, - tauros: 128, - magikarp: 129, - gyarados: 130, - lapras: 131, - ditto: 132, - eevee: 133, - vaporeon: 134, - jolteon: 135, - flareon: 136, - porygon: 137, - omanyte: 138, - omastar: 139, - kabuto: 140, - kabutops: 141, - aerodactyl: 142, - snorlax: 143, - articuno: 144, - zapdos: 145, - moltres: 146, - dratini: 147, - dragonair: 148, - dragonite: 149, - mewtwo: 150, - mew: 151, - chikorita: 152, - bayleef: 153, - meganium: 154, - cyndaquil: 155, - quilava: 156, - typhlosion: 157, - totodile: 158, - croconaw: 159, - feraligatr: 160, - sentret: 161, - furret: 162, - hoothoot: 163, - noctowl: 164, - ledyba: 165, - ledian: 166, - spinarak: 167, - ariados: 168, - crobat: 169, - chinchou: 170, - lanturn: 171, - pichu: 172, - cleffa: 173, - igglybuff: 174, - togepi: 175, - togetic: 176, - natu: 177, - xatu: 178, - mareep: 179, - flaaffy: 180, - ampharos: 181, - bellossom: 182, - marill: 183, - azumarill: 184, - sudowoodo: 185, - politoed: 186, - hoppip: 187, - skiploom: 188, - jumpluff: 189, - aipom: 190, - sunkern: 191, - sunflora: 192, - yanma: 193, - wooper: 194, - quagsire: 195, - espeon: 196, - umbreon: 197, - murkrow: 198, - slowking: 199, - misdreavus: 200, - unown: 201, - wobbuffet: 202, - girafarig: 203, - pineco: 204, - forretress: 205, - dunsparce: 206, - gligar: 207, - steelix: 208, - snubbull: 209, - granbull: 210, - qwilfish: 211, - scizor: 212, - shuckle: 213, - heracross: 214, - sneasel: 215, - teddiursa: 216, - ursaring: 217, - slugma: 218, - magcargo: 219, - swinub: 220, - piloswine: 221, - corsola: 222, - remoraid: 223, - octillery: 224, - delibird: 225, - mantine: 226, - skarmory: 227, - houndour: 228, - houndoom: 229, - kingdra: 230, - phanpy: 231, - donphan: 232, - porygon2: 233, - stantler: 234, - smeargle: 235, - tyrogue: 236, - hitmontop: 237, - smoochum: 238, - elekid: 239, - magby: 240, - miltank: 241, - blissey: 242, - raikou: 243, - entei: 244, - suicune: 245, - larvitar: 246, - pupitar: 247, - tyranitar: 248, - lugia: 249, - hooh: 250, - celebi: 251, - treecko: 252, - grovyle: 253, - sceptile: 254, - torchic: 255, - combusken: 256, - blaziken: 257, - mudkip: 258, - marshtomp: 259, - swampert: 260, - poochyena: 261, - mightyena: 262, - zigzagoon: 263, - linoone: 264, - wurmple: 265, - silcoon: 266, - beautifly: 267, - cascoon: 268, - dustox: 269, - lotad: 270, - lombre: 271, - ludicolo: 272, - seedot: 273, - nuzleaf: 274, - shiftry: 275, - taillow: 276, - swellow: 277, - wingull: 278, - pelipper: 279, - ralts: 280, - kirlia: 281, - gardevoir: 282, - surskit: 283, - masquerain: 284, - shroomish: 285, - breloom: 286, - slakoth: 287, - vigoroth: 288, - slaking: 289, - nincada: 290, - ninjask: 291, - shedinja: 292, - whismur: 293, - loudred: 294, - exploud: 295, - makuhita: 296, - hariyama: 297, - azurill: 298, - nosepass: 299, - skitty: 300, - delcatty: 301, - sableye: 302, - mawile: 303, - aron: 304, - lairon: 305, - aggron: 306, - meditite: 307, - medicham: 308, - electrike: 309, - manectric: 310, - plusle: 311, - minun: 312, - volbeat: 313, - illumise: 314, - roselia: 315, - gulpin: 316, - swalot: 317, - carvanha: 318, - sharpedo: 319, - wailmer: 320, - wailord: 321, - numel: 322, - camerupt: 323, - torkoal: 324, - spoink: 325, - grumpig: 326, - spinda: 327, - trapinch: 328, - vibrava: 329, - flygon: 330, - cacnea: 331, - cacturne: 332, - swablu: 333, - altaria: 334, - zangoose: 335, - seviper: 336, - lunatone: 337, - solrock: 338, - barboach: 339, - whiscash: 340, - corphish: 341, - crawdaunt: 342, - baltoy: 343, - claydol: 344, - lileep: 345, - cradily: 346, - anorith: 347, - armaldo: 348, - feebas: 349, - milotic: 350, - castform: 351, - kecleon: 352, - shuppet: 353, - banette: 354, - duskull: 355, - dusclops: 356, - tropius: 357, - chimecho: 358, - absol: 359, - wynaut: 360, - snorunt: 361, - glalie: 362, - spheal: 363, - sealeo: 364, - walrein: 365, - clamperl: 366, - huntail: 367, - gorebyss: 368, - relicanth: 369, - luvdisc: 370, - bagon: 371, - shelgon: 372, - salamence: 373, - beldum: 374, - metang: 375, - metagross: 376, - regirock: 377, - regice: 378, - registeel: 379, - latias: 380, - latios: 381, - kyogre: 382, - groudon: 383, - rayquaza: 384, - jirachi: 385, - deoxys: 386, - turtwig: 387, - grotle: 388, - torterra: 389, - chimchar: 390, - monferno: 391, - infernape: 392, - piplup: 393, - prinplup: 394, - empoleon: 395, - starly: 396, - staravia: 397, - staraptor: 398, - bidoof: 399, - bibarel: 400, - kricketot: 401, - kricketune: 402, - shinx: 403, - luxio: 404, - luxray: 405, - budew: 406, - roserade: 407, - cranidos: 408, - rampardos: 409, - shieldon: 410, - bastiodon: 411, - burmy: 412, - wormadam: 413, - mothim: 414, - combee: 415, - vespiquen: 416, - pachirisu: 417, - buizel: 418, - floatzel: 419, - cherubi: 420, - cherrim: 421, - shellos: 422, - gastrodon: 423, - ambipom: 424, - drifloon: 425, - drifblim: 426, - buneary: 427, - lopunny: 428, - mismagius: 429, - honchkrow: 430, - glameow: 431, - purugly: 432, - chingling: 433, - stunky: 434, - skuntank: 435, - bronzor: 436, - bronzong: 437, - bonsly: 438, - mimejr: 439, - happiny: 440, - chatot: 441, - spiritomb: 442, - gible: 443, - gabite: 444, - garchomp: 445, - munchlax: 446, - riolu: 447, - lucario: 448, - hippopotas: 449, - hippowdon: 450, - skorupi: 451, - drapion: 452, - croagunk: 453, - toxicroak: 454, - carnivine: 455, - finneon: 456, - lumineon: 457, - mantyke: 458, - snover: 459, - abomasnow: 460, - weavile: 461, - magnezone: 462, - lickilicky: 463, - rhyperior: 464, - tangrowth: 465, - electivire: 466, - magmortar: 467, - togekiss: 468, - yanmega: 469, - leafeon: 470, - glaceon: 471, - gliscor: 472, - mamoswine: 473, - porygonz: 474, - gallade: 475, - probopass: 476, - dusknoir: 477, - froslass: 478, - rotom: 479, - uxie: 480, - mesprit: 481, - azelf: 482, - dialga: 483, - palkia: 484, - heatran: 485, - regigigas: 486, - giratina: 487, - cresselia: 488, - phione: 489, - manaphy: 490, - darkrai: 491, - shaymin: 492, - arceus: 493, - victini: 494, - snivy: 495, - servine: 496, - serperior: 497, - tepig: 498, - pignite: 499, - emboar: 500, - oshawott: 501, - dewott: 502, - samurott: 503, - patrat: 504, - watchog: 505, - lillipup: 506, - herdier: 507, - stoutland: 508, - purrloin: 509, - liepard: 510, - pansage: 511, - simisage: 512, - pansear: 513, - simisear: 514, - panpour: 515, - simipour: 516, - munna: 517, - musharna: 518, - pidove: 519, - tranquill: 520, - unfezant: 521, - blitzle: 522, - zebstrika: 523, - roggenrola: 524, - boldore: 525, - gigalith: 526, - woobat: 527, - swoobat: 528, - drilbur: 529, - excadrill: 530, - audino: 531, - timburr: 532, - gurdurr: 533, - conkeldurr: 534, - tympole: 535, - palpitoad: 536, - seismitoad: 537, - throh: 538, - sawk: 539, - sewaddle: 540, - swadloon: 541, - leavanny: 542, - venipede: 543, - whirlipede: 544, - scolipede: 545, - cottonee: 546, - whimsicott: 547, - petilil: 548, - lilligant: 549, - basculin: 550, - sandile: 551, - krokorok: 552, - krookodile: 553, - darumaka: 554, - darmanitan: 555, - maractus: 556, - dwebble: 557, - crustle: 558, - scraggy: 559, - scrafty: 560, - sigilyph: 561, - yamask: 562, - cofagrigus: 563, - tirtouga: 564, - carracosta: 565, - archen: 566, - archeops: 567, - trubbish: 568, - garbodor: 569, - zorua: 570, - zoroark: 571, - minccino: 572, - cinccino: 573, - gothita: 574, - gothorita: 575, - gothitelle: 576, - solosis: 577, - duosion: 578, - reuniclus: 579, - ducklett: 580, - swanna: 581, - vanillite: 582, - vanillish: 583, - vanilluxe: 584, - deerling: 585, - sawsbuck: 586, - emolga: 587, - karrablast: 588, - escavalier: 589, - foongus: 590, - amoonguss: 591, - frillish: 592, - jellicent: 593, - alomomola: 594, - joltik: 595, - galvantula: 596, - ferroseed: 597, - ferrothorn: 598, - klink: 599, - klang: 600, - klinklang: 601, - tynamo: 602, - eelektrik: 603, - eelektross: 604, - elgyem: 605, - beheeyem: 606, - litwick: 607, - lampent: 608, - chandelure: 609, - axew: 610, - fraxure: 611, - haxorus: 612, - cubchoo: 613, - beartic: 614, - cryogonal: 615, - shelmet: 616, - accelgor: 617, - stunfisk: 618, - mienfoo: 619, - mienshao: 620, - druddigon: 621, - golett: 622, - golurk: 623, - pawniard: 624, - bisharp: 625, - bouffalant: 626, - rufflet: 627, - braviary: 628, - vullaby: 629, - mandibuzz: 630, - heatmor: 631, - durant: 632, - deino: 633, - zweilous: 634, - hydreigon: 635, - larvesta: 636, - volcarona: 637, - cobalion: 638, - terrakion: 639, - virizion: 640, - tornadus: 641, - thundurus: 642, - reshiram: 643, - zekrom: 644, - landorus: 645, - kyurem: 646, - keldeo: 647, - meloetta: 648, - genesect: 649, - chespin: 650, - quilladin: 651, - chesnaught: 652, - fennekin: 653, - braixen: 654, - delphox: 655, - froakie: 656, - frogadier: 657, - greninja: 658, - bunnelby: 659, - diggersby: 660, - fletchling: 661, - fletchinder: 662, - talonflame: 663, - scatterbug: 664, - spewpa: 665, - vivillon: 666, - litleo: 667, - pyroar: 668, - flabebe: 669, - floette: 670, - florges: 671, - skiddo: 672, - gogoat: 673, - pancham: 674, - pangoro: 675, - furfrou: 676, - espurr: 677, - meowstic: 678, - honedge: 679, - doublade: 680, - aegislash: 681, - spritzee: 682, - aromatisse: 683, - swirlix: 684, - slurpuff: 685, - inkay: 686, - malamar: 687, - binacle: 688, - barbaracle: 689, - skrelp: 690, - dragalge: 691, - clauncher: 692, - clawitzer: 693, - helioptile: 694, - heliolisk: 695, - tyrunt: 696, - tyrantrum: 697, - amaura: 698, - aurorus: 699, - sylveon: 700, - hawlucha: 701, - dedenne: 702, - carbink: 703, - goomy: 704, - sliggoo: 705, - goodra: 706, - klefki: 707, - phantump: 708, - trevenant: 709, - pumpkaboo: 710, - gourgeist: 711, - bergmite: 712, - avalugg: 713, - noibat: 714, - noivern: 715, - xerneas: 716, - yveltal: 717, - zygarde: 718, - diancie: 719, - hoopa: 720, - volcanion: 721, - rowlet: 722, - dartrix: 723, - decidueye: 724, - litten: 725, - torracat: 726, - incineroar: 727, - popplio: 728, - brionne: 729, - primarina: 730, - pikipek: 731, - trumbeak: 732, - toucannon: 733, - yungoos: 734, - gumshoos: 735, - grubbin: 736, - charjabug: 737, - vikavolt: 738, - crabrawler: 739, - crabominable: 740, - oricorio: 741, - cutiefly: 742, - ribombee: 743, - rockruff: 744, - lycanroc: 745, - wishiwashi: 746, - mareanie: 747, - toxapex: 748, - mudbray: 749, - mudsdale: 750, - dewpider: 751, - araquanid: 752, - fomantis: 753, - lurantis: 754, - morelull: 755, - shiinotic: 756, - salandit: 757, - salazzle: 758, - stufful: 759, - bewear: 760, - bounsweet: 761, - steenee: 762, - tsareena: 763, - comfey: 764, - oranguru: 765, - passimian: 766, - wimpod: 767, - golisopod: 768, - sandygast: 769, - palossand: 770, - pyukumuku: 771, - typenull: 772, - silvally: 773, - minior: 774, - komala: 775, - turtonator: 776, - togedemaru: 777, - mimikyu: 778, - bruxish: 779, - drampa: 780, - dhelmise: 781, - jangmoo: 782, - hakamoo: 783, - kommoo: 784, - tapukoko: 785, - tapulele: 786, - tapubulu: 787, - tapufini: 788, - cosmog: 789, - cosmoem: 790, - solgaleo: 791, - lunala: 792, - nihilego: 793, - buzzwole: 794, - pheromosa: 795, - xurkitree: 796, - celesteela: 797, - kartana: 798, - guzzlord: 799, - necrozma: 800, - magearna: 801, - marshadow: 802, - poipole: 803, - naganadel: 804, - stakataka: 805, - blacephalon: 806, - zeraora: 807, - meltan: 808, - melmetal: 809, - grookey: 810, - thwackey: 811, - rillaboom: 812, - scorbunny: 813, - raboot: 814, - cinderace: 815, - sobble: 816, - drizzile: 817, - inteleon: 818, - skwovet: 819, - greedent: 820, - rookidee: 821, - corvisquire: 822, - corviknight: 823, - blipbug: 824, - dottler: 825, - orbeetle: 826, - nickit: 827, - thievul: 828, - gossifleur: 829, - eldegoss: 830, - wooloo: 831, - dubwool: 832, - chewtle: 833, - drednaw: 834, - yamper: 835, - boltund: 836, - rolycoly: 837, - carkol: 838, - coalossal: 839, - applin: 840, - flapple: 841, - appletun: 842, - silicobra: 843, - sandaconda: 844, - cramorant: 845, - arrokuda: 846, - barraskewda: 847, - toxel: 848, - toxtricity: 849, - sizzlipede: 850, - centiskorch: 851, - clobbopus: 852, - grapploct: 853, - sinistea: 854, - polteageist: 855, - hatenna: 856, - hattrem: 857, - hatterene: 858, - impidimp: 859, - morgrem: 860, - grimmsnarl: 861, - obstagoon: 862, - perrserker: 863, - cursola: 864, - sirfetchd: 865, - mrrime: 866, - runerigus: 867, - milcery: 868, - alcremie: 869, - falinks: 870, - pincurchin: 871, - snom: 872, - frosmoth: 873, - stonjourner: 874, - eiscue: 875, - indeedee: 876, - morpeko: 877, - cufant: 878, - copperajah: 879, - dracozolt: 880, - arctozolt: 881, - dracovish: 882, - arctovish: 883, - duraludon: 884, - dreepy: 885, - drakloak: 886, - dragapult: 887, - zacian: 888, - zamazenta: 889, - eternatus: 890, - kubfu: 891, - urshifu: 892, - zarude: 893, - regieleki: 894, - regidrago: 895, - glastrier: 896, - spectrier: 897, - calyrex: 898, - wyrdeer: 899, - kleavor: 900, - ursaluna: 901, - basculegion: 902, - sneasler: 903, - overqwil: 904, - enamorus: 905, - sprigatito: 906, - floragato: 907, - meowscarada: 908, - fuecoco: 909, - crocalor: 910, - skeledirge: 911, - quaxly: 912, - quaxwell: 913, - quaquaval: 914, - lechonk: 915, - oinkologne: 916, - tarountula: 917, - spidops: 918, - nymble: 919, - lokix: 920, - pawmi: 921, - pawmo: 922, - pawmot: 923, - tandemaus: 924, - maushold: 925, - fidough: 926, - dachsbun: 927, - smoliv: 928, - dolliv: 929, - arboliva: 930, - squawkabilly: 931, - nacli: 932, - naclstack: 933, - garganacl: 934, - charcadet: 935, - armarouge: 936, - ceruledge: 937, - tadbulb: 938, - bellibolt: 939, - wattrel: 940, - kilowattrel: 941, - maschiff: 942, - mabosstiff: 943, - shroodle: 944, - grafaiai: 945, - bramblin: 946, - brambleghast: 947, - toedscool: 948, - toedscruel: 949, - klawf: 950, - capsakid: 951, - scovillain: 952, - rellor: 953, - rabsca: 954, - flittle: 955, - espathra: 956, - tinkatink: 957, - tinkatuff: 958, - tinkaton: 959, - wiglett: 960, - wugtrio: 961, - bombirdier: 962, - finizen: 963, - palafin: 964, - varoom: 965, - revavroom: 966, - cyclizar: 967, - orthworm: 968, - glimmet: 969, - glimmora: 970, - greavard: 971, - houndstone: 972, - flamigo: 973, - cetoddle: 974, - cetitan: 975, - veluza: 976, - dondozo: 977, - tatsugiri: 978, - annihilape: 979, - clodsire: 980, - farigiraf: 981, - dudunsparce: 982, - kingambit: 983, - greattusk: 984, - screamtail: 985, - brutebonnet: 986, - fluttermane: 987, - slitherwing: 988, - sandyshocks: 989, - irontreads: 990, - ironbundle: 991, - ironhands: 992, - ironjugulis: 993, - ironmoth: 994, - ironthorns: 995, - frigibax: 996, - arctibax: 997, - baxcalibur: 998, - gimmighoul: 999, - gholdengo: 1000, - wochien: 1001, - chienpao: 1002, - tinglu: 1003, - chiyu: 1004, - roaringmoon: 1005, - ironvaliant: 1006, - koraidon: 1007, - miraidon: 1008, - walkingwake: 1009, - ironleaves: 1010, - dipplin: 1011, - poltchageist: 1012, - sinistcha: 1013, - okidogi: 1014, - munkidori: 1015, - fezandipiti: 1016, - ogerpon: 1017, - archaludon: 1018, - hydrapple: 1019, - gougingfire: 1020, - ragingbolt: 1021, - ironboulder: 1022, - ironcrown: 1023, - terapagos: 1024, - pecharunt: 1025, - missingno: 0, - syclar: -1, - syclant: -2, - revenankh: -3, - embirch: -4, - flarelm: -5, - pyroak: -6, - breezi: -7, - fidgit: -8, - rebble: -9, - tactite: -10, - stratagem: -11, - privatyke: -12, - arghonaut: -13, - kitsunoh: -14, - cyclohm: -15, - colossoil: -16, - krilowatt: -17, - voodoll: -18, - voodoom: -19, - scratchet: -20, - tomohawk: -21, - necturine: -22, - necturna: -23, - mollux: -24, - cupra: -25, - argalis: -26, - aurumoth: -27, - brattler: -28, - malaconda: -29, - cawdet: -30, - cawmodore: -31, - volkritter: -32, - volkraken: -33, - snugglow: -34, - plasmanta: -35, - floatoy: -36, - caimanoe: -37, - naviathan: -38, - crucibelle: -39, - pluffle: -40, - kerfluffle: -41, - pajantom: -42, - mumbao: -43, - jumbao: -44, - fawnifer: -45, - electrelk: -46, - caribolt: -47, - smogecko: -48, - smoguana: -49, - smokomodo: -50, - swirlpool: -51, - coribalis: -52, - snaelstrom: -53, - justyke: -54, - equilibra: -55, - solotl: -56, - astrolotl: -57, - miasmite: -58, - miasmaw: -59, - chromera: -60, - nohface: -61, - monohm: -62, - duohm: -63, - dorsoil: -64, - protowatt: -65, - venomicon: -66, - saharascal: -67, - saharaja: -68, - ababo: -69, - scattervein: -70, - hemogoblin: -71, - cresceidon: -72, - chuggon: -73, - draggalong: -74, - chuggalong: -75, - flox: -76, - shox: -77, - ramnarok: -78, - obliteryx: -80, - pokestarsmeargle: -5000, - pokestarufo: -5001, - pokestarbrycenman: -5002, - pokestarmt: -5003, - pokestarmt2: -5004, - pokestartransport: -5005, - pokestargiant: -5006, - pokestarhumanoid: -5007, - pokestarmonster: -5008, - pokestarf00: -5009, - pokestarf002: -5010, - pokestarspirit: -5011, - pokestarblackdoor: -5012, - pokestarwhitedoor: -5013, - pokestarblackbelt: -5014, -}; diff --git a/ps-pokemon.sheet.mjs b/ps-pokemon.sheet.mjs deleted file mode 100644 index 5b28b761..00000000 --- a/ps-pokemon.sheet.mjs +++ /dev/null @@ -1,727 +0,0 @@ - -import fs from 'fs'; -import path from 'path'; -import * as spritedata from '@smogon/sprite-data/index.ts'; -import root from '@smogon/sprite-root/index.ts'; - -import {DEX_NUMS} from './ps-pokemon.dexnums.mjs'; - -const srcDir = path.join(root, "src"); -const spritesDir = path.join(srcDir, "minisprites/pokemon/gen6"); - -// Derived from pokemon-showdown-client/src/battle-dex-data.ts -const BattlePokemonIconIndexes = { - unknown: 0, - - // alt forms - egg: 1032 + 1, - pikachubelle: 1032 + 2, - pikachulibre: 1032 + 3, - pikachuphd: 1032 + 4, - pikachupopstar: 1032 + 5, - pikachurockstar: 1032 + 6, - pikachucosplay: 1032 + 7, - unownexclamation: 1032 + 8, - unownquestion: 1032 + 9, - unownb: 1032 + 10, - unownc: 1032 + 11, - unownd: 1032 + 12, - unowne: 1032 + 13, - unownf: 1032 + 14, - unowng: 1032 + 15, - unownh: 1032 + 16, - unowni: 1032 + 17, - unownj: 1032 + 18, - unownk: 1032 + 19, - unownl: 1032 + 20, - unownm: 1032 + 21, - unownn: 1032 + 22, - unowno: 1032 + 23, - unownp: 1032 + 24, - unownq: 1032 + 25, - unownr: 1032 + 26, - unowns: 1032 + 27, - unownt: 1032 + 28, - unownu: 1032 + 29, - unownv: 1032 + 30, - unownw: 1032 + 31, - unownx: 1032 + 32, - unowny: 1032 + 33, - unownz: 1032 + 34, - castformrainy: 1032 + 35, - castformsnowy: 1032 + 36, - castformsunny: 1032 + 37, - deoxysattack: 1032 + 38, - deoxysdefense: 1032 + 39, - deoxysspeed: 1032 + 40, - burmysandy: 1032 + 41, - burmytrash: 1032 + 42, - wormadamsandy: 1032 + 43, - wormadamtrash: 1032 + 44, - cherrimsunshine: 1032 + 45, - shelloseast: 1032 + 46, - gastrodoneast: 1032 + 47, - rotomfan: 1032 + 48, - rotomfrost: 1032 + 49, - rotomheat: 1032 + 50, - rotommow: 1032 + 51, - rotomwash: 1032 + 52, - giratinaorigin: 1032 + 53, - shayminsky: 1032 + 54, - unfezantf: 1032 + 55, - basculinbluestriped: 1032 + 56, - darmanitanzen: 1032 + 57, - deerlingautumn: 1032 + 58, - deerlingsummer: 1032 + 59, - deerlingwinter: 1032 + 60, - sawsbuckautumn: 1032 + 61, - sawsbucksummer: 1032 + 62, - sawsbuckwinter: 1032 + 63, - frillishf: 1032 + 64, - jellicentf: 1032 + 65, - tornadustherian: 1032 + 66, - thundurustherian: 1032 + 67, - landorustherian: 1032 + 68, - kyuremblack: 1032 + 69, - kyuremwhite: 1032 + 70, - keldeoresolute: 1032 + 71, - meloettapirouette: 1032 + 72, - vivillonarchipelago: 1032 + 73, - vivilloncontinental: 1032 + 74, - vivillonelegant: 1032 + 75, - vivillonfancy: 1032 + 76, - vivillongarden: 1032 + 77, - vivillonhighplains: 1032 + 78, - vivillonicysnow: 1032 + 79, - vivillonjungle: 1032 + 80, - vivillonmarine: 1032 + 81, - vivillonmodern: 1032 + 82, - vivillonmonsoon: 1032 + 83, - vivillonocean: 1032 + 84, - vivillonpokeball: 1032 + 85, - vivillonpolar: 1032 + 86, - vivillonriver: 1032 + 87, - vivillonsandstorm: 1032 + 88, - vivillonsavanna: 1032 + 89, - vivillonsun: 1032 + 90, - vivillontundra: 1032 + 91, - pyroarf: 1032 + 92, - flabebeblue: 1032 + 93, - flabebeorange: 1032 + 94, - flabebewhite: 1032 + 95, - flabebeyellow: 1032 + 96, - floetteblue: 1032 + 97, - floetteeternal: 1032 + 98, - floetteorange: 1032 + 99, - floettewhite: 1032 + 100, - floetteyellow: 1032 + 101, - florgesblue: 1032 + 102, - florgesorange: 1032 + 103, - florgeswhite: 1032 + 104, - florgesyellow: 1032 + 105, - furfroudandy: 1032 + 106, - furfroudebutante: 1032 + 107, - furfroudiamond: 1032 + 108, - furfrouheart: 1032 + 109, - furfroukabuki: 1032 + 110, - furfroulareine: 1032 + 111, - furfroumatron: 1032 + 112, - furfroupharaoh: 1032 + 113, - furfroustar: 1032 + 114, - meowsticf: 1032 + 115, - aegislashblade: 1032 + 116, - xerneasneutral: 1032 + 117, - hoopaunbound: 1032 + 118, - rattataalola: 1032 + 119, - raticatealola: 1032 + 120, - raichualola: 1032 + 121, - sandshrewalola: 1032 + 122, - sandslashalola: 1032 + 123, - vulpixalola: 1032 + 124, - ninetalesalola: 1032 + 125, - diglettalola: 1032 + 126, - dugtrioalola: 1032 + 127, - meowthalola: 1032 + 128, - persianalola: 1032 + 129, - geodudealola: 1032 + 130, - graveleralola: 1032 + 131, - golemalola: 1032 + 132, - grimeralola: 1032 + 133, - mukalola: 1032 + 134, - exeggutoralola: 1032 + 135, - marowakalola: 1032 + 136, - greninjaash: 1032 + 137, - zygarde10: 1032 + 138, - zygardecomplete: 1032 + 139, - oricoriopompom: 1032 + 140, - oricoriopau: 1032 + 141, - oricoriosensu: 1032 + 142, - lycanrocmidnight: 1032 + 143, - wishiwashischool: 1032 + 144, - miniormeteor: 1032 + 145, - miniororange: 1032 + 146, - minioryellow: 1032 + 147, - miniorgreen: 1032 + 148, - miniorblue: 1032 + 149, - miniorindigo: 1032 + 150, - miniorviolet: 1032 + 151, - magearnaoriginal: 1032 + 152, - pikachuoriginal: 1032 + 153, - pikachuhoenn: 1032 + 154, - pikachusinnoh: 1032 + 155, - pikachuunova: 1032 + 156, - pikachukalos: 1032 + 157, - pikachualola: 1032 + 158, - pikachupartner: 1032 + 159, - lycanrocdusk: 1032 + 160, - necrozmaduskmane: 1032 + 161, - necrozmadawnwings: 1032 + 162, - necrozmaultra: 1032 + 163, - pikachustarter: 1032 + 164, - eeveestarter: 1032 + 165, - meowthgalar: 1032 + 166, - ponytagalar: 1032 + 167, - rapidashgalar: 1032 + 168, - farfetchdgalar: 1032 + 169, - weezinggalar: 1032 + 170, - mrmimegalar: 1032 + 171, - corsolagalar: 1032 + 172, - zigzagoongalar: 1032 + 173, - linoonegalar: 1032 + 174, - darumakagalar: 1032 + 175, - darmanitangalar: 1032 + 176, - darmanitangalarzen: 1032 + 177, - yamaskgalar: 1032 + 178, - stunfiskgalar: 1032 + 179, - cramorantgulping: 1032 + 180, - cramorantgorging: 1032 + 181, - toxtricitylowkey: 1032 + 182, - alcremierubycream: 1032 + 183, - alcremiematchacream: 1032 + 184, - alcremiemintcream: 1032 + 185, - alcremielemoncream: 1032 + 186, - alcremiesaltedcream: 1032 + 187, - alcremierubyswirl: 1032 + 188, - alcremiecaramelswirl: 1032 + 189, - alcremierainbowswirl: 1032 + 190, - eiscuenoice: 1032 + 191, - indeedeef: 1032 + 192, - morpekohangry: 1032 + 193, - zaciancrowned: 1032 + 194, - zamazentacrowned: 1032 + 195, - slowpokegalar: 1032 + 196, - slowbrogalar: 1032 + 197, - zarudedada: 1032 + 198, - pikachuworld: 1032 + 199, - articunogalar: 1032 + 200, - zapdosgalar: 1032 + 201, - moltresgalar: 1032 + 202, - slowkinggalar: 1032 + 203, - calyrexice: 1032 + 204, - calyrexshadow: 1032 + 205, - growlithehisui: 1032 + 206, - arcaninehisui: 1032 + 207, - voltorbhisui: 1032 + 208, - electrodehisui: 1032 + 209, - typhlosionhisui: 1032 + 210, - qwilfishhisui: 1032 + 211, - sneaselhisui: 1032 + 212, - samurotthisui: 1032 + 213, - lilliganthisui: 1032 + 214, - zoruahisui: 1032 + 215, - zoroarkhisui: 1032 + 216, - braviaryhisui: 1032 + 217, - sliggoohisui: 1032 + 218, - goodrahisui: 1032 + 219, - avalugghisui: 1032 + 220, - decidueyehisui: 1032 + 221, - basculegionf: 1032 + 222, - enamorustherian: 1032 + 223, - taurospaldeacombat: 1032 + 224, - taurospaldeablaze: 1032 + 225, - taurospaldeaaqua: 1032 + 226, - wooperpaldea: 1032 + 227, - oinkolognef: 1032 + 228, - palafinhero: 1032 + 229, - mausholdfour: 1032 + 230, - tatsugiridroopy: 1032 + 231, - tatsugiristretchy: 1032 + 232, - squawkabillyblue: 1032 + 233, - squawkabillyyellow: 1032 + 234, - squawkabillywhite: 1032 + 235, - gimmighoulroaming: 1032 + 236, - dialgaorigin: 1032 + 237, - palkiaorigin: 1032 + 238, - basculinwhitestriped: 1032 + 239, - ursalunabloodmoon: 1032 + 240, - ogerponwellspring: 1032 + 241, - ogerponhearthflame: 1032 + 242, - ogerponcornerstone: 1032 + 243, - terapagosterastal: 1032 + 244, - terapagosstellar: 1032 + 245, - - arceusbug: 1032 + 246, - arceusdark: 1032 + 247, - arceusdragon: 1032 + 248, - arceuselectric: 1032 + 249, - arceusfairy: 1032 + 250, - arceusfighting: 1032 + 251, - arceusfire: 1032 + 252, - arceusflying: 1032 + 253, - arceusghost: 1032 + 254, - arceusgrass: 1032 + 255, - arceusground: 1032 + 256, - arceusice: 1032 + 257, - arceuspoison: 1032 + 258, - arceuspsychic: 1032 + 259, - arceusrock: 1032 + 260, - arceussteel: 1032 + 261, - arceuswater: 1032 + 262, - - genesectdouse: 1032 + 263, - genesectshock: 1032 + 264, - genesectburn: 1032 + 265, - genesectchill: 1032 + 266, - - silvallybug: 1032 + 267, - silvallydark: 1032 + 268, - silvallydragon: 1032 + 269, - silvallyelectric: 1032 + 270, - silvallyfairy: 1032 + 271, - silvallyfighting: 1032 + 272, - silvallyfire: 1032 + 273, - silvallyflying: 1032 + 274, - silvallyghost: 1032 + 275, - silvallygrass: 1032 + 276, - silvallyground: 1032 + 277, - silvallyice: 1032 + 278, - silvallypoison: 1032 + 279, - silvallypsychic: 1032 + 280, - silvallyrock: 1032 + 281, - silvallysteel: 1032 + 282, - silvallywater: 1032 + 283, - - // alt forms with duplicate icons - // greninjabond: 658, - // gumshoostotem: 735, - // raticatealolatotem: 1032 + 120, - // marowakalolatotem: 1032 + 136, - // araquanidtotem: 752, - // lurantistotem: 754, - // salazzletotem: 758, - // vikavolttotem: 738, - // togedemarutotem: 777, - // mimikyutotem: 778, - // mimikyubustedtotem: 778, - // ribombeetotem: 743, - // kommoototem: 784, - // toxtricitylowkeygmax: 1320 + 69, - sinisteaantique: 854, - polteageistantique: 855, - urshifurapidstrike: 892, - dudunsparcethreesegment: 982, - poltchageistartisan: 1012, - sinistchamasterpiece: 1013, - ogerpontealtera: 1017, - ogerponwellspringtera: 1032 + 241, - ogerponhearthflametera: 1032 + 242, - ogerponcornerstonetera: 1032 + 243, - - // Mega/G-Max - venusaurmega: 1320 + 0, - charizardmegax: 1320 + 1, - charizardmegay: 1320 + 2, - blastoisemega: 1320 + 3, - beedrillmega: 1320 + 4, - pidgeotmega: 1320 + 5, - alakazammega: 1320 + 6, - slowbromega: 1320 + 7, - gengarmega: 1320 + 8, - kangaskhanmega: 1320 + 9, - pinsirmega: 1320 + 10, - gyaradosmega: 1320 + 11, - aerodactylmega: 1320 + 12, - mewtwomegax: 1320 + 13, - mewtwomegay: 1320 + 14, - ampharosmega: 1320 + 15, - steelixmega: 1320 + 16, - scizormega: 1320 + 17, - heracrossmega: 1320 + 18, - houndoommega: 1320 + 19, - tyranitarmega: 1320 + 20, - sceptilemega: 1320 + 21, - blazikenmega: 1320 + 22, - swampertmega: 1320 + 23, - gardevoirmega: 1320 + 24, - sableyemega: 1320 + 25, - mawilemega: 1320 + 26, - aggronmega: 1320 + 27, - medichammega: 1320 + 28, - manectricmega: 1320 + 29, - sharpedomega: 1320 + 30, - cameruptmega: 1320 + 31, - altariamega: 1320 + 32, - banettemega: 1320 + 33, - absolmega: 1320 + 34, - glaliemega: 1320 + 35, - salamencemega: 1320 + 36, - metagrossmega: 1320 + 37, - latiasmega: 1320 + 38, - latiosmega: 1320 + 39, - kyogreprimal: 1320 + 40, - groudonprimal: 1320 + 41, - rayquazamega: 1320 + 42, - lopunnymega: 1320 + 43, - garchompmega: 1320 + 44, - lucariomega: 1320 + 45, - abomasnowmega: 1320 + 46, - gallademega: 1320 + 47, - audinomega: 1320 + 48, - dianciemega: 1320 + 49, - charizardgmax: 1320 + 50, - butterfreegmax: 1320 + 51, - pikachugmax: 1320 + 52, - meowthgmax: 1320 + 53, - machampgmax: 1320 + 54, - gengargmax: 1320 + 55, - kinglergmax: 1320 + 56, - laprasgmax: 1320 + 57, - eeveegmax: 1320 + 58, - snorlaxgmax: 1320 + 59, - garbodorgmax: 1320 + 60, - melmetalgmax: 1320 + 61, - corviknightgmax: 1320 + 62, - orbeetlegmax: 1320 + 63, - drednawgmax: 1320 + 64, - coalossalgmax: 1320 + 65, - flapplegmax: 1320 + 66, - appletungmax: 1320 + 67, - sandacondagmax: 1320 + 68, - toxtricitygmax: 1320 + 69, - centiskorchgmax: 1320 + 70, - hatterenegmax: 1320 + 71, - grimmsnarlgmax: 1320 + 72, - alcremiegmax: 1320 + 73, - copperajahgmax: 1320 + 74, - duraludongmax: 1320 + 75, - eternatuseternamax: 1320 + 76, - venusaurgmax: 1320 + 77, - blastoisegmax: 1320 + 78, - rillaboomgmax: 1320 + 79, - cinderacegmax: 1320 + 80, - inteleongmax: 1320 + 81, - urshifugmax: 1320 + 82, - urshifurapidstrikegmax: 1320 + 83, - clefablemega: 1320 + 84, - victreebelmega: 1320 + 85, - starmiemega: 1320 + 86, - dragonitemega: 1320 + 87, - meganiummega: 1320 + 88, - feraligatrmega: 1320 + 89, - skarmorymega: 1320 + 90, - froslassmega: 1320 + 91, - emboarmega: 1320 + 92, - excadrillmega: 1320 + 93, - scolipedemega: 1320 + 94, - scraftymega: 1320 + 95, - eelektrossmega: 1320 + 96, - chandeluremega: 1320 + 97, - chesnaughtmega: 1320 + 98, - delphoxmega: 1320 + 99, - greninjamega: 1320 + 100, - pyroarmega: 1320 + 101, - floettemega: 1320 + 102, - malamarmega: 1320 + 103, - barbaraclemega: 1320 + 104, - dragalgemega: 1320 + 105, - hawluchamega: 1320 + 106, - zygardemega: 1320 + 107, - drampamega: 1320 + 108, - falinksmega: 1320 + 109, - raichumegax: 1320 + 110, - raichumegay: 1320 + 111, - chimechomega: 1320 + 112, - absolmegaz: 1320 + 113, - staraptormega: 1320 + 114, - garchompmegaz: 1320 + 115, - lucariomegaz: 1320 + 116, - heatranmega: 1320 + 117, - darkraimega: 1320 + 118, - golurkmega: 1320 + 119, - meowsticmmega: 1320 + 120, - meowsticfmega: 1320 + 120, - crabominablemega: 1320 + 121, - golisopodmega: 1320 + 122, - magearnamega: 1320 + 123, - magearnaoriginalmega: 1320 + 124, - zeraoramega: 1320 + 125, - scovillainmega: 1320 + 126, - glimmoramega: 1320 + 127, - tatsugiricurlymega: 1320 + 128, - tatsugiridroopymega: 1320 + 129, - tatsugiristretchymega: 1320 + 130, - baxcaliburmega: 1320 + 131, - - // CAP - syclant: 1560 + 0, - revenankh: 1560 + 1, - pyroak: 1560 + 2, - fidgit: 1560 + 3, - stratagem: 1560 + 4, - arghonaut: 1560 + 5, - kitsunoh: 1560 + 6, - cyclohm: 1560 + 7, - colossoil: 1560 + 8, - krilowatt: 1560 + 9, - voodoom: 1560 + 10, - tomohawk: 1560 + 11, - necturna: 1560 + 12, - mollux: 1560 + 13, - aurumoth: 1560 + 14, - malaconda: 1560 + 15, - cawmodore: 1560 + 16, - volkraken: 1560 + 17, - plasmanta: 1560 + 18, - naviathan: 1560 + 19, - crucibelle: 1560 + 20, - crucibellemega: 1560 + 21, - kerfluffle: 1560 + 22, - pajantom: 1560 + 23, - jumbao: 1560 + 24, - caribolt: 1560 + 25, - smokomodo: 1560 + 26, - snaelstrom: 1560 + 27, - equilibra: 1560 + 28, - astrolotl: 1560 + 29, - miasmaw: 1560 + 30, - chromera: 1560 + 31, - venomicon: 1560 + 32, - venomiconepilogue: 1560 + 33, - saharaja: 1560 + 34, - hemogoblin: 1560 + 35, - syclar: 1560 + 36, - embirch: 1560 + 37, - flarelm: 1560 + 38, - breezi: 1560 + 39, - scratchet: 1560 + 40, - necturine: 1560 + 41, - cupra: 1560 + 42, - argalis: 1560 + 43, - brattler: 1560 + 44, - cawdet: 1560 + 45, - volkritter: 1560 + 46, - snugglow: 1560 + 47, - floatoy: 1560 + 48, - caimanoe: 1560 + 49, - pluffle: 1560 + 50, - rebble: 1560 + 51, - tactite: 1560 + 52, - privatyke: 1560 + 53, - nohface: 1560 + 54, - monohm: 1560 + 55, - duohm: 1560 + 56, - protowatt: 1560 + 57, - voodoll: 1560 + 58, - mumbao: 1560 + 59, - fawnifer: 1560 + 60, - electrelk: 1560 + 61, - smogecko: 1560 + 62, - smoguana: 1560 + 63, - swirlpool: 1560 + 64, - coribalis: 1560 + 65, - justyke: 1560 + 66, - solotl: 1560 + 67, - miasmite: 1560 + 68, - dorsoil: 1560 + 69, - saharascal: 1560 + 70, - ababo: 1560 + 71, - scattervein: 1560 + 72, - cresceidon: 1560 + 73, - chuggalong: 1560 + 74, - shox: 1560 + 75, - chuggon: 1560 + 76, - draggalong: 1560 + 77, - ramnarok: 1560 + 78, - ramnarokradiant: 1560 + 79, - flox: 1560 + 80, - obliteryx: 1560 + 81, -}; - -const BattlePokemonIconIndexesLeft = { - pikachubelle: 1452 + 0, - pikachupopstar: 1452 + 1, - clefairy: 1452 + 2, - clefable: 1452 + 3, - jigglypuff: 1452 + 4, - wigglytuff: 1452 + 5, - dugtrioalola: 1452 + 6, - poliwhirl: 1452 + 7, - poliwrath: 1452 + 8, - mukalola: 1452 + 9, - kingler: 1452 + 10, - croconaw: 1452 + 11, - cleffa: 1452 + 12, - igglybuff: 1452 + 13, - politoed: 1452 + 14, - unownb: 1452 + 15, - unownc: 1452 + 16, - unownd: 1452 + 17, - unowne: 1452 + 18, - unownf: 1452 + 19, - unowng: 1452 + 20, - unownh: 1452 + 21, - unownj: 1452 + 22, - unownk: 1452 + 23, - unownl: 1452 + 24, - unownm: 1452 + 25, - unownn: 1452 + 26, - unownp: 1452 + 27, - unownq: 1452 + 28, - unownquestion: 1452 + 29, - unownr: 1452 + 30, - unowns: 1452 + 31, - unownt: 1452 + 32, - unownv: 1452 + 33, - unownz: 1452 + 34, - sneasel: 1452 + 35, - teddiursa: 1452 + 36, - roselia: 1452 + 37, - zangoose: 1452 + 38, - seviper: 1452 + 39, - castformsnowy: 1452 + 40, - absolmega: 1452 + 41, - absol: 1452 + 42, - regirock: 1452 + 43, - torterra: 1452 + 44, - budew: 1452 + 45, - roserade: 1452 + 46, - magmortar: 1452 + 47, - togekiss: 1452 + 48, - rotomwash: 1452 + 49, - shayminsky: 1452 + 50, - emboar: 1452 + 51, - pansear: 1452 + 52, - simisear: 1452 + 53, - drilbur: 1452 + 54, - excadrill: 1452 + 55, - sawk: 1452 + 56, - lilligant: 1452 + 57, - garbodor: 1452 + 58, - solosis: 1452 + 59, - vanilluxe: 1452 + 60, - amoonguss: 1452 + 61, - klink: 1452 + 62, - klang: 1452 + 63, - klinklang: 1452 + 64, - litwick: 1452 + 65, - golett: 1452 + 66, - golurk: 1452 + 67, - kyuremblack: 1452 + 68, - kyuremwhite: 1452 + 69, - kyurem: 1452 + 70, - keldeoresolute: 1452 + 71, - meloetta: 1452 + 72, - greninja: 1452 + 73, - // greninjabond: 1452 + 73, - greninjaash: 1452 + 74, - furfroudebutante: 1452 + 75, - barbaracle: 1452 + 76, - clauncher: 1452 + 77, - clawitzer: 1452 + 78, - sylveon: 1452 + 79, - klefki: 1452 + 80, - zygarde: 1452 + 81, - zygarde10: 1452 + 82, - zygardecomplete: 1452 + 83, - dartrix: 1452 + 84, - steenee: 1452 + 85, - tsareena: 1452 + 86, - comfey: 1452 + 87, - miniormeteor: 1452 + 88, - minior: 1452 + 89, - miniororange: 1452 + 90, - minioryellow: 1452 + 91, - miniorgreen: 1452 + 92, - miniorblue: 1452 + 93, - miniorviolet: 1452 + 94, - miniorindigo: 1452 + 95, - dhelmise: 1452 + 96, - necrozma: 1452 + 97, - marshadow: 1452 + 98, - pikachuoriginal: 1452 + 99, - pikachupartner: 1452 + 100, - necrozmaduskmane: 1452 + 101, - necrozmadawnwings: 1452 + 102, - necrozmaultra: 1452 + 103, - stakataka: 1452 + 104, - blacephalon: 1452 + 105, -}; - -const entries = []; - -let errors = []; - -// Need to figure out how to remove this readdir; tup doesn't like it -for (const name of fs.readdirSync(spritesDir)) { - const parsed = path.parse(name); - const sn = spritedata.parseFilename(parsed.name); - - // PS runs a name and its forme together, unlike the published sprite name. - let id = spritedata.psid(sn.name) + spritedata.psid(sn.extra.get("o") ?? ''); - - if (sn.extra.has("f")) id += 'f'; - if (sn.extra.has("g")) id += 'gmax'; - - let index; - if (sn.extra.has("a")) { - index = BattlePokemonIconIndexesLeft[id]; - BattlePokemonIconIndexesLeft[id] = 'found'; - } else { - index = BattlePokemonIconIndexes[id]; - BattlePokemonIconIndexes[id] = 'found'; - } - - if (index === undefined) { - // A base species sits at the slot named by its dex number; only alt - // formes need the hand-kept table above. - if (sn.kind === 's' && !sn.extra.has("o")) { - index = DEX_NUMS[spritedata.psid(sn.name)]; - } else { - errors.push(`can't find ${name}`); - continue; - } - } - - entries[index] = path.join(spritesDir, name); -} - -for (const [id, num] of Object.entries(BattlePokemonIconIndexes)) { - if (num !== 'found') { - errors.push(`didn't find ${id}`); - } -} - -for (const [id, num] of Object.entries(BattlePokemonIconIndexesLeft)) { - if (num !== 'found') { - errors.push(`didn't find left ${id}`); - } -} - -if (errors.length) { - for (let error of errors) { - console.error(error); - } - process.exit(1); -} - -for (let i = 0; i < entries.length; i++) { - if (entries[i] === undefined) - entries[i] = null; -} - -export default { - width: 40, - height: 30, - tile: 12, - entries -}; diff --git a/ps-trainers.sheet.mjs b/ps-trainers.sheet.mjs deleted file mode 100644 index f5fc7b49..00000000 --- a/ps-trainers.sheet.mjs +++ /dev/null @@ -1,318 +0,0 @@ - -import fs from 'fs'; -import path from 'path'; -import {fileURLToPath} from 'url'; -const __dirname = path.dirname(fileURLToPath(import.meta.url)); - -// Derived from pokemon-showdown-client/src/battle-dex-data.ts -const BattleAvatarNumbers = { - 1: 'lucas', - 2: 'dawn', - 3: 'youngster-gen4', - 4: 'lass-gen4dp', - 5: 'camper', - 6: 'picnicker', - 7: 'bugcatcher', - 8: 'aromalady', - 9: 'twins-gen4dp', - 10: 'hiker-gen4', - 11: 'battlegirl-gen4', - 12: 'fisherman-gen4', - 13: 'cyclist-gen4', - 14: 'cyclistf-gen4', - 15: 'blackbelt-gen4dp', - 16: 'artist-gen4', - 17: 'pokemonbreeder-gen4', - 18: 'pokemonbreederf-gen4', - 19: 'cowgirl', - 20: 'jogger', - 21: 'pokefan-gen4', - 22: 'pokefanf-gen4', - 23: 'pokekid', - 24: 'youngcouple-gen4dp', - 25: 'acetrainer-gen4dp', - 26: 'acetrainerf-gen4dp', - 27: 'waitress-gen4', - 28: 'veteran-gen4', - 29: 'ninjaboy', - 30: 'dragontamer', - 31: 'birdkeeper-gen4dp', - 32: 'doubleteam', - 33: 'richboy-gen4', - 34: 'lady-gen4', - 35: 'gentleman-gen4dp', - 36: 'madame-gen4dp', - 37: 'beauty-gen4dp', - 38: 'collector', - 39: 'policeman-gen4', - 40: 'pokemonranger-gen4', - 41: 'pokemonrangerf-gen4', - 42: 'scientist-gen4dp', - 43: 'swimmer-gen4dp', - 44: 'swimmerf-gen4dp', - 45: 'tuber', - 46: 'tuberf', - 47: 'sailor', - 48: 'sisandbro', - 49: 'ruinmaniac', - 50: 'psychic-gen4', - 51: 'psychicf-gen4', - 52: 'gambler', - 53: 'guitarist-gen4', - 54: 'acetrainersnow', - 55: 'acetrainersnowf', - 56: 'skier', - 57: 'skierf-gen4dp', - 58: 'roughneck-gen4', - 59: 'clown', - 60: 'worker-gen4', - 61: 'schoolkid-gen4dp', - 62: 'schoolkidf-gen4', - 63: 'roark', - 64: 'barry', - 65: 'byron', - 66: 'aaron', - 67: 'bertha', - 68: 'flint', - 69: 'lucian', - 70: 'cynthia-gen4', - 71: 'bellepa', - 72: 'rancher', - 73: 'mars', - 74: 'galacticgrunt', - 75: 'gardenia', - 76: 'crasherwake', - 77: 'maylene', - 78: 'fantina', - 79: 'candice', - 80: 'volkner', - 81: 'parasollady-gen4', - 82: 'waiter-gen4dp', - 83: 'interviewers', - 84: 'cameraman', - 85: 'reporter', - 86: 'idol', - 87: 'cyrus', - 88: 'jupiter', - 89: 'saturn', - 90: 'galacticgruntf', - 91: 'argenta', - 92: 'palmer', - 93: 'thorton', - 94: 'buck', - 95: 'darach', - 96: 'marley', - 97: 'mira', - 98: 'cheryl', - 99: 'riley', - 100: 'dahlia', - 101: 'ethan', - 102: 'lyra', - 103: 'twins-gen4', - 104: 'lass-gen4', - 105: 'acetrainer-gen4', - 106: 'acetrainerf-gen4', - 107: 'juggler', - 108: 'sage', - 109: 'li', - 110: 'gentleman-gen4', - 111: 'teacher', - 112: 'beauty', - 113: 'birdkeeper', - 114: 'swimmer-gen4', - 115: 'swimmerf-gen4', - 116: 'kimonogirl', - 117: 'scientist-gen4', - 118: 'acetrainercouple', - 119: 'youngcouple', - 120: 'supernerd', - 121: 'medium', - 122: 'schoolkid-gen4', - 123: 'blackbelt-gen4', - 124: 'pokemaniac', - 125: 'firebreather', - 126: 'burglar', - 127: 'biker-gen4', - 128: 'skierf', - 129: 'boarder', - 130: 'rocketgrunt', - 131: 'rocketgruntf', - 132: 'archer', - 133: 'ariana', - 134: 'proton', - 135: 'petrel', - 136: 'eusine', - 137: 'lucas-gen4pt', - 138: 'dawn-gen4pt', - 139: 'madame-gen4', - 140: 'waiter-gen4', - 141: 'falkner', - 142: 'bugsy', - 143: 'whitney', - 144: 'morty', - 145: 'chuck', - 146: 'jasmine', - 147: 'pryce', - 148: 'clair', - 149: 'will', - 150: 'koga', - 151: 'bruno', - 152: 'karen', - 153: 'lance', - 154: 'brock', - 155: 'misty', - 156: 'ltsurge', - 157: 'erika', - 158: 'janine', - 159: 'sabrina', - 160: 'blaine', - 161: 'blue', - 162: 'red', - 163: 'red', - 164: 'silver', - 165: 'giovanni', - 166: 'unknownf', - 167: 'unknown', - 168: 'unknown', - 169: 'hilbert', - 170: 'hilda', - 171: 'youngster', - 172: 'lass', - 173: 'schoolkid', - 174: 'schoolkidf', - 175: 'smasher', - 176: 'linebacker', - 177: 'waiter', - 178: 'waitress', - 179: 'chili', - 180: 'cilan', - 181: 'cress', - 182: 'nurseryaide', - 183: 'preschoolerf', - 184: 'preschooler', - 185: 'twins', - 186: 'pokemonbreeder', - 187: 'pokemonbreederf', - 188: 'lenora', - 189: 'burgh', - 190: 'elesa', - 191: 'clay', - 192: 'skyla', - 193: 'pokemonranger', - 194: 'pokemonrangerf', - 195: 'worker', - 196: 'backpacker', - 197: 'backpackerf', - 198: 'fisherman', - 199: 'musician', - 200: 'dancer', - 201: 'harlequin', - 202: 'artist', - 203: 'baker', - 204: 'psychic', - 205: 'psychicf', - 206: 'cheren', - 207: 'bianca', - 208: 'plasmagrunt-gen5bw', - 209: 'n', - 210: 'richboy', - 211: 'lady', - 212: 'pilot', - 213: 'workerice', - 214: 'hoopster', - 215: 'scientistf', - 216: 'clerkf', - 217: 'acetrainerf', - 218: 'acetrainer', - 219: 'blackbelt', - 220: 'scientist', - 221: 'striker', - 222: 'brycen', - 223: 'iris', - 224: 'drayden', - 225: 'roughneck', - 226: 'janitor', - 227: 'pokefan', - 228: 'pokefanf', - 229: 'doctor', - 230: 'nurse', - 231: 'hooligans', - 232: 'battlegirl', - 233: 'parasollady', - 234: 'clerk', - 235: 'clerk-boss', - 236: 'backers', - 237: 'backersf', - 238: 'veteran', - 239: 'veteranf', - 240: 'biker', - 241: 'infielder', - 242: 'hiker', - 243: 'madame', - 244: 'gentleman', - 245: 'plasmagruntf-gen5bw', - 246: 'shauntal', - 247: 'marshal', - 248: 'grimsley', - 249: 'caitlin', - 250: 'ghetsis-gen5bw', - 251: 'depotagent', - 252: 'swimmer', - 253: 'swimmerf', - 254: 'policeman', - 255: 'maid', - 256: 'ingo', - 257: 'alder', - 258: 'cyclist', - 259: 'cyclistf', - 260: 'cynthia', - 261: 'emmet', - 262: 'hilbert-dueldisk', - 263: 'hilda-dueldisk', - 264: 'hugh', - 265: 'rosa', - 266: 'nate', - 267: 'colress', - 268: 'beauty-gen5bw2', - 269: 'ghetsis', - 270: 'plasmagrunt', - 271: 'plasmagruntf', - 272: 'iris-gen5bw2', - 273: 'brycenman', - 274: 'shadowtriad', - 275: 'rood', - 276: 'zinzolin', - 277: 'cheren-gen5bw2', - 278: 'marlon', - 279: 'roxie', - 280: 'roxanne', - 281: 'brawly', - 282: 'wattson', - 283: 'flannery', - 284: 'norman', - 285: 'winona', - 286: 'tate', - 287: 'liza', - 288: 'juan', - 289: 'guitarist', - 290: 'steven', - 291: 'wallace', - 292: 'bellelba', - 293: 'benga', - // Not in the existing trainer sheet... - // 294: 'ash', -} - - -const entries = []; - -for (const [num, id] of Object.entries(BattleAvatarNumbers)) { - entries[num - 1] = path.join(__dirname, "src/canonical/trainers", id + ".png"); -} - -export default { - width: 80, - height: 80, - tile: 16, - entries -}; diff --git a/ps.build.ts b/ps.build.ts deleted file mode 100644 index c17c43be..00000000 --- a/ps.build.ts +++ /dev/null @@ -1,125 +0,0 @@ - -import * as spritedata from '@smogon/sprite-data/index.ts'; - -import {gen10Modelslike} from './rules/modelslike.ts'; -import type {Sprite} from './rules/publish.ts'; -import {forEachRule, rule} from './tools/build/artifact.ts'; -import {PNG_DETERMINISTIC, base, compresspng, pad, spriteglob} from './tools/build/helpers.ts'; -import {type DeployCtx, deploy} from './tools/deploy/api.ts'; - -// PS spritesheets. The sheet tools readdir the minisprite dirs and read the -// ids off the filenames, baking those names into the sheet layout, hence -// nameSensitive. - -let sheetDeps = [ - 'data/lib/index.ts', - 'lib/root/index.ts', - 'tools/sheet/index.ts', -]; - -rule('ps-pokemon.sheet.mjs', { - display: 'ps pokemon sheet', - nameSensitive: true, - deps: ['src/minisprites/pokemon/gen6/*', 'ps-pokemon.dexnums.mjs', ...sheetDeps], - cmds: ['node tools/sheet/index.ts %f %o', compresspng({config: 'SPRITESHEET'})], -}, 'pokemonicons-sheet.png'); - -// TODO: reenable when trainers are moved -// rule("ps-trainers.sheet.mjs", { -// display: "ps trainers sheet", -// nameSensitive: true, -// cmds: ["node tools/sheet/index.ts %f %o", compresspng({config: "SPRITESHEET"})], -// }, "trainers-sheet.png"); - -rule('ps-items.sheet.mjs', { - display: 'ps items sheet', - nameSensitive: true, - deps: ['src/minisprites/items/*', ...sheetDeps], - cmds: ['node tools/sheet/index.ts %f %o', compresspng({config: 'SPRITESHEET'})], -}, 'itemicons-sheet.png'); - -// PS pokeball icons; input order is the sheet order. - -rule([ - 'src/_uncategorized/noncanonical/ui/battle/Ball-Normal.png', - 'src/_uncategorized/noncanonical/ui/battle/Ball-Sick.png', - 'src/_uncategorized/noncanonical/ui/battle/Ball-Null.png', -], { - display: 'pokemonicons-pokeball-sheet', - cmds: [ - `magick convert ${PNG_DETERMINISTIC} -background transparent -gravity center -extent 40x30 %f +append %o`, - compresspng({config: 'SPRITESHEET'}), - ], -}, 'pokemonicons-pokeball-sheet.png'); - -// Padded Dex, plus missing CAPs backfilled from the gen5/model gifs. - -let dex = forEachRule('src/dex/*', { - display: 'pad dex %f', - cmds: [pad({w: 120, h: 120}), compresspng({config: 'DEX'})], -}, '%b'); - -let dexSet = new Set(dex.map(base)); -let dexMissing = []; -for (let file of spriteglob(['src/sprites/gen5/*.gif', 'src/models/*.gif'], {b: false, s: false})) { - if (!dexSet.has(base(file))) { - dexMissing.push(file); - dexSet.add(base(file)); - } -} - -forEachRule(dexMissing, { - display: 'missing dex %B', - cmds: [ - `magick convert "%f[0]" ${PNG_DETERMINISTIC} -trim %o`, - `magick mogrify ${PNG_DETERMINISTIC} -background transparent -gravity center -resize "120x120>" -extent 120x120 %o`, - compresspng({config: 'DEX'}), - ], -}, '%B.png'); - -// ani/: the models plus champions backfill, under PS ids. - -let aniChampions = gen10Modelslike(); - -deploy(async ctx => { - let seenModels = new Set(); - - for (let f of await ctx.list('src/models')) { - seenModels.add(f.name); - psSpritecopy(ctx, f, 'ani'); - } - - for (let f of aniChampions) { - if (seenModels.has(f.name)) { - continue; - } - seenModels.add(f.name); - psSpritecopy(ctx, f, 'ani'); - } - - // TODO: ship the padded dex, sheets, trainers, types/categories when - // the PS deploy is revived; the rules above keep them building. -}); - -// PS runs the words of a name together, where the smogon aliases dash them. -function psSpritecopy(ctx: DeployCtx, f: Sprite, dir: string): void { - let sn = spritedata.parseFilename(f.name); - - // Skip asymmetrical for now - if (sn.extra.has('a') || sn.extra.has('b') || sn.extra.has('s')) { - return; - } - - if (sn.kind !== 's') { - // Skip this, we don't use Unknown/Substitute - return; - } - - let name = spritedata.publishedName(sn, spritedata.psid); - - if (f.ext === null) { - throw new Error(`Sprite ${f.name} has no extension`); - } - ctx.copy(f, `${dir}/${name}.${f.ext}`); -} - diff --git a/src/README.md b/src/README.md index 121e011f..e1a56d69 100644 --- a/src/README.md +++ b/src/README.md @@ -18,8 +18,8 @@ Formes ride in `-o`, so `Charizard-Mega-X`'s back sprite is `scharizard-omega_x-b.gif` and every Charizard is `scharizard-*`. The forme comes first so a forme's sprites sort together. -`tools/spritedata/names.ts` prints every filename pokemon-showdown implies, if -you need to check a directory against it. +`tools/deploy/coverage.ts` prints what a deploy would delete off the server, if +you need to check the build against what is actually being served. # Flags diff --git a/tools/spritedata/coverage.ts b/tools/deploy/coverage.ts similarity index 95% rename from tools/spritedata/coverage.ts rename to tools/deploy/coverage.ts index 16acc110..846d03a3 100644 --- a/tools/spritedata/coverage.ts +++ b/tools/deploy/coverage.ts @@ -11,9 +11,6 @@ import {spawnSync} from 'node:child_process'; // when these two sets published through Manifest, and the pre-rename spellings // below that nothing has asked for in years. Anything else is a hole in the // build, and this finds it before rsync does. -// -// names.ts answers the same question against pokemon-showdown; this one -// answers it against what is actually being served. let dir = process.argv[2]; let remote = process.argv[3] ?? 'smogon:/smog2/sprites'; @@ -57,7 +54,7 @@ for (let set of ['xy', 'xyicons']) { let stamped = 0; let backlog = 0; - let unexplained = []; + let unexplained: string[] = []; for (let line of rsync.stdout.split('\n')) { let m = /^\*deleting +(.*)$/.exec(line); if (!m) continue; diff --git a/tools/sheet/index.ts b/tools/sheet/index.ts deleted file mode 100644 index 2acc1acd..00000000 --- a/tools/sheet/index.ts +++ /dev/null @@ -1,58 +0,0 @@ - -import * as cp from 'node:child_process'; -import * as path from 'node:path'; - -let sheetjs = process.argv[2]; -let dest = process.argv[3]; - -if (!sheetjs || !dest) { - throw new Error(`node tools/sheet `); -} - -// Must have file:/// for Windows -let {default: sheet} = await import(path.join('file:///', process.cwd(), sheetjs)); - -for (let i = 0; i < sheet.entries.length; i++) { - if (sheet.entries[i] === undefined) - throw new Error(`gap: ${i}`); - if (sheet.entries[i] === null) { - // ImageMagick blank entry - sheet.entries[i] = 'xc:transparent'; - } -} - -// Write list of filenames to stdin, Windows can't handle large cli arg lists. -// Before we wrote a tmp file and deleted it afterwards, but apparently tup -// can't track unlinkSync on Windows? -let proc = cp.spawn('magick', [ - 'montage', - '@-', - // Keep sheet bytes deterministic for the content-addressed build. - '-define', 'png:exclude-chunks=date,time', - '-background', 'transparent', - '-geometry', `${sheet.width}x${sheet.height}>`, - '-gravity', 'center', - '-tile', `${sheet.tile}x`, - '-depth', '8', - dest -], { - stdio: ['pipe', 'inherit', 'inherit'] -}); - -// Write one at a time to avoid "malloc(): corrupted top size" error -for (let entry of sheet.entries) { - if (!proc.stdin.write(entry + "\n")) { - // imagick doesn't like it when it receives the input too fast. This - // seems to avoid a realloc() invalid next size error. - await new Promise(resolve => { - proc.stdin.once('drain', resolve); - }); - } -} -proc.stdin.end(); - -proc.on('exit', (code, signal) => { - if (code || signal) { - process.exitCode = 1; - } -}); diff --git a/tools/sheet/package.json b/tools/sheet/package.json deleted file mode 100644 index 5432c01b..00000000 --- a/tools/sheet/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "type": "module", - "dependencies": { - "@types/node": "^24.10.7" - } -} diff --git a/tools/sheet/tsconfig.json b/tools/sheet/tsconfig.json deleted file mode 100644 index 3e88c180..00000000 --- a/tools/sheet/tsconfig.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "../../tsconfig-base" -} diff --git a/tools/spritedata/dexnums.ts b/tools/spritedata/dexnums.ts deleted file mode 100644 index 0d3e6cde..00000000 --- a/tools/spritedata/dexnums.ts +++ /dev/null @@ -1,36 +0,0 @@ -import {createRequire} from 'node:module'; -import * as path from 'node:path'; - -// Regenerates ps-pokemon.dexnums.mjs from a pokemon-showdown checkout: -// -// node tools/spritedata/dexnums.ts ~/smogon/pokemon-showdown > ps-pokemon.dexnums.mjs -// -// The PS icon sheet puts a base species at the slot named by its dex number, -// and only alt formes need the hand-kept index table in ps-pokemon.sheet.mjs. - -type PokedexEntry = { - num: number, - name: string, - baseSpecies?: string -}; - -let ps = process.argv[2]; -if (!ps) { - throw new Error('usage: node tools/spritedata/dexnums.ts '); -} - -let require = createRequire(import.meta.url); -let {Pokedex} = require(path.resolve(ps, 'dist/data/pokedex.js')) as - {Pokedex: Record}; - -let out = ''; -out += '// Generated by tools/spritedata/dexnums.ts; do not edit.\n'; -out += '// PS id of every base species -> its national dex number.\n\n'; -out += 'export const DEX_NUMS = {\n'; -for (let {num, name, baseSpecies} of Object.values(Pokedex)) { - if (baseSpecies) continue; - out += `\t${name.toLowerCase().replace(/[^a-z0-9]+/g, '')}: ${num},\n`; -} -out += '};\n'; - -process.stdout.write(out); diff --git a/tools/spritedata/names.ts b/tools/spritedata/names.ts deleted file mode 100644 index cc7057d1..00000000 --- a/tools/spritedata/names.ts +++ /dev/null @@ -1,20 +0,0 @@ -import {formatFilename} from '@smogon/sprite-data/index.ts'; - -import {spriteFiles} from './pokedex.ts'; - -// Every sprite filename pokemon-showdown implies, one per line: -// -// node tools/spritedata/names.ts ~/smogon/pokemon-showdown | sort > /tmp/want -// ls src/models | sed 's/\.[^.]*$//' | cut -d- -f1 | sort -u > /tmp/have -// -// Nothing in the build validates a filename any more, so this is how you check -// a directory against the source of truth. - -let ps = process.argv[2]; -if (!ps) { - throw new Error('usage: node tools/spritedata/names.ts '); -} - -for (let file of spriteFiles(ps)) { - process.stdout.write(`${formatFilename(file)}\n`); -} diff --git a/tools/spritedata/package.json b/tools/spritedata/package.json deleted file mode 100644 index ace9f442..00000000 --- a/tools/spritedata/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "module", - "dependencies": { - "@smogon/sprite-data": "workspace:*", - "@smogon/sprite-root": "workspace:*", - "@types/node": "^24.10.7" - } -} diff --git a/tools/spritedata/pokedex.ts b/tools/spritedata/pokedex.ts deleted file mode 100644 index 4d92c6d5..00000000 --- a/tools/spritedata/pokedex.ts +++ /dev/null @@ -1,99 +0,0 @@ -import {createRequire} from 'node:module'; -import * as path from 'node:path'; - -import {encode, type InputSpriteFilename} from '@smogon/sprite-data/index.ts'; - -// Everything the sprite tree wants from a pokemon-showdown checkout: which -// sprites should exist, and what each one is called. - -export type Specie = { - num: number, - formeNum: number, - base: string, - forme: string -}; - -export type Item = { - num: number, - names: string[] -}; - -type PokedexEntry = { - num: number, - name: string, - baseSpecies?: string, - formeOrder?: string[] -}; - -type ItemsEntry = { - num: number, - name: string -}; - -function load(ps: string, file: string, key: string): Record { - let require = createRequire(import.meta.url); - let mod = require(path.resolve(ps, 'dist/data', file)) as Record>; - let table = mod[key]; - if (table === undefined) { - throw new Error(`${file} has no ${key} export; is ${ps} built?`); - } - return table; -} - -export function species(ps: string): Specie[] { - let out: Specie[] = []; - for (let {num, name, baseSpecies, formeOrder} of Object.values(load(ps, 'pokedex.js', 'Pokedex'))) { - // Formes are enumerated from their base species, not on their own. - if (baseSpecies) continue; - for (let [formeNum, formeName] of (formeOrder ?? [name]).entries()) { - // Gmax is a flag, not a forme. - if (formeName.endsWith('-Gmax')) continue; - out.push({num, formeNum, base: name, forme: formeName.slice(name.length + 1)}); - } - } - return out; -} - -export function items(ps: string): Item[] { - // One sprite per item number, so items sharing a number share a sprite and - // collect their names: Aspear Berry is also Burnt Berry. - let byNum = new Map(); - for (let {num, name} of Object.values(load(ps, 'items.js', 'Items'))) { - let item = byNum.get(num); - if (item) { - item.names.push(name); - } else { - byNum.set(num, {num, names: [name]}); - } - } - return [...byNum.values()]; -} - -// The filename each sprite should have. PS's formeOrder repeats a name where -// the games gave one forme several slots (Zygarde's Power Construct pair, -// Minior's seven meteors), and nothing in the data tells those apart, so the -// lowest slot keeps the bare name and the rest carry the slot in -c. -export function spriteFiles(ps: string): InputSpriteFilename[] { - let out: InputSpriteFilename[] = []; - let seen = new Set(); - - for (let {formeNum, base, forme} of species(ps)) { - let name = encode(base); - let extra = new Map(); - if (forme) { - extra.set('o', encode(forme)); - } - let key = `${name}-${extra.get('o') ?? ''}`; - if (seen.has(key)) { - extra.set('c', String(formeNum)); - } - seen.add(key); - out.push({kind: 's', name, extra}); - } - - for (let {names} of items(ps)) { - out.push({kind: 'i', name: encode(names[0]!)}); - } - - return out; -} diff --git a/tools/spritedata/rename.ts b/tools/spritedata/rename.ts deleted file mode 100644 index cbfb8b4a..00000000 --- a/tools/spritedata/rename.ts +++ /dev/null @@ -1,100 +0,0 @@ -import * as fs from 'node:fs'; -import * as path from 'node:path'; - -import {encode, formatFilename, parseFilename, type InputSpriteFilename} from '@smogon/sprite-data/index.ts'; -import root from '@smogon/sprite-root/index.ts'; - -import {items, species, spriteFiles} from './pokedex.ts'; - -// One-off: renames src/ off the packed numeric ids onto encoded names. -// -// node tools/spritedata/rename.ts ~/smogon/pokemon-showdown [--dry-run] -// -// Kept for the record rather than for reuse. The old id packed the dex number -// and the forme index into one number, `s((|num| << 5) + formeNum)` with bit 29 -// marking the negative nums CAP and fakemon use, and `i(|num|)` for items; -// src/previews/gen8 wrote the same number with no prefix at all. Reconstruct -// those here and map each to the name the file should have had. - -let ps = process.argv[2]; -let dryRun = process.argv.includes('--dry-run'); -if (!ps) { - throw new Error('usage: node tools/spritedata/rename.ts [--dry-run]'); -} - -function legacy(num: number, formeNum: number): number { - let sid = (Math.abs(num) << 5) + formeNum; - return num < 0 ? sid | (1 << 29) : sid; -} - -// spriteFiles() lists species then items, each in the order its own reader -// yields, so the ids line up positionally. -let files = spriteFiles(ps); -let sids = [ - ...species(ps).map(s => `s${legacy(s.num, s.formeNum)}`), - ...items(ps).map(i => `i${i.num < 0 ? Math.abs(i.num) | (1 << 29) : i.num}`), -]; -if (sids.length !== files.length) { - throw new Error(`${sids.length} ids for ${files.length} sprites`); -} - -let byId = new Map(); -for (let [i, sid] of sids.entries()) { - byId.set(sid, files[i]!); -} - -let renames: [string, string][] = []; -let missing = new Set(); - -function walk(dir: string): void { - for (let ent of fs.readdirSync(dir, {withFileTypes: true})) { - let p = path.join(dir, ent.name); - if (ent.isDirectory()) { - // Its own naming scheme, and nothing parses it. - if (path.basename(p) !== '_uncategorized') walk(p); - continue; - } - if (path.extname(p) === '.md') continue; - - let ext = path.extname(ent.name); - let stem = ent.name.slice(0, -ext.length); - let [id, ...flags] = stem.split('-'); - - let file: InputSpriteFilename; - if (id!.startsWith('x')) { - file = {kind: 'x', name: encode(id!.slice(1))}; - } else { - let found = byId.get(/^[0-9]+$/.test(id!) ? `s${id}` : id!); - if (!found) { - missing.add(id!); - continue; - } - file = found; - } - - let extra = new Map(file.extra); - for (let flag of flags) { - extra.set(flag.charAt(0), flag.slice(1)); - } - let renamed = formatFilename({kind: file.kind, name: file.name, extra}) + ext; - if (renamed !== ent.name) { - renames.push([p, path.join(dir, renamed)]); - } - } -} - -walk(path.join(root, 'src')); - -if (missing.size) { - throw new Error(`no sprite for ${[...missing].join(', ')}`); -} - -let taken = new Set(renames.map(([, to]) => to)); -if (taken.size !== renames.length) { - throw new Error('renames collide'); -} - -for (let [from, to] of renames) { - if (!dryRun) fs.renameSync(from, to); -} -process.stderr.write(`${dryRun ? 'would rename' : 'renamed'} ${renames.length} files\n`); diff --git a/tools/spritedata/tsconfig.json b/tools/spritedata/tsconfig.json deleted file mode 100644 index 1c7ee7cc..00000000 --- a/tools/spritedata/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../tsconfig-base", - "references": [ - {"path": "../../data/lib"}, - {"path": "../../lib/root"} - ] -} diff --git a/tsconfig-workspace.json b/tsconfig-workspace.json index d25a7ab4..5fdc93a0 100644 --- a/tsconfig-workspace.json +++ b/tsconfig-workspace.json @@ -4,9 +4,7 @@ {"path": "./tsconfig.json"}, {"path": "tools/build"}, {"path": "tools/deploy"}, - {"path": "tools/sheet"}, {"path": "tools/smogdexspritesheet"}, - {"path": "tools/spritedata"}, {"path": "tools/trim"}, {"path": "lib/root"}, {"path": "data/lib"},