Sunday, October 18, 2015

Game 1


When it comes to my own personal projects or ideas, I have a very hard time finishing anything. I love dabbling and tinkering and fulfilling some curiosity, but it is almost impossible for me to 'deliver'. So when I was recently motivated to play with some pixel art, what started as a small toy project pixel-art experiment evolved into a small game that was completed within a few weeks. This is the story of the process of making that game.


Inspiration

The original inspiration came from a few sources. Firstly, I recently attended the Seattle Retro Gaming Expo. Among other things, there were a few booths in which some indie devs were showing off their retro-looking games. Needless to say, I saw some mediocre pixel games that had been worked on for mere weeks before being presented in the Expo and felt I could do better. Secondly, I attended the Seattle Code Camp recently, at which there was a Unity demo in which the presenter created a Flappy Birds clone within an hour. It helped me remember how simple things can be behind the scenes and still look good and be fun. Finally, I have not yet dabbled with Unity 5 or any of the newer features even in previous versions, such as 2D sprite animations, new UI system, and HTML5 deployment.

Environment

One interesting aspect of this project was the environment. Since I didn't have Unity 5 installed on my laptop, nor the space to install it, I opted to try development on an Amazon Web Services EC2 instance that had GPU capabilities.  I had dabbled previously with that, having set up UE4 on there since it ran slowly on my laptop. Basically, this was a virtual Windows machine in the cloud with a GPU that I could remote desktop into and work on as if I was running Parallels locally on my Mac. In order to do work, I would start up my instance, remote-desktop into it, work for a while, then commit changes and shut down the instance. Interestingly enough, it was much better on my laptop's battery life than running Unity locally. Maybe I'll discuss this more in a later post.

Day 1

I'll discuss the first night in a bit more detail than other nights since it really set the tone for the entire project. I sat down on a single night with nothing but the inkling to play with pixel art in Unity. I knew I was just going to spend the night gratuitously slinging a bunch of animations and things together to make something. Anything.


It started with Googling around for sprite animations. I found and borrowed one of my favorites : the entire sprite sheet for Samus from Super Metroid. It took a while to figure it out, but I was able to create a simple animation of just the run cycle. Using just the run cycle was much simpler than trying to extract all animations and create a complex animation controller for all motion of the character, so I stuck with just the run and moved on. Next I Googled around and found some skylines of Tokyo and tweaked them slightly in a photo editor. Next, the ground was created by hand, and in order to make the runner look less obviously like Samus, I opted to tint the entire character black to hide detail. Keeping this silhouette aesthetic would keep the art extremely simple and help with keeping a fast pace of forward progress. Next, I added screen-space pixelation in Unity with a low-res render target. This approach was very configurable and added a sufficient amount of abstraction to Samus and the backgrounds. Finally, I added some other background elements that were parallaxed to give the impression of some distance and depth. After a few hours, I was pleased with the result of the runner with the scrolling background. I knew the pixelation effect wasn't yet perfect, but it was a good first step.


The borrowing of the art was great because seeing something that looked good immediately was a huge contributor to the motivation. And yes, I know 'borrowing' art is bad, but I am not going to make money on this, I'm making no claim about owning the art, and really, nobody is going to care since this is just a tiny toy project. Secondly, having constraints helped aid the design. That's to say, by wanting to abstract away the details of Samus and simplify most of the foreground art, the silhouette and extreme pixelation aesthetic came to life. Also, by not focusing on something interactive, and simply on something that animated, much of the initial complexity was reduced. Avoiding those pitfalls and following the inspiration of 'slinging' a bunch of things together to make something that looked good only perpetuated the motivation.

Continuation

It wasn't until after the first night that I decided it was something I could feasibly bring to completion. The first goal was to improve the pixelation effect, which was producing a strange wobble due to how the background was being discretized to the render target. Adding game elements would be less of a priority than the pixel effect, and honestly not quite as interesting.

The single biggest technical hurdle was proper pixelation. That was the whole impetus for the project, so that was the one thing I was determined to get as good as possible. The first version had a noticeable wobble or shimmer effect, and took a few days to understand where it was coming from and how to fix it. Here come some technical details.

Scene Organization

The scene is split into 2 smaller sub-scenes. One represents the 'world' where the objects reside, which is a 20 x 10 Unity units (meters) area where game objects reside as sub objects. The camera of the 'world' scene renders to a 128 x 64 pixel render target. It uses an orthographic camera so all of the size and speed scaling based on distance is handled manually. More on that later. The 'screen' scene simply renders that render target to a quad and displays it to the main camera.

The 'world' and 'screen' scenes in the hierarchy view 


20 x 10 Unity world space uints map to 128 x 64 screen pixels


Interesting to note, in the version that I released, the screen scene's camera frustum extends into the world scene, which probably means it's not culling the objects in the world scene behind, which could be a huge performance issue. Whoops.

Texture Filtering and Source Art Size

This topic is the single most important part for proper pixelation. Point-sampling was used by all textures and sprites to prevent the default texture sample filtering from making it look blurry. Without point-sampling, everything looks too fuzzy and objects have a semi-transparent boundary, which ruins the effect. Pixel art is very high-contrast, usually with no semi-transparent sections or borders. Secondly, keeping the source art of some multiple of the final resolution kept the objects from having semi-transparent edges and prevents the wobble effect. The following examples highlight the need for this. 
  • Bilinear filtering is on the source image and the image is a multiple of the screen pixel resolution. The result is intermittent blurriness as the background slides across the screen. Filtering calculates averages as the the image pixels map to different screen pixels over time, making it blurry.


Bilinear filtering on source texture causes fuzziness


  • Point sampling is on the source image, but the source image resolution is not a multiple of the screen pixel resolution. The result is a wobble or shimmer as source image pixels are discretizing to screen pixels inconsistently over time. In this case, a 512 x 256 image is inconsistently mapping to a screen pixel resolution of 140 x 70, resulting in wobble.

Point sampling on source texture whose resolution not multiple of pixelated screen resolution causes wobble


  • Point sampling is on and the image is a resolution a multiple of the screen pixel resolution. This results in a proper and consistent mapping between image pixels and screen pixels over time.

Point sampling and source art resolution is a multiple of pixelated screen resolution results in good movement

Those with a keen eye will notice some of my background art suffers from some issues still. Namely, there are some semi-transparent edges on some of the parts of the building. It's true, I wasn't that diligent about ensuring pixel-perfect source art, and so there are a few small issues in the backgrounds.

Object Position Discretization

There were two types of objects in the scene. Backgrounds (mentioned previously) were simple scrolling textures on quads that were scaled to the entire 'world', that had texture wrapping on. Background props and enemies, other the other hand, were Game Objects that had a sprite renderer and had a physical position within the 20 x 10 world. Removing the shimmer / wobble on objects required extra work.

I tried and failed to find any built-in Unity solution to this, though granted I didn't look too hard. While there were options in the Sprite importer about specifying 'units per pixel' or whatever, which helps you define how the sprite would map to your world-space units, there didn't seem to be anything that could lock or discretize transform or physics positions to the screen pixel boundaries. 

I created a script to keep them snapped to the pixel grid kept the pixelated object consisted despite its position, rather than shimmering across screen pixels. Interestingly, at the time of writing this blog, I realized that script wasn't necessary because the source-art, already being a multiple of the screen pixel resolution and being scaled appropriately to match texture pixels to screen pixels, was already correctly preventing the wobble. But such a script would be necessary to allow for arbitrary pixel sizes or screen pixel resolutions if it was desired that the source art wasn't authored at a resolution that was a multiple of the final resolution. Though you could still have fuzzy borders in that case. In retrospect, the sprite asset's 'unit per pixel' attribute could potentially handle this correctly.

The rest is fairly simple. Scripts on the background props slide them to the left at a designer-specified rate per frame. The ones further back are smaller and scale more slowly. After a certain x-position threshold, they teleport to the right and recycle. Simple.

Other Gamey Junk

There are aspects of game development that I love and other aspects I find extremely tedious. I preferred to concern myself with the aesthetic, technical implementation of the aesthetic, and over-all look and feel for this project. This involved Googling for more borrowed art, such as the sprite animations for explosions and the weapon firing. I did not want to focus on the 'gamey' aspects, such as score, enemies, rotating projectiles, and player death / loss condition. I found those elements extremely tedious, though necessary to make it interactive and more appealing to a broader audience. Also, those aspects aren't particularly interesting to read about since any game has those hurdles to overcome. And that's also why the game isn't particularly interesting - no interesting enemy waves, or escalation of difficulty, or anything that makes for a good game. Oh well. Oh yeah, You can see some of the sprite sheets I found below.


Sound Effects

All sound effects were added within a few hours. Most sounds were found on Freesounds. Again, this goes in line with 'borrowing' art to make a lot of forward progress. The 'music' was constructed from scratch using Ableton Live. The shooting, explosion, footstep, and death / respawn sounds were from Freesounds, though the footsteps were massively modified in Audacity, and the death / respawn sound was the combination of multiple sounds, also done in Audacity. Also, the explosion and shooting sounds were played with slightly randomized pitch and volume to prevent it from sounding too unnatural. Ultimately, sound effects were one of the last things to go in, but they turned out pretty well and really helped add a final level of polish despite being done pretty quickly. But again, the implementation was nothing special.

Post-Mortem / Restrospective

Simply by writing this blog and attempting to explain how it worked, I discovered a few small issues with the pixelation that I spent a non-trivial amount of time and effort trying to work around. Had I been in less of a rush, I could have found simpler solutions sooner rather than trying to build around them.

What Went Right
  • Borrowing art - looking good early on helped with motivation
  • Working within constraints
  • Following motivation (local maximums for motivation) rather than having a grand vision for the entire thing I just worked on each little piece as I was inspired to address it.
  • Finishing something
What Went Wrong
  • Lack of a game/interactive design
  • Pixel shortcuts - working around some pixelation issues rather than finding the cause
  • Taking longer than expected - I had hoped to release within a week, but I didn't have time so I counted days that I worked rather than an actual amount of total time.
  • Borrowing art - lack of complete ownership
All commits for the project, giving a sense of the order things were done

Conclusion

Ultimately, over the course of 3 weeks, I spent about 9 or 10 separate days working on this (according to my version control commits). I feel like it was a decent use of time and the reception has been relatively positive. I know it's not the best game ever, but I'm proud of the outcome considering the time and effort put into it. I set out to do what I wanted to do, learn about pixel art games. Also, hopefully I'll have more small, interesting projects that I complete, and get in the habit of delivering. Thanks for reading! Stay tuned for more.

Friday, May 4, 2012

Thesis


There is something that has been nagging at me for about 3 years. My master's thesis is still not complete. This is preventing me from being a legitimate holder of a diploma for a M.S. degree in Computer Science from DigiPen. I have worked on the thesis off-and-on for those 3 years. Usually I make a bit of progress, only to become frustrated and demotivated within another week, leaving it idle for a few months. I am committed to finishing it by the end of the year, and to help it was suggested to keep a journal about it. I've gone a step further, deciding to create blog posts about it with the hopes that externalizing the thoughts and process will help keep ideas and fresh and small goals in sight.

Dynamic 2D Patterns for Shading 3D Scenes

Although I have already implemented a simple version of this, I originally cut a lot of corners that I'm going back over to implement it fully correct. The problem is this requires quite a bit of work, even in just the beginning. The first step in the technique involves distributing sampling points across a mesh. This is in itself an entire other paper (Stratified Point Sampling). That technique has 3 main steps: 
1) Voxelize a mesh. 
2) Determine a sample for each voxel
3) Remove samples that are too close

This in itself was a big enough hurdle. I implemented an octree and spent (off and on) weeks trying to debug a simple triangle-cube intersection bug to get it working. That finally allowed me to voxelize the mesh, but I still lack a decent mesh/sample point representation, which is causing me to be stuck on section 2).

Even with the proper sampling point scheme in place, the implementation has only just begun. Given the sampling points on the mesh, you then convert those sample points to screen-space, calculate a 2D similarity transform using least-squares solution, then offset the uv-coordinates of the screen-aligned pattern when rendering. And that's not even considering that you can separate the mesh into patches, each with their own similarity transform such that you achieve less pattern sliding. And the blending scheme between these patches is quite complicated. The main difficulty seems to arise from the requirement that the original mesh is modified with patch information, such as a blend weight per patch at each vertex, and that the patches are each rendered separately, which likely results in poor performance on a large enough scene with objects with highly granular patches. 

My thoughts on this resemble another paper, in which particles are distributed across the surface of an object. Perhaps the 2D similarity transform approach can be combined with screen-aligned surface particles for a similar effect that is more optimal to render.

This technique is the cornerstone for the thesis, as it is the technique with the best results for 2D pattern coherence on 3D objects. It is also a technique that gives some room for improvement. But it is also a hefty technique to implement. In future posts, I'll discuss other techniques I am trying to implement, as well as any progress I make on this one.

Thursday, August 19, 2010

Overheard in a bagel shop

Two women, with three small children between them. I overheard briefly an exchange between one of the women and children.

Woman: "Do you want to fall and crack your head on the ground and die?"
Child : "Just like daddy?"
Woman: "Yeah, it's so sad."

Sunday, June 20, 2010

Caracas, June 12-20, 2010

My time in Caracas is coming to an end. Much of my time has been spent watching World Cup soccer, watching TV, sitting on the laptop, taking photos, and hoping for the motivation to work on my projects. It's been a nice break from work, and I'm not really looking forward returning to long, tedious days at work and to missing almost every soccer game on account of the time difference and needing to work.

I've noticed the population here is pretty homogenized in terms of ethnicities. Almost everyone has dark hair, dark eyes, darkish skin. Not to say that everyone looks the same, but many of the general features are shared by most people. And it was a little jarring when I would see someone with lighter hair and eyes. Driving here is also an entirely different animal. There are a lot of roads that are narrow and wind perilously around steep hillsides. Frequently, fairly major intersections will contain no traffic signs or lights and instead cars just sort of interleave themselves into quickly passing and merging traffic. It's a bit harrowing, but seems to work. I'm curious what the accident rate is compared to a passive-driver's paradise like Seattle.

Saturday, June 12, 2010

Seattle to Caracas, June 11th, 2010

It began promptly at 3:30 am. My alarm went off, and I sat up from the couch, fully clothed and ready to go. I had brushed my teeth merely an hour and a half earlier when I went to 'sleep' so that I could minimize the time it would take me to jump in the shuttle van, which I saw slow down outside the window only 1 minute later. Prompt.

The van ride was pretty quiet, even after picking up someone else in Kirkland. The airport was nothing unusual. Except for the fact the security guard in the initial security line in which they inspect your ID and mark boarding pass took a while to look at my ID and compare it to my face. Then she called me by my middle name, to which I must have had a puzzled look to, and then to which she asked 'you don't like being called by your middle name?' As if I didn't know it was my middle name. She probably felt clever and important trying to find holes in my disguise. I responded that I'm rarely addressed by my middle name and continued on.

The first flight was from Seattle to Houston. I sat in the middle seat. They showed 'How to Train Your Dragon' on the plane and served a little breakfast, so it went by pretty quickly. I tried to sleep, and had slightly less than moderate success by putting the tray table down and leaning forward to plop my face onto my arms resting on the table. Houston airport was very crowded, and I just waited about an hour before the next flight. On that flight from Houston to Miami, I was in the last row, on the left window, and we had Direct TV access. So I pushed my seat back as far as possible, swiped my credit card and watched the second World Cup game of Uruguay vs. France, and took pictures of the oil spill in the Gulf, which we flew right over. All in all, one of the better flights I've had.

In Miami I met up with Ian, who arrived from LA a few hours earlier. Shortly afterwards mom and John showed up, along with mom's cousin Suzetta. We checked a bunch of bags that were left in Miami from another cousin then ate shitty pizza and finally waited around for the flight. We left around 9pm for Caracas, I was stuck in the middle again. The 3-ish hour flight felt longer than it should have. I spent time listening to music, reading a magazine, doing a MENSA quiz in that magazine, paying more attention than I'd like to admit to the movie 'The Toothfairy' with the Rock, and picking my way around the meat on top of a piece of shitty lasagana.

It took a little while to get through the airport. My uncle Joselo (sp?) was waiting for us. Upon stepping outside, I was struck with the hottest, muggiest weather I've experienced in years. It felt tropical; not fresh and natural but rather urban and dirty. It's the kind of weather that's pretty hard to fathom when living in the Pacific NW. We piled all into his SUV and were off on the 45-or-so minute long drive back to the apartments in Caracas. The windows of the vehicle were tinted, which made me feel extremely claustrophic and unable to see much out the sides. I tried to take a few pictures but ultimately was unsatisfied with my view and felt a little disoriented on account of it. Also, the roads seemed smaller than I remember. Narrower and fewer lanes. I had remembered the highways through the cities as being as large and long as airport runways. But perhaps my real experience with highways in the US since my last trip gave me a different perspective and turned those highways I remembered into winding, narrow go-cart tracks. Still, despite having been gone for about 12 years, a lot of it was pretty familiar. And the fact that it was familiar but still somehow different, smaller, was unusual to me.

At the apartments, we chatted a bit with Joselo and Marile, my aunt. I say 'apartments' because my grandmother's penthouse is right next to the penthouse of my aunt and uncle. So we're frequently hanging out in either, or moving between the two. Also, I'm pretty sure my aunt and uncle, both architects, designed this building. Mom showed them pictures of her trip to Santa Monica and of her remodeled kitchen. We met their Western terriers (Westies) Cordelia and Wi-fi (pronounced Wee-fee). Ian and I got a room upstairs which has a bunk. Ian took the top. Mom took a room downstairs next to abuela's and John took a room in the aunt's and uncle's place next door. The weather at the apartments was much more forgiving than that of the coastal airport. I fell asleep with a cool breeze coming from the window and the distant swooshing of cars speeding along. A day that started 3:30 am in Kirkland, Washington ended around 2:30 am in Caracas.

Monday, September 22, 2008

Recent Events, part 4

Heather's alarm went off shortly after 4 am. We got up, but I felt like I hadn't slept at all. It was cold and dark outside, and we put a last few things in the car and were off. When we were leaving, I'm sure Heather and I were having a similar thought: how it felt so strange to be leaving Matt there. It was difficult to see the lake through the darkness as we pulled onto the road and sped away. The better part of the following hour we were driving on desolate country roads, but I was careful not to speed too much on account of wildlife potentially running in the road, and I was already feeling drowsy. We were listening to XM when I realized we were going the wrong way, and I had forgotten to take a turn that I knew I was supposed to. We had to continue to Banff in order to turn around, all in all adding about 20 minutes to the trip and seriously making me doubt whether we were going to make it to a gas station in Radium Hot Springs. This was a bad sign, as I took it to be that I was still overly fatigued, sleeping only 4 hours after being up for over 35, and was probably going to make a lot of mistakes in the day if I didn't rest more.

The next hour was tough, as while Heather slept I was driving us through winding mountains. It was getting increasingly lighter outside but not the light nor the radio was doing a very good job of keeping me awake and alert. It was practically painful, but managed to make it, thank fully. We were approaching Radium Hot Springs when Nubis threw up and we stopped, luckily, at a small stream next to the road where Heather rinsed the jacket in which she caught most of the vomit. After a few minutes, we continued on and stopped at a gas station to refill, where Heather spent almost $80 to fill my tank. From here Heather began driving and I pretty quickly passed out for an hour or more. When I woke up we were already back in Cranbrook. We stopped briefly, and while Heather was inside, a song came on the XM station that played 40's or 50's songs. It was a cute song and I sang a few bars (A bushel and a peck...) to Heather when she got back, as I thought it would have been a song she would enjoy, and she actually recognized the song as something her mother sang to her as a girl but she had never actually heard a real version. We continued on, mentally I was comparing the trip to a reverse of the trip I had taken a day prior.

Another hour and we were at the border crossing. They began asking details of the trip and car, and while I was trying to find the rental agreement they were asking Heather about more details, before I knew it she was in tears. They had also started looking around the car. Finally though, they let us through, and we continued on, and I bit disappointed by how much my superego quakes when confronted with authority figures. The drive through Idaho was very scenic, a far cry from the dark, desolate, lonely landscape I had gone through. Heather drove and made a few phone calls and I just enjoyed the scenery.

We ended up stopping in Sandpoint I think, ate at a Burger King and swapped positions. By now it was about 10:30 am, we had already been up about 6 hours. From here the path back deviated a little, and I opted to take highway 2 rather than 95 towards Spokane. The road, though single-lane, went pretty swiftly and was very scenic as it followed a lake or river for a long time. Heather fell asleep again and we went through Spokane without stopping, the plan to drive southwest through Spokane all the way into Oregon, then west to Portland. Eastern Washington was a very desolate place. It was dry and bare like a desert, with dust-devil tornadoes, reminiscent of New Mexico or Arizona. In fact, it was almost as if someone had juxtaposed this area with central Arizona (Flagstaff), which gave me a Pacific Northwest feel when we drove through it a year earlier.

A few hours later and we were going through Kennewick, but the directions weren't clear causing us to take a wrong turn and lose another 10 minutes or so. It was slightly counter-intuitive since to go south we had to get on I-82 East/Highway 395, and going the opposite direction of your destination usually doesn't get you there very quickly. As we were approaching the Oregon border, things were getting green and scenic again, and the gas tank was getting empty. The merger onto I-84 disappointed me with its lack of gas stations, but eventually we stopped at one in Alderdale or something. Here we refilled, bought snacks, refreshed, and continued on.

The drive was quite pleasant from here on. The road follows the Hood River very closely and the entire area was very scenic. There were occasional dams that we'd pass that I'd try to get a photo of or ask Heather to take a photo of. We made one last stop at a McDonald's for restrooms and phone calls. We were about an hour away by now, probably in Hood River, and we got a final address to plug into the GPS. Continued on a bit further, and it was becoming apparent the landscape was changing again, now with more hills and evergreens, quintessential Pacific Northwest. We approached Portland a little after 6, and met up with some traffic. Luckily, we didn't have to go through too much to get to Jordan's. Heather was noticeably excited, and we'd practically count the miles or minutes left until we arrived. We finally pulled up to a nice little house in a nice little neighborhood, and after 13 hours in the car, I was greeted by a very friendly golden retriever.

Wednesday, September 3, 2008

Recent Events, part 3

The flight from Chicago to Seattle was tolerable. The attractive woman to my left watched movies on a mini DVD player and the woman to my right looked out the window and kept looking over at me as if she wanted to say something. I tried to ignore her for the most part by spacing out, trying to nap, or reading Less Than Zero. When the plane finally landed it was already around 6pm, I darted off the plane, through the airport to the baggage claim. I found the car rental booths and ended up getting a car at the first booth I tried, even though I was going to shop around for prices. The reduced price for AAA members drew me, but in the end I payed a shit-ton for insurance, GPS, and taxes such that it really didn't matter. Then the baggage carousel started up so I get my bag and hopped on the courtesy van to the rental place, which was far enough from the airport that I was starting to regret going with some no-name rental agency. The car turned out to be a fairly new Hyundai Sonata, and soon enough I was on my way home to pick up my birth certificate, bike rack, and CDs.

At home, I looked for my birth certificate but quickly grew very frantic trying to find it. It wasn't in the box I thought it was, and I emptied it and threw things around in a frenzy trying to look for it. At one point I even put a hole in my table after hitting it with frustration. I finally found the damn thing in the other box, and naturally felt like such an idiot for making such a fuss. Just then Sean got home while I was trying to tidy up my room somewhat. We chatted briefly about some potential roommate and about my plans to drive to Canada to pick Heather up. I finally get on the road and by about 7:30 pm on Thursday, August 12, I'm on I-90 going East, and my room is still a mess.

Alberta, Canada - August 12 - 13
The route I had laid out the night before, with the help of Mike. He had a lot of experience driving to Calgary so I trusted his guidance. The route would take me east just past Spokane, then north along some highways up into Alberta. The drive started good. I had a lot of energy, a brand new car, a nice twilight and scenery, and WireTap (sort of a This American Life clone) on the radio. I even tried starting some video journal thing with my camera. Over the course of a few hours I'd record a few comments or thoughts I had at the time but honestly I felt stupid talking to the camera and have yet to watch any of those videos. Soon enough, NPR began losing reception. I spent the next hours simply driving and flipping through the radio stations. A few hours later I was getting noticeably tired, so I put in a mix CD so the familiar songs would keep me awake. Eventually I noticed the radio had XM on it, so I started listening to that. I alternate between XM and a song or two from the mix.

I was getting pretty hungry, but I kept putting off stopping to keep myself going. Anticipation is the best motivator. I finally hit Spokane and for some reason had it in mind that I wanted to eat Taco Bell. None of the exits had a Taco Bell sign so I ventured onto a road parallel to the interstate, something I wouldn't ordinarily do without GPS, in search of Taco Bell and a gas station. I finally found one, ordered some nacho cheese chalupas and a 7-layer burrito. I inhaled the chalupas quickly at a gas station while the tank filled. I jumped back on the interstate and entered Idaho. Shortly afterwards, I exit from I-90 onto highway 95, heading north. The road reminded me of 441 in Florida: at some points a highway in the country, but at other points a city street with stop lights. It eventually became a single lane road, and it was dark and desolate and pretty lonely out there. Occasionally I would pass through a small town, but there wasn't much out there, which was all the more motivation to keep going.

Fast forward to a few hours and many dark and winding miles later, and I was finally approaching the Canadian border. I was pretty exhausted by this point, and was seriously considering stopping to nap if there had been actual places to stop. Thus, I pushed forward, constantly anticipating the next town on the map as a possible point for me to rest. I finally got to the border. I had no idea what to expect since I've never been through this area before. It was like a little outpost in the middle of nowhere. I pull up to the window and some woman starts asking me about my trip. I was exhausted and stupid and of course start trying to explain teh whole story about friends on a bike trip and one died and now I'm going to this lodge to pick up the other friend and what not. She started asking more questions such as why my friend I was going to pick up didn't just come back by herself. Anyway, she finally let me through and told me it was about another hour to the next town, where I was determined to rest. The roads in Canada seemed even darker, more twisting, and more lonely. But also a bit thrilling.

When I got into Cranbrook, I was a little worried there would be no place to stop, being as how I really had to piss. I finally found an open 7-11 and stopped, pissed, and decided to try my luck with a little bottle of some 5-hour energy substance. I also put a little gas in the tank, but apparently $8 in Canada just gets you a few drops. The 5-hour energy stuff tasted pretty vile, sort of like a poor citrus imitation like those Emergen-C packets. I continued driving, shortly thereafter realizing that I could already notice a bit of light in the sky in the north, and silhouettes of mountains. The increasing light, coupled with the 5-hour energy thingy, made the next few hours pretty easy-going. I was alert again and surprised at just how alert, and thought I might not have to stop after all. A few hours later I reached Radium Hot Springs and entered some national park. The drive became insanely more scenic, with winding roads and mountains and nature all around. I was getting pretty tired but the thought of being so close kept me going. I didn't realize that it would still be another two hours before I was at my destination, but it was still very motivating and pretty exciting to think at what I had accomplished. At one point Heather called me and helped finalize some directions for me. As I was approaching the lodge I kept half-expecting Matt to come tumbling out of the woods and I could take him to Heather.

I approached the Num Ti Jah lodge and was immediately struck by the beauty of the place. Surrounded by snow-covered mountains, Bow Lake was impossibly blue. I could see instantly why they'd wanted to stay here. I parked, wandered into the lodge, asked for Heather and took a massive piss. When I was coming out of the bathroom Heather greeted me. She fed me and we chatted. She showed me the lodge they were staying at, introduced me to some of the co-workers. We contemplated if we should sleep, but by then I was again pretty wired and excited about being there, and still in a little disbelief.

Heather showed me around a bit more, then we gathered rocks for souvenirs she was making for Matt's friends and family. She had a few calls to make so I gave Nubis a little walk by the lake. Then we began packing her things and her friend David suggested we go for a hike. Heather stayed to pack but I went with him and Melissa on a hike to a waterfall that fed into the lake. The hike went along the edge of the lake for a bit. I was taking photos through much of this, and foolishly looking closely at the water or shoreline for any sign of Matt. Then the path went through some flat areas covered in rocks, up a little cliff that overlooks the stream, and back down to another gradually sloping plane of rocks up to the waterfall. It was deceptively far. And at point point after slipping a few times in gravel, I was pretty sure I was going to plummet off the cliff into the rapids below. And after the brush with death, I was surprised to see kids and people who weren't necessarily well-prepared to make that hike. We sat and ate snacks as the shadow of the cliff crept over us, then headed back.

The trek back to the lodge was a bit quicker. When we arrived, Heather had made dinner for us. We ate in the lodge by the pool table. Then we packed the car with Heather and Matt's belongings. It was very strange to put his bike on the bike rack without his permission. I joked at one point that he will be mad when he comes back to find his bike is gone. It was starting to get dark, and it might have been around this point I took a few more pictures. I ran into Heather again and her and David were skipping stones by a little creek. Then we went on a quest to take showers. I lucked out and got the shower with the high-pressure head. After the shower I wandered around a bit more. I stood at the beach of the lake. Peering out over the smooth surface of the lake. Half-looking for looking for some sign of Matt. I even wept a little. And I felt a bit silly because I doubt he would have wept for me. But that's probably just because I'm not worth shedding a tear over and he definitely is. I watched the moon rise over the glacier on one of the mountains and continued to peer over the lake a bit more. Still in disbelief about Matt and my trip and being there and pretty much everything.

By now it was dark and cold and I met up with Heather again. She wanted to share the last bit of Matt's whiskey with me, David, and another friend at the lodge. At the same time there was some big bonfire. It was a bit odd with people having all sorts of conflicting plans, but eventually we four were alone in a cabin, sipping the whiskey and trading stories. This included the story of the search for Matt and finding his kayak. A few others joined us and it was good times and I realized Heather and Matt had met some really special people out there. It also seemed that there is probably loads of drama between the boys and girls who work at the lodge, possibly rather fun. Around midnight we decided to call it a night. We were planning on waking up around 4am for the drive to Portland the next day. I was very exhausted, having been up by now about 36 hours, I was buzzed from the whiskey, and my chapped lips were pleasantly burning from the alcohol. I made my way into Heather's bed with Nubis while she was out talking with David, and it felt really nice to finally rest, only slightly regretting that I was missing the meteor shower that was without a doubt fantastic to see from there.