Game
The Maestros
9 years ago

The Maestros RTS - DevLog 03: How to make a unit


Hi everyone! My name is Taylor, and I’m one of the engineers on The Maestros, a fast-paced team RTS game. We’re excited to be in a brief open alpha period! Come download our game and play with us for free: http://maestrosgame.com/download.html

Today I wanted to talk about how we design and create new units (characters you control) in our game.

5d0bf7a730978.gif

What’s an RTS game without cool units? We spent a lot of time creating a flexible system that allows us to create, change, and test units in our game. This short overview gives a step by step guide for how a unit is made. Given I’m on the engineering team, this will definitely be more technically skewed, but we will have a designer’s version of “How to Make a Unit” and an artist’s version coming soon.

Step 1: Design & Art
Our units start out as ideas:

“Let’s make a big tanky unit”: The Juggernaut

5d0bf7a8f3b0d.gif

“What would a long range unit look like?”: The Aimbot

5d0bf7aa4b5dd.gif

Usually these ideas come from the design team but anyone on the team is free to input their ideas. Once we have a cool design we work with artists to help envision the lore of the unit. Our concept art for the Juggernaut shows a big, hulking metal robot. “What should his ability be?” “Uhhh how about he rushes in and throws enemy units in the air?”. Makes sense! Or we start with a cool ability idea then create the unit afterwards. Either way, we will always involve an artist to create some initial concept art.

Step 2: Components & Data
After we have our initial design, we need to get the unit into code. A unit in code is comprised of multiple “components”. Let’s look at the Doughboy, our base unit in the game.

Doughboy

5d0bf7ab48889.gif

He has an attack component which enables him to attack enemies. His movement component allows him to run around the map. And his animation component handles playing animations. Every unit in our game has these components and are differentiated by their data. For example the Doughboy’s attack damage is much lower than the Aimbot’s damage. A unit’s functionality is determined by his components and the values assigned to the components. The unit’s designer sets his initial unit component values.

A unit’s initial component values are never final and take many iterations to get right. Our designers are constantly tweaking numbers to ensure playing the game is both fun and balanced. To store each unit’s attributes we use JSON files. A JSON file is a data file containing a list of key-value pairs. When the game is started up, each unit will check his corresponding JSON file to create his components. A unit would look in his JSON for “speed” to assign his movement speed in the move component. We use a tool one of our engineers built to create and edit JSON files.

JSON Tool

5d0bf7ac1fef7.png

This is what a unit’s attack component looks like in our tool. A designer can edit values such as “damage” which will be read by the unit when the game runs. This tool allows our designers to edit units without having to mess with code.

Step 3: The Ability Component
The final component that our new unit is missing is an ability! This component takes an entire step because we can’t reuse the same ability component on every unit. The Euler’s Sploosh ability component is wildly different from the Conductor’s electric shock ability. The ability component requires an engineer on the team to code new functionality for a unit. Of course some re-use of code occurs between abilities, but often most of the functionality requires new behavior to be programmed and tested.

Let’s look at the Euler.

5d0bf7ac7ccb3.gif

His ability should function as “throw a tar ball at a location, when it hits it slowly spreads out and slows enemies.”

Sploosh Ability

5d0bf7b0c8c68.gif

An engineer would come in and code what it takes to throw the projectile and slow enemies. But afterwards there is some missing data. How far can he throw the tar ball? How much does it slow by? What is the radius of the tar? These values are once again pulled from JSON. By using our data driven system here as well, designers can make balance changes frequently.

Step 4: Balancing
Our final step is on-going. Once a unit has been tested and is ready for play, designers can begin tweaking a units numbers. Because of our JSON data system, it is easy for designers to change almost anything about a unit. We can boost the damage of an ability or even change how quickly a unit’s health regenerates. Also in this final step artists may revisit the unit to give it some finishing touches.

5d0bf7b22fdab.png

Closing
This was just a brief overview of how we make units in the Maestros. We’re looking forward to releasing new units soon. See you in the alpha!

Best,
Taylor



0 comments

Loading...

Next up

The Maestros has released on Steam Early Access!

The Maestros Update 1 - Bots, Bots, Bots!

The Maestros - DevLog 01 - a Resourceless RTS with Transforming Armies

Smile! Here, take some happy pills! ✨💊 #Blender #3DModelling #3DArt Buy me a Ko-fi: https://ko-fi.com/barbarafb_

Finished a project I've been working on over the last few days!

Modeled and textured in Blender.

#3dart #lowpoly #npbr #fantasy #hut

Sometimes the suction cup get sticky. Small animation I made in Blender after doing my tutorial on picking up/dropping objects in animations. Crate model by jQueary (https://sketchfab.com/3d-models/game-ready-sci-fi-crate-d98deca6…).

In the quest for accessibility, I'm adding Resurrection Shrines for players on the 'novice' end of the platforming spectrum.

In order to unlock the power of a Shrine, you must collect 3 'Souls' from your dead corpses! (the floating blue orbs)

Back in my art school days I used to ride the 710 COPSA line from Parque Del Plata to Montevideo almost everyday. This is the Marcopolo Viaggio G4 Mercedes Benz model from the late 80s, one of the older bus models that was running on the line.

Finished work on the emotions of a new character for the tank universe

A Shiny Mega Gengar 🌟 For @ManutkArt 's #ThreeColorsChallenge!