Jump to content
  • Advertisement

Eck

Member
  • Content Count

    599
  • Joined

  • Last visited

  • Days Won

    3

Everything posted by Eck

  1. Eck

    Eck's Car Wars Clone

    Steve Jackson's Car Wars was a game I fell in love with back in High School in the late 90's. I bought the deluxe edition and picked up any supplements I found at game stores and used book stores. I was in college by the time I found anyone willing to play Car Wars and it wasn't nearly often enough for me. Twenty-five years later and I only have between five and ten played games to my name. I figure, the only way I'm going to get to play enough Car Wars to really scratch that itch is if I code the game myself. I've been working on a Car Wars port off and on throughout the years. XNA, OpenGL, DirectX, etc. I never was skilled or dedicated enough to see the project through to the end. This time, I'm going with Unity. There are still plenty of skills that I lack: modeling, animation, sound engineering, (mainly content creation skills). But with the Unity Asset Store there are free and paid for assets that I'll be able to use without having to resort to "programmer art". Plus I've only mentioned this project in a couple of places and I already have an offer from a die-hard Car Wars fan to help out with some 3d Modeling and Animation. I guess we'll have to see how far I get this time. I really just want to play some Car Wars. - Eck
  2. It's been a while since my last developer journal. Mainly because I've been doing lots of things besides development. I've been playing lots of video games: Borderlands 2, Battletech, Master of Orion 2, and Blood Bowl 2. I've been doing lots of Blood Bowl and Twilight Imperium stuff including writing after action reports, twitch streams, and podcasts. I've also been completing some home improvement projects, learning German, working out, and just working. In short, I haven't made Car Wars a priority and so it doesn't get any of my time. Even though I've been productive in other "useful" things, my goof-off time hasn't really been a conscious decision and so I feel a little bit down from slacking off. This is something I've talked about in previous journal posts. It's okay to goof off so long as you prompt yourself, "Hey self. Instead of playing Blood Bowl, I could be working on my side project... Am I cool with goofing off and messing around instead of making progress?" If you ask yourself that and the answer is yes, goof off with a clear conscious. Otherwise you'll binge several hours of a video game and before you know it, that's one more day without any progress. Anyway, I actually HAVE made some progress. It's just not as much as I'd like. Most of this was working when I posted the last Car Wars journal. I worked out a few design decisions and fixed a few bugs. I also spent quite a bit of time cleaning up my object pooler, commenting the heck out of it and making the code asset worthy. I still need to do a few things like record a demo video, and create some store page assets for it before I can publish it on the Unity asset store, so expect that in a week or two. Here's a video for what I have so far: I have no skills in modelling, animating, or basically anything creative. So I franken-bashed a bunch of free assets together including different animations, a model, and making my own animation controller. I think it looks pretty cool for the prototype stage. I create the move order ghosts by instantiating a copy of the pedestrian through my object pooler, and make them translucent by turning the alpha of the materials down. To get the highlight effect, I just change the material color to yellow. // A couple of cached references to the renderers protected MeshRenderer tokenMeshRenderer = null; public MeshRenderer TokenMeshRenderer { get { if (tokenMeshRenderer == null) tokenMeshRenderer = GetComponentInChildren<MeshRenderer>(); return tokenMeshRenderer; } } protected SkinnedMeshRenderer modelMeshRenderer = null; public SkinnedMeshRenderer ModelMeshRenderer { get { if (modelMeshRenderer == null) modelMeshRenderer = GetComponentInChildren<SkinnedMeshRenderer>(); return modelMeshRenderer; } } private void SetTransparency(float transparency) { Color color = TokenMeshRenderer.material.color; color.a = transparency; TokenMeshRenderer.material.color = color; color = ModelMeshRenderer.material.color; color.a = transparency; ModelMeshRenderer.material.color = color; } public void SetColor(Color newColor) { Color color = TokenMeshRenderer.material.color; newColor.a = color.a; TokenMeshRenderer.material.color = newColor; color = ModelMeshRenderer.material.color; ModelMeshRenderer.material.color = newColor; } So now I have the very basics of turn-based mechanics worked out. I was lost in the weeds for a few days as I thought about all the different possibilities of how to tackle this problem. Do I let everyone plan everything and then execute in the correct sequence? What about collisions? How about allowing units to plan future phases out? What about keeping information from the other player hidden. How about when two cars are moving really fast and they're nearby each other? Should I present a timeline and allow the user to scrub through it for their planned movement and their opponent's approximated movement? ... and so on. Eventually I came to the conclusion that I need to just pick a direction and go. So I decided on something a bit simpler for now. Units will move in initiative order, and complete their movement for the phase before the next unit is allowed to go. This keeps the problem space much simpler and lets me work the kinks out of a turn-based mechanics system. As I code this simpler version, I'll try to make design decisions that consider some of the other problems I identified. Hopefully, that will make future refactors and features easier. Tips from your Uncle Eck If you don't make your game dev project a priority, then you won't make any progress on it. When you get overwhelmed by a complex design, take a step back and try to focus on a subset of the problem. Then expand on that as more of the problem gets solved. A decent solution now is far better than a perfect solution that never happens. Charity Fund Raising I'm helping raise money through Extra Life which is a charity that helps sick kids. Give a little something if you can. And share the links below if you have time. Thanks! My Extra Life page - https://www.extra-life.org/index.cfm?fuseaction=donorDrive.participant&participantID=367649 Twitter Post for sharing Facebook Post for sharing Notice/Disclaimer Car Wars is a registered trademark of Steve Jackson Games, and the Car Wars logo is copyrighted by Steve Jackson Games. All rights are reserved by SJ Games. This logo is used here in accordance with the SJ Games online policy. Computer Games based on SJ properties are prohibited so I'll never be able to release this project to the public (not even for free). It's just a fun personal project for myself and the most I'll be able to share is my experiences while working on it. In my pipe dream I'll get this into a cool enough state that SJ Games contacts me to publish the game. But what's more likely is a cease and desist letter. We'll just have to see how things go. Here's hoping. If you're interested in legit Car Wars products, I recommend Warehouse 23: http://www.warehouse23.com/products/car-wars-deluxe-edition
  3. Again we had a 6-player game planned but our 6th player canceled a few days before Game Day. One of these days we'll get a 6-player game going, but today was not the day. We did random races for everyone but the newest player who we gave Federation of Sol. These were the races: From left to right Alexander - Universities of Jol'Nar (purple) Mike - Naalu Collective (yellow) - can't see him but he's the guy sitting behind Alex Dom - Federation of Sol (blue) Devin - Nekro Virus (black) Eck (and his beard) - Embers of Muaat (red) We used the TI4 balanced map generator here: https://ti4-map-generator.derekpeterson.ca/ using the 5 player "notch" style. Here's what it rolled up: Mentak (#2 on the map) changed out to be Nekro Virus the night before. I showed it to everyone and they thought it was fine. I felt like I had a pretty sweet setup with that 5 resource system right next door, but it was my ONLY system and since I was Embers of Muaat, I didn't mind taking it. The person I was worried about the most was Naalu (#9 on the map), but I was under the impression he was a veteran player. With him running Naalu, I didn't mind a tougher start for him. He wanted to offer Alex and me a trade good for our notched starting position. I turned it down. The Embers of Muaat are a proud people and do not need your charity! Jol'nar happily took the trade good. Later on I found out Mike was a newer player so felt kinda bad for his start. I set everything up the night before so we'd be ready to hit the ground running, first thing. TI 4 is such a grand game. Round 0 Round 1 Normally round 1 is only marginally interesting so I'd summarise and skip the picture. But this is what happened. The Nekro virus chose Warfare and expanded to two systems adjacent to Mecatol to secure a point. Embers of Muaat became neighbors to Jol'Nar to trade. And Federation of Sol researched Gravity drive and took one of the only good systems in range of Naalu. Dom (Federation of Sol) was kind of new and I explained how aggressive a move that was, but he and Mike (Naalu) said them fighting was a common theme in their games. I made sure to reiterate that the goal is victory points. I actually started out with Contstruction, so I could have a decent star dock a bit closer to the action. Round 2 I took Construction for the second time in a row to solidify the borders everyone was politely agreeing on. I also traded my War Sun promissory note to Jol'Nar in exchange for his research agreement and Hyper Metabolism to help with my Command Counter addiction. Since I had been trading so much money with Jol'Nar and he was able to expand so quickly to his planets he was able to put start a substantial and mobile fleet. Federation of Sol Consolidated his holdings on the Naalu border and pushed towards Mecatol Rex. At this point Naalu was feeling the pressure and realized how resource starved he was. Also, Naalu and Jol'Nar kept taking Leadership and Technology so Nekro was a little token starved and so was I. Round 3 You'll notice a lot of black plastic disappeared in this shot. Nekro took Mecatol Rex this round. I had given him my Cease Fire earlier for something and I wanted it back. After upgrading my 4 PDS adjacent to Mecatol I activated the system and asked for my Cease Fire back. He declined and the fight did not go his way. This did two things. It left the airspace of that 4 PDS system open and so Jol'Nar was able to fly through that and claim another tech specialty planet from Nekro and blow up the recently built space dock. That double whammy really started the downfall of the Nekro for the rest of the game. People didn't feel too bad at this point since Nekro was at 4 points and the rest of us were at 0-2. I was so engrossed in my side of the board I only vaguely remember some of the Naalu/Sol agression that went on. I remember there was some betrayal and Naalu was reeling from the fights. He had a couple of fleets but couldn't strike into Sol territory without being very exposed. At that point he pleaded for the benevolent Embers of Muat for aid. In exchange, he would give me one trade good every time he got refreshed. So I gave him the blueprints for my Peace Spheres (War Sun is an extremist propaganda term used by the space media). I even helped fund his first one later on. He roleplayed up the whole vassal thing a few times during the game which was cool. During the Agenda phase I also pushed the vote to give Naalu the Prophecy of Ixth giving him +1 to his fighter rolls. A few people even put riders on it, and Nekro picked up Spec Ops 2 so everyone was somewhat appeased (and I was sitting on Mecatol with a decent fleet). Muahaha or... Muu a a a aat! Round 4 This was another tense round. Look at that purple fleet! He looked me square in the eye and said, "It's not for you." And I had a choice to make. I had a decent shot at taking that fleet out right then, but I'd probably have to give up Mecatol to do it. I pride myself on not being the first to backstab so I rolled the dice and trusted him. At this point I think I picked up Cruiser two and solidified my Mecatol position. If anyone came at me, it was going to hurt. Naalu was able to finally bloody Federations of Sol's nose and was back in the game. Everyone started scoring victory points on tech/planet objectives now. Round 5 At the start of the round I decided to make my move and I chose Imperial. I knew I wouldn't be able to hold everything, but the game was going to be a glorious fireball of awesomeness. Everyone was already deciding who was going to try and engage me, and then the Federation of Sol player played his Imperial Arbiter title to take Imperial away from me. And just like that, the table went back to a tense-mostly peace. Naalu started moving in on Jol'Nar's territory but didn't attack anything yet. Still there was some implied pressure from his crystal fighter II's with a +1. Definitely not insignificant. With Mecatol rex, a few influence planets, and Hyper Metabolism I was gaining 7 command counters a round. I kept pumping more and more into fleet. At this point I think I was at 7 or 8. The stage 2 that got flipped last round was own 6 planets with the same trait. A nigh impossible task... But with nearly all my Cruiser II's on the board that meant I could strike out anywhere I needed to. I stalled until everyone had passed to make my move. I even gave away my support for the throne for my Naalu (my loyal vassal) to retreat away from the hex he was originally retreating to. Then I flew out from mecatol rex and snagged up the last two planets I needed. Round 6 Jol'Nar kept his word. The fleet was actually for destroying Nekro's flagship for a secret objective. Naalu struck at Jol'Nar, Jol'Nar fought back. At one point Jol'Nar had a decent fleet go after Naalu's Homeworld but the stacks of fighters there held off the space nerds and their -1 combat rolls. Federation of Sol destroyed my sacrificial cruisers to get back his planets I snagged at the end of last round and he was prepared to assault Mecatol next round. At the end of this round, everyone but Nekro was at 8 or 9 Victory Points and it was going to come down to initiative order. Next round. Round 7 Jol'Nar had the Naalu Promissory Note so he was going to go first. Nekro was speaker so he got to choose the first card. If he chose imperial, that effectively meant Jol'Nar won. If he chose something else, that meant I'd choose imperial. Devin is a great guy and he didn't want to king-make either way. Jol'nar gave him a way out and said don't worry about it, he had it under control. I looked through my action cards cause I knew what was coming. I didn't have a sabotage... I chose Imperial so I could score this round. He played Public Disgrace which means I have to put it back and pick a different card... I asked if anyone wanted to play a Sabotage? Naalu... my glorious vassal locks eyes with me. I tell him, I'll give him my support for the throne so he can be tied for second place... He plays a Sabotage and the table goes wild. I tell Alex he can have the victory but he laughs and says nah. Then he hands me the Gift of Prescience so no one else can steal the victory out from under me. This was one of those rare (extremely rare) instances where being honorable and kind actually clinched the victory instead of throwing the victory away. TI 4 can be an amazing story generator. In the early years we were all emerging from our home systems while the Nekro Virus empire threatened the galaxy. We united against that galactic crisis (Sorry Devin!) and entered an intense cold war period where everyone was building massive fleets including several war suns. After several minor conflicts, it came down to the two super powers on the board racing for the custodian's approval. In the end, Jol'Nar, Naalu, and Muaat chose to work together and ushered in a new age of peace. I picture Sol reluctantly agreeing to abide by the council's decision, but claiming as much territory as they can in the upcoming peace accords. Good game everyone! Previous Game: https://www.gamedev.net/blogs/entry/2265456-twilight-imperium-4th-edition-game-2/ Next Game: Stay tuned!
  4. Yeah, sometimes this is just a public journal/diary of sorts. It's still mostly development related but every once in a while, it's just something cool that's happening in my life. Stay tuned for more programming either this week or next week. Borderlands 2 has its hooks into me pretty good. it was $5 for EVERYTHING so my wife and friends picked it up and we've just been goofing off with it.
  5. It takes a special group of nerds, but when you get a good group going it's an absolute blast. It has a very grand space opera feel to it. If you haven't ever played Master of Orion 2, I highly recommend it. It's an old-school title but it's still my favorite in the 4X genre followed by Stellaris.
  6. For this short holiday week, there wasn't really much to talk about on the Battletech front. I'm fixing minor/safe bugs and waiting on QA to run my Dynamic enum through the ringer. But on the personal project front, I do have an announcement. I started working on a computerized port of Car Wars during my free time over the last couple of weeks and I'll be sharing my progress as I have interesting things to show. Notice/Disclaimer Car Wars is a registered trademark of Steve Jackson Games, and the Car Wars logo is copyrighted by Steve Jackson Games. All rights are reserved by SJ Games. This logo is used here in accordance with the SJ Games online policy. Computer Games based on SJ properties are prohibited so I'll never be able to release this project to the public (not even for free). It's just a fun personal project for myself and the most I'll be able to share is my experiences while working on it. In my pipe dream I'll get this into a cool enough state that SJ Games contacts me to publish the game. But what's more likely is a cease and desist letter. We'll just have to see how things go. Here's hoping. If you're interested in legit Car Wars products, I recommend Warehouse 23. It's what the Car Wars site links to and it seems a bit cheaper than DriveThru RPG http://www.warehouse23.com/products/car-wars-deluxe-edition Why Car Wars? Steve Jackson's Car Wars was a game I fell in love with back in High School in the late 90's. I bought the deluxe edition and picked up any supplements I found at game stores and used book stores. It can be a little on the fiddly side - each turn is 1 second that is broken down into 5 phases. You move paper tokens around on a map an inch at a time performing maneuvers that affect how in-control your driver is. I love this kind of fiddly complexity but it isn't for everyone. I was in college by the time I found anyone willing to play Car Wars and it wasn't nearly often enough for me. Twenty-five years later and I only have between five and ten played games to my name. I figure, the only way I'm going to get to play enough Car Wars to really scratch that itch is if I code the game myself so I can play vs. the AI. I've been working on a Car Wars port off and on throughout the years. XNA, OpenGL, DirectX, etc. I never was skilled or dedicated enough to see the project through to the end. I'm hoping that's different now. This time, I'm going with Unity. There are still plenty of skills that I lack: modeling, animation, sound engineering, etc, (mainly content creation skills). But with the Unity Asset Store there are free and paid for assets that I'll be able to use without having to resort to "programmer art". Plus I've only mentioned this project in a couple of places and I already have an offer from a die-hard Car Wars fan to help out with some 3d Modeling and Animation. I guess we'll have to see how far I get with this attempt. I really just want to play some Car Wars. Early Goals/Mission Statement In my past attempts, I focused on the math and weird game mechanics for a typical Car Wars game. Getting a car token to move around on the screen, dropping a mine counter, detecting collisions, etc. This time, I want to focus on polish and all the last minute crap you have to do in order to transform your shitty prototype into an actual game. I also want to prioritize finishing a feature before starting a new one. I'm not sure if other developers are like this but here's what happens to me. In professional projects, my coding method works something like this - 1. Think about the problem 2. code something that works (hacky is okay) 3. refactor the hacky code into decent code (hacky rarely okay) 4. test the heck out of it 5. call the feature done and move on. In personal projects, I tend to execute steps 1 and 2, then skip straight to 5 so I can work on something else that's cool and exciting. Eventually my code becomes a mountain of technical debt and doing anything in the project becomes a nightmare. As the code base becomes more and more painful to work in, motivation becomes less and less until eventually I stop working on the project altogether. Not this time! With these things in mind, I started my project with the Main Menu screen. It's not sexy but it's where every game starts and it's a simple problem to solve. It took longer to find the assets than to throw the code together. After I got the quit button working and some free music playing for the main menu, I realized I needed to give credit to the composer and provide a link to their asset. That meant a credits screen. Here's what I have so far. Writing the credits screen, I used it as an excuse to code up a simple object pooler. Each line of text is its own text control that spawns in at the bottom and moves itself to the top of the screen and turns itself off. The object pooler reuses those items. It's overkill for such few items, but it's something I know I'll use in the future when spawning bullets and other high count items. Future Plans What's the first thing that pops into your head when I say Car Wars? A gang of motorcycles swarming a big rig on a desolate stretch of highway? A half dozen vehicles shooting the heck out of each other in an arena battle? Two rival duelists starting a grudge in the middle of town? Well too bad. The first thing I'll be concentrating on is Pedestrians. Why pedestrians? For their basic mechanics, they are relatively simple. This will let me focus on the turn-based game state and let me get that working in a clean way. Once I get the basics down, there are tons of special case rules that I can dive into. Entering parked vehicles, picking up and moving obstacles, jumping onto moving vehicles, etc. Next time I'll be showing some pedestrians planning/exectuing their turn-based movement. Personal Update This weekend the family and I went camping at Green Lakes. The place was beautiful. We went hiking on a few trails, swam in the lake, and even rented kayaks. Of course with camping came grilling out and having smores so it was a good time. Expand the spoiler for some camping pics. Links Twitter Post: https://twitter.com/Eck314/status/1147966512818458625
  7. I'm Chris Eck, and I'm the tools developer at HBS for the Battletech project. I've recently been given permission to write up articles about some of the things I work on which I hope to post on a semi regular basis. Feel free to ask questions about these posts or give me suggestions for future topics. However please note, I am unable to answer any questions about new/unconfirmed features. We shipped Urban Warfare and the launch was relatively smooth. There were only a few critical bugs we needed to patch out and we did so in a timely manner. After that, the team focused on the upgrade to Unity 2018. The day after most of the team was upgraded and many of the kinks were worked out... Unity released a new 2018 version. >.< Still there's lots of cool features and editor performance improvements that I'm looking forward to. Data Driven Enumerations With the team focused on the Unity upgrade process, things were settled down enough for me to finally cram my Enum replacement into the project. It's something I've been wanting to do since last year. I was hoping to get it in during the 1.4 release in December, but some DataManager optimization refactors took priority and caused some stability issues which made testing my code impossible. Why replace enums? Aren't they a good thing? - At first glance, it does seem like enums are great. It's a simple type you can pass around and it gives your code clarity over using an integer or string. Plus it's built into the language so it takes very little effort to implement. In very simple cases, I think they still have their use. But the second you start tying logic to individual values, I think you should strongly consider a data driven approach. I decided to tackle ContractType as my first enum in our code base to replace. It is probably the most complex enum in our game: it touches the Sim Game, the Combat Game, Content Creation, Serialization, and several other systems. If my Dynamic Enum can replace this guy, then it's safe to use it for everything else in our system. Requirements 1. Easy to use in Unity - In Unity enums are drawn as drop down controls and I don't want to lose that. 2. Support int or string as key - I want to be able to use either of these types. Integers if performance is a big deal or strings to keep things human readable. 3. Don't break save games - There needs to be some kind of upgrade path for loading old saves. 4. One place to edit the data - There were at least a dozen places you had to go to add a new Contract Type. I want exactly one place. And I want it in a format that a developer (specifically me) doesn't have to get involved. Getting Unity to draw my data like a drop down was pretty easy. I found an excellent code sample for something similar here: https://gist.github.com/ProGM/9cb9ae1f7c8c2a4bd3873e4df14a6687 So I created my own DynamicEnum attribute and wrote a PropertyDrawer for it. And that knocked out the first two requirements. Here's what the code looks like: To make sure old save games were supported, I created a new constant for ContractType called INVALID_DEFAULT. Any place that stored the old ContractType now got a new ContractTypeID field which defaults to INVALID_DEFAULT_ID. Since this is a new field, old saves wouldn't have it yet. After deserializing these classes, we just check to see if the new field is the INVALID_DEFAULT_ID and if it is, we convert the old Enum value to the integer ID. Any new content created, would serialize correct values while old save games get upgraded to the new way of storing it. I also protected the ID and wrote a property to make sure we were always pulling the correct data. [DynamicEnum(ContractTypeEnumeration.TypeName)] // This is protected so people are forced to use the property. protected int supportedContractTypeID = ContractTypeEnumeration.INVALID_DEFAULT_ID; private ContractType_MDD supportedContractTypeRow = null; public ContractType_MDD SupportedContractTypeRow { get { // If we're loading from an old version, convert the old value to the new value. if (supportedContractTypeID == ContractTypeEnumeration.INVALID_DEFAULT_ID) { supportedContractTypeID = (int)supportedContractType; } // If the cached row is null or out of date, pull the correct one from the database. if (supportedContractTypeRow == null || supportedContractTypeRow.ContractTypeID != supportedContractTypeID) { supportedContractTypeRow = MetadataDatabase.Instance.GetContractTypeByContrctTypeID(supportedContractTypeID); } return supportedContractTypeRow; } } Number four took the longest even if it wasn't the toughest. The concept is simple. Create a class that represents one line item in the original enumeration like ContractType.SimpleBattle. As you identify different code decisions based on individual enumeration values, create fields to store that data. My class cor ContractType wound up looking like this: public class ContractTypeValue : EnumValue { public ContractTypeValue() : base() { } public ContractTypeValue(EnumValue_MDD enumValueRow, ContractType_MDD contractTypeRow) : base (enumValueRow) { Version = (int)contractTypeRow.Version; IsSinglePlayerProcedural = contractTypeRow.IsSinglePlayerProcedural; IsStory = contractTypeRow.IsStory; IsRestoration = contractTypeRow.IsRestoration; CustomMusic = contractTypeRow.CustomMusic; IsMultiplayer = contractTypeRow.IsMultiplayer; UsesFury = contractTypeRow.UsesFury; ContractRewardMultiplier = contractTypeRow.ContractRewardMultiplier; Illustration = contractTypeRow.Illustration; Icon = contractTypeRow.Icon; } public int Version { get; private set; } public bool IsSinglePlayerProcedural { get; private set; } public bool IsStory { get; private set; } public bool IsRestoration { get; private set; } public string CustomMusic { get; private set; } public bool IsMultiplayer { get; private set; } public bool UsesFury { get; private set; } public float ContractRewardMultiplier { get; private set; } public string Illustration { get; private set; } public string Icon { get; private set; } public bool IsStoryOrRestoration { get { return IsStory || IsRestoration; } } } // Old code looks like this bool usesFury = (Combat.EncounterLayerData.SupportedContractType == ContractType.ArenaSkirmish); // New code looks like this bool useFury = Combat.EncounterLayerData.SupportedContractTypeRow.UsesFury; // It's subtle, but makes a big difference. Before we had one hardcoded type that used fury // to change our mind about that we'd have to touch several places in the code where this // fact was coded (UI, game logic, resource loading, etc). If we wanted to add a new contract // type that used fury we'd have to add that with code. With the new system, we just flip // a bit from false to true and now that ContractType uses fury instead. I now have a single json file that contains a list of all the contract types and their associated metadata. Instead of having decisions hard-coded to individual enumeration values, we drive our decisions off the data. This gives us exactly one spot to edit the data and it means designers (and modders too!) can add a new ContractType without getting engineers involved. Before, this was a process that took a while to get right because we would forget ALL the places that ContractType values were being used to drive logic. All in all this refactor touched 88 files and had dozens of different places with hardcoded logic. A big change like this reduces complexity while increasing flexibility which are two big steps in the right direction. Personal Project Update - Car Wars I've wanted a computerized version of Car Wars since high school (which was a few years ago now). Since then, I've started my own version several times but never really made it anywhere of consequence. I have the itch to start it again so I've been working out some decisions on paper and chipping away at things the last few weeks. There's not much to show off yet, but I wanted to announce it as a self-motivational thing. Now that YOU know I'm working on it, I have to KEEP working on it. Otherwise, I'll be letting you down. Tips From your Uncle Eck Be careful with your use of enums, they can be a code smell that something isn't quite right. If you find yourself hardcoding logic to specific enum values, you should definitely consider switching to a data driven system. That way when people change their minds, they can just change the data in a file instead of having to change code and cut a new build. Plus it makes modding your game that much easier. Links Twitter Post: https://twitter.com/Eck314/status/1145358891141738501
  8. Eck

    TableTopCarWars.jpg

    From the album: Eck's Car Wars Clone

  9. Eck

    OpenGLCarWars.JPG

    From the album: Eck's Car Wars Clone

  10. Eck

    CarWarsUnity.JPG

    From the album: Eck's Car Wars Clone

  11. We've been on Unity 5.6 for a loooong time. Mainly because that's what we shipped on. With a lull in the action it's a good time to upgrade. I know for sure there are development side improvements like editor speed/memory/optimizations. As for what features the players will see - I'm not sure. I haven't been following the upgrade discussions much. I've been laser focused on this coding straight for 8+ hours a day. This will almost definitely break mods that had custom contract types, depending on how they implemented it. However, I think the new system will be simple to upgrade to. Basically they'll just need to put a new row in the StreaminAssets/data/enums/ContractType.json and process that file into the MDDB. If there are any serialization issues with save games, they'll have to code up a similar "upgrade path" as I spoke about above. But all of that is relatively simple so they shouldn't be broken for long. Plus I'm on a few Battletech modding discords and will answer questions if anyone runs into some serious issues.
  12. Eck

    Ecks Type

    This is my entry for the Non-shooter side scrolling shooter GameDev Challenge I started way late so it's a relatively simple game that meets all the minimum requirements detailed here: https://www.gamedev.net/blogs/entry/2266997-ping-zap-zing-side-scrolling-arcade-shooter-challenge-without-weapons/ Multiple waves of enemys spawn. Avoid getting shot and try to get the enemies to shoot themselves. There is an invincibility power up in each level. Beat both levels without dying and you win the game. EcksType.zip
  13. I heard about the GameDev challenge quite a while ago but I wasn't sure if I'd have enough time to complete an entry. This weekend I decided to give it a go. I was planning on just working on it in secret and submitting it if I succeeded... But apparently some gamedev people read my twitter feed so the cat's out of the bag now. It's due on June 1st so I didn't give myself much time to complete it. Here's hoping I can complete it in time since @Rutin found out my secret on twitter. >.< I made decent progress on Sunday and Monday. It's definitely not a game yet but the basics are starting to come together. I have a simple menu, Move Patterns, Shoot Patterns, Enemies, and Collision working. I still need to do Enemy Waves, Levels, SoundEffects, Music, Powerups, and polish. Sounds like a lot but I think I have the tough problems solved, and I'm using a bunch of assets from a Humble Bundle so it should come together pretty quickly. Scriptable Objects I try to data drive my programs and I was planning on doing it with XML again. However, Unity made some improvements to ScriptableObjects over the last few versions so I thought I'd give Unity's them a try for this simple project. I really hate the name ScriptableObject... The name gave me a mental block which made it harder to learn the system. I wish they would have called it DataObject or something similar. It's just a data file, but the name ScriptableObject threw me for a loop. Learn more about them here: https://learn.unity.com/tutorial/live-sessions-on-scripting#5c7f8528edbc2a002053b629 I have a simple MovePattern class which is one segment of a MoveSequence. It has a duration, a direction, and a speed. A sequence is made up of a list of MovePatterns and lets you specify whether its play once or a loop. Here is what it looks like: I have similar data structures for Shooting, and enemy spawning. An Enemy is made up of a sprite, a move pattern, and a shoot pattern. We just reference these ScriptableObjects(data files) the same way we'd point to a prefab on disk. When I release the game, I'll put my code in a zip or git repo where anyone can download and mess with it. I like how easy it is to use the ScriptableObjects to throw something together. You can use the editor to create new data files and configure them in the inspector. However the end user won't be able to edit these things without jumping through a few hoops. If it was just an xml or json file in the StreamingAssets folder the end user could easily just edit those files and mod your game. For real applications I'll probably stick to actual data files instead of ScriptableObjects but for some quick and dirty stuff like a game jam, this was pretty slick.
  14. Holy cow Racing Destruction Set. You must be as old as me. I played that on the Atari 800 XL and the Commodore 64. I didn't get a chance to play Autoduel or Roadwar but they both look amazing.
  • Advertisement
×

Important Information

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

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!