December 31, 2016

Why Valve (Possibly) Stopped Curating Steam

Please note that the following is purely conjecture, but I do think it explains a lot.

I back Jim Sterling on Patreon. I enjoy his Best of Steam Greenlight Trailers series and hope that none of my upcoming projects ever appear on that particular series, I do happen to agree that ever since the floodgates opened with Steam Greenlight, the amount of crap that has gone onto the service has increased at an alarming rate.

Mind you, it wasn't always like this.  Back when I was working on "SiN Episodes: Emergence," Valve had a severe interest in curating games that could appear on the service.  Now, though, unless a game is likely to be rated AO or be considered pornography in certain markets, pretty much anything can get on Steam. 

What changed?  It's not the surfacing of first-party launchers like Origin or UPlay.  It's not the resurgence of the indie game developer.  It's not the rise and/or fall of indie portals.  I think what changed is that Valve started to fear antitrust litigation.  Let me explain.

Valve both owns Steam, the number one portal for computer game software digital distribution, and develops it own games.  For better or worse, they are the major marketplace.  If you aren't on Steam, you aren't visible in the eyes of most digital download consumers.

Back when Steam was only Valve's software, a case could be made that nobody else had a right to be on the marketplace.  Even with a few select titles on Steam, Valve could easily say that this was part of a publishing deal with Valve, and therefore they weren't picking winners and losers.  Up until they started allowing other publisher catalogs to appear on the service, it was still a "Valve is publishing these titles, therefore it's still a Valve product in a sense" service and could be defended as such.

The moment other publishers could put stuff on Steam, though, everything changed.  At that point, Steam was no longer a publishing platform, but a storefront with negligible distribution costs and virtually unlimited shelf space...and they not only controlled who got what position on the shelves, but they also were stocking their own product there as well so they could be seen as having a conflict of interest.

Because Steam is now a storefront as well as a developer, Valve can't be seen to be picking winners and losers.  If they say that product X can't be on Steam, if another game with a similar theme or quality bar gets on the service, the developer of product X could potentially sue.

Valve created Steam Greenlight specifically to get the "curation" part of the marketplace out of their immediate control.  The assumption was that people visiting Greenlight would take their responsibility seriously and so Valve could allow the best submissions onto the service and still have some level of quality control on the service.  Unfortunately, it's fairly obvious that Greenlight has been gamed to no end and the floodgates of shovelware and asset flips have been opened onto the service.

There are algorithmic solutions to some of these problems.  Rating games that you own on Steam will do a good job of helping to quickly bury crap games.  Using Steam refunds for absolutely horrible games will also help, because refunds also cost Valve a small amount of money in transaction fees and I'm sure that Valve factors refunds into how aggressively they shift products out to search purgatory.

However, there's only one thing that will guarantee that Valve is able to effectively run Steam without running into lawsuit bait as part of curation: spinning Steam off from Valve.  The moment Steam is independent, Steam can easily start acting like a storefront only and not have to worry about conflict of interest.

Is it going to happen?  Probably not.  Hopefully Valve is able to find a way to more effectively curate their storefront without conflict of interests being shoved to the forefront...but I'm not holding my breath.

December 17, 2016

RomTerraria and v1.3.4.4

If you are using the test version of RomTerraria for v1.3.4.3 and above and are experiencing water not rendering, please repair your Terraria installation, launch the game once, exit, then repatch.

If you are using the patch and the map is not coming up or you are stuck in a lower lighting mode, it means that an exception has been thrown.  I need to know the resolution you are trying to run at.

I'll be spending time tomorrow working on any reported issues.  Today I have to go finish my Christmas shopping and try to ignore the fact that today would have been my twenty-second wedding anniversary.

[Removed three weeks worth of outdated information]

Update 1/8/2016 12:03pm: I'm still getting reports of water and lava not properly rendering.  If you have deleted your config file, reset your resolution, then restarted the game, and you are still having issues, look in your Documents/My Games/Terraria folder and look for a file called CrashInitTargets.txt and post the contents of that.

Update 1/9/2016 7:30am: I received a CrashInitTargets.txt that showed a NotSupportedException creating the waterTarget RenderTarget.  That's really odd because that particular exception shouldn't be thrown by the RenderTarget2D constructor.  Will research when I get home tonight.

Update 1/9/2016 6:45pm: Okay, I just made a change that should free up an extra 140-210MB of RAM.  Water is working using the following values in config.rt.json (I game RomTerraria its own config file to help keep things simple:)

  "SmartCursorToggle": true,
  "MapEnabled": true,
  "InvasionBarMode": 2,
  "AutoSave": true,
  "AutoPause": false,
  "Language": 1,
  "PlacementPreview": true,
  "GoreVisualsAllowed": true,
  "VolumeSound": 1.0,
  "VolumeAmbient": 0.75,
  "VolumeMusic": 0.75,
  "UseExperimentalFeatures": false,
  "Fullscreen": true,
  "WindowMaximized": false,
  "WindowBorderless": false,
  "DisplayWidth": 3840,
  "DisplayHeight": 2160,
  "GraphicsQuality": 0,
  "BackgroundEnabled": true,
  "FrameSkipMode": 2,
  "LightingMode": 0,
  "LightingThreads": 0,
  "Parallax": 0.88,
  "ShowItemText": true,
  "LastLaunchedVersion": 188,
  "UseSmartCursorForCommonBlocks": false,
  "UseSmartAxeAfterSmartPickaxe": false,
  "UseSmartWallReplacement": true,
  "DisableLeftShiftTrashCan": false,
  "HighlightNewItems": true,
  "HidePasswords": false,
  "ReverseUpDownForArmorSetBonuses": false,
  "MouseShowBuildingGrid": false,
  "AllowUnfocusedInputOnGamepad": false,
  "LockOnPriority": 2,
  "InvisibleCursorForGamepad": true,
  "GamepadDisableInstructionsDisplay": false,
  "SettingsUnlock_WorldEvil": false,
  "SettingsEnabled_MinersWobble": true,
  "UseStormEffect": true,
  "UseHeatDistortion": true,
  "WaveQuality": 3,
  "MouseColor": {
    "R": 255,
    "G": 50,
    "B": 95
  "MouseBorderColor": {
    "R": 0,
    "G": 0,
    "B": 0,
    "A": 0
  "QuickLaunch": false,
  "CloudSavingDefault": false,
  "FilterLimit": 16,
  "FilterPriorityThreshold": "VeryLow"

I'm packaging up the build now.

Update 1/9/2016, 6:54pm: Here is my update. The big change here is that I eliminated depth buffers for all of the render targets. Users of Terraria will see this result in ~210MB of RAM being saved. Users of RomTerraria will see this result in ~140MB of RAM being saved (I used to reduce the depth buffer to 16 bits instead of 24 bits). Again, this is an EXPERIMENTAL RELEASE. Have fun.

December 7, 2016

Ten Years Out

I left the games industry in December 2006.

I've looked back, and while there are things I miss, I won't be going back into games full-time until I can go back on my own terms.

November 23, 2016

The Method Rewrite Post

While I was taking my Uber back from the Postmodern Jukebox concert, I figured out how I was going to "fix" Terraria and allow myself to release an update for RomTerraria at the same time: I'm going to rewrite the method that is introducing the issue.

I've patched bugs in the base game before. For the longest time, if you didn't have a My Games/Terraria folder in your Documents folder, the game would crash when trying to create the settings file.  I patched that with the original releases of RomTerraria.

Fortunately, I've got a good place to handle injecting my replacement method.  LiquidRenderer.PrepareDraw just calls the internal method.

I'm going to do this patch in two phases.

Phase one will be out tomorrow on Thanksgiving assuming nothing else blows up and will simply make PrepareDraw be a no-op.  This will allow everything else to work as is EXCEPT for the new water effects.

Phase two will take significantly longer.  I'm going to rewrite LiquidRenderer.InternalPrepareDraw.  It's a bit over 400 lines of, well, not good code.  I mean, it's dereferencing to memory before a pointer.  If I was going to be a total dick, I could craft a world file that could potentially turn into a native code exploit.  Fortunately, I'm not a total dick.  This will take me a lot longer to do and may end up moot if they fix the issue before my rewrite is done.

I've only got this weekend to do this, so here goes nothing.

Update 11/24/2016, 11:57am: Well, it's not going to happen this morning, but I am working on it...

Update 11/24/2016, 12:20pm: I've gotten the replacement class building as a standalone DLL.  I've got to do IL-patches to replace 14 instances of the class in six methods in two classes.  I'm going to try to get that done before I have to leave for my afternoon social obligation.

Update 11/24/2016, 4:38pm: I'm back from my social obligation and am resuming my coding.  I've almost got the replacement working.

Update 11/24/2016, 9:57pm: Stopping for the night.  I've got my replacement class patched in and am working on debugging, but I'm exhausted.  That said, making PrepareDraw a no-op has other side effects and isn't a good solution, so I'm dropping that part of the plan.

Update 11/25/2016, 12:18pm: Taking a lunch break.  Since I'm afraid I'm going to have to do this kind of thing again in the future, I've created a general purpose class replacement system. Will resume testing once I am fed.

Update 11/25/2016, 1:03pm: I'm now able to reproduce the crash inside my custom class inside the debugger.  Should help me fix it.

Update 11/25/2016, 1:09pm: Well, it's good that I made the class replacement system generic, because the crash is NOT caused by the code I suspected.  It appears that something else is running amok around memory.  Give me a bit of time to figure out the appropriate memory layout so I can figure out which object is immediately before this one in the heap.

Update 11/25/2016, 1:30pm: I've got a 1.2GB memory dump that I'm manually going through.  I'd be going faster, but the .NET memory tools require a minimum .NET version of 4.5 and Terraria is compiled to 4.0.

Update 11/25/2016, 2:25pm: Good news: managed to stop the game from crashing. Bad news: filled blocks of water aren't rendering.  Still going.

Update 11/25/2016, 3:53pm: I've checked my current code into Github.  Still trying to figure out why full blocks don't render.  Note that this doesn't truly fix the memory overwrite, but it leaves the old 160KB object around as a "safety buffer."  I'm going to try for another hour, then call it a day.  I've still got work to do around the house.

Update 11/25/2016, 5:51pm: Part of the problem is that the version of Telerik JustDecompile that I'm using doesn't properly decompile unsafe code evidently.  Testing a fix now.

Update 11/25/2016 6:00pm: Adding padding around the wave bank let me run with water effects for almost ten seconds before the game crashed in a spectacular fashion.  Looks like something is hardcoded with a max resolution and when you go above that resolution, it starts walking over memory it shouldn't.  Dinner shortly, then more research

Update 11/25/2016 6:09pm: Here's a test version.  This is not guaranteed to work, but appears to be working in my limited testing.  Please let me know if it crashes for you.

Update 12/6/2016 1:13pm: v1.3.4.4 was just released.  The test version was compiled and tested against v1.3.4.3, and may not work with v1.3.4.4.  I'm at work for several more hours.  Let me know if I need to address anything after the fix.

Update 12/19/2016 9:35pm: Added LAA support code.  Trying to fix an issue with rendering water that surfaced at certain resolutions for v1.3.4.4 before releasing an update.

Update 12/25/2016 3:58pm: Build for v1.3.4.4 here.  You'll have to set up your settings again.


I'm currently at a concert for Postmodern Jukebox and won't be home until almost midnight.

I've got tomorrow morning blocked out for rewriting the defective method in Terraria that's doing a negative address pointer dereference and swapping it out.  I've patched the base game before.  I'll do it again...

November 16, 2016

1.3.4 Support Coming

Sounds like Terraria v1.3.4.x broke RomTerraria again.

If I had to make a guess, I'd say that the new render pathway for water changed the number of RenderTarget2D's in the code.  If that is the case, it's probably a 20-30 minute fix.

That said, I haven't had a chance to look at it because I've been working, and I won't be getting home from work until late tonight.

I'll take a look at it after dinner tonight.

Update 11/16/2016, 8:23pm: I've got the resolution patch working, but the new water effects are causing the following crash that I need to fix first...

...removed for space...

Update 11/22/2016, 11:10am: Patch appears to be working, but I have to finish my test pass before I release it.  Hopefully tonight after dinner.

Update 11/22/2016, 6:41pm: I found a crash bug with Working on patching it now.

Update 11/22/2016, 8:24pm: Okay, I've got a choice.  I can either release a version that will only work with all the visual bells and whistles turned off, or I can hold back and release it once I figure out what is causing the wave mask to get corrupted and crash approximately ten frames into rendering.  Right now, I'm planning on holding back until I get this tracked down.

I know that isn't what people want to hear, but I'd like you to remember two things.  First, the reason that RomTerraria works as well as it does across multiple versions of the game is that I don't do source decompiling/recompiling.  I do MSIL-level opcode patching.  This requires a lot more time to do right because if I do it wrong, I create invalid code and that breaks everything else.

Second, the reason that you never see anything about this mod over on anything official is because back when Terraria launched, some asshats were using my mod as a crack for Terraria and they bundled my mod with the cracked version.  Because of this, Re-Logic appears to see this mod as something bad.  As someone who spent a decade in the games industry fighting pirates, I can't blame them.  I'm absolutely certain that they see me as someone who has enabled bad behavior and they don't want to enable me to succeed in this venture.

I've been maintaining this mod as a spare-time project for over five years now, and it wears on me.  I don't make any money off of it, partly because I don't want to further enrage Re-Logic, and partly because it doesn't seem right to me to make money off of mods.  However, that means that this mod is secondary to other projects at both work and home.  Even tonight, I've had to spend time helping out a lady friend.

I spend the time that I can afford to on this, both from a financial point of view, but also a mental point of view.  Working on this mod isn't as simple as hitting F5 in Visual Studio and seeing what happens.  It requires a lot of time to trace through each failure.  It requires a lot of effort to inject diagnostics code into the assemblies.  It requires a lot of patience to track down crashes, support comments, etc.  I have a finite amount of willpower to get through each day and this mod gets the last few minutes of the day usually.

I'll keep working until I head to bed tonight, but I won't be able to work on it again until Thursday night or Friday morning at the earliest due to the holiday and social obligations.  I'm off Friday, however, so hopefully I can refocus my energies for a bit and get this fixed.

Update 11/22/2016, 8:50pm: Around 40 frames in, something is corrupting Terraria.GameContent.Liquid.LiquidRenderer._waveMask and changing it from an array of 40000 XNA Color structs to an array of 39936 XNA Color structs.  This is going to take a lot longer to figure out since Terraria uses unsafe code to work with that array.

Update 11/22/2016, 9:05pm: Well, the good news is that I figured out the root cause.  There's a bad bug in LiquidRenderer.InternalPrepareDraw when it's dealing with a fixed pointer to _waveMask.  This code has a lot of issues.  It's not cache coherent (looping over Y inside of a loop over X), and the root cause is a chunk of code that starts writing before the variable if you are on a screen with certain conditions set:

*(vISCOSITYMASK - 200 * sizeof(Color)) = *vISCOSITYMASK;

They're trying to set the pixel above a point to the value of that point.  That line should scare you.  Scares the hell out of me.  Until I can trace through what the hell led to this, or Re-Logic writes a cache coherent version of this method that doesn't write to memory before vISCOSITYMASK pointer, there will not be an update to RomTerraria.

Update 11/26/2016, 12:57am: A test version that seems to work with is available over at the update post.

October 26, 2016

Electric Eye Open Source Release Update

I've been asked a few dozen times over the last month about where the open source release of Electric Eye is.  Here's a quick update.

I was in Japan and South Korea from October 1 through October 13.  Another individual working on Electric Eye was in China October 14 through October 21.  We were on site at our partners ensuring that the multicore rewrite that we did over the summer worked the way that it should.  A couple of minor bugs surfaced on site, including an interesting one where a S/PDIF renegotiation caused our audio interfaces to no longer receive audio.  We're both currently fixing the final spat of issues that surfaced from this trip.

On November 3, we're releasing the code to one partner here in the Bay Area.  This is a bit of a trial run to ensure that there's nothing egregiously off about our code.

Once we've gotten final feedback from our local partner about the code, we can resume working with legal to get the code released.

Sorry about the delay.  On the upside, we're going to be supporting several more webcam models as part of the release.  If you're trying to prepare for the release, I can provide you with system requirements...
  • Windows
    • Windows 7 SP1 64-bit or above with all Windows Updates installed
    • Intel i5 2.6 GHz processor or better, or the AMD equivalent
    • 8GB of RAM or more
    • OpenGL 3.2 compatible video card
    • Visual Studio 2015 Update 3
  • Mac
    • OS X Yosemite or El Capitan (macOS Sierra not yet supported)
    • mid-2014 MacBook Pro or better
    • Xcode 6.4
  • One of the following cameras (affiliate links)
I'm currently working on adding support for the c922x and c920 but cannot guarantee support will be in the open source release.

The Linux version isn't ready to go yet, and there are two chunks of code that we won't be able to release that won't impact general usage.  However, those should not stop the release.

Will share more once I know more.

October 2, 2016

In Japan

I'm currently sitting in my hotel room at the InterContinental Osaka getting ready for the next two weeks of work.  I'll be back in the United States after October 13.

During the next few weeks, I'll be unable to do any work on RomTerraria.  Even if I could do some work on it, I'm sitting here with a MacBook Air and wouldn't be able to test the high resolution features.

September 23, 2016

Electric Eye Update

Those of you who watched my talk on Electric Eye from back in May are probably wondering what happened to the end of August ETA for the source code release.

Over the summer, a large scale effort was made to change Electric Eye from a single-threaded tool to a multi-threaded tool.  That work wasn't released to partners until mid-September.

Since then, we discovered that we had a few compatibility issues with some 2017 model displays and we're working to get those fixed in the code that will be released.  These fixes have to be released to partners first.  In addition, the first three weeks of October are going to be spent at partner sites ensuring that everything still works well for our partners.

As a result, here is an updated estimated timeline.  We'll hopefully be handing the code for Electric Eye over to legal near the end of October to start the open source process.  Depending on their winter workload, the release could happen any time between December 1 and May 1.

Sorry for the inconvenience.  Trust me, it'll be worth it.

September 20, 2016

Schedule For Next Six Weeks

The next few weeks are going to be a bit insane, so here's a heads-up about what to expect.

This weekend, I'm going to be in Salt Lake City, Utah and unable to make any updates to RomTerraria during that time.

I'm hoping to get at least one more RomTerraria update out before October 1, 2016, but I can't guarantee anything.

From October 1 through October 15, 2016, I'm going to be in Japan and South Korea for work.  During that time, there will be no updates to RomTerraria, even if Re-Logic releases v1.3.4.

The next planned update for RomTerraria after my trip will be around the end of October 2016.

September 11, 2016

RomTerraria v1.2 Released

Go here to download.

My test map running at 4K resolution on Terraria

This release fixes the "Retro" lighting bug introduced with v1.1 for Terraria 1.3.3.


Working on fixing the LightMode error

Re-Logic added some code into Terraria to cap the size of render targets to 2048x2048.  This makes it so that if you use high resolutions through RomTerraria, it restricts you to Retro lighting.

Working on the fix now.  Will do another release once fixed.

September 10, 2016

RomTerraria 4 v1.1 Released

Go here to download.


Also, you may notice a new disabled checkbox. Some new (and returning) features are in the works. If you want to help out, why not head over to GitHub?

September 9, 2016

RomTerraria and Terraria 1.3.3

Re-Logic released Terraria 1.3.3 about an hour ago, after I had already left for work.

I do not know if 1.3.3 breaks RomTerraria or not.  Ideally, it shouldn't.

If you patch 1.3.3 with RomTerraria and it crashes once, please try running it one more time.  There appears to be a race condition on first launch with larger display sizes.

I'll check 1.3.3 out when I get home from work tonight.  I'd love to do it sooner, but working on free mods doesn't pay the bills.

[Update 9/10/2016 10:46am: Working on a fix now.]

[Update 9/10/2016 11:02am: The main render target changed visibility, and a new render target was added.  However, other variables changed.  Still working on it.] 

[Update 9/10/2016 11:26am: All variables updated.  Working on updating a couple of method calls.]

[Update 9/10/2016 11:40am: New version uploaded.  Read the instructions, as they have changed.]

August 12, 2016

Electric Eye and RomTerraria Update

Electric Eye

I've got two bugs left to fix before I can release Electric Eye v1.8.0 to partners.  As soon as those two bugs are fixed, I'll be handing the source code for Electric Eye off to legal so they can start the process required for open sourcing the tool.


I felt really disappointed earlier this week because I couldn't figure out how to properly scale the in-game GUI.  Since then, I think I may have figured out a way to actually provide in-game GUI scaling at the risk of making it so that RomTerraria is a bit more fragile across updates.

I'll be doing some experiments once I get Electric Eye v1.8.0 out to partners.

Update: If you want to track my progress on UI scaling, follow the issue on GitHub.

A preview...

July 21, 2016

RomTerraria and Terraria

I'm at work, but I'm seeing reports that RomTerraria is having problems working with Terraria  I'm not going to be home until late tonight, but I'll look into it when I get home.

[Update 1:  7/23/2016, 2:25pm.  I've been able to replicate the crash that people are reporting locally.  Working on a fix now.]

[Update 2:  7/23/2016, 2:30pm.  Unfortunately, the crash isn't consistently reproducible.  I get a null pointer dereference sometimes when I start the game, but if I relaunch, the dereference doesn't happen.]

[Update 3: 8/13/2016, 6:17pm.  Crash workaround found!  After you reset your copy of Terraria, and before you patch it with RomTerraria, you must run the game stock once.  After that, you can patch it and it'll work just fine.  It may still occasionally crash on the first launch after a system reboot, however.]

June 21, 2016

Vacation Coming

I'm going to be in New Orleans from June 23 through June 27.

During that time, I'm going to be responding to very little.

RomTerraria Multimon Update

I've been informed that RomTerraria is having issues when 1.3.1.x when running in cooperative fullscreen mode on multiple monitors with different resolutions.

I'm investigating the problem, but do not have an ETA for a fix.

Minor update: Still haven't been able to dig deep.  If you are affected, want to help, and are technically savvy, the code is in GitHub.

May 29, 2016

Public Venting About Private Matters

Please forgive the momentary diversion into LiveJournal land.

I've never considered myself to be a "catch."  Growing up, I was awkward, lanky, and had the physical attributes of a string bean without the nutrition.  My voice has always been nasal.  Even when I drop my voice an octave for public speaking, it's still torture for anyone who listens to me.

I was even worse personality-wise.  Until I was in my mid-twenties, I was a complete and utter asshole.  The laundry list of shit that was wrong with me could fill multiple pages, but I'm going to skip that for now and just say that I was surprised that I got married back in 1994.

I consider the first five years of my marriage to have been essentially karmic payback for the shit I did before then.  My late wife had chronic pain and used alcohol to self-medicate.  Unfortunately, the alcohol shut off her filters and, well, I got my comeuppance.  During the first five years of my marriage, my wife accused me of cheating on her nine times...including once with a guy.  Mind you, it's not like where I was at any time was a secret.  My work schedule was on the fridge at home, and since I either walked or used public transportation to each job, every moment of my day could be accounted for.  Didn't matter.  She'd been cheated on before, and so she saw a cheater in everyone. 

Having that feeling of distrust aimed at me was a large part of what led me to change my own behavior for the better.  I basically tried to be the person that I should have been all along.  I helped my friends out whenever I could, whether it was financially or by giving them a place to stay for a few months.  I tried to always help my neighbors, whether it was ingredients, batteries, babysitting, you name it.  I didn't always succeed, and I could tell that sometimes I was being taken advantage of, but helping others made me feel better.  It eventually stopped being a conscious decision and just became second nature.

Being a better person didn't stop the distrust, though.  After fifteen years of marriage, I told her that if she ever accused me of cheating on her again, I'd actually do it.  She then accused me of cheating on her with an employee of mine.  I never did actually cheat on her, but I stopped wearing my wedding ring then.

Now let's fast forward to last November.  My home was a total disaster area before my wife died for a variety of reasons, and while I was trying to get it taken care of, I was too close to the problem to make more than a token dent.

In late November, I met a single mom who needed a charger for her MacBook Pro through NextDoor.  Well, I say "single."  She's still technically married, but is separated and the only reason that she's not divorced is so that her kid can stay insured.  One thing led to another and we became friends.  She needed some extra cash, so we drafted a contract and I paid her part-time hours to help me get my house in order.  While the contract was supposed to end in March, I extended it to April 22 to help her out.  We've still remained friends, though.  She's storing some stuff in my garage temporarily while she moves, and has used me as a sounding board when she needed to.

In late January, I started to dip my toes into the dating scene and after a few dates with a few different ladies, I eventually started dating one lady exclusively.  My biggest concern was that she kept reminding me of parts of my late wife that I hated.  Her biggest problem was that I was telling her that.  She didn't think it was fair for me to constantly compare her to my late wife.  I came around to that point of view and made a conscious effort to stop it.

The lady I was dating didn't like the fact that I had a female housekeeper.  Turns out that her ex-husband cheated on her with the help.  Oh, can see where this is going.

The two finally met last Monday before my trip to Utah.  The meeting lasted less than a minute.  Today, I was accused of cheating as well as other things.

The funny part of all of this is that I can see exactly why she'd think I was cheating on her.  I haven't been, but I can see the dots that she's connecting.  The weird part of all of this is that there are three ways that I could have stopped this from happening, and I don't think I'd do any of them.
  1. I could have stopped my friendship after the contract ended.  I wasn't going to do that.  I don't turn my back on friends.  She helped me get my life back on track, and turning my back on her would be a foolish thing for me to do.
  2. I could have not let her store stuff in my garage.  I could have done this, but it goes back to point #1.  I've got a lot of space that I'm not using...why let it go to waste?  Let her save her money for her new home.
  3. I was told that moving out of this house would effectively stop the accusations.  My lease doesn't expire until November 2017, and while I'm looking at candidate one-bedrooms to move to, I'm not going to start looking in earnest until mid-summer of next year.  I'm not going to break my lease now even though I'm in too large of a place for me.
Regardless, if I have to choose between living a life of suspicion or a life of solitude, I'm going to choose solitude at this point in my life.  This may change in the future, but this is where I'm at now.

May 27, 2016

May 26, 2016

When Are We No Longer Ourselves?

This post is going to be a bit more philosophical and involve quite a bit more navel-gazing than my normal posts, but please bear with me for a bit.

This week, I traveled back to Utah to see my granddaughter graduate from high school.  Years ago, both my late wife and I promised her that we'd be there to see her graduate, and while my deceased wife was understandably not able to fulfill her part of the agreement, I made sure that I was here to help celebrate this important milestone.

On an entirely different thread, I've had a plan for the past decade about how I was going to handle my eventual retirement.  I've got a decent savings goal, and when I hit that goal, I was planning on moving back to Utah, buying a new house, and spending my remaining years making small indie games.

I bring this up because, well, my visit for my granddaughter has thrown a large monkey wrench into my retirement plans.  Essentially, while I had already been questioning my plan to return to Utah because of some absolutely moronic political decisions that the state had been making over the last few years, this visit pretty much helped me decide that unless something drastic happens in my life necessitating my relocation to Utah, I would never move back.

To understand why, we need to briefly walk through two thought exercises.  You have a car that has a lot of reliability problems. You replace a part. Is it still the same car? You replace another, and another, and another.  Is it still the same car?  You replace every single part.  Is it still the same car?

Likewise, every cell in the human body is replaced every seven years (approximately).  Are you the same you that you were a minute ago?  A year ago?  Seven years ago?

I think this trip gave me my answer.  You aren't the same you.  You aren't even the same you that you were when you started reading this.  You have changed...and so have I.

What led me down this road of thought was this trip.  This was my third trip back to Utah over the last decade, but only the first one where I got to spend time exploring.  I'd never felt like I belonged in Utah, but I also had never felt as alien as I had on this trip, so I decided to try to figure it out.

Geographically, a lot has changed.  Eight of the eleven jobs that I had in Utah are no more.  Three of the houses I lived in are gone.  The restaurants that I had both of my first dates in are gone.  Jewelry stores where I bought the engagement and wedding rings are gone.  My peaceful alcove in Adams Canyon is gone.  Favorite stores, restaurants, friends, gone.  These are just surface level changes, but they add up.  Enough has changed over the last decade that while I recognize the basic contours of the state, it's no longer the same state that I left.

It's the same for me personally.  I've changed significantly since I moved to Texas to try to find my fortune.  While there are plenty of physical changes, I'm also quite a bit different mentally and emotionally.

I think the big difference is perception.  You don't notice that you are changing day to day unless something drastic changes.  The people you are with don't notice the changes either.  People you haven't seen in a bit do notice the changes, though.  It's just that the level of change from sighting to sighting has increased.

Utah has changed to the point where it feels alien to me.  The odd part is that I feel like I've changed enough since leaving that the me who was me when I lived here also feels alien to me.

At this point, I'm going to need to start from scratch on determining what to do when I retire.  I've still got time, but I like to be prepared.  After all, who knows who I will be then?

May 24, 2016

In Utah

I'm in Utah through the end of the week.

I may not be very responsive.

May 22, 2016

RomTerraria 4.0 released for Terraria 1.3.1

  • Removed unneeded options.
  • Made the UI look semi-decent on a 4K monitor at 150% UI scaling.
  • Tested with Terraria 1.3.1
Download now.

Oh, and the source is on GitHub.

Terraria 1.3.1

Looks like Terraria 1.3.1 was released while I was out getting a haircut.

I'll look at what it will take to get RomTerraria updated later this afternoon.

May 16, 2016

Terraria 1.3.1 Release Date Plans

Terraria 1.3.1 is expected to be released on Sunday, May 22.

I'm going on a trip on Tuesday, May 24.

If I can get RomTerraria updated for 1.3.1 before I leave, you'll have it.  If I can't, I'll try to work on it evenings during my trip and have it out as quickly as possible.

Sorry about the lack of clarity here.  I have no idea what is changing, so I can't make any guarantees about my ability to quickly update RomTerraria to support it.

That said, I've got a nice 4K monitor hooked up at home now so it will be easy to test...

April 30, 2016

XNA High Resolution Patcher v1.0 Released

Download XNA High Resolution Patcher v1.0

This unlocks the maximum possible resolution of any XNA 4.0 game.

Stardew Valley at 4K

Dust: An Elysian Tale menu at 4K

To patch existing XNA 4.0 games, unzip to someplace on your machine.  Run HighResolutionPatcher.exe.  Drag the executable onto the window.  It will try to do three things:

- Make a backup of the executable.
- Copy RomSteady.HighResolution.dll into the folder.
- Patch the executable in place.

Then have some fun.  If the game properly enumerates available resolutions and doesn't have restrictions, you should be good to go.  "Terraria" doesn't like going over 1920x1080, so I recommend you use "RomTerraria" for that.  "Gnomoria" doesn't like going over 1920 pixels horizontally, but works fine at 1920x1440.

If you want to unlock high resolution mode in an XNA 4.0 game that you are developing, add a reference to RomSteady.HighResolution.dll and call RomSteady.HighResolution.RuntimePatcher.PatchXna() as the first line in your program's Main().

Have fun, and let me know what games you test.  I'll keep updating the list below as I test.

Compatibility List

"Dust: An Elysian Tale" works fine at 3840x2160.
"Stardew Valley" works fine at 3840x2160.
"Dead Pixels" works fine at 3840x2160, but you should patch both "Dead Pixels.exe" and "Dead Pixels Launcher.exe" to be safe.
"FEZ" works fine at 3840x2160, but there doesn't seem to be much point in it.
"Rogue Legacy" capped at 1920x1440.
"Gnomoria" capped at 1920x1440.
"GunCraft" capped at 2560x1440.

Incompatible List

"Bastion" is XNA 3.1, not XNA 4.0. That said, it already runs at 4K.
"Lucidity" is XNA 3.1, not XNA 4.0, and also runs at 4K.
"Sol Survivor" is XNA 3.1.
"The Adventures of Shuggy" is XNA 4.0, but is hardcoded to 1280x720.
"DLC Quest" is XNA 4.0, but has a hard internal cap of 2048x1536.
"Terraria" is XNA 4.0, but has a hard internal cap at 1920x1080.  Use "RomTerraria" for that instead.

Hint About Something Soon To Be Released

"Dust: An Elysian Tale" looks absolutely beautiful in 4K.

"Gnomoria" doesn't like horizontal resolutions larger than 1920, but can go tall.

These were both patched using the exact same executable.

April 14, 2016

Electric Eye v1 Done

I just signed off on the installers for the first partner release of Electric Eye.  EE v1.5.8 for Mac and Windows will be going out shortly to all of our Netflix partner sites.

Now to finish up a couple of straggling code issues on my side, then I get back onto personal projects and preparing the open source release of Electric Eye.

April 10, 2016

Almost Done...

While I was working on adding high resolution support to Gnomoria, I decided that the obfuscated nature of the binary gave me a new opportunity: generalizing the hack.

I'm modifying RomTerraria so that you can add a basic version of the RomTerraria resolution hack to any XNA executable.

Mind you, I'm a bit stuck for time until I get Electric Eye out the door to all of my partners at my day job, but I'm hoping to have it done in the next week or two.  I'm using Dust: An Elysian Tail and Gnomoria as my guinea pigs.

March 25, 2016

Still Alive

Still waiting on Terraria 1.3.1 to update RomTerraria again.

Currently working on adding higher resolution support to Gnomoria.

Got back from my first trip to Taiwan and China last week.

Also dealing with a ton of unnecessary drama precipitated by my decision to start dating again and me quoting Depeche Mode lyrics in a note to my housekeeper because I use song requests for my Amazon Echo as a means of tracking her clocking in and clocking out.

February 27, 2016

Status and Proops

Outside of a couple of bugs and two pieces of content, Electric Eye v1.0 is basically done.

After I got home last night, I decided I needed to get out of the house, so I went to the Improv in San Jose at 10pm to see Greg Proops.  This is one of the few times I've gotten out of the house since moving to the Bay Area, so I wanted to do something silly.

I got table #3 (front and center). He was opened by a funny female comedienne whose name I unfortunately do not remember and Nato Green.

Mr. Proops came out, told a joke, seemed to not be happy with the level of enthusiasm of the crowd, spent the next fifteen minutes preemptively ripping into the crowd, and then went about his routine.  The biggest downside to his routine is that he was a local boy from San Carlos, so a lot of his jokes were based on local stereotypes and I didn't get as many of them as I should have.  That said, I enjoyed the show.

I got home around 12:30am just as my phone died.

I'll be leaving for China in two weeks.  Hopefully, Terraria v1.3.1 will be out when I get back so I am forced to update RomTerraria.

February 13, 2016

What's Going On

Quick status update for everyone.

No, I'm not dead.

I'm finishing up version 1.0 of Electric Eye at work right now.  That should be done on February 26.  The open source release is expected later this year.

I'm not doing any work on RomTerraria until Terraria v1.3.1 gets released.

I'll be spending two weeks in China in March and will be not responding to anything during that window.

I've started dating again.  It's been weird.

January 18, 2016

AccessViolationException when using Font from PrivateFontCollection


You have used a PrivateFontCollection to get access to a Font and are using it when suddenly you get an AccessViolationException while using the font.


The PrivateFontCollection object has gone out of scope and has been disposed.  When the object goes out of scope, it seems to destroy any Font object that came from it.


Move the declaration of the PrivateFontCollection so that it stays in scope until you are done with all fonts that you are using from it.