// Wordra game engine: dictionary, board generation, scoring, hooks
// Shared across all screens.

const WORDRA_DICT_EN = new Set([
  // common 3-7 letter english words for the prototype
  "ace","act","add","age","ago","aid","aim","air","all","ant","any","ape","arc","are","ark","arm","art","ash","ask","ate","awe",
  "bad","bag","bar","bat","bay","bed","bee","beg","bet","bid","big","bin","bit","boa","bob","bog","bow","box","boy","bud","bug","bum","bun","bus","but","buy","bye",
  "cab","can","cap","car","cat","cob","cod","cog","con","cop","cot","cow","cry","cub","cue","cup","cut",
  "dab","dad","dam","day","den","dew","did","die","dig","dim","din","dip","doe","dog","don","dot","dry","dub","due","dug","duo","dye",
  "ear","eat","ebb","ego","elf","elk","elm","emu","end","eon","era","eve","eye",
  "fad","fan","far","fat","fax","fed","fee","few","fib","fig","fin","fir","fit","fix","flu","fly","foe","fog","for","fox","fry","fun","fur",
  "gag","gal","gap","gas","gel","gem","get","gig","gin","got","gum","gun","gut","guy","gym",
  "had","ham","has","hat","hay","hen","her","hey","hid","him","hip","his","hit","hog","hop","hot","how","hub","hug","hum","hut",
  "ice","icy","ill","imp","ink","inn","ion","ire","irk","its","ivy",
  "jab","jam","jar","jaw","jay","jet","jig","job","jog","joy","jug","jut",
  "keg","key","kid","kin","kit",
  "lab","lad","lag","lap","law","lay","led","leg","let","lid","lie","lip","lit","log","lot","low",
  "mad","man","map","mar","mat","may","men","met","mid","mix","mob","mod","mom","mop","mud","mug","mum",
  "nab","nag","nap","net","new","nib","nip","nod","nor","not","now","nub","nun","nut",
  "oak","oar","oat","odd","ode","off","oft","oil","old","one","opt","orb","ore","our","out","owe","owl","own",
  "pad","pal","pan","par","pat","paw","pay","pea","peg","pen","pet","pew","pie","pig","pin","pit","ply","pod","pop","pot","pow","pry","pub","pug","pun","pup","put",
  "rag","ram","ran","rap","rat","raw","ray","red","rib","rid","rig","rim","rip","rob","rod","roe","row","rub","rug","rum","run","rut","rye",
  "sad","sag","sap","sat","saw","say","sea","see","set","sew","she","shy","sin","sip","sir","sit","six","ski","sky","sly","sob","son","sop","sow","soy","spa","spy","sty","sub","sue","sum","sun","sup",
  "tab","tad","tag","tan","tap","tar","tax","tea","ted","tee","ten","the","thy","tic","tie","tin","tip","toe","ton","too","top","tot","tow","toy","try","tub","tug","two",
  "udo","ugh","uke","ump","urn","use",
  "van","vat","vet","via","vie","vow",
  "wad","wag","war","was","wax","way","web","wed","wee","wet","who","why","wig","win","wit","woe","wok","won","woo","wow","wry",
  "yak","yam","yap","yaw","yea","yen","yes","yet","yip","you","yum",
  "zap","zip","zit","zoo",
  // 4 letters
  "able","acid","acre","aero","aged","aide","aids","ails","aims","airs","airy","ajar","akin","alas","alps","also","alto","ants","apes","apex","apse","aqua","arch","arcs","area","ares","arks","arms","army","arts","ashy","asks","atom","atop","aunt","auto","aver","aves","avid","avow","away","awed","axed","axes","axis","axle",
  "babe","baby","back","bade","bags","bail","bait","bake","bald","bale","ball","balm","band","bane","bang","bank","barb","bard","bare","bark","barn","bars","base","bash","bask","bass","bath","bats","bawl","bays","bead","beak","beam","bean","bear","beat","beds","beef","been","beep","beer","bees","begs","bell","belt","bend","bent","best","beta","bets","bias","bibs","bide","bids","bike","bile","bilk","bill","bind","bins","bird","bite","bits","blab","bled","blew","blip","blob","bloc","blot","blow","blue","blur","boar","boat","bobs","bode","body","bogs","boil","bold","bolt","bomb","bond","bone","bong","bonk","bony","book","boom","boon","boor","boos","boot","bops","bore","born","boss","both","bout","bowl","bows","boys","brad","brag","bran","bras","brat","bray","bred","brew","brim","brow","brrr","buck","buds","buff","bugs","bulb","bulk","bull","bump","bums","bums","bunk","buns","buoy","burl","burn","burp","burr","bury","bus","bush","bust","busy","butt","buys","buzz","byte",
  "cabs","cage","cake","calf","call","calm","came","camp","cane","cans","cape","caps","card","care","carp","cars","cart","case","cash","cask","cast","cats","cave","cede","cell","cent","chap","char","chat","chef","chew","chic","chin","chip","chop","chow","chub","chug","chum","cite","city","clad","clam","clan","clap","claw","clay","clef","clip","clog","clop","clot","cloy","club","clue","clug","coal","coat","coax","cobs","cock","coda","code","cods","coed","cog","cogs","coil","coin","coke","cola","cold","cole","colt","coma","comb","come","cone","cons","cook","cool","coop","cope","cops","copy","cord","core","cork","corn","cost","cosy","cots","cove","cowl","cows","cozy","crab","cram","crap","crew","crib","crop","crow","crud","crux","cube","cubs","cuds","cued","cues","cuff","cull","cult","cups","curb","curd","cure","curl","curs","curt","cusp","cute","cuts","czar",
  "dabs","daft","dais","dale","dame","damn","damp","dams","dance","dare","dark","darn","dart","dash","data","date","dawn","days","daze","dead","deaf","deal","dean","dear","debt","deck","deed","deem","deep","deer","defy","dell","demo","dens","dent","deny","desk","dial","dice","died","dies","diet","digs","dill","dime","dims","dine","ding","dins","dint","dips","dire","dirt","disc","dish","disk","ditz","dive","dock","does","doff","dogs","doll","dome","done","dons","doom","door","dope","dose","dote","dots","dour","dove","down","doze","drab","drag","dram","drat","draw","dray","drew","drip","drop","drug","drum","duck","duct","dude","duds","duel","dues","duet","duff","duke","dull","duly","dumb","dump","dune","dung","dunk","duns","duos","dupe","dusk","dust","duty","dyed","dyes","dyke",
  "each","earl","earn","ears","ease","east","easy","eats","eave","ebbs","echo","eddy","edge","edgy","edit","eels","eery","eggs","egos","eked","ekes","elks","elms","else","emit","emus","ends","envy","eons","epic","eras","ergs","errs","euro","even","ever","eves","evil","ewer","ewes","exam","exes","exit","eyed","eyes",
  "face","fact","fade","fads","fail","fair","fake","fall","fame","fang","fans","fare","farm","fart","fast","fate","fats","faun","fawn","faze","fear","feat","feds","feed","feel","fees","feet","fell","felt","fend","fens","fern","fest","feud","fiat","fibs","fife","figs","file","fill","film","find","fine","fink","fins","fire","firm","firs","fish","fist","fits","five","fizz","flag","flak","flam","flap","flat","flaw","flax","flay","flea","fled","flee","flew","flex","flip","flit","floe","flog","flop","flow","flub","flue","flux","foal","foam","fobs","foci","foes","fogs","fogy","foil","fold","folk","fond","font","food","fool","foot","fops","ford","fore","fork","form","fort","foul","four","fowl","foxy","frat","fray","free","fret","frog","from","fuel","full","fume","fund","funk","furs","fury","fuse","fuss","futz","fuzz",
  "gaff","gage","gags","gain","gait","gala","gale","gall","gals","game","gang","gape","gaps","garb","gash","gasp","gate","gave","gawk","gays","gaze","gear","geek","gees","geld","gels","gems","gene","gent","germ","gets","ghee","gift","gigs","gill","gilt","gimp","gird","girl","gist","give","glad","glee","glen","glib","glob","glop","glow","glue","glum","glut","gnat","gnaw","goad","goal","goat","gobs","gods","goes","gold","golf","gone","gong","good","goof","gook","goon","goop","gore","gory","gosh","goth","gout","gown","grab","grad","gram","gray","grew","grey","grid","grim","grin","grip","grit","grog","grok","grub","guff","gulf","gull","gulp","guls","gums","gunk","guns","guru","gush","gust","guts","guys","gyms","gyps",
  "hack","hags","hail","hair","hake","hale","half","hall","halo","halt","hams","hand","hang","hank","hare","hark","harm","harp","hash","hasp","hate","hath","hats","haul","have","hawk","haws","hays","haze","hazy","head","heal","heap","hear","heat","heck","heed","heel","heft","heir","held","hell","helm","help","hemp","hems","hens","herb","herd","here","hero","hers","hewn","hews","hick","hide","high","hike","hill","hilt","hims","hind","hint","hips","hire","hiss","hits","hive","hoax","hobo","hobs","hock","hods","hoed","hoes","hogs","hold","hole","holy","home","hone","honk","hood","hoof","hook","hoop","hoot","hope","hops","horn","hose","host","hots","hour","hove","howl","hubs","hued","hues","huff","huge","hugs","hulk","hull","hump","hums","hung","hunk","hunt","hurl","hurt","hush","husk","huts","hymn","hype","hypo",
  "ibex","ibis","iced","ices","icky","icon","idea","ides","idle","idly","idol","iffy","ilks","ills","imps","inch","info","inks","inky","inns","into","ions","iota","ired","ires","iris","irks","iron","isle","itch","item","ivy",
  "jabs","jack","jade","jags","jail","jamb","jams","jape","jars","java","jaws","jays","jazz","jeep","jeer","jell","jerk","jest","jets","jibe","jibs","jiff","jigs","jilt","jinx","jive","jobs","jock","joey","jogs","john","join","joke","jolt","jots","jowl","joys","judo","jugs","juju","juke","july","jump","junk","jury","just","jute","jut","juts",
  "kale","keel","keen","keep","kegs","kelp","kept","keto","keys","khan","kick","kids","kiln","kilo","kilt","kind","king","kinks","kiss","kite","kits","kiwi","knee","knew","knit","knob","knot","know","kook","kudo",
  "labs","lace","lack","lacy","lads","lady","lags","laid","lain","lair","lake","lamb","lame","lamp","lams","land","lane","lank","laps","lard","lark","lash","lass","last","late","lath","laud","lava","lawn","laws","lays","laze","lazy","lead","leaf","leak","lean","leap","leek","leer","lees","left","legs","lend","lens","lent","less","lest","lets","levy","lewd","liar","lice","lick","lids","lied","lien","lies","lieu","life","lift","like","lily","limb","lime","limn","limp","limy","line","ling","link","lint","lion","lips","lisp","list","lite","live","load","loaf","loan","lobe","lobs","loci","lock","loco","lode","loft","logs","loin","loll","lone","long","look","loom","loon","loop","loos","loot","lope","lord","lore","lose","loss","lost","lots","loud","love","lows","lube","luck","lugs","lull","lulu","lump","lunk","lure","lurk","lush","lust","lute","lynx","lyre",
  "mace","made","mads","mage","magi","mags","maid","mail","maim","main","make","male","mall","malt","mama","mans","many","maps","mare","mark","mart","mash","mask","mass","mast","mate","math","mats","maul","maws","maybe","mead","meal","mean","meat","meek","meet","megs","meld","melt","memo","mend","menu","meow","mere","mesa","mesh","mess","mete","mews","mica","mice","midi","mien","miff","might","mike","mild","mile","milk","mill","mime","mind","mine","mini","mink","mint","minx","mire","mirk","miss","mist","mite","mitt","moan","moat","mobs","mock","mode","mods","mold","mole","molt","mama","monk","mono","mood","moon","moor","moos","moot","mope","mops","more","morn","moss","most","mote","moth","move","mowed","much","muck","muds","muff","mugs","mule","mull","muse","mush","musk","muss","must","mute","mutt","myth",
  "nabs","naff","nags","nail","name","nana","naps","nard","narc","nary","nave","nays","nazi","near","neat","necks","need","nerd","nest","nets","news","newt","next","nibs","nice","nick","nigh","nine","nips","nits","nobs","node","nods","noel","none","nook","noon","nope","norm","nose","nosh","nosy","nota","note","noun","nous","nova","nubs","nude","nuke","null","nuns","nuts",
  "oafs","oaks","oars","oath","oats","obey","oboe","odds","odes","odor","offs","ogle","ogre","ohms","oils","oily","oink","okay","okra","olds","oldy","omen","once","ones","only","onto","onus","onyx","oops","ooze","oozy","opal","open","opts","opus","oral","orbs","orca","ores","orgy","oust","outs","oval","oven","over","ovum","owed","owes","owls","owns","oxen","oyer","oyez","pace","pack","pact","pads","page","paid","pail","pain","pair","pale","pall","palm","pals","pane","pang","pans","pant","papa","papers","pare","park","part","pass","past","pate","path","pats","paws","pawn","pays","pclick","peak","peal","pear","peas","peck","peek","peel","peep","peer","pees","pegs","pelt","pens","pent","peon","pep","peps","perk","perm","peso","pest","pets","pews","pick","pied","pier","pies","pigs","pike","pile","pill","pimp","pine","ping","pink","pins","pint","piny","pipe","pity","plan","plat","play","plea","pled","plod","plop","plot","plow","ploy","plug","plum","plus","pock","pods","poem","poet","pogo","poke","pole","poll","polo","pols","pomp","pond","pons","pony","poof","pooh","pool","poop","poor","pops","pore","pork","porn","port","pose","posh","post","posy","pots","pour","pout","pows","pray","prep","prey","prig","prim","prod","prof","prom","prop","pros","prow","puck","puff","pugs","pulp","puls","puma","pump","punk","puns","punt","puny","pupa","pups","pure","purl","purr","push","puss","puts","pyre","pyx",
  "quack","quad","quag","quay","quid","quip","quit","quiz",
  "race","rack","racy","raft","rage","rags","raid","rail","rain","rake","rams","rang","rank","rant","rape","rare","rash","rasp","rate","rats","rave","raze","razz","read","real","ream","reap","rear","reds","reed","reef","reek","reel","refs","rein","rely","rend","rent","reps","rest","revs","ribs","rice","rich","rick","ride","rids","rife","riff","rift","rigs","rile","rill","rims","rind","ring","rink","riot","rips","rise","risk","rite","road","roam","roan","roar","robe","robs","rock","rode","rods","roes","roil","role","roll","romp","rood","roof","rook","room","root","rope","rose","ross","rosy","rote","rots","roue","rout","rove","rows","rube","ruby","ruck","rude","rued","ruff","ruin","rule","rump","rune","rung","runs","runt","ruse","rush","rust","ruts","ryes",
  "sack","sacs","safe","saga","sage","sago","sags","said","sail","sake","sale","salt","same","sand","sane","sang","sank","saps","sash","sass","sate","save","saws","says","scab","scad","scam","scan","scar","scat","scot","scow","scum","seal","seam","sear","seas","seat","sect","seed","seek","seem","seen","seep","seer","sees","self","sell","send","sent","sere","serf","sets","sewn","sews","sexy","shad","shag","shah","sham","shape","shed","shes","shew","shim","shin","ship","shod","shoe","shoo","shop","shot","show","shun","shut","sick","side","sift","sigh","sign","silk","sill","silo","silt","sims","sine","sing","sink","sins","sips","sire","sirs","site","sits","size","skew","skid","skim","skin","skip","skis","skit","slab","slag","slam","slap","slat","slaw","slay","sled","slew","slid","slim","slip","slit","slob","sloe","slog","slop","slot","slow","slug","slum","slur","smit","smog","smug","smut","snag","snap","snip","snit","snob","snot","snow","snub","snug","soak","soap","soar","sobs","sock","soda","sods","sofa","soft","soil","sold","sole","solo","some","song","sons","soon","soot","sops","sore","sort","souk","soul","soup","sour","sown","sows","soys","span","spar","spas","spat","spay","spec","sped","spew","spin","spit","spry","spud","spun","spur","stab","stag","star","stay","stem","step","stew","sty","such","suck","suds","sued","sues","suet","suit","sulk","sumo","sums","sung","sunk","suns","sups","sure","surf","swab","swag","swam","swan","swap","swat","sway","swig","swim","swum",
  "tabs","tack","taco","tact","tags","tail","take","tale","talk","tall","tame","tamp","tans","taps","tare","tarn","taro","tarp","tars","tart","task","taut","taxi","teak","teal","team","tear","teas","teat","teds","teed","teem","teen","tees","tell","tend","tens","tent","term","test","text","than","that","thaw","them","then","they","thin","this","thou","thru","thud","thug","thus","tick","tide","tidy","tied","tier","ties","tiff","tile","till","tilt","time","tine","tins","tint","tiny","tips","tire","tits","toad","tods","toed","toes","tofu","tofu","togs","toil","told","toll","toms","tone","tong","tons","tony","took","tool","toot","tops","tore","torn","tort","tosh","toss","tote","tots","tour","tout","town","tows","toys","trad","tram","trap","tray","tree","trek","trim","trio","trip","trod","trot","troy","true","tsar","tubs","tuck","tuff","tuft","tugs","tuna","tune","tunes","turd","turf","turn","tush","tusk","tutu","tuxes","twat","twig","twin","twit","tyke","type","typo","tyre",
  "udos","ughs","ugly","ulna","umps","undo","unit","unto","upon","urea","urge","urns","used","user","uses","ushe",
  "vain","vale","vamp","vane","vans","vary","vase","vast","vats","veal","veer","vees","veil","vein","veld","vend","vent","verb","very","vest","veto","vets","veys","vial","vibe","vice","vied","vies","view","vile","vine","viol","visa","vise","void","vole","volt","vote","vows","vyer",
  "wade","wads","waft","wage","wags","waif","wail","wait","wake","wale","walk","wall","wane","want","ward","ware","warm","warn","warp","wars","wart","wary","wash","wasp","watt","wave","wavy","waxy","ways","weak","weal","wean","wear","webs","weds","weed","week","weep","weft","weir","weld","well","welt","wend","went","wept","were","west","wets","whack","wham","what","when","whet","whew","whey","whim","whip","whir","whit","whiz","whoa","whom","whoo","whop","wick","wide","wife","wigs","wild","wile","will","wilt","wily","wimp","wind","wine","wing","wink","wins","wino","wins","wipe","wire","wiry","wise","wish","wisp","with","wits","wive","woes","woke","wolf","womb","wons","wood","woof","wool","woos","word","wore","work","worm","worn","wove","wows","wrap","wren","writ","wuss",
  "yack","yaks","yams","yang","yank","yaps","yard","yarn","yawl","yawn","yaws","yeah","year","yeas","yegg","yell","yelp","yens","yeps","yest","yeti","yews","yids","yips","yoga","yogi","yoke","yolk","yore","your","yowl","yo-yo","yuck","yule","yups",
  "zags","zany","zaps","zeal","zebu","zeds","zees","zero","zest","zeta","zinc","zing","zips","zits","zone","zoom","zoos",
  // 5+ letters - common
  "about","above","actor","acute","admit","adopt","adult","after","again","agent","agree","ahead","alarm","album","alert","alien","align","alike","alive","allow","alone","along","alpha","alter","among","angel","anger","angle","angry","apple","apply","arena","argue","arise","array","arrow","aside","asset","audio","audit","avoid","award","aware","awful","awoke","baker","basic","basis","beach","bears","beast","began","begin","being","below","bench","birth","black","blade","blame","blank","blast","blaze","blend","bless","blind","block","blood","bloom","blown","blues","bluff","blunt","board","boast","bonus","boost","booth","bored","brain","brand","brass","brave","bread","break","breed","brick","bride","brief","bring","brisk","broad","brook","brown","brush","build","built","burst","cabin","cable","caddy","cadet","camel","candy","canon","cargo","carve","catch","cause","cease","chain","chair","chalk","charm","chart","chase","cheap","cheat","check","cheer","chess","chest","chief","child","chill","chime","china","chips","chord","civic","civil","claim","clamp","clash","class","clean","clear","clerk","click","cliff","climb","cling","clock","close","cloth","cloud","clown","coach","coast","color","comet","comic","coral","could","count","court","cover","crack","craft","crane","crash","crate","crave","crawl","craze","crazy","cream","creed","creek","creep","crept","crest","crime","crisp","crook","cross","crowd","crown","crude","cruel","crush","crust","crypt","curse","curve","cycle","daily","dairy","dance","dandy","datum","dealt","death","debit","debug","decay","decoy","defer","delay","delta","dense","depot","depth","derby","devil","diary","dimly","diner","dirty","ditch","diver","dizzy","dodge","doing","donor","doubt","dough","dozen","draft","drain","drama","drank","drawn","dread","dream","dress","dried","drift","drill","drink","drive","drone","drown","drunk","dryer","dummy","dwarf","eager","eagle","early","earth","easel","eaten","eater","eddie","edges","eerie","eight","elbow","elder","elect","elite","email","ember","empty","enact","ended","enemy","enjoy","enter","entry","equal","equip","erode","error","essay","event","every","evict","evoke","exact","exile","exist","extra","fable","faced","facet","faint","fairy","faith","false","fancy","farce","faria","fault","favor","feast","fence","ferry","fetch","fever","fiber","field","fiend","fifty","fight","filed","filer","filet","final","finch","finer","fired","first","flair","flake","flame","flank","flare","flash","flask","fleet","flesh","flick","flint","float","flock","flood","floor","flora","flour","flown","fluid","fluke","flung","flush","focal","focus","force","forge","forms","forty","forum","found","frame","frank","fraud","fresh","fried","frock","frost","froth","fruit","fudge","fully","fungi","funky","funny","gable","gaily","gamer","games","gates","gauge","gaunt","gauze","geese","genie","genre","ghost","ghoul","giant","given","glade","glare","glass","gleam","glide","globe","gloom","glory","glove","glyph","goals","godly","going","goofy","gorge","gouge","grace","grade","grain","grand","grant","grape","graph","grasp","grass","grave","gravy","graze","great","greed","green","greet","grief","grill","grind","gripe","grit","groan","groin","groom","gross","group","grove","growl","grown","gruff","grunt","guard","guess","guest","guide","guild","guilt","gulch","gumbo","gypsy","habit","hairy","handy","happy","hardy","harsh","hatch","hated","haven","havoc","hawks","heard","heart","heath","heavy","hedge","hefty","helix","hello","helps","hence","henry","herbs","hertz","heroes","hertz","hicks","highs","hijack","hillo","hindu","hippo","hired","hires","hitch","hives","hoard","hobby","hoist","holds","holes","holly","homed","homer","honey","honor","hooch","hoods","hoofs","hooks","hoops","hopes","horde","horns","horse","hosed","hosts","hotel","hotly","hours","house","hover","howdy","human","humid","humor","humph","hunch","hurry","hurts","husky","hyena","icily","icing","ideal","idiot","idler","idols","igloo","image","imbue","imply","inbox","incur","index","inept","inert","ingot","inked","inlet","inner","input","intro","ionic","irate","irony","issue","ivory","jaded","jaunt","jelly","jerky","jewel","jiffy","joint","joker","jolly","joust","judge","juice","juicy","jumbo","jumpy","junky","juror","kayak","kazoo","kebab","khaki","kiosk","kited","knack","knave","knead","kneel","knelt","knife","knock","knoll","known","koala","kudos","label","labor","laced","lacks","ladle","lady","lager","lakes","lamps","lance","lands","lanes","lapse","large","laser","lasso","later","laugh","layer","leach","leads","leafy","leaks","leaky","leans","leapt","learn","lease","leash","least","leave","ledge","leech","leeks","leers","lefty","legal","lemon","level","lever","lexus","liars","libel","lifts","light","liked","liken","likes","lilac","limbo","limit","lined","linen","liner","lines","lingo","links","lions","lipid","lists","liter","lithe","lived","liver","lives","llama","loads","loafs","loath","lobby","local","locks","lodge","lofty","logic","login","loins","longs","looks","looms","loops","loose","lords","loser","loses","lousy","lover","lower","lucid","lucky","lumpy","lunar","lunch","lunge","lungs","lurch","lurid","lurks","lying","lymph","lyric","macaw","macho","macro","madam","madly","mafia","magic","mails","major","maker","males","mamba","mango","mango","mangy","mania","manic","manor","maple","march","mares","marsh","masks","match","matte","mauve","mayor","meals","means","meant","medal","media","melts","memos","mends","menus","mercy","merge","merit","merry","metal","meter","metro","micro","might","minds","mined","miner","mines","minor","minty","minus","mirth","misty","mixed","mixer","modal","model","modem","moist","molar","moldy","money","month","moods","moody","moons","moose","moral","moron","morph","moths","motor","motto","mound","mount","mourn","mouse","mouth","moved","mover","movie","mowed","mower","mucus","muddy","muffs","mugs","mules","multi","mummy","murky","music","musky","mussy","muted","myrrh","myths","nadir","naked","named","nameless","names","nanny","nasal","nasty","naval","needs","needy","negro","nerve","never","newer","newly","nicer","niche","niece","nifty","night","ninny","ninth","noble","nobly","nodes","noise","noisy","nomad","norms","north","nosed","noses","notch","noted","notes","nouns","novel","nudge","nurse","nutty","nylon","nymph","oasis","obese","occur","ocean","octal","octet","odder","oddly","odors","odour","offer","often","ogled","ohhhs","oiled","oiler","olden","older","olive","omega","onion","onset","opals","opens","opera","optic","orals","orbit","order","organ","ought","ounce","outer","ovary","ovens","overt","owing","owls","owned","owner","oxide","ozone","paced","pacer","paces","packs","paddle","pages","pains","paint","pairs","palms","panda","panel","panic","pants","papal","paper","parka","parse","party","passe","paste","pasty","patch","paths","patio","pause","payed","peace","peach","pearl","pears","pecan","pecks","pedal","peeks","peeled","peels","peers","penal","pence","penny","peony","perch","perky","peril","petal","petty","phase","phone","phony","photo","piano","picky","piece","piers","piety","piggy","piles","pilot","pimps","pinch","pines","pings","pinks","pints","pinto","pions","pipes","pivot","pixie","pizza","place","plaid","plain","plait","plane","plank","plant","plate","plays","plaza","plead","pleat","plied","plier","plops","plots","plows","pluck","plugs","plumb","plume","plump","plums","plumy","plush","poach","pocky","poems","poets","point","poise","poked","poker","poles","polio","polka","polls","polyp","ponds","pooch","poofs","pools","poops","porch","pores","ports","posed","poser","poses","posit","posse","posts","potty","pouch","pound","pours","pouts","power","prank","prawn","prays","preen","preps","press","price","prick","pride","pried","prier","prime","primp","print","prior","prism","privy","prize","probe","prods","prom","promo","prone","prong","proof","props","prose","proud","prove","prowl","prude","prune","psalm","pubic","pubis","pucks","puffs","puffy","pulps","pulpy","pulse","pumas","pumps","punch","punks","punky","pupil","puppy","purer","purge","purls","purrs","purse","pushy","putts","putty","pygmy","quack","quads","quail","quake","qualm","quark","quart","quash","quasi","queen","queer","quell","query","quest","queue","quick","quiet","quill","quilt","quint","quips","quirk","quite","quits","quiver","quote","rabbi","rabid","raced","racer","races","racks","radar","radii","radio","raged","rages","rails","rains","rainy","raise","rajah","raked","rakes","rally","ramps","ranch","randy","range","ranks","rants","rapid","rared","rarer","rares","rated","rater","rates","ratio","ratty","raved","ravel","raver","raves","rayon","razed","reach","react","reads","ready","realm","reams","reaps","rearm","rebar","rebel","rebus","recap","recur","redo","reeds","reedy","reefs","reeks","reels","refer","refit","reign","reins","relax","relay","relic","remit","renal","renew","repay","repel","reply","resin","resort","rests","retch","retry","reuse","revel","revet","rhino","rhyme","ribby","rices","ricin","ricks","rider","rides","ridge","rifle","rifts","right","rigid","rigor","riled","riles","rinds","rings","rinks","rinse","rinsed","riots","ripen","riper","ripes","risen","riser","rises","risks","risky","ritzy","rival","river","rivet","roach","roads","roams","roars","roast","robed","robes","robin","robot","rocks","rocky","rodeo","roger","rogue","roils","roles","rolls","roman","romeo","romps","roofs","rooks","rooms","roomy","roost","roots","ropes","roses","rotor","rouge","rough","round","rouse","rouge","route","roved","rover","roves","rowdy","rower","royal","rubes","ruble","ruder","rugby","ruler","rules","rumba","rummy","rumor","rumps","rupee","rural","rusty",
  "sable","sadly","safer","saber","sages","sails","saint","saith","sakes","salad","sales","salon","salsa","salts","salty","salve","salvo","sandy","saner","sanity","santa","sappy","sarge","sassy","sated","satin","satyr","sauce","saucy","saved","saver","saves","savoy","savor","savvy","sawed","sayer","scads","scald","scale","scalp","scaly","scamp","scams","scans","scant","scare","scarf","scary","scene","scent","schmo","scion","scoff","scold","scone","scoop","scoot","scope","score","scorn","scour","scout","scowl","scram","scrap","scree","screw","scrod","scrub","scrum","scuba","scudo","scuff","scuzz","seals","seams","seamy","sears","seats","seaward","secco","sects","sedan","seder","seedy","seeks","seems","seeps","seers","seine","seize","sells","semen","sends","senor","sense","sepal","sepia","septa","serfs","serge","serif","serum","serve","setup","seven","sever","sewed","sewer","sexes","shack","shade","shady","shaft","shake","shaky","shale","shall","shalt","shame","shams","shank","shape","shard","share","shark","sharp","shave","shawl","sheaf","shear","sheds","sheen","sheep","sheer","sheet","sheik","shelf","shell","sherds","sherry","shies","shift","shill","shims","shine","shins","shiny","ships","shire","shirk","shirt","shish","shiva","shoal","shock","shoes","shone","shook","shoos","shoot","shops","shore","short","shots","shout","shove","shown","shows","shown","showy","shred","shrew","shrub","shrug","shtik","shuck","shuns","shunt","shush","shut","sided","sides","siege","sieve","sifts","sighs","sight","sigma","signs","silks","silky","sills","silly","silos","silty","since","sines","sinew","sings","singe","sinks","sinus","sired","siren","sires","sissy","sitar","sited","sites","sixes","sixth","sixty","sized","sizes","skate","skein","skews","skids","skied","skier","skies","skiff","skill","skim","skimp","skin","skins","skip","skips","skirt","skits","skulk","skull","skunk","skyed","slabs","slack","slags","slain","slake","slams","slang","slant","slaps","slash","slate","slats","slave","slays","sleds","sleek","sleep","sleet","slept","slews","slice","slick","slid","slide","slier","slime","slimy","slimy","sling","slink","slips","slits","slob","slope","slops","slosh","slot","sloth","slow","slows","slugs","slump","slums","slung","slunk","slurp","slurs","slush","sly","smack","small","smart","smash","smear","smell","smelt","smile","smirk","smite","smith","smock","smog","smoke","smoky","smolt","smote","smush","smuts","snack","snafu","snags","snail","snake","snaky","snap","snaps","snare","snarl","snazz","sneak","sneer","snide","sniff","snipe","snips","snits","snobs","snoop","snoot","snore","snort","snots","snout","snows","snowy","snubs","snuff","snug","soaks","soaps","soapy","soars","sober","socks","sodas","soddy","sofas","softy","soggy","soils","solar","soled","soles","solid","solos","solve","sonar","songs","sonic","sonny","soong","sooth","sooty","sopor","sorry","sorts","souls","sound","soups","soupy","sours","south","sowed","sower","space","spade","spank","spans","spare","spark","spars","spasm","spats","spawn","speak","spear","speck","specs","speed","spell","spelt","spend","spent","sperm","spew","spice","spicy","spied","spies","spiff","spike","spiky","spill","spilt","spine","spins","spiny","spiral","spire","spirt","spite","splat","splay","split","spoil","spoke","spool","spoon","spore","sport","spots","spout","spray","spree","sprig","spume","spunk","spurn","spurs","spurt","squab","squad","squat","squaw","squid","stabs","stack","staff","stage","stags","staid","stain","stair","stake","stale","stalk","stall","stamp","stand","stank","staph","stars","start","stash","state","stats","stave","stays","stead","steak","steal","steam","steed","steel","steep","steer","stein","stems","step","steps","stern","stews","stick","stiff","stile","still","stilt","sting","stink","stint","stirs","stoat","stock","stogy","stoic","stoke","stoked","stoker","stoles","stolid","stomp","stone","stony","stood","stool","stoop","stops","store","stork","storm","story","stout","stove","stows","strap","straw","stray","strep","strew","strip","strop","strum","strut","stubs","stuck","studs","study","stuff","stump","stuns","stunt","style","suave","sucks","sudsy","suede","sugar","suing","suite","suits","sulfa","sulks","sulky","sully","sumac","summa","sumps","sunny","sunup","super","surer","surfs","surge","surly","sushi","swabs","swags","swain","swami","swamp","swank","swans","swaps","sward","swarm","swash","swath","sways","swear","sweat","sweep","sweet","swell","swept","swift","swigs","swill","swims","swine","swing","swipe","swirl","swish","swiss","swoon","swoop","sword","swore","sworn","swung","sycee","sylph","synod","syrup","table","taboo","tacit","tacks","tacky","tacos","taffy","taint","taken","taker","takes","tales","talks","talky","tally","talon","tamed","tamer","tames","tango","tangy","tanks","tansy","tapas","taped","taper","tapes","tapir","tardy","tares","tarot","tarry","tarts","tasks","taste","tasty","tater","tatty","taunt","taupe","tawny","taxed","taxes","taxis","teach","teaks","teals","teams","tears","teary","teats","tease","teddy","teem","teens","teeny","teeth","tells","tempi","tempo","tempt","tench","tends","tenet","tenon","tenor","tense","tenth","tents","tepee","tepid","terms","terra","terror","terse","tests","testy","thank","thaws","theft","their","theme","there","therm","these","theta","thick","thief","thigh","thine","thing","think","third","thirsty","thong","thorn","those","three","threw","throat","throb","throne","throw","thrum","thuds","thugs","thumb","thump","thus","thwap","thyme","tiara","tibia","tided","tides","tiers","tiger","tight","tikes","tikis","tilde","tiled","tiles","till","tilts","timed","timer","times","timid","tines","tinge","tings","tinny","tints","tippy","tipsy","tired","tires","titan","title","toads","toady","toast","today","toddy","toes","toffee","tofu","togas","toils","toked","token","tokes","tolls","tomb","tombs","tomes","tonal","toned","toner","tones","tongs","tonic","tooled","tools","toons","tooth","toots","topaz","topic","topple","torch","tores","torn","torsi","torso","torte","torts","total","totem","totes","touch","tough","tour","tours","touts","towed","towel","tower","towns","toxic","toxin","toyed","trace","track","tract","trade","trail","train","trait","tramp","trams","trance","traps","trash","trawl","trays","tread","treat","treed","trees","treks","trend","tress","trial","tribe","trice","trick","tried","trier","tries","trike","trill","trims","trios","tripe","trips","trite","troll","tromp","troop","trope","trots","trout","trove","truce","truck","trump","trunk","truss","trust","truth","tryst","tuba","tubas","tubby","tubed","tubes","tucks","tufts","tufty","tulip","tummy","tunas","tuned","tuner","tunes","tunic","turbo","turds","turfs","turfy","turns","tusks","tutor","tutus","tuxes","twain","twang","twats","tweak","tweed","tweet","twerk","twice","twigs","twill","twine","twins","twiny","twirl","twirp","twist","twit","twixt","tying","typed","types","tyros","udder","ulcer","ultra","umbra","umped","umpire","unbox","uncle","uncut","under","undid","undue","unfed","unfit","unify","union","unite","units","unity","unjust","unset","untie","until","unwed","unzip","upend","upper","upset","upside","urban","urged","urges","usage","users","usher","using","usual","usurp","usury","uteri","utero","utter","vacua","vacuo","vague","vales","valet","valid","valor","value","valve","vamps","vans","vapor","vault","vaunt","veers","vegan","veils","veins","velds","veldt","velum","velvet","vends","venom","vents","venue","verbs","verge","verse","verso","verve","vests","vetch","vetoed","vetoes","vexed","vexes","vials","viand","vibes","vicar","video","vigil","vigor","viler","villa","vines","vinyl","viola","viral","virus","visas","vised","vises","visit","visor","vista","vital","vitam","vitro","vitae","vivid","vixen","vocal","vodka","vogue","voice","voids","voile","voled","voles","volts","vomit","voted","voter","votes","vouch","vowed","vowel","voyer","voile","wacky","waded","wades","wafer","waft","wafts","waged","wager","wages","wagon","waifs","wails","waist","waits","waive","waked","waken","wakes","walks","walks","walls","wally","waltz","wands","waned","wanes","wanly","wants","wards","wares","warms","warns","warps","warts","warty","washy","wasps","waste","watch","water","watts","waved","waver","waves","wavey","waxed","waxen","waxer","waxes","wazoo","weald","weans","wears","weary","weave","webby","weeds","weedy","weeks","weep","weeps","weepy","weest","weigh","weird","welch","welds","wells","welsh","welts","wench","wends","wests","whack","whale","whamo","wharf","wheat","wheel","whelm","whelp","when","where","which","whiff","while","whim","whims","whine","whiny","whips","whirl","whirs","whisk","whiz","whizz","whoa","whole","whoop","whorl","whore","whose","wicks","widen","wider","widow","width","wield","wifey","wifes","wight","wikis","wilds","wiled","wiles","wills","wilds","wilier","wilts","wily","wimps","wimpy","wince","winch","winds","windy","wined","wines","wings","winks","winos","wiped","wipes","wired","wires","wiser","wises","wises","wisps","wispy","witch","withe","wits","witty","wived","wives","wizen","woes","woken","wolf","wolfs","woman","wombs","women","woods","woody","woofs","wooed","wooer","wools","wooly","woops","woozy","words","wordy","wore","works","world","worms","wormy","worry","worse","worst","worth","would","wound","woven","wowed","wraps","wrath","wreak","wreck","wrens","wrest","wried","wries","wring","wrist","write","writs","wrong","wrote","wroth","wrung","wryly","xenon","xerox","xylem","yacht","yahoo","yamen","yanks","yards","yarns","yawls","yawns","yawps","yeahs","years","yeast","yells","yelps","yenta","yeoman","yetis","yield","yodel","yoga","yogas","yogis","yokel","yolks","young","youth","yowls","yummy","yuppie","yurts","zappy","zaps","zazen","zeals","zebra","zebus","zeros","zests","zesty","zilch","zinco","zincy","zings","zippy","zloty","zoned","zoner","zones","zonks","zooey","zooks","zooms","zooty","zorch","zowie","zygal","zygote"
]);

const WORDRA_DICT_TH = new Set([
  // common 2-4 syllable thai words (simplified for prototype)
  "กา","กาย","การ","ขา","ขาย","คน","คาน","งาม","งาน","จาน","ดาว","ดาย","ตา","ตาม","นา","นาย","น้ำ","ปลา","ปาน","พา","มา","มาย","ยาม","ลาย","วาน","สาย","หาย","อ้าย",
  "บ้าน","บาน","ม้า","มาก","ลาก","ราก","สาก","หาก","ลาว","สาว","นาว","กาว","ดาว","ขาว","ข้าว","เขา","เก่ง","เก้า","เกิด","เกม","ใจ","ไก่","ไข่","ไป","ใหม่","ใหญ่","ไหม",
  "ใจดี","ใจกล้า","แสง","สว่าง","เร็ว","ช้า","สูง","ต่ำ","ดี","ร้าย","งาม","สวย","หล่อ","เก่ง","ฉลาด","กล้า","แกร่ง"
]);

// 25-letter (5x5) board generator with weighted letters
const LETTER_WEIGHTS_EN = "AAAAAAAAABBCCDDDDEEEEEEEEEEEEFFGGGHHHIIIIIIIIIJKLLLLMMNNNNNNOOOOOOOOPPQRRRRRRSSSSSSTTTTTTTTUUUVVWWXYYZ";
const LETTER_WEIGHTS_TH = "กกกกขขคคจจชชดดตตททนนนนบบปปพพมมยยรรรลลลสสสหหออ"; // simplified consonants

// Mulberry32 seeded PRNG so daily boards are reproducible
function wordraRng(seed) {
  let t = seed >>> 0;
  return function() {
    t = (t + 0x6D2B79F5) >>> 0;
    let r = t;
    r = Math.imul(r ^ (r >>> 15), r | 1);
    r ^= r + Math.imul(r ^ (r >>> 7), r | 61);
    return ((r ^ (r >>> 14)) >>> 0) / 4294967296;
  };
}

function generateBoard(seed, lang = "en") {
  const rng = wordraRng(seed);
  const pool = lang === "th" ? LETTER_WEIGHTS_TH : LETTER_WEIGHTS_EN;
  const cells = [];
  for (let i = 0; i < 25; i++) {
    const idx = Math.floor(rng() * pool.length);
    cells.push(pool[idx]);
  }
  // ensure at least one common vowel for english
  if (lang === "en") {
    const vowels = ["A","E","I","O","U"];
    const hasVowel = cells.some(c => vowels.includes(c));
    if (!hasVowel) cells[0] = "E";
  }
  return cells;
}

// path is array of cell indices on a 5x5 grid (0..24)
function pathIsAdjacent(path) {
  for (let i = 1; i < path.length; i++) {
    const a = path[i - 1], b = path[i];
    const ax = a % 5, ay = Math.floor(a / 5);
    const bx = b % 5, by = Math.floor(b / 5);
    if (Math.abs(ax - bx) > 1 || Math.abs(ay - by) > 1) return false;
    if (a === b) return false;
  }
  return new Set(path).size === path.length;
}

function pathToWord(path, board) {
  return path.map(i => board[i]).join("");
}

function isValidWord(word, lang = "en") {
  if (!word || word.length < 3) return false;
  const dict = lang === "th" ? WORDRA_DICT_TH : WORDRA_DICT_EN;
  return dict.has(word.toLowerCase());
}

function scoreWord(word, comboMult) {
  // length × combo × small length bonus
  const base = word.length * 10;
  const lengthBonus = word.length >= 5 ? (word.length - 4) * 15 : 0;
  return Math.round((base + lengthBonus) * comboMult);
}

// Today's daily seed (YYYYMMDD)
function todaySeed() {
  const d = new Date();
  return d.getFullYear() * 10000 + (d.getMonth() + 1) * 100 + d.getDate();
}

function todayLabel() {
  const d = new Date();
  const start = new Date(2026, 0, 1);
  return Math.floor((d - start) / 86400000) + 1;
}

window.WordraEngine = {
  generateBoard,
  pathIsAdjacent,
  pathToWord,
  isValidWord,
  scoreWord,
  wordraRng,
  todaySeed,
  todayLabel,
};
