Hello, World!


And let there be blogging!

Foremost, please, be patient with me. I’m starting a bunch of things here, with this post: my (public) game development career, my inner writer and my social media persona. But, if you’re willing to accompany me, I promise it will be worth your time!

What are we doing here?

We’re documenting my game development journey via written entries, hopefully reaching anyone who needs inspiration to start that side project or just has an interest in the old-fashioned blogging. Or none of these.

Nevertheless, I’m happy you’re here.

Going on our first tangent, this post reminds me when, back in 2020, I was interested in writing. Not for a book or article, nor a blog, but for myself. I didn’t know what I wanted to write about, but I wanted to get good at it, so I went looking for lessons and tips on how to write better. And they all said almost the same thing:

To get good at writing you have to write.

Who’d knew? And because I didn’t have a reason, no writing was ever done. Until now.

How about the game?

A short explanation of the game in production: Snake meets Tactics, but with an arcade-like gameplay loop. I don’t intend - at first - for a story mode, but I’d definitely be down for it if the gameplay comes out nice and has a nice reception of you.

But the arcade portion is important! The arcade reduces the scope, the freaking scope! As all of us, with big dreams and little experience, always wants our first game to be grandiose.

And, of course, mine was a MMO, no big deal. From scratch, in C++, with a telnet interface (I have an inclination for MUDs) and a novel way of dealing with new connections. To say I didn’t write all that for nothing, here is one of the most fun parts of writing the server:

void TelnetConnection::receive() {
  socket_.async_receive(
    boost::asio::buffer(input_buffer_, INPUT_BUFFER_SIZE),

    [this](const boost::system::error_code& error, size_t num_recv_bytes) {
      if (error == boost::asio::error::eof) {
        logger_->info("Closed by client");
        disconnect();
      } else {
        telnet_session_.receive(
            telnetpp::bytes{input_buffer_, num_recv_bytes},
            [this](telnetpp::bytes data,
                   std::function<void(telnetpp::bytes)> const& /*send*/) {
              std::string msg(data.begin(), data.end());

              received_msgs_.push(msg);

              // TODO: Is it guaranteed to have a '\n' at the end of a
              // message?
              if (msg.back() == '\n') {
                logger_->debug("Received message of size %d", msg.size());
                if (authenticated_) {
                  received_msgs_.q_f_cv
                      .notify_one();  // Notifies TelnetServer of new message
                } else {
                  cv_pre_auth_received_msgs_
                      .notify_one();  // Notifies TelnetServer of new pre-auth
                                      // message
                }
              }
            },
            [this](telnetpp::bytes data) { rawWrite(data); });

        receive();
      }
    });
}

Oh, how I was in love with this code! Using Boost’s fibers, asyncs anonymous functions and separated components with possibilities to scale the server to enormous possibilities!

Too bad it didn’t see the light of the day.

I wanted to, at least, use this infrastructure to create a chat server, but the complex system I designed with multiple queues was too much for me and I gave up. That’s when I learned the lesson to reduce the game’s scope, so I wanted to make another, smaller, game.

Of course, the next game would not yet be small enough to maintain focus and finish it. I had an idea to mix the gameplay of the 1994 elevator-simulator-game, Sim Tower with the content and simulation of the short, study creatures simulator, Dwarf Fortress. Of course, I did close to nothing in order to accomplish the game, I only created a world generator:

Generated World

Modesty aside, for a first attempt on world generator, I liked mine very much. It creates an island with rivers, peaking its height around the center of the map and ensuring that the island finishes before the world boundaries, using simplex noises as base.

To the next game!

I realized that the last project was a bit too much on the technical side of things, as I not only intended to create complex social and physical structures with movement binded to physics, as well as I wanted to simulate even internal organs of the dwarves. Hope that overwhishing stayed in the past, huh?

OK, the new game would be simple. No complex mechanics, only story via dialog choices and some simple game between parties. No big deal, I went and did the major features:

Text adventure game

But when it came about writing the story itself, well… All my motivation vanished. The detective story with various branches I’d like to write showed up too complicated to be well executed - not to mention the complicated UI I was stuck on. I really like how the smooth animation on text ended up, though.

The game

I know, this is the moment we’ve all been waiting for, to show the game I’m working in. Here you go, what I have so far:

Snake Tactics

The graphics are from iknowkingrabbit and is being done in Godot and, as soon as I have a playable demo I’ll be sharing with all of you, don’t worry. For now, I have a few ideas, which will be slowly shown here in these blog entries.

Finally, I thank all of you for reading this post, having the patience with a novice blog writer and for the interest in my little project. I’ll try to post at least weekly, so follow me to keep in touch with any updates!

If you have any feedback, please, reach out in any of the social links below, and, if you want to support me in my journey, consider donating any amount via my KoFi! ☕❤️

Have a wonderful day, afternoon or evening and follow your dreams!