< All Topics

Semantic Versioning (SemVer)

Description

Edit

Semantic Versioning (SemVer) is the standard “Language” for version numbers.

If your game is version 1.5.2, those three numbers mean something very specific. As a Tech Lead, you must enforce this so your team (and players) know exactly what changed just by looking at the number.

The format is: MAJOR.MINOR.PATCH


1. The Numbers Explained

X.0.0 -> The MAJOR Version

Meaning: “We changed everything. Old stuff might break.”

  • When to change:
    • In Software (APIs): You made a change that breaks backwards compatibility. If a user updates to 2.0, their old code will crash unless they rewrite it.
    • In Games:
      • Leaving “Early Access” (0.9 -> 1.0).
      • A Massive Expansion Pack (DLC) that changes core mechanics.
      • A Save Game Wipe (players lose their progress because the data format changed).

0.X.0 -> The MINOR Version

Meaning: “We added cool new features, but everything else still works.”

  • When to change:
    • In Software: You added a new function JumpHigher(), but Jump() still works fine. It is backwards compatible.
    • In Games:
      • A Content Update (New Levels, New Weapons, New Characters).
      • A Seasonal Update (Season 2, Halloween Event).
      • Save games are safe.

0.0.X -> The PATCH Version

Meaning: “We didn’t add anything new, we just fixed bugs.”

  • When to change:
    • In Software: Internal tweaks to performance or bug fixes. No API changes.
    • In Games:
      • “Fixed a bug where Mario falls through the floor.”
      • “Reduced shotgun damage by 5%.”
      • “Fixed a typo in the menu.”
    • Crucial Rule: A Patch never adds new content. It only repairs existing content.

2. The “Pre-Release” Tags (The 4th Section)

Sometimes 1.0.0 isn’t ready, but you need to give it to testers. You add a hyphen -.

  • Alpha:1.0.0-alpha.1
    • “This is extremely unstable. It might crash your computer. For internal Devs only.”
  • Beta:1.0.0-beta.3
    • “Feature complete, but buggy. For QA and Beta Testers.”
  • Release Candidate (RC):1.0.0-rc.1
    • “We think this is done. Unless a catastrophic bug is found, this exact file will become 1.0.0.”

3. How to Automate This (DevOps)

You should not update these numbers manually by editing a text file. You will forget.

The Tech Lead Strategy:
Use Git Tags.

  1. The Git Workflow:
    • You push code to Git.
    • When you are ready to release, you create a Tag: git tag v1.2.0.
  2. The Automation (UAT/Jenkins):
    • Your build script runs.
    • It asks Git: “What is the latest tag?” (git describe --tags).
    • It gets v1.2.0.
    • It automatically injects that number into the Game’s UI (bottom right corner of the Menu) and the .exe metadata.

4. Special Case: The “Build Number”

Often, games use 4 numbers: 1.5.2.4502

  • MAJOR.MINOR.PATCH.BUILD

What is the Build Number?
This is an internal counter that goes up +1 every time Jenkins builds the game.

  • Why do you need it?
    • You release Patch 1.5.2.
    • A tester finds a crash.
    • You fix it and build again. Technically, it’s still Patch 1.5.2 (you haven’t released it to the public yet).
    • But now you have two 1.5.2 files! How do you tell them apart?
    • You look at the Build Number: “Crash was in 1.5.2.100, fixed in 1.5.2.101.”

5. Why this matters for Save Files

This is the most dangerous part of Game Dev.

Scenario:

  • Player saves game on Version 1.2.0.
  • You update game to Version 1.3.0 (Added a new “Stamina” stat).
  • Player loads save file.
  • Crash! The game looks for “Stamina” in the save file, but the file was created before Stamina existed.

The Fix (Version Checking):
Inside your Save/Load code, you check the SemVer:

codeC++

if (SaveFileVersion < 1.3.0) { // Old save file! Player.Stamina = 100; // Set a default value manually } else { Player.Stamina = SaveFile.ReadStamina(); }

If you don’t track SemVer strictly, you cannot write this migration code, and you will corrupt players’ saves.

Summary

  • Major (1.x.x): Breaking changes (Save Wipe / DLC).
  • Minor (x.1.x): New Features (New Level).
  • Patch (x.x.1): Bug Fixes only.
  • Build (x.x.x.100): Internal counter for tracking specific executables.