Sci-Fi Architecture and Some Other News

Hello Hello Hello, I’m back again. I’m going to make this a big update since I haven’t posted in a while. I’ve got an asset showcase for you.

First, a little backstory . . .

When creating alien art styles, I took a lot of inspiration from the species of Star Trek. Some of you might be able to see this if you look closely enough at each species in the game.

Each one has it’s own unique architecture and color scheme that I believe is reflective of the traits of that species (or at least it will be once I write the story for the game).

So with that in mind. Here are a series of images showing off the styles of each species:


Here are some alternate versions of modules just to add some variation within an alien architecture:artifician_wallbellumturan_wallcerebturan_wallhuman_wallinsecturan_wallmachinulan_wallmalnuran_wallmendacian_walltransitorian_wall

This artistic project was something I debated doing because it was a larger amount of time to spend on art than I originally wanted to. But I think in the end it was necessary because it helps the player to differentiate what kind of ship they are aboard and really helps to give them a reference point when they are moving between different ships.

I used a couple programs to help me do this faster.

I used Imagemagick to do batch image color conversions – so I could reuse some models but give them different color schemes. I created .bat files with ImageMagick console commands to convert hundreds of images to different color schemes relatively quickly:

@echo off
echo Converting Colors . . .

mogrify *.tga -fuzz 4000 -fill #714f4c -opaque #d9d9d9 *tga
mogrify *.tga -fuzz 4000 -fill #704600 -opaque #8f8f8f *tga
mogrify *.tga -fuzz 4000 -fill #242424 -opaque #242424 *tga
mogrify *.tga -fuzz 4000 -fill #9f4000 -opaque #31b5b4 *tga
mogrify *.tga -fuzz 4000 -fill #311e02 -opaque #6b6b6b *tga
mogrify *.tga -fuzz 4000 -fill #250000 -opaque #688282 *tga
mogrify *.tga -fuzz 4000 -fill #b27f09 -opaque #b2b2b2 *tga
mogrify *.tga -fuzz 4000 -fill #311e02 -opaque #474747 *tga

echo Done.

For example to convert red to blue and green to cyan etc. etc.

I also created my own simple program to do color conversions on GUIs – which are all in a text format. I havn’t been able to look at the engine’s parser for these files so I just do simple find and replace. I could have used PowerShell to do these text substitutions but I have created find and replace programs in the past – so I preferred to do it in c++:

// find_and_replace.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include "dirent.h"

#include <sstream>
#include <fstream>
#include <iostream>
#include <vector>
//typedef std::vector <std::string> DirListing_t;
void GetDirListing( std::vector <std::string>& result, const std::string& dirpath ) {
	DIR* dir = opendir( dirpath.c_str() );
	if (dir) {
		struct dirent* entry;
		while ((entry = readdir( dir ))) {
			struct stat entryinfo;
			std::string entryname = entry->d_name;
			std::string entrypath = dirpath + "/" + entryname;
			if (!stat( entrypath.c_str(), &entryinfo )) {
				if (S_ISDIR( entryinfo.st_mode )) {
					if (entryname == "..") {
					} else if (entryname == "." ) {
						result.push_back( dirpath + "/" );
					} else {
						GetDirListing( result, entrypath );
				} else {
					result.push_back( entrypath );
		closedir( dir );
void FindAndReplace(std::string& str, const std::string& oldStr, const std::string& newStr){
	size_t pos = 0;
	while((pos = str.find(oldStr, pos)) != std::string::npos){
		str.replace(pos, oldStr.length(), newStr);
		pos += newStr.length();
class Substitution {	
	Substitution( std::string init_find, std::string init_replace );
	std::string find;
	std::string replace;
Substitution::Substitution( std::string init_find, std::string init_replace ) {
  find = init_find;
  replace = init_replace;
int main() {

	std::vector <Substitution> Substitutions;

	//Substitutions.push_back( Substitution("background","REPLACED1") );
	//Substitutions.push_back( Substitution("backcolor","REPLACED2") );
	//Substitutions.push_back( Substitution("transition","REPLACED3") );

Substitutions.push_back( Substitution("0,0.58,0.7,1","0.83,0.48,0.59,1") );
Substitutions.push_back( Substitution("0.1,0.1,0.1,1","0.2,0.1,0.15,1") );
Substitutions.push_back( Substitution("0,0.29,0.35,1","0.4,0.2,0.3,1") );
Substitutions.push_back( Substitution("0 0.58 0.7 1","0.83 0.48 0.59 1") );
Substitutions.push_back( Substitution("1 1 1 1","0.77 0.5 1 1") );
Substitutions.push_back( Substitution("0 0.58 0.7 0","0.83 0.48 0.59 0") );
Substitutions.push_back( Substitution("0.85,0.12,0.12,1","0.85,0.67,0.85,1") );
Substitutions.push_back( Substitution("0 0.58 0.7 .5","0.83 0.48 0.59 0.5") );

	std::vector <std::string> dirtree;
	GetDirListing( dirtree, "/test/testing" ); // this is C:\test - you can put the gui folder in here. - it should work.
	for ( unsigned int n = 0; n < dirtree.size(); n++){ // cycle through each file in the directory - including in any subdirectories
		if ( dirtree[ n ].find(".gui") != std::string::npos || dirtree[ n ].find(".pd") != std::string::npos ) { // specify file extensions to allow
			std::ifstream t(dirtree[ n ]); // read
			std::string str( (std::istreambuf_iterator<char>(t)), std::istreambuf_iterator<char>() ); // read
			for ( unsigned int i = 0; i < Substitutions.size(); i++ ) {
				FindAndReplace( str, Substitutions[i].find, Substitutions[i].replace );
			std::ofstream output_file(dirtree[ n ]); // write
			output_file << str; // write
			std::cout << dirtree[ n ] << "\n";
	return 0;

Now that I’ve got a big enough library of models completed and textured, I’m going to start putting all these structures together to create starships. I will have to model the ships and come up with unique floorplans for each one. This is something I have been looking forward to for a long time. It will be challenging but I think it will be fun. I mean, who doesn’t like to build their own starships?

Thanks for stopping by. I’ll try to get another update out this month.

Leave a Reply

Your email address will not be published. Required fields are marked *