Project Plateau
Project Plateau: four glass plates, one living valley, and the road back to camp.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗A daily MapleStory boss guessing game. Play at https://ima.moe/maplewordle/
(the github.io address redirects there and carries saves along, see move.js)
Guess the boss using hints for World, Gender, Region, Phases, HP and Entry Level. Modes: Story (unlimited guesses), Normal, Hard and Extreme. A new boss every day at 00:00 UTC.
Boss data lives in data/bosses.json (sources: maplestorywiki.net, Namu Wiki, Bahamut TMS HP table).
Guess the Class (class.html, class.js; served at /maplewordle/class): guess the class from Faction, Job Branch, Main Stat,
Release Year (GMS) and Region, 5 guesses. The word bank is in tools/build_classes.py; run
python3 tools/build_classes.py data to rebuild data/classes.json and data/classes.md.
Puzzle #1 is FIRST_DAY in class.js.
Suggestions or feedback? Join the Discord!
The "Everyone's results" bars after a game come from a small Cloudflare Worker with a D1 database (worker/).
Each browser sends its result once per mode per day. Until STATS_URL in script.js is set, the bars stay hidden.
maplewordle, open its Console, and run worker/schema.sql.maplewordle-stats → Deploy → Edit code, paste worker/stats.js, Deploy.DB, database maplewordle. Deploy again.https://maplewordle-stats.<you>.workers.dev/) into STATS_URL in script.js.Settings → Account: a username (1-10 letters or numbers) and password (1-16 characters), no email. The account keeps
everything the site saves in the browser (the mapleWordle:* keys, except sound volume), so it can be played on
other devices. Browser side: account.js; server: worker/account.js, in the same D1 database as the stats.
maplewordle → Console: run worker/account-schema.sql (it's one line per statement, so it pastes as one line).maplewordle-account → Deploy → Edit code, paste worker/account.js, Deploy.DB, database maplewordle.ADMIN_KEY, any long random text. Deploy.ACCOUNT_URL in account.js is the Worker's URL.Achievements' Master rank: GET /top on the same Worker returns the site's top 10 by achievement points (1,000+ AP),
read from each account's mapleWordle:ap key (the site saves it with the achievements) and kept at Cloudflare's edge for 5
minutes. Changing worker/account.js: Edit code, paste it again, Deploy (no database change needed).
Achievements' Global Completion Rate (hover a cup): GET /rates on the same Worker counts how many accounts have each
achievement (from each account's mapleWordle:achv), out of the accounts that have opened Achievements; also cached 5 minutes.
Admin page: admin.html (not linked anywhere). Type /find user yuki, /find uid 1, /find meso+ 5000,
/find meso- 100 or /find all to look accounts up, and /reset yuki temp123 to give someone a new password
(it logs them out everywhere). /delete yuki deletes an account for good (it asks you to type the name first). It asks for the ADMIN_KEY once and keeps it in that browser.
Or without the page: forgot a password (asked on Discord)? Set a new one, which also logs that account out everywhere:
curl -X POST https://maplewordle-account.hanayuki.workers.dev/admin/reset -H "X-Admin-Key: YOUR_KEY" -H "Content-Type: application/json" -d "{\"name\":\"theirname\",\"pass\":\"newpass\"}"
Everyone's accounts and their numbers (UID), in the D1 Console:
SELECT id, name, datetime(created, 'unixepoch') AS made FROM users ORDER BY id;
Add it to the list in tools/build_bosses.py with since="YYYY-MM-DD" (the first day it can be an answer), e.g.
b("New Boss", GR, "Female", "KMS only", ALLP, {"Hard": (300, 2, [10*Q, 12*Q])}, since="2027-01-20"),
then run python3 tools/build_bosses.py data. Past days stay the same, and the new boss joins the bosses still
left in the current cycle (it doesn't wait for the next one).
animation.html / animation.js: guess the class from its skill clips. Unlimited guesses; each wrong guess unlocks
the next hint (clip 2 if the class has one, then one category each in a random order per day, then the first letter). A class
can be the answer once it has clip 1. Add a clip (needs ffmpeg; makes a small WebM, an MP4 for older iPhones and a
poster image under videos/anim/, and records it in data/animation.json):
python3 tools/add_clip.py "Hero" raw-video.mp4 --start 2.5 --end 7 --credit Name --credit-image still.png --day
python3 tools/add_clip.py "Hero" second-clip.mp4 --puzzle 3 # clip 2 for puzzle 3
Classes added after launch: add --since YYYY-MM-DD so past days keep their answers. Puzzle #1 is FIRST_DAY in
animation.js.
Each game is its own page (like index.html and class.html). Put the same #games button row on every page:
the current game gets class="on", the others link to their page (onclick="location.href='class'"), and ones that
aren't ready are disabled with <small>Coming soon</small>. When a game goes live, replace its disabled button
with a link on every page. The hover highlight comes from style.css automatically.
Stats: the Worker (worker/stats.js) already accepts sound (6 guesses), map (unlimited), and any other short lowercase
mode name with up to 999 guesses, so a new game's "Everyone's results" work without redeploying it. Only redeploy
if a game needs a different guess limit than that. Bonus rounds post {"bonus": true|false} for any mode; the reply's
bonus gives the right / wrong counts (BGM Clip shows them as the Bonus row).