all repos — emojesis @ 3119c4f351880bb78fcb0fdbb896f788fcadb77f

js/data.js (view raw)

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 183
 184
 185
 186
 187
 188
 189
 190
 191
 192
 193
 194
 195
 196
 197
 198
 199
 200
 201
 202
 203
 204
 205
 206
 207
 208
 209
 210
 211
 212
 213
 214
 215
 216
 217
 218
 219
 220
 221
 222
 223
 224
 225
 226
 227
 228
 229
 230
 231
 232
 233
 234
 235
 236
 237
 238
 239
 240
 241
 242
 243
 244
 245
 246
 247
 248
 249
 250
 251
 252
 253
 254
 255
 256
 257
 258
 259
 260
 261
 262
 263
 264
 265
 266
 267
 268
 269
 270
 271
 272
 273
 274
 275
 276
 277
 278
 279
 280
 281
 282
 283
 284
 285
 286
 287
 288
 289
 290
 291
 292
 293
 294
 295
 296
 297
 298
 299
 300
 301
 302
 303
 304
 305
 306
 307
 308
 309
 310
 311
 312
 313
 314
 315
 316
 317
 318
 319
 320
 321
 322
 323
 324
 325
 326
 327
 328
 329
 330
 331
 332
 333
 334
 335
 336
 337
 338
 339
 340
 341
 342
 343
 344
 345
 346
 347
 348
 349
 350
 351
 352
 353
 354
 355
 356
 357
 358
 359
/* EMOJESIS — game data. Pure data, no DOM.
   Works in the browser (attaches to globalThis.EMOJESIS_DATA)
   and in Node (module.exports) for validate.js. */
(function () {
  'use strict';

  var CATEGORIES = [
    'nature', 'weather', 'life', 'animals', 'humanity', 'civilization',
    'culture', 'technology', 'internet', 'occult', 'cosmos', 'absurd'
  ];

  var STARTERS = ['fire', 'water', 'earth', 'air'];

  /* Element: { id, emoji, name, category, description, secret? } */
  var ELEMENTS = {
    /* ---- starters ---- */
    fire:  { id: 'fire',  emoji: '🔥', name: 'Fire',  category: 'nature', description: 'Warmth, destruction, and the first bad idea.' },
    water: { id: 'water', emoji: '💧', name: 'Water', category: 'nature', description: 'It remembers every shape it has ever been.' },
    earth: { id: 'earth', emoji: '🪨', name: 'Earth', category: 'nature', description: 'Patient, heavy, and full of opinions.' },
    air:   { id: 'air',   emoji: '💨', name: 'Air',   category: 'nature', description: 'Invisible, everywhere, and slightly dramatic.' },

    /* ---- nature ---- */
    mud:      { id: 'mud',      emoji: '🟤', name: 'Mud',      category: 'nature', description: 'Earth that gave up on posture.' },
    lava:     { id: 'lava',     emoji: '🌋', name: 'Lava',     category: 'nature', description: 'The planet\u2019s way of thinking out loud.' },
    ocean:    { id: 'ocean',    emoji: '🌊', name: 'Ocean',    category: 'nature', description: 'Water, ambition edition.' },
    mountain: { id: 'mountain', emoji: '⛰️', name: 'Mountain', category: 'nature', description: 'A very long argument with the sky.' },
    wood:     { id: 'wood',     emoji: '🪵', name: 'Wood',     category: 'nature', description: 'A tree, repurposed.' },
    honey:    { id: 'honey',    emoji: '🍯', name: 'Honey',    category: 'nature', description: 'A lifetime of small errands, bottled.' },

    /* ---- weather ---- */
    steam:     { id: 'steam',     emoji: '🌫️', name: 'Steam',     category: 'weather', description: 'Opposites, agreeing to disagree upward.' },
    cloud:     { id: 'cloud',     emoji: '☁️', name: 'Cloud',     category: 'weather', description: 'The sky\u2019s rough draft.' },
    rain:      { id: 'rain',      emoji: '🌧️', name: 'Rain',      category: 'weather', description: 'The cloud finally admitted something.' },
    wind:      { id: 'wind',      emoji: '🌬️', name: 'Wind',      category: 'weather', description: 'Air with somewhere to be.' },
    storm:     { id: 'storm',     emoji: '⛈️', name: 'Storm',     category: 'weather', description: 'Two clouds having it out.' },
    lightning: { id: 'lightning', emoji: '⚡', name: 'Lightning', category: 'weather', description: 'The sky, briefly honest.' },
    snow:      { id: 'snow',      emoji: '❄️', name: 'Snow',      category: 'weather', description: 'Rain, but it learned to whisper.' },
    rainbow:   { id: 'rainbow',   emoji: '🌈', name: 'Rainbow',   category: 'weather', description: 'An apology from the weather.' },
    fog:       { id: 'fog',       emoji: '🌁', name: 'Fog',       category: 'weather', description: 'A cloud that lost its nerve.' },

    /* ---- life ---- */
    life:   { id: 'life',   emoji: '🌱', name: 'Life',   category: 'life', description: 'The mud flinched first.' },
    plant:  { id: 'plant',  emoji: '🌿', name: 'Plant',  category: 'life', description: 'Life, rooted and smug about it.' },
    tree:   { id: 'tree',   emoji: '🌳', name: 'Tree',   category: 'life', description: 'Patience, made visible.' },
    flower: { id: 'flower', emoji: '🌸', name: 'Flower', category: 'life', description: 'The plant\u2019s loud opinion.' },
    wheat:  { id: 'wheat',  emoji: '🌾', name: 'Wheat',  category: 'life', description: 'Grass with ambitions.' },
    forest: { id: 'forest', emoji: '🌲', name: 'Forest', category: 'life', description: 'Trees discovered crowds.' },

    /* ---- animals ---- */
    fish:      { id: 'fish',      emoji: '🐟', name: 'Fish',      category: 'animals', description: 'Life learned to swim before it learned to walk. Priorities.' },
    bird:      { id: 'bird',      emoji: '🐦', name: 'Bird',      category: 'animals', description: 'Life, ignoring gravity\u2019s memo.' },
    egg:       { id: 'egg',       emoji: '🥚', name: 'Egg',       category: 'animals', description: 'A bird\u2019s most confident decision.' },
    cat:       { id: 'cat',       emoji: '🐈', name: 'Cat',       category: 'animals', description: 'Something small decided to live with you.' },
    dog:       { id: 'dog',       emoji: '🐶', name: 'Dog',       category: 'animals', description: 'The wolf made an excellent mistake.' },
    wolf:      { id: 'wolf',      emoji: '🐺', name: 'Wolf',      category: 'animals', description: 'The mountain learned to hunt.' },
    bee:       { id: 'bee',       emoji: '🐝', name: 'Bee',       category: 'animals', description: 'A flower\u2019s courier service.' },
    snake:     { id: 'snake',     emoji: '🐍', name: 'Snake',     category: 'animals', description: 'The garden got interesting.' },
    whale:     { id: 'whale',     emoji: '🐋', name: 'Whale',     category: 'animals', description: 'Time and water, taken seriously.' },
    owl:       { id: 'owl',       emoji: '🦉', name: 'Night Owl', category: 'animals', secret: true, description: 'It only interviews at night.' },
    dinosaur:  { id: 'dinosaur',  emoji: '🦖', name: 'Dinosaur',  category: 'animals', description: 'Some experiments take longer.' },
    butterfly: { id: 'butterfly', emoji: '🦋', name: 'Butterfly', category: 'animals', description: 'A rumor with wings.' },

    /* ---- humanity ---- */
    human: { id: 'human', emoji: '🧑', name: 'Human', category: 'humanity', description: 'From mud, something stood up.' },
    brain: { id: 'brain', emoji: '🧠', name: 'Brain', category: 'humanity', description: 'A library that argues back.' },
    love:  { id: 'love',  emoji: '❤️', name: 'Love',  category: 'humanity', description: 'A self-combination with consequences.' },

    /* ---- civilization ---- */
    tool:    { id: 'tool',    emoji: '🔨', name: 'Tool',    category: 'civilization', description: 'The rock was promoted.' },
    house:   { id: 'house',   emoji: '🏠', name: 'House',   category: 'civilization', description: 'A tree, forgiven.' },
    village: { id: 'village', emoji: '🏘️', name: 'Village', category: 'civilization', description: 'Houses discovered gossip.' },
    city:    { id: 'city',    emoji: '🏙️', name: 'City',    category: 'civilization', description: 'A village that stopped sleeping.' },
    wheel:   { id: 'wheel',   emoji: '🛞', name: 'Wheel',   category: 'civilization', description: 'The circle\u2019s career began.' },
    bread:   { id: 'bread',   emoji: '🍞', name: 'Bread',   category: 'civilization', description: 'Grain, transformed by impatience.' },
    coffee:  { id: 'coffee',  emoji: '☕', name: 'Coffee',  category: 'civilization', description: 'The bean demanded fire.' },
    paper:   { id: 'paper',   emoji: '📄', name: 'Paper',   category: 'civilization', description: 'The tree, flattened into memory.' },
    book:    { id: 'book',    emoji: '📚', name: 'Book',    category: 'civilization', description: 'Paper with a spine and opinions.' },
    metal:   { id: 'metal',   emoji: '🔩', name: 'Metal',   category: 'civilization', description: 'The mountain\u2019s hidden temper.' },
    sword:   { id: 'sword',   emoji: '⚔️', name: 'Sword',   category: 'civilization', description: 'An argument made of metal.' },
    boat:    { id: 'boat',    emoji: '⛵', name: 'Boat',    category: 'civilization', description: 'The wood forgave the water.' },
    ship:    { id: 'ship',    emoji: '🚢', name: 'Ship',    category: 'civilization', description: 'A boat that stopped being polite.' },
    bridge:  { id: 'bridge',  emoji: '🌉', name: 'Bridge',  category: 'civilization', description: 'The mountain\u2019s shortcut.' },
    castle:  { id: 'castle',  emoji: '🏰', name: 'Castle',  category: 'civilization', description: 'A house with trust issues.' },
    engine:  { id: 'engine',  emoji: '🚂', name: 'Engine',  category: 'civilization', description: 'Steam, given a job.' },
    gold:    { id: 'gold',    emoji: '🪙', name: 'Gold',    category: 'civilization', description: 'Shinier with age.' },
    money:   { id: 'money',   emoji: '💵', name: 'Money',   category: 'civilization', description: 'Gold that fits in a pocket.' },
    key:     { id: 'key',     emoji: '🗝️', name: 'Key',     category: 'civilization', description: 'It opens exactly one thing. Good luck.' },

    /* ---- culture ---- */
    writing:       { id: 'writing',       emoji: '✍️', name: 'Writing',        category: 'culture', description: 'Thoughts, taxidermied.' },
    art:           { id: 'art',           emoji: '🎨', name: 'Art',            category: 'culture', description: 'The rainbow, on purpose.' },
    music:         { id: 'music',         emoji: '🎵', name: 'Music',          category: 'culture', description: 'The bird\u2019s idea, stolen gracefully.' },
    philosophy:    { id: 'philosophy',    emoji: '🤔', name: 'Philosophy',     category: 'culture', description: 'Two books arguing forever.' },
    forbiddenBook: { id: 'forbiddenBook', emoji: '📕', name: 'Forbidden Book', category: 'culture', secret: true, description: 'Some books are burned because they burn back.' },
    library:       { id: 'library',       emoji: '🏛️', name: 'Library',        category: 'culture', description: 'A house that remembers for you.' },
    statue:        { id: 'statue',        emoji: '🗿', name: 'Statue',         category: 'culture', description: 'Someone wanted to be remembered badly.' },
    theatre:       { id: 'theatre',       emoji: '🎭', name: 'Theatre',        category: 'culture', description: 'Art that watches you back.' },
    idea:          { id: 'idea',          emoji: '💡', name: 'Idea',           category: 'culture', description: 'A dangerous amount of electricity, safely contained.' },

    /* ---- technology ---- */
    computer:       { id: 'computer',       emoji: '💻', name: 'Computer',        category: 'technology', description: 'An idea with a fan.' },
    robot:          { id: 'robot',          emoji: '🤖', name: 'Robot',           category: 'technology', description: 'A brain with a warranty.' },
    ai:             { id: 'ai',             emoji: '💭', name: 'AI',              category: 'technology', description: 'The machine started finishing your sentences.' },
    developer:      { id: 'developer',      emoji: '👨‍💻', name: 'Developer',       category: 'technology', description: 'Runs on caffeine and unresolved tickets.' },
    battery:        { id: 'battery',        emoji: '🔋', name: 'Battery',         category: 'technology', description: 'Lightning, grounded.' },
    antenna:        { id: 'antenna',        emoji: '📡', name: 'Antenna',         category: 'technology', description: 'A metal ear for invisible things.' },
    rocket:         { id: 'rocket',         emoji: '🚀', name: 'Rocket',          category: 'technology', description: 'A ship that chose violence over water.' },
    satellite:      { id: 'satellite',      emoji: '🛰️', name: 'Satellite',       category: 'technology', description: 'An antenna that moved out.' },
    telescope:      { id: 'telescope',      emoji: '🔭', name: 'Telescope',       category: 'technology', description: 'The mountain had questions too.' },
    phone:          { id: 'phone',          emoji: '📱', name: 'Phone',           category: 'technology', description: 'A computer for your pocket and your every waking moment.' },
    wifi:           { id: 'wifi',           emoji: '📶', name: 'Wi-Fi',           category: 'technology', description: 'The internet, untethered and unbothered.' },
    syntheticHeart: { id: 'syntheticHeart', emoji: '🦾', name: 'Synthetic Heart', category: 'technology', secret: true, description: 'It beats. That\u2019s the disturbing part.' },

    /* ---- internet ---- */
    internet:        { id: 'internet',        emoji: '🌐', name: 'Internet',         category: 'internet', description: 'Two computers started talking. Nobody stopped them.' },
    link:            { id: 'link',            emoji: '🔗', name: 'Link',             category: 'internet', description: 'A door made of text.' },
    personalWebsite: { id: 'personalWebsite', emoji: '🛖', name: 'Personal Website', category: 'internet', description: 'You made a home on the web.' },
    blog:            { id: 'blog',            emoji: '📰', name: 'Blog',             category: 'internet', secret: true, description: 'A diary the whole world is welcome to ignore.' },
    rss:             { id: 'rss',             emoji: '🔁', name: 'RSS',              category: 'internet', secret: true, description: 'The web, as it was meant to be read.' },
    internetCat:     { id: 'internetCat',     emoji: '🐱', name: 'Internet Cat',     category: 'internet', description: 'The internet\u2019s true purpose.' },
    meme:            { id: 'meme',            emoji: '🤣', name: 'Meme',             category: 'internet', description: 'An idea in its final, unstoppable form.' },
    deadWeb:         { id: 'deadWeb',         emoji: '🕸️', name: 'Dead Web',         category: 'internet', secret: true, description: 'The links still point somewhere. Nothing answers.' },
    virus:           { id: 'virus',           emoji: '🦠', name: 'Virus',            category: 'internet', description: 'It only wanted to multiply.' },
    glitch:          { id: 'glitch',          emoji: '👾', name: 'Glitch',           category: 'internet', secret: true, description: 'The machine dreamed of a machine.' },

    /* ---- occult ---- */
    skull:     { id: 'skull',     emoji: '💀', name: 'Skull',      category: 'occult', description: 'Everyone\u2019s final form.' },
    ghost:     { id: 'ghost',     emoji: '👻', name: 'Ghost',      category: 'occult', secret: true, description: 'Death, but it left the light on.' },
    undead:    { id: 'undead',    emoji: '🧟', name: 'Undead',     category: 'occult', description: 'Love, unfortunately, finds a way.' },
    secret:    { id: 'secret',    emoji: '🔮', name: 'Secret',     category: 'occult', secret: true, description: 'Some doors only open at night.' },
    blackHole: { id: 'blackHole', emoji: '🕳️', name: 'Black Hole', category: 'occult', secret: true, description: 'The universe\u2019s locked drawer.' },
    phoenix:   { id: 'phoenix',   emoji: '🐦‍🔥', name: 'Phoenix',    category: 'occult', secret: true, description: 'It read the whole thing and came back louder.' },

    /* ---- cosmos ---- */
    time:      { id: 'time',      emoji: '⏳', name: 'Time',      category: 'cosmos', description: 'The world learned patience.' },
    night:     { id: 'night',     emoji: '🌃', name: 'Night',     category: 'cosmos', description: 'Time, left alone, becomes night.' },
    moon:      { id: 'moon',      emoji: '🌙', name: 'Moon',      category: 'cosmos', description: 'The sky\u2019s oldest rock.' },
    star:      { id: 'star',      emoji: '⭐', name: 'Star',      category: 'cosmos', description: 'A light that outlived its fire.' },
    sun:       { id: 'sun',       emoji: '☀️', name: 'Sun',       category: 'cosmos', secret: true, description: 'Fire, squared and glorified.' },
    galaxy:    { id: 'galaxy',    emoji: '🌌', name: 'Galaxy',    category: 'cosmos', description: 'A city of suns.' },
    eclipse:   { id: 'eclipse',   emoji: '🌑', name: 'Eclipse',   category: 'cosmos', secret: true, description: 'The sky\u2019s private joke.' },
    ufo:       { id: 'ufo',       emoji: '🛸', name: 'UFO',       category: 'cosmos', secret: true, description: 'It blinked back.' },
    alien:     { id: 'alien',     emoji: '👽', name: 'Alien',     category: 'cosmos', description: 'Life, from a different draft.' },
    netuno:    { id: 'netuno',    emoji: '🪐', name: 'Netuno',    category: 'cosmos', secret: true, description: 'The outer dark has a name, and it\u2019s this one.' },
    supernova: { id: 'supernova', emoji: '💥', name: 'Supernova', category: 'cosmos', description: 'An ending so bright it counts as a beginning.' },

    /* ---- absurd ---- */
    hotTake:           { id: 'hotTake',           emoji: '🌶️', name: 'Hot Take',           category: 'absurd', description: 'Everyone has one. No one wants yours.' },
    ancientInfluencer: { id: 'ancientInfluencer', emoji: '🤳', name: 'Ancient Influencer', category: 'absurd', secret: true, description: 'Two million followers. Zero posts.' },
    meeting:           { id: 'meeting',           emoji: '📅', name: 'Meeting',            category: 'absurd', description: 'Two developers produced a third meeting.' }
  };

  /* Recipe: { a, b, result, msg, msgs?, secret?, ordered?, nightOnly?, fx? } */
  var RECIPES = [
    /* ---- the teaching chain ---- */
    { a: 'fire',  b: 'water', result: 'steam',    msg: 'Opposites create atmosphere.' },
    { a: 'water', b: 'earth', result: 'mud',      msg: 'Earth that gave up on posture.' },
    { a: 'air',   b: 'water', result: 'cloud',    msg: 'The sky\u2019s rough draft.' },
    { a: 'cloud', b: 'water', result: 'rain',     msg: 'The cloud finally admitted something.' },
    { a: 'rain',  b: 'earth', result: 'life',     msg: 'The mud flinched first.' },
    { a: 'life',  b: 'water', result: 'plant',    msg: 'Life, rooted and smug about it.' },
    { a: 'plant', b: 'time',  result: 'tree',     msg: 'Patience, made visible.' },
    { a: 'tree',  b: 'fire',  result: 'wood',     msg: 'A tree, repurposed.' },
    { a: 'earth', b: 'earth', result: 'mountain', msg: 'A very long argument with the sky.' },
    { a: 'human', b: 'earth', result: 'tool',     msg: 'The rock was promoted.' },
    { a: 'steam', b: 'earth', result: 'time',     msg: 'The world learned patience.' },

    /* ---- nature & weather ---- */
    { a: 'fire',      b: 'earth',    result: 'lava',      msg: 'The planet\u2019s way of thinking out loud.', fx: 'flare' },
    { a: 'water',     b: 'water',    result: 'ocean',     msg: 'Water, ambition edition.' },
    { a: 'air',       b: 'air',      result: 'wind',      msg: 'Air with somewhere to be.' },
    { a: 'cloud',     b: 'cloud',    result: 'storm',     msg: 'Two clouds having it out.', fx: 'shake' },
    { a: 'storm',     b: 'air',      result: 'lightning', msg: 'The sky, briefly honest.', fx: 'zap' },
    { a: 'rain',      b: 'wind',     result: 'snow',      msg: 'Rain, but it learned to whisper.' },
    { a: 'rain',      b: 'sun',      result: 'rainbow',   msg: 'An apology from the weather.' },
    { a: 'steam',     b: 'cloud',    result: 'fog',       msg: 'A cloud that lost its nerve.' },
    { a: 'lava',      b: 'water',    result: 'steam',     msg: 'The planet sighed.' },
    { a: 'storm',     b: 'water',    result: 'rain',      msg: 'The storm, softened.' },
    { a: 'steam',     b: 'air',      result: 'cloud',     msg: 'Steam, promoted.' },
    { a: 'cloud',     b: 'wind',     result: 'storm',     msg: 'The cloud learned to move, and regretted it.', fx: 'shake' },
    { a: 'storm',     b: 'fire',     result: 'lightning', msg: 'The storm struck a match.', fx: 'zap' },
    { a: 'mountain',  b: 'cloud',    result: 'snow',      msg: 'The mountain collects its mail.' },

    /* ---- life ---- */
    { a: 'ocean',     b: 'lightning', result: 'life',      msg: 'Primordial soup, stirred violently.', fx: 'zap' },
    { a: 'mud',       b: 'rain',      result: 'plant',     msg: 'The mud sprouted an opinion.' },
    { a: 'plant',     b: 'plant',     result: 'tree',      msg: 'Two plants entered a long agreement.' },
    { a: 'plant',     b: 'sun',       result: 'flower',    msg: 'The plant\u2019s loud opinion.' },
    { a: 'plant',     b: 'earth',     result: 'wheat',     msg: 'Grass with ambitions.' },
    { a: 'tree',      b: 'tree',      result: 'forest',    msg: 'Trees discovered crowds.' },
    { a: 'bee',       b: 'flower',    result: 'honey',     msg: 'A lifetime of small errands, bottled.' },

    /* ---- animals ---- */
    { a: 'ocean',    b: 'life',   result: 'fish',      msg: 'Life learned to swim before it learned to walk. Priorities.' },
    { a: 'life',     b: 'air',    result: 'bird',      msg: 'Life, ignoring gravity\u2019s memo.' },
    { a: 'bird',     b: 'bird',   result: 'egg',       msg: 'A bird\u2019s most confident decision.' },
    { a: 'house',    b: 'life',   result: 'cat',       msg: 'Something small decided to live with you.' },
    { a: 'wolf',     b: 'human',  result: 'dog',       msg: 'The wolf made an excellent mistake.' },
    { a: 'mountain', b: 'life',   result: 'wolf',      msg: 'The mountain learned to hunt.' },
    { a: 'flower',   b: 'wind',   result: 'bee',       msg: 'A flower\u2019s courier service.' },
    { a: 'wood',     b: 'life',   result: 'snake',     msg: 'The garden got interesting.' },
    { a: 'fish',     b: 'time',   result: 'whale',     msg: 'Time and water, taken seriously.' },
    { a: 'life',     b: 'time',   result: 'dinosaur',  msg: 'Some experiments take longer.' },
    { a: 'flower',   b: 'air',    result: 'butterfly', msg: 'A rumor with wings.' },
    { a: 'ocean',    b: 'egg',    result: 'fish',      msg: 'The egg chose water.' },
    { a: 'egg',      b: 'air',    result: 'bird',      msg: 'The egg chose poorly, then brilliantly.' },
    { a: 'house',    b: 'fish',   result: 'cat',       msg: 'It came for the fish. It stayed for the couch.' },
    { a: 'fish',     b: 'fish',   result: 'whale',     msg: 'The fish kept growing its story.' },
    { a: 'plant',    b: 'mud',    result: 'snake',     msg: 'The garden\u2019s quiet rumor.' },
    { a: 'dog',      b: 'moon',   result: 'wolf',      msg: 'Something old answers the moon.' },
    { a: 'egg',      b: 'time',   result: 'dinosaur',  msg: 'The egg waited too well.' },
    { a: 'flower',   b: 'life',   result: 'butterfly', msg: 'Life, in a decorative mood.' },

    /* ---- humanity ---- */
    { a: 'life',  b: 'mud',       result: 'human', msg: 'From mud, something stood up.' },
    { a: 'mud',   b: 'lightning', result: 'human', msg: 'Prometheus would like a word.', fx: 'zap' },
    { a: 'human', b: 'book',      result: 'brain', msg: 'A library that argues back.' },
    { a: 'human', b: 'human',     result: 'love',  msg: 'A self-combination with consequences.' },
    { a: 'human', b: 'star',      result: 'love',  msg: 'A clich\u00e9 that keeps working.' },

    /* ---- civilization ---- */
    { a: 'wood',     b: 'earth',    result: 'house',   msg: 'A tree, forgiven.' },
    { a: 'house',    b: 'house',    result: 'village', msg: 'Houses discovered gossip.' },
    { a: 'village',  b: 'village',  result: 'city',    msg: 'A village that stopped sleeping.' },
    { a: 'wood',     b: 'wood',     result: 'wheel',   msg: 'The circle\u2019s career began.' },
    { a: 'wheat',    b: 'fire',     result: 'bread',   msg: 'Grain, transformed by impatience.' },
    { a: 'plant',    b: 'fire',     result: 'coffee',  msg: 'The bean demanded fire.' },
    { a: 'wood',     b: 'tool',     result: 'paper',   msg: 'The tree, flattened into memory.' },
    { a: 'paper',    b: 'paper',    result: 'book',    msg: 'Paper with a spine and opinions.' },
    { a: 'mountain', b: 'fire',     result: 'metal',   msg: 'The mountain\u2019s hidden temper.' },
    { a: 'metal',    b: 'fire',     result: 'sword',   msg: 'An argument made of metal.' },
    { a: 'wood',     b: 'water',    result: 'boat',    msg: 'The wood forgave the water.' },
    { a: 'boat',     b: 'metal',    result: 'ship',    msg: 'A boat that stopped being polite.' },
    { a: 'metal',    b: 'mountain', result: 'bridge',  msg: 'The mountain\u2019s shortcut.' },
    { a: 'house',    b: 'mountain', result: 'castle',  msg: 'A house with trust issues.' },
    { a: 'steam',    b: 'metal',    result: 'engine',  msg: 'Steam, given a job.' },
    { a: 'metal',    b: 'time',     result: 'gold',    msg: 'Shinier with age.' },
    { a: 'gold',     b: 'paper',    result: 'money',   msg: 'Gold that fits in a pocket.' },
    { a: 'tool',     b: 'metal',    result: 'key',     msg: 'It opens exactly one thing. Good luck.' },
    { a: 'village',  b: 'money',    result: 'city',    msg: 'The village got expensive.' },
    { a: 'village',  b: 'mountain', result: 'castle',  msg: 'The village grew walls and opinions.' },
    { a: 'boat',     b: 'boat',     result: 'ship',    msg: 'Two boats became an argument for a third.' },
    { a: 'ship',     b: 'mountain', result: 'bridge',  msg: 'The mountain compromised.' },
    { a: 'steam',    b: 'tool',     result: 'engine',  msg: 'The tool learned to breathe.' },
    { a: 'gold',     b: 'gold',     result: 'money',   msg: 'Gold that gossiped.' },
    { a: 'human',    b: 'mountain', result: 'statue',  msg: 'The mountain, flattered.' },
    { a: 'human',    b: 'wood',     result: 'tool',    msg: 'The branch volunteered.' },
    { a: 'wood',     b: 'ocean',    result: 'boat',    msg: 'The wood studied the water carefully.' },
    { a: 'metal',    b: 'rainbow',  result: 'gold',    msg: 'The end of the rainbow has accounting.' },

    /* ---- culture ---- */
    { a: 'human',   b: 'paper',   result: 'writing',       msg: 'Thoughts, taxidermied.' },
    { a: 'tool',    b: 'paper',   result: 'writing',       msg: 'The tool learned to leave marks.' },
    { a: 'human',   b: 'rainbow', result: 'art',           msg: 'The rainbow, on purpose.' },
    { a: 'human',   b: 'flower',  result: 'art',           msg: 'The flower, framed.' },
    { a: 'human',   b: 'bird',    result: 'music',         msg: 'The bird\u2019s idea, stolen gracefully.' },
    { a: 'human',   b: 'whale',   result: 'music',         msg: 'The first album was fifty minutes of ocean.' },
    { a: 'book',    b: 'book',    result: 'philosophy',    msg: 'Two books arguing forever.' },
    { a: 'brain',   b: 'book',    result: 'philosophy',    msg: 'The brain read until it looped.' },
    { a: 'book',    b: 'fire',    result: 'forbiddenBook', msg: 'Some books are burned because they burn back.', secret: true, fx: 'flare' },
    { a: 'library', b: 'fire',    result: 'forbiddenBook', msg: 'The smoke spelled something.', secret: true, fx: 'flare' },
    { a: 'book',    b: 'house',   result: 'library',       msg: 'A house that remembers for you.' },
    { a: 'mountain', b: 'tool',   result: 'statue',        msg: 'Someone wanted to be remembered badly.' },
    { a: 'art',     b: 'music',   result: 'theatre',       msg: 'Art that watches you back.' },
    { a: 'music',   b: 'book',    result: 'theatre',       msg: 'The book got a stage and lost its manners.' },
    { a: 'brain',   b: 'lightning', result: 'idea',        msg: 'A dangerous amount of electricity reached the brain.', fx: 'zap' },

    /* ---- technology ---- */
    { a: 'idea',      b: 'metal',    result: 'computer',       msg: 'An idea with a fan.' },
    { a: 'metal',     b: 'brain',    result: 'robot',          msg: 'A brain with a warranty.' },
    { a: 'computer',  b: 'brain',    result: 'ai',             msg: 'The machine started finishing your sentences.' },
    { a: 'computer',  b: 'coffee',   result: 'developer',      msg: 'Nothing compiles without caffeine.' },
    { a: 'human',     b: 'computer', result: 'developer',      msg: 'The first day is mostly installing things.' },
    { a: 'lightning', b: 'metal',    result: 'battery',        msg: 'Lightning, grounded.' },
    { a: 'lightning', b: 'gold',     result: 'battery',        msg: 'Expensive lightning, stored politely.' },
    { a: 'metal',     b: 'air',      result: 'antenna',        msg: 'A metal ear for invisible things.' },
    { a: 'ship',      b: 'fire',     result: 'rocket',         msg: 'A ship that chose violence over water.', fx: 'flare' },
    { a: 'engine',    b: 'metal',    result: 'rocket',         msg: 'The engine looked up.', fx: 'flare' },
    { a: 'rocket',    b: 'antenna',  result: 'satellite',      msg: 'An antenna that moved out.' },
    { a: 'phone',     b: 'rocket',   result: 'satellite',      msg: 'The phone achieved orbit and still no signal.' },
    { a: 'book',      b: 'mountain', result: 'telescope',      msg: 'The mountain had questions too.' },
    { a: 'computer',  b: 'battery',  result: 'phone',          msg: 'A computer that fits in your pocket and your every waking moment.' },
    { a: 'internet',  b: 'antenna',  result: 'wifi',           msg: 'The internet, untethered and unbothered.' },
    { a: 'robot',     b: 'love',     result: 'syntheticHeart', msg: 'It beats. That\u2019s the disturbing part.', secret: true },
    { a: 'computer',  b: 'tool',     result: 'robot',          msg: 'The computer got hands. Mostly harmless.' },
    { a: 'robot',     b: 'book',     result: 'ai',             msg: 'It read everything. It has notes.' },

    /* ---- internet ---- */
    { a: 'computer',        b: 'computer', result: 'internet',        msg: 'Two computers started talking. Nobody stopped them.' },
    { a: 'internet',        b: 'tool',     result: 'link',            msg: 'A door made of text.' },
    { a: 'internet',        b: 'house',    result: 'personalWebsite', msg: 'You made a home on the web.' },
    { a: 'internet',        b: 'writing',  result: 'personalWebsite', msg: 'A room of one\u2019s own, with hyperlinks.' },
    { a: 'personalWebsite', b: 'writing',  result: 'blog',            msg: 'A diary the whole world is welcome to ignore.', secret: true },
    { a: 'book',            b: 'internet', result: 'blog',            msg: 'Chapters, posted into the void.', secret: true },
    { a: 'blog',            b: 'antenna',  result: 'rss',             msg: 'The web, as it was meant to be read.', secret: true },
    { a: 'cat',             b: 'computer', result: 'internetCat',     msg: 'The internet has found its true purpose.' },
    { a: 'cat',             b: 'internet', result: 'internetCat',     msg: 'The wires learned to purr.' },
    { a: 'internetCat',     b: 'idea',     result: 'meme',            msg: 'An idea in its final, unstoppable form.' },
    { a: 'internet',        b: 'art',      result: 'meme',            msg: 'Art, optimized for chaos.' },
    { a: 'internet',        b: 'computer', result: 'deadWeb',         msg: 'The links still point somewhere. Nothing answers.', secret: true, fx: 'spooky' },
    { a: 'internet',        b: 'ghost',    result: 'deadWeb',         msg: 'Some pages only load in memory.', secret: true, fx: 'spooky' },
    { a: 'computer',        b: 'life',     result: 'virus',           msg: 'It only wanted to multiply.' },
    { a: 'computer',        b: 'bee',      result: 'virus',           msg: 'It only wanted to multiply.' },
    { a: 'ai',              b: 'ai',       result: 'glitch',          msg: 'The machine dreamed of a machine.', secret: true, fx: 'spooky' },
    { a: 'robot',           b: 'ghost',    result: 'glitch',          msg: 'Haunted machinery is still machinery.', secret: true, fx: 'spooky' },

    /* ---- occult ---- */
    { a: 'human',    b: 'time',  result: 'skull',     msg: 'Everyone\u2019s final form.' },
    { a: 'dinosaur', b: 'time',  result: 'skull',     msg: 'Extinction, personalized.' },
    { a: 'skull',    b: 'skull', result: 'ghost',     msg: 'Death, but it left the light on.', secret: true, fx: 'spooky' },
    { a: 'skull',    b: 'air',   result: 'ghost',     msg: 'The skull let go of the heavy parts.', secret: true, fx: 'spooky' },
    { a: 'skull',    b: 'love',  result: 'undead',    msg: 'Love, unfortunately, finds a way.' },
    { a: 'ghost',    b: 'love',  result: 'undead',    msg: 'It came back for the company.' },
    { a: 'moon',     b: 'key',   result: 'secret',    msg: 'Some doors only open at night.', secret: true, fx: 'spooky' },
    { a: 'star',     b: 'key',   result: 'secret',    msg: 'The key was always pointing up.', secret: true },
    { a: 'secret',   b: 'galaxy', result: 'blackHole', msg: 'The universe\u2019s locked drawer.', secret: true, fx: 'cosmic' },
    { a: 'sun',      b: 'time',  result: 'blackHole', msg: 'Even light gets tired.', secret: true, fx: 'cosmic' },
    { a: 'forbiddenBook', b: 'fire', result: 'phoenix', msg: 'It read the whole thing and came back louder.', secret: true, ordered: true, fx: 'flare' },

    /* ---- cosmos ---- */
    { a: 'time',      b: 'time',      result: 'night',     msg: 'Time, left alone, becomes night.' },
    { a: 'time',      b: 'moon',      result: 'night',     msg: 'The moon supervises the dark.' },
    { a: 'night',     b: 'earth',     result: 'moon',      msg: 'The sky\u2019s oldest rock.' },
    { a: 'night',     b: 'mountain',  result: 'moon',      msg: 'The mountain\u2019s reflection on the sky.' },
    { a: 'fire',      b: 'night',     result: 'star',      msg: 'A light that outlived its fire.' },
    { a: 'night',     b: 'night',     result: 'star',      msg: 'Night, squared, starts to shine.' },
    { a: 'fire',      b: 'fire',      result: 'sun',       msg: 'Fire, squared and glorified.', secret: true, fx: 'flare' },
    { a: 'telescope', b: 'star',      result: 'galaxy',    msg: 'A city of suns.', fx: 'cosmic' },
    { a: 'star',      b: 'star',      result: 'galaxy',    msg: 'Stars discovered crowds.', fx: 'cosmic' },
    { a: 'sun',       b: 'moon',      result: 'eclipse',   msg: 'The sky\u2019s private joke.', secret: true, fx: 'cosmic' },
    { a: 'moon',      b: 'star',      result: 'owl',       msg: 'It only interviews at night.', secret: true, nightOnly: true },
    { a: 'moon',      b: 'telescope', result: 'ufo',       msg: 'It blinked back.', secret: true, nightOnly: true, fx: 'spooky' },
    { a: 'ufo',       b: 'life',      result: 'alien',     msg: 'Life, from a different draft.' },
    { a: 'life',      b: 'galaxy',    result: 'alien',     msg: 'Somewhere, life filed a copy.' },
    { a: 'alien',     b: 'rocket',    result: 'ufo',       msg: 'Return flight.' },
    { a: 'star',      b: 'secret',    result: 'netuno',    msg: 'The outer dark has a name, and it\u2019s this one.', secret: true, fx: 'cosmic' },
    { a: 'telescope', b: 'galaxy',    result: 'netuno',    msg: 'You found it by looking too long.', secret: true, fx: 'cosmic' },
    { a: 'star',      b: 'fire',      result: 'supernova', msg: 'An ending so bright it counts as a beginning.', fx: 'flare' },

    /* ---- absurd ---- */
    { a: 'internet',  b: 'philosophy', result: 'hotTake',           msg: 'Everyone has one. No one wants yours.' },
    { a: 'philosophy', b: 'fire',      result: 'hotTake',           msg: 'Someone is wrong somewhere, urgently.', fx: 'flare' },
    { a: 'statue',    b: 'phone',      result: 'ancientInfluencer', msg: 'Two million followers. Zero posts.', secret: true },
    { a: 'statue',    b: 'internet',   result: 'ancientInfluencer', msg: 'The followers were always there. Now there\u2019s a count.', secret: true },
    { a: 'developer', b: 'developer',  result: 'meeting',           msg: 'Two developers produced a third meeting.' }
  ];

  var DATA = {
    ELEMENTS: ELEMENTS,
    RECIPES: RECIPES,
    CATEGORIES: CATEGORIES,
    STARTERS: STARTERS
  };

  if (typeof module !== 'undefined' && module.exports) {
    module.exports = DATA;
  }
  globalThis.EMOJESIS_DATA = DATA;
})();