From 8db94b5a2c286493f5a5120e4505bd3965de9a5d Mon Sep 17 00:00:00 2001 From: Joe Wreschnig Date: Fri, 5 Jul 2013 15:45:59 +0200 Subject: [PATCH] Initial import. --- .gitignore | 2 + README.md | 12 + acnl-outfit.js | 149 +++++ acnl-wearables-list.js | 1218 ++++++++++++++++++++++++++++++++++++++++ index.html | 116 ++++ labelle.jpg | Bin 0 -> 20685 bytes 6 files changed, 1497 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 acnl-outfit.js create mode 100644 acnl-wearables-list.js create mode 100644 index.html create mode 100644 labelle.jpg diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5236e1e --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*~ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..5388307 --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +This is the source code for the [Labelle Litanizer]. You can use it to +run your own litanizer, or learn how to program JavaScript poorly. + +http://creativecommons.org/publicdomain/zero/1.0/ + +To the extent possible under law, I have waived all copyright and +related or neighboring rights to this work. + +Labelle is some kind of copyright and trademark of Nintendo and no +claim is made on her image. + + [Labelle Litanizer]: http://yukkurigames.com/labelle/ diff --git a/acnl-outfit.js b/acnl-outfit.js new file mode 100644 index 0000000..c09c3a2 --- /dev/null +++ b/acnl-outfit.js @@ -0,0 +1,149 @@ +// http://creativecommons.org/publicdomain/zero/1.0/ +// +// To the extent possible under law, the person who associated CC0 +// with this work has waived all copyright and related or neighboring +// rights to this work. + +"use strict"; + +Array.prototype.firstWhere = function (callback, thisArg) { + for (var i = 0; i < this.length; ++i) + if (callback.call(thisArg, this[i])) + return this[i]; +}; + +Array.prototype.contains = function (o) { + return this.indexOf(o) >= 0; +}; + +Array.prototype.lacks = function (o) { + return !this.contains(o); +}; + +Array.prototype.containsSubset = function (o) { + return o.every(this.contains, this); +}; + +Array.prototype.pushUnique = function (o) { + if (this.lacks(o)) + this.push(o); +}; + +var BLOCKS = { + helmets: ["hats", "accessories"], + wetsuits: ["tops", "bottoms", "socks", "dresses"], + dresses: ["tops", "bottoms"] +}; +Object.keys(ACNL_WEARABLES).forEach(function (type) { + BLOCKS[type] = (BLOCKS[type] || []).concat(type); +}); +Object.keys(BLOCKS).forEach(function (k) { + BLOCKS[k].forEach(function (v) { + BLOCKS[v].pushUnique(k); + }); +}); + +function choice (os) { + return os[Math.floor(os.length * Math.random())]; +} + +function category (item) { + return Object.keys(ACNL_WEARABLES).firstWhere(function (type) { + return ACNL_WEARABLES[type].contains(item); + }); +} + +function notLewd (outfit) { + var categories = outfit.map(category); + return (categories.contains("wetsuits") + || categories.contains("dresses") + || categories.containsSubset(["tops", "bottoms"])); +} + +function buildArray (a, l) { + return (a || []).concat(l); +} + +function impossibilities (categories) { + return categories.map(function (c) { return BLOCKS[c]; } + ).reduce(buildArray, []); +} + +function possibilities (outfit) { + return Object.keys(ACNL_WEARABLES + ).filter(Array.prototype.lacks, impossibilities(outfit.map(category)) + ).map(function (k) { return ACNL_WEARABLES[k] } + ).reduce(buildArray, []); +} + +function isFinished(outfit) { + return notLewd(outfit) && Math.random() > 0.5; +} + +function nextItem (outfit) { + return !isFinished(outfit) && choice(possibilities(outfit)); +} + +function outfit () { + var ps = []; + var next; + while (next = nextItem(ps)) + ps.push(next); + return ps; +} + +function article (item) { + if (item[0].toUpperCase() === item[0] && item.indexOf("'s") >= 0) + return ""; + else if (item.substr(-1) === "s" && item.substr(-2) !== "ss" + && item.substr(-6) !== "cosmos") // :( + return ""; + else if ("aeiouAEIO".indexOf(item[0]) >= 0 + || ("FHLMNRSX".indexOf(item[0]) >= 0 + && item.split(" ")[0].toUpperCase() == item.split(" ")[0])) + return "an "; + else + return "a "; +} + +function dblink (name) { + return ["", name.replace("&", "&"), ""].join(""); +} + +function litanize (names, link) { + names = names.map(function (name) { + return article(name) + (link ? dblink(name) : name); + }); + switch (names.length) { + case 1: break; + case 2: + names[names.length - 1] = (choice(["and ", "with "]) + + names[names.length - 1]); + break; + default: + if (Math.random() > 0.5 && names.length >= 4) { + names[names.length - 2] = "and " + names[names.length - 2]; + names[names.length - 1] = "with " + names[names.length - 1]; + } else { + names[names.length - 1] = "and " + names[names.length - 1]; + } + break; + } + + return names.join(names.length == 2 ? " " : ", "); +} + +function litanizeElement (eid, tid) { + var o = outfit(); + document.getElementById(eid).innerHTML = litanize(o, true) + "?"; + // TODO: This often generates > 140 characters. Do I care? + // Maybe pick shorter prefixes if it would help. + var t = document.getElementById(tid); + t.href = t.href.replace( + /&text=[^&]+/, "&text=" + encodeURIComponent( + choice(["Going out in ", + "Labelle suggested ", + "I'll wear "]) + litanize(o, false) + ".")); +} diff --git a/acnl-wearables-list.js b/acnl-wearables-list.js new file mode 100644 index 0000000..303233c --- /dev/null +++ b/acnl-wearables-list.js @@ -0,0 +1,1218 @@ +// http://creativecommons.org/publicdomain/zero/1.0/ +// +// To the extent possible under law, the person who associated CC0 +// with this work has waived all copyright and related or neighboring +// rights to this work. + +"use strict"; + +var ACNL_WEARABLES = { + "accessories": [ + "3D glasses", + "aviator shades", + "bad bro's stache", + "ballroom mask", + "bandage", + "beak", + "big bro's mustache", + "birthday shades", + "blue frames", + "brown glasses", + "cucumber pack", + "curly mustache", + "cyber shades", + "doctor's mask", + "doctor's mirror", + "eye mask", + "eye patch", + "facial mask", + "funky glasses", + "funny glasses", + "gas mask", + "goggles", + "Gracie glasses", + "green glasses", + "heart shades", + "HMD", + "hockey mask", + "huge shades", + "jester's mask", + "king's beard", + "ladder shades", + "leaf", + "lemon pack", + "masquerade mask", + "mint glasses", + "monocle", + "oval shades", + "pacifier", + "pilot shades", + "pink glasses", + "post-op patch", + "purple glasses", + "red glasses", + "red nose", + "rimmed glasses", + "round glasses", + "Santa beard", + "silver frames", + "snorkel mask", + "sporty shades", + "stache & glasses", + "star shades", + "steampunk glasses", + "superhero mask", + "thick glasses", + "tiny shades", + "tortoise specs", + "triangle shades", + "yellow glasses", + + "black rose", + "blue rose", + "gold rose", + "orange rose", + "pink rose", + "purple rose", + "yellow rose" + + ], + "bottoms": [ + "acid-washed pants", + "aloha shorts", + "arctic-camo pants", + "armor pants", + "baseball pants", + "basketball shorts", + "bear-costume pants", + "black denim pants", + "black denim skirt", + "black formal pants", + "black formal skirt", + "black track pants", + "blue boxing shorts", + "blue-grid skirt", + "blue gym shorts", + "blue pj bottoms", + "blue polka shorts", + "blue-stripe pants", + "blue warm-up pants", + "blue-zap pants", + "bone pants", + "brown argyle skirt", + "brown formal pants", + "brown plaid shorts", + "cargo pants", + "caveman shorts", + "checkerboard skirt", + "chino pants", + "corseted skirt", + "cow pants", + "cuffed pants", + "dapper skirt", + "dark polka skirt", + "denim skirt", + "desert-camo pants", + "dogtooth pants", + "dragon leggings", + "dry denim pants", + "dry denim skirt", + "emerald polka skirt", + "explorer pants", + "festivale pants", + "firefighter pants", + "flame pants", + "frog-costume pants", + "funky dot skirt", + "genie pants", + "giraffe pants", + "grass skirt", + "gray formal pants", + "gray formal skirt", + "gray-stripe pants", + "gray sweatpants", + "gray tartan skirt", + "green gym shorts", + "green plaid shorts", + "green tartan pants", + "green warm-up pants", + "green-zap pants", + "hero's pants", + "hot spring skirt", + "imperial pants", + "jester pants", + "jinbei shorts", + "jungle-camo pants", + "jungle-camo shorts", + "kappa-costume pants", + "kilt", + "kung-fu pants", + "leopard pants", + "leopard skirt", + "lite polka skirt", + "matador's pants", + "military pants", + "mint gingham skirt", + "mummy pants", + "natty skirt", + "navy formal pants", + "navy formal skirt", + "new spring skirt", + "ninja pants", + "gold-armor pants", + "orange pants", + "pastel-check skirt", + "patched-knee pants", + "patched pants", + "pep-squad skirt", + "picnic skirt", + "pink argyle skirt", + "pink pj bottoms", + "pink sweatpants", + "pleather pants", + "racing pants", + "rainbow plaid shorts", + "red boxing shorts", + "red-grid skirt", + "red gym shorts", + "red plaid skirt", + "red polka skirt", + "red-stripe pants", + "red tartan pants", + "red warm-up pants", + "red-zap pants", + "relay shorts", + "royal shorts", + "running pants", + "sailor skirt", + "samurai pants", + "Santa pants", + "scale-armor pants", + "soccer shorts", + "space pants", + "tan dogtooth pants", + "tiger pants", + "two-tone pants", + "Varia Suit pants", + "western pants", + "white formal pants", + "white-lace skirt", + "worn-out jeans", + "wrestler pants", + "zebra pants" + ], + "dresses": [ + "academy uniform", + "alpinist dress", + "ballet outfit", + "bathrobe", + "black velvet dress", + "blossom dress", + "blossoming dress", + "blue dotted dress", + "blue lace-up dress", + "blue party dress", + "blue retro dress", + "butterfly dress", + "cake dress", + "cake tank dress", + "casual outfit", + "cat dress", + "cat tank dress", + "caveman tank dress", + "chima jeogori dress", + "citrus gingham dress", + "classic dress", + "cool dress", + "dapper dress", + "dazed dress", + "dogtooth dress", + "dollhouse dress", + "dreamy tank dress", + "embroidered dress", + "fairy-tale dress", + "festivale tank dress", + "festive dress", + "festive-tree dress", + "fleece dress", + "floral knit dress", + "fluffy dress", + "fluffy tank dress", + "frock coat", + "gaudy dress", + "graduation gown", + "green dress", + "green lace-up dress", + "gumdrop dress", + "kimono", + "lime dress", + "lotus tank dress", + "loud bloom dress", + "lovely dress", + "maid dress", + "milkmaid dress", + "moldy dress", + "muumuu", + "natty dress", + "nurse's uniform", + "orange lace-up dress", + "orange retro dress", + "overall dress", + "palatial tank dress", + "pastel-stripe dress", + "pharaoh's outfit", + "pinafore", + "pink lace-up dress", + "pink party dress", + "pink polka dress", + "plaid cami dress", + "plum coat", + "polka-dot dress", + "poncho", + "pop bloom dress", + "prep-school uniform", + "prim outfit", + "princess dress", + "red dress", + "red riding dress", + "ribbon dress", + "rose-sky tank dress", + "rose tank dress", + "sea captain's coat", + "shirtdress", + "silk bloom dress", + "sky dress", + "spring kimono", + "star tank dress", + "sweater dress", + "tan dogtooth dress", + "tartan plaid outfit", + "toga", + "trench coat", + "turnip dress", + "twinkle tank dress", + "U-R-here dress", + "vogue dress", + "waitress dress", + "witch's robe", + "yellow dotted dress", + "yellow raincoat", + "yodel dress" + ], + "helmets": [ + "Fi mask", + "Majora's mask", + "Makar's mask", + "Midna's mask", + "Samus mask", + "blue ogre mask", + "blue-zap helmet", + "bug mask", + "catcher's mask", + "diving mask", + "fencing mask", + "ghost mask", + "green-pumpkin head", + "green-zap helmet", + "King Tut mask", + "knight's helmet", + "lion-dance mask", + "monster mask", + "motocross helmet", + "mummy mask", + "pink-zap helmet", + "pumpkin head", + "purple-pumpkin head", + "racing helmet", + "red ogre mask", + "red-pumpkin head", + "red-zap helmet", + "retro helmet", + "ski mask", + "space helmet", + "wrestling mask", + "yellow-pumpkin head" + ], + "hats": [ + "afro cap", + "afro wig", + "alpinist hat", + "baby's hat", + "badge hat", + "balloon hat", + "banana split hat", + "bandana", + "batter's helmet", + "bear cap", + "beret", + "bicycle helmet", + "big bro's hat", + "birthday hat", + "black veil", + "blue cap", + "blue headgear", + "blue new year's hat", + "blue nightcap", + "blue Pikmin", + "blue plaid fedora", + "blue pom-pom hat", + "blue ribbon", + "braided wig", + "bridal veil", + "bulb bopper", + "bun wig", + "bunny hood", + "captain's hat", + "cat cap", + "cavalier hat", + "celebration hat", + "chef's hat", + "cloche hat", + "coin headpiece", + "combat helmet", + "conical straw hat", + "cow bone", + "crown", + "dandy hat", + "detective hat", + "diver's hood", + "DJ cap", + "do-rag", + "elegant hat", + "emperor's cap", + "explorer's hat", + "festivale accessory", + "fireman's hat", + "flamenco hat", + "flashy hairpin", + "floppy hat", + "flower bopper", + "football helmet", + "frog cap", + "funky wig", + "geisha wig", + "girl's day updo", + "Gracie hat", + "grandpa hat", + "grape hat", + "green cap", + "green headgear", + "green knit hat", + "green new year's hat", + "hair-bow wig", + "halo", + "headband", + "headkerchief", + "heart bopper", + "heart hairpin", + "hero's cap", + "hibiscus hairpin", + "hot dog hat", + "hunter's cap", + "jester's cap", + "jockey's helmet", + "kaffiyeh", + "kappa cap", + "kintaro wig", + "kiwi hat", + "light blue cap", + "li'l bro's hat", + "mailman's hat", + "mandarin hat", + "matador's hat", + "matronly bun", + "melon hat", + "milkmaid hat", + "mohawk wig", + "moon hairpin", + "newsprint helmet", + "ninja hood", + "nurse's cap", + "ogre's wig", + "orange knit hat", + "outback hat", + "paperboy cap", + "pigtail", + "pilot's cap", + "pilot's hat", + "pink knit hat", + "pink nightcap", + "pirate's hat", + "plain black cap", + "police cap", + "powdered wig", + "puffy hat", + "purple cap", + "purple-imp hood", + "purple knit hat", + "red cap", + "red headgear", + "red hood", + "red horned hat", + "red new year's hat", + "red Pikmin", + "red pom-pom hat", + "red ribbon", + "red team cap", + "regent wig", + "ribboned straw hat", + "roman helmet", + "royal crown", + "safety helmet", + "sailor's hat", + "samurai helmet", + "samurai wig", + "Santa hat", + "scholar's hat", + "school cap", + "school hat", + "shamrock hat", + "shower cap", + "silk hat", + "skeleton hood", + "small silk hat", + "snowman head", + "sombrero", + "stagehand hat", + "star bopper", + "star cap", + "star hairpin", + "straw boater", + "straw hat", + "straw umbrella hat", + "strawberry hat", + "stripe knit cap", + "student cap", + "swimming cap", + "tam-o'-shanter", + "terry-cloth do-rag", + "tiara hair", + "tingle hood", + "Toad hat", + "top hat", + "topknot wig", + "tsunokakushi", + "tulip hat", + "turban", + "viking helmet", + "warbonnet", + "Wario hat", + "watermelon hat", + "werewolf hood", + "white cap", + "white police cap", + "white school cap", + "white team cap", + "witch's hat", + "wizard's cap", + "y. new year's hat", + "yellow cap", + "yellow Pikmin", + "yellow ribbon", + "black cosmos", + "black lily", + "black tulip", + "blue pansy", + "blue violet", + "orange cosmos", + "orange lily", + "orange pansy", + "orange tulip", + "pink carnation", + "pink cosmos", + "pink lily", + "pink tulip", + "purple pansy", + "purple tulip", + "purple violet", + "red carnation", + "red cosmos", + "red lily", + "red pansy", + "red rose", + "red tulip", + "white carnation", + "white cosmos", + "white lily", + "white pansy", + "white rose", + "white tulip", + "white violet", + "yellow cosmos", + "yellow lily", + "yellow pansy", + "yellow tulip", + "yellow violet", + + "dandelions", + "lucky clovers" + ], + "shoes": [ + "armor shoes", + "ballet slippers", + "basketball shoes", + "black loafers", + "black pumps", + "black rain boots", + "blue pumps", + "blue sneakers", + "blue wrestling shoes", + "brown loafers", + "brown pumps", + "brown slip-ons", + "cleats", + "climbing shoes", + "clogs", + "colorful sneakers", + "cowboy boots", + "flip-flops", + "flower loafers", + "gladiator sandals", + "gold-armor shoes", + "green buckled shoes", + "green polka pumps", + "green sandals", + "green-stripe shoes", + "hero's boots", + "hiking boots", + "jester's shoes", + "kimono sandals", + "lace-up boots", + "leopard pumps", + "Mary Janes", + "monochrome shoes", + "ninja sandals", + "orange sandals", + "orange shoes", + "pink slip-ons", + "pink sneakers", + "polka-dot rain boots", + "purple dot shoes", + "purple high-tops", + "purple pumps", + "red boat shoes", + "red shoes", + "red wrestling shoes", + "Santa boots", + "shearling boots", + "slippers", + "snow boots", + "steel-toed boots", + "stripe shoes", + "tasseled loafers", + "tropical sandals", + "Varia Suit shoes", + "white leather shoes", + "white patent shoes", + "wooden clogs", + "yellow buckled shoes", + "yellow rain boots", + "yellow sneakers", + "zap boots" + ], + "socks": [ + "argyle socks", + "argyle tights", + "beige tights", + "black ankle socks", + "black leggings", + "black stockings", + "black tights", + "blue-stripe tights", + "bobby socks", + "brown socks", + "brown-stripe socks", + "checkered socks", + "colorful socks", + "dress socks", + "fishnet tights", + "gray leggings", + "gray socks", + "gray tights", + "green-stripe socks", + "green tights", + "heart-print tights", + "hiking gaiters", + "leg warmers", + "navy socks", + "polka-dot socks", + "purple star socks", + "purple-stripe tights", + "rainbow tights", + "red tights", + "soccer socks", + "star tights", + "tube socks", + "white ankle socks", + "white-lace socks", + "white socks", + "white stockings" + ], + "equips": [ + "bat umbrella", + "beach umbrella", + "blue dot parasol", + "blue umbrella", + "busted umbrella", + "camo umbrella", + "candy umbrella", + "daisy umbrella", + "eggy parasol", + "elegant umbrella", + "flame umbrella", + "forest umbrella", + "gelato umbrella", + "ghost umbrella", + "Gracie umbrella", + "green umbrella", + "lacy parasol", + "leaf umbrella", + "lemon umbrella", + "leopard umbrella", + "maple umbrella", + "melon umbrella", + "mint umbrella", + "modern umbrella", + "paper parasol", + "paw umbrella", + "Peach's parasol", + "petal parasol", + "picnic umbrella", + "red umbrella", + "ribbon umbrella", + "spider umbrella", + "sunny parasol", + "toad parasol", + "yellow umbrella", + "zebra umbrella", + "blue balloon", + "blue pinwheel", + "bunny b. balloon", + "bunny c. balloon", + "bunny g. balloon", + "bunny i. balloon", + "bunny o. balloon", + "bunny p. balloon", + "bunny r. balloon", + "bunny y. balloon", + "cyan balloon", + "cyan pinwheel", + "green balloon", + "green pinwheel", + "heart b. balloon", + "heart c. balloon", + "heart g. balloon", + "heart i. balloon", + "heart o. balloon", + "heart p. balloon", + "heart r. balloon", + "heart y. balloon", + "indigo balloon", + "indigo pinwheel", + "orange balloon", + "orange pinwheel", + "pink balloon", + "pink pinwheel", + "red balloon", + "red pinwheel", + "yellow balloon", + "yellow pinwheel", + "axe", + "fishing rod", + "golden axe", + "golden can", + "golden net", + "golden rod", + "golden shovel", + "golden slingshot", + "megaphone", + "net", + "shovel", + "silver axe", + "silver can", + "silver net", + "silver rod", + "silver shovel", + "silver slingshot", + "slingshot", + "timer", + "toy hammer", + "watering can", + "party popper", + "tweeter", + "bubble wand", + "sparkler", + "matcha soft-serve", + "choco soft-serve", + "swirl soft-serve", + "vanilla soft-serve", + "strawberry ice cream", + "vanilla ice cream", + "lemon double scoop", + "mint double scoop", + "dandelion puff" + ], + "tops": [ + "24-hour-shop uniform", + "A tee", + "acid-washed jacket", + "after-school jacket", + "airy tee", + "amethyst shirt", + "amethyst tee", + "aqua polka tank", + "aqua polka tee", + "arctic-camo shirt", + "arctic-camo tee", + "argyle knit shirt", + "armor suit", + "aurora knit shirt", + "bad plaid shirt", + "bad plaid tee", + "barber tee", + "baseball shirt", + "basketball tank", + "BB tee", + "beaded shirt", + "beaded tank", + "bear costume", + "bear shirt", + "bear tee", + "beatnik shirt", + "beatnik tank", + "beatnik tee", + "beige emblem blazer", + "beige knit shirt", + "big bro's tee", + "big dot tank", + "big dot tee", + "big star tee", + "black denim jacket", + "black flannel shirt", + "black letter jacket", + "black track jacket", + "blossom tee", + "blue aloha tee", + "blue argyle shirt", + "blue argyle tank", + "blue argyle tee", + "blue-bar shirt", + "blue-bar tee", + "blue-check shirt", + "blue-check tee", + "blue diamond shirt", + "blue diamond tee", + "blue down jacket", + "blue flannel shirt", + "blue-grid shirt", + "blue-grid tee", + "blue gym tee", + "blue jacket", + "blue letter jacket", + "blue pj shirt", + "blue plaid shirt", + "blue plaid tee", + "blue ringmaster coat", + "blue-stripe shirt", + "blue-stripe tee", + "blue tartan shirt", + "blue tartan tee", + "blue tie-dye tank", + "blue tie-dye tee", + "blue track jacket", + "blue-zap suit", + "bold-check tee", + "bone shirt", + "bright tee", + "brown-bar shirt", + "brown-bar tee", + "bubble gum shirt", + "bubble gum tee", + "bubble tank", + "bubble tee", + "bunny shirt", + "bunny tee", + "cafe tee", + "cafe uniform", + "camel shirt", + "canary shirt", + "candy gingham shirt", + "candy gingham tee", + "captain's jacket", + "caterpillar tank", + "cavalier shirt", + "caveman tank", + "chain-gang shirt", + "chain-gang tee", + "checkerboard shirt", + "checkerboard tee", + "checkered tee", + "chef's outfit", + "cherry tee", + "chevron shirt", + "chichi-print tee", + "chick tee", + "chocomint tee", + "circuit tank", + "citrus tank", + "citrus tee", + "clerk's shirt", + "cloudy tee", + "club tee", + "comfy sweater", + "concierge shirt", + "cool tank", + "coral tank", + "coral tee", + "corseted shirt", + "cow tank", + "cow tee", + "crewel tee", + "crossing shirt", + "cyan argyle shirt", + "cyan argyle tank", + "cyan argyle tee", + "cycling shirt", + "cycling tee", + "daisy tee", + "danger tee", + "dapper shirt", + "dapper tee", + "dark polka shirt", + "dark polka tee", + "dawn tank", + "dawn tee", + "dazed shirt", + "dazed tee", + "deep blue tank", + "deep blue tee", + "deer shirt", + "denim jacket", + "denim vest", + "desert-camo shirt", + "desert-camo tee", + "detective outfit", + "diamond tee", + "dice tank", + "doctor's coat", + "dogtooth shirt", + "dogtooth tee", + "Dr. Shrunk's jacket", + "dragon jacket", + "dragon suit", + "dreamy tee", + "earthy knit shirt", + "eight-ball tee", + "elephant shirt", + "elephant tee", + "explorer tee", + "fall leaf shirt", + "fall leaf tee", + "fall plaid shirt", + "fall plaid tee", + "fern shirt", + "fern tee", + "festivale tank", + "fiendish shirt", + "firefighter shirt", + "fish tee", + "fishing vest", + "five-ball tee", + "flame shirt", + "flame tee", + "flan tank", + "flight crew shirt", + "floral knit tee", + "flowery tee", + "folk shirt", + "folk tunic", + "four-ball tee", + "fresh tank", + "fresh tee", + "frog costume", + "frog shirt", + "frog tee", + "funky-dot tank", + "funky-dot tee", + "future tank", + "garden tank", + "gelato shirt", + "gelato tee", + "genie shirt", + "genie vest", + "giraffe tank", + "giraffe tee", + "go go shirt", + "gold-armor suit", + "gold-bar shirt", + "gold-bar tee", + "Gracie tank", + "grape-stripe shirt", + "grape-stripe tee", + "grape tank", + "grape tee", + "grass tee", + "gray parka", + "gray tank", + "gray tartan shirt", + "gray tartan tee", + "green-bar shirt", + "green-bar tee", + "green emblem blazer", + "green gym tee", + "green-stripe tank", + "green tie-dye tank", + "green tie-dye tee", + "green warm-up jacket", + "green-zap suit", + "groovy tank", + "groovy tee", + "gumdrop tee", + "hanten shirt", + "happi tee", + "heart tee", + "hero's clothes", + "HHA jacket", + "HHA tee", + "hot dog tank", + "hot spring tee", + "icy shirt", + "imperial shirt", + "jade plaid shirt", + "jade plaid tee", + "jagged tank", + "jagged tee", + "jester shirt", + "jester tank", + "jinbei top", + "jockey shirt", + "jungle-camo shirt", + "jungle-camo tee", + "kanji tee", + "kappa costume", + "kiddie tee", + "kid's smock", + "kiwi tank", + "kiwi tee", + "kung-fu shirt", + "kung-fu tee", + "lacy white tank", + "ladybug tank", + "leaf tee", + "lemon gingham shirt", + "lemon gingham tee", + "leopard tank", + "leopard tee", + "lightning tee", + "li'l bro's tee", + "lite polka shirt", + "lite polka tee", + "lotus tee", + "loud bloom tee", + "lovely tee", + "matador's jacket", + "melon gingham shirt", + "melon gingham tee", + "melon shirt", + "melon tee", + "military uniform", + "mint gingham shirt", + "mint gingham tee", + "mint shirt", + "misty tank", + "misty tee", + "mod shirt", + "moldy shirt", + "monkey shirt", + "mummy shirt", + "MVP shirt", + "MVP tee", + "natty shirt", + "natty tee", + "nebula shirt", + "nebula tee", + "new spring tee", + "night sky tee", + "nine-ball tee", + "ninja shirt", + "no. 1 shirt", + "no. 2 shirt", + "no. 23 shirt", + "no. 3 shirt", + "no. 4 shirt", + "no. 5 shirt", + "no. 67 shirt", + "noble shirt", + "noodle tee", + "one-ball tee", + "optical shirt", + "optical tank", + "orange jacket", + "orange tie-dye tank", + "orange tie-dye tee", + "painter's shirt", + "painter's tee", + "pastel-stripe tee", + "paw tee", + "peachy tank", + "peachy tee", + "peacoat", + "pep-squad tank", + "pep-squad tee", + "periwinkle tee", + "picnic shirt", + "picnic tee", + "pink argyle shirt", + "pink argyle tank", + "pink argyle tee", + "pink bud tank", + "pink parka", + "pink pj shirt", + "pink tank", + "pink tartan shirt", + "pink tartan tee", + "pink wave tank", + "pink-zap suit", + "pleather vest", + "pop bloom tee", + "preppy shirt", + "prism tee", + "pulse shirt", + "pulse tank", + "purple tie-dye tank", + "purple tie-dye tee", + "racer 6 tee", + "racer tee", + "racing shirt", + "raglan shirt", + "raglan tee", + "rainbow tank", + "rainbow tee", + "rally tank", + "rally tee", + "red aloha tee", + "red argyle shirt", + "red argyle tee", + "red-bar shirt", + "red-bar tee", + "red-check shirt", + "red-check tee", + "red down jacket", + "red flannel shirt", + "red-grid shirt", + "red-grid tee", + "red gym tee", + "red jacket", + "red letter jacket", + "red ringmaster coat", + "red tie-dye tank", + "red tie-dye tee", + "red warm-up suit", + "red-zap suit", + "reggae tank", + "reggae tee", + "relay tank", + "rose-sky tee", + "rose tee", + "royal shirt", + "rugby shirt", + "rugby tee", + "sailor's shirt", + "sailor's tee", + "samurai shirt", + "sandwich tank", + "Santa coat", + "scale-armor suit", + "scale-print tee", + "school jacket", + "security tee", + "seven-ball tee", + "sharp outfit", + "shearling coat", + "silk bloom tee", + "six-ball tee", + "skull tee", + "sno-cone tank", + "sno-cone tee", + "snow shirt", + "snowy sweater", + "soccer shirt", + "soccer tee", + "space suit", + "spade tee", + "speedway tee", + "spiderweb tee", + "splendid tee", + "spring shirt", + "spunky knit shirt", + "star tee", + "straw shirt", + "strawberry tank", + "strawberry tee", + "striking outfit", + "subdued-print tee", + "sundae tank", + "sunflower tee", + "sunset tank", + "sunset tee", + "sweater vest", + "swell shirt", + "swell tee", + "tacky sweater", + "tan dogtooth shirt", + "tan dogtooth tee", + "tan puffy vest", + "team NTDO tee", + "three-ball tee", + "tiger jacket", + "tiger tank", + "tiger tee", + "tin shirt", + "toad shirt", + "toad tee", + "tropical tank", + "tropical tee", + "tulip tee", + "tuxedo", + "twinkle tank", + "twinkle tee", + "two-ball tee", + "U-R-here tee", + "uncommon shirt", + "Varia Suit", + "vegetarian shirt", + "vegetarian tee", + "vertigo shirt", + "vertigo tee", + "waffle shirt", + "waffle tee", + "waistcoat", + "watermelon shirt", + "watermelon tee", + "western shirt", + "white tuxedo jacket", + "winter sweater", + "work shirt", + "wrap shirt", + "wrestler tank", + "yellow aloha tee", + "yellow-bar shirt", + "yellow-bar tee", + "yellow tartan shirt", + "yellow tartan tee", + "zebra tank", + "zebra tee", + "zipper shirt", + "zipper tank" + ], + "wetsuits": [ + "black wet suit", + "blue wet suit", + "green wet suit", + "orange wet suit", + "pink wet suit", + "red wet suit", + "striped wet suit", + "white wet suit" + ] +}; diff --git a/index.html b/index.html new file mode 100644 index 0000000..dc48254 --- /dev/null +++ b/index.html @@ -0,0 +1,116 @@ + + + + Labelle Litanizer - Outfit-Oriented Ontology - Animal Crossing: New Leaf + + + + + + +
+
+ +
+
+
Have you considered...
+
...
+
+
+
+ How gauche. + Great idea! +
+
+
+
What is this?
+
+ The Labelle Litanizer generates random Animal Crossing: + New Leaf outfits. Ignoring the realities of the period + and distribution of your random number generator, all possible + outfits should have some chance of appearing. +
+
What's with the name?
+
+ It's inspired by Ian + Bogost's Latour + Litanizer, and his writings about objects and carpentry + more generally. +
+
Why?
+
+ Latour litanies confront us with objects in a way that defies + our usual methods of grouping or reduction. In a similar way + the Labelle Litanizer asks us to consider the possible rather + than merely the desirable or expected. New Leaf + contains a huge number of objects you can wear (or otherwise + visibly present with, if you are uncomfortable saying you are + "wearing" an ice cream cone). But that scale and diversity is + obscured due to its grouping algorithms, the small number + presented at any one time, and our cultural norms about dress. +
+
+ Can I restrict it to my / catalogable / easily-accessible items (no + DLC / region-exclusives)? +
+
+ No. Instead, consider how the true Daseine of the + objects you think you have are also inaccessible to you. +
+
Can you add images?
+
+ I would like to, but a full set of wearable object images + doesn't exist, and if it did I probably couldn't host it here + due to its size (estimated ~150MB). If you have one and want + to host it, let me know. +
+ +
It generated an invalid outfit / sentence / MoriDB link.
+ It can't generate some valid outfit.
+ You're missing my favorite item.
+
+ Email (joe.wreschnig at gmail) or tweet + (@jwreschnig) + with the details, please. I'm certain there's still + miscategorized caps/hats vs. masks/helmets, and plenty of + items I forgot. +
+
+ + diff --git a/labelle.jpg b/labelle.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b49746d787c07e0ca9e7d3a0359a6e9c55ff2322 GIT binary patch literal 20685 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�B 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

-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