Heading for GDC soon. pre-GDC thoughts

February 24, 2017 | Filed under: business

On Sunday I start my trek to the Game Developers Conference (GDC) in San Francisco. I’ve been many years now, and can pretty much find my way around SF without a map. As usual I’m only buying an indie pass, because frankly, I’;m not a billionaire, or gullible, so I will only be attending a few talks. (its not like there are secret talks that tell you how to make 3x the sales which nobody ever leaks details from…). For me, the real ‘worth’ of GDC is taking the pulse of the industry, and meeting other devs to both socialize and to share information.

I’ve written in the past about whether or not GDC is worth it as an indie, and I stand by my assertion that it depends on your personality. Even though some drugs are now legal in SF which are inexplicably illegal in the UK, that is not going to make me gregarious enough to march up to ‘influential’ journalists, and start giving them an elevator pitch about my game. (seriously, we are happy for the tens of thousands of alcohol and tobacco related deaths each year, but we still ban cookies that make you giggle and eat chocolate bars? wtf?). If my only motivation for GDC was press, frankly I wouldn’t go. I am trying to compensate for not actually being gregarious by wearing a VERY WHITE jacket with a production line logo splashed all over it, in the hope that this subconsciously ‘raises my brand awareness’. Hmmm.

As of writing this, I have ten ‘appointments’ at GDC. None of them are with press, and none of them are likely to in any crucial way result in higher sales or anything like that. The vast majority are just meals with friends, and parties where I can make new friends. There is something cool about being at a party with 200+ people and you know all of them know what ‘indie developer’ means and you don’t have to feel like you do some weird made-up job nobody understands…

With shadowhand heading for a release in a short while, and production line already in alpha, I know a lot of devs would spend the time schmoozing and trying to make press contacts, but I really have decided that the whole ‘schmooze’ side of the business is not really for me. If I make even half the sales that I currently do, and that allows me to just code, design and run the odd ad campaign, then thats cool with me. Increasingly it seems that games get the majority of their real ‘buzz’ from being high quality, and from engaging with the community, rather than knowing the right people.

Of course YMMV, maybe I’m doing it wrong, I often think that I am, which is why I often change my approach to development to see if I’m wrong. I used to think Early-Access was nuts, but am trying it to make sure, and decided I like it. Ditto with youtube. If you think going to shows is nuts, or absolutely a pre-requisite, then it really is worth trying the exact opposite one year to check your hypothesis. And if you think that having a booth at a show is something you MUST do because everyone else does it, don’t forget that it can be very expensive and sometimes it does not help.

See you at GDC. I’m the one in the WHITE jacket.

There are no comments yet

Update on shadowhand! potions!

February 23, 2017 | Filed under: shadowhand

Shadowhand continues to make awesome progress. We are close to releasing the games steam page for ‘coming soon’ and wishlist adds, which is a bit of a milestone. The trailer is nearly done and the launch is in sight. If you haven’t heard me talk about it before, shadowhand is a game developed by Grey Alien Games and published by me! Its an interesting card-game/rpg/story based game that has no real direct comparison. Its very polished and very addictive. Here is Jake talking about the latest developments in the game:

Its hard to know how best to describe the game, I would say ‘darkest dungeon meets solitaire with steroids on’.  I like it (and think its a good bet to publish) precisely because its no hard to describe, and thus is likely an experienced most gamers have not had. Its going to be really interesting to see what people think of it.

Both me and Jake will be at GDC next week. if you are a youtuber or twitch streamer and want a demo, just leave a comment or email me at cliff AT positech dot co dot uk. Also obviously we are always keen to talk to bloggers and journalists about Shadowhand and Production Line. Plus we are British, so you can offload all your political angst on us while we nod sagely and understand :D.

Hopefully new Production Line patch tonight or tomorrow morning…

There are no comments yet

I really don’t get how indies put so much time and effort into their first game. The ones who get into debt amaze me even more. the ones who mortgage/sell their house scare the crap out of me. Don’t do this.
I’ve made lots of games, here is how they went:

  • Asteroid Miner: Meh…sold a few hundred copies, was exciting to see it in a box.
  • Starship Tycoon…sold a few hundred copies, also some retail deals, tempted to quit day job… and does! That was a mistake!
  • Rocky Racers… mediocre flop.
  • Kombat kars… mediocre flop.
  • Planetary Defense…not bad considering development time was super short (a few months).
  • Kudos…surprise hit. did really well. 3rd party publishing deals that paid actual royalties!
  • Kudos 2… even better. Seriously good sales. hit $20k in one month. unbelievable.
  • Democracy…not bad, not enough to quit job, but really not bad.
  • Democracy 2: Really good, enough to quit job. *quits job AGAIN*. pays off mortgage.
  • Gratuitous Space Battles: OMG teh fountain of money. Buys new house.
  • Gratuitous Tank Battles. Meh: pretty good, but nowhere near as good as GSB.
  • Democracy 3: LOLLERSKATES. Orders brand new car & stupidly expensive laptop. Starts flying business class. Eventually buys stupidly flash electric car.
  • GSB2: Yikes, that didn’t go down well. Ouch. what did I do wrong?
  • Democracy 3:Africa. Fuck. Americans REALLY don’t care about Africa then? Barely breaks even.
  • Production Line: LOL. Almost physically crushed by stampede of pre-orders.

My point is…holy crap you never know what will happen next. Your next game could flop, it could be huge. I *really* think that GSB2 is underappreciated and am surprised it flopped. I’m still amazed at how many people like political strategy games. YOU NEVER KNOW. So be cautious, and experiment a bit. if I’d bet my house on Asteroid Miner, I’d be renting a bedsit whilst still working in IT support trying to pay off debts. I’ve never borrowed money to make a game, I’ve never remortgaged, I’ve never worked for more than 18 months on a single game before putting it on sale.

That might be a bit clinical and unromantic, but its worked for me. Your life is not a feel-good Hollywood movie starring Tom Cruise. Don’t get stuck in confirmation bias. Many indie games fail. Some fail HARD.

Wow its been a BUSY week, like crazy busy. I released build 1.07 for Production Line, and started on 1.08. The price went up to $11 today, and I also started laying out a list of coming soon stuff in the forums here. There has been a steady (and accelerating) growth in daily pre-orders for the game. 4,000 sales seems ages ago now, and I’m struggling to keep up with all the feedback. Anyway…here is the new blog video.

I shouldn’t really be surprised, but the pace with which people have got around to building REALLY BIG factories is kinda amazing. This meant I needed to do some optimisation for those cases, often totally revising my idea of how big I should make certain fixed size buffers. (640k is enough for everybody!). I know some programmers might say ‘but dude…variable sized data structures. Yup, know all about them, but they can be SLOW. Try comparing the performance of a list or vector and an array one day… its HUGE. What I tend to do is have fixed arrays of oft-used objects, and allocate extra arrays if I start to run out, meaning rare one-off frame skips, but silky smooth performance most of the time.

My day is just now a blur of checking email;, then twitter, then facebook messages, then reddit posts, then forum posts, then forum messages, and then going through my bug list and my features todo list until its time to sleep or blow off steam in Battlefield One. However…just in case you thought that made me sound lazy, don’t forget we are also publishing another game (Shadowhand) which is coming soon. Here is Jakes latest video about the game:

Before long it will be GDC, and before that I’ve agreed to speak at TWO(!!!) events, which means…holy crap. I should stop typing and get on with it.. I will leave you with the exciting changelist for Production Line build 1.07:

[version alpha  1.07]
1) Major performance optimization for large factories.
2) Much faster vehicle rendering when zoomed out.
3) Fixed bug where very high car output resulted in no market price for a car being low enough.
4) Fixed the 'No room to TrashLowPriorityResource from stockpile' bug.
5) Fixed the 'Route Pending!' bug.
6) Possible fix for corrupt efficiency graph.
7) Fixed bug where manufacturing slots showed as not connected to a stockpile until the first resources arrived.
8) Added game-clock to top right menu.
9) Quitting the new car design dialog now gives a unique default name and price to the design.
10) Fixed bug where the warning notices on cars would persist until they encountered an empty conveyor belt.
11) Fixed bug where right clicking on research screen could delete items in the factory.
12) When a car is unable to move to the next (connected) slot, the message now tells the player which requirement is not met.
13) Background sound FX in R&D screen reduced in volume.
14) Fixed bug where some conveyor belt placements resulted in multiple placement sounds on top of each other.
15) Fixes to the layout of some R&D and slot menu items.
16) The warning and error notices in the factory now shrink to icons when zoomed right out.
17) As a temporary quick balance measure, only 4 valves are needed for engines now!
18) Fixed bug where supply stockpiles would not always fill correctly.

 

There are no comments yet

Anatomy of a bug fix

February 09, 2017 | Filed under: production line | programming

I thought it might be interesting to just brain dump my thoughts as I do them for a Production Line bug.

The bug is an error message which I get triggering thus:

GERROR(“No room to TrashLowPriorityResource from stockpile”);

Which is handy, as I know exactly WHAT is happening, and where in the code. Thats 95% of the work done already. Amen to asserts! I know that inside the function SIM_ResourceStockpile::TrashLowPriorityResource(), I am not able to actually do what the function needs to do. So firstly what does this function do anyway? I can’t remember… Thankfully there is a comment:

//if we find a resource not needed by current task, destroy it (only one)

Which is pretty handy. So this is a stockpile at a production task (working on a vehicle) and it needs room for a new resource presumably. The code goes through all of the objects currently in the stockpile to check we really need them. here is the code:

    iter it;
    for (it = Objects.begin(); it != Objects.end(); ++it)
    {
        SIM_ResourceObject* pobject = *it;

        //is this object needed?
        bool bneeded = false;
        SIM_ProductionTask::iter rit;
        for (int c = 0; c < SIM_ProductionSlot::MAX_RESOURCE_QUANTITIES; c++)
        {
            SIM_ResourceQuantity req = PSlot->CurrentResources[c];
            if (req.Quantity <= 0)
            {
                continue;
            }
            if (req.PResource == pobject->GetResource())
            {
                if (GetQuantity(req.PResource) > req.Quantity)
                {
                    bneeded = false;
                }
                else
                {
                    bneeded = true;
                }
            }
        }
        if (!bneeded)
        {
            RemoveObject(pobject->GetResource());
            return;
        }
    }

Thats the first half of the function, it then tries to do a simialr thing with requests, rather thanm objects. However I think I see an issue already. That GetQuantity() is checking the total quantity, not for this single object. Nope…thjat makes sense. I guess I really need to trigger the error and step through it, so time to fire up a save game from a player and run it in *slooooow* debug mode. Ok… an immediate crash from a save game..where we have 16 requests and no objects. So there seems to be a bug in the latter code:

    //ok we need to destroy a request instead of a current object.
    reqit qit;

    for (qit = Requests.begin(); qit != Requests.end(); qit++)
    {
        SIM_ResourceRequest* preq = *qit;
        //is this object needed?
        bool bneeded = false;
        for (int c = 0; c < SIM_ProductionSlot::MAX_RESOURCE_QUANTITIES; c++)
        {
            SIM_ResourceQuantity req = PSlot->CurrentResources[c];
            if (req.Quantity <= 0)
            {
                continue;
            }
            if (req.PResource == preq->PObject->GetResource())
            {
                //sure we ordered it, but do we actually have enough for this task, when com,bining requests with objects?
                int stock_and_ordered = GetStockAndOrdered(req.PResource);
                if (stock_and_ordered >= req.Quantity)
                {
                    Requests.remove(preq);
                    preq->PObject->Trash();
                    return;
                }
                bneeded = true;
            }
        }
        if (!bneeded)
        {
            Requests.remove(preq);
            preq->PObject->Trash();
            return;
        }
    }

So what could be wrong here? Ok…well hang on a darned minute. This code is just saying ‘do we really need resources of this type right now???’ rather than ‘do we need ALL of these right now?’  which is more of a problem. We are clearly somehow ‘over-ordering’. The slot in question is ‘fit trunk’. presumably it only needs trunks… They do all indeed appear to be the same type. 4 are ‘intransit’ the rest are queued up at some resource importer or a supply stockpile or component stockpile somewhere.

So the ‘solution’ is easy. First kill off (delete) a request that is not in transit yet, to make room, or if that is not possible, kill one that actually is in transit. This then frees up the required place in our stockpile. But hold on? this is just patching over the wound? how on earth did this happen? The calling code is requesting new resources, when clearly 16 are already on the way! in fact its requesting a servo…

AHAHAHAHA!

what a beautiful bug. The player obviously upgraded to a powered tailgate, which means a servo is needed for every trunk, and yet 16 trunks were already on order. Error! error! I have special code that handles when an upgrade makes an existing resource requirement obsolete (climate control replaces aircon), but not code to handle this case, where additional stuff is needed. This is FINE, I can implement the above mentioned code without worrying how it happened.

That actually wasn’t too bad at all :D