Saturday, January 24, 2015

Knock knock, who blogs there ?

wow... almost one year since the last blog post.

It's so much easier to tweet out, especially if that's connected to Facebook.
I don't really have a moral stance on social networks' evolution. I wasn't a fan of FB, but I can see why it's popular, and it has its uses.

In any case... I've been working on improving existing mobile games, mostly on the side of the engine development, which theoretically it means general improvements for future games as well.

Speaking of the future, this year I'm going back to GDC. I'm not rich, but I'm also not broke like I was 1 or 2 years ago, when the instant noodle was really hitting the fan.

The long standing idea for a robot combat kind of game is becoming more of a reality now, and hopefully it'll gather some intere$t.

One thing is sure, during these months, I've evolved as a programmer, and people around me have improved as well.. whatever happens, the important thing is to always improve. Especially improve in areas that you'll need for the future. ..always be ready for when the"big day" may come.

Life, for the most part, is a big training camp. Whether you realize it or not, you're constantly sharping your tools towards a short window of time, where you'll have to make the best of what you've learned.
Once that window is gone, you're back to training, until the next opportunity.

This came to my mind by hearing about how spec-ops work and live. Whatever your field, success requires a lot of training, alternated with some short bursts of action.
Times may be different.. but the concept remains: work hard, but also train hard.

Many people ask me why I, supposedly, waste my time on developing low level stuff, rather than using a prepared and popular engine. One reason is that I need the training. Buy yourself a fish, and you're happy for a day, teach yourself how to fish, and you're set for life.

So, all the "reinventing the wheel" is actually a learning process. And that never stops. Not simply for things that one has never done before, but also for things that one has done 2-3-N times, and that he or she still feel like it can be done better, and that he action of redoing it itself may bring to a new understanding.

I'm not making games, I'm making myself (eh eh !).. games are a byproduct !

Sunday, March 23, 2014

Megaupdate (GDC 2014, etc.)

Here's a new update on recent events... (poor old blog !)

Yesterday I came back from the GDC.
It was my first time in 4 years (or so) and my first time as an independent.
I went with an Expo Pass, the cheapest one, with no access to lectures.. but that's ok, because my job now is to run a developer studio and develop whole games, not simply to focus on R&D like I used to do as an employee (and mostly enjoyed doing !).

This time I went mostly for meetings. Both formal and informal... speaking of which, with the years, more and more Italian developers have surfaced. Both independent or working in North America.
Although I'm not a big patriot, I often find myself hanging around Italian gamedev forums, and so it was only natural to finally put faces on so many "paesans" 8)

Before GDC, I've been busy with the release of Fractal Combat X for Android.
For the first time we teamed with a publisher and that was generally a good thing.
Because the publisher wasn't comfortable with putting an option to remove ads, we also released a premium edition of FCX.. which turned out to be useful also to simplify publishing on other markets that otherwise required to implement custom in-app purchase APIs.
Check out both the Free and Premium edition on Google Play.

With FCX on Android I feel like we're on a positive path.. asserting Oyatsukai Games as a dev studio that does deliver in terms of graphics, with arcade games that are more console-like and less mobile/touch-screen kind of games.
I'm glad that I resisted the suggestions to move to casual mobile titles.. because I would have been one of many developers out there.. which is not good for morale and statistically bad for business, not to mention that it wouldn't have been fun for me, since game development is also an excuse to learn things related to technology math and physics, the stuff that isn't necessary for most mobile games.

We're now in a place in which mobile ecosystem is expanding into more or less classical console form-factor.
There are rumors of Apple, Google and Amazon all potentially releasing boxes able to run games... all of which mostly require that a game can be fully controlled by an external controller, with no reliance on touch and accelerometer inputs... and we're definitely ready for that !

One thing that is slowly happening is that FCX is becoming a recognizable eye-candy kind of title.
It doesn't have complex cinematics, in fact it doesn't have any cinematics at all. Content itself is limited, but what's there is definitely appealing. Hopefully enough to bring more and more cross promotion from graphics hardware makers (btw FCX is also on TegraZone).

Last, and not necessarily least, FCX is apparently also a fun game.. not an easy thing to do with flight combat games, where it's usually a chore to simply fly, and where other planes tend to be small spots on screen.
After several iterations, and practically no planning, the game managed to turn out as something that becomes fairly exciting to play.. although there isn't too much depth, but that was never the goal of the game 8)

Saturday, October 12, 2013

Progress and std::function<>

Here's another update, against all odds (that are against blogging).

Can a coder sleep at night and wake up in the morning ?
I think so ! I recently set myself to do that, and on top of it, I'm also running about 2 km each morning. Not much, but infinitely more than nothing 8)

For the past 3 years, since I started my independent development activity, I've been postponing physical activity. I relegated that to something that I'd do eventually, once I'd reach some sort of economic stability. But that clearly takes more time than one would hope, so something had to give.

On the development side, there are really no new games, but that's pretty much how it's supposed to be, given the situation with mobile. Meaning that while released games haven't be making me and my partners rich, they are still an important source of income.
It's important to keep the old games up to date and try to make any possible gains off things such as free-with-ads editions, adding new features to keep new users coming or for cross promotions with other companies (e.g. add support for a certain gamepad).
It's also a good way to push forward the development of the common libraries, and to generally learn by refactoring. In short, updating current games, makes it simpler to eventually work on new ones, when the day will come..

Another thing to consider is that the games that we make tend to stand out. So, in the mobile market they are sort of timeless, although economically they are mediocre, but there is some degree of stability and when it comes to income, any sort of stability is a win.

Talking about development, I finally started diving into C++11. Some of the features are really useful, they definitely help writing better code.
The most important feature to me in C++11 is the lambdas, or generally the concept of anonymous functions and the ability to wrap a whole context in std::function<> (see this article for an introduction).
Lambdas are a great way to improve loops without performance penalty. Capturing code with std::function<> and using it a different context instead does add some extra work (and possibly heap allocation), but it's extremely valuable to handle all that kind of code that needs to be deferred.
Basically, C++ finally has callbacks !
It was possible to do callbacks in C++ before, but it was painful, it required extra code, type casting and so it just wasn't practical enough.
With callbacks now, component-based objects are easier to make.. gone is that OOP madness that wanted to push polymorphism at every cost. Polymorphism is often confusing and it's not very flexible either.

Callbacks do have their drawbacks (ah !) however.
For example this code (only illustrative, not tested):

std::function<void()> makeFunPrint( int a )
    // BAD ! Should use [=] or [a]
    return [&](){print( "%i\n", a ); };

void main()
    auto funPrint2 = makeFunPrint( 2 );

..will compile fine, but it probably won't print "2". Because "a" is captured by reference, and basically when the function is called, it will look for that place in memory, which is somewhere on the stack where "a" used to be.. ouch !

So, it's definitely important to be careful with that syntax of closures. But to me that's not the trickiest part. What's more tricky is the general concept of callbacks, which can very easily break the synchronization of logic in the code.
It's not nearly as bad as multithreading, but the concept is similar and there are dangers that can be overlooked.

One simple example is that of a gamepad handler: when callbacks are reacting to gamepad buttons' changes, a game may find itself with different states for the same buttons within the same frame of animation, depending on how things are structured and when events are triggered.
It's something that can be prevented, but situations like these can be overlooked, and they can definitely bite back.
So, callbacks are great, but it's also important to be aware of the fact that they can easily break determinism.. and that's a huge price to pay.

What I ended up doing for the controller and touch input messages, is to cache them in a list of events, and flush that list only at the beginning of each animation frame of the main loop, effectively deferring all user input at a fixed location in the code and in the main flow.

All in all, C++11 lambdas are a great addition. They can improve quality of code in loops without performance penalty and, when captured with std::function<>, can greatly improve the experience of writing higher level code... but there are pitfalls, and it's better to be prepared.


Tuesday, August 6, 2013

Picking a banner for interstitial ads

I understand so little about marketing. It's clearly not my job, I have no experience and I definitely don't have enough time to put into it. Nevertheless, being an independent developer/publisher, I have to try.

I was looking today at some recent results of a cross promotion via Chartboost, and I thought I may share the experience.
The cross promotion consists in promoting Fractal Combat for Android in other games of ours, namely the free editions of Final Freeway (two variations) and Final Freeway 2R.

The results may be obvious to some, but here they are.
Considering the three alternative banners (or "creatives"):
Creative "A" (CTR: 22.32% IR: 0.68%)
Creative "B" (CTR: 24.77% IR: 1.57%)
Creative "C" (CTR: 21.95% IR: 0.55%)

We have the following data (higher is better):
  • A) CTR: 22.32% IR: 0.68%
  • B) CTR: 24.77% IR: 1.57%
  • C) CTR: 21.95% IR: 0.55%
CTR is slightly better for  "B",
the in-game screenshot.
(chart shows relative percentages)
CTR is the Click-Through Rate. Meaning the percentage of clicks received per impression (= ad view).
One creative gets almost to 25% CTR, meaning that the banner is clicked once every four impressions. Actually pretty good ! I think.
Interstitial ads lead to a much better CTR, because they practically take over the screen.
Here there isn't much of a difference between the three creatives. The screenshot-based creative ("B") does only slightly better.

IR is much better for "B",
the in-game screenshot.
(chart shows relative percentages)
IR is the Install Ratio. Meaning the percentage of installs / impressions, basically how many installs are obtained every 100 impressions.
Here "B" gets the lion share.
(Notice that Chartboost gives IR as percentage of installs / clicks. Both are useful things to look for, but in this case I just want to see the direct relation between impressions and installs).

So, the creative "B" clearly wins. One could argue that the illustration-based banner could be progressively improved. For example we already know that "A" performs better than "C", even though they are almost the same.
Still, "B" becomes the easy choice. The game already has good visuals, and an untouched screenshot seems to work well.
If anything, the screenshot where a flight combat scene is depicted leads to more likely users. In fact, while the CTR is only marginally better for "B", the actual IR is much better.
This means that although the screenshot-based banner is not terribly more attractive than the illustrations, the user that gets on the app store page via the screenshot is 2-3 times more likely to convert to an actual install.

The good news here is that if we keep on doing games with attractive in-game graphics, we won't have to put too much effort into making illustrations for marketing material.

Saturday, June 29, 2013

Dragging along

Really, must, update, blog now !

First and foremost, Fractal Combat for Android has been out for a while. First on Google Play and from today on Amazon Appstore.
It's freaking free ! (to play). So, no reason not to download it.

On Google Play it had a good run up until almost 100K downloads, but now it has slowed down... and it's out of all charts, at least out of the top 400 anywhere.

This memorable scene from "Breaking Bad"
pretty much sums up my last three years
trying to make a living off mobile games.
The short report is that with every new release things just seem to be (are) worse.. while of course the games' quality is higher.

I suppose that going with a publisher or anyone that has money to support a marketing campaign on release, and has the public relation ties to get Apple and Google to give a facking rat ass about your game, is a must now more than ever.

Granted, there's great room for improvement in our games, but man, don't I feel shortchanged every time I see some cheap ass game being trumpeted by Apple or Google, while my games have to struggle on their own to gain any traction at all.

It's not all Apple's and Google's faults.. money talks in many ways. Theoretically, if I had millions of dollars, I could afford to buy all the downloads it takes to be #1 game on any rank on any store and probably be set with that, though actually recouping the investment would be a different thing.

Clearly, there are many big players out there that spend more in marketing in a day than the total income of any of my titles..
It's like an F1 race, where the big players have the best cars and always take the podium.. while the other teams are kept in the back by the laws of physics, no matter how good a driver can be or how smart an engineer is, they just don't have the money to afford to compete.

Nevertheless, I can't bitch and moan too much, because as an independent developer I've been luckier than most other so far, and if I can't afford to be independent, I think that I can still get a job that I'll like.

The world is not fair, but that's just the way it is 8)

Sunday, June 2, 2013

Man on fire

Completely unrelated to the recent trend of this blog (generally obsessed with my independent game development) there's something that has been bugging me for a while.. and that's the suicide of Tony Scott.

Maybe for a person with suicidal tendencies it's not something strange, then it makes sense that those that don't "get it" should not be curious about it.
Still, I think that it's a waste and it's unfair to keep the motive private.

It's a waste because one could get insight that could go towards helping someone around them.
It's unfair because it caught a lot of attention and wasted a lot of people's time to follow the news.. and then nothing comes out of it.

The privacy of his family needs to be respected, ok, but still.. the greater good would be to know more.
Was he sick ? Was he having erectile disfunction ? Was his wife cheating on him ? Was it the antidepressant (which apparently can increase suicidal tendencies) ? If we don't know, we can't prevent from it to happen to others.
It's a popular case and it could be used to educate people to prevent similar things to happen...

The moral is that it's not just curiosity, but it's about sharing things that could help improve (and keep !) the life of others.

mumble mumble

Monday, March 25, 2013

More Fractal Combats !

Fractal Combat X has been out for a couple of months now, but I didn't write anything about it.

Can you guess ? It didn't go very well..
I'll write more in detail in a later post, but for now lets make a little logic game:

- FCX is much better looking than the 1.0 of FC (both in-game and UI)
- FCX is free, while FC was initially sold for $1.99 (now $0.99)

..therefore FCX should be loads more popular, right ?
But that wasn't the case.
For some reason, major mobile game review sites didn't bother talking about it, Apple itself didn't notice it and didn't put it in any sort of noteworthy section (not even where FC was placed at the time !).
Apple didn't even put it in a Flight Games section, where instead one can find things like Top Gun, which is rated at 2 and 1/2 stars.. famous title, never mind if it's a good game or not.
Unsurprisingly, FCX was reviewed and featured on Italian sites and even on a newspaper.. eh !
Anyhow, lack of marketing (resources) was the big problem for FCX.

One positive thing this test (let's call it that) is that the free-to-play model worked out decently. Although the game is rather generous and doesn't really beg users to purchase things, a few people do buy credits.
But the game should offer more purchasing options and, most importantly, it should be downloaded a lot more than this (187K times in 2 months and a half, with the downloads peak reached in the second week).

Another generally positive thing is the modest revenue coming from the free versions of the Final Freeway games. It's not much, but it's a big help to keep the business going.

Given that ads are working out well, we decided that our next Android game is going to be a free version of the first Fractal Combat . It's going to be with ads and optional In-App Purchase options to remove ads and to get additional content.
Unlockable features and content is not the best way to do freemium games, but the first FC wasn't meant to deal with virtual currency, and on the Android platform we're still working on the infrastructure to deal with these things.. namely, in a virtual currency setup, the user should be allowed to transfer the game status across devices (or on reinstall), and that requires some server storage, like iCloud, which is what I'm using on iOS.

FCX is based on virtual currency, so for the Android edition we'll have to come up with a solution. Which, if everything goes to plans, it should be the OpenKit system ...but it's not out yet.