Files
pokemon-namegen/app.js
T

133 lines
6.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
(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 = {"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 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();
})();