Redout Companion

Redout Companion is an app designed to be used with the game Redout: Enhanced Edition. The main feature of the app is the target times. It tracks a user's best laptimes, compares them to the world record, and gives them a target time based on their performance on all tracks. The other important feature is reading Steam inventory data for the game to show users what liveries/colors they have unlocked and how many. The app also features a partial track guide.

Downloads

Technical Information

Project Details

IDE: Gamemaker
Languages: GML
Stage: Production/EOL
Notes: This is a public app people still use today. The android version of the app used to be on Google Play however the version of Gamemaker its made it no longer meets their app requirements. Many of the assets and lore were supplied by the developers themselves.

Notable Features


For every hour played in Redout you get a random Steam inventory drop. This can either be a new color scheme or livery to be applied to your ships in game. The inventory on Steam's side is unsorted making it hard to catalouge what you have, what you want to trade, and what you want to trade for. My app pulls this data and sorts it for you.

Colors

Liveries

Code Example

jsonMap = json_decode(jsonRaw)
if (jsonMap[? "success"] = 1)   {
	resetInventory()
	descriptionsList = jsonMap[? "descriptions"] //Descriptions/names for each possible inventory item
	assetsList = jsonMap[? "assets"] //Users inventory items
	nameMap = ds_map_create()
	for (var i = 0; i < ds_list_size(descriptionsList); i++)    {
		description = descriptionsList[| i] //List Accessor
		classId = description[? "classid"] //Hash Map Accessor
		nameMap[? classId] = description[? "name"]
	}
	for (var i = 0; i < ds_list_size(assetsList); i++)  {
		asset = assetsList[| i]
		classId = asset[? "classid"]
		name = nameMap[? classId]      
		if (string_pos("-", name) != 0 )    { //Livery: "WILD - CONQUEROR CLASS III"
			dashPosition = string_pos("-", name)
			classPosition = string_pos("CLASS", name)
			nameLength = string_length(name)
			liveryId = liveryMap[? stringSub(name, 1, dashPosition-2)]
			shipId = shipMap[? stringSub(name, dashPosition+2, classPosition-2)]
			classId = classMap[? stringSub(name, classPosition+6, nameLength)]
			writeLivery(liveryId, shipId, classId)
		}
		else    { //Color: "Golden Lime"
			colorId = colorMap[? name]
			writeColor(colorId)
		}
	}
}

JSON Sample

2x Tangerine Sunset and 1x Wild Conqueror Class I

{
"assets": [
	{
	"appid": 517710,
	"contextid": "2",
	"assetid": "618523351903078304",
	"classid": "2006427026",
	"instanceid": "0",
	"amount": "1"
	},
	{
	"appid": 517710,
	"contextid": "2",
	"assetid": "618523351903078304",
	"classid": "2006427026",
	"instanceid": "0",
	"amount": "1"
	},
	{
	"appid": 517710,
	"contextid": "2",
	"assetid": "3578683545912617874",
	"classid": "2097502851",
	"instanceid": "0",
	"amount": "1"
	}
],
"descriptions": [
	{
	"appid": 517710,
	"classid": "2006427026",
	"instanceid": "0",
	"currency": 0,
	"background_color": "1490C7",
	"icon_url": "0WUNihj0oGReooIWU_iYWtrQ1ieKy6g8eWff3L-TwAJxFjWYXEfQl0DuVzrH-2jFrSeEgbT7m961FBuuC-wLtgazO60u",
	"icon_url_large": "0WUNihj0oGReooIWU_iYWtrQ1ieKy6g8eWff3L-TwAJxFjWYXEfQl0DuVzrH-2jFrSeEgbT76t22EuKAY62P",
	"descriptions": [
		{
		"type": "html",
		"value": "Tangerine Sunset ship color scheme.
Common." } ], "tradable": 1, "name": "Tangerine Sunset", "name_color": "FFFFFF", "type": "", "market_name": "Tangerine Sunset", "market_hash_name": "Tangerine Sunset", "commodity": 1, "market_tradable_restriction": 7, "market_marketable_restriction": 7, "marketable": 1 }, { "appid": 517710, "classid": "2097502851", "instanceid": "0", "currency": 0, "background_color": "1490C7", "icon_url": "0WUNihj0oGReooIWU_iYWtrQ1ieKy6g8eWff3L-TwAJxFjWYXEfQl0DuVzrH-2jHrX200fCU957gKgSvRPAJ__okeLt8crEd", "icon_url_large": "0WUNihj0oGReooIWU_iYWtrQ1ieKy6g8eWff3L-TwAJxFjWYXEfQl0DuVzrH-2jHrX200fCU957gWwesQm6oVzm6", "descriptions": [ { "type": "html", "value": "WILD livery option for the CONQUEROR Ehawee ship.
Common." } ], "tradable": 1, "name": "WILD - CONQUEROR CLASS III", "name_color": "FFFFFF", "type": "", "market_name": "WILD - CONQUEROR CLASS III", "market_hash_name": "WILD - CONQUEROR CLASS III", "commodity": 1, "market_tradable_restriction": 7, "market_marketable_restriction": 7, "marketable": 1 } ], "total_inventory_count": 3, "success": 1, "rwgrsn": -2 }

Steam API Link

https://steamcommunity.com/inventory/76561198048878166/517710/2?l=english&count=5000

What I learned

Lessons

I learned two main things with this project. The first was using/interacting with APIs and reading JSON files. Specifically Steam's inventory. This second new thing I did with this project was access and cache remote data. World records are stored remotely to allow me to update that data without pushing a client update. The Track Guide image files are streamed in as needed to reduce app file size.

Mistakes

The biggest mistake I made on this project was not writing clean maintainable code. The app was originally designed to just provide target times and a track list randomizer. Once the app released to the Redout community they began to make suggestions. In order to keep up with demand I began wrote code as quickly as I could using very few functions, hard coded many values, and used a lot of global variables. This serverly limited my ability to revamp the UI when things began to get crowded. As a result the final form has very poor UX.

Image Gallery

Image 1

Image 2

Image 3

Image 4

Back to Top