Think like a game designer

Charlie Cleveland recommended this read to the UW team. I wasn’t ever interested in game design, so I decided to finally change that and check out the book. Justin Gary’s work has a subtitle “the step-by-step guide to unlocking your creative potential”. I never had any great game ideas, so I doubted that.

After reading it I had to admit that I was surprised. Gary’s systematic apporach to design seems like a no-nonsense approach that could produce game ideas that could be easily verified. I wish I had time to verify that, haha.

Contents, for future reference:

Part I Understanding Design 19
Chapter 1 Learning Fundamentals 21
Chapter 2 Getting Started 25
Chapter 3 Overcoming Obstacles 35

Part II Learning the Core Design Loop 39
Chapter 4 The Steps of the Core Design Loop 41
Chapter 5 Inspiring 43
Chapter 6 Framing 53
Chapter 7 Brainstorming 59
Chapter 8 Prototyping 69
Chapter 9 Testing 77
Chapter 10 Iterating 85

Part III Refining Your Designs 91
Chapter 11 The Phases of Design 93
Chapter 12 Engine Design 101
Chapter 13 Engine Development 113
Chapter 14 Component Design 119
Chapter 15 Component Development 125
Chapter 16 Polish 131

Part IV Building Great Games 143
Chapter 17 What Makes Games Great? 145
Chapter 18 Elegance 147
Chapter 19 Excitement 155
Chapter 20 Depth 161
Chapter 21 Motivation 169
Chapter 22 Engagement 177

Part V Making Money 185
Chapter 23 Monetizing Games 187
Chapter 24 How to Be a Professional Game Designer 193
Chapter 25 How Can I Get My Game Published? 197
Chapter 26 Game Business Models 203
Chapter 27 How to Make Games That Last 211
A Final Note: Living the Lessons 217

Ansible in an hour

I stumbled upon a nice server automation course made by an expert I follow. I don’t do many tedious, repeatable tasks in my daily work, but I wanted to prepare for future.

Ansible is useful for bulk server configuration, application deployment, and other automation tasks. The course I finished is very compact, but it explains the most important topics:

  • Prepping Ansible for use (installation, management node, inventories)
  • Ad-hoc modules (running commands on all servers)
  • YAML configs (playbooks)
  • Facts, variables
  • Playbook creation (generating SSH keys, using variables, loops, groups, creating users, conditionals, file operations, tags, templates, firewall config)
  • External roles (using playbooks from Ansible Galaxy, Docker containers)
  • Creating own roles (complete web server setup example)
  • Ansible Lint (config validation)
  • Ansible Dynamic Inventory (useful for large server farms)
  • Ansible Vault (credentials storage)
  • Ansible AWX (free counterpart of Ansible Tower; a web interface for playbook management)

Looks like a quite useful, pretty complex tool. Sadly, most of the Linux servers I use are handled by Laravel ecosystem tools, so I might need to wait a while before putting Ansible to use.

New laptop – ASUS ROG Zephyrus G14

After 8 years with MacBook Air I had to upgrade it. The main reason was the urge to back to Windows ecosystem. I still think that no serious work can be done on MacOS.

Anyway, after some research I wanted to get something with 14″ screen and with Ryzen 9 from 6000 series (great performance when needed + superior energy saving features). I had to place the order in July/August 2022, and my options were… none! I wanted a Lenovo ThinkPad, but they’re just not available. I saw Asus laptops showing up briefly in some shops and I was able to snipe something that had almost everything I wanted.

Some raw specs:

  • Model: GA402RK – L8152W
  • CPU: AMD Ryzen 9 6900HS (8 cores, 16 threads, 3.30–4.90 GHz, 20 MB cache)
  • GPU: AMD Radeon 680M with 8GB GDDR6
  • RAM: 32GB (DDR5, 4800MHz)
  • Storage: 1TB NVMe (upgradeable)
  • Screen: 14″ mat LED IPS, 2560 x 1600, 120Hz
  • Weight: 1720g
  • Two power supply units provided (lighter USB-C for travel + heavier dedicated one for performance)

It arrived in a nice, premium packaging. I had to charge it before first run. The build quality is good, but not nearly what Apple provides. It has 4 speakers, but the sound quality is super bad, compared to a 8 year old MacBook Air.

It comes with Windows 11 Home, so I’ll have to upgrade it to Pro at some point. It took quite a bit of time to set up the very basics, which was annoying. I still can’t get it to properly enter power saving mode when I close it, so it uses 1% battery per hour if I don’t power it off. The on-case bling bling display is just annoying. I’m uses to high-end Razer mechanical keyboards, so I was underwhelmed with the feel of the one I got with the laptop. That pretty much sums up the downsides.

On the good side – the screen is great, camera is decent, and performance is really, really good. With my average use the battery lasts 5 hours. I can get over the small issues I pointed out above, so in the end I’m pretty happy with this laptop.

Raspbian Stretch, WiFi and TP-Link TL-WN725N

Few weeks ago I had to install fresh Raspbian on my old Raspberry Pi 2B. Everything was way smoother than few years ago, when I bought it. The only annoying issue I had was getting the WiFi to work properly. My TP-Link card (TL-WN725N) had it’s diode indicating that it’s operational, but Raspbian couldn’t find any networks.  I saw the OS recognizing the card, and after scanning for SSIDs, I saw my network. It was pretty weird – Raspbian still wouldn’t connect to them. After few hours of googling and trying few solutions, I found two sources with tips that helped me.  Here they are:

Reference #1

Reference #2

Plastic SCM and binlog issues

Plastic server in our company is backed up in several ways. One of them is MySQL replication, simple master -> slave setup. One day the error above (logging format issues) popped up. Thankfully, the fix was pretty simple, but it took some time to find it.

Firstly, you need to stop the MySQL slave. Execute “STOP SLAVE;” command in MySQL console to do it.

Secondly, run the commands below on the master’s MySQL console:

FLUSH TABLES WITH READ LOCK;
FLUSH LOGS;
SET GLOBAL binlog_format = 'MIXED';
FLUSH LOGS;
UNLOCK TABLES;

Remember to set the binlog format in the master’s config file!

The last step is to start the slave replication. That’s it!

Jenkins, SSL, and cPanel

Straight to the point. The basic idea is to hide Jenkins behind an Apache reverse proxy. I’m using cPanel on CentOS – and cPanel doesn’t like fiddling with httpd.conf. You’ll find lines like this in it:

# To customize this VirtualHost use an include file at the following location
# Include "/usr/local/apache/conf/userdata/std/2_4/user/domain.com/*.conf"

I created two config files – I want to set up proxy and redirect non-HTTPS requests to HTTPS:

"/usr/local/apache/conf/userdata/ssl/2_4/user/domain.com/ssl.conf":
ProxyRequests     Off
ProxyPreserveHost On
AllowEncodedSlashes NoDecode

<Proxy *>
 Order deny,allow
 Allow from all
</Proxy>

ProxyPass         /  http://localhost:8080/ nocanon
ProxyPassReverse  /  http://localhost:8080/

RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "443"
"/usr/local/apache/conf/userdata/std/2_4/user/domain.com/redirect.conf"
RewriteCond %{REQUEST_URI} !^/.well-known
RewriteRule (.*) https://jenkins.domain.com/$1 [R=301,L]

After that, run commands to refresh the configs and restart Apache:

$ /usr/local/cpanel/bin/apache_conf_distiller --update
$ /usr/local/cpanel/bin/build_apache_conf
$ service httpd restart

And we’re done!

UPDATE – iptables rule to block port 8080 traffic outside of localhost:

iptables -A INPUT -p tcp --dport 8080 -s localhost -j ACCEPT
iptables -A INPUT -p tcp --dport 8080 -j DROP

Hardware update: GTX 1070

Few days ago I got an GFX upgrade: I bought a GeForce GTX 1070 by MSI, thanks to @Obraxis. I’m really happy with it – price was good, I got a free copy of latest Gears of War, performance is awesome, and it does have passive mode. I had few issues with it though!

My previous GPU was a GTX 780 by Asus. It was pretty awesome too, but damn, performance got DOUBLED with the 1070! Check out the benchmark results here. Score on GTX 780 was almost exactly 3000 points.

firefox_2016-10-11_23-34-50

The big issue I had with this piece of hardware was pretty intense. Right since I logged on to my OS, I saw shit ton of artifacts. I was confused – I checked all cables and installed fresh drivers. It was a bit better, but I had to return the card on day 3. The second unit is having this issue too, but I haven’t seen it since a week ago.

After some digging, it turned out I was not going insane. MSI had to recall a whole batch of those cards released on Chineese market! But hey, I’m in Europe, right? Nope, looks like a lot of manufacturers used shitty Micron memory! Thankfully, it can be fixed with an update to card’s BIOS. Again, thanks to @Obraxis for sending me that link. After checking my card with GPU-Z, here’s what I saw:

2016-10-22_03-01-24

All in all, I’m happy with my new GPU!

 

Vue.js

I’m tired of Angular. I never had time to learn it properly. Other JS frameworks are even less appealing for me. But something has changed – Vue.js appeared on the horizon. It looked very promising, and I decided to learn it. Why? It’s lightweight, clean, and has all the features I need.

Vue.js 2.0 is going to be released pretty soon, it’s going to be much faster than 1.0, while keeping the API largely the same.

There are the sources I used for learning:

You can see the mess I created in my lab at http://lab.acedude.pl/ in the “Vue.js framework” section.

3D in HTML5 using three.js

Let’s try some 3D things today. I just found a post about using three.js and decided to try it. Three.js website is full of excellent examples, the library is well documented, and there are plenty of tutorials lying around.

I just used the code from the blog post I found. Looks like using three.js is really simple. It should be easy to use it along with my favourite HTML5 game engine, ImpactJS. I was working on a tabletop game prototype, and three.js would fit perfectly to add some 3D awesomeness.

CSS – steps()

CSS animations are fun. I don’t have a lot of experience with them, so it’s the time to change it. First related thing on my “to learn” list is steps() function, for some reason.

steps() function is used for making non-fluid animations. It’s nothing big, so I’ll just drop a link here: How to Use steps() in CSS Animations If you have no experience with CSS animations, this is an excellent starting point.

The trick consists of two parts: you define the animation function:

.tick-tock {
    animation: tick-tock 60s steps(60, end) infinite;
}

the syntax is “animation: <keyframe definition name> <animation length> steps(<number of frames>, <direction>) <iteration count> <direction>;”

then you define the keyframes:

@keyframes tick-tock {
    to {
        transform: rotate(360deg);
    }
}

and that’s it. I tested it out in my lab: http://lab.acedude.pl/css-animations-steps/

It works. Best post ever.