CHAPTER 7
640x480
April arrived without asking permission, as it always does, and with it came a routine that George embraced the way a shipwreck survivor embraces a piece of wood.
He woke up at six-thirty. Showered. Coffee. Walked to campus. First class at nine. Between classes, the cafeteria: notebook open, diagrams, notes. Second class. Quick lunch, usually something that fit in one hand. Third class or the library. At four in the afternoon he was back in the apartment. And from four until midnight, sometimes one or two in the morning, he programmed.
Eight hours of code a day, minimum. On weekends, twelve or fourteen. It was a pace that would have destroyed the forty-nine-year-old George, with his battered back and dwindling stamina. But the twenty-one-year-old body was an absurd machine: it ate ramen, slept five hours, and kept running as if it had a nuclear reactor in its chest. George knew this was not sustainable long-term, that eventually he would have to eat better and sleep more. But for now, during these first critical weeks, the body held up and the mind was on fire.
The first week of April he dedicated entirely to the tile system.
* * *
A tile was a square of 32 by 32 pixels. Thirty-two pixels wide, thirty-two tall. One thousand and twenty-four pixels in total. Nothing. A speck of dust on a 640 by 480 screen. But from those specks of dust, castles were built.
The concept was elegant in its simplicity: instead of drawing each screen of the game as a complete image, which would have required grotesque amounts of memory, you divided the world into a grid and each cell of the grid contained a tile. A piece of stone floor. A fragment of wall. A section of ceiling. A stair segment. The artist created a tile set, perhaps a hundred or two hundred per zone, and George combined them like pieces of a mosaic to build rooms, corridors, towers, dungeons. Hundreds of unique screens from a handful of reusable pieces.
That was how all the great 2D games in history had been built. That was how the original Symphony of the Night had been built, in another world, in another life. And that was how George was going to build it.
The first thing was the data format. George needed a way to represent a map: which tile went in each position of the grid. He went with something simple: a plain text file where each number corresponded to a tile in the set. The number 0 meant empty, transparent, air. The 1 was stone floor. The 2 was wall. And so on. A room map was a grid of numbers that anyone could read with a text editor.
It was a primitive system compared to what would exist in the future, the map editors of 2020 were sophisticated visual tools with layers, properties, animations, but in 1998 it was functional and efficient. George could create a test room by typing numbers in a notepad in five minutes. When he had an artist, he would build a visual editor. For now, numbers were enough.
The second thing was the rendering. George wrote the code that read the map file, loaded the tile set as a bitmap into memory, and drew the room on screen tile by tile, sixty times per second. The trick was not drawing everything: only the tiles visible within the 640 by 480 window. The map could be enormous, hundreds of tiles wide and hundreds tall, but the camera only showed a small portion. The code calculated which tiles fell within the visible window and only drew those. Everything else didn't exist until the camera arrived.
This was called culling and it was fundamental for performance. Without culling, the game would try to draw thousands of tiles every frame and the computer would crawl. With culling, it only drew the two or three hundred that fit on screen. The difference between a game that ran at sixty frames and one that ran at six.
* * *
George needed tiles to test the system. Real tiles, not numbers in a text editor. He needed to see something on screen.
He had no artist. He couldn't draw. So he did what every game programmer has done since the beginning of time: he opened Paint, the drawing program that came with Windows, and created the ugliest tiles the world had ever seen.
A gray square for the floor. A darker square for the walls. A blue square for the background. A red square for platforms you could pass through from below. A green square for doors. Each tile was an aesthetic atrocity of 32 by 32 pixels that looked like it had been drawn by a child wearing boxing gloves.
But it worked. When George loaded the placeholder tile set and ran the program, he saw a room on screen for the first time. An ugly room, made of primary-color squares, with no detail or personality whatsoever. But a room. A floor where a character could stand. Walls that defined a space. A ceiling that closed the environment. Platforms at different heights.
George moved the camera with the arrow keys. The room scrolled smoothly across the screen, without jumps, without flickering, at a constant speed. The scrolling was perfect. Mathematically perfect: every frame, the camera advanced exactly the number of pixels it should, and the tiles redrawn without any visible transition between one and the next.
It was ugly. It was functional. It was a beginning.
* * *
The second week of April, George implemented parallax scrolling.
Parallax was what separated a flat 2D game from one that seemed to have depth. The idea was simple but powerful: the game background was not a single image but several overlapping layers, and each layer moved at a different speed when the camera scrolled. The layers at the back moved slowly. The ones at the front moved fast. The result was an optical illusion the brain interpreted as depth, as distance, as if the 2D world had three dimensions.
George implemented five parallax layers. The farthest layer was the sky or the most distant background of the castle: it barely moved, almost static, giving the sense of a distant horizon. The second layer was the mountains or distant castle structures: moving slightly more. The third was the mid-background: columns, arches, stained glass windows passing behind the action. The fourth was the main layer where the map tiles lived: floor, walls, platforms. And the fifth was the foreground layer: decorative elements that passed in front of the character, like iron gates, curtains, mist.
With placeholder tiles, the effect was abstract: layers of color moving at different speeds. But George could see in his mind what this would be with real art. The background mountains of Castlevania scrolling slowly while Alucard ran through the corridors. The stained glass of the Royal Chapel passing behind the columns. The mist of the Catacombs floating in front of the character, blurring the edges of the screen.
When he finished adjusting the speed of each layer, a process of trial and error that took an entire afternoon of nudging decimal values back and forth until the effect felt natural, George leaned back in the chair and moved the camera left to right, right to left, watching the five layers scroll in harmony.
It was hypnotic. Even with colored squares, the depth effect was undeniable. The eyes fooled the brain. There was a world in there, a world with distance, with space, with places that seemed to exist beyond the edges of the screen.
George smiled. This was going to work.
* * *
The third week, George gave gravity to the world.
Until now, the white rectangle, his Alucard placeholder, could move freely in any direction, floating across the screen like a ghost. That had to change. Alucard was a character with weight, with a body, with feet that touched the ground. He needed to fall when there was nothing below him. He needed to land when something solid stopped him. He needed to jump, rise, reach the peak of the arc, and come back down. He needed to obey the laws of physics, or at least a version of physics that felt convincing to a player.
George implemented a basic gravity system: each frame, a constant force pulled the character downward. If the character was in the air, he fell. If he was on a solid tile, gravity was cancelled and the character stayed put. Simple. Elegant. And absolutely insufficient, because the reality of physics in a 2D video game was a nest of vipers disguised as a math problem.
The first problem was the jump. George wanted a jump with an arc: the character rose quickly, decelerated at the highest point, and fell accelerating. A parabola. Mathematically it was a problem solved centuries ago: initial velocity, gravitational acceleration, position as a function of time. But the feel was another matter. The numbers could be perfect and the jump could still feel terrible.
George spent two days adjusting the jump curve. He changed the initial velocity. Changed the gravity. Changed the way the character decelerated at the peak. He tried dozens of combinations, jumping over and over on the placeholder tiles, feeling each variation through his fingers and deciding whether it was right or not.
In the end he found the values he was looking for. The jump had commitment: when you pressed the button, the character went up and there was no taking it back. It had weight: at the peak, there was an almost imperceptible instant of suspension before the fall. And it had satisfaction: landing felt clean, definitive, without bounce or slide.
Then he implemented coyote time. An invisible trick that improved the experience without the player knowing it existed: if you walked off the edge of a platform and pressed jump during the first hundred milliseconds of the fall, the game let you jump anyway. In reality, you were already falling. In the game, the generosity of those hundred milliseconds meant you didn't lose jumps unfairly. The difference between a game that felt fair and one that felt cheap.
No game in 1998 used coyote time. The concept didn't even have a name yet; it would get one from the Looney Tunes Coyote, who ran past the edge of a cliff and only fell when he looked down. George implemented it because he knew, from twenty years of studying game feel, that it was one of those invisible details that separated good from great.
* * *
And then came the collisions. The private hell of every 2D game programmer.
The problem was conceptually simple: the character could not pass through walls. When he walked right and there was a solid tile, he had to stop. When he fell and there was ground below, he had to land. When he jumped and there was a ceiling above, he had to bounce back down.
In practice, each of those cases was a maze of conditions and exceptions. What happened if the character was between two tiles? What happened if he moved so fast that in a single frame he passed completely through a solid tile from one side to the other? What happened if he was standing on the exact corner of a tile and jumped diagonally? What happened with platforms you could pass through from below but stand on from above? Each case was a potential bug, and each bug was an hour of debugging with printf in 1998, because the visual debugging tools that would exist in the future were science fiction.
George attacked the problem with the methodology of someone who has fought these bugs thousands of times. He used AABB collision detection, axis-aligned bounding boxes, the simplest and most efficient method for tiles, and an axis-separation resolution system: if there was a collision, push the character out of the tile in the shortest direction. Horizontal if the penetration was smaller in X, vertical if it was smaller in Y.
It worked. Almost. He spent the first three days of April fixing the edge cases: the character getting stuck in corners, the jump not working if you were pressed against a wall, the semi-solid platform that sometimes let you through and sometimes didn't. Each fix generated a new case, and each new case required a new fix. It was like patching leaks in a boat: you plugged one and two more appeared.
But George had patience. And he had something no twenty-one-year-old programmer had: the absolute certainty that all of these problems were solvable, because he had solved them before. Not in this game, not with this code, but in essence. He knew that at the end of the tunnel there was a collision system that worked. He just had to get there.
He got there on Thursday of the second week. At eleven at night, after six hours of debugging, the character walked, jumped, fell, landed, bounced against ceilings, stopped against walls, and stood on semi-solid platforms without a single visible glitch. George tested it for twenty minutes without finding an error. He jumped into every corner, fell from every height, crashed into every wall.
Solid. Clean. Functional.
George got up from the chair, went to the kitchen, and ate the last of Margaret's third container. Cold meatballs at eleven-thirty at night, standing in front of the open refrigerator, with the kitchen light off and the fridge light illuminating his face.
His mother's meatballs tasted like victory.
* * *
On Friday, George sat down with Paint and drew a character.
Not a real character. A stick figure. A vaguely humanoid silhouette of sixteen by thirty-two pixels, with a line simulating a cape and a white rectangle for a head. He made four animation frames for walking: legs apart, legs together, legs apart the other way, legs together again. Two frames for jumping: one going up and one coming down. One frame for standing still.
It was pitiful. A ten-year-old would have done something better. But George didn't need art: he needed a placeholder, a test dummy, something with a human shape that would let him feel how the character moved through the game space.
He loaded the sprite into the engine. Replaced the white rectangle with the stick figure. Compiled. Ran.
And there it was.
A tiny, ugly character made of barely a few hundred pixels in primary colors, standing in a room of placeholder tiles, with five parallax layers behind him and gravity pulling at his feet. George pressed the right arrow. The stick figure walked. The legs alternated through their four-frame animation. The camera followed, scrolling the tiles and the parallax layers along with it. The world moved around the character as if it were real.
George pressed the spacebar. The stick figure jumped. He rose in an arc, hung for an instant at the peak, and came down with weight onto the platform below. He landed clean. No bounce. No glitch.
He ran right. Jumped over a gap. Landed on the platform on the other side. Jumped again, higher, toward an elevated platform. Made it by the skin of his teeth thanks to coyote time. From up there, he could see the room stretching out to the sides, the parallax layers giving it depth, and the stick figure standing on the ledge like a tiny, hideous king surveying his kingdom.
George laughed to himself. A short, involuntary laugh, the kind you let out when something surprises you by being better than it looks.
This worked. This felt right. The stick figure was horrible, the rooms were colored squares, there were no enemies, no combat, no music, nothing that resembled a finished game. But underneath all of that, underneath the ugliness and the roughness, there was something no other game in this world had: movement that felt correct. A jump that was a statement of intent. A world that, despite being made of virtual LEGO bricks, already hinted at the grandeur of the castle that would come.
* * *
On Wednesday of that week, at lunch with Claire, George was quieter than usual.
They ate at a Vietnamese place in the Tenderloin that Claire had discovered. Hot pho that cost four dollars a bowl and tasted like someone had condensed human kindness into a broth.
"You're somewhere else," said Claire, slurping her noodles.
"Sorry. My head's in a project."
"The computer thing."
"Yeah."
"Are you ever going to tell me what it is?"
George thought about it. He hadn't spoken about the game with anyone outside his own head yet. Saying it out loud made it real in a different way, more exposed, more vulnerable.
"I'm making a video game."
Claire set her chopsticks on the bowl.
"A video game? On your own?"
"For now, yes. Eventually I'll need help. An artist and a musician."
"George, I don't know anything about video games, but... isn't that something big companies do? With a lot of people and a lot of money?"
"Usually, yes. But games don't have to be that way. One person with the right vision and the technical skills can create something that competes with any company. You just need time and an idea that no one else has had."
"And you have that idea?"
"Yes."
He said it with a certainty that surprised Claire. He saw it in her eyes: the slight widening of her pupils, the tilt of her head, the silent reassessment of her younger brother. Claire knew nothing about video games, but she knew how to recognize conviction when she saw it. And George was not boasting. George was telling the truth.
"And do Mom and Dad know?"
"Dad knows something. Mom doesn't. I don't want to worry her until I have something concrete to show."
"Worry her because you're spending your time on a video game instead of looking for a real job."
"Something like that."
Claire looked at him for a long moment. Then picked up her chopsticks and went back to her pho.
"Alright. If you do it, you have to let me play it."
"Deal."
"And if you fail, I never had this conversation."
George laughed. Claire too. And in that shared laugh over a cheap bowl of pho, George felt something he had not felt in twenty-eight years: that someone knew what he was doing and, even if they didn't fully understand it, was on his side.
* * *
On Sunday, April 12th, after the family lunch, Margaret made roast pork with mashed potatoes, and Richard asked George how "the computer project" was going in a tone that tried to be casual and failed spectacularly, George went back to the apartment and sat in front of the screen.
Two weeks of programming. A tile engine with smooth scrolling. Five parallax layers. Gravity. A jump with a parabolic arc, coyote time, and input buffering. Collision detection with solid tiles and semi-solid platforms. A placeholder character with walking, jumping, and falling animation. A camera system that followed the character smoothly.
George opened the game and moved the stick figure around the test room for five minutes. He had him jump between platforms. Let him fall from height. Crashed him into walls. Everything worked. Everything felt right.
But it was a skeleton. A skeleton beautiful in its technical precision, but a skeleton all the same. It needed skin. It needed flesh. It needed art that would turn the colored squares into the corridors of a castle, and the stick figure into Alucard, and the silence into music.
He needed an artist.
George opened the notebook and reviewed his notes. Tomorrow was Monday. Tomorrow he was going to go to the USF art department, look at the work on display, ask the professors if they knew anyone with a talent for digital illustration. And if he found no one at USF, he would go to the Academy of Art University on the other side of the city. And if he found no one there, he would go to San Francisco State. And if he found no one anywhere, he would put up notices on the bulletin boards of all three universities offering paid work on a video game project.
He was going to find his artist. Because Dracula's castle could not stay a collection of colored squares forever.
George closed the notebook. Looked at the screen, where the stick figure waited motionless on its platform, and said out loud, feeling slightly ridiculous:
"You're going to have a face soon, buddy. Be patient."
The stick figure, of course, did not respond. But George could have sworn it looked slightly more hopeful.
End of Chapter 7