Blog

Life goes on

Mister Tins is now officially in sale, which means it's officially dead, and that's not a big surprise to me. I guess it's time for a brief post-mortem summary of what went right and what went wrong. Well, the good thing is that I finished it, and it was fun, not to mention that my long time dream to make a game has come true :). I still think it was quite a good idea, and a bit underrated, but looking back I think there are at least three reasons why this whole project was doomed from the beginning:

  • Modern games are driven by artists, not by developers. It's just no longer "let's do the hard work and write the whole code and then we'll just throw in a few textures and the game will be ready". On the contrary, you take an existing engine like Unity, and then all the hard work is graphics, models, animations; the programming comes down to scripting a few events. I'm oversimplifying, but you get the point.
  • Modern games take a lot of work. Even a simple indie game requires a team of at least a few dedicated persons and often takes years, especially when people have another full time job. I spent six months, but in reality only during the first few weeks I spent significant time on this project. It's good that I started with something simple enough that I was able to finish it, but it can't compete with all the professional games in the market.
  • Another thing, which is perhaps not a strong requirement, but certainly helps, is when you can participate in various events and shows, contact other game developers, potential players and especially the press, long before your game is finished. Obviously, it's easier when you live in a large city in USA or Canada, not in some shithole in Poland…

In conclusion, if I'm ever going to get involved in another game, I'd certainly be joining an existing, dedicated team of artists, who need a coding monkey, and I'd teach myself Unity. Anyway, it's not going to happen very soon :). The good news is that now I finally have some time to release a new version of Saladin and WebIssues, work on redesigning my book, and simply read and play some games.

Also in my personal life there have been some changes recently; for example, I'm getting a divorce. I could make a similar list of things that went wrong, but I will spare you the details. Let's just say that one day you think you know someone, and then it turns out that your goals and values are so different that you simply can't go on any further. At first I was really upset because I hoped our son could have a "normal" family, especially that I din't have one, but the truth is that now I spend much more time with him than before we separated, and I'm definitely going to do everything I can to make it up for him. So I went through the whole denial-anger-regret stages and in the end I think it's for the better for all of us.

Luckily, there have been some positive changes too. I renewed an old friendship and made a new one, and that's something you can't overvalue. It also may have bigger consequences, because I think that I finally found a team of dedicated people and we have a chance to work on a very interesting and promising project - maybe it's not a game, but it's not one of those boring warehouse/financial/enterprise kind of applications either. So, life goes on…

Filed under: Blog

Mister Tins released

I just released the first beta version of Mister Tins. You can download it for free and play the first five levels in demo mode. For now the full version is only available for beta testers and press, if you're interested then please contact me. In a nutshell, Mister Tins is a puzzle indie game for PC in a top-down perspective view. The goal is to move boxes to open doors, jump between platforms and different floors, avoid obstacles and find the exit from a labyrinth of rooms.

Here's the official trailer of the game:

You can find more information about the game on the official blog of the MiMec Games team.

Filed under: Blog

Issues and Tins

Today I released version 1.1 of WebIssues, a major release which introduces lots of very nice and useful features. I must admit that I'm relieved that this project is finally over. It's also perfect timing, because I'm getting seriously involved in the indie game which I announced some time ago. The game is now officially called Mister Tins and it even already has a Facebook page and a blog (where I will probably post more often than here in the nearest future).

What started as a quick test project, has now become a playable and quite enjoyable game (at least for me). It's still very far from the first official release, but at least now I'm convinced that this is really what I want to do. It's what I always wanted to do and what I probably should have done a long time ago.

I'm not saying that I regret what I've been doing for the last few years. I definitely wouldn't be half as good programmer if it wasn't for WebIssues. I would even go as far as saying that I wouldn't be half the person I am today if it wasn't for all the open source projects I've been involved in. All this technical and non-technical experience should now pay off with this new project.

Of course, there's no guarantee that I will succeed. I know that there is a lot of potential in what I'm doing, and the whole idea of the game, while simple, seems quite innovative. On the other hand, there are many factors involved, and not all of them depend on me. A lot of luck is needed to provide what people need exactly in the right moment. Also, creating games is a team sport, and experience taught me that finding the right team members is not easy an task. But the best thing is that I've reached one very major goal, which was releasing WebIssues 1.1, and I can immediately concentrate on the next goal, without losing the momentum that I have.

Filed under: Blog

Going Indie?

I spent most of the last six weeks sharing my free time between two projects: the upcoming 1.1 release of WebIssues and the final chapters of the second part of my book. So the next logical step is... to start a new, third project. It's been a long time since I last started a completely new project and at some point I even though it's not going to happen anymore... But, as usual, in the least expected moment, an idea came to my mind and formed quite a clear shape. Within a few days I hacked together a proof of concept of what's supposed to be a combination of classic logic and arcade games.

The idea of the game is that there is a simple labyrinth which you can see from above, but it's three-dimensional, with multiple levels, so you can jump and fall, go up and down stairs, etc. So far the player consists of just a helmet which I modeled using Descend and some crazy math. Within an hour I added an export function to Descend which saves the model into a very simple file format which can be then imported by the game engine. So far it looks very cool :).

I know that a lot of people are waiting for WebIssues 1.1. I promised that it will be released by the end of this year and I'm going to try hard to keep that promise. I'm really very close, especially that I've already cut off a lot of unnecessary things and I'm only focusing on the most useful features. After it's done I'm going to take a longer break from it, especially that now I understand that I was fooling myself thinking that as it becomes more and more popular, someday I will be able to make some profit from it.

The book is unfortunately going to have to wait for now, even though it's probably about 75% done and there are a few people waiting for me to finish it as well. But the question whether I can expect anyone to ever publish it remains open; not because it's not good enough, but because publishers don't invest money in a book written by completely unknown authors, and it's quite understandable. But next year I'm definitely going to finish it, even if it's going to end up as a few xeroxed volumes for friends and family.

The game, if I'm really ever going to create it, most likely won't be open source like my other projects. Not that I expect to make any real money on it. I'm aware of the fact that there is a lot of competition in indie games industry and it takes a lot of PR and marketing effort to achieve even a moderate commercial success. I'm only going to do it as long as I feel it's fun. After all, I've been into making computer game since I was a child. Perhaps I'm feeling a bit nostalgic lately and somehow I feel that this is the last chance to revive those old inclinations.

All projects I've done so far I did entirely for my own satisfaction. The process of creation is in most part a great experience by itself, kind of like exploring new unknown lands. And the biggest satisfaction comes from the realization that someone is actually going to use my program, read my book or play my game, and experience the same thing from a completely different perspective. We're more like artists than businessmen; it's the individual opinions that matter, not the numbers. That's why I can make decisions regarding my personal projects which not always seem rational, but often end up with something really interesting.

Filed under: Blog
Tags: personal

Disabling a QLabel with links

Qt doesn't have an equivalent of .NET's LinkLabel control, because the regular QLabel supports HTML content, including links. It's easy to create a link label using an anchor tag (i.e. <a href="...">...</a>). You can then handle the linkActivated signal or simply set the openExternalLinks property to true if you want the label to automatically open the link target in a web browser. However, there is one small limitation of the standard label widget: when you disable it, the links no longer work, but they are still drawn the same way as regular links (i.e. as blue underlined text).

Recently I had to slighty modify the notification schedule editor in WebIssues which looks like this:

img1

The links on the right make it easier to check or uncheck all options at once. However, the entire schedule needs to be disabled if sending summary emails is turned off:

img2

Note that the links are drawn in the same way as the regular disabled label and the checkboxes. How to achieve such effect?

After some research it turned out that tweaking the label's palette and/or style sheet doesn't do the job as expected. The workaround is to include the appropriate style directly in the anchor tag, for example:

QColor color = palette().color( QPalette::Disabled, QPalette::WindowText );
label->setText( QString( "<a href=\"%1\" style=\"color: %2; text-decoration: none;\">%3</a>" )
    .arg( linkUrl, color.name(), linkCaption );

Note that the disabled text color from the current palette is passed to the style definition so that it looks the same as the regular disabled label.

To make it easier, I wrote a very simple subclass of QLabel which automatically generates the correct HTML when it becomes enabled or disabled:

class LinkLabel : public QLabel
{
    Q_OBJECT
public:
    LinkLabel( const QString& caption, QWidget* parent ) : QLabel( parent ),
        m_linkUrl( "#" ),
        m_linkCaption( caption )
    {
        setTextFormat( Qt::RichText );
        updateLink();
    }

    ~LinkLabel() { }

public:
    void setLinkUrl( const QString& url )
    {
        m_linkUrl = url;
        updateLink();
    }

    const QString& linkUrl() const { return m_linkUrl; }

    void setLinkCaption( const QString& caption )
    {
        m_linkCaption = caption;
        updateLink();
    }

    const QString& linkCaption() const { return m_linkCaption; }

protected: // overrides
    void changeEvent( QEvent* e )
    {
        QLabel::changeEvent( e );
        if ( e->type() == QEvent::EnabledChange || e->type() == QEvent::PaletteChange )
            updateLink();
    }

private:
    void updateLink()
    {
        QString style;
        if ( !isEnabled() ) {
            QColor color = palette().color( QPalette::Disabled, QPalette::WindowText );
            style = QString( " style=\"color: %1; text-decoration: none;\"" ).arg( color.name() );
        }
        setText( QString( "<a href=\"%1\"%2>%3</a>" ).arg( Qt::escape( m_linkUrl ), style,
            Qt::escape( m_linkCaption ) ) );
    }

private:
    QString m_linkUrl;
    QString m_linkCaption;
};

Note that in this example the link's URL defaults to "#", which is convenient if the link is handled internally using the linkActivated signal. Of course you can overload the contstructor so that it takes the URL as a parameter. Also it's not very difficult to modify the code so that a single label could contain multiple links.

Filed under: Blog
Syndicate content