Sunday, January 10, 2016

LPT: How to Convert °C to °F in Your Head

These are quick math tricks to make certain day-to-day calculations much easier.  Sometimes you need to convert temperatures in Celsius (centigrade) into Fahrenheit.

The formula I learned in elementary school was °C * 9/5 + 32, which is not particularly amenable to calculating in your head.  Here's how to figure that in your head without multiplying.

Let's say the temperature is 7°C.

  • Calculate 1/10th (10%) of that.  Ten percent of a number is simply that number with the decimal place shifted left one spot.  So ten percent of 7 is 0.7
  • Subtract 0.7 (1/10th) from 7 = 6.3
  • Double 6.3 = 12.6
  • Add 32 = 44.6
  • 7°C is 44.6°F


How does this work?


In the original formula 9/5 = 1.8.  Half of 1.8 is 0.9

If you subtract 1/10th of the original number from itself, you get 0.9 * °C.  Then when you double that, you get 1.8 * °C.

After that, you merely need to add 32 to get the Fahrenheit equivalent.  Going the other way (°F to °C) is a little more complicated, and I will get to that in a subsequent post.

LPT: How to Calculate a Tip in Your Head

These are quick math tricks to make certain day-to-day calculations much easier.  When you eat at a restaurant, you'll typically tip your server.  Here's how to figure that in your head without multiplying.

Let's say the bill is $12.34.


Calculating an Exact Tip


  • Calculate 10% of the bill.  Ten percent of a number is simply that number with the decimal place shifted left one spot.  So ten percent of 12.34 is just 1.234 (round to 1.23).

10% tip:

  • Tip is $1.23

15% tip:

  • Start with the 10% of $12.34: 1.23.
  • Now cut that number in half to make 0.615 (rounded to 0.62).  This is 5% of the bill.
  • Add 1.23 and 0.62 together to make 15%:
  • Tip is $1.85

20% tip:

  • Double the ten percent: 1.23 * 2
  • Tip is $2.46



Easier Approximate Tip


That said, I typically approximate using only the dollar value, because it's easier.
  • Round up to $13.  Calculate 10% of 13.  Ten percent of a number is simply that number with the decimal place shifted left one spot.  10% of 13 is 1.30

10% tip:

  • Tip is $1.30

15% tip:

  • Cut 1.30 in half to make 0.65.  This makes 5% of the bill.
  • Add 1.30 and 0.65 together to make 15%: (1.30 + 0.65)
  • Tip is $1.95

20% tip:
  • Double the ten percent: 1.30 * 2
  • Tip is $2.60

Friday, July 17, 2015

Google's Deep Dream

Google put their image recognition software into a feedback loop and produced Deep Dream.  Then they released the code into the wild.  At some later time, I want to post a bit about the theory behind deep learning, especially convolutional neural networks.

Anyhow, a good place to find Deep Dream images is reddit /r/deepdream.  Here's a google blog post describing the software.






















From that post here's an image worth 1000 words about Deep Dream:


And, since I'm an artsy-fartsy kind of guy myself, I couldn't help but make a bunch of images with it from photos I've taken.














Saturday, May 30, 2015

Fibonacci Code Golf

The other day, one of my colleagues said he'd once been asked to code a function to produce the nth fibonacci number for a job interview.  We got talking about the shortest possible function to do this.


A fibonacci number is the sum of the two previous fibonacci numbers.  The first and second fibonacci numbers are defined to be 1.  That makes the third 2 (1 + 1), the fourth, 3 (2 + 1) and the fifth, 5 (3 + 2).  Cake.

1, 1, 2, 3, 5, 8, 13, 21, ..

Beautiful, Recursive and Horribly Inefficient


A clean and simple implementation in C might look like this:

int fibonacci(int n)
{
    if (n == 0) 
        return 0;
    else if (n == 1 || n == 2) 
        return 1;
    return fibonacci(n - 1) + fibonacci(n - 2);
}

Since I'm not a golfer, and code golf and mini golf are the only kinds of golf I play, I came up with the following in (bad) C.

f(n){return n<3?1:f(n-1)+f(n-2);}

Now, this one isn't correct for 0, which should return 0, so let's revise it at the expense of four more characters.

f(n){return n<3?n?1:0:f(n-1)+f(n-2);}

That works.  Kind of.  The highest n you can pass it is 46 (returning 1,836,311,903), because after that it overflows the 32 bit signed int (which holds a maximum value of 231-1 = 2,147,483,647).

Okay, but the real problem with these functions is how phenomenally slow they are.  You wouldn't be able to get much past 46 anyway without rendering your machine absolutely useless.  This is a classic recursive function, that is, a function that calls itself.  This fibonacci function itself is often used to demonstrate the elegance of many functional languages.  For example, here it is in OCaml:

let rec fib = function
  | 0 -> 0
  | 1 -> 1
  | n -> fib (n-1) + fib (n-2)

As it turns out, to calculate f(46), you end up calling f() 3,672,623,805 times!  f(47) makes 5.9 billion and f(50) makes nearly 20 billion calls.  The recursive fibonacci sequence grows in number of calls on the order of 2n, which makes it roughly equivalent to the rice and chessboard puzzle.

Ugly Lookup Table


So we need to rework it and make the shortest version that isn't super inefficient.  Since 46 in the maximum n that fits in a signed 32-bit int (and 47 unsigned), we could just make a precomputed look-up table.

int fib(int n)
{
    static int fibs[] =
      { 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 
        610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 
        46368, 75025, 121393, 196418, 317811, 514229, 832040, 
        1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 
        24157817, 39088169, 63245986, 102334155, 165580141, 
        267914296, 433494437, 701408733, 1134903170, 1836311903 };
    return fibs[n];
}


That's as fast as you're probably going to get, but it's ugly and not particularly short.

Iterative and Fast


You can also do it iteratively, without any recursion at all:

int fib(int n)
{
    if (!n) return 0;
    int p = 0, q = 1;
    for (int i = 2; i < n; i++)
      { int t = p; p = q; q = t + p; }
    return p + q;
}


It's starting to get a little longer, though, so I don't bother to shove it on one line or abbreviate int fib(int n) into f(n) like with the shortest ones above.  This function can be literally billions of times faster that the first ones.

Returning to Recursion, with Memoization


But..  I've got a short recursive version that outperforms this one on the whole, especially when called more than once, because it builds up a look-up table dynamically, with a simple technique broadly called memoization.

f(n){static int m[64]={0,1,1,0};return !n||m[n]?m[n]:(m[n]=f(n-1)+f(n-2));}


Fast and short.

No Recursion, No Iteration, Just a Formula


Let's do one more.

There is a closed form calculation of the fibonacci number that requires neither iteration nor recursion.  You just calculate it and there you go.  Here is my shortest implementation of that:

f(n){double A=sqrt(5),B=A/2;return(pow(0.5+B,n)-pow(0.5-B,n))/A;}


Short.  No iteration, no recursion.  Over several calls, I figure this will be slower than the previous function, but it's way slicker.

Saturday, January 31, 2015

The Book of Sand

Argentine literary genius Jorge Luis Borges ('magic realist') is one of my favorite writers. Borges unravels the many human uses of information within a universe that is mystical and mathematical at once. His work illuminates the way we, as human beings, struggle to capture meaning - any meaning - from infinite quanities of data. Borges explores ideas such as the recursivity of mirrors, points in space containing all the universe (The Aleph) and man's struggle to find meaning in endless information (The Library of Babel & The Book of Sand).

For many software developers, creation of software, while frequently mundane, is still very much an aesthetic pursuit - an art. When a piece of software is 'beautiful' it is so in the same way that a Borges short story is beautiful, and in a very different way than a Dostoevsky short story is beautiful (which is the gut-wrenching, depth-of-human-suffering-and-existential-torment sort of way) or in the way a Hemingway story (the depth-of-human-suffering-but-don't-actually-ever-say-it sort of way) is.

A Prediction from 2007

In 2007, I wrote a post called --

Xbox 360, PS3 Games Unplayable on Future Hardware?

Where I concluded that, due to technical reasons detailed in that post --

.. I suspect that far more Xbox 360 and PlayStation 3 games will be unplayable on future hardware than Xbox and PS2 games on the 360 and PS3.

Unfortunately, I was right, as we've known since before the new hardware was released nearly a year and a half ago.  The Xbox One and PS4 are capable of playing exactly zero binaries built for their predecessors.

But just because we saw it coming doesn't make it any less painful.  Once our older machines die, how will we play those games we love?

Java-Style Properties Files in C++

(Originally posted Feb 28, 2008)

Need to handle Java-style properties files in C++? I've decided to post some of my own personal library of code on this blog. This is one of those occasionally useful things.

propertyutil.h
propertyutil.cpp

If you fix any bugs, extend the code or anything else, send back your changes if you don't mind. ;)

Tuesday, January 13, 2015

Monday, January 05, 2015

Surge of Video Game Nostalgia


When I was a wee lad in the mid 1980s, Compute! magazine would run ads like this.  Box cover art is what sold it back then, I'm telling you.

Saturday, January 03, 2015

My Apps


(More to say, more coming..)

Friday, January 02, 2015

Ideas Are Cheap




This has been on my mind lately regarding mobile app ideas.  Or as Thomas Edison most famously put it,

"Genius is one percent inspiration, ninety-nine percent perspiration."  

These days it seems like 99.999% perspiration.

Thursday, January 01, 2015

Cuervo


¡Puta!”—whore—her brother called, laughing, from the incandescent doorway against the sunset as his house in Taxco, Mexico came into her view.  Miriam and Juan had come from Huejutla in a bus called Mi Burro, a hard trip because she was thirty-five weeks and looking way past due. 

Days later, in the square, the baby kicked explosively, dropping her to her knees with a rush of warm water down her legs.  The child was born with articulated tar-colored bony tumors on its back and stank like old fish in the May sun before the rains start.  An inhuman smell.  “¡Dios mío!” the midwife said, crossing herself, “a very bad omen.”  That was late All Saints Day or early Day of the Dead.  They claimed the holier of the two days for luck.

“I kill it,” said her brother.  “It's a demon or changeling.  Or we go to the witchdoctor.  What a curse, this jorobado, this—hunchback.” 
Miriam took the child while the others slept, hobbling off, bleeding some, and holed up in a barn they'd seen on the road in.  Juan found her there. 
“We keep the child,” she said. 
“We can't even take care of ourselves.  Leave it, amor, we return to Huejutla.” 
She shook her head.  “We keep him.” 
He covered his face, then ran his hands through his hair.  “Está bien.” 
“He isn't yours,” she said, now crying. 
“I know.” 
“He's a monster's child.  I don't betray you, not willingly.” 
'tá bien.” 
“I don't.  I want you to know, but we must keep the baby.” 
He was silent.  “What shall we call it?” 
“Jesús.” 
“No.  Not for this one, it is blasphemy.” 

“He needs a lucky name.” 

Those years they traveled the volcanic sierra, hiding the child, finally settling in Popocatépetl's skirts in a poor pueblo of flower fields at Zaragosa's edge called Omexochitla.  They worked hard, earning fine farmland for marigolds, a field alongside an aqueduct. 

One afternoon, the priest found the boy in the chapel bell tower.  “A climber, ¿eh?  What's on your shoulders, under the burlap?” 
The boy stepped back, almost falling.
The priest held out his hands, palms forward.  “No importa.  What's your name, boy?”

When Jesús was sixteen, well-dressed men came to speak with Juan.  The three pulled up their marigolds and planted poppies.  Soon, they weren't so poor, but the pueblo sweat fear.  Juan saw this too and he burned the poppies in their fields.   One night the well-dressed men returned to burn up Miriam and Juan in their beds.  

Now, in these troubled times, all the pueblo's fields grow poppies. 


*   *   *

The nearby city of Zaragosa reels in the cartel's coming, with crooked high-rise casinos and murders moving down from the north, in from Veracruz, up from Oaxaca.  In the churchyard, cartel capo Pablo Vargas talks with other men under a bright waxing moon.  

A silent hulk in a hooded duster watches, perched above the highest bells of the massive Zaragosa Cathedral on the saffron-tiled cupola.  Vargas swings the rear car door open and the jorobado atop the cathedral shakes, violently unfolds immense iridescent black wings, and leaps after him into the night air. 

The black Mercedes speeds down the Heroes of the Cinco de Mayo.  The driver looks up again, but sees nothing now. 
“Pull over at the Oxxo,” Vargas says.  He runs in to the convenience store while the driver scans the sky. Vargas returns and they pull out onto the boulevard.  
 “There it is!  You see that bird?  It's huge. ”
“What bird?  A raven or something?” 
It flashes again at the top edge of the windshield, a black silhouette against the indigo sky, this time bigger than a man.  
¿Que diablos?”  What the hell?  The driver accelerates.  The bird drops something featureless and elliptical—“¿Que..?” 

The windshield and steering wheel splinter from the flying manhole cover.  It shatters his arm.  He pushes it off in spite of the pain, but bone pierces the skin and he passes out with a heavy foot on the pedal.  Vargas leaps forward for the remnant of the wheel, yanking it hard to avoid oncoming cars.  A street shrine falling from above impales the roof head-first and the Virgin's steel halo slices Vargas' flank.  The weaving Mercedes slams through the guardrail and plunges into the Anáhuac River. 

In Omexochitla, another cartel is moving in.  At the next sunset, armed men spray fields with kerosene as if it were insecticide.  Finally, one plucks a wilted poppy, applies a glowing cigarette tip to its petal and tosses the flaming flower into the field. 

Vargas limps from a warehouse by the river and hails a taxi.  He studies the driver’s hat, a fur ushanka outlined in darkness.   The taxi pulls onto the highway. 
“Kavork, is that you?” 
In a Slavic accent came, “A philosophical question.  I often ask it to myself.” 
“You gonna kill me?” 
Nothing. 
“Don't piss on my body like you did on Lopez.” 
Kavork laughs.  “A sublime moment.  I thank you for the reminder.”  The doors clicked broken-off locks.   Vargas shakes his door and withdraws a gun, pointing into the back of the driver’s head.  
“A hundred thirty kilometers per hour, my friend.  You want another accident already?” 
“That was you?  Why do you work for Los Equis?” 

In one fluid motion, Kavork grabs the gun, bounds over the driver's seat and pummels Vargas with a riveted steely hand, hammering like a steam piston.  A metallic bladder at the wrist, like a birthday balloon, inflates and deflates with each blow.  The car careens on.  Kavork hammers Vargas even as the taxi crumples into and under an oncoming eighteen-wheeler. 

*   *   *

Jesús returned to an Omexochitla alight in the dark with flames.  From atop the aqueduct he landed below to watch.  A young woman in black approached the hunchback. 
“Who can save us?” she asked, startling him.  His wings flared and she gasped at his silhouette, back against the flaming fields, wings spread.  “¿Miguel? ¿Gabriel?”  She crossed herself. 
“Jesús,” he said. 
She gasped again.  “But not with wings—” 

And then the rains burst, running down her face and over the course of the night, quenching the fires in the fields.

Wednesday, December 31, 2014

The Octopod


November 1994



The weather was cool.  We dressed in full suits for the evening meeting and they were black and double-breasted.  The tags went on the pockets and we went out into the dirt streets of San Juan Popoca.

Lazaro walked fast half a block ahead of me.  Stray dogs here slept against the pastel plastered houses, up against the road, or in the street.  I'd seen him pull back and kick sleeping dogs in the ribs and laugh, shaking his head and looking back at me as they coughed and stumbled away.

This Monday two dogs knotted together mating in the street.  He looked back, grinning, and then sprinted toward them.  He planted kicks like a placekicker wherever he found openings.  The shrieking dogs bolted for opposite directions, failing, and he danced around them athletically.  The eight legged beast wobbled in circles howling loudly enough to attract passers-by and a crowd gathered.

Vamos, I said.  Let's go.  He didn't respond, still kicking.  The crowd watched and some of them encouraged him.
Vámonos, I yelled but he ignored me.  I leaned up against the wall of a store and waited.  When one of the dogs started bleeding he stopped finally.  He shook his head again laughing.
¿Listo?” he said.  You ready?  We boarded the bus for the meeting.

February 1995



Months passed and I worked with Gasquez.  A señora who worked behind the counter in a store told us about a young black-suited man like us who bested an eight-legged monster in the center of town.  She saw it with her own eyes.
“Was the jóven a gringo?” Gasquez asked her and winked at me.

She watched me with squinted eyes.  “No. I don't think so,” she said.  “Well, it could be.”  She continued with the tale as if the jóven were the hero.  The monster had either one or three heads but she couldn't recall. 

“It seems like an important point,” Gasquez said. “How many heads it had.”
“To the monster at least.  I think there were two,” I said and told Gasquez about the incident with Lazaro.
Ay, la octopoda, Gasquez said to her.  “Is that what she's talking about?” he asked me.
“I don't know.”

August 1995


I served in the city of Puebla now, nearly an hour from San Juan Popoca.  Others came by in black suits too and we talked about the Chupacabra sucking out the life of livestock all over Chihuahua in the north and even as close as Tlaxcala.

“I just came from San Juan Popoca.  Weird things there,” said Sorensen.
“That was my first area!  It's magical.  Did you hear about the UFOs that hover in the hills there and at the cusp of the volcano?”
“Which one, Iztaccíhuatl?”
“No, Popocatépetl.”
“Oh.  I did hear of that.  They caused the eruption.”
“They landed in the hills while I was there,” I said.
“No.”  He didn't believe it.  I didn't at first either.
“Well, we were in Atlixco that day.”
“How do you know then?”  An accusation.
“They all said so.  All of them.”
There was a moment of quiet.

“Oh!” he said, “You hear about the Octopod?”
“No, what's that?”
“An eight-legged hydra that sprung from the streets by the zócaloThey said a goofy-looking gringo in a dark cloak defeated it with nothing but an umbrella.  Well, some people thought it was Quetzalcóatl or St. Thomas.”

“Bullshit.”
“No.  And watch your mouth.”


Friday, January 31, 2014

Gravity's Rainbow

(Originally posted Summer of 2007)

After much deliberation I bought a copy of Gravity's Rainbow and started to read it. Although I love literature, I haven't read a book for a long time (well, except for Self-Made Man, which I recommend - but that's not really literature). Too busy. So I may be too busy to read this impenetrable thousand page behemoth which is why I deliberated so long in buying it. I don't like buying books and not reading them. Which is why I never bought Ulysses and never will. Blechh..

Rockets

The book centers around Germany's V-2 Rocket Bomb. The V-2 rocket became an archetype of 50's science fiction completely divorced from its wartime origins. Now with that characteristic shape come visions of peaceful and optimistic earthlings spreading their utopian peace across the universe in cold-war era movies and short stories. Even so, I'm excited to delve into it.

Speaking of rockets, Rebekka and I took the kids out to the park the other day to launch one. We found a ready-to-fly Estes model rocket at Target for $17 and I decided to drag my family along to visit my childhood. My last experience as a child with a model rocket was watching my carefully constructed and painted (black!) space shuttle burst into flames before my eyes as I tried to hide my tears from my father. That was painful enough to discourage any return to the practice of model rocketry until last week.

We launched the rocket four times. I expected my son to love it and he did. What surprised me was how much Rebekka and my two girls enjoyed it. On the fourth and final flight we lost the rocket. We spent about an hour looking for it, but never found it. That's ok though, because as Gabby (my 6-year old) said, "it went into real space!"

After we returned, Gabby asked me if anyone had ever been to Mars.
"No, but we've sent robots up there and we have a lot of pictures.", I said.
"So when are people going to go up there?", she asked.
"Oh, in maybe fifteen or twenty years."
"I want to be that person!", she said with a huge grin.

(Image: A Tintin Comic: Destination Moon.  I have a French version of this book from a summer I spent in Belgium.)

I Was An Atomic Mutant

(Originally posted 2006)

I bought this PC game a few years ago at a Wal-Mart in Lee's Summit, Missouri for $3. The gameplay is repetitive and the in-game graphics are unimpressive - but it hooks me. It's a ValuSoft title developed on a shoe-string. A single developer is credited for the engine. Its redeeming strength is that its atmosphere totally captures the 50's and 60's era sci-fi and monster movies it imitates.

Thematically the game resembles Destroy All Humans! and Destroy All Humans! 2, which are far better games but don't quite nail the atmosphere of old sci-fi flicks like this does. The Destroy All Humans! are too self aware to fully capture those movies. Another game with a similar feel is Godzilla: Save the Earth which, while clearly much more polished, scores one point below Atomic Mutant on Metacritic (64 vs. 63). And I Was An Atomic Mutant scores a full thirteen points above our own vastly ambitious but ultimately underwheming Superman Returns.

So what does this mean? It would be irresponsible to draw any conclusions from this example, but it is interesting.

Saturday, July 14, 2012

JSON Parser for Objective-C

Building on the string code in the previous post, here is a simple Objective-C JSON parser that I use a lot.

Json.h, Json.m at GitHub.

Friday, July 13, 2012

C String Library for C++ and Objective-C

In the last couple of years I've shifted professionally to iOS development.  In doing so, I adapted some of my previous code for use with Objective-C.

I converted my super minimal C++ string library, consisting of basic string manipulation and parsing functions, back into pure C so that I could use it more conveniently with Objective-C as well as C++.

You can find strs_c.c, strs_c.h at GitHub.

It is intended to be very basic and small, so there's no regex or anything like that.  There are string splitting and list handling functions, searching functions, trimming, parsing, etc.  I have further libraries building on top of this for more sophisticated tasks.  For example, an Objective-C JSON parsing library that I'll post right after this.

Monday, June 25, 2012

Day of the Dead

“They opened the Altar of the Kings below the cathedral.”
“Kings of Mexico, ¿eh?
Varela laughed.  “Bishops, but there is an emperor buried under Mexico City's cathedral.  There were emperors here from Europe long ago.”
The bus lodged in traffic before a saffron cathedral on the Avenue Heroes of the Cinco de Mayo.  The driver pointed.
“Can you hear him?” Varela asked me.
I went to the front of the bus.  “¿Mande?” I asked.  What?
He pointed to a float covered with marigolds or zempazúchitls with a glass casket.
San Francisco de Asís,” he said.
I smirked.  “He's from Crusade times, ¿no?
“You think it's not real, jóven?”
“Do you?”
“You are a niño, what do you know?  He is preserved by a miracle.”

“Traffic's not moving so let's walk,” said Varela from behind and we disembarked and weaved among the cars.

“For Francis of Assisi!” Varela shouted, dodging a Volkswagen.

At the Cathedral of Puebla we followed a crowd that passed through a spoked mausoleum with tombs around a hub.  “One of the bell towers is open,” a tourist said and we enqueued at the narrow spiral stairs.

From the lip of the colossal bronze campana, the crown of the carillon, you saw all the chapels of the city.

And down below, San Francisco wound his way through the Day of the Dead unfolding in candy colors, and you heard the ring of all the cathedrals interweave with a poetic tintinnabulation of the bells.


Tuesday, May 24, 2011

Cholera

People talked of the days of cholera, of Xochitlán's baptism in a great flood of diarrhea and vomit.  In those days there were wives and husbands, children, mothers and fathers just gone.  The water was unclean and there is no deliverance from water. 

They said one-in-four perished.  I didn't believe in the 1990s a medieval epidemic wiped out a town like this with no peep heard elsewhere.  The government underreports outbreaks and it was an unbearable tragedy here whether one in four or one in forty.  Xochitlán's torment was in the still dirt streets, the ramshackle homes at the periphery, the dust-blown open market and in the church of broken walls that stood as the headpiece of the town square called the zócalo.

It was three years after the epidemic.  Sweat soaked our shirts as we raced again in the sun past men with straw hats plowing and harrowing new milpas and breaking up dark soil beneath the pale dust.  We slowed to saunter at a reverent pace as we walked those streets near the graveyards where from time to time other men with straw hats, muscled from years of labor, would stand quietly with calloused hands and infected nails clutching their deep-lined faces or kneel at wooden crosses and weep.

Wednesday, March 16, 2011

The Relic

In the App Store April 14, 2011!


The Relic is a 3D Gauntlet- or Diablo-style arcade RPG developed by Axolotl Studios (aka me) and published by Chillingo. It runs on iPhone and iPad. It's taken too long to develop but it is currently in submission with Apple and will be released within the next few weeks. I'm proud of it. There are those projects that you create that turn out far better that you had hoped and this is one of them - for the most part. Like all your creations that you know intimately, you know its flaws. One big disappointment was having to cut multiplayer.

Multiplayer is not in this release. I spent months working on it and got it working reasonably well but the architecture was a mess and it was hard to fit the rest of the game around it at that time and it was getting later and later. I was starting to believe myself that the game would never be released, so I cut it. I intend to get it in in a future update.


And Death Shall Have No Dominion

Life is about attachment and detachment.  We're born; we love; we die.  Yet science in our age hints that even death itself may yield to the relentless advance of technology. The Relic explores the concept of immortality and of mastery of the biological in an unexpected, though admittedly minimalistic way. I'd like to add more depth and nuance to the story in future updates.

The Art of The Relic

Mark Jones created the character art and most of the animations. Some of the environment art (the tents and market area) was stock 3D art and well worth what I paid for it.  In the future I will use stock art more, it's more cost effective that creating my own art or paying for custom art.  I created the dungeons themselves and props such as the crates and barrels and the items that can be dropped, some of the animations, the UI art and the logos. Much of the scene art, the intro, etc. uses art adapted from public domain art sources - that is, famous, old works of art.  I used Blender for the 3D art.

The Music of The Relic

Most of the music in The Relic is stock music, however, The Relic includes two songs by indie songwriter and musician Andy Livingston, "Indigo Winter" and "Heavy."

The Code of The Relic

One of the most successful parts of The Relic's engine is the sheer number of animated 3D enemies that it can handle. The Relic engine uses Lua heavily for game-side scripting, but it is organized in a way that does not interfere with The Relic's ability to manage so many enemies.

I'll write more about coding concerns later, but with 438 source files (not including the Lua files), this is certainly the largest software project I've written entirely by myself. It's written primarily in C++ and I did most of the development on Windows PC with Visual Studio and occasionally testing with the iPhone with platform-specific pieces written in C++ on the Windows side and Objective-C on the iPhone/iPad side. As with Indigo Ocho, near the final stages of development, development shifted completely over to the Mac/iPhone.

The Relic (iPhone 4 screens) [on facebook]




Friday, March 11, 2011

Indigo Ocho

Indigo Ocho has been out of the App Store for some time now, and now that The Relic is done, I'll try to get Indigo Ocho back up there.

Indigo Ocho on the App Store.

Join in the adventures of Indigo Ocho, the eight ball on a quest to destroy a labyrinthine tower threatening to wreak havoc on the human world.

I'd like to write more about Indigo Ocho, and hope to get around to it in some future post.

Indigo Ocho [facebook]







Saturday, November 29, 2008

Industry Broadcast: Podcasts of Senzee 5 Articles

A Senzee 5 podcast (Audio Article #34: Concurrency in Game Design + Why Use C++?) is now available at Industry Broadcast (http://www.industrybroadcast.com/) read aloud by Ryan Wiancko. There's a lot of really great stuff there, so get over there and check it out!

The audio article posted combines my entries Concurrency in Game Development and Why Do We Use C++?

Industry Broadcast is the result of Ryan's great idea to offer insight from game developers in audio format. He says -

I was toiling over one disappointing aspect of almost every one of my days: That being that I have so little time outside of my 16-20 hour work day to be a human being that I never am able to sit down and read enough of the articles being published online about the games industry. Occasionally my RSS feeder throws something at me that I just have to make time for but for the most part I see the headlines of features and articles and have to regretfully click away and focus on the 65 new emails sitting in my mail box. I thought ‘God, if I could just have an LCD in the shower with me I might actually have the ability to digest the plethora of useful information regularly being shared by the top minds in our industry.” And then an even better idea struck me: If all of this material was available in Audio Format then I, as well as fellow developers, could be listening to these amazing articles whilst working out or doing the dishes, or or or.

Ryan also maintains a personal blog here.

Sunday, November 16, 2008

Underengineering Undead

We learn more from our failures than from our successes. In A Developer's Life Stages, the first stage is The Underengineer, in part inspired by this poignant failure.


As a college freshman in late 1992, I started making an Ultima VI-like role-playing game.

In researching this post, I went through my journals from that time period to try to figure out exactly how Undead failed. One glaring issue is that ~75% of the journal was about girls, with the remainder divided among writing music, painting classes and working on the game. While totally expected for a distractible teen, given the difficulty of the task and a rapidly approaching deadline (discussed later) it's not a good indicator of eventual success of the project. Nevertheless, software development is a human activity and must coexist with other human activities. Initially, I was more interested in producing an Ultima-esque demo that would get me a job at Origin Systems.

I met a classmate in my speech class at school named Alex Kapadia. Alex had some experience with sound programming and was a game fanatic. I showed him what I'd built, he was thrilled and we began collaborating. At the time, we were playing a game called Solar Winds distributed by a small shareware company called Epic MegaGames before it shortened its name and became known as the world-class developer of Unreal and Gears of War. Each time the game ended, up popped an ad by Epic requesting developers to send in their games for publishing. We sent Undead to Epic and awaited a response. We didn't have to wait long. In early summer 1993 we knew that we would be working with Epic. We sent several versions to Epic over the following year. As it started to gel a bit, we began working more closely with them.

JOURNAL 12/06/93: Talked to Tim Sweeney (president of Epic MegaGames) today. Wow, he knows games. He gave me a lot of good suggestions. He's looking into an artist and musician for the game. He was talking some intense MONEY!!!!!!!!!!

Tim estimated that the game would make Alex and I $40,000, which was an unfathomable amount of money for me as a 19-year old.

JOURNAL 12/08/93: Today Dan Froelich, musician and composer for Epic called me. He lives in Kansas City (that's crazy!) and works for Informix. He told me a lot about how the game publishing thing works. After finals week, we'll get together.

We did end up getting together, Dan, Alex and I at Manny's, the finest Mexican restaurant in Kansas City. He told us a lot about Epic and the business of developing shareware games. He also brought beta copies of Epic's Xargon and Ken's Labyrinth, developed by wunderkind Ken Silverman.










JOURNAL 12/15/93:

From Tim Sweeney (via E-mail):
Date: Wed, 15 Dec 1993 04:28:24 -0500 (EST)
From: Tim Sweeney <70451 .633=".633" compuserve.com="compuserve.com">
Subject: RE: Undead & Pinball
To: PSENZEE@VAX1.UMKC.EDU
Message-id: <931215092823_70451 .633_fhg40-1=".633_fhg40-1" compuserve.com="compuserve.com">
Content-transfer-encoding: 7BIT
--
Thanks! It's great that you and Dan live in the same town. I hope you'll be interested in working with Dan - he's been with us on Jill, Kiloblaster, Brix, Solar Winds, Adventure Math, and Xargon and his experience working with these projects would be helpful in addition to his music! I'm looking forward to seeing more of Undead! It's the best "first" game any author has shown us. Judging by your coding and artwork, your game has great potential and you have tremendous potential as an author. Undead still has a long way to go in developing a story, creating all the artwork, and turning it into a fun, unique, and successful shareware game, but it looks like you have the perserverence to see it through to the end. Keep up the great work!

-Tim, Epic MegaGames
(3:22 AM - normal business hours for we game developers) :-)

A House of Cards

In late 1993, we believed Undead was going to be an enormous hit. The possibilities appeared endless. Even so, I was starting to deeply fear that I wouldn't be able to finish it. Undead had grown in complexity so much that modifying it was becoming difficult. It was approaching 20,000 lines of C and assembly and because it had no higher level architecture to speak of, I was losing my ability to understand it. Disparate pieces were tightly coupled. There was no layering of subsystems. Significant numerical values were hard-coded everywhere. Every line of code I added made it harder to work with. It was like going from troweling wet concrete to chiseling hardened concrete. This was a classic case of underengineering and I was unequipped to fix it. I was scared. Instead of confronting that issue, I began obsessing over the art - most of the development time was now spent in DeluxePaint getting the art just right.

JOURNAL 03/02/94: Undead is gaining bugs as I try to fix it! Argh. And it's having memory problems -- specifically, not enough static memory.

Worse yet, I had a deadline that I hadn't yet shared with Epic. In a year, more or less, I'd be leaving the country for two years without access to a computer. Now, I suspect I could have fixed Undead's woes given enough time, but I didn't have that time.

Man on a Mission

I grew up in the Mormon (LDS) church. Although I left the church many years ago now, at the time I was devout and determined (and expected) to become a missionary (I'll write sometime later about why this was the right choice, despite my eventual leaving). Around March 1994, I called Tim and told him that I had committed to leave for a two-year mission to central Mexico sometime around September. Understandably, he wasn't happy. I'd naively assumed (wishful thinking) that I would be able to get everything done before leaving in the fall. He knew better.

JOURNAL 03/26/94: BAD NEWS. Tim Sweeney got the copy of Undead. He told me he thought it was fantastic, but that there was no way on earth I was going to get it done before August. In addition, he said it would be absolutely obsolete when I got back. 03/27/94: I didn't realize how upset I was about what Tim said about Undead not being done until I woke this morning and I had been having nightmares about it all night. Of course he's right and I knew it anyway.

Obsolescence was always on our tail and we felt its pressure even during development. The style of game that Undead represented was an Ultima VI class game when the RPG state of the art was Ultima VII and in 1993, Doom (as shareware no less!) splayed the writing on the wall for all 2D games.

Perhaps, as a project, this was doomed from the outset for many reasons. The most obvious was my leaving before it was done. Compared to what I build today, though, the game was not at all complex. It should have been straightforward to build it in a year-and-a-half. It's been said that programming ability manifests at a young age, while skill in software architecture comes much later. In the end, I knew the dark secret. It wasn't merely unfinished, it was unfinishable.

Saturday, November 15, 2008

Geek History #1

Circa 1987-1991

Connecting with old friends on Facebook lately led me to remember those early days as a teenager writing video games. It's incredible how much has changed since then. It was nearly impossible to get any information on how to program a computer, much less on how to write games. The library books were typically user and application-oriented. C and assembly books could only be had at the bookstore at ~$60 a piece. In the days before bookstores came with sitting/reading furniture, being a kid without a lot of cash, I'd go to Waldenbooks in the mall and stand there reading, absorbing as much as possible before I had to leave. Today, on the other hand, there's rarely a need to buy technical books because whatever I need can be found on the web faster and for free. Today is definitely better.

With a tiny bit of programming in school (Applesoft and Commodore BASIC) when we got our first computer (a Tandy 1000SX), I naturally started with GW-BASIC. It was too slow for the kinds of games I wanted to make - games like Ultima V and Times of Lore.

For Christmas, I asked my parents for a BASIC Compiler (a what?, they asked). It was what I'd circled for them in a magazine - Turbo Basic. I expected to drop my games in and have them run like crazy. There was a hitch, however. The Tandy 1000SX shipped with an OEM version of Microsoft's GW-BASIC that natively supported the Tandy's enhanced CGA video adapter (essentially the same as the the IBM PCjr's with the 16-color 320x200 mode). Turbo Basic didn't. So, as long as the games could be confined to the horrible four-color plain CGA, they'd compile just fine and run pretty fast. I wrote a paint program (Paint!, image below) and a couple of plain (and simple) CGA games (Alien Invasion and BreakOut!, below) in Turbo Basic. In the end, Turbo Basic was still not fast enough and four colors weren't sufficient.

More importantly, there was one specific technical issue that simply could not be solved with any sort of BASIC. I wanted a four-way scrolling world, like those in nearly every commercial game of the time. I was so desperate to make this sort of game that I spent what little money I had on a commercial library (for BASIC) that supported scrolling through assembly-language routines. It turned out that the scrolling supported by the library was simple text scrolling through the BIOS routines, wholly inadequate for what I wanted. I was extremely disappointed and called the (apparently) single-person company for a refund. He refused. There was only possible solution - to learn C.

C had (and still has) a reputation of being extremely difficult, yet it was the language most commercial games were written in. I bought Mix C - a command line compiler/linker and nothing else - for $20. Coming from BASIC, it was a difficult environment. After floundering with that for months and maybe a year, I finally broke down and bought the Turbo C compiler for $150 and spent the next two weeks trying to build a working piece of software in C. Although I didn't fully understand pointers at the end of the two weeks, I wasn't far off from a basic working knowledge of C. Good tools can make all the difference. I still couldn't figure out scrolling until I received a letter from Herman Miller that brought everything together. From that Legacy I (shown above and below) in C finally came to be. It was a collaboration between Eric Lambert (who did the maps and much of the game design) and I. In truth, it wasn't a game in the end - the player is merely able to roam the world in full 16-color Tandy splendor. That was good enough for me because we now had a new computer with 256 (!) colors. It was time to start all over.