Wednesday, November 26, 2014

Editing Geos

Man, the geos were tougher than I expected.  It turns out that I was almost done with the code before I realized that I'd made some big mistakes early on that affected almost all of my code.  Basically, I forgot how the vertices were stored.  The vertices in the geos are stored in pairs for each line.  For example [50,0,0,50,0,50,100,50] is a triangle with the vertices 50x0, 0x50, and 100x50.  However, I forgot that and thought each vertex was stored only once ([50,0,0,50,100,50]).  I didn't try to do any collision testing against them or display any textures on them until the end, so my error didn't show for a long time.

I got that fixed, though it took alot of debugging before it was working right.  And after that, some old errors that I didn't know about surfaced.  Fortunately, these ones were sort of expected.  They had to do with breaking the shapes down into triangles in order to draw them.  A triangle geo won't need any breaking down and a square will be only two triangles, but a complex shape requires some deep thinking to break down.

Because it's alot of complex math, it's easy to overlook things.  While one shape might be broken down just fine, another might present a case that I hadn't thought of and it will either draw incorrectly or crash.  After alot of bashing my head against my desk, I got it working.  It works flawlessly now as far as I can tell.  I just have a couple more things to do with it before I start on the save feature.

I know this post wasn't all that exciting (as usual, lately), but soon I'll have more exciting news to share.  The editor is the boring hurdle that I need to get over before things take off.  I won't be working on it again until Monday, however.  But stick with me.  Thanks for reading!

clevceo

Tuesday, November 25, 2014

Editor (Continued...)

I'm still hard at work on the editor.  Today I finished all of the route editing portion.  It took me a good while, but that part is done.  Once again, I probably put too much work into making it intuitive and foolproof, but hopefully it makes the level editing faster and easier in the future.

The next step is the geos.  It shouldn't actually be too hard.  I just need to allow the user to add, move, and delete vertices.  Also, for convenience, I'll probably add a way to move the entire geo at once.  The vertices in a geo are world coordinates rather than being relative to the upper-left corner of the geo, so moving an entire geo would mean moving all of its vertices simultaneously.

I'm stoked for the geos to be complete.  Once they're done, I can work on the save feature, which shouldn't be too bad.  Once that's done, I can finally create levels quickly and try them out.  At that point, I'll probably start posting more often because there will be alot more to talk about.  Also, I'll be going back into the engine and improving the AI, experimenting with new mechanics, etc.  It's exciting.

Thanks for reading!
clevceo

Thursday, November 20, 2014

Editor

I decided that I didn't absolutely need the listbox control, so I decided to get started building the editor.  When I need the listbox, I'll build it.

Until today, all of my time has been spent just putting together the gui for the editor.  I probably spent more time than I had to, actually.  I put some work into the textboxes so that they validate your input.  I could have just left it, but I'm hoping that it will save time and frustration in the future.

I started building the rest of the editor today.  You can add nodes now, though you can't modify or delete them once added.  It's not that special yet, but now that the gui is done, it's going to progress quickly.  I'm excited for the day when I can load and save levels and actually try them out.

I've been thinking of more ideas for levels.  I'm itching to finally try them all out.  I wish the day was here already.

Thanks for reading!

clevceo

Friday, November 14, 2014

Graphical User Interface (Continued...)

Today, I made some good progress on the graphical user interface library.  Specifically, I completed the two most difficult controls that I'll need: the textbox and combobox.  Next is the listbox.

This library does something that my last one didn't.  When I built my previous library, I didn't know how to clip graphics at the edge of the control.  In other words, if there was too much text on a button, it would spill over the sides.  I thought you had to create a buffer the size of the control, draw on it, and then copy it to the screen.  I found out today, however, that you can use a "scissor rectangle" to clip the edges.  Basically, you say what part of the screen you want to draw to and it will clip anything that runs outside of it.

This doesn't make a huge difference with buttons and similar controls because I'm not going to put too much text in them anyway.  But it's really handy for textboxes.  In my last version, I just calculated how many characters would fit in the box and only drew that many.  This took more processing and wasn't pretty.  It will also come in handy if I ever need to build a scrolling panel.

I'm excited to finish the listbox because that means I'll be able to really start building the editor.  Before we know it, I'll be building levels willy nilly and Sever will be progressing much faster.

Once I have the editor up and running, I'll post screenshots.  If you ever have any suggestions or comments, please share them.  Thanks for reading!

clevceo

Thursday, November 13, 2014

Graphical User Interface

I haven't really touched the gameplay since my last post.  Instead, I've been working on building a graphical user interface library for use in the game.  I'll explain why.

I feel like I've reached the point where I can really start experimenting with the mechanics of the game, but manually editing the levels with a text editor is really really tedious and I have to guess at the numbers and run the game to see what it looks like and then go back and tweak them until they look right.  Long story short, it's extremely inefficient and not fun at all.  That's why the latest videos have no geography.  It's just a blank space with two players in it.

Time to build a level editor.  With a level editor, I feel like I can experiment with level layouts quickly and test the gameplay to explore what's fun and what's not.  I really feel like this is the next step.

What was holding me back from building an editor before was the lack of a graphical user interface library.  I built one in 2006 or 2007, but I was too overzealous and it ended up being a big clunky mess.  I didn't think so at the time, however,  I thought it was the bees knees.  It was as close a copy of the WinForms functionality as I could get it, which is overboard for my needs, to be honest.  Because of the time I spent on it last time, I've had a good idea of how I wanted to do it, but it was a bit daunting.

However, I finally decided to stop dragging my feet and just build the darn thing.  The foundation is working now.  I have buttons, labels, etc. and they're working great.  I already like it alot better than my last one.  It's alot cleaner and smoother to use.  The next controls I need to build are the textbox, listbox, and combobox.  The listbox shouldn't be too bad, but the textbox and combobox will be a bit of a pain.  However, once they're done, building the game's and editor's interfaces will be a cakewalk.

After I'm done with it, I'll hunker down and build the editor.  After that's completed (enough), things should really start moving along with the mechanics.

Since the time is coming when I can start experimenting with different levels and even try to play with story a bit, my mind has been running wild with various ideas.  I have some good ones that I'm excited to try out.  I know it's probably a bit early for that, so I'm not setting anything in stone yet, but I think the mere act of experimentation and exploration will help me develop the mechanics of the game.

Thanks for reading!

clevceo

Monday, November 10, 2014

AI Threading, Route Density

The only thing I did with AI today was a quick optimization.  Being inexperienced with threads, I didn't realize that starting and stopping the AI thread with each cycle is costly.  It takes a little time and you could see a little stutter.  At the time, I wasn't sure if that was why it was stuttering, but I decided to change the AI so that it runs on a continuous thread and just loops while it waits for new info from the main thread.  I wanted to see if that would fix the stutter.  Sure enough it did.  It runs silky smooth right now.

The other change I made was to the balance of the game.  Specifically, it had to do with the density of people within the routes.  Before I explain the change, I'll explain the purpose that the people play in Sever.

The little builder people that run through the routes and build new segments exist as a resource.  The idea is that more you have, the faster you can build.  They are produced at a regular rate from the parent nodes, so you don't have to create them yourself like you would in other games.  Instead, it controls the player's pace in the construction of his routes.  If he builds faster than his people can be produced, then the people are too spaced out and don't build as fast.  This is especially crucial when actually fighting the enemy.  The one with the fastest routes has the advantage.  On the flipside, if he expands too slowly, he might reach full capacity and production will stop.

This causes the player to want to protect his people.  Some are lost in defending and attacking, but the less the better.  The more of the enemy's people are destroyed, the more of an advantage the player has.  Also, to prevent the enemy from replenishing, the player will want to keep attacking until the enemy is destroyed.  Otherwise, the enemy could make a comeback.

Having more people also allows for more strategies.  For example, if there are enough people in a segment that is aiming to intersect an enemy's segment, and the player needs to use that segment slot, he can split his own segment, freeing up the slot and allowing the end of the segment to run into the enemy like a projectile.

As long as the player continues to expand, production will likely never stop, so that's a rare issue.  However, density can still get really low.  Sometimes when fighting the enemy, the player can't help but expand quickly and lose lots of people.  In this case, the player can restore his density by retracting unneeded route segments.  Some players might even make a stockpile of them behind their base so that they have them when they need them.

That was the plan for the people when I was first thinking through Sever's concept.  This would only work if I could get the number of people to really matter and make a difference in the game.  Until now, the density made a minor difference.  Expanding fast and overwhelming the enemy with lots of slow routes coming at them was more effecting than precision attacks with a few fast routes.  Changing the rate at which people move, build, or are generated didn't make a difference.

I knew that if I couldn't fix this issue, then I should probably cut the people and have routes build at a smooth fixed rate.  I could do that and make the game work, but there would be alot less depth and strategy in the game.  Overwhelming the enemy with tons of attacks would be the primary objective, and the AI is an absolute pro at that.  But humans can't make issue commands as quickly as the AI can, so that puts the human at a disadvantage.  And besides, it's just not as fun and allows for less variety and styles of play.

I knew that to reward the player for having more people, I'd have to make the difference between a sparse route and a dense route wider.  I came up with the idea to make the people in dense routes move faster and sparse routes move slower.  I've implemented it and it works.  The AI went from unfairly hard to beat to alot easier.  However, the advantage is slightly on the player's side now.  The AI just throws routes at the player without even thinking about density.  Next, I'll have to get the AI to be a bit more picky with construction and retract unneeded segments.  We'll see how it goes.

Thanks for reading!

clevceo

Thursday, November 6, 2014

Sweet AI Update

Good news!  I tweaked the AI and it's beautiful!  Of course, it can be improved (it leaves its backdoor open, which is honestly the only way I can beat it right now), but it's hard!  I had to play it over and over again to get a good video of me beating it.  However, I decided to include one of it creaming me as well.  It moves fast, much faster than I expected.  It's really exciting to see it working so well all of a sudden.

First, watch it destroy me (fog of war is faded so you can see what the AI is doing).  It's hard to see exactly how it beat me, so you might need to expand the video.  If you'll notice, after a segment is split, the end that was cut off still has a short amount of time to run into an enemy segment before it shrinks into nothing.  In effect, it turns into a short range missile.  Watch the AI take advantage of that when he takes me out.



Next, watch me exact my revenge.



I'll bet you're glad the big pink thing from my last video is gone.  Unfortunately, It will be back soon.  However, I might change the texture so it doesn't look so bad.  You might also have noticed that I've tweaked the colors.  The AI is red and mine are light blue (green when building a new node).

I think today's update is proof of Sever's promise as a fun game.  There are definitely some issues I need to consider as I move forward, but all of my fear that the AI would be too hard to implement are gone.  I may not be able to create a genius AI, but almost all AIs are exploitable, so I'll be in good company.

It's nice to finally have something interesting to show.  Hopefully I'm not the only one that thinks so.  Thanks for reading!

clevceo

Wednesday, November 5, 2014

AI Working (Enough)

The AI syncing works.  There were a few hiccups, but I figured them out.  It now tries to attack the player.  It's still not very smart at all, but it avoids obstacles and consciously aims for the player's routes.  It's somewhat easy to beat since it's so predictable.  In other words, it will aim a route at one of my segments, I'll block it, and it will repeat the same move over and over again until I do something different.  Meanwhile, I'll have another route circling around the back and flanking him.  It makes it pretty darn easy since he doesn't consider defense at all yet.  Nevertheless, it's real fun to see it actually having a strategy and making moves that aren't scripted.

From here, I want to create a level editor so that I can test the AI in different environments without manually typing up all the level data like I did for the one you saw in the screenshots and video.  It looks simple, but when you have to type it all out, it's not so simple anymore.

I created a level editor once before in a previous version of Sever, and I think it was pretty good.  However, I was using a custom GUI library that I had created.  I don't know if I want to pull that out again because it's way too complex for my purposes.  I was a bit overzealous.  I can probably make something much faster and simpler from scratch.  Unfortunately, it's going to take a little extra time to do.  But it will be worth it.

I know this blog is really boring because I'm still building the core game engine, and I understand if no one actually chooses to read it much just yet.  If you've read this far, however, I'm hoping it's because you're at least somewhat interested.  But please check back periodically to see the progress.  Hopefully you'll eventually start to like what you see.  Thanks for reading!

clevceo

Tuesday, November 4, 2014

AI Syncing Continued

Today, I got the AI syncing ready for testing.  It runs, but I don't know yet whether everything is syncing correctly.  It was a very tedious process to get it to this point, so I'm excited for it to be over.  I'm sure I'll be making modifications in the future, but I have the foundation completed.  Hopefully I'll just be making small revisions or adding to it in the future instead of rewriting everything.  But I don't think I will, because I really think it's a good system.

I'm debating whether I should just build a simple AI and the networking, and then put all of my focus into just experimenting with the mechanics so I can evolve the gameplay.  My reasoning is that I might write an entire AI only to either rewrite it to fit new mechanics or never evolve the game because I don't want to rewrite the AI.  I could instead build a simple AI and rely on networking to test the gameplay.  However, at the same time, I don't yet have someone to test it with, so I'd have to either find testers or another developer to work with before I can move forward, and I really don't want Sever's development to be dependent on anyone's time other than my own.

The other possibility is to try to make the AI flexible so that I can easily modify it to work with new mechanics.  I'm not sure.  It's a bit scary, to be honest.  But I don't want to give up just yet.  One thing that's encouraging is that I don't plan to change the mechanics that much.  I don't want to add features willy nilly.  I'll only add mechanics that I think will feel true to the game mechanics, like they belong.  The game will be hyper-focused on the core game mechanics and will merely try to explore every possible situation presented by those few mechanics.  This will keep the game tight and smaller than most RTS's.

I'm scared again, but I pushed through last time, and I plan to do it again.  Thanks for reading!

clevceo

Monday, November 3, 2014

AI Syncing

I've been putting alot of time into updating the AI's version of the world each time it cycles.  I mentioned in the last post that I was working on having it compile a list of world events and letting the AI apply them to its own version of the world.  That feature is close to completion.  I have the list of events compiled and sent to the AI, but the AI doesn't interpret the data just yet.  That's the next step.  It feels like alot of work, but it's definitely worth it.  The game used to hang for a fraction of a second every time the AI cycled, but now it's seamless.  I've completed all the work that the main thread will do, so this should be the final main thread performance (AI-wise anyway).

Once I have the AI interpreting the data, I can really start working on the AI decision-making.  It's tedious, but really exciting.

Thanks for reading!

clevceo