Category: Not Roguelike


Back in the US

I’m back after taking the family to Cabo San Lucas for a week.  7 days of 88 degrees and sunny – after that, Seattle’s weather is all the more painful ;-) .

The place that we were staying at was very nice, but a bit on the gouging side – $25 (American) for a bottle of suntan lotion!  Even more egregious – $10 an hour for wifi, which is why I haven’t been posting here ;-) .

Made random bits and pieces of progress in various venues:

  • New Server (was: GoDaddy GoAway!)
    • In my desire to eschew myself of everything-GoDaddy, I purchased a dedicated server (no more virtual for me!) with softlayer.com.  So far I’m very happy with both the service and the machine (soooooo fast).
    • I completed moving all of my services and files over to it last night, and flipped the domain over to point at it yesterday.  Hopefully that’ll help a bit with mahjong stability.  7yrl’s file archive is there, so let me know if I missed anything…
    • I just checked off “auto-renew’ on the server with GoDaddy, so one step closer to being completely done with them!  Now I’ve just got a few domains that I need to transfer away from them to a different registrar (I’ll eat the cost just to get away from GoDaddy), and then I’ll be done with them for good.
  • Mahjong
    • The game continues to do well, it’s now the #20 game in the marketplace (both free and paid), which is great!
    • It sounds like there’s still some bug in there that I just plain can’t track down; repro cases are few and far between.  To counter this, I went through a whole bunch of the code and try/catch’ed it at very fine granularity – I report the exception up to my server (along with a code to determine which line it borked on).  While that won’t catch everything, it should help point in the direction of the most egregious issues
    • Speaking of egregious: I just fired an email to microsoft’s pubcenter support alias because two unexpected things happened last Thursday: (1) the number of reported ad impressions in mahjong jumped 10x in a 2 hour period (but based on the number of submitted scores, I’m not suddenly getting 10x users), and (2) the eCPM dropped by 100x!  So Mahjong is now pulling in 1/10th what it used to ><.  Given that my other apps (and other developers) aren’t seeing the same drop, I’m hoping that it’s a temporal thing.  Otherwise I’m going to have to rethink the server and even whether or not my next game uses the Microsoft Ad control. Ouch :( .
  • 3D Blocks
    • My definition of vacation is “switching between lazing about in the sun and taking a break from being in the sun by being inside programming some fun project.”  Over the last week, the fun project was a 3d version of the classic “Rush Hour” game.  Huge amount of progress on it, but a loooong way to go.  Here’s a few teaser shots (note that the name is a placeholder):

Unfortunately, tomorrow I go back to the real world.  I’ve got over 600 emails awaiting my return (and that’s after auto-filtering out the detritus!).  I’m learning that 6 business days is not quite enough ;-) .

Jeff

GoDaddy utterly fails again; absolutely no response.  Great to see how quickly they respond to situations where they SHUT DOWN YOUR DB.

On the plus side, the problem is fixed, and this was a good forcing function to get me to go through the set of steps I wasn’t looking forward to:

  1. Install SQL on my server
  2. Install SMSS on my server
  3. Backup the DB from godaddy (thank god they didn’t block that capability)
  4. Install Java on my server (God) because that’s required to get a db backup from GoDaddy ><.
  5. Copy the DB down to my server
  6. Uninstall Java.  Try not to think about the tendrils of garbage it left behind ><.
  7. Restore the DB from within SQL
  8. Create the user/pw within SQL
  9. exec sp_users_change_login ‘Auto_Fix’ the user (hello, esoteric.  thank god I knew about this)
  10. Update the connection strings in the web services (for all 4 games)
  11. Fight with the inevitable security issues.  This was the most painful, but relatively less painful than I’d anticipated.
  12. Spin up the game in the emulator and try to get high scores; work through the random errors
  13. Finally see it work (thank god).

So, one less point of failure moving forward.  If something goes down with the DB, I’ll be able to track exactly what it is and not be dependent on those morons.  This’ll also open up better options for tracking down errors and perf stuff, so I’m happy about that.  On another plus side, I wrote the game to work with intermittent connectivity, so no one lost any badges; however, the stats may appear screwy (more people having badge X+1 than badge X)… Given how the game’s written, it’s possible that the majority of people didn’t even realize it was down.

My email to GoDaddy’s incident response team after they did nothing:

You guys are just a bag of awesomeness.  Thanks for doing absolutely nothing about this.

I have given up waiting for you to do anything and have migrated my database off of your shared hosting plan. 

Utterly unimpressed.  Do not respond to this, I don’t care what you have to say and will delete it unread.

Oh how I wanted to say other things, but I still have my dedicated server with them, and at this point I don’t trust them to not go and purposefully screw with that if I bad-mouth them too much.  Asshats.  At some point I’ll move off of them entirely, but I’m not looking forward to spinning up a whole new server (take the numbered list above and 3x it).

Ugh, I hate being annoyed/angry Jeff; but this really wasn’t how I was hoping to start my vacation.  Tomorrow I’ll be on a plane for 4 hours and then step off into 80 degree Cabo – so, happy Jeff will return tomorrow! :-)

Jeff

Well, you get what you pay for, I guess.  I just checked my gmail for the first time in a couple of days, and found that they had shut down access to the score server db because it had exceeded some utilization limits.

a) There was no warning given, it was just shut off.

b) they don’t tell you what limit was exceeded (size? cpu?)

c) GoDaddy has no tools with which to view utilization, so you have no way of knowing if you are nearing a limit

d) they don’t tell you what the limit is anyways.

e) They shut down admin access to your db when this happens, so you can’t fix the problem yourself (by reducing table sizes)

f) When you call their support line, they don’t have the fucking ability to reinstate your admin access (hey, what are the odds that someone in this situation would want that?)

g) So you have to email them asking to be able to get into your db, which means you sit and wait AGAIN.

So the high score server hasn’t been storing high scores for a day, I’m stuck waiting (at 9:30 at night) to see if those asshats are going to respond, and I have no way of knowing if the changes I’m going to make are going to keep this from happening again (since they provide neither metrics nor the tools with which to track against them).  I’ve actually got a dedicated server with them already and had planned on migrating the db from a shared hosting plan over to that, but hadn’t done so yet because I didn’t want the score server to be down for a couple of hours.  And now it’s been down for a day.  Awesome.


Up to the #37 app (from #42), which is great news!

Unfortunately I missed a bug in the previous update – it was fixed within hours and is already posted in the new version on the marketplace, but I got a fair number of negative comments before MS posted it (sigh). I can understand why (it was a pretty stupid bug to miss), but it does leave me a bit gun-shy to do more releases. If it ain’t broke and all that… I’ve got 20 more tables all ready to go, but don’t want to risk another bad impression :P .  Think I’ll let it settle for a while; more time to focus on other projects :)

Anyways – hooray for breaking the top 40! :-)

Haven’t had much time to work on the Dungeon yesterday or today; ton of work piled up right before vacation.  Bit of a separate distraction with a possible 3rd project as well… Playing around with that a bit tonight – good way to kick off vacation :-) .

Jef

Not stalls, just pauses :-) . Still at #42 of all apps, but it has climbed to #23 of all free games!

Discovered a bug yesterday in one of the layouts ><. Submitted an update, impatiently waiting again.

On the positive side, I’ve spent time working on additional tables and have a cache of 20 that I can publish when folks get to the end of the current set. Over next week’s vacation I’m going to put some time into improving the end-game; right now when you complete the last table you’re done, and your only option is to restart or wait for more tables. Bleah. I don’t want to stall out people that want to keep playing, so I’m tending towards a “meta-badge” model where you get some badge for each time that you complete the last table. I think that’ll provide incentive (read: won’t feel like wasting time), but it pushes me even more to want a “badge champions” high score table. I’ve actually got 99% of that code written, it’s mostly just design considerations…

Jeff

Up from #43 to #42.  But I’ll gladly take it, as that one game bumped was Fruit Ninja, an awesome game (and one which my kids would much rather play than my own games ;-) )


Thankfully they’re not ranking based on revenue or quality or any of the other attributes with which these games trounce mine ;-) .

Next to fall: Spell It!

Cheers,
Jeff

3D Mahjong Solitaire continues climbing the charts, although it looks like it’s slowing down; it’s up from the #45 app to #43.  Still waiting impatiently for the difficulty curve fix to get posted; hopefully that’ll help boost it up the charts a bit farther…

Full House Poker and Deer Hunter 3D down, Fruit Ninja and Harbor Master to go (gulp!)

On the plus side, it’ up to #29 of all games (paid and free), which means that it appears above the fold on my 24″ monitor ;-) .  Now I need to get there on “all apps”!

Cheers,

Jeff

Mahjong continues climbing…

Up from #60 on Friday to #45 of all apps today!  #31 of all games. Crazy… o_O!

Yep, it’s more popular than not only chicks, but vixens too.  Even when combined ;-) !

The next five look a bit more daunting though:

Very…patiently… waiting.. to be able to…. submit… difficulty curve… update… >< [groan].  Luckily the folks leaving comments are being patient/kind/forgiving (thanks!)

Jeff

Hi all,

As penance for the poor difficulty curve of the last update to my Mahjong Solitaire game, I’m soliciting feedback as to what feature I should include next.  I’ve got an upcoming vacation (read: coding time :) ), so this is a good time to split between Mahjong and Dungeon coding…

Here’s the ideas I had in my v.next queue: Do any of these in particular appeal to you?  Feel free to suggest something else as well!

  • Difficulty modes: Beginner/intermediate/expert.
  • Badge score (like Xbox LIVE Achivements).
  • Champion mode high score tables.  See who’s got the most badges and where you stand in that list.
  • Layouts with more than 144 tiles.
  • More layouts (and badges)
  • Improved hints (e.g. if you have a tile selected and click ‘hint’, then first look for matches to that tile) Too late, already done! :) . This’ll be in the next update…
  • More game modes (e.g. time trial, “powerup tiles”, etc)
  • Additional/better/more legible tilesets
  • More community interaction features (e.g. single line that announces whenever a player gets a new badge
  • Social networking features (e.g. automatically post to twitter/facebook when you get a badge)
  • Tell user how many valid moves there currently are
  • Shuffle the board
  • 2D mode
  • Any other suggestions?

That list isn’t in priority order, although if I don’t get any requests here, then I’ll probably look into the first three first.

Farther out in the future, I’ll look into more complicated things such as:

  • user-generated-layouts and tilesets
  • tint unplayable tiles
  • better graphics (e.g. render shadow over the tiles)
  • infinite Undo

Those are harder than you’d think to add, so they’re a little ways farther out ;-) .

Feel free to send other feedback to jeff@wanderlinggames.com.

Cheers,

Jeff

Winnable Mahjong layouts…

Wow, people really like Badges!  My mahjong game (3D Mahjong Solitaire) has been out there for a month or so with just a “free play” mode, and had received a bunch of very positive reviews.  Last week I added “Champion Mahjong” mode, in which you complete tables to acquire Badges (similar to Xbox LIVE achievements).  Unfortunately, the tables as they were defined were way too difficult – e.g. requiring 100 tries to pass in some instances.  The net result is that everyone got stuck on the few tables, and the negative reviews began pouring in (each one = pain).

I put a bunch of effort into generating “guaranteed winnable” layouts – and pretty much failed the first time.  The problem was that I wasn’t testing the results, and doing to much assuming.  So, I got creamed in the reviews again last night/today (ouch again :P ).  The other challenge is that building guaranteed winnable mahjong tables is actually a pretty tricky problem; everything I could find on the internet talked about “just play the game backwards” – which it turns out is a load of tripe.  More on that in a moment…

So, I took a step back and created a “headless” version of the Mahjong code which could automatically play all of the tables a bunch of times, and allow me to do some statistical analysis on the win/loss ratios of them all.  Here’s what I saw with the currently posted “guaranteed winnable” logic after playing through every table 100 times each:

Putting that into English:  many of the tables were completely unwinnable!  OhmigodDOH moment for sure.  And this is after I posted a comment and an update saying that the problem had been fixed.  No wonder people were flaming the game in the comments; I was half-tempted to do so myself! ><…

So, back to the “guaranteed winnable” algorithm:  after playing and playing and playing around with the “play it backwards” approach, I increased the overall win/lose ratio by a whopping 3%.  Yeah, that would stop peoples’ frustration :P .   The problem is that the “guarantee winnability by playing the game backgrounds” approach doesn’t guarantee winnability.  Simplest example is if you had a layout with 4 horizontally arranged tiles, you could start by placing a pair of matching tiles in the 1st and 3rd positions; and you’d be left with the 2nd and 4th positions for other pair of tiles – resulting in an unwinnable board.

I fought with this left and right before taking a step back and realizing that there was a much better approach: play the game “forward” (like a human would), picking any two “free” tiles and ignoring their tiletype; then just remove those tiles from the board, set those tiles to matching types, and continue on your merry way until the table is empty.  At that point, you just put all of the tiles back on the table with their new matching styles.

When trying the “play it backwards” approach, the “GetAvailableTile” function grew to 100 lines of gobbledegook. But with a “play it forward” model, it’s dead-simple:

        static Tile GetAvailableTile(Tile dontmatch)
        {
            int offset = RandomMgr.Next(RemainingTiles.Count);
            for (int i = 0; i < RemainingTiles.Count; i++)
            {
                Tile tileToRemove = RemainingTiles[(offset + i) % RemainingTiles.Count];
                Debug.Assert(!tileToRemove.Removed);
                if (dontmatch == tileToRemove)
                    continue;

                if (tileToRemove.IsFree)
                    return tileToRemove;

            }
            return null;
        }

So now when I run the analysis tool, I get an average win/loss ratio of 45% which is MUCH better:

Wonderful!  Now a “dumb” computer can solve almost all of the puzzles in just a few tries…

Next up, intuitively you’d want the tables to get progressively harder.  Now that I’ve got the analysis tool, I can just sort by the Win/Loss ratio in Excel:

And now I know what order to place the tables in so that it gets harder as you go.  Furthermore; when I add a new table, I can simply run the tool against it and tweak the table so that its difficulty is at an appropriate level.

Finally, you’ll notice that the last few levels are still too difficult; indeed, Table 21 was impossible for the “dumb” computer to solve!  So now I have the knowledge and tools with which to go back into the layout editor, tweak those layouts until they’re closer to a ~.15 win/loss ratio (what I’d consider appropriate for the hardest levels), and then the whole string of tables should be doable, the earlier badges will be easier and the later badges should be harder to get (as they should be), and everyone goes back to spending time enjoying the game instead of posting frustrated comments :-) .

So: morale of the story: Don’t assume; statistical analysis rocks.  When 7YRL gets to the “level balancing” stage, I’ll be doing a heck of a lot more of this at that point!

(Oh, and finally: you might ask why I’m spending all this time writing this post when I haven’t actually submitted the update yet.  It’s because MS’s submission process – which in almost all ways rocks – sucks when you’ve got an update in the queue that you want to override.  I need to wait for that update to go through, and then can submit this fix.  So, more waiting – and more frustrated players in the meantime… ><…)

UPDATE (4/17 @ 12:49PM PST)

I’ve just completed the work described above.  This required reordering the tables and making some tweaks to the tables with too-low win/loss ratios.  After all of that was done, here’s what the new stats look like:

Things to note:

  • All Win/loss ratios are at .15 or above.  My assumption is that a good human player can probably double win the rate of a “dumb” computer, so the harder levels will take them about 3 tries to pass.  That’s about right, and leaves me some leeway to add harder levels without getting too hard.
  • The table difficulties smoothly decrease, meaning that the earlier levels are easier and the harder levels are harder (as you’d expect).
  • There’s three exceptions to the smoothly-decreasing: Tables 8-10 get really easy.  Although I could have left them up at the front, I opted to move them  in a little ways because the table layouts are pretty sparse and not a good introduction to the gameplay.  Over time I can look at increasing the difficulty of those levels so that they fit in better difficulty-wise.  But the user won’t really be able to tell either way…

So, now the waiting begins for MS to publish the update that they’re currently testing, and then I can submit :P

To those of you coming here from my comment in the Wp7 Marketplace review for my game – thanks for your patience, and please up-rate your rating once the new checkin goes in! ;)

Cheers,

Jeff

Follow

Get every new post delivered to your Inbox.