From cdfcf749c3e1998685276748a8a2585b7d39c5ab Mon Sep 17 00:00:00 2001 From: Brian Rogers Date: Wed, 8 Jul 2026 12:54:45 -0600 Subject: [PATCH] inline the character map, use vanilla js --- app.js | 213 ++++++++++++++++++++++++++++++++------------------------- 1 file changed, 118 insertions(+), 95 deletions(-) diff --git a/app.js b/app.js index 1139639..1a77d5b 100644 --- a/app.js +++ b/app.js @@ -1,109 +1,132 @@ -$(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; +(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; - var charmap = {}; - var $nameRow = $("#name-row"); - var $results = $("#results"); +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)"}}; - for (var i = 1; i <= 7; i++) { - var $slot = $('
'); - $slot.append('
char ' + i + '
'); - $slot.append('
' + ROLE_LABEL[i] + '
'); +var nameRow = document.getElementById("name-row"); +var results = document.getElementById("results"); - var $input = $('') - .attr("id", "char" + i) - .data("pos", i); - $slot.append($input); +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 = $('
'); + var symbols = document.createElement("div"); + symbols.className = "symbols"; SYMBOL_BUTTONS.forEach(function (sym) { - var $btn = $('').text(sym); - $btn.on("click", function () { - $input.val($(this).text()); + var btn = document.createElement("button"); + btn.type = "button"; + btn.textContent = sym; + btn.addEventListener("click", function () { + input.value = sym; decode(); focusNext(i); }); - $symbols.append($btn); + symbols.appendChild(btn); }); - $slot.append($symbols); + slot.appendChild(symbols); } - $nameRow.append($slot); + 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); } - - $nameRow.on("input", "input", function () { - var pos = $(this).data("pos"); - if (this.value.length >= 1) { - focusNext(pos); - } - decode(); - }); - - function focusNext(pos) { - if (pos < 7) { - $("#char" + (pos + 1)).trigger("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] = $("#char" + i).val(); - } - - $results.empty(); - 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 $card = $('
'); - $card.append('
from char ' + speciesPos + ' & char ' + levelPos + '
'); - $card.append('
' + escapeHtml(species) + '
'); - $card.append('
Level ' + level + '
'); - $results.append($card); - } - } - - function escapeHtml(str) { - return $("
").text(str).html(); - } - - $.getJSON("data/charmap.json") - .done(function (data) { - charmap = data; - decode(); - }) - .fail(function () { - $("#load-error").show(); - }); + 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 card = document.createElement("div"); + card.className = "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); + + results.appendChild(card); + } +} + +decode(); +})();