Jump to content
  • Advertisement
  • entries
    44
  • comments
    143
  • views
    52390

About this blog

Yet another journal of an aspiring indie game developer.

Entries in this blog

Twilight Imperium 4th Edition - Game 1

I finally got a chance to play Twilight Imperium 4th edition so I figured I'd do a write up. We had 5 players and it was a blast.  For race selection, we used this website about a week before the game http://www.mygurps.com/TwilightImperium.html and selected 3 choices per player. Here's what it rolled up for us (underlined is what we chose): Yellow (Eck (me) ) may choose from The Clan of Saar, The Naalu Collective, or The Nekro Virus. Green (Devin) may choose from The Barony of Letnev, The Mentak Coalition, or The Winnu. Blue (Matt) may choose from The Federation of Sol, The Yssaril Tribes, or The Xxcha Kingdom. Black (Eric) may choose from The Ghosts of Creuss, The L1Z1X Mindnet, or Sardakk N'orr. Blue (Alex) may choose from The Yin Brotherhood, The Emirates of Hacan, or The Embers of Muaat. To save time, I setup the map before hand since I was hosting. I went with a 5-player symmetrical design and tried to balance out tech specialties, resources, influence, and planet types. Here's what I came up with. See the future pictures for how that red section gets essentially "cut-out" for a 5 player game. Map setup With a mostly balanced map, we rolled to see who would get first pick of starting locations. And the last person to choose was awarded the Speaker token. One other house rule we played with was the Speaker would get to pick the 6th Strategy Card. The secondary ability on the 6th card would get triggered after the Speaker activated his Strategy Card. Round 1 start And then we started playing.  It was a pretty standard set of early turns where people moved out and claimed a few systems. The only thing of special note was the Mentak (Green) chose Warfare but instead of claiming more of his central pie slice, he instead claimed the contested planet between him and the Hacaan (Purple). This led to immediate border friction and posturing between the two races. Green was there first, but Purple felt pinned in behind the Gravity Rift (black hole).  I feel like the Naalu (yellow) are late bloomers so I was quick to make friends with my more combat focused neighbors. Here's what we looked like after Round 1. Round 1 complete I made a deal with the L1z1x (black) player to allow me to claim the green tech specialty planet and move out of the system so he could have the bigger resource value world. The green tech specialty would allow me to get my racial tech Neuroglaive faster and make it so I could hold my own versus all those dreadnaughts. We also exchanged Ceasefires. I couldn't quite take Mecatol this round so I moved adjacent to claim that victory point and set me up for next turn. I made sure to get Sol's (blue's) permission before taking that world and gave him our border planet to solidify the peace.  I also traded my racial promissory note to the Mentak which allowed him to move first in the next round. Giving him a slight edge with the coming conflict of the Hacaan's (purple's) fleets. And I bought a sabotage card from the Hacaan which helped fund the war efforts. Publicly trading for a sabotage was great since it made people less likely to play action cards against me. Round 2 Complete   Round 3 was very tense. L1z1x (black) chose Imperial, but his dreads could only move 1 (at the start). I delayed my move as long as I could so he was low on tactical counters. Then when he upgraded his dreads, I activated Mecatol Rex. At this point he stated multiple times that if I did that, he would roll through my territory. But this was the same turn I got Neurogalives. I told him I was no longer afraid of his fleets, Mecatol Rex was mine, but I would not strike first. He was still low on counters so he couldn't really do anything but stew this turn. While this was going on, the Hacaan (purple) got pinned in by Mentak (green) and Sol (blue). The space cats started massing a big fleet and told the Mentak (green) player he was coming for him. Blue claimed a few more planets and a couple of points. Round 3 complete L1z1x (black) started an arms race with my peaceful Naalu (yellow), threatening me the entire time. Not much was exchanged besides words however. Black was still token starved so he couldn't attack me without crippling his own position thanks to Neurogalive. Big things were happening on the other side of the board. The Hacaan (purple) used an action card to connect Alpha and Beta wormholes to threaten the Mentak's (green's) homeworld. In response, the Mentak moved their speed 3 cruiser fleets through the Beta wormhole and took the Hacaan's homeworld. My daughter was wandering in and out of the game all day. She was in the room around this time. After the game she asked me if green attacked purple with his cruisers because she saw he could sneak through... #ParentingWin Blue started moving his fleets towards Mecatol but I made some sweet deals just to get his ceasefire. Round 4 complete The Mentak (green) counter attacked the Hacan (purple), but the space cats played skilled retreat. Then they retook their homeworld. The Federation of Sol (blue) started moving towards Hacan (purple). L1z1x (black) built up a ton of PDS and upgraded them meaning I couldn't go crazy in his backyard.  The glorious Naalu (yellow/me) made a series of plays over this round to gain 5 points.  Imperial - held mecatol +1 Imperial - (Public Objective) Held 6 non-home system planets +1 Secret (Action phase) - Win a space combat versus a player with the most points +1 Secret (Status Phase) - Own two faction technologies +1 Public (Status Phase) - Own two unit upgrade technologies +1 So I went from 3 points to 8 points in one round. I still had the Speaker token so I'd get first choice of strategy card, and as the Naalu I would get to act first no matter which Strategy Card I chose. Nobody could take Mecatol from me this round since I had waited so late in the turn to make my move this turn.  I knew there were action cards or agendas that might be able to mess me up, but the only thing that popped up was Seeds of an Empire. Voting on that either the first player would gain a point, or the last player would gain a point. I was scared for a moment because I thought first player might lose a point.  Round 5 complete We didn't bother playing out any of round 6 because I was going to choose imperial, score a point for Mecatol, and score a point for one of the objectives that they couldn't take from me. Victory Naalu (yellow/me)! Final score: The Naluu Collective - 10 The L1z1x Mindnet - 6 The Mentak Coalition - 6 The Federation of Sol - 4 The Emirates of Hacan - 3   Final Thoughts: Fourth edition is much more streamlined than 3rd. The 5 player game took 8 hours including a break in the middle for pizza. Being the Naalu and going from 3 to 8 in one turn and then winning the first action of the next turn was really impressive, but it also felt a little bit unfair. Hanging out at 3 points, people didn't feel I was a big threat so they never felt the need to stop dealing with me diplomatically. But I was also on Mecatol Rex for the entire game and nobody attacked me there once. So I don't feel too bad about winning. I liked our 6th card house rule, and I also liked the 5 player wedge cut out. Most of the others didn't like it however, because they felt like it took away too many planets. I don't think they realize that with a 6th player we'd have someone else occupying space AND we'd also have to deal with 5 blank tiles so there would be EVEN FEWER worlds. I know people had fun though because they're already asking me when I'm hosting another round. Maybe we'll play the 14 point game soon.
 

Eck

Eck

 

Battletech Beta - Eck vs Connor Walkthrough

I wrote this nearly a year ago, but didn't get around to publishing it. Now that more info is coming out about the game, I think it's a fine time to share the epic struggle between Lazaraus and Talon. Original Post: It's been over a year since I posted last so let me catch up my Game Dev buddies. You already know that I landed my dream job at Harebrained Schemes working on Battletech as a Unity/C# Tools developer. The job has been amazing and my co-workers are awesome. I look forward to going into work every morning and since then I've gotten to do even more cool things:
Go to Gen Con and show off the super pre-alpha. Talk to fans about the game. Sign people's Battletech rulebooks, swag, and posters like I'm a rockstar. Play table-top Battletech with oversized minis on twitch in a live-action show where damage is recorded by taking hammers, dremmels, and soldering irons to the minis. (Check out Death From Above on Hyper RPG) Help work on and shape a game that was such a big part of my teen/college life. Win the Ultimate Multiplayer Battletech Trophy for the first season at HBS. Anyway, back to the post at hand... Connor is a coworker of mine and one of the main DFA stars (Talon). There's a pretty big audience for the show and interest was expressed in getting to watch Connor and I battle it out in multiplayer. I wasn't setup to record the video so instead I took screenshots of us playing so I could write up this play by play post. We were fighting a Battle (20 Million C-Bills) fight on Big Loch. There's an island in the center with some trees, hills, and bigger cover surrounded by a body of water. I took a Jenner, Trebuchet, Hunchback, and Kintaro. Connor took a Commando, Centurion, Kintaro, and Jagermech (LRM variant). Round 2: We start out on opposite sides of the island. That beacon off in the distance marks where his units spawn. I start by moving my Trebuchet to the left and my Kintaro to the right. If he charges up the middle, he'll have to choose his facings carefully. I send my speedy Jenner up the middle to scout things out, and my Hunchback also takes the straightest route since he's the slowest unit I have. Round 4: Connor was too clever to go charging up the middle. Now my Trebuchet is a bit out of position, but it can still bring its LRMs to bear through indirect fire. You can see the results by the slight damage to armor, and minor amount of stability damage on his Centurion. I probably should have taken an action shot, but I was concentrating so hard on the tactics of the match. You can also see my Kintaro is out of position all by himself. Luckily I was able to use the initiative track and that cover to keep him fresh for a round or two. Round 7: There's only so much dancing around cover I can do and my Kintaro takes a pounding. I try to finish off the Commando and give the Centurion a tempting back shot. It's risky but my Kintaro's front armor is pretty wasted. Round 7: My Kintaro fails to take out the commando and I'm a little worried at this point. My hunchback finally gets close enough to threaten the Jagermech next turn. Still Round 7: Instead of shooting at the Centurion, I sprint my Jenner up to shoot at the Commando. It's on the edge of death now but still alive. Lucky for me Connor's Centurion missed an 85% AC/10 shot to the Kintaro's rear. He puts his back to the wall thinking he's safe... Round 8: In round 7, I made sure all my units were done before Connor's. That guarantees that I get to go first in round 8. I use my Jenner to finally finish off the Commando. Even though he only had 1 leg, he still had his large laser. Not only that, he could of still meleed one of my units to knock him down or just use his activation to manipulate the initiative track. Active units are always a threat. Round 8: My Kintaro somehow manages to stay alive even though it gets knocked prone. You can see here I have a pretty even spread. My right side is the least damaged so I try to offer that in future rounds. My Jenner is pretty exposed in the water, but he'll have to decide between taking a shot on my light or finish off the Kintaro. Still Round 8: I didn't take a screen shot, but Connor finished off my Kintaro and I take out his fresh Centurion with my Trebuchet. It was able to move just far enough up to get a rear shot on his Centurion. There were rocks in the way but my Jenner spots for him which allows me to indirect fire for some awesome back shots. Then my Hunchback slams an AC/20 into the center torso of the Jagermech. Round 9: Connor turns the Jagermech's back to my Hunchback. It was probably the right move since his front CT was gone, but the rear armor wasn't enough to save him. The AC/20 lands home in the rear CT. His Kintaro blows away my Jenner, but goes up a ton of heat to do it. He tries to use the rock as cover. Round 10: After the Kintaro moves, my Hunchback climbs the hill and manages to crit the SRM ammo. He only has a medium laser left so Connor calls the match. It was a great fight and I barely won. When I over-committed my Kintaro early in the fight I thought Connor was going to give me my first defeat. My luck held out though and the damage clustering favored me (both giving and receiving). Connor also meant to take a pilot with Sensor Lock but misclicked during the setup. I didn't talk much about the pilot skills, but they play a big part. My Kintaro had a pilot that gives him evasive (normally only granted by sprinting and not firing). That's one reason he could soak so much damned fire. My Jenner had Sensor Lock which allowed him to clear evasive and grant line of sight to a unit. My Trebuchet had master tactician which let him act one initiative phase sooner and exploit the sensor locking Jenner. My hunchback had Bulwark which gives you defensive bonuses for staying still. I had to move him every turn so it never came up. I don't remember everything Connor had but I do remember he had Master Tactician in his Kintaro... That thing being able to act during the light phase is freaking ridiculous. Anyway this was the first time the mighty Talon and Lazarus clashed on the field of battle and it was glorious. I can't wait for everyone to experience the fun and excitement of a multiplayer match. - Eck  

Eck

Eck

 

Missile Command Challenge

I caught wind of the Missile Command challenge earlier in the month and figured I'd knock it out during Christmas break. I was planning on coding more on my Car Wars prototype but the challenge took up most of my programming time. Sleeping late, hanging out with my family, and playing video games took up the rest of my free time. All in all, it was a great way to slide into the new year. I spent some effort keeping the code clean (mostly) and even did a couple of hours worth of commenting and code reorganization before zipping up the package. Many sample projects are quick and dirty affairs so aren't really a good learning resource for new programmers. Hopefully my project isn't too bad to look at.   What went right? Switching to Unity a few years ago. This was definitely the right call for me. It helped me land my dream job and allows me to focus on making games rather than coding EVERYTHING from the ground up.  KISS (Keep It Simple Stupid) - I started thinking about doing my own take on Missile Command but decided on doing just a simple clone. The known and limited scope let me keep the project clean and kept development time down to something reasonable. Playing the original at http://my.ign.com/atari/missile-command was a big help for identifying features I wanted. Getting the pixel perfect look of old-school graphics was a little bit tricky, but thanks to a well written article I was able to get sharp edges on my pixels. https://blogs.unity3d.com/2015/06/19/pixel-perfect-2d/ I had done some research on this earlier so I knew this would be a problem I'd have to solve. Or rather see how someone else solved it and implement that.  Using free sounds from freesound.org was a good use of time. There are only 4 sound effects in the game and it only took me an hour or two to find what I felt were the right ones. What went ok? Making UI's in Unity doesn't come naturally to me yet. I just want some simple elements laid out on the screen. Sometimes it goes pretty quickly, other times I'm checking and unchecking checkboxes, dragging stuff around in the heirarchy, and basically banging around on it until it works.  I got the minimal core features of Missile Command, but not all of it. You don't really think about all the details until you start making them. I'm missing cruise missiles, bombers, and the splitting of warheads. Dragging the different sprites into position on the screen was manual and fiddly. There's probably a better way to do this, but it didn't take too long. You can't shoot through explosions, which makes the game a little more challenging. And you can blow up your own cities if you shoot defense warheads too close to them. It was easy enough to fix, but I left it in there. What went wrong? I spent a ton of time getting the pixel perfect stuff right. Playtesting in editor, it was set to Maximize on Play. There wasn't quite enough room to see the full screen so the scale was at 0.97 making the display 97% what it should be and thus, blurred all my sharp edges. I didn't see that setting though... >.< I pulled my hair out trying to see the problem in my math, and even downloaded a free pixel perfect camera which was STILL showing blurry stuff. Finally, I built the game and ran it outside the editor and saw things were just fine. There's also an import setting on sprites for Compression that I cleared to None.  I'm not sure if this second step was necessary. I've been bit by the Editor not being 100% accurate to final game play and wished I would have tried that sooner. I had trouble with the scoring screen. I wanted to put the missiles up on the score line like Missile Command does, but ran into trouble with game sized assets and canvas sized UI elements. After 45 minutes or so I said screw it, and just put a count of the missiles and cities up.  I didn't data drive the game as much as I wanted. The data is in the code itself so users can't mod the game without downloading the source code. I'm also only using one set of colors for the level. If I put any more time into this, I'll probably tackle this issue next, and then worry about the features I missed out on. Final thoughts Working on this project makes me appreciate how awesome the programmers of old really were.  With the tools I have (Unity, Visual Studio, etc.) it took me a couple of weekends. And even then I didn't recreate all the features of the original. I'm including a link to the zipped up project in case anyone wants to see the source code to play around with it. Hopefully someone finds it useful. If so, let me know.  EcksMissileCommand.zip - Executable if you want to play. EcksMissileCommand_Source.zip - The project if you want to mess around with it. Sound Credits freesound.org
https://freesound.org/people/sharesynth/sounds/344506/ - Explosion.wav
https://freesound.org/people/sharesynth/sounds/344525/ - LevelStartAlarm.wav
LevelStartAlarm_Edit.wav - I used Audacity to edit the above sound. I took the first six beeps then faded them to silence.
https://freesound.org/people/Robinhood76/sounds/273332/ - MissileLaunch.wav
https://freesound.org/people/sharesynth/sounds/341250/ - ScoreCount.wav

Eck

Eck

 

Battletech Event Editor / Data Driven Gameplay

BattleTech is going to have a Random Event System during the single player campaign. Basically as time ticks by, there's a random chance for these events to popup during the time between combat missions. You're given a situation and a handful of options to choose from. Some options may not be available based on previous events, contracts, or other game play. Based on the chosen option, a result set is chosen at random (weighted) and the results of that are applied.  I recently delivered the event editor for our game so the designers could crank out events at a faster pace. Originally, it was hand edited json. Then it was a simple text format that Kiva wrote a python parser for to convert that text into json. Now it's a WinForms app with a gui, validation, and other utilities built in. The designers have been using it for a while now and so far they're really happy with it. Here's a screenshot of the main editor and one of its subforms. Event System Data Model Events - Have a Title, Description, Image, Scope, a list of Requirements, and a list of Options. The Scope tells us which main object we're going to be dealing with (typically Company or Mechwarrior). The requirements say what must be met in order for this event to be pulled. And the options are the choices the player makes when they see this event. Option - An option is a choice a player makes. It has some text, a list of Requirements, and a list of potential Result Sets. Choosing this option randomly selects one of the result sets. Result Set - Is what gets applied as an outcome to the event. It has a description, a Weight, and a list of Results. The Weight influences the randomness of the outcome. If we have two result sets and one has a weight of 75 and the other a weight of 25, then the first Result Set has a 75% chance to be chosen. Result -This contains all the data that happens as a result of the event.  Added Tags, Removed Tags, Stat Modifications, Forced Events, Actions, flags for a Temporary Result, and its Duration. This is how the game world gets modified. You can add a tag to the Company Honorable, Remove a cowardly tag from a mech warrior, give a star league era Gauss Rifle, or force an event into the queue for later.  Requirements - Requirements have a Scope, a list of Required Tags, a list of Excluded Tags, and a list of Comparisons. The scope tells us what we're looking for. Any Required tags must be on the object. Any excluded tags most NOT be on the object. And any Comparisons must be met. For example: Scope: MechWarrior, Required Tags: Marik_Origin, Excluded Tags: Cowardly, Comparison: Injuries > 0 - would look for a wounded Marik pilot who is not a coward.  TagSet - A list of strings attached to various items in our game (maps, encounters, contracts, company, mechwarriors, mechs, etc.) It's a simple concept, but very powerful. Many things are setup with an initial set of tags, but we also add tags to your Company, and your various mechwarriors. These are then querried on by events and other systems in our game to make the world feel more alive. Data Driven Content I'm a big proponent of using data to drive applications (game or not) because of all the benefits it provides. The major benefit here is being able to add content to your game without access to the source code. When done correctly, it opens the doors wide for a modding community to take your game into new directions and it can really add some longevity to a title. The event editor will be included in the final version of our game and I'm excited to see what events they'll come up with.     - Edited to talk about what the event system actually is so people don't get confused about "event programming". 

Eck

Eck

 

Using a Metadata Database

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! Come check it out at:
http://battletechgame.com/ 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. http://www.sqlite.org/ - Free Sql engine http://www.mono-project.com/docs/database-access/providers/sqlite/ - Free library for interfacing with SQLite http://sqlitebrowser.org/ - Free visual tool for editing your database schema and writing queries. 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     /*     select         ts.*     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'     where         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; }  

Eck

Eck

 

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.

http://thegauntlet2016.causevox.com/eck
#moxgauntlet
@moxboarding
@YouthCareSEA

Eck

Eck

 

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.

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.

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. 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.

https://www.twitch.tv/hyperrpg/v/51465070 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.

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.

I can't believe how lucky I was to get this job.
It's a game development job
For a game that I love
For an out of state company
And me without any professional game development experience
Without knowing anyone in the biz
And it turns out the job rocks
And the team rocks
And even the new city rocks.

It's ridiculous. 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.

Eck

Eck

 

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! >. 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. 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 ) 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. 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! :)

Eck

Eck

 

I LANDED MY DREAM JOB!

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. 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. 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!

Eck

Eck

 

Extending Unity's Editor with a Custom Window

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:
[spoiler] // 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:Spiderling1Spider1d6SpiderGiant Spider2Spider1d6Spider
[/spoiler]
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. http://docs.unity3d.com/Manual/ExtendingTheEditor.html

Eck

Eck

 

Streamlining Unity's Content Pipeline

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:
http://ecktechgames.com/games 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:
Build the model in MagicaVoxel
Export the model to .obj.
Copy the .obj, .mat, and .png to the Unity Directory
Import that into Unity (which acts wonky)
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.

Eck

Eck

 

2016 Promises to be an Interesting Year

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! 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. 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! 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.

Eck

Eck

 

Fantasy Tactical Combat - Beginning Encounters

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]Spider1Spider3d6Spider
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.

Eck

Eck

 

Fantasy Tactical Combat - Random Dungeons

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. 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.

Eck

Eck

 

Fantasy Tactical Combat - Adding Some Polish

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.

Credits:
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
rogueliketiles.png
http://opengameart.org/content/roguelike-dungeonworld-tiles

Inventory Master - uGUI
https://www.assetstore.unity3d.com/en/#!/content/26310

Selected Unit Panel
Panel5.png

Character Avatar
Panel4b.png

Sword Icon
https://www.assetstore.unity3d.com/en/#!/content/43810
T_Sword.png

Humanoid Miss
Blade Sounds
https://www.assetstore.unity3d.com/en/#!/content/30189
Slash 1


Fantasy Sfx
https://www.assetstore.unity3d.com/en/#!/content/32833

Humanoid Hit
Trap_00

Humanoid Footstep
Footstep_Dirt_05

Slime sounds
Footstep_Water_00

Inventory Slot click
Inventory_Open_00

Battle Music
Heroic Demise (New).mp3
http://opengameart.org/users/matthewpablo
http://opengameart.org/content/heroic-demise-updated-version
http://www.matthewpablo.com/contact

Eck

Eck

 

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.

Eck

Eck

 

Switching Gears to Grid Based Fantasy

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.

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.

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.

https://gamelogic.quandora.com/grids_unity/q/799bbc5d61894539a3b8f341242579f1/I-need-some-general-guidance-Can-you-help

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.

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.

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/

Eck

Eck

 

Trading + Random Encounters - Stitching it all Together

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:
https://www.kickstarter.com/projects/webeharebrained/battletech

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. >.
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.

Eck

Eck

 

Overland Map Refactor - Fleet Movement

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. 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!!! >.
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. 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.

Eck

Eck

 

Messing around with Message Boxes

Personal Update:
I had more car trouble with the other vehicle. >.


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.

Eck

Eck

 

"Overland" Ship Movement with Random Encounters

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:
https://www.assetstore.unity3d.com/en/#!/content/43605

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!

Eck

Eck

 

Multiple Ships and Various Ship Configurations

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.

Eck

Eck

 

Moving Right Along with Ship Movement

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]

Eck

Eck

 

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:
https://www.assetstore.unity3d.com/en/#!/content/42253

Not only that, but on Saturday(08/08/2015), I sold my first copy!!! Technically I'm now a Professional Game (component) Developer! 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

Eck

Eck

 

WOA III - Free AutoSave Asset for Unity

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.
Instructions:
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:
https://www.assetstore.unity3d.com/#!/content/43605

In the mean-time here's a link to my publisher page:
https://www.assetstore.unity3d.com/en/#!/publisher/15162

Have fun everyone!
- Eck

Eck

Eck

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!