Pretty Good Solitaire Mini 1.10

The best iPhone Solitaire game on the market just got even better.

Pretty Good Solitaire Mini icon

Pretty Good Solitaire Mini (for iPhone) has been updated to version 1.10, which is now available on the App Store for the unbelievably affordable price of only $1.99 US. This is the best Solitaire software value to be found anywhere!

Pretty Good Solitaire Mini 1.10 now contains 800 games, adding 50 new games (and still has 100 bonus games).

In addition to the new games, the entire program has been reworked to support iOS 15, including dark and light modes, and to (continue to) work on the latest iPhone models; all known bugs (most introduced by iOS updates) have been resolved.

Pretty Good Solitaire Mini launch screen

Development

This is the first update of Pretty Good Solitaire Mini ever, since the first version was released almost three years ago, becoming Goodsol Development‘s first (and, thus far, only) iPhone title. That version has a perfect 5.0 rating on the App Store (out of only 12 reviews 🙁 ), and as I write this, the new version is climbing up the charts (according to Apple).

Best Solitaire Game

I have played the Mac, iPad and now iPhone games and this is the best solitaire game out there.

Labtech89 (app store review)

The only real issue with this game is that it is a rip-off… for the publisher and developer. We work hard to make an excellent game, and there is almost no chance that it will ever recoup the cost and effort put into developing and maintaining it. It costs the customer less than a quarter cent per game, and still not enough people are buying it to justify maintenance.

Nevertheless, we continue to do so. Of course, after this amount of time, it is no surprise that Apple has completely rejiggered the internals of the iOS operating system, including the eliminating of the concept of screen orientation entirely, so there was plenty to update to resolve problems created by their aggressive (and unnecessary) deprecation.

You can read about most of these issues in my post from about a year ago, Pretty Good Solitaire Touch Edition 1.60, where I detailed how I first dealt with these (same) issues. For the iPhone version of the Goodsol Solitaire Engine, when compared to that iPad version of GSE, the engine (i.e., model) code is identical (as it also is on Windows and Mac); that is its whole point. The controller code is very similar, but requires a review of all changes, rather than a wholesale code replacement, but that was much less effort than it could have been.

The view code, however, is very dissimilar. On the iPad version (i.e., Touch Edition), the interface consists of key screens and several popover views. On the iPhone version (internally, Phone Edition), a smaller screen and no popover support requires that the interface is constructed in a different manner, with only two main views, supported by 3 tab bars and 10 various tab views. While the low level code to display images, fill tables, and whatnot, is nearly identical, all of the surrounding view code is incompatible, and it was much of this code that was affected by the deprecation. The best we could do was establish certain templates for the types of changes that had been necessary in PGSTE and use those to both identify places where changes were likely necessary and guide us in making the necessary alterations.

I say “we” and “us” but, of course, I am the only programmer working on either of these products, which fact, frankly, probably makes it a little easier to coordinate, though all of the programming work (and a lot of testing) falls to me.

There were a couple of minor positives to this development process. First, the bugs I accidentally introduced in PGSTE 1.60 had been fixed in PGSTE 1.61, so they never entered the code base for this update in the first place. Second, the fact that the iPhone version necessarily has no popover support means that we completely avoided the double deprecation problem that we experienced with the iPad version development.

The most amusing item was that just prior to development on this update commencing (and after its originally planned start date), hence about 2.5 years after the last release, Apkmonk Blog did a very nice review of Pretty Good Solitaire Mini. Right up front, the very first screenshot is (embarrassingly) a background missing the intended game preview. The writer actually (unknowingly) makes lemonade out of this bug: “Don’t worry about the plain look of the app when you first open it“. They go on to give a very nice review (with the odd factual mistake here or there) and rate the game 5 stars (out of 5).

Now what really happened is that the game worked perfectly when released, showing a game preview image on that first (“plain”) page, or a splash image if no game is currently selected. Then, as so often happens, Apple makes unnecessary changes to iOS and breaks things. In this case, it changed the process for initializing a view and its subviews in a way that broke the code we were using to show these preview images (and a few minor images elsewhere).

Specifically, what happened was that Apple made changes to the layer objects of general views after the viewDidLoad method was called. Our previews were not image views (deliberately), and in that method we initialized the contents of the layer object associated with the subview, resulting, as expected, in the preview images displaying properly. When a later version of iOS changed the way that (and when) Apple did this initialization, the preview images stopped displaying. In the end, we had to convert to image views and implement our other behavior on those. It looks like Apple introduced a bug into their system, and though they could argue (illegitimately) that we were not using a sanctioned method, the fact remains that they should not have been messing with view initialization in this way in the first place!

January release: check. 🙂

2022: Year in Preview

Happy New Year!

I am generally satisfied that 2021 was decent, and somewhat better than 2020, for SophSoft, Incorporated and Digital Gamecraft®, but I am expecting us to perform significantly better this year, particularly in expanding our offerings and improving our finances. However, the development schedule will not be quite as aggressive as last year, which should allow for greater and deeper focus, and generally be slightly more realistic; it will still be challenging, though.

Digital Gamecraft logo

Product Development Goals

This year, I decided to break the goals into appropriate sections, so I start here with the priorities for (only) our internal development projects:

  1. Unannounced productivity tool – this product has been under development for, literally, 32 years, though obviously not continuously. We are fairly close to an early release version, at which point we will (probably) announce the product and unveil the web site for a soft launch. This is the highest priority because it helps manage the development and prioritization of all the other projects. While I see almost unlimited potential of this project, it is the means to an end, and should the internal ends be satisfied by an unpolished alpha version, the effort to polish the product for public consumption could be de-prioritized. (We have to get there first.)
  2. SophPlay System™ – this product combines libraries, tools, standards, and procedures into a complete development system for creating robust games on multiple platforms, and it has been in use here for more than 25 years. Although a public release has always been envisioned for the future, the development work this year is particularly in support of (all) internal game products, which is why it is given this high priority.
  3. Unannounced Gamecraft Classics™ product – this traditional game title has been under planning and development, intermittently, for decades. It was buoyed (back) up the list of priorities in the middle of last year when we were reassessing our product lineup. It was promoted due to the vast amount of research and code that was already complete and available, combined with its ready support of simultaneous improvements to SophPlay.
  4. Unannounced console title – this is a game title that (perhaps unusually) focuses on accessibility and inclusion. It started as the highest priority last year, but it became clear that 3 months of development was too optimistic an estimate, and combined with the economic realities of the situation, it had to be slightly de-prioritized this year, but by no means am I any less excited by the prospects, and the above two projects will help pave the way. (We need to hear back from Sony and Microsoft whether we can reveal which consoles are supported. 😉 )
  5. Unannounced reference website – this is yet another project that has been in the conceptual and prototype design and development phases for ages. It is given this high a priority now as it also gives me a great deal of excitement and purpose, and because it helps support one of the projects above, but it is given a lower priority than that project because we currently have no viable business model for it, and while we are more than willing to make it free in theory, that concept makes it much harder to justify devoting development effort (given the other projects).
  6. Demolish! Pairs – this product has been available in its initial form since 2013 (on iOS, 2018 on Android). We have early plans to refresh the Android version, and later plans to both redesign the mobile versions and expand to other platforms (such as Windows, where there has been a working prototype since 1999). Currently, this title doesn’t quite earn enough to justify the time it takes to bring up the sales reports; its primary benefits are the development and exercising of SophPlay and the demonstration of our capabilities on various platforms.

Although the above projects are given numbered priorities, which are generally correct, the fact is that there is some interplay among them, so we will not (and cannot) be just focusing on a single project until it is finished and then moving onto the next. For that reason, this year I will not be assigning or predicting target release dates; everything will just be “as soon as reasonably possible”, with the above priorities in mind.

Of course, we have a backlog of dozens of products in various stages of design and prototyping, and we know exactly what the next few games will be, but even touching #7 before 2023 is something of a pipe dream.

Client Development Goals

To be completely honest, I really like my two primary clients and the projects I get to work on for them, but I see the inherent limitations in trading my time (and skills) for money. I really should be charging them between more and very much more than I currently am, but that doesn’t really resolve the bigger issue. If I could quadruple what I charge and work more hours, I could go from struggling to comfortable, maybe even well off, but that does not scratch the itch. This is the reason that I have not really been actively seeking any more long-term clients, and also why I have (deliberately) not been filling all my development time with client work.

Instead, I have been relishing the actual work and the challenges it provides, as well as the experience and knowledge I gain (and, sure, the funding). At the same time, I want to make sure that, for each client, neither of us is overly reliant on the other, especially given how close we came to this being an issue last year. (Plan for the proverbial ‘hit by a bus’ scenario.)

For one client, I am working on a feature for an established (non-game) product that has involved a lot of research to this point. This has given me the opportunity to program in Pascal for the first time since the 1980s (and Object Pascal for the first time ever) and to improve my knowledge of JSON, while I exercise my intellect and my technical design, programming, and debugging abilities. In (the early part of) the new year, I expect to have the fundamentals of the feature ready to be integrated into the main product, and I hope it can be in a new release of that product (of which my feature is but a small part) ready before the end of the year. Also, I expect that I will be able to announce the name of the client and product.

For the other client, Goodsol Development, with whom I have been working for more than 20 years (!), the products are much closer to those that Digital Gamecraft develops. (In fact, our PC solitaire game prototypes date to 1989, predating Goodsol by 6 years, but they were put on hold permanently in 2001 when Goodsol became a client.) These titles provide the challenge and fulfillment that I would be seeking even were they not a client, while general knowledge cross-pollinates with our internal products; some features have been implemented more quickly (on both sides) because I already did the research and had the requisite knowledge, so products from both companies benefit.

Last year, we had an aggressive release schedule planned, but that was necessarily interrupted in April and, in truth, was a bit optimistic anyway. However, that means that the early part of the year is fairly well-defined as the carryover from last year’s schedule. You can expect to see releases for Pretty Good Solitaire Mini (not a stretch, given it was essentially already done in December), Pretty Good MahJongg (Windows and Mac), Most Popular Solitaire (Windows, Mac, and iPad), Action Solitaire (Windows only), and FreeCell Plus (Windows, Mac, and iPad). After that (or sooner), it would be a good bet that we would add new games to Goodsol Solitaire Engine and then have subsequent releases of Pretty Good Solitaire Mac Edition and Pretty Good Solitaire Touch Edition.

General Development Goals

There are always general development projects ongoing to support commercial releases, or just business operations. These can be tools or, probably more often, non-programming tasks such as documentation, research, and marketing. SophPlay used to be the perennial top entry on this list, but it has now been (appropriately) elevated to ‘product’ status. Here are the (5) main general development tasks to be completed this year:

  1. Pitch deck and company bible – these documents give information about the structure and purpose of the company and its various divisions. We have always bootstrapped the company, and we have never received third-party loans nor investment, but writing these documents gives a bigger picture view of the company and is very helpful. It is like writing a business plan without having to include nonsense numbers and projections to impress investors.
  2. 3D graphics research – this research is essential to our products going forward. It is no secret that most of our games to this point have been 2D or isometric, but that is definitely not the case going forward, especially with our expansion into consoles. We have been very rapidly expanding our knowledge and capabilities, but there is still much to be learned about the differences among the 4 or 5 different systems on the platforms we currently support. Additionally, I am personally learning to create 3D artwork, a skill I have never had before.
  3. Xbox project approval – this is required to release and market our upcoming console game(s) on the Xbox One. This development task consists of adjusting our design documentation to fit their desired format, plus the development of some mockups and other explanatory imagery. This is not (necessarily) a difficult task, just one that has not gotten completed yet.
  4. Blog writing – this is simply a greater commitment to openness and transparency via blog posts in 2022. The only blog post I wrote in 2019 was announcing the death of my wife, Sherry, who was also my only surviving business partner, and it has been difficult to get back into the swing of posting regularly since then. However, the facts that I enjoy writing, and that I do not enjoy the idea of providing free content on social media, combined with a huge upcoming anniversary, give me the impetus to really try this year.
  5. Nintendo Switch developer reapplication – this is needed to complete our portfolio of major console support. Nintendo was the first application we completed, and it was also the first that was rejected, although no reason (nor obvious means of appeal) was given, so I have no idea why we were turned down. Sony took seemingly forever to approve us, and it required a change in our registered business address; Microsoft took almost no time with only one casual clarification (via email with a real human being). With our newfound experience, it is only fair to give Nintendo another chance to get in on this opportunity. 😉

Business Goals

At this point, staying healthy, safe, and productive is a given, and continuing to make payroll should be considered a necessity though, to be fair, I personally have enough runway via available credit that I could continue to pursue these goals until 2023 even if company funding disappeared tomorrow. Given that, these are the 3 main business priorities:

  1. Substantially increase business income – clearly, the primary way to do this is to release new products, so that is the main focus. Half of the products listed as development goals should increase income, and each of those has the potential to be huge.
  2. Resolve outstanding business paperwork – Sherry was the officer in charge of keeping up the necessary business paperwork, and since she died, it has become my responsibility. While I think I have all the legal requirements fulfilled, I need to organize everything and make sure.
  3. Complete home/office renovations – while this is not actually a business function (and is not funded by the company), it will provide benefits such as additional safe and secure storage for equipment and documents, as well as a larger space for testing console and AR/VR products (not to mention a nicer place for breaks when nature calls).

We definitely take over the world in 2023. 🙂

Conclusion

We have a lot of development work to do to release more of our own products, plenty of development to perform for our clients, loads of support projects to complete, and a few major business goals, so we are going to be very busy… a good thing.

There are other activities that I will, personally, be participating in less this year, including social media, television, and newsgroups. I will, however, continue (or even increase) those activities that bring me joy, including spending time with my grandchild and the rest of my family, finding solitude in nature, playing games, and exercising (as well as programming and writing).

It may look overwhelming, but the counterpoint is that this company turns 40 this month! We have been doing this for a very long time, and we are still here, so we have the experience and (global crisis or not) 2022 is going to be a breakout year for us.

Let’s Go!

2021: Year in Review

Overall Performance Grade: B

Digital Gamecraft logo

This past year has been fairly decent for Digital Gamecraft® and SophSoft, Incorporated, all things considered. Despite the continuing pandemic, we made more progress, albeit not quite as much as planned/hoped, resulting in a grade slightly higher than last year, yet still well below our potential (and intention).

Accomplishments of 2021

Here is a countdown of the top 10 achievements of this past year:

  1. We shipped Pretty Good Solitaire Touch Edition 1.61 in January. We seemingly started off quickly, although version 1.60 was actually shipped in the dying hours of 2020, only becoming available publicly this year, and then requiring a quick maintenance update. (The details of my bugs are listed in the ‘My Mistake’ section of the previous post.)
  2. We shipped updates to Goodsol Solitaire 101 version 2.40 (for Windows), Goodsol Solitaire 101 Mac Edition 3.20, and Goodsol Solitaire 101 Touch Edition 1.60 in August. These were maintenance updates to use the latest engine and bug fixes, but included no new games or features, hence the combination of all three platforms being relatively low on the list.
  3. We made significant improvements to our development tools and internal development processes. This includes upgrading Windows development to Visual Studio 2022, adding a new Mac system, prioritizing 64-bit development (with 32-bit support) on Windows (to match the other platforms), incorporating extra code analysis, and further improving code standards, as well as enhancements to our SophPlay System™ for robust game development.
  4. We added 50 more Solitaire games, along with supporting engine changes, to the Goodsol Solitaire Engine, for a total of 800 games plus 100 bonus games in our library (closing in on the 1050 in the flagship product) and ran another short and successful beta test.
  5. We achieved major progress on a project for another client, working in Delphi (and beta testing Delphi 11 in the process). This is only listed in the lower half because a) the final goal, while close, has not been realized yet, and b) I still haven’t asked for clearance to reveal the product, so I have nothing to highlight or link. 😉
  6. We shipped Pretty Good Solitaire Touch Edition 1.70 in October, with those 800 Solitaire games for iPad, plus the 100 more bonus games. This update is listed below the Mac Edition only because it was easier; we already took the the deprecation pain for the last release.
  7. We shipped Pretty Good Solitaire Mac Edition 3.60 in October, with 800 different Solitaire games for macOS, plus another 100 more bonus games. More importantly, perhaps, this upgrade included Apple M1 support, MacBook touchbar support, loads of internal enhancements, and fixes to every reported bug.
  8. We shipped Demolish! Pairs 1.30 (iOS) and Demolish! Pairs FTP 1.21 (iPad) in November. Demolish! Pairs is the full version, and Demolish! Pairs FTP is the free-to-play version that supports in-app purchases. These upgrades were made under duress, specifically a threat from Apple to remove them from the App Store because they had not been updated in too long (and no other reason); they worked fine with no issues even on the latest version of iOS. Nevertheless, we reworked both SKUs, adding “support” for new devices and iOS 15 (not that a user would notice), resolving deprecations, and updating the source code to our latest standards. (This month, we got more than $6 from this effort — so worth it. 😐 )
  9. As of May 25, 2021, we have a registered trademark for Digital Gamecraft, so now we are Digital Gamecraft® (as astute readers may have noticed in the first paragraph). This is an exciting culmination to years of effort (and not insignificant expense). We popularized the term “Gamecraft” in the video game industry more than 20 years ago, but (for reasons of frugality, i.e., a lack of funds) we stuck with the old unregistered ™ symbol. Recently, however, there has been more and more encroachment into our (intellectual property) territory, including at least one attempt to deliberately trade on our good will, so action was necessary. We eschew legal conflicts, but when cease and desist letters are necessary, they will happen.
  10. We survived and even thrived in another difficult year. There were major challenges this year, plus some life-affirming events (see below), and while we did not accomplish everything we had planned, we definitely made progress on all fronts. It actually really helps to do these yearly reviews to get a better perspective. (After some initial doubt, not only did we get enough accomplished to have a top 10 countdown, but we even had to combine some products to keep it down to only 10.)

Bigger Issues

Although games are extremely important to me, personally, it is important to keep in mind the bigger issues that transcend (yet underpin) all of our usual day-to-day activities. I was not being flippant when I said we “survived” this year, as these three larger issues attest:

  • Birth: In March, my first (and likely only) grandchild was born. They are healthy and doing quite well (at 9 months of age now), and they have definitely shifted my life priorities. Their birth (within a few years of the death of my wife) certainly helped put things into perspective.
  • Death: In April, my friend and primary client almost died, and by that I mean that he came so close that it took extraordinary medical procedures (an open-heart surgery very few doctors could perform) to even give him a fighting chance. I was already contemplating my own mortality, and then suddenly I am communicating (and then unable to) with somebody who was literally facing death. The excellent news is that he did survive and is doing well now.
  • Illness: Of course, it comes as no news to anyone that the global Covid-19 pandemic lasted throughout the duration of the year, and continues. At least the vaccine arrived this year, and I got mine as soon as it was readily available (not being in any risk category, I waited until those who were had been served), and I got the booster as soon as I was eligible. All of my family and inner circle of friends have done the same (as any non-idiot has) and, so far, none have been infected. I still mask whenever indoors, other than at my own home/office where I live/work alone, the sole exception being while I am swimming (for obvious reasons).

Clearly, these bigger issues are ever-present, but I consider myself fortunate that all of the above have happy endings as of the end of 2021.

What Went Right

These things went right this year (referencing 2021: Year in Preview):

  • We shipped 12 SKUs, including 10 release titles and 2 current beta versions, along with 6 other betas. Although we did not actually ship a product/update every month, it was still quite good.
  • We met 2 out of 3 business goals. Specifically, we made it safely to this point, always making payroll along the way, and grew our income (albeit just slightly).
  • I personally took a chance and made an investment in myself and my family, my grandchild in particular, betting on (and facilitating) future success of the company.

What Went Wrong

These things went wrong this year (to be corrected in 2022):

  • We did not ship the console game we had intended to ship before the end of the year. The amount of supporting work (beyond basic product development) was greater than anticipated, and several external issues provided unneeded distraction.
  • We left 13 SKUs (including the above title) on the table, including a refresh of the Android version of Demolish! Pairs, two other unannounced internal products, Pretty Good MahJongg, Most Popular Solitaire, Action Solitaire, and FreeCell Plus. (To be fair, some were not done due to issues beyond our immediate control.)
  • We failed in one business goal, doing no outreach to other developers during the year. This simply fell off the radar in terms of priorities. (We may push this to 2023.)

Conclusion

I have colleagues who have day jobs and shipped just a single title, or were unable to ship anything, during 2021, and some other “indie” game developers have many times the personnel and focus on a single title for years (a luxury of funding we do not have). Given this, I think that a dozen SKUs cannot be a disappointment, even if it was only roughly half of what we attempted. Scaling back expectations is certainly a consideration.

At the moment, I am feeling fairly optimistic, but that is probably less due to the new year, nor even to the boost of looking back at our accomplishments, and more due to the fact that we are a couple weeks into our traditional year end break and, hence, I am “out of the trenches”. I am refreshed and ready to dive back in.

Pretty Good Solitaire Touch Edition 1.60

We have updated the BEST iPad Solitaire game on the market.

Pretty Good Solitaire for iPad

Pretty Good Solitaire for iPad has been updated to version 1.60, which is now available on the App Store for the extraordinarily reasonable price of only $9.99 US.

Pretty Good Solitaire Touch Edition 1.60 now contains 750 games, adding 50 new games, as well as 10 new bonus games (for a total of 100 bonus games).

In addition to the new games, the entire program has been reworked to support the latest iPad models and iOS versions, including dark and light modes, and all known bugs (most introduced by iOS updates) have been resolved.

Development

This is the first update of Pretty Good Solitaire Touch Edition in almost four years. To be honest, the game does not sell nearly well enough to justify spending a lot of time updating, although it is clearly the best Solitaire game available for the iPad. It has had 700 games for all that time, which meant that it was probably the best Solitaire value available.

Historically, Apple released iOS 10 during the development process for the previous version, and it did not make sense at the time to rework the entire engine to adjust to the latest SDK, so we released the product as originally intended. However, in the years since that version, four more major versions of iOS were released, each adding (few) new features but deprecating loads of methods, so without any intervening updates, the performance of the product deteriorated slightly, including (quickly) problems with the pile popovers, some issues with orientation changes, and (most recently) some game preview images not drawing.

Among the victims of Apple’s ruthless deprecation were nicely sized launch images (forced to use less capable launch storyboards instead), previous popover behavior and its subsequent replacement (yes, double deprecation, proving the level of aggression), UIAlertView and UIActionSheet classes (both in favor of UIAlertController), the CFGregorianDate class (too convenient, I guess), bordered toolbar buttons (UIBarButtonItemStyleBordered), methods of launching and dismissing modal views, and the entire concept of orientation changes (an inherent aspect of tablet and phone usage).

The image bug was the result of a poorly redesigned image view class, for which I found a workaround, and there are also a large number of spurious log errors generated by internal Apple processes that cannot be easily fixed or suppressed (with precision) by developers. The page curl transition was apparently completely broken as of iOS 13 (and/or the iOS 14 SDK), but that was just a cutesy feature I had already decided to change anyway. The redesign of the controls, compounded with the addition of light and dark modes (to be fair, a decent iOS feature), made several of our views difficult to use under certain circumstances. All of this created a great deal more work than was originally envisioned for this update.

The product has 4 popover views, and associated control classes, which all needed to be completely reworked, as well as 2 more views that used controls affected by the recent redesign or dark/light mode setting. Alert views were used in a variety of places, as were action sheets, plus there were several other locations where code had to be reworked due to deprecation; changes due to the loss of a Gregorian calendar class (to a generic calendar that requires an extra layer or two of indirection) were particularly pervasive, as it was used in several places in the code.

Oh, yeah, lest we forget… the latest version of the iOS Simulator has a particularly egregious bug in which it will not play audio in any version prior to iOS 14.0 and instead (the worst part) introduces a timeout delay of approximately 15 seconds for every attempt to do so. I had to disable the audio when running in the Simulator on unsupported versions just to continue. With all of the new models of iPad (with different resolutions and aspect ratios) and 5 more versions of iOS to test (well, really just 4, because the Simulator no longer supports iOS 10), just finding a representative subset of devices and iOS versions was a chore.

Nevertheless, I managed to get all of this done, and compared with that work, adding the new games and updated engine code was a (relative) breeze. The only concern at all going forward is the reported deprecation of the UIWebView class, which we use for game rules and credits, but because there is no replacement for all of the iOS versions we support, and using two different view classes is untenable for this case, not to mention that there are no deprecation warnings during compilation, we chose to leave that (working) code alone. All known bugs were fixed, the interface and animations were improved, and everything seemed to be working perfectly.

My Mistake

The update has now been live for a little more than a week, and despite how solid the product felt (and still feels) to me, there were a number of bugs reported quickly. When distilled, it actually appears to be just 2 minor bugs.

The first bug appears to be a problem with random number seeding for the ‘Random’ deal button, where the same deal numbers now come up in the same order. While the exact cause has not yet been determined, the precipitating cause was almost certainly the calendar deprecation. Time seconds were used to seed the random number generator, and because that would now take extra code, I replaced the seed with the system time reference, which (in theory) changes at the same rate, resulting in less code. Apparently, somehow it must have resulted in non-working code, although the cause was not obvious from inspecting the method.

The second bug was my bigger mistake, and requires some history.

The previous version had a legitimate bug in the game results code. Results are stored in a database with a validation code (based partially on date and time) to insure integrity. When the original iOS port of the engine was written, this code was inadvertently using local time, rather than a fixed time based on UTC or something similar. The effect was that results earned in one time zone may not appear valid in another.

The solution going forward, of course, was to fix that bug by getting the UTC time instead of local (and, coincidentally, that code all had to be rewritten anyway because of the calendar deprecation). However, that change alone would invalidate all previous results, which is not desirable at all. Since all previous results would have a valid code in (some) local time, I decided to simply replace the old codes with the newer ones. Because it would be tedious, slow, and potentially inaccurate to check all time zones, I decided to only replace codes that validate in the current time zone, figuring that those few users (including myself, actually) who had invalid codes because, for instance, they played the game in both California and Michigan 😉, could just manually set the other time zone(s) temporarily (or visit the other time zone organically) and let those results correct themselves.

So the implemented logic was that any result failing a current validation check was then checked against the old method using local time, and if that validated, the code would be updated. Note also that I limited this correction behavior to results purported to be in 2020 or earlier, when I still expected the update to be released last year. (Do you see the logical flaw in my thinking here?) In theory, this should be fairly straightforward, but testing it was challenging, because once fixed, the results stayed fixed.

In the simulator, I tested a small sample of results, and everything worked flawlessly. Then, I went to a physical device where I had built up a collection of around 50 results in one game just testing this development version (prior to the validation code fix) and it worked perfectly and transparently. I had legitimate results, then after the UTC fix, they all appeared invalid, then after adding the correction code, they were just back to normal.

Then we released the update. I had a bit of trepidation, because I had my 5000 games of Lower 48 that had loads of invalid results peppered throughout. (That was my “go to” game for waiting… doctor visits, airports and airplanes, a brief unhappy stay in hospital, etc.) I should point out that because I do the development work as SophSoft, Incorporated, but deliver the source code to Goodsol Development, who actually publish the game, the products are considered different (with incompatible signatures), so I cannot test my live data from App Store downloads on development versions.

I downloaded my update from the App Store even before the publisher told me it had been submitted and anxiously brought up Lower 48, which showed 5000 games played but only four thousand and some won (when I have, in fact, won every single deal). I opened up the game action popover with the results list and… Well, it worked, eventually bringing my results to the correct 100% win rate, but not perfectly, for I had not really considered the effect of that many writes to the database; it took a period of several seconds, several unresponsive seconds, before the fixes were done.

This seemed minor, at first. However, we have some devoted fans, and the first report of problems came from somebody who has played a favorite game more than 110,000 times! My several seconds, when I knew what was happening, multiplied by more than a score for somebody who was just trying to play a game, looks a heck of a lot like a lockup. Fortunately, it only has to happen once (per game) and that user is now back to happily playing Russian Solitaire. I have to hope that somebody who has played one particular game that many times does not have too many games with that much activity.

For fun, I just calculated that playing every game in Pretty Good Solitaire for iPad that many times, assuming you could average one minute per game, would take more than 175 years playing around the clock. Of course, with a more realistic average of 10 minutes per game, my 5000 games of Lower 48 would be the equivalent of more than 20 weeks of full-time work!

Anyway, with a couple of simple miscalculations, I managed to make life a little more interesting for the customer support people. Sorry about that. 😔

January release: check.

happiness
productivity

2021: Year in Preview

Happy New Year!

Although 2020 was fairly average for SophSoft, Incorporated and Digital Gamecraft™, I am not terribly satisfied with that outcome, given the huge number of internal (and external) projects we have and all of the unrealized potential. Therefore, with more than a little optimism, I have set a very aggressive development schedule for the coming year.

Digital Gamecraft logo

Development Goals

Our primary goal for 2021 is shipping our first, internally designed and developed, console title. This project is well underway, but still has a lot more to be done. We are hoping to be completed with the development within about 3 (more) months, but how long the approval and publishing process takes is beyond our control (or experience).

Depending on the success of that title, we may (or may not) adjust the rest of the schedule to take advantage of other related opportunities (in particular, adding another console platform or two to our repertoire). However, at the moment, the development schedule calls for brand new game releases in July and November, as well as the initial version of a productivity tool and the first look at another project, a reference site, as well as maintenance updates for Demolish! Pairs, during the year.

Combined with work for our current clients, we expect (amazingly) to have new products or product updates releasing every month in 2021.

For much of 2020, I have been working with a client who publishes a major utility to add a significant feature that will make an already indispensable tool (that I used and advocated prior to this gig) even more useful for programmers like myself. Although I have absolutely no control over feature integration or release scheduling, I am hopeful that the result of this work will become publicly available this year. (At some point, I will have to get permission to reveal the product name and promote it, instead of just teasing.)

Our work with Goodsol Development continues, too, and although I cannot give the planned schedule, you should expect to see many more games added to Pretty Good Solitaire Mac Edition, Pretty Good Solitaire for iPad, and Pretty Good Solitaire Mini for iPhone, probably some new layouts for Pretty Good MahJongg, and perhaps even some updates for Goodsol Solitaire 101, Most Popular Solitaire, FreeCell Plus, and Action Solitaire. Of course, these games are pretty great already, and Goodsol has not charged for updates for any of the above titles, so I recommend buying them all now. 😉

Business Goals

For the moment, the company has almost everything it needs to accomplish the above goals, although it will take a huge effort on my part. The one thing we still need is serious funding, such that we can afford more help, but for the moment we are still bootstrapping.

From the business standpoint, our basic goals are:

  1. Stay healthy, safe, and productive.
  2. Continue to reliably make payroll while growing income.
  3. Connect with a great artist (or two) for our games, and maybe a marketing expert.

Note that we are not looking to take over the world until 2022 at the earliest.

Evaluation

This post lays out the goals for the year, obviously, so we can look forward, but part of the purpose of the post is also so we can look back on them at the end of the year and assess how the year has gone relative to what we hoped and expected. (More often than not, something external, like a new client, an emergency project, or an unexpected international hit game [knocking wood], causes priorities to shift.)

This is, truly, an incredibly aggressive development schedule, and if we can even get close, without disappointing ourselves or any of our clients, then that will be worth an A+.

If we can complete at least three of the (five) planned major releases this year, that will still be a great performance, but bittersweet for not getting everything done. Anything less would be disappointing, although just making it to our 40th anniversary early next year would be an accomplishment itself.

Of course, we give client projects priority over our internal projects, which is why (in the past) we have not made the desired progress with Digital Gamecraft products, but I believe (without going into detail here) that we have the organizational processes and development foundations in place to accomplish all of the above (without “crunch”).

Now, there is nothing left to do but DO.

2020: Year in Review

Overall Performance Grade: B-

Digital Gamecraft logo

This past year has, surprisingly, been rather average for Digital Gamecraft™ and SophSoft, Incorporated. I probably would have rated it a C, but the fact that we did not merely tread water but actually made progress during a global pandemic gave it a small boost.

Accomplishments of 2020

Counting down the top 10 achievements of this year:

  1. We joined Apple’s App Store Small Business Program. This is at the bottom of the list because, frankly, we want to be ineligible by virtue of making more than $1 million per year, but since we have miles (and just about a million dollars) to go to reach that plateau, we will accept a larger percentage of the sales.
  2. We finally tracked down the cause (spoiler: bug in Apple graphics code) of a really annoying, and expensive, bug that affected our custom libraries, and we worked around that issue. In case you are wondering how a bug can be expensive: We had to buy a specific used piece of Apple hardware in order to even reproduce the bug, but now we have an Apple iMac for QA.
  3. We joined another Apple developer program, which includes a “loan” of the latest Apple hardware, so all new macOS (and iOS) development will be ready for the newest systems.
  4. We got our new Windows development system fully installed and configured, so all of the programming for Windows, Android, and consoles will be done faster and better in 2021.
  5. We shipped Pretty Good Solitaire Mac Edition 3.56 in June, with 750 different Solitaire games for macOS, plus another 100 more bonus games (not to mention the bug fix from #9).
  6. We added another new development platform, Delphi, for an important client, so I personally picked up Pascal after, literally, three decades away (and, of course, learned Object Pascal for the first time, and continue learning.)
  7. We shipped Pretty Good Solitaire Touch Edition 1.60 (just a few minutes ago, actually), with those 750 Solitaire games for iPad, resolving issues with 4 years of Apple’s aggressive deprecation over as many major iOS releases, and fixing every reported problem on all iPad models running iOS 9.0 or higher. (Expect the update in the App Store in early January.)
  8. We were approved for major console development with a proposal accepted (n.b., not funded), on both the (then) current generation and the (now) latest generation, and we have our DevKit and TestKit in house and operational, with development actively underway. The original proposed release date was (naively) this year, but the approval process took more than 5 months to complete (from proposal to actually having SDK access and hardware).
  9. We shipped Pretty Good MahJongg Mac Edition 2.72 in October, with 55 original Solitaire games played with MahJongg tiles, as well as 355 tile matching layouts. This was a major rewrite of the successful product, switching from Carbon to Cocoa and revisiting every piece of code in the project, resulting in an excellent game.
  10. We survived a difficult year and are still here, with optimism for the future. As noted before, this pandemic has a smaller impact on this company than most, but fortunately, despite necessary changes, our clients have not pulled back. Instead, we leave 2020 with two more development platforms and five more development systems than when we entered.

Personal Perspective

I am pleased, or perhaps just relieved, that I have not gotten sick from, nor even knowingly exposed to, Covid-19, and I remain in good health. All of my family (of whom I have knowledge) and most of my friends have also remained safe (and the few friends who did contract Covid-19 seem to have recovered fully). I would call this “fortunate”, but it is actually more down to safe living practices, including limiting time in places where you might be exposed to an idiot who refuses to wear a mask. (To be clear, that means everyone who refuses to wear a mask in public.) It will probably be another half a year before I will be eligible for the vaccine, so we must remain vigilant and proactive.

My only real indulgence in this difficult year was to pick up two more pinball machines (to join the one I have had for about 20 years). I discovered that somebody (relatively) local had a 1974 Gottlieb Big Shot for sale, and since this was the 2-player version of my favorite machine ever, I bought it for myself; this one is a bit of a project machine, and I am working with my sons on restoring it completely. Immediately after getting it, I found (nearby) a 1972 Gottlieb King Rock, the 4-player version of the machine that made me fall in love with pinball and was the seed of my actual career, so I (perhaps foolishly) extended myself to get that, too; this one, however, was ready to play, so it gets regular use, as well as minor repairs and cleaning.

The addition of the new games, and the chance to spend time with my children working on them, inspired me to refurbish the 1973 Williams Fun-Fest I already had, but which had fallen into disuse a bit; it now has been nearly completely revamped and thoroughly cleaned, with new bumper caps (needed since I bought it) and fresh rubbers, and gets played almost daily. I still need to “debug” one feature, resolder a few questionable joints, and replace some cracked bumper skirts, but it is nice to have this machine working well again (and playing faster than ever).

During this brief frenzy, I also chose to upgrade my tools, especially my soldering station and my multi-meter, and to stock some specialty cleaning and polishing supplies, so now I can be a proper pinball hobbyist, rather than somebody who just owns a machine. Beyond that, while I had the rented truck from one of the pinball purchases, I retrieved my (original) upright Galaga machine from storage, prepared to diagnose and fix or replace the broken monitor (control board); I still need to get this completed (remember, I am a “software guy”, so hardware repairs, especially board-level work to supply power to a CRT, are a stretch for me).

Ultimately, this year has brought me some moments of joy, and in particular [buried lead] the news that I will become a grandfather in the coming year. With the family growth, political changes, and new business opportunities, there is good cause for optimism and hope for 2021.

The Beauty of Code

Programming itself provides opportunities for self-expression.

In the midst of chaos and strife, when I need to take a break from the “real world”, I most often find my escape in source code, programming anything really. Of course, having more projects than I could hope to finish, and clients providing additional work to boot, means that I always have a ready avenue for directing my focus. However, it is not solely about the product, nor the money; it is also about the pleasure and enjoyment of coding itself.

There are a number of fairly passive experiences that I (and I imagine most of us) use to pass the time: playing games, reading books, watching television or movies. There are also more productive activities such as exercise (I quite enjoy hiking, bicycling, and swimming), house cleaning and organization, home improvement, and “gardening” (of a sort). None of these activities, however, provides the same creative outlet as programming.

When it comes to creative expression, appropriately, there are lots of different ways that people find to fulfill that need, which is important to our being. I know lots of people who like to sketch or doodle, or to write (for which I have gained some appreciation over the years), and others participate in higher commitment activities such as making stuffed animals, woodworking, or designing jewelry. When I was younger, I turned to more “design” oriented expression, such as creating original mazes, designing pinball machines, and architecting dream houses; at one time I designed a complete go-kart business, including the tracks and buildings.

The beauty of code is that it allows for self-expression within a systematic framework. I have always enjoyed numbers, logic, and the rational, and these all factor into programming. Within the rules, though, there are essentially infinite ways to express an idea, both in terms of method and of presentation. Of course, there are demonstrably “wrong” ways to do things, such as code that does not compile, fails to work, or crashes, but there are many levels of “right” ways to accomplish things, including how to efficiently increase functionality, how to handle errors and unexpected situations, and (importantly) how to make the source code understandable.

When I was required to attend an “advanced” BASIC course in high school, having already programmed for years (but with no formal education to show it took vociferous insistence just to avoid the “beginner” class), one of the first problems we were presented was to take a three-digit number as input and reverse the digits. I was the very first person to complete the task, twice. My second version was the anticipated method of accepting numerical input, with constraints placed on the operator (not the program) to limit the input to 3 digits, separating the number into ones, tens, and hundreds places, and printing them in reverse order, just to prove that I knew how to do it that way. My first version accepted the input as a string and printed the characters in reverse order, which worked on the specified input type, but also on numbers of arbitrary size, or any characters that could be input.

Around that time, I also set myself a challenge to create an “unbreakable” game, which I was able to accomplish with a high degree of confidence. To be unbreakable, the program had to be bulletproof, once executed, such that nobody could deliberately nor accidentally get to the prompt (and, hence, have access to the source code). This meant that the program needed to have no syntax errors (BASIC was interpreted code, rather than compiled, so such errors would only be found when executed), no logic or constraint errors that would allow a crash (such as selecting an unexpected/illogical action or overloading an input buffer), and also disallow breaking (via ^C), which was accomplished via system-specific methods. The only ways to end the program were turning off the power or hitting the reset button.

Programming has a lot in common with the scientific method. Although you use known logic to devise provably correct solutions, rather than testing hypotheses, you still test to confirm your approach and resolve errors, whether they be in your understanding of the problem, your design of a potential solution, or your execution of the plan. In fact, I constantly use this approach when building a program to regularly test my assumptions. I will make an interim change and state (to myself) the expected failure outcome, whether that be a compiler error (or specific number of compilation errors) or some weird behavior, just to confirm my understanding. If some code compiles unexpectedly, or the behavior is not as anticipated, I revisit the problem and make sure than I can explain why things went differently.

This shows yet another beautiful aspect of programming: its digital nature makes it precise and enables, at least ostensibly, the pursuit of perfection. You can experiment with something new with confidence that, if it does not work out, you can return to exactly the original situation. It does not matter how far out in the weeds I get with an idea; I can always get back to where I started. (Try that with oil painting.😉) Also, as my first computer book helpfully pointed out at the start of my career, nothing that you do with source code, short of typing it with a hammer, can break your computer (and while that is not strictly true, exceptions are exceptionally rare and not worth concern).

The fact that I value the actual source code as well as the outcome, which tends to be better for such appreciation, explains why I am not a fan of “visual programming”. With traditional source code, everything is enumerated and readily viewable, having been written by you or another programmer. While visual programming is ostensibly the same, it hides aspects of the code and logic behind objects, making development more like hide-and-seek. My first experiences were in the very early ’90s with Asymetrix ToolBook and Borland ObjectVision, where one would have to check every page and object to find all of the scripts to have a complete understanding of the logic, which unnecessarily fragmented the code. Today, such tools as Unity, Unreal Engine, and Interface Builder certainly make visual layout easier, but with the inherent risk that the complexity hides some of the logic, removing it from the source code and fragmenting it. It can be quicker to develop visually (especially if one is inclined toward fast results over quality), but it is inarguably harder to debug.

Outstanding programming is more craft than art, by which I mean that it can be learned and refined over the course of years, and one does not necessarily require an inherent creative ability. I can explain the rationale behind decisions in my source code, and I can teach you techniques, and if you have the requisite logical intelligence (which many people do not), then you can become at least a very good programmer. (I doubt one can read a book about fine art and learn what it takes to be a master.) One of the best compliments I can get is when I am told that I taught somebody the value of maintainable source code, or defensive programming, or quality assurance techniques.

With that in mind, I intend to document more of my approaches to development in general, to provide insights that interested parties can take or leave, along the lines of my Quality [index] series from many years ago. One current focus is refining my programming standards, so look for that in the near future.

Why I Do It

The origins of my passion for computer programming and games

I have always loved games, as far back as I can remember. Even as a small child, I enjoyed all kinds of games, and I remember making up games and contests of my own. However, most analog games have at least a couple of drawbacks surrounding one concept: competition.

First, one had to find other people to play the game. I spent a lot of time alone in my childhood, so the opportunities to compete against others was limited. Even when players were available, the choices were limited by the number of people. Some games do not work with too few players, and if you have too many, somebody can get left out.

Second, when there are enough people to play a game, there are a lot of issues with inequity. Sometimes the skill difference at a game (or in general) is just too great for enjoyment, and the degree to which one enjoys any particular game is usually imbalanced. My sister was often around for games for two players, but she was three and a half years younger, so there were few interesting games where we were matched well.

At the time, I had not developed enough life skills to solve these problems through negotiation and sheer enjoyment of playing the game. I took games far too seriously, and probably was something of a poor sport. Nowadays, we have (well, had) Game Nights, which we have been doing for a couple of decades, and I am now far more concerned that everybody is having a good time than whether or not I win (or even play), in marked contrast to my youth.

One solution is provided by one-player games, and I have had a love for Solitaire since I first learned Klondike around the age of five (as fully documented when I wrote “I come by my love of Solitaire honestly“). Likewise, I have loved Pinball for about as long, as my uncle owned Campus Pinball in Ann Arbor (and that experience factors heavily in my life story), but Pinball was not readily available to me on a regular basis in my early childhood due to both location and funding.

Instead, I made up games and similar activities that I could play on my own. I created solitaire games (like the one player version of Go Fish! mentioned in the linked Solitaire post), held competitive events with my toys, like marble races or a challenge to see which Matchbox/Hot Wheels/cheap knockoff car would go the farthest (for which I invented different match systems, including the double-elimination bracket system), or made up strict sets of rules (i.e., algorithms) for automatic players in multiplayer games, like Monopoly, and then played against them. I had no reference to know that this was a rudimentary form of programming, but it is obvious looking back.

More to the point, I used to fantasize about having a “robot” (because in those days, there were no personal computers, simple calculators cost hundreds of dollars, and the only real computer I had ever seen was an enormous mainframe at MSU with multiple huge tape drives 😉) who would serve as my opponent(s) in these games, effectively making them one-player games.

About that time, Pong was released, and as fun as that was, it was still a two-player game (although on many occasions I played both sides, where the inequality of the experience between my dominant hand and the other was striking), so it was actually Breakout, released 4 years later, that became the first video game I really loved. (It was decades later before I learned that Steve Wozniak programmed that game just before founding Apple with Steve Jobs, who was also on that project.) Of course, from that point on, the video games came faster and faster. (Plus, Pinball Pete’s opened nearby, and I made slightly more than nothing with a paper route, giving me better access.)

I was also introduced to Dungeons and Dragons, which is ostensibly a social role playing game, but for the first several years of my fascination, I never actually played it as designed, but rather read through the books of rules and played scenarios (alone) as Dungeon Master, as well as controlling the players, and/or a group of monsters, given algorithmic motivations, which (unbeknownst to me) was building toward computer adventure/role-playing games.

All of this led up to My First Programming Experience. I was hooked; for years I had dreamed to be able to do exactly what I have been able to do since then. Also, the technology rapidly exceeded what I could ever imagine (as detailed in Still Coding After All These Years). Occasionally, I have to take a deep breath and reflect on this fact.

This job is truly, and literally, a dream come true.

SARS-CoV-2 / COVID-19 Update

No Problems…  So Far

Fortunately, there have been no business changes due to the current worldwide pandemic, not because SophSoft, Incorporated and Digital Gamecraft are essential producers, but primarily because the company has always been set up to work in this fashion.  I only work from home, and when there were more of us, everybody worked from home (or, at least, remotely).  Our active projects for outside clients always have been delivered digitally, so nothing changes there either.

In truth, in the midst of all sorts of upheaval, my personal situation is actually quite stable, for several reasons:

  1. As noted above, I work from a home office, so (in theory) development work and company business do not change at all.  The only two analog functions that were regularly performed out of the office were banking and picking up the mail.
  2. My world was turned upside down and my life completely torn apart a little over a year ago.  Compared to suddenly losing my wife, this current situation is a mere aggravation, but very minor when put into perspective.
  3. Due to the above, I had already been adjusting to life (and work) alone here, so the solitude and loneliness were already something I was managing.  Of course, I do have two cats (plus a new stray on the porch), so that helps.
  4. Perhaps to the surprise of some, I am very much an introvert and, for the most part, prefer to be at home.  My default stance is to not leave or go anywhere, so I no longer need to make an effort to be social (for a while).
  5. I am quite healthy, and still relatively young, so I am not in a high risk group for hospitalization from COVID-19; nevertheless, I am taking as many precautions as practical.  Also, I got my “affairs in order” a while back, so I am not scared of being unprepared should I suddenly get sick or even die.

At this time, I have no known exposure and no symptoms; in fact, my body temperature has been running low ever since I started daily checks a couple of weeks ago.  I went to the grocery store today for the first time in more than a week (and only the third time since the pandemic was declared) and should be stocked for two more weeks.  Aside from that, I get fresh air and go walking outside, completely alone (and irregularly, it must be said) and otherwise have not gone anywhere (nor had take-out or delivered food) at all in the two weeks since Governor Gretchen Whitmer signed her “Stay Home, Stay Safe” executive order for the State of Michigan.

What annoys me right now (beyond those ignoring the recommendations and endangering us all, which registers fury with me) is the number of people who seem to be complaining about getting to stay home.  Because I was already close to self-quarantine before we had even heard of this coronavirus, I did not gain any significant quantity of extra time, and I never have enough time to do the things (at home) that I want to accomplish.  Now, some people have gained lots of excess time and talk about being bored.  Bored?  What is that?  Seriously…  I do not think that I have been bored at home in 30 years!

That said, productivity during this crisis has not been what I would have liked, although it has been getting better, with progress being made on all fronts.  I think that I may be dwelling too much on pandemic concerns, and that could be taking away some of my focus, all of which prompted me to write down my thoughts here.

It is my full and honest intention to make this the last COVID-19 related post for a while, and instead get back to product development and posting about other topics, all while maintaining the maximum practical physical separation from other people.

Digital Gamecraft 2020

It has been just more than a year since SophSoft, Incorporated lost its second founding partner (of three) and I lost my wife of 31 years.  In a week, the company will be celebrating its 38th anniversary, and it will continue to develop game software.

During 2019, I took time to reflect on what was really important and what I wanted to do with the rest of my life, and I decided that the plans that Sherry, Rick, and I had devised (and undertaken) as business partners were honest and true representations of what we wanted to achieve.  Therefore, I will continue those pursuits, not just out of a sense of loyalty, but because they are why we got into this venture in the first place.

Digital Gamecraft will continue to develop and publish game titles in a variety of genres, and this will be our primary focus.  While some of these games may be a little different to what they would have been with my partners to help guide the development, the games will nevertheless embody the spirits of Sherry and Rick to the best of my capabilities.

SophSoft will also continue to do consulting work; however, due to sheer limitations of time, our regular client roster is effectively full.  Please feel free to contact us if you are in desperate straits or need our help with a fully-funded project that is right down our alley, but realize that we may not be able to fit you into the schedule.  (If you have just an idea, a shoestring budget, or a need for fleet management software, go somewhere else.)

We also have a couple of adjunct projects that I expect to see the full light of day within 2020; announcements will be made here as and when appropriate.

In an industry where companies come and go with a disturbing regularity, remember that we have had the same address for 30 years:

Post Office Box 4936
East Lansing, MI  48826-4936

We have had the same business phone number for 25 years:

(517) 337-3905

Our web site has also been in steady operation since 1995 (though this blog is just a baby at a mere 15 years old).  Plus, having been originally founded in 1982…

We are the oldest independent video game company in the world.

I truly appreciate your support as we continue to move forward.

Sincerely,
Gregg Seelhoff