(function () { // Positions are 1-indexed to match how the original tool (and the // in-game name entry screen) describes trainer-name character slots. // Position 1 is never read by the glitch; it's rendered but inert. var SPECIES_POSITIONS = [3, 5, 7]; var LEVEL_POSITIONS = [2, 4, 6]; var ROLE_LABEL = { 1: "unused", 2: "level 1", 3: "species 1", 4: "level 2", 5: "species 2", 6: "level 3", 7: "species 3" }; // Symbols not present on a standard keyboard; everything else usable // in a name (letters, digits, ( ) : ; [ ] ! - ? . / ,) can just be typed. var SYMBOL_BUTTONS = ["PK", "MN", "×", "♂", "♀"]; var FALLBACK_SPECIES = "MissingNo."; var FALLBACK_LEVEL = 127; // Some glitch species (only reachable via the digit characters) are // documented as freezing the real game outright, not just glitching it. var FREEZE_KEYWORD = "Freezes"; var charmap = {"A":{"decimal":128,"pokemon":"Golduck"},"B":{"decimal":129,"pokemon":"Hypno"},"C":{"decimal":130,"pokemon":"Golbat"},"D":{"decimal":131,"pokemon":"Mewtwo"},"E":{"decimal":132,"pokemon":"Snorlax"},"F":{"decimal":133,"pokemon":"Magikarp"},"G":{"decimal":134,"pokemon":"MissingNo."},"H":{"decimal":135,"pokemon":"MissingNo."},"I":{"decimal":136,"pokemon":"Muk"},"J":{"decimal":137,"pokemon":"MissingNo."},"K":{"decimal":138,"pokemon":"Kingler"},"L":{"decimal":139,"pokemon":"Cloyster"},"M":{"decimal":140,"pokemon":"MissingNo."},"N":{"decimal":141,"pokemon":"Electrode"},"O":{"decimal":142,"pokemon":"Clefable"},"P":{"decimal":143,"pokemon":"Weezing"},"Q":{"decimal":144,"pokemon":"Persian"},"R":{"decimal":145,"pokemon":"Marowak"},"S":{"decimal":146,"pokemon":"MissingNo."},"T":{"decimal":147,"pokemon":"Haunter"},"U":{"decimal":148,"pokemon":"Abra"},"V":{"decimal":149,"pokemon":"Alakazam"},"W":{"decimal":150,"pokemon":"Pidgeotto"},"X":{"decimal":151,"pokemon":"Pidgeot"},"Y":{"decimal":152,"pokemon":"Starmie"},"Z":{"decimal":153,"pokemon":"Bulbasaur"},"(":{"decimal":154,"pokemon":"Venusaur"},")":{"decimal":155,"pokemon":"Tentacruel"},":":{"decimal":156,"pokemon":"MissingNo."},";":{"decimal":157,"pokemon":"Goldeen"},"[":{"decimal":158,"pokemon":"Seaking"},"]":{"decimal":159,"pokemon":"MissingNo."},"a":{"decimal":160,"pokemon":"MissingNo."},"b":{"decimal":161,"pokemon":"MissingNo."},"c":{"decimal":162,"pokemon":"MissingNo."},"d":{"decimal":163,"pokemon":"Ponyta"},"e":{"decimal":164,"pokemon":"Rapidash"},"f":{"decimal":165,"pokemon":"Rattata"},"g":{"decimal":166,"pokemon":"Raticate"},"h":{"decimal":167,"pokemon":"Nidorino"},"i":{"decimal":168,"pokemon":"Nidorina"},"j":{"decimal":169,"pokemon":"Geodude"},"k":{"decimal":170,"pokemon":"Porygon"},"l":{"decimal":171,"pokemon":"Aerodactyl"},"m":{"decimal":172,"pokemon":"MissingNo."},"n":{"decimal":173,"pokemon":"Magnemite"},"o":{"decimal":174,"pokemon":"MissingNo."},"p":{"decimal":175,"pokemon":"MissingNo."},"q":{"decimal":176,"pokemon":"Charmander"},"r":{"decimal":177,"pokemon":"Squirtle"},"s":{"decimal":178,"pokemon":"Charmeleon"},"t":{"decimal":179,"pokemon":"Wartortle"},"u":{"decimal":180,"pokemon":"Charizard"},"v":{"decimal":181,"pokemon":"MissingNo."},"w":{"decimal":182,"pokemon":"Kabutops Fossil"},"x":{"decimal":183,"pokemon":"Aerodactyl Fossil"},"y":{"decimal":184,"pokemon":"Ghost"},"z":{"decimal":185,"pokemon":"Oddish"},"PK":{"decimal":225,"pokemon":"Rival (#1)"},"MN":{"decimal":226,"pokemon":"Professor Oak"},"-":{"decimal":227,"pokemon":"Chief"},"?":{"decimal":230,"pokemon":"Rocket"},"!":{"decimal":231,"pokemon":"Cooltrainer Male"},"♂":{"decimal":239,"pokemon":"Blaine"},"×":{"decimal":241,"pokemon":"Gentleman"},".":{"decimal":242,"pokemon":"Rival (#2)"},"/":{"decimal":243,"pokemon":"Rival (Final)"},",":{"decimal":244,"pokemon":"Lorelei"},"♀":{"decimal":245,"pokemon":"Channeler"},"0":{"decimal":246,"pokemon":"Agatha"},"1":{"decimal":247,"pokemon":"Lance"},"2":{"decimal":248,"pokemon":"Glitch - Freezes Game"},"3":{"decimal":249,"pokemon":"Glitch - Freezes Game"},"4":{"decimal":250,"pokemon":"Glitch - Freezes Game"},"5":{"decimal":251,"pokemon":"Glitch Trainer (Can be used for ZZAZZ Glitch)"},"6":{"decimal":252,"pokemon":"Glitch Trainer (Can be used for ZZAZZ Glitch)"},"7":{"decimal":253,"pokemon":"Glitch Trainer (Freezes after battle)"},"8":{"decimal":254,"pokemon":"Glitch Trainer (Can be used for ZZAZZ Glitch)"},"9":{"decimal":255,"pokemon":"Glitch Trainer (Can be used for ZZAZZ Glitch)"}}; var nameRow = document.getElementById("name-row"); var results = document.getElementById("results"); for (var i = 1; i <= 7; i++) { (function (i) { var slot = document.createElement("div"); slot.className = "slot"; var index = document.createElement("div"); index.className = "index"; index.textContent = "char " + i; slot.appendChild(index); var role = document.createElement("div"); role.className = "role"; role.textContent = ROLE_LABEL[i]; slot.appendChild(role); var input = document.createElement("input"); input.type = "text"; input.maxLength = 2; input.autocomplete = "off"; input.spellcheck = false; input.id = "char" + i; input.dataset.pos = i; slot.appendChild(input); if (i > 1) { var symbols = document.createElement("div"); symbols.className = "symbols"; SYMBOL_BUTTONS.forEach(function (sym) { var btn = document.createElement("button"); btn.type = "button"; btn.textContent = sym; btn.addEventListener("click", function () { input.value = sym; decode(); focusNext(i); }); symbols.appendChild(btn); }); slot.appendChild(symbols); } nameRow.appendChild(slot); })(i); } nameRow.addEventListener("input", function (event) { if (event.target.tagName !== "INPUT") return; var pos = parseInt(event.target.dataset.pos, 10); if (event.target.value.length >= 1) { focusNext(pos); } decode(); }); function focusNext(pos) { if (pos < 7) { document.getElementById("char" + (pos + 1)).focus(); } } function lookup(token) { if (!token) return null; return charmap[token] || null; } function decode() { var chars = []; for (var i = 1; i <= 7; i++) { chars[i] = document.getElementById("char" + i).value; } results.innerHTML = ""; for (var pair = 0; pair < 3; pair++) { var speciesPos = SPECIES_POSITIONS[pair]; var levelPos = LEVEL_POSITIONS[pair]; var speciesEntry = lookup(chars[speciesPos]); var levelEntry = lookup(chars[levelPos]); var species = speciesEntry ? speciesEntry.pokemon : FALLBACK_SPECIES; var level = levelEntry ? levelEntry.decimal : FALLBACK_LEVEL; var freezes = species.indexOf(FREEZE_KEYWORD) !== -1; document.getElementById("char" + speciesPos).classList.toggle("char-freeze", freezes); var card = document.createElement("div"); card.className = freezes ? "encounter encounter--freeze" : "encounter"; var from = document.createElement("div"); from.className = "from"; from.textContent = "from char " + speciesPos + " & char " + levelPos; card.appendChild(from); var speciesEl = document.createElement("div"); speciesEl.className = "species"; speciesEl.textContent = species; card.appendChild(speciesEl); var levelEl = document.createElement("div"); levelEl.className = "level"; levelEl.textContent = "Level " + level; card.appendChild(levelEl); if (freezes) { var warning = document.createElement("div"); warning.className = "freeze-warning"; warning.textContent = "⚠ Freezes the game on real hardware — don't use this in-game"; card.appendChild(warning); } results.appendChild(card); } } decode(); })();