• entries
  • comments
  • views

About this blog

Yet another journal of an aspiring indie game developer.

Entries in this blog


Hey everyone - long time no post. Sorry about that. :) I landed my dream job over a year ago and have been pretty busy since then. I'm working at Harebrained Schemes on the new turn-based Battletech game. The last one was over 20 years ago! :D Come check it out at:

Today I'm going to talk a little bit about a metadata database (That's really fun to say btw) and how you might use it in your projects.


What is a metadata database?

Let's start with a couple of definitions. Metadata is just data about other data. And a database is just a structured way of storing and accessing data. So... a metadata database is a structured way of storing and accessing data about other data... Is your mind blown yet?

Why use a metadata database?

I'm going to look at our units for this example. We have a bunch of units with lots of data stored in separate files. Our unit metadata contains things like the filename, the type of unit: mech, vehicle, turret - and tags that describe the kind of unit that it is: medium, sniper, jump_capable. Instead of hard coding our unit spawn points to a specific unit, we configure the spawn point to ask for a unit with the tags "mech" and "medium" to change things up a bit. Without a metadata database, we'd have to load up every single unitdef into memory, and then loop through all of the data to build a list of the units that match, then select a random entry. With a MDDB, we can write a query that returns the list of units that qualify without having to load every single file and load the unit that we need to spawn.

Also, once you put this type of data in a database, you can start writing sql queries to easily get at information. How many maps implement a particular encounter? How many contracts are written for the Escort contract type. Are there any events that can't be triggered because they rely on tags that are never awarded.

Some Library Options

We're using C# and Unity for our project, and these are the main tools we're using for our SQL needs.

Some TagSet Query Code

Here's some C# I wrote that builds a dynamic bit of sql based on the number of required tags and excluded tags. It wasn't trivial so I figured I'd share it. One requirement I'm not completely happy with is that the tags you ask for have to be in the database. At the start of the function I insert the ones that weren't present. It made the sql a little bit cleaner to look at and get right.  For our needs it's not a big deal because we'll only be asking for tags that we care about, but if an end user is typing in random stuff you'll want a slightly different approach.

Also I made one change to the Schema since after the graphic was made. I dropped the TagID and just use Name as the primary key. TagSetTag then drops its TagID column and gets a TagName column to point to Tag. I recommend that datamodel instead of the one shown, but our fans made the graphic for the data model and I didn't have a way of updating it easily. :) The code presented matches the old way.

public static List<TagSet_MDD> GetTagSetWithRequiredTags(this MetadataDatabase mdd, TagSetType tagSetType, TagSet requiredTags, TagSet excludedTags)
    // Get the tag rows for the specified tags so we can get their database ids.
    List<Tag_MDD> requiredTagRows = GetOrCreateTagsInTagSet(mdd, requiredTags);
    List<Tag_MDD> excludedTagRows = GetOrCreateTagsInTagSet(mdd, excludedTags);

    // Here's what the query will look like for 2 requried tags and 1 excluded tag
    from TagSet as ts
        -- Required Tags
        inner join TagSetTag as tst0
            on ts.TagSetID = rtst0.TagSetID
        inner join TagSetTag as tst1
            on ts.TagSetID = rtst1.TagSetID
        -- Excluded tags
        left join TagSetTag as etst0
            on ts.TagSetID = etst0.TagSetID
            and etst0.TagID='tag id 3'
        rtst0.TagID = 'tag id 1'
        and rtst1.TagID = 'tag id 2'
        and etst0.TagID is null

    string queryText = "SELECT ts.* FROM TagSet ts ";
    string joinText = string.Empty;
    string whereClause = string.Format("WHERE ts.TagSetTypeId = {0} ", (int)tagSetType);

    // Join to one instance of TagSetTag for each required tag.
    for (int i = 0; i < requiredTagRows.Count; ++i)
        joinText += string.Format(GTSWRT_RequiredInnerJoinFormat, i);
        whereClause += string.Format(GTSWRT_RequiredWhereClauseFormat, i, requiredTagRows[i].TagID);

    // Join to one instance of TagSetTag for each excluded tag
    for (int i = 0; i < excludedTagRows.Count; ++i)
        joinText += string.Format(GTSWRT_ExcludedLeftJoinFormat, i, excludedTagRows[i].TagID);
        whereClause += string.Format(GTSWRT_ExcludedWhereClauseFormat, i);

    // Assemble the query text and return the results.
    queryText = queryText + joinText + whereClause;

    List<TagSet_MDD> tagSetList = mdd.Query<TagSet_MDD>(queryText).ToList();

    return tagSetList;



Still Having Fun

Lots of updates but not enough time to do them justice. Here's a quick bulletpoint list.

  • Sold my house back in Tennessee. That went very smoothly and it went to a good family. \o/
  • Daughter switched schools again. She's liking it, and the math is finally a challenge.
  • Still working hard at work. I've made several terrain tools, worked on some cool Inverse Kinematics stuff, and now I'm working on the level design tool for Battletech. I plan to share a little of what I'm doing and write up some techniques, but there's just no time!
  • I'm guest starring on a live Battletech RPG show on twitch. It's on HyperRPG and called Death From Above. There's an RP session where the story unfolds and a tabletop session where we play on a custom board with oversized miniatures and inflict actual damage to the mechs as they take hits. That's on Fridays at 6:30pm PST. Next Friday is my last session for a bit.
  • And I'm captaining a team for a boardgame fundraising event at Mox Boarding House. It's called the Gauntlet and it's raising money for YouthCare. If you donate, not only do you help homeless youths, you also give my team power ups for the board game tournament. Plus checkout my sweet incentives! :D It's on Sunday May 15th, [s]so hurry and donate before it's too late![/s] It's too late to help my team, but you can still feel free to give money to YouthCare.





Living the Dream

Sorry for the lack of updates. As it turns out, living the dream is hard work. I'll make up for it with a really big post instead. smile.png

Personal Update:

So, we rented an apartment really close to work and my daughter's school. Car shopping has been terrible. The first car we went to go look at stank. And I'm not talking old-car smell. I thought I was in the Seinfeld episode with the stinky car. The next three we looked at also had a smell and a fourth had a rattling engine sound. Luckily my mom wanted to get a new car so she's selling me hers. That should get shipped to us sometime this week.

Our apartment is starting to shape up after weeks of it being jam-packed full of boxes. We bought a ton of furniture from IKEA and most of our stuff now has a place. It's still a little bit crowded so I'll be giving away some more of my stuff. We FINALLY got everything straightened out with Comcast and have our computers connected to the interwebs. It's been about three weeks since I've played anything, but with the unpacking nearing its end and the car due in soon, I should have some free time soon.

Home stress levels have been much higher than I thought they would be. We had a good family cry about missing our friends, family, and home a week ago. Normally, I don't have to deal with those pesky things called feelings, but this was a significant enough event to register in my robot heart. We're all feeling much better now though. Stupid feelings. tongue.png

Oh, and last week my daughter and I went to space camp which was awesome! My mom bought us tickets when we were still in Tennessee. What should have been 4 hours worth of driving turned into over 11 hours of flight and 2 hours of driving. (Still worth it!) On the way down, we spent the night at my mom's and I got to see a couple of my gaming buddies which was fun too. I'll post a link to my Facebook album when I get around to uploading my pics.

Development Update:

Week 1
Work has been a little bit stressful, pretty hard, and very cool. I had a computer waiting for me on the first day which was nice. At my last job, a guy waited over a month for his computer... And yes, he was a programmer. >.<

Anyway, they threw me in the deep end but so far I'm doing fine. I fixed a few bugs, and added some features to a couple of 3rd party terrain tools we're exploring: Gaia Stamps, Relief Terrain Pack, and Terrain Composer. The main thing I worked on this week was writing a New Map tool for Mike Hines the Technical Art Director. Basically it copies a source scene in Unity, does some automatic setup for new levels, and fixes all the references in the new scene. If you've ever tried copying a complex scene in Unity, it can do some weird things.

Harebrained Schemes helped launch a new twitch channel named HyperRPG. The launch event was a 48 hour charity stream and they needed warm bodies to fill Sunday 5am-12pm so I volunteered. They just told me we'd be playing board games and talking, but I felt like I was in a fruity-oaty bar commercial. But I got to slap a guy at least. biggrin.png Internet personality Goobers said that if anyone donated $200 someone on the show could slap him. He hadn't seen all of Firefly so I tagged him pretty good. smile.png


They have some interesting content with a MechWarrior campaign where they RP on Tuesday and play on a custom board with large scale mechs that they mangle as they're damaged on Friday. There's also a Shadowrun campaign and other nerdy goodness there. Check it out.

Week 2-3
Mike came up with a cool way to use Terrain Composer to switch between painting Art and Game Design features so I worked on a tool to automate switching between those modes. I also worked on extracting the different game design masks that get painted down. For example, a level designer paints down an area of forest and I'll save out the mask to a PNG that can be read by the game logic. Then as mechs move through the forest areas, it slows them down and affects their targeting numbers.

General Coolness:

Being a Battletech fan boy, it's been pretty awesome in general. I get to hear the story writers talk about different characters and paths of the story. I get to see the concept art for different characters, buildings, and environments take shape. I get to play the prototype and feel how the game mechanics work out. Not only that, I get to help guide the process. smile.png

The team is awesome too. They're nice, smart, and fun to be around. It very much feels like a family. Most teams I've been on in the past there's been some less than stellar talent or even some dead weight on the team. But everyone I've been exposed to has proven themselves to be very useful and highly skilled. Plus, the leadership of the company is honest, forthcoming, and they're just great guys.

And to top it all off, when Jordan Weisman comes into the office, he sits at the end of my row. biggrin.png

I can't believe how lucky I was to get this job.

  1. It's a game development job
  2. For a game that I love
  3. For an out of state company
  4. And me without any professional game development experience
  5. Without knowing anyone in the biz
  6. And it turns out the job rocks
  7. And the team rocks
  8. And even the new city rocks.

It's ridiculous. smile.png Thank you God. I'm not sure what I've done to deserve this, but I sure do appreciate it.

Tip from your Uncle Eck:

Living the dream isn't all sunshine and rainbows. It's hard work, it requires sacrifices, and making the transition can be more than a little stressful. It's definitely not for everyone.

Lucky for me I didn't throw away my amazing life for a shitty job that I just thought I wanted. Now... to find a new gaming group.


Ramping Up Unity Terrain

Personal Update:

So right now, I'm flying across the country with my immediate family. We each have about 3 days worth of clothes, the Chromebook, our phones, and that's it. We gave away or donated lots of our stuff, all of our furniture, and even our cars. The remaining stuff, we crammed into the POD and finally finished loading it Monday evening. They picked it up Tuesday and started trucking it across the country. It takes an estimated 10 days to get there so it will be the 27th at the earliest before we have access to our stuff. That includes our computers! >.< But first, we'll have to find a place to live or we won't have a spot for our stuff to be delivered to. smile.png

Tuesday and Wednesday was all home repair, cleaning, and last minute tasks. It was really sad saying goodbye to my mega awesome Game Room. It was so empty. sad.png My family, friends, and I made a ton of good memories there. It was also especially profound to me when I was looking at my empty keychain. No house - no car - and most of my possessions are in my garage waiting for the donation crew to come pick them up. I'm saying goodbye to the life I've known for nearly 20 years. O.O

TODO - Pic of empty game room and key ring.

My wife has been looking at houses/apartments online and we'll be checking some out later in the week.

Development Update:

Since one of the first tools I'll be working on is a ramp tool for the level editors, I dove into learning about Unity Terrain. (The computers were the last things to get loaded smile.png ) Terrain geometry in unity is handled behind the scenes by a 2d heightmap. Each pixel on the heightmap corresponds to an area in the terrain and you can change the form of the terrain by modifying this data. Unity terrain also has the data for trees, grass, and wind zones baked in.

After my research, I decided to get a simple terrain effect working. I wanted to level out a circular platform where the user clicked. The first thing I got working was converting mouse coordinates over to terrain coordinates.

TODO - Conversion details, and code samples.

Once I had the proper terrain coordinates, modifying the terrain was a simple matter of using GetHeights to pull a list of nearby terrain cells, modifying a circular pattern to the appropriate height, and then using SetHeights to set the data.

I'm writing this entry on the plane so I'll come back and share some code samples after I find a place and get my computers back online.

I can solve the trivial case of orthogonal oriented ramps, but I need some help for arbitrarily oriented ramps. I understand how to draw a pixelated "line" of terrain on the map using something like a Bresenham line drawing algorithm, and lerping the height to create the ramp. But that would only be one cell (pixel) thick. I thought about "walking" along the path and drawing perpendicular lines of the appropriate height, but I'm worried it will generate holes in the integer terrain coordinates. Maybe not though.

I could build an orthogonal ramp, and then rotate it appropriately with some matrix math, but that assumes the ramp will be straight. If some level editor wants a ramp to curve around the terrain of a hill, the solutions I'm thinking of won't work. I'll need to allow them to drop a couple of control points and somehow trace that arbitrary path to build the width of the ramp. I need to talk to the artists to see what they want and talk to the lead developer to bounce my ideas off of him.

Next up, I worked my way through some more editor tutorials. One in particular showed me how to allow the user to place control points for lines, curves, and splines, so that's going to be useful for sure.

Sorry for such a long post. It's a long flight! My first official day is Monday Feb 22nd. My next post probably won't be until the 28th, but I'll be sure to tell you all about it. smile.png

Unity Gotchas:

GetHeight returns the height of the terrain in height adjusted units. If you have a 1200 scaled height terrain, it would return a value between 0 and 1200. But GetHeights and SetHeights return and expect float values from 0 to 1.

Unity stores the heightmap as a 2d texture. Changes to the heightmap modify that texture permanently and the changes aren't "undone" between runs. So if you're hoping to deform the terrain during a game, know that you'll need to keep a copy of the original to restore the terrain between each run.

Tip from your uncle Eck:

I'm a little low on relevant wisdom to share, so I'll give some more life advice. Don't give people two options when one of them is wrong. This is especially true for ladies and their husbands. Ladies, we want to make you happy! Just tell us what you want! :)



Personal Update:

Who has two thumbs and just accepted a gig at Harebrained Schemes working on the new BATTLETECH game?!?!?


This guy!

I submitted my resume and portfolio hoping against hope that they would choose me... AND THEY DID! I'm now the new Tools Engineer for the project.

Two days after they said I'd need to wait for a couple of weeks to interview the other candidates, they sent me an offer letter. (I wonder if there's a funny story there) I thought I'd have more time to prepare!!! O.O Now I need to move my family across the country from Tennessee to Washington state in the next week or two. We're scrambling to pack-up all the stuff we plan to keep and giving away the rest to friends and family members. This is a huge life change, but my family is behind me 100%!

Why is it my dream job? Well, being a for-reals game developer has been one of my goals for a while now. I was prepared to do it on my own, but then I heard Harebrained Schemes were hiring a few developers for the new BATTLETECH Kickstarter project. I've been playing BTech and nearly all of it's variations for 30 years now so I'm a big fan of the franchise. Take a look at my collection if you don't believe me: Eck's Battletech Stuff. So for me, this isn't just A game development job. This is THE game development job.

I've been focusing my efforts over the last several years to give myself a chance to become a game developer on my own. I'm happy I did, because without this preparation, I don't think I would have even been considered. And if I wasn't financially secure, I couldn't have accepted the offer in the first place. It's expensive to move across the country!

I'm super stoked!!!

It hasn't been all sunshine and happiness though. Dreams come at a price. I am saying goodbye to some awesome friends I've had since college. They're happy for me landing my dream job, but they're also very sad to see me go. I've already had a few tearful goodbyes and there's probably still a few more of those in the future. I've hosted Game Day every other week for nearly 15 years now... We probably won't sit at the same physical game table again. I'll keep in touch digitally, but it's not the same. sad.png Maybe after things settle down, we'll get some virtual tabletop action going.

Development Update:

I spent some time working on content generation tools for quests. I was just shy of finishing that since I was offered the job and since then I've been doing home repairs, packing, and donating stuff. I do still plan to finish the game, but A Voxel Adventure is on hold for the near future. I'm planning on focusing on content generation tools so my wife can develop some quests, monsters, and gear for the game while I work on being a badass code ninja at work. smile.png

Tip from your Uncle Eck:

If you're a software developer, you probably have the luxury of being well paid. So put in a little effort to get financially secure. You never know when you might need that extra money.

Apply for your dream job even if you "know" they will say no... Cause they might say YES! biggrin.png


Personal Update:

Woohoo, my previous journal on Unity's Content Pipeline got featured. :D

Snow-pocalypse 2016 has hit Tennessee! I think Nashville received five inches of snow and even the airport shut down. We're a little further south so only got about two inches.


This is the dogs' first snow day and they didn't know what to make of it. Malcolm barks at anything different, so his first couple of trips out he kept leaping into the air barking at the snow.

Development Update:

I continued my dive into tools development and decided to look into extending the editor. A Voxel Adventure will be data driven by various XML files (or JSON, or whatever) so the various game objects will be modable by the community (monsters, weapons, quests, etc). While hand-editing XML files isn't difficult, having a dedicated editor window will greatly speed up content generation. And with a little extra work, you can show where any problems are.

Here's what I have so far:

The panel on the left shows a list of all the monsters categorized by type. When a monster has a validation error, the category and name are colored red to draw your attention to problems. The panel on the right shows the selected monster and allows you to edit it's stats. It also shows you the model you have selected for that monster.

I plan to put in more configuration data for things like scale, and texture tinting to squeeze more mileage out of my assets.

Unity provides several ways to extend the editor: custom menus, custom inspectors, scene gizmos, and custom windows. And they provide several helper classes to make your life easier. When building your own window four classes stand out from the rest: GUI, GUILayout, EditorGUI, EditorGUILayout. They have some overlap and there's not much guidance on when you should use which class, but here's what I've observed.

The GUI classes focus on producing controls and elements that would be useful in a game's UI. The EditorGUI classes focus on elements that are more useful in the editor's UI. The Layout classes let you construct series of automatically laid out controls whereas the non-layout classes give you manual control over everything.

Here's an incomplete code sample:

// Make a class and inherit it from EditorWindowpublic class MonsterDatabaseWindow: EditorWindow{ // Add a MenuItem attribute to a static method and it shows up in the menu bar for you. [MenuItem("Window/EckTech Games/Monster Database")] public static void ShowMonsterDatabaseWindow() { EditorWindow.GetWindow(true, "EckTech Games - Monster Database", true); } // OnGUI gets called every time Unity needs to update the window. public void OnGUI() { EditorGUILayout.BeginHorizontal(); ShowMonsterList(); // Draw the left panel ShowSelectedMonsterData(); // Draw the right panel EditorGUILayout.EndHorizontal(); } // The right panel of data private void ShowSelectedMonsterData() { // Tell the layout class we want a vertical set of controls. EditorGUILayout.BeginVertical(); // This was kind of a weird line at first. This creates a labeled text field // automatically formatted and lined up pretty. We pass in // selectedMonster.MonsterName and it returns the modified value selectedMonster.MonsterName = EditorGUILayout.TextField("Monster Name", selectedMonster.MonsterName); selectedMonster.Level = EditorGUILayout.IntField("Level", selectedMonster.Level); MonsterTypeEnum prevMonsterType = selectedMonster.MonsterType; selectedMonster.MonsterType = (MonsterTypeEnum)EditorGUILayout.EnumPopup("Monster Type", selectedMonster.MonsterType); selectedMonster.Gold = EditorGUILayout.TextField("Gold", selectedMonster.Gold); // ... more control logic here, but you get the point. EditorGUILayout.EndVertical(); }}
And a data file: Spiderling 1 Spider 1d6 Spider Giant Spider 2 Spider 1d6 Spider

Tip from your uncle Eck:

If you don't have the right tool for the job... You can MAKE the right tool for the job. Spend a little time thinking about how you can make your content generators' lives easier. In lots of indie game dev case,s the content developer IS the programmer. So do yourself a favor and make a tool that will make you more productive. Faster cycles equals more or better content.



Personal Update:

I cleaned up my website to better showcase my projects and act like a portfolio. Before it was just a site for my Unity Assets, but now it shows some different projects I'm working on and personal interests. Check it out:

And we finally have a name for my game! "A Voxel Adventure" and a cool looking under development image.

Development Update:

My Edge of the Empire Dice roller will be taking a backseat until after the job search settles down.

Since I'm trying to land a Tools Programmer position, I decided to focus my efforts on the types of problems I'd be facing at my new job. One of the main responsibilities I'd have would be to make the content generators of the team more productive, so I took a look at the workflow for importing new models into A Voxel Adventure.

To make a new model for my game we have to:

  1. Build the model in MagicaVoxel
  2. Export the model to .obj.
  3. Copy the .obj, .mat, and .png to the Unity Directory
  4. Import that into Unity (which acts wonky)
  5. Cobble together a prefab based on step 4 wonkyness

Step 4 was the worst for us, because Unity didn't identify the material so it would create one named default. Sometimes it would find the texture and sometimes not. Then when we would import another model in the same directory, it would overwrite that material with the new texture causing the wizard to be skinned with the spider texture. It also imported the model at the wrong scale so I'd have to hand tweak every model and manually construct a prefab. So it's time to show step 4 who's boss!

Unity provides hooks for the import pipeline through the AssetPostprocessor class. In your editor folder, create a class that inherits from AssetPostprocessor. The two functions I was interested in were OnPreprocessModel and OnPostprocessModel, but there are many more. In OnPreprocessModel, I set the global scale and told it not to import materials. Then in OnPostprocessModel, I load the texture, build the material and attach it to the model's mesh.

Now the prefab is created automatically and our import process is much smoother. I plan to further simplify things by making a Python script to copy over the models from their source directories into their Unity counterparts. If we had a more sophisticated modeler like Maya, we could wire that script directly into our export tool so that clicking the button does everything the artist needs auto-magically.

I also got "weapon hardpoints" working through Blender. It was neat to finally see the empty game objects be pulled into Unity in the right position and rotated appropriately. Now I can drag and drop a weapon into that empty game object and the model looks like he's holding the weapon. There were lots of hoops to jump through and I could propbably streamline that too, but I really hate Blender. I think we'll stick with MagicaVoxel for our modeling tool and solve this problem a different way.


This post got kind of long so I'll wrap up here. I'll also be making a post on extending the Unity Editor soon.

Tip from your Uncle Eck:

Make double sure you type your AssetPostprocessor function names correctly. Unity calls the functions by the text name. So if there's a typo, you won't get any compiler errors. It just won't work... Especially look out for OnPreprocessModel vs. OnPreProcessModel.


Personal Update:

I took a lot of time off over Christmas break just to spend it with my family and work on some Christmas projects. I broke my hermit vows to take my wife and daughter to go see the new Star Wars movie which was really fun. I built a gingerbread 'mech for the family gingerbread contest. And I played the t-total heck out of Elite Dangerous.

Behold the Timberwolf-G:

It was a great stay-cation, but it's time to get back to work.

Development Update:

Last week, I started cleaning up the map generation code and encounter system just to get back into the code. And after much deliberation, I finally have a working title for my game: A Voxel Adventure.

After watching the Force Awakens, my friends and I got bit by the Star Wars bug and started looking into the Edge of the Empire table-top RPG.The game looks really interesting, but I don't like needing special dice. They could have made the symbols more easily translate to regular gaming dice, but instead there's an uneven distribution making a chart hard to memorize. But what really ticked me off was they make a dice app for it and charge $5. I already spent $60 on the gaming book and now I need to buy a couple of sets of $12 dice or $5 for a digital app... Pfft, I'll write my own before I do that! smile.png

So Thursday I decided to get my computer setup for Android development through Unity. This wasn't as smooth as it could have been: the downloads for the Android SDK took quite a while and I had to download a special USB driver for my phone, but I finally got it working. I put in a few hours worth of work into it and here's what I have so far:


You can build your dice pool, upgrade and downgrade dice, and roll them. I'm practically done already. smile.png I then tried the app on my phone... and it was the size of a postage stamp in the center of my display. I knew this would be a problem but I just wanted to see how bad it was without any thought towards it. Turns out... it's completely unusable. Luckily, Unity has some cool components for device and resolution independence that promise to make this problem easy to solve.

This week I'm focusing on prepping for a game development position. I won't be telling you who that is since I don't want to compete with you jokers to get it! biggrin.png After that, I'll probably finish up my dice app and see about publishing it on the store for free (after doing some legal research). And then I'd like to plan the schedule for my development of A Voxel Adventure so I have a better idea of when the release date will be. The next feature I will be working on will be content generation tools so my wife can start working on the story, quests, monsters, and gear while I press forward with more code.

Tip from your Uncle Eck:

How to open a Capri Sun: I see so many people opening Capri Suns incorrectly trying to jam the straw into the angled slim top. Here's what you do. Set the Capri Sun down and face it towards you. Squeeze the bottom so that the top bulges a little. Point your finger away from you and press it down over the top like you're scolding the Capri Sun. Now you have a flat target that you can stab your straw into. Easy-peasy.

I'll post a video later, but for now I need to get back to interview prep. smile.png


Personal Update:

Last week I spent a lot of time on Christmas projects and family time. I finally finished the quarter-round trim for the laminate floor project we started oh so long ago, and it looks great. We can officially start having people over.

In other personal news, I started teaching my 8 year old daughter how to play Necromunda. For those of you who don't know, it's an older Games Workshop game in the 40k universe and is their take on Hive Gang warfare.


It's never too early to educate our young on the importance of cover and clear lines of fire.

Development Update:

So, the Christmas holidays are starting to cut into game development, I don't have too much to report. Sorry, no video this week! :) I started getting my dungeon and encounter system up and running. I will be data driving damn near every part of the game so that people can make their own monsters, quests, dungeons, maps, towns, etc. Here is a sample of the XML I'm making:
[code=xml:0] Spider 1 Spider 3d6 Spider
These are early files, so they are highly subject to change, but you get the idea. Now that my monster stats are driven by XML files, adding new monsters and tweaking the stats will be easy-peasy.

There are still lots of decisions left to make and I'm sure I'll change my mind more than a few times. I'm debating whether or not I should have the base stats for a level 1 version, and level-up profiles for higher versions, or if I should just have specific monster stats. I'm leaning towards leveled stats for monster types so that I can generate level appropriate themed dungeons.

Next week will be similarly low output. And then the rest of December is likely going to be dedicated to being a good daddy and Christmas awesomeness. My productivity should pick back up at the start of the year.

Tip from your Uncle Eck:

Data drive as much of your game as possible. In addition to making development easier, you'll extend the longevity of your game with your players since they'll make their own mods for it.


Development Update:

So last week I worked on my random dungeon generation and it works like this. I designed several DungeonTile prefabs: Hallways (left, right, straight) Rooms with exits (left, right, straight) a t-Intersection, and a boss room. When a player hits an exit point, a dungeon piece is selected at random, and attached to the dungeon. Right now, the dungeon ends when you've explored the 10th tile with the boss room prefab.

My wife also redid the wizard's hat and added a dwarf model. I'm really liking the look of the player models now. The reason why nobody has any arms is because neither one of us knows anything about 3d modelling, animation, rigging, etc. So I'm going to fake it with manipulating transforms. There will definitely be weapons shown (the visible weapon may or may not change based on actual equipment). We might make a simple voxel arm, but I think the arms will just be invisible.

I ran into several silly road-blocks along the way, but finally worked through most of the kinks this Monday. The main issue I have left is to protect against overlapping DungeonTiles. I might just brute force it for now and generate the entire dungeon at the start, rejecting any dungeon with overlapping tiles.

I'm not sure what I'm going to work on next. I'm starting to get enough dangling features where I need a more sophisticated issue tracking system than my spiral notebook and a text file. smile.png Here are some potential things I could work on:

  • Main Menu system (New Game, Load Game, Options, Exit Game)
  • Loading/Saving the game
  • Generating Planned and Random encounters
  • Better Dungeon Generation Algorithm
  • Loot for Encounters
  • Content Generation Tools (Dungeon Tiles, Equipment, Monsters)
  • Ranged Attacks
  • Spells with cool spell effects
  • More eye candy - Better tiles, Lighting effects from torches, More animations for weapon attacks, etc.
  • Treasure Chests
  • Traps
  • Doors - Open/Locked/Jammed
  • Walls
  • Overland Map
  • Town Options - Buy/Sell - Train - Look for work - Trade out party members.
  • Character Classes/Advancement

    I'm sure that's not everything, but it's plenty to choose from. Even though I still have miles to go, I'm really liking how the game is coming together.

    Tip from your Uncle Eck:

    When you're beating your head against a problem for a good long while and not making any progress, take a break from it. I was chasing my tail for most of Friday and even a little of Saturday. Finally I forced myself to walk away and just let the problem sit on the back burner for a while. Monday, I was able to solve the last of my issues pretty quickly.


Developer Update:

I meant to write my journal about this sooner, but I messed up my project when I was upgrading from the 30-day trial of Grids to the Grids-Basic module. I didn't backup my project before starting (like a noob) and when I tried to import the new library, it did something wonky. Long-story short, I wound up with a busted project so I spent the last couple of days starting a new project and migrating my code over. Two days later, and I'm back up and running.

I put in several bits of polish just to learn the basics of different Unity systems. Music, Animation, Sprites, Tiles, Particles, Sound Effects. I also put in a couple of different monsters with different stats just to mix things up. Here's what it looks like.

In the animations, I'm using events to call out into the game for when to play footsteps or resolve the combat animations. And I'm configuring different sound effects like the slime's footstep. I think the game is starting to look pretty cool.

I'm not sure how much I'm going to get done this week since it's Thanksgiving and Wednesday is already half-over. The next thing I plan to work on is a random dungeon builder similar to Warhammer Quest. Either that or to start data-driving some creature and equipment stats. The next update might not be until 12/05/2015.

Tip from your Uncle Eck:

Backup your project before importing new libraries. >.<

There's lots of great free resources out there. Plug some in for some instant pride. smile.png


Grids Basic - https://www.assetstore.unity3d.com/en/#!/content/12520

The fighter model came with MagicaVoxel
Spider and Slime models built by my wife.

Dungeon tiles for walls/floors

Inventory Master - uGUI

Selected Unit Panel

Character Avatar

Sword Icon

Humanoid Miss
Blade Sounds
Slash 1

Fantasy Sfx

Humanoid Hit

Humanoid Footstep

Slime sounds

Inventory Slot click

Battle Music
Heroic Demise (New).mp3

The Right Equipment

Personal Update

Nothing much, just cruising along. I sold a few more copies of my Floating Combat Text asset for Unity. And I've been playing a lot of Battletech online through MegaMek specifically the 3025 campaign MekWars - MegaMekNet.

Development Update

I made really good progress on an inventory system this week. I started by downloading several free assets just to get some ideas, and I was overwhelmed by the sheer mass of code that was in each of the different modules. Some of that was some interesting stuff for editing item and crafting entries, but tons of stuff was just scattered around in different files. I started to worry that I was taking on too much for 1 week when I saw dozens of files in each Inventory System.

Turns out, they were just crazy because I now have a fully functional Inventory. It took a little more effort than I thought it would, but now I have lots of features:
* Picking up items with your mouse and moving them to different slots.
* A shared party inventory with 24 slots
* A trash slot for destroying items
* A selected character profile with typed slots: Primary, Offhand, Head, Chest, Legs, Feet
* Typed items that only fit in specific slots.
* Item stats.
* A tooltip window that shows you item stats
* Equipping stuff adjusts your characters' stats

I put a little bit of polish on it using some of the assets from Inventory Master, and it has a long way to go before being "DONE", but for now it's a fully functional system.

I'm not really happy with my game's unit stats yet:
* Movement - how many squares you can move
* Attacks - how many attacks per round
* Health - derp
* Melee Offense - Bonus to hit / Damage
* Physical Defense - Enemy's penalty to hit / Enemies Penalty to Damage

I was thinking about a Ranged Offense, Magical Offense, and Magical Defense stats as well, but I think that might be overkill. I wanted there to be a difference between ranged and melee fighters, but it seems a little complicated. I might change the names of the stats to something more standard like Strength, Dex, etc. And just use the stats where appropriate.

The basic mechanic is pretty simple.
Roll to hit + attacker.Accuracy - defender.Avoidance >= a target number
Roll weapon damage + attacker.Strength - defender.Soak

Next week, I think I'm going to focus on a little eye candy. Movement animations, particle effects, monsters, etc. If I make excellent headway there, I'll start data driving some elements like items, classes, monsters, etc.

Tip from your Uncle Eck

When working on a new system, download a few of the free or cheap assets from Unity for some ideas. You might get lucky and it may be just what you need. And if not, it will likely be a good source of inspiration.

Personal Update

I went to a Halloween event at our zoo with the family. I as dressed up as Gru while the kiddo was a minion. There was some recognition, but nothing like the rock-star attention we got when she was George and I was the Man in the Yellow Hat. smile.png

In other personal news, I backed my first Kickstarter for the Battletech project which was successfully funded. They're doing a turn-based game for btech which hasn't been done in like 20 years. I'm really looking forward to it. And here's my Battletech themed pumpkin:

Developer Update

I started looking into grid assets for Unity and found one that I liked with a free demo. So I downloaded the 30 day trial of [http://forum.unity3d.com/threads/gamelogic-grids-a-library-for-hex-tri-polar-and-square-grids.189866]Gamelogic's Grids[/url] and started to learn how to use it. I decided that I wanted to do my learning in a separate project and since I have been playing and having lots of fun with Warhammer Quest, I made my learning project fantasy battle themed. There was also some fantasy warriors in the voxel editor my wife downloaded so I threw them in for some decent visuals. Here's what I have so far:

I had to show you in the editor because Grids won't let me build and run until after I buy it (which I will be doing soon). I've only been working on this for a week, and I already have the following features:

  • Simple sounds
  • A turn-based combat system
  • Floating Combat Text
  • An art style that isn't crappy
  • Simple AI
  • A stat panel for the units
    I've been having so much fun with Warhammer Quest and making my little fantasy game while learning Grids that I decided to switch gears and try to ship this game first. I think it will be easier to deliver and I feel it has more potential at my current skill level. Plus it might lead to some tactical ship boarding in my sci-fi game much later. smile.png

    Grids Review

    After I downloaded the demo, it took me quite a while to get started with it. I messed around for a day reading documentation and poking around in the examples without too much success. It's a module with lots of generics (templates for you C++ people) and it made it tough to figure out what I SHOULD do. Then I stumbled across this post which was my gateway to understanding.


    Once I worked through the step-by-step guidance in this forum post, I was able to start leveraging the coolness of the asset. I highly recommend it.

    The main thing I want to do next week is get a simple inventory system going. Dragging and dropping sprites into slots on a character sheet. I'll also be cleaning up the code since it's pretty much jammed into whatever file I was in when I needed it. smile.png

    Tip from your Uncle Eck

    Take a little time to put in some simple graphics and sound effects. It makes your game look cool and it's highly motivating. I can't wait to get back to it next week. smile.png

    Free Games:

    No one took me up on my offer of free games that I have. Don't be shy people. I'll be posting them on Facebook this week.

    Gone Home: http://store.steampowered.com/app/232430/
    Talisman: http://store.steampowered.com/app/247000/
    Steam Marines: http://store.steampowered.com/app/253630/
    Total War Battles (some stuff): - No link, just some currency and stuff for a ftp game.
    10 Second Ninja: http://store.steampowered.com/app/271670/
    Game Guru (+some DLC): http://store.steampowered.com/app/266310/

Personal Update:

Sorry for the lack of updates lately. I went on a family beach vacation and met my twin nieces for the first time. My kiddo got her stitches out and it's healing up nicely. And the dogs have regressed into chewing pooping machines. >.<

And I signed up for Kickstarter to support the new Battletech project:

Which caused me to take stock of all my Battletech gear for one of the weekly challenges:
Eck's Battletech Photo Album

Development Update:

So I spent a long time refactoring the overland movement code and worked on a trade interface in a separate clean project and got to a spot I was pretty happy with. You could move around in the system of randomly generated planets. Each planet had a random sampling of goods and either produced goods or consumed them. Different ships have different sized cargo holds and travel at different speeds based on hull type and configuration. (all data-driven).

Then I went to merge my changes together... I knew it was going to be a little complicated, but holy crap it took forever. Getting scene objects from one project to another was way more complicated than it should be. At first, I thought I'd have to redo the scene work by hand, but I found out that you could create prefabs in project 1 and then copy them into project 2. Unfortunately this breaks the script references. >.< Supposedly you can export folders with dependencies, but that didn't work for me.

So for 2.5 days, I slogged through my merge process and got it working. Now you can travel from planet to planet, buy and sell cargo, get interrupted with a pirate encounter, and get back to trading.

Tip from your Uncle Eck:

When trying out a new idea in Unity, you might want to keep things in the same project and maybe even the same scene. Working in a separate project for a month meant for some very boring and long hours of merging. >.<

Free Games:

I have a few extra Steam Keys for the following games. If you'd like a copy, say so in the comments and I'll send you a private message:

Gone Home: http://store.steampowered.com/app/232430/
Talisman: http://store.steampowered.com/app/247000/
Steam Marines: http://store.steampowered.com/app/253630/
Total War Battles (some stuff): - No link, just some currency and stuff for a ftp game.
10 Second Ninja: http://store.steampowered.com/app/271670/
Game Guru (+some DLC): http://store.steampowered.com/app/266310/

Game Guru looks like a first person shooter game engine.

Personal Update:

I apologize for the delay in my weekly update. While the kiddo was spending the night at her grandmother's, she broke a glass which sliced her foot open. sad.png The cut was bad enough to need stitches, so we picked her up and took her to the emergency room. We were at the hospital for 4 hours!!! >.< We finally got home around 3:30 am. Blergh. She was a real trooper though. She complained about the wait and her non-injured foot falling asleep, but other than that she was calm and collected. I'm super proud of her.

Development Update:

My main project was getting a little cluttered with some hacky code so I decided to refactor my Overland Map code in a separate project. So I cleaned up my code and got a few things working. You can select a fleet or a planet with a left-click. You can move a ship to deep-space, a planet, or another fleet. And if you're clicking on a spot with several potential targets, it pops up a dynamic quick-selection box with the list of choices. Once you make the selection, it uses the delegate that I pass to finish up the operation I started.

The Overland Map is being populated with randomly colored planets, but you can't do anything meaningful with them yet.

I also decided to do the same thing with Sprites that I was doing with my Composite Primitive Models, but I'm not very pleased with the way things look. Sometimes a ship or the selection box is on a fractional coordinate and the sprites get distorted. I've looked up some articles on getting clean sprites in Unity, but it's a slightly complex task for some reason. If anyone has any quick tips or great articles on the subject, please post a comment below.

I'm much happier with how the code is looking and how the overland controls work now. And I have a couple of directions I can go for better looking sprites. I'm not going to worry too much about the look for now though. Next week, I'm going to focus more on the UI. Showing details about the active ship, its orders, selected planet, etc. I'd also like to start work on the trade system.

Confession time:
The last few weeks, I haven't put as many hours as I should have into game development. sad.png Last week I was hoping to put in extra time, but I don't think I even logged 30 hours. The whole point of me quitting my real job was so I could focus completely on game development. I could place the blame on several things, but no matter what the interruptions are, if at the end of the week I'm not putting in significant effort - then it's ALL MY FAULT.

I'm hoping this was just a temporary slump. I feel like I have a better direction now and I'm excited about my next few tasks at least. But if I don't pick up the pace in the next few weeks, I think I'll look for a real job instead of burning through my savings.

Tips from your uncle Eck:

If you see yourself being lazy, call yourself out on it and get back to work!

When you need to refactor a bunch of code, sometimes it's easier to do so in a clean project. Unnecessary dependencies are easily spotted as you port over only the code you need.

Personal Update:

I had more car trouble with the other vehicle. >.< But this last part should fix it. I'm continuing the bike riding lessons with the kiddo and figured out how to adjust V-brakes properly. And Friday I attended a Reading in Schools event where I read two books to Kaylee's class.


Development Update:

I was pretty lazy development wise last week. Booooo. At least I was a good father though. \o/ I started learning the UI system and got the start of an interactive encounter system going. You can now attempt to flee the encounter. Sometimes it works, sometimes it doesn't.

The interactive encounter system is definitely in a draft state. I started working through the tutorial 7. Making a Generic Modal Dialog and started adapting it for my needs. Right now it supports three buttons (yes/no/cancel) which are tied to delegates that I pass in.

My code has been getting messier and messier. I don't have a concrete final game idea in mind and no design document to speak of. I'm just kind of meandering around features as the mood strikes me and my code is definitely suffering from this lack of vision. I think it's also starting to hinder my motivation. This week I plan to sit down, solidify my idea, and write up some design notes. Then I'll be focusing on code clean-up and refactoring so that I can start on my trading system at planets. This might be too much for 1 week's goals, but I hope to put in some extra time this week to make up for last week's lack luster dedication.

Tips from your Uncle Eck:

The Unity Tutorial Videos from Unity Technologies are awesome. I had read about the UI system, the anchor points, pivots, etc. But didn't really understand what was doable until I watched the UI video on making a modal dialog and started working through it. Very useful stuff here!

The weekly humble bundle is Play and Create with Gamemaker. It includes source code for several games plus a license of GameMaker Pro. I didn't care for GameMaker when I tried it, but there's some cool games in there so looking at the source code might be neat.

There's also an RPG Maker bundle at bundlestars. I haven't used bundlestars before, but it looks like lots of RPGMaker content is available for $8.50.

Personal Update:

Busy week! We bought bikes for the family and I'm teaching the kiddo how to ride. We had some car trouble where the front wheel well was smoking terribly and we had to get it towed and repaired (leaky pump dropping coolant onto the wheel). And I should be getting to the quarter-round trim soon in order to finish the laminate floor installation. And my free AutoSave Asset finally got published:

I'm happy I shared an early version for the Week of Awesome III. Otherwise it would have been far too late. Also, as of the writing of this, the Check Engine light came on in my other vehicle. >.<

Game Update:

This week, I started working on my "overland" movement system. It's called overland because originally I was thinking of a medieval travelling merchant game and I couldn't think of a better name. I may change Overland to Solar or Space. Anyway... I now have planets being randomly positioned, and the player can send his ship around on the map. Currently, you can only choose to go to a planet, but in the future, I'll be letting the player select deep space locations, intercept other ships, etc. As the player moves, there's a random chance that he gets jumped by a pirate scout which triggers the battle scene.

I'm debating on whether or not to go with a more realistic layout of the solar map. Like have a star in the center, and let the planets travel an orbit path very slowly each turn. Or something like I have now where planets, star ports, and other interesting things are just scattered about. My original grand idea was on the more realistic side. Planets orbit the star, moons orbit the planet, space stations orbit any of these. There's definite cool factor there, but a single solar system might have over 200 meaningful places to dock. When I'm planning to allow the player to travel between star systems, it's a little overwhelming. Lately, I've been enjoying some more abstract games with text popups describing different scenarios, so I'm leaning that way. I'm also thinking about going with 2d sprites instead of 3d models.

Next week I plan to focus on learning Unity's UI system. I need better user feedback on the selection of units, and I also want to offer the user choices during their random encounters. Hopeuflly I'll get a simple system in place for that. I also want to work on cleaning up my Game State management and look at different screen transitions.

Unity Gotchas:

Unity does not like how I setup my objects, or i'm just doing it wrong. Case in point, my ship configuration works like this:
I have a ShipParentController that dynamically loads game objects for the Hull (physical/visible/game stats), the GhostModel (for indicating planned movement), and the GameObjectCanvas for the health bar. To spawn a particular ShipConfiguration, you just have to set a ShipConfigurationName and then in Start() it loads everything up and sets some local reference variables to the child objects. No big deal yet... But when I create a random encounter, I generate an enemy ship by picking a ShipConfigurationName and passing the ShipParentController to the BattleSystem. The problem is that the BattleSystem is expecting those child objects to already be loaded but the ShipParentController.Start() hasn't been called yet. I guess I just can't treat the Start() function like a constructor.

I ran into similar issues when I have game objects start out disabled in Unity. Setting a GameObject to Active doesn't run Awake or Start right when you turn it on. Unity has to do an Update cycle first to call these. Then after that, all my child objects are loaded up nice and neat. I was mainly doing this to avoid GetComponent/GetChildComponent() calls in Update code so my performance didn't go to crap. And I prefer to do this dynamic wiring up rather than using the Inspector to wire up my Child objects because when I refactor code by changing the name of a field, it breaks much more cleanly.

I'm an old Object Oriented Programming vet so it's taking some adjusting to shift my mental paradigm over to a Component Entity System. I hacked together some things just so I could "finish" for the week and get things working, but I'm not happy with the current state of the code. I think I'm going to have to move my initialization code into my own function with a flag. Anytime I need to create a new object, I'll have to run the initialization code myself and the function will set a flag to say it's Initialized.

I'm also still a little fuzzy on scene changes. Right now, I don't have separate Scenes. Since I'll have so much data to go from overland to battle and back again. LoadSceneAdditive did not seem like the wise choice. I just have the relevant objects childed to an OverlandScreen and BattleScreen GameObject and I disable/enable when I'm switching scenes. I have a zoomed out orthographic camera for the Overland screen. And a zoomed in, perspective camera for the Battle screen. Both are AudioListeners which is one problem, and the other is that the OverlandScreen and BattleScreen are turning each other on and off. I think I'm going to need a GameStateController for Screen changing, and I'm going to need to separate out my AudioListener to follow around the currently active camera.

Tons to do!

Development Update

I spent this week reorganizing my battle system code. In the early version, I had hard-coded 2 ship participants: (1 human, 1 ai ship), but now it supports fleet versus fleet.

I also cleaned up my configuration code so that it's much easier to build different hull types, and configure them how you like. Currently the only equipment I have are weapons (laser or cannon), but I like the organization of this code and the related unity game objects.

The hull game object contains variously sized cubes that make up the physical model of the ship. Empty game objects are positioned where various ship equipment will attach such as weapon components and have a SlotController script attached to it that specify the supported SlotType and have variables to hold the currently configured ShipComponent. The positioned slots serve as anchor points for any physically visible ship components such as weapon turrets.

Here's a video showing a scout and destroyer configured with lasers. Versus a computer controlled scout and destroyer configured with cannons.

Having multiple ships exposed an issue with my cannon shells. The bullets ignore the ship they're firing from, but everything else is fair game. So if a bullet misses the first ship in it's path, it might keep traveling and hit the ship behind it. That's not too bad and could even be passed off as a feature, but I think my bullets are applying their damage each time they pass through a different cube of the same ship. It definitely warrants more investigation.

Another strange issue I noticed is when I played my game on my wife's computer. The mouse's world position seems to be offset by 1 in the Y direction. You can see it when I'm moving the ships and the ghost ship isn't right on top of the mouse pointer. The gui system seems offset vertically as well. But on my computer it runs just fine both in the editor and if I build a separate executable to run it. I have no idea why it's acting wonky. :/

I think my battle system is enough of a place holder so that I can move to other game elements. Next week, I'm going to work on some "overland" travel. I want to be able to control a ship going from planet to planet. Between travel destinations, I'd like to roll for a random encounter chance and trigger my battle system. I may also put some time into a GUI system. The stuff I have now is hacky, hard-coded nonsense.

Tip from your Uncle Eck:

Be sure to allocate time to refactor your code, especially in the early stages of development. Think about where it's painful to add features or make simple changes. Figure out why, and design something better. If you don't do this, your poorly designed codebase will drag you down like a boat anchor.

Personal Update:

It looks like I won the Week of Awesome III [size=1]unofficial judging award! >.>

I had a lot of fun playing all the entries and participating at least peripherally in WoA III. Congratulations to the winners, kudos to all the participants, and special thanks to all the contributors who made up quite the prize pool this year. I'm not sure when I'll get time to make my belated entry, but I'll let you know when I do.

Professional Update:

I made a few pages for my website at ecktechgamescom. One for each Unity Asset that I've submitted and an About page. I spent more time than I intended on styling and layout, but I think it looks nice now.

I've been messing with my turn-based battle system and I've added ship movement to the mix. Each ship has a limited amount of movement and spends this time to turn and move. Currently there aren't shield arcs or firing arcs so movement doesn't mean too much yet. The AI just picks a random spot near the player to move to, but it looks more interesting than sitting still and trading licks. I should have recorded a video with slower turning ships so you could see the ghost indicator's range shorten up as you try to move behind yourself.

I stumbled across another sci-fi turn-based game Stars in Shadow and saw how their combat is HEAVILY influenced by Master of Orion 2, and that's when it dawned on me. MOO2 combat is really what I'd love to have in my game, so I'll be trying to emulate that as best I can.

There's a ton of stuff to do, so I'm going to start fleshing out my design a little more and start knocking things out. Here are a few off the top of my head:

  • BattleSystem improvements
  • Better Ship Blueprints/Configuration system
  • Ship components - Engines, power generators, armor, shields, etc
  • Weapon Mods
  • Multiple Combatants and Initiative Queue
  • More Weapon Types
  • Shields / Shield Arcs
  • Firing Arcs
  • AI that's at least somewhat interesting
  • Unit/Target Selection Indicator
  • Better UI System
  • Crew/Internal damage

    My main efforts are going to be these items for the next week or two. It's not that I'll be done in 2 weeks, I just want to move on to some different game elements once the combat is good enough to be a placeholder.

    Tip from your Uncle Eck:

    I didn't really run into anything weird or gotcha-worthy in Unity this week, so I'll just share some Eck wisdom. Here's the secret to losing weight:
    [spoiler]Eat less, move around more.[/spoiler]

Living the Dream

I was going to post this the week before, but I also had posted my free Unity AutoSave asset for the Week of Awesome competitors which got featured at the top of the journals. When I posted this, it replaced the featured journal entry with this entry. So I held off on my big news until after the week of awesome. So read this as if it was posted on 08/09/2015

Personal Update:

So last week I got distracted by a bunch of real life stuff. It turns out my Daughter's peanut allergy is way more severe than we thought it was. When she was a toddler, she used to get a rash when she ate peanut butter. We decided to test it last week because sometimes kids grow out of the allergies... And apparently sometimes they get way worse! A few minutes after we fed her a small bit, her tongue started burning and her throat started closing up. Scary shit! Now we're the proud new owners of a couple of epi pens.

I also had to get the kitchen floors ready for the floor guy to take over my installation. So I learned how to level a floor, screwed down some creaky boards, and ripped up the quarter-round trim. Originally it was going to be around $300, but after talking to the guy the estimate grew to $700. So, I'm back to installing the floor myself. I should be finished this week.

And we had to take the car in to the mechanic. blah blah blah... There were other things too, but that's enough whining.

Development Update:

I didn't get much done in the way of development, but things were set into motion from the week before when I submitted my Floating Combat Text to the Unity Asset store. The publisher guidelines say to be prepared for rejections as the review team takes a look at it, but it was approved during the first pass on Thursday!


Check it out for yourself here:

Not only that, but on Saturday(08/08/2015), I sold my first copy!!! Technically I'm now a Professional Game (component) Developer! biggrin.png MUAHAHA! Now begins the rock-star lifestyle of the indie game developer... After I get the laminate floors knocked out, I plan to invest in a large stick (to keep all the groupies at bay obviously) and I'll also be accepting applications for my entourage. After that gets sorted out... It's back to business.

Last week, I said I'd be working on movement or a new weapon type, but that didn't happen. Instead, I cleaned up code and started doing some design work for movement, my battle system, and ship configuration. I'll probably do more of the same this week. I'm leaning towards a hex grid, but I may do free-form movement for the first iteration since its simpler.

Tips from your Uncle Eck:

Grab my free Auto Save - editor extension for Unity from my other Journal Post.

If someone is having a serious allergic reaction, call 911 immediately. Don't try to wait it out! By the time their throat closes, it might be too late.

- Eck
Hey everyone,

I won't be entering a game into The Week of Awesome III this year, but I'd still like to help.

I'm in the process of publishing my free Auto Save - Editor Extension for Unity, but I don't think my asset page is going to be approved before the Week of Awesome III runs its course. I'd like to make this available to you guys and gals before then. The extension just saves your scene and assets any time you run your scene. Here's a dropbox link to it:

AutoSave Asset:
(attached zip file to post so GameDev could track the downloads)
If you have any issues, e-mail ecktechgames@gmail.com. If you want to say thanks, leave a comment and rate my asset once it gets approved. smile.png
1. In Unity, go to Assets->Import Package->Custom Package and import the extracted file.
2. There is no step 2. You're done! Get back to work!

Now instead of tearing your hair out for losing hours of work and cursing yourself for not clicking the save button first, you can take the time to fill out the Unity bug report, restart Unity, and get back to work.

In a few weeks, my asset should be approved and be available here:

In the mean-time here's a link to my publisher page:

Have fun everyone!
- Eck

Development Update:

I finally submitted my first asset to the Unity Asset Store... Floating Combat Text by EckTech Games is now in the Pending Review status... And holy crap did that take forever! Deciding on good names, cleaning up the code, and reorganizing my code took its own chunk of time. But coming up with graphics, setting up a YouTube channel, writing documentation, writing a tutorial, building demo scenes, taking screenshots, and making sample videos took most of the damn week. I constantly felt like I was just a few hours of work away so I wound up trying to push through to the end, but I kept running into minor road blocks along the way. As a result I wound up putting in 10-12 hour days until I finally submitted it on Thursday. I feel like I just got done with the Week of Awesome. But it's up now! Huzah!


Here's what I generated this week:

  • Publisher Page - https://www.assetstore.unity3d.com/en/#!/publisher/15162
  • Asset Page - https://www.assetstore.unity3d.com/#!/content/42253 (Won't be visible until the asset gets approved)
  • Playable In Game Action Demo - https://dl.dropboxusercontent.com/s/v4sefmee5rzrz0w/FloatingCombatTextActionDemo.html
  • Demo Scene - https://dl.dropboxusercontent.com/s/bqmxrrrnue6op63/FloatingCombatTextDemoScene.html - provided with the asset
  • EckTech Games YouTube Channel and 3 videos - https://www.youtube.com/playlist?list=PLLI2xCbX3KemvwUrCFdkMpCbScAPidhZe
  • Setup PayPal
  • Oh yeah and the code...

    My wife was in charge of the cool graphics and branding work. I gave truly inspirational guidance like, "Nah, I don't like that." and "Yeah, that's cool." Eventually she came up with something that I think looks like a pretty slick logo:

    I languished over the pricing for it. I found two similar modules for sale, one for $10 and one for $20. The $10 didn't seem very featureful and had 5 ratings meaning at lest 5 people bought it (maybe more?). The $20 was used in a game and seemed more professional. It had more features, but it was also slave to a $100 gui replacement asset. But it was rated by 186 people, so at least that many people felt it was worth $20. In the end, I decided to go with $15. We'll see how it goes.

    Next week I plan to get back to some game development. This business nonsense is for the birds! I'm going to toy around with some different game mechanics for movement. I haven't decided between grid based or free form - definitely turn-based though. If I can't decide on a movement style, I'll probably add a couple more weapons types instead. Missiles or Fighter Bays. Something that launches a projectile that participates in the combat. And since I finally shipped my asset, I'm going to have to start back on the laminate floors for the kitchen.

    Tips from your Uncle Eck:

    Wordpress... I had done some research on Wordpress and saw how there were multiple ways to host Unity games in Wordpress sites. Sweet! So I decided to be professional and I shelled out $100 for a year, and started up my blog. About a week later, I found out that none of these hosting ideas work on wordpress.com. Wordpress.com is locked down pretty tightly: you can't install plugins, you can't run javascript, and you can't use iframe elements. But what obfuscated this fact is that Wordpress is an open source blogging software project and it supports this functionality... Also, there's a site wordpress.org that supports this and so several other developers "use wordpress" to host Unity packages. ARGH! I'll probably still use WordPress as a web log and asset showcase, but I was still frustrated.

    I did figure out how to host my demos through dropbox. It has some limitations, but you can't beat the free price.
    Step 1: Set your build to the Web Project and build the package.
    Step 2: Name your html files and unity package files appropriately.
    Step 3: Upload these files to a dropbox account.
    Step 4: Get their public links. Should look something like:
    Step 5: Edit the Unity generated html file. Instead of referencing "YourGameName.unity3d" directly, replace it with the changed url:
    Step 6: From elsewhere, you can now link to the changed url

    I bolded the parts of the url you should change for the direct reference links. The main limitation is the bandwidth limit for free accounts. By default, you get 10 gigs of download bandwidth per day. I wired up my Floating Combat Text to the Survival Shooter unity project as a pretty demo which is around 50 megs. It's simple as far as games goes, but it has nice graphics, models, and sounds that take up a decent chunk of space. That's only 200 users per day. For a game with any popularity, it's not a real solution. But I think it will be fine for my immediate needs.

Personal Update:

During the early part of the week, I focused on preparing for my interview. I felt like I did really well, but they decided to go with the other candidate. Since I told them I was prepared to follow my dreams to become a game developer on my own, and they weren't sure how long they were going to stay focused on game development, I think they were worried that I might cut them loose if they steered away from game development. Ah well, I guess I won't have a salary for a year or two. But on the plus side, I won't have a full-time job getting in my way... Wish me luck!

Development Update:

For the rest of the week, I got my Unity Publisher page going, bought a website on wordpress (still very much under construction), and focused on cleaning up and polishing my Floating Combat Text asset. I wrote lots of documentation including a tutorial on how to extend the base effects that I provide. I spent a ton of time refactoring the code and deciding on good names and organization. I commented everything that needed commenting and now I've packaged it up and sent it to some friends to test it out for me.

I don't have any new features to show in a game play video, but I can show you my Unity publisher page...
Behold! EckTech Games:

Hopefully I'll be submitting my first asset before the end of the week. All of my efforts will be going towards that until it happens. I need to work with my wife on some graphics for the asset page. I need to record a few demo scenes to show off the features, and take a few screen shots. And I need to settle on a style and layout for my website. If I get done with all that, then I'll think about the next set of feature I want to tackle for my space game.

Tip from your Uncle Eck:

Unity doesn't have targeted build versions in its client. So if you're running version 5.1 and want to support an earlier version say.... 4.6, then you have to install Unity 4.6 and do all your work there. If you already did all your work in 5.1 it's kind of annoying because not all the work transfers with a copy paste operation. Scripts more or less work, but scenes, animations, etc. will need to be rebuilt in the appropriate client.

Personal Update:

So last week was my phone screening for an Educational Game Development job. I haven't interviewed in over 8 years, but I passed the screen and my face-to-face is this Tuesday. Early in the week I focused on learning some HTML5 Canvas since that's the technology they're probably going to use. I also worked on the business side of things doing research on setting up my own website and coming up with a name and some ideas for graphics that I'm not ashamed of. Hopefully by next week I'll be able to show them to you.

And Friday the wife and I took our daughter and the neighbor's kid to the zoo for some members only fun. It was a little too hot, but that didn't stop us from having a great time. What's this have to do with game development? Nothin'!

Dev Update:

I made lots of little updates, clean ups, and polish for what I had. I cleaned up my Combat Text system, plugged in a different font, and wired up animations for Hits, Misses, and Critical hits. Hits are red and float down and right. Misses are yellow and float up and left. While crits are red, curve right and up, then do a little pulse and stay on the screen a little longer.

I made a new weapon type "cannon" which shoots projectiles. My laser weapons shoot a continuous beam and plays a looping sound as it fires. The damage is after the firiing sequence is complete. The cannon shoots three three times with a delay between shots playing a shoot sound effect. If the bullets hit, they play a hit sound effect, applies the damage, and disappear immediately. If they miss, they'll travel through the ship and disappear after a short time.

Now that text supports different animations, I made my turn-based battle system start randomizing what happens. For the video, I made the laser and cannon use the same weapon stats. The weapon stats drive a few different things: max range, number of shots, damage, hit chance, etc. I hooked up the stats of the Cannon to both the laser and cannon visuals. So for this video, they both have 3 shots which do 3 damage each, I upped the crit chance to 15% (doubles the damage) so it would happen a little more often for the video and the hit chance is 60%. The battle system rolls up the results when "attack" is pressed. So all three shots are calculated then the AttackResult is handed off to the weapon systems to play out their effects.


Next week, I'll be prepping for my interview more, and trying to get my new web-site up and going. I have no idea how long these things are going to take so I'm going to keep this week's promise of features to a minimum. Once I get the website going, I'll be focusing on cleaning up my Combat Text code, adding a few more features, and document the ins and outs of how to use and extend it.

I probably won't get all of this done this week, but for the new features, I'd like similar damage types to pool up into one object. So if all three shots hit, the animation would start over and show 9 damage (instead of 3). I'm going to try to support both world space and screen space canvases. And I'd like to get nameplates working as well.

Hopefully in a week or two, my Combat Text module will be up on the Asset store. \o/ If you guys have any features you'd like to see, feel free to leave a comment below. smile.png

Tips from your Uncle Eck:

Apparently, there's a limitation in Unity's sound playback. If your sound effects don't begin and end in complete silence, you'll get a staticy pop or other strange side-effects. I wasted an hour or two trying to figure out what I Was doing wrong to find out that it wasn't really my fault. Eventually my googling led me to a post that revealed this truth to me. I opened up Audacity and generated 0.025 seconds of silence and the popping went away.

There are a few tricks to firing a physical projectile from a gun. When the bullet is physical, it will collide with the model itself so you can spawn it outside the barrel and keep it physical, or turn the collision into a trigger so that it doesn't interact with the phsyics system. Both have some issues. If you keep the bullet physical, let's say your ship has a surrounding energy shield... Now your bullet is going to bounce right off your own shield (or a different part of your fancy looking model). On the other hand, if you make the collider a trigger only, you lose out on some of the physics collision system details. Ultimately I decided to make my bullets trigger only and ignore any part of the firing ship.

And to embed the video into your journal link (instead of just posting a link to it) don't use the youtu.be link that the video manager gives you. Otherwise it won't work!
- Don't use this guy.
- Use this guy.

Sound Credits:

Cannon Shoot - http://soundbible.com/1804-M4A1-Single.html

Cannon Hit - http://soundbible.com/107-Bomb-Explosion-1.html

Laser - http://www.trekcore.com/audio/ - TOS Ship Phaser 2

Personal Update:

So this was my first week of focused game development. I took a break from the laminate floors and just worked on my game. About half-way through my first full dedicated day, an old friend/co-worker calls me to tell me about a game development job opening up at his company that he thinks I'd be perfect for. It's good money, and 90% work from home too. The only drawback I know about so far is that it wouldn't be MY cool turn-based space game. Instead, it would be educational games targeted towards younger kids. tongue.png

At first, I was dismissing it out of hand. But the more I thought about it, the better and better it sounded. It would mean dedicating less time to my game, but it would also put me closer to retirement. My interview is on Tuesday, but I'm not sure what I'll decide if I'm offered the job. Woe is me and my first-world problems...

Dev Update:

I spent the early part of the week cleaning up my combat text code and trying a few different techniques until I had something I was happy with. Getting text to look nice is not NEARLY as straight-forward as it should be. I might add a few more features and try to publish it on the asset store for a few bucks.

While I was headbutting Unity into producing pretty text, my wife worked through some health bar tutorials and got some decent graphics going there. I had to help her with some of the code but it was surprisingly helpful for her to work through the early steps while I concentrated on other things. By the time I had wrapped up my floating combat text, I was ready to plug in the health bars. I added an animating effect to them so it wasn't just an instant update.

Destroying the ship game object on death was easy, but it just disappearing was lame. So I iterated through the child hierarchy, split apart all the components, and added random force and rotation to each piece. So far, I think it's looking pretty cool.

I'm not sure what I'll be doing next week. Monday, I'll be preparing for my interview. If I get offered the job, I'll be focusing nearly all my efforts on HTML5 game development so that I'm better equipped to start my new job. If I'm not offered the job, I'm not sure which feature I'll work on next. Particle effects, shields, different weapons, different ship types, movement.

Tip from your uncle Eck:

World Canvas text has lots of issues. The canvas is MASSIVE and "normal" sized fonts (10-18 pt) look like pixelated garbage. Lots of posts say the "solution" is to use HUGE fonts (128-136 pt) and scale it down by 1/100th. To me this feels like a hacky-ass work aroundand there's also some graphical artifacts doing it this way.

Take a look at the horizontal line in the k. It also makes shadows/outlines look like garbage (not shown). I'm sure there is a better solution with world-space canvases, I'm just not sure what it is. Instead I used an overlay canvas and just spawn it at the appropriate spot.