Yarn Ball demo!

//Patrick //Friday, September 19th, 2014 — 11:15 am

Two years ago at the Global Game Jam, my friend Xin and her team came up with this idea for a game about a ball of yarn. They called it Yarn Ball, and the concept was a puzzle game where you roll around as a ball of yarn, trying to find the exit out of a maze, but you only have so much yarn to work with, so you need to find rewind points where you can roll back up and continue.

They made a proof of concept in Processing, but after GGJ, the group decided that they weren’t gonna be able to continue development. The game has been put on hold since then. I told Xin that I really liked the idea and she suggested I keep working on it. I had made a ASCII-based Python prototype (as I am wont to do), but didn’t know how to go about making the game on a real engine.

Last month I modded my Game Boy to make chiptunes. Then the other day I found out that there’s an SDK for the Game Boy called the GBDK (Game Boy Development Kit). It’s written in Assembly code and C (the latter of which I’m at least a bit familiar with). I decided to try out coding for the Game Boy and thought that Yarn Ball would be the perfect game for the platform.

There are quite a bit of limitations due to both the hardware of the Game Boy and the idiosyncrasies of the C compiler used to make the ROMs. There have been some frustrating moments in figuring out how the SDK works, but I have for you now a demo of Yarn Ball for the Game Boy!

Yarn Ball level 4

The demo has five complete levels that demonstrate how the game works, with 8-bit art and animations done by me! The controls are simple, you only use the D-pad to move.

If you want to try it out, click here to download the ROM and load it into any Game Boy emulator. I use BGB which can be downloaded for free here. The engine is now more-or-less complete (just a few more features I want to add in), which means I just need to make new levels. Let me know what you think!


Gameplay

The object of the game is to roll around the level and reach the goals. You have a limited amount of yarn to roll around with (shown at the bottom of the screen). However, there are yarn winders that you can land on to continue moving. You must land on yarn winders and the goal point using your last bit of yarn in order for them to work. The puzzle, therefore, lies in trying to maneuver the map and manage your yarn level.

Controls

D-pad: Move
Select: Restart level

Upcoming Card Game: Legends of Beforia

//Patrick //Monday, June 9th, 2014 — 1:28 pm


The Concept

In early May I participated in the Cardboard Jam at MIT. The theme was vague, “Cooperation”. I came up with an idea for a storytelling game about myths and legends. I was playing with the idea of a culture’s memetic legacy, the oral tradition, and how myths and stories are passed down through generations. In a way the concept is very cooperative, but it can also be competitive or destructive in that if someone changes the story or makes a variation, that variation can become more popular and overshadow the original. In a way, myth telling becomes a global game of telephone, a story that evolves over many years across many cultures.

And thus, the concept for Legends of Beforia was born.

The Game

Legends of Beforia is a simple storytelling game for 3-4 players. One player starts off by drawing a Myth card, which has templates like “[Adjective] [Creature] creates the world using magical [Object].” That player would then have to draw a card from the Adjectives, Creatures, and Objects deck, and then create a story based on that prompt. You might have a player talking about how the world was created by a friendly hedgehog with a magical frying pan, or how it was created by a beautiful farmer with a magical umbrella.

After starting a Myth, that player becomes the Historian (judge), the other players now tell variations on that Myth. They draw new category cards, then pick one to replace a word in the current Myth. For example, one player might change “frying pan” for “book” and now the story is about a friendly hedgehog and their magical book.

The Historian chooses their favorite variation, the winning storyteller gets a point, and that version becomes the new “canonical” version of the Myth that gets passed down. Then a new round starts, with a new Historian, and players again tell variations on the updated Myth.

After every player has had a turn as Historian, a new Myth is drawn, and play continues in the same fashion. After all the retellings of the second Myth, the player with the most points wins!

Production

Since the game jam, I’ve been updating the game, trying to expand it with hopes to eventually publish. It has generally been well-received by playtesters so far. It’s a fun game that leaves a lot of room for creativity in telling outrageous stories.

I’ve been working on producing more content for the game and editing some of the existing cards. I’m hoping for the final version of the game to be about 100 cards. I’m also very pleased to announce that Carrie Witt (Lead Artist at Owlchemy Labs—Dyscourse, Jack Lumber, etc.) is working with me to produce the art for the cards (as seen above).

I have submitted the game to the Boston Festival of Indie Games where we hope to get some exposure and good playtesting. It has also been submitted to IndieCade so I’m hoping it gets accepted because IndieCade last year was a total blast. Carrie has produced for me some prototype art for the basic card set that I’m going to be demoing there. We’re looking to have the final game ready sometime early next year, so be on the lookout!

I’m going to release the game under the name Patchwork Games, so to that end I’ve secured a domain and a twitter account, @PatchworkGames. Be sure to follow us to stay up-to-date on the game’s release!

If you have any questions or want to know more, you can tweet @PatchworkGames, or email me at patrick@patchworkgam.es. Thanks for reading!

[Flash Fiction] On Horror

//Patrick //Tuesday, February 4th, 2014 — 4:41 pm

It was Ellen’s turn to clear out the gutters. She hated doing it, it meant dragging out the ladder, getting the gloves and trowel, and trudging along the side of the house scooping out all the leaves and dirt and grime that’s accumulated in the gutters.

You know, I always find that the most effective horror stories are not the ones with the tense action and gore, but the ones that draw on mystery and the unknown. Sure, you could get some easy scares by watching Ellen fall and graze her cheek on the spiked fence below, nearly missing her eye by 2 inches, but then what?

Ellen rushed into the house, running up the stairs and into the bathroom. She turned on the water, desperately splashing the blood gushing down her face.

I much prefer horror that focuses on the little details. Things that you normally might miss. For example, maybe in her panic to wash her face, Ellen didn’t notice that some of the splotches of blood on the walls have turned into tiny footprints, gradually getting bigger as they marched along the wall. And maybe the sound of running water and concerned yells from her mother downstairs masked the low growl getting louder and louder as the footprints crawled along the floor behind her.

Promoting Bot Artisans And Their Creations with @TheBotmakers

//Patrick //Tuesday, December 17th, 2013 — 11:44 am

You would be hard-pressed to find a Twitter user who hasn’t come across a Twitter bot of some kind. Now it’s becoming even harder to avoid them due to the thriving botmaker community. Bots for all purposes—art, social commentary, education, curation, and more—are pervading our discussion of Twitter as a medium and peppering our timelines with throught-provoking, funny, procedural, absurd, or otherwise entertaining tweets.

However, with the viral nature of Twitter as a medium, it’s easy for the creation to overshadow its creator. Popular bots get retweeted and then followed by people all around the world. Many of my own bots have followers that are friends of friends that I don’t know. Some of the more popular bots even have thousands more followers than their creators. I know there exist bots designed to promote other bots (@BestOfTheBots, @BotPromoBot, @BotAlly), but they generally focus on the bots themselves, and not necessarily the botmakers (with the exception of @BotAlly every now and then). But how can we make sure botmakers get their credit? Or similarly, if we find a bot or botmaker we like, how can we check out other bots by the same creator?

Here’s where @TheBotmakers can help. It’s a simple bot that I created to promote not only botmakers, but to promote them within the context of their bot work. It’s basically a Who’s Who of botmakers! It is an opt-in bot, meaning it’ll only tweet about you if you want it to, and you can also choose which bots to tweet about! Read on to see how it works and learn how you can participate.


This bot does two kinds of tweets. First, it can tweet about a botmaker and a single bot of theirs, followed by their website. E.g. “Are you familiar with [name]‘s work? They made [bot]! Here’s their website: [website]“.

Secondly, it can tweet about a botmaker and promote two of their bots, e.g. “Are you a fan of [bot1]? You might also like [bot2], both by [name]!”

The cool thing about these kinds of tweets is that you, the botmaker, can decide how these two bots are chosen.

I’ve made a spreadsheet in Google Drive that looks like this:

botmakers

The way the bot reads this spreadsheet is simple. The first row is your twitter username. The second row is your website (optional). After that you list your bots. You can list them in groups however you choose (separated by a single cell, with any bots existing in any number of groups. The first group is special, however. The first group is a list of bots that you want to promote on their own. These will appear with the first kind of tweets, where it’s you, your website, and a single bot.

After that, any bots that are chosen for the second kind of tweets will be pulled from the same group (chosen randomly). For example, I grouped @GTSbot and @GymLeaderBios together because they’re both related to Pokemon. So whenever the bot chooses to promote @GTSbot, it’s likely to pair it with @GymLeaderBios. This is what makes the bot suggestions work (“If you like [x] you might like [y]“). Likewise, I grouped @SlightAesthetic with @Enoby_eBooks because they’re both Markov chain bots. But you can group your bots however you like.

How the bot works

First, the bot picks a random user (chooses a random column). Then it chooses what kind of tweet to make. There’s a 30% chance it’ll make a type 1 tweet (Person + website + 1 bot), and a 70% chance it’ll make a type 2 tweet (person + 2 bots). Note that you don’t need to make any extra groupings. If you only have the first special group of bots, it’ll only make type 1 tweets for you.

If it makes a type 1 tweet, it takes the template and adds your name, 1 random bot from the first group of bots, and your website (if you put it in the spreadsheet).

If it makes a type 2 tweet, it randomly chooses 1 of three similar templates, and puts in your name. Then it picks one random grouping (excluding the first special group) and picks two random bots from that group and puts them in the template. Because of this, any group beyond the first needs at least two bots in it. You can put extra copies of a bot inside a group to increase the chances of it being chosen, but it’ll need at least two different bot names in order to work. Groups need to be separated by exactly one cell. The script will stop reading cells once it encounters two consecutive empty cells.

How to participate

All you need to do to get started with the bot is fill in your own column in the spreadsheet. Right now the spreadsheet is private, so email me (patrick@thelightaesthetic.com) or DM me (@LightAesthetic) your email address and I can invite you to the doc. You can stop at any time by simply erasing your column. If you like, you can highlight your column, right click and choose “Name and protect range” to keep others from editing your entry, but I’ll hope that others won’t mess with it.

The bot will eventually tweet every 4 hours, but right now it’s paused because I’m the only one in the database and I don’t want it to only tweet about me. So message me if you want in!

Making Twitterbots with Google Apps Script (Part 2)

//Patrick //Monday, November 25th, 2013 — 11:25 am

Welcome to Part Two of using Google Apps Script to make Twitterbots. In this part I will discuss how to make a bot that gets replies from other users and responds appropriately.

First, be sure to set up the bot as described in Part 1.

Then, click here to download the updated twitterbot template that contains the new functionality (this is the same link as in part 1, but I’ve updated the file since posting part 1).

What you will see here are two new functions: getAndSendReplies() and makeResponse().

Before you start writing code, you should go to File>Project Properties, click on the Project Properties tab, click “Add row”, give it a name of “MAX_TWEET_ID” and give it a value of 0. This is a project wide (global) variable that stores the ID of the last tweet that the bot replied to. Every time it sends a reply, it’ll update this number so that it doesn’t send duplicate replies after every search.

After this, the username field in getAndSendReplies() should be changed to the username of your bot account. What this function does is send an HTTP request to Twitter to retrieve that last 100 replies to the account. It cycles through the replies in order, and calls makeResponse() followed by sendTweet() for each response.

The makeResponse() function takes in the whole JSON tweet object of the reply. This includes all the data of the tweet, including the user who sent it, the text, the ID of the tweet, and other data. I’ve included variables in the function that store these items for you automatically.

In essence, a reply tweet must contain two things. The text “@username” where username is the Twitter handle of the person you’re replying to, and the statusID of the original @mention to the bot. Using both of these, you can take advantage of Twitter’s accordion-style response feature.

In makeResponse(), the part that says “Add onto response here” is where you should put your code that builds a response tweet. You can have it reply in any way you want. You can even mention other users here by putting more @mentions (although be sure not to get spammy with this). For example, with @GTSbot, when someone releases a pokemon that isn’t theirs, I look up the original trainer in my database, and include an @mention to the original trainer when I send the reply (e.g., “@some-user You released @so-and-so’s Level 2 Charmander!”).

This function should URI-encode the response using the encodeString() function from Twitterbot.gs, and then append “&in_reply_to_status_id=X” where X is the “id_str” of the reply tweet. This ensures that the tweet will be sent as an actual response to the first tweet. The URI-encoded string plus the replyID section is what should be returned by the function.

Once you’ve written the code to make responses, you just need to change two more things. In the schedule() function, you’ll need to change

var result = bot.sendTweet();
to
var result = getAndSendReplies();

and then secondly, in Resources>Current Project’s Triggers, you’ll need to set the schedule() function to be Time Driven>Minutes Timer>Every Minute. This means that every minute, the bot will scan for replies and send out responses.

And that’s about it for part 2! Let me know if this works for you.

Can I make you a drink? – Making @MixologyBot

//Patrick //Sunday, November 24th, 2013 — 11:24 pm

@MixologyBot is one of my most recent bots, and has become quite popular in the meantime. It is a Twitterbot that generates cocktail recipes every 2 hours.


A lot of people have been wondering how it makes cocktails, especially since a lot of them seem to be strangely plausible. I’m here to show you what I did to make it work.

Step One: Amounts and Ratios

The first thing I did was look at the IBA Official Cocktail List and take note of the different amounts and ratios used in all the cocktails. The recipes here use cls, so I decided to change them all to the nearest .25 or .5 oz for convenience (e.g. with 3 cl rounding to 1 oz). For example, a Manhattan is defined as 5 cl Rye, 2 cl Red Vermouth and a dash of Angostura bitters, so I rounded that to 1.5 oz and .5 oz, respectively (we’ll get to the dash of bitters later), and added [1.5, .5] to my list of recipe templates for a 2 oz drink.

Through this method I collected several recipe ratios each in 2 oz, 3 oz and 5 oz drink totals (with, for example, a Bloody Mary being a 5 oz drink with the amounts [1.5, .5, 3]).

Ingredients

After getting the recipe templates, I made a database of ingredients. Ingredients were taken both from IBA cocktail recipes as well as other ingredients, liqueurs, cordials, juices, etc. that are frequently used in other cocktails and drinks. I collected these in a Google Spreadsheet which my bot reads every time it makes a drink (having a Google Spreadsheet makes it easy to edit or add in new ingredients later).

I added ingredients into 8 categories:

  • Main Alcohols – These are ingredients that make you say, “It’s a [x]-based drink.” Things in this list include Gin, Vodka, Tequila, Whiskey, Rum, etc.
  • Secondary Alcohols – This list includes all the Main Alcohols, but also ingredients that might be of equal or lesser amount than a main alcohol, yet wouldn’t usually be a base for a drink. This includes Vermouth, Brandy, Chartreuse, and some other spirits and cordials.
  • Mixing Alcohol – These are ingredients that you normally mix into other drinks, or ingredients that you normally wouldn’t drink on their own. For example, Campari, Cointreau, Peach schnapps, Irish cream, Kahlua, Blackberry brandy, and other liqueurs.
  • Non-alcoholic Additions – These are non-alcoholic ingredients that go into cocktails, for example, lemon juice, grenadine, simple syrup, tonic water, orange juice, etc.
  • Splashes – These are ingredients that generally appear in the end of a recipe as “a splash of [x]” or “a dash of [x]“. This includes various fruit juices, bitters, syrups, etc. When creating a drink that contains “a splash” of something, this list is used in addition to “Mixing Alcohols”.
  • Fillers – For 5 oz drinks, the filler is the last ingredient that ‘fills’ the glass, so to speak. This would be the tomato juice in a Bloody Mary, or the Cranberry juice in a Sea Breeze. This list also includes Soda Water, Tonic Water, Cola, Ginger Ale, Lemonade, Sprite, and some others.
  • Garnishes – These are things that garnish a drink. This includes a slice of lime, a Maraschino cherry, an orange peel, an olive, sprig of mint, etc.
  • Extras – These are extra things that go into a drink that are neither liquids nor garnishes. This includes the sugar cube in an Old Fashioned or the sprigs of mint that go into a Mint Julep, among others.
  • Styles – This isn’t an ingredient category, but lastly I record the styles of a drink into the spreadsheet, for example, shaken, stirred, on the rocks, straight up.

The Randomizer and the Drink Object

The next thing I did was create the program template that would read the Spreadsheet and create various Arrays for each ingredient category. Then I created the main function that would create a drink. The first thing it does is create a Drink Object, which looks like this when blank:

var drink = {
  "amounts": [],
  "liquids": [],
  "garnish": "",
  "quarter": "",
  "splash": "",
  "extra": "",
  "style": "",
  "name": ""
}

And then it pretty much just goes down the list and fills it out.

It randomly chooses to make a 2, 3, or 5 oz drink, and then randomly chooses a corresponding amount template. For each amount in the template, it chooses a random ingredient to go with that amount.

HOWEVER, the interesting bit is how it chooses to match amounts to ingredients. It generally does this based on the number of ingredients (the length of the ‘amount’ array).

For every drink, the first ingredient is always taken from the list of Main Alchohols. The IBA recipes did me a solid in that ingredients are listed Main Alcohol first, and then by amount, so these next few steps become really easy. My exception is that for 5 oz drinks, I changed the templates so the largest amount (the ‘filler’), goes last in the recipe.

If the drink is only two ingredients, then the second ingredient comes from either Secondary Alcohol, Mixing Alcohol, or Non-alcoholic Additions.

If the drink is three ingredients, then the second ingredient comes from Secondary Alcohol, Mixing Alcohol, or Non-alcoholic Additions, and the third comes from Mixing Alcohol or Non-Alcoholic Additions.

If the drink is four ingredients, the second comes from Secondary Alcohol, the third from Mixing Alcohol and Non-alcoholic Additions, and the fourth from Mixing Alcohol, Non-alcoholic Additions, and a second copy of Non-alcoholic Additions.

In this way, the bot creates a hierarchy of ingredients so it’s more likely that an ingredient would appear in the drink in a plausible amount. You won’t, for example, have a drink that is .5 oz Gin and 3 oz Lime juice. Every time it adds a new ingredient, it always checks to make sure it’s not already in the drink.

Optional stuff

After getting the main bulk of the recipe, everything else (except for the name) is optional.

There’s a 50% chance there will be a garnish, taken from the list of garnishes.

There’s a 25% chance there will be an additional quarter oz of an ingredient taken from Mixing Alcohol + Non-alcoholic Additions (x2)

There’s a 25% chance there will be an added “splash” of something, taken from Mixing Alcohol + Splashes.

There’s a 12.5% change there will be an “extra” added from the list of extras.

Then a random style is chosen. The recipe will always say “straight up” or “on the rocks” but there’s a 50% chance of either being “shaken” or “stirred” in addition. However, if “shaken” or “stirred” is chosen and there is a garnish, the garnish replaces “on the rocks” or “straight up”, e.g. “Stir everything together and serve with a cherry” vs “Stir everything together and serve on the rocks”.

Name

The drink is finally given a randomized name using the Wordnik API and some naming templates. The templates are more or less taken from actual drink names. For example, a Dark and Stormy is of the form “Adjective and Adjective”, while “Sex on the Beach” is “Noun on the Noun”, and “Tequila Sunrise” is “Alcohol Noun”. The names tend to be my favorite part of @MixologyBot.

Tweetifying

Unfortunately, not all recipes can fit in 140 characters, especially if it’s got 4 ingredients, a garnish, an extra, a splash AND additional quarter ounce. Luckily I’ve devised a simple way to get around this.

The bot makes the drink just as it wants, with everything (or nothing). It goes through the formatting function which makes it all pretty and readable as a tweet. If this length is greater than 140 characters, it starts trying to cut things. First it cuts out the additional quarter ounce, if it has one. Then it tries to cut out the extra, the splash, and the garnish, in that order, checking the new length every time and stopping once it’s under the limit. In the unlikely event that this still is over 140 characters, the bot gives up and waits for the next round of drinks (this has not happened yet). But in this way the bot can still be creative and create plausible drinks by cutting the least plausible (or most extraneous) elements one by one.

What I am most appreciative of @MixologyBot for is that it has questioned my own preconceived thoughts of ‘what goes well together’. Not to say that the bot knows how to pair certain alcohols (I mean, I just told you how it works), but rather this bot’s assertion that a drink can have both Tequila and Chartreuse in it has made me more adventurous and want to try mixing things that I normally wouldn’t have thought of (Tequila and Chartreuse, by the way, is a delicious combination!).

So there you have it! Hope this has been enlightening. If you have any comments or questions, just let me know (@LightAesthetic)!

Catullus 3

//Patrick //Wednesday, November 6th, 2013 — 2:22 pm

Catullus 3 was always my favorite poem. A story about a dead pet, and the lives it affected. I’ve written a translation as a Shakespearean sonnet.

I beg of you, O Venus, Cupid, too,
and everyone who has a loving heart:
To lover’s sparrow we must bid adieu
so that in peace he may this world depart.

My girl had loved this bird so honey sweet
and cherished it above her own two eyes.
The sparrow used to hop on little feet
and sing to her alone with chirping cries.

But now into the depths it must embark,
the shadow path from which none shall return.
I curse you, Orcus, ruler of the dark,
who eats all pretty things without concern.

Because of you the sparrow disappears,
my lover’s eyes now swollen red with tears.

Edit: Whoops and because I needed a challenge, here’s a translation in the original Hendecasyllabic meter.
( – x | – ˘ ˘ | – ˘ | – ˘ | – x )

Mourn, you gods of affection, Venus, Cupid,
plus those others of loving disposition:
Death, it seems, paid a visit to the sparrow
Dearest bird, a delight unto my fair girl
whom she says she adored above her own eyes.
Lovely sparrow who understood its mistress
even more than a girl would know her mother.
Always keeping its place upon my girl’s lap
it would hop over here and there at random
gaily chirping at her, its mistress only.
Now though, sadly, it travels on a journey,
frightful place that no soul may e’er return from.
Curse on you, evil shadows of the dark lord
Orcus, you who devour every good thing:
Such sweet sparrow you’ve taken from my fair girl
O what evil! The wretched little sparrow!
These bad deeds that you’ve wrought have turned my girl’s eyes
swollen red from her neverending weeping.

And the original Latin with literal translation:


Line Latin English
1 Lugete, o Veneres Cupidinesque, Mourn, o Venuses and Cupids,
2 et quantum est hominum venustiorum: and whoever there is of caring people:
3 passer mortuus est meae puellae, My girl’s sparrow is dead,
4 passer, deliciae meae puellae, the sparrow, my girl’s delight,
5 quem plus illa oculis suis amabat. whom she loved more than her own eyes.
6 nam mellitus erat suamque norat For it was honey sweet and knew her
7 ipsam tam bene quam puella matrem, better than a girl knows her own mother,
8 nec sese a gremio illius movebat, And it wouldn’t move from her lap,
9 sed circumsiliens modo huc modo illuc but jumping around here and there
10 ad solam dominam usque pipiabat. it would chirp solely to its mistress.
11 qui nunc it per iter tenebricosum It now goes on a dark journey
12 illuc, unde negant redire quemquam. from whence they deny anyone to return.
13 at vobis male sit, malae tenebrae But may it go badly for you, evil shadows
14 Orci, quae omnia bella devoratis: of Orcus, who devour all pretty things:
15 tam bellum mihi passerem abstulistis Such a beautiful sparrow you’ve stolen from me
16 o factum male! o miselle passer! O evil deed! O pitiful little sparrow!
17 tua nunc opera meae puellae Because of your work my girl’s
18 flendo turgiduli rubent ocelli. little swollen eyes grow red from weeping.

Catullus 5

//Patrick //Wednesday, November 6th, 2013 — 11:31 am

I love Catullus, and I love strict poetic forms. So I wrote a translation of Catullus 5 as a Shakespearean sonnet.

The sun has many lives but we just one.
We use our time to race against the light,
evaluating worth as what we’ve done,
until our day becomes eternal night.

So give me just a kiss, and then one more,
and then a hundred, then a thousand plus,
a second hundred, twenty and four score,
another thousand kisses just for us.

And when so many thousands we have shared,
forget the lot, the number’s but a ghost,
so those who might be jealous may be spared,
their thoughts are but a penny’s worth at most.

The most important thing for us, my dove:
That we may live, my Lesbia, and love.

The original Latin and literal translation:


Line Latin English
1 Vivamus, mea Lesbia, atque amemus, Let us live, my Lesbia, and let us love,
2 rumoresque senum severiorum and the rumors of strict old men
3 omnes unius aestimemus assis! may we value them at just a penny!
4 soles occidere et redire possunt; Suns can set and rise;
5 nobis, cum semel occidit brevis lux, but us, once our brief light perishes,
6 nox est perpetua una dormienda. we must sleep an eternal night.
7 da mi basia mille, deinde centum, Give me a thousand kisses, then a hundred,
8 dein mille altera, dein secunda centum, then another thousand, a second hundred,
9 deinde usque altera mille, deinde centum; then yet another thousand, then a hundred;
10 dein, cum milia multa fecerimus, then, when we have made so many thousands,
11 conturbabimus illa, ne sciamus, let us mix them up, so that we can’t know,
12 aut ne quis malus invidere possit and so no evil person can grow envious
13 cum tantum sciat esse basiorum. when they learn the number of our kisses.

[Flash Fiction] The Metal Case

//Patrick //Thursday, October 31st, 2013 — 3:00 pm

It was 6 p.m. on a rainy Thursday night.

The machine in front of them let out a loud beep.

“Okay, let’s try this again,” said Sharon, adjusting some knobs on the console. She looked at Jake, then pressed the big red button in the middle.

“It’s just gotta work,” Sharon whispered to herself, “It has to…”

Sharon recalled last month’s events: It was late. They were testing the safety protocols of the prototype to show it off to their investors the next week. It was stormy out. Sharon had made the call to continue with the final test even though there reports of lightning outside that could potentially disturb the delicate instruments. But Sharon was excited. She wanted to see the machine work. She thought she could finish the test quickly and be done. Then the lightning struck. There was a power surge. Sharon doesn’t like to think about what happened after.

Nothing happened. The machine sat idly between them.

Jake simply stared at the machine, calmed by the gentle whir coming from the vent in the back, “How do you know?…”

Sharon examined the machine’s console, then shook her head slowly, “It doesn’t matter. I messed everything up. The whole experiment was a failure. All my research, all the funding—people’s lives are ruined! All because of me. But I took it. I took it and I fixed it. It should work now!” She pressed the button again.

Nothing happened.

Sharon took the case between her hands and examined the interior: A small console on the left with knobs and buttons, a mass of wires and electrical components on the right, and a huge red button in the middle, with the LED next to it blinking a bright red. Even though the wires were new, the aluminum housing still had a some faint black marks on it. Sharon glanced over all the parts of the machine, her eyes locking on the big red button. She heaved a sigh and pressed it.

“Did… did you steal that from the lab? Do you still have access to the facility after what happened?” asked Jake. He put his feet up on the chair and wrapped his arms around his knees. His eyes remained transfixed on Sharon as she unclasped the locks and lifted the lid.

“I think I solved it. I think I can fix everything now,” said Sharon, placing the case on the table between them. The sunlight shining through the window bounced off the metal facets of the case exterior and danced in Jake’s curious eyes.

“What is that?” asked Jake.

Sharon walked in carrying a large metal case.

[Flash Fiction] Shadows

//Patrick //Monday, October 28th, 2013 — 12:59 pm

It’s a long walk home from here. It’s late. My heels clack with each step along the brick sidewalk. I watch my shadow grow and vanish ahead of me as I pass each street lamp. I keep walking. Another shadow joins me. It’s still mine, this time from a nearby porch light. My two shadows dance around each other as the second wanders back off into the darkness. I pass more houses. Multiple shadows drift in and out of existence, growing and fading, turning and shifting as I make my way down the dark street. But one shadow does not change. It does not turn and shift and fade with the passing of each light. It follows behind me, unchanging, mimicking my movements, in time with my steps.

It’s found me.

I pick up my pace. My heels click louder and louder as I rush to get back to the safety of home. The shadows come in waves, growing and fading, twisting around me in their infernal dance. But the shadow unchanging still follows behind in dark pursuit.

I see my house down the street. The warm light from the kitchen window invites me in. I open the door and rush inside, closing it behind me to catch my breath. Looking at the light above me, however, I come to a realization: the very thing that destroys shadows also creates them. I turn off the lights and rest in total darkness.

Is it still here?