Jump to content
  • Advertisement
Sign in to follow this  
  • entries
    16
  • comments
    35
  • views
    17034

Project: Towadev

How i failed the tower defense GD competition

Sign in to follow this  
Finalspace

821 views

This will be a post mortem explaining how i failed the game dev competition for a tower defense game, so here it goes.

In the start of june 2018 i found the tower challenge post by accident, read the description and was really excited.
So i decided to apply and started right away - without any planning whatsoever.

I created a new visual c++ project and after 3 evenings with a couple of hours i got the basic game mechanics nailed down:
Enemies could be spawned and moved from waypoint to waypoint along a direction and randomly placed towers could hit and destroy it.
Everything (tiles/enemies/towers) was defined in static int arrays, so i can adjust it however i like.
It was going very smoothly and i was very happy with it.

The next 2 evenings was a nightmare. I made a new map and suddently everything was broken.
All the towers was shooting randomly, the enemies was not following the waypoints anymore, bullets missed all the enemies and so on, even the spawning was behaving weirdly. So it took me 7 hours to find all those bugs and fix them.

After that in the next evening i refactored the current code, made it more robust and fixed a few bugs.
In addition i added basic HUD rendering to display lives, score, money, current wave, etc.
Now it was looking really good so far and the game was already playable.

The next day for whatever reason i decided to use the editor "TileD" to setup everything.
I have no idea why i wanted that, maybe i thought it would save me time or something but i was wrong.
Even after 5 evenings, i still couldnt´t figure out how to get towers/enemies/waves defined in the TMX file.
So i partly gave up on that idea and ended up just defining the walkable tiles and the waypoints in the TMX file.
In addition i created a shitton of code just to parse a TMX file - including writing a generic xml parser in C99.
The only thing useful i made in that 5 evening was that parser 😞
This entire process took me ~20 hours -> 4*8 useless workhours minus 2 hours for writing the xml parser.

After that the next 3 evenings i did of lot of refactoring needed to get the TMX loaded in the way i wanted. The result was not that bad. I now could define all the waypoints, the walkable and placeable tiles in the editor and setup as many spawners as i want. This took me about ~6 hours.

The next 2 evenings was a blast! I was very productive and added a lot of functionality and fixed a lot of bugs.
I now had a fine looking HUD , multliple waves with multiple spawners for each wave.
In addition i improved almost every part of the game, even the towers was rotating smoothly against the target now and you could lose or win the game.
The "game" finally started to take shape.

Of course after a blast, there comes the opposite of that: Destroying and unproductivity!
In one evening i broke the tower rotation, the enemy position prediction, the rendering and even the HUD.
Why of a sudden did everything brake? It may be that i just wanted to make it "even better" -> Over complicating simple things!

In the following evening i reverted everything and simplified a lot of the game mechanics.
Now all of a sudden the enemy prediction worked and the tower rotation was correct and very smooth.
But the font rendering seems to be totally broken now - after switching to a new font. So i had no choice to still use the old font 😞

Many evenings later with a lot of delays between, i finally fixed the nasty font rendering bug.
It took me over 10 hours to find that bug and 5 seconds to fix it... Now the new font or any other font works just fine.
In addition i made a few simple functions to render and handle UI buttons - to select the appropriate tower.

Now i got sick i could barely do anything, so i was of for over a week.


After that i wanted get rid of the ugly dev graphics, so in 2 hours i made a push rendering system + opengl implementation and changed everything to it.
It looked exactly the same as it was before, but now it was much more flexible and i finally could add sprites to the game.

The next day i successfully added loading and rendering of sprites in just about 30 minutes.
Then i searched the net for a free tileset, which i can use to test the sprite rendering. After i found one, i changed the TMX map to use it.

The following 4 evenings i have written a lot of code for parsing/converting/rendering the tilesets from the TMX, but with wrong results.
All the UV´s was incorrect and even after spending hours of debugging i could not find the bug at all.

Now there was a full week where i didn´t do anything. The motivation was gone.

The first evening in the following week i was still not motivated at all, but i wanted to get this finally fixed so i forced myself to analyze the code again - searching for the UV bug and after a short amount of time, i finally found the bug... It was just a typo... After fixing that typo now all the UV´s was correct and everything looked fine.

In the next evening i added 3 more layers to the TMX map, trying to make it look more prettier. But there was a problem, the fixed map dimension was not sufficient to make use of the tilesheet i was going for. So i decided to change the entire system from a fixed map size to a dynamic one and this was pretty expensive from a time perspective, it took me around 2-3 hours.

Now i had just a few days left before the deadline.

The following days i moved all the wave/enemy/tower definitions into separated xml files, so i can starting making the actual 20 waves/enemies and a few towers. Of course this required me to change a lot of the internal systems, but the written xml parser now payed of and in an hour it was changed very easialy. Now i started to fiddle around with the data, trying to add more waves, more towers... Such tasks are not my thing, so it took me two hours just to add another wave and another tower 😞

So now i had one day left before the deadline and the game was not even close to be finished.
I had one level, two waves, two towers, two enemies and very basic game mechanics working, without upgradable towers.
Also i had no final art, no sound or music, not even a menu 😞

The following days i was really depressed about it, so i was not working at the project at all, so i failed and missed the deadline.

 

So now comes my reasons why i failed it:

1.) I didn´t plan anything

I had no idea which art style i was going for
I had not slicest idea what type of waves/towers/enemies i want
I had no idea how the level should look like
I didn´t set any goals or milestones or tasks whatsoever

2.) Forcing myself to use the TileD editor was a huge mistake

For such a little project, one level should be just fine. So why the heck do i need a editor when i just want to have one level anyway?
The only thing i needed to setup in the editor was the visual tiles, the walkable and placable areas and the positions for the spawners and thats it.

3.) I added a lot of complexity without thinking it through

At work i always do that, but for some f*cking reason on private projects i never do that and that always kills me.
I should have sticked with the simplest solution in all cases, then i may had finished it in time.

4.) I didn´t continously worked on the game

There was too many days of me not working on the game at all. I should at least made one little thing each day or something like that.

 

But not everything was bad, at various point i made a lot of progress and the last build i made was not that bad.
It was playable, you can win or lose the game - it just lacks content in a all places, so i decided to finish the game to end of september - to have at least one finished game made in my life. Thats almost two month´s from today - counting just the days, that should be doable - even with my limited time budget.

Sign in to follow this  


0 Comments


Recommended Comments

Great writeup! :) And I don't know about anyone else but I find analysing where things went wrong just as (or more) useful than cases when things went according to plan.

Definitely it sounds like trying to make a map editor was a big ask, I saw that both Awoken and Eddie struggled with doing the map editing functionality AND the game at the same time, whereas those of us who did the maps procedurally had an easier time. And it sounds like writing the code for drawing sprites too was making it a big job, compared to using some kind of engine or library.

Share this comment


Link to comment
10 hours ago, lawnjelly said:

Great writeup! :) And I don't know about anyone else but I find analysing where things went wrong just as (or more) useful than cases when things went according to plan.

Thanks! Its my first time critizing myself in a blog like this so i had no idea how this will go.

10 hours ago, lawnjelly said:

Definitely it sounds like trying to make a map editor was a big ask, I saw that both Awoken and Eddie struggled with doing the map editing functionality AND the game at the same time, whereas those of us who did the maps procedurally had an easier time. And it sounds like writing the code for drawing sprites too was making it a big job, compared to using some kind of engine or library.

Yeah, writing a editor for such small projects are just overkill - especially if you dont have time for that. But using a existing one which is not suitable for your game is much worse - like in my case. i think it would have been better when i have written it myself - especially because i have a dozens in the past already and i know how this things are implemented.

10 hours ago, lawnjelly said:

And it sounds like writing the code for drawing sprites too was making it a big job, compared to using some kind of engine or library.

I always have the requirement to write everything myself, not using any engine or thirdparty library. I dont mind fighting against technical issues. Also i normally dont have technical issues, because i already did all those stuff a lot in the past, so i know how it works. The two issues i had was a typo and a too small sized font atlas - thats it. Everything else was just wrong decision making... But maybe i try to make the project with unreal, just to see if this would be a different.

Share this comment


Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Advertisement
  • Advertisement
  • What is your GameDev Story?

    In 2019 we are celebrating 20 years of GameDev.net! Share your GameDev Story with us.

    (You must login to your GameDev.net account.)

  • Blog Entries

  • Similar Content

    • By belfegor
      I had some code that worked before and it doesn't now. I have created minimal c++ project that can reproduce problem.
      #include <iostream> void PrintFooM(); class Foo { int m; explicit Foo(int dummy) {} Foo(); public: static Foo& GetInstance() { static Foo f; return f; } int GetM() const { return m; } }; Foo::Foo() : Foo(-1) { m = 3; PrintFooM(); } void PrintFooM() { std::cout << "M = " << Foo::GetInstance().GetM() << std::endl; } int main() { Foo::GetInstance(); return 0; } Code runs till PrintFooM function is called and its stuck there (like in some endless loop). Never prints anything in console.
      I am using VS2017 community.
    • By ArcEcho
      Recently,I am studying bullet3 and DirectX 11.And I got some wired results like the attachments shows.It should be a sphere not a flat plane.
      I extended the btIDebugDraw to draw lines.The draw line api works correctly independently.And I traced the call stack and found there was some thing wrong with the bullet transform .I have no idea about how it acts like that. So I ask for help here.Any help or tips will  be apreciated.
       


    • By maltman
      I have used EnTT for a few half finished projects. I like it because, as a more intermediate programmer, it forced me into the pattern. Sort of like coding on rails a bit in a good way.
      Part of my feels that it is too much of a bother for most projects. Another part of me feels like that the ECS pattern is only going to get more common and that I should be concerned about data locality and speed no matter what (otherwise why am I even writing in C++?). I've honestly never had a project which needed the extra performance boost that an ECS library would give me. Usually my bottleneck is inefficient collision detection and noob rendering. 
      Two parts of my mind are conflicting: one tells me that using a library is great because it lets me how things are supposed to be done, and that I should use a library of every type before I try to roll my own. Another part of my mind tells me that I will never fully learn this stuff without rolling my own and that I am wasting my time using a library when I can't even roll my own and don't know completely how it all works.
      Anyhow, let me know your thoughts and experiences with ECS libraries.
       
    • By ADDMX
      Hi
      It is possible at all to copy descriptors between _two different_ heaps ? The documentation says so:
       
      First (source) heap is:
          D3D12_DESCRIPTOR_HEAP_DESC HeapDesc;     HeapDesc.NumDescriptors = 256;     HeapDesc.Type           = D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER;     HeapDesc.Flags          = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;     HeapDesc.NodeMask       = 0; and SrcHeap->GetCPUDescriptorHandleForHeapStart() ==> Handle.ptr == 4 (strange, value indeed, I'd expected ptr as in case of GPU handles)
      Second (destination) heap is:
          HeapDesc.NumDescriptors = 128;     HeapDesc.Type           = D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER;     HeapDesc.Flags          = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;     HeapDesc.NodeMask       = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE; and DstHeap->GetCPUDescriptorHandleForHeapStart() ==> Handle.ptr == 9 (strange, value indeed, I'd expected ptr as in case of GPU handles)
      and I want to copy elements 5, 6, and 7 from first one to the second one
      auto Increment = Device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER); // Return 32 CD3DX12_CPU_DESCRIPTOR_HANDLE Src = CD3DX12_CPU_DESCRIPTOR_HANDLE(SrcHeap->GetCPUDescriptorHandleForHeapStart(), 5, Increment); CD3DX12_CPU_DESCRIPTOR_HANDLE Dst = CD3DX12_CPU_DESCRIPTOR_HANDLE(DstHeap->GetCPUDescriptorHandleForHeapStart(), 0, Increment); Device->CopyDescriptorsSimple(3, Dst, Src, D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER); and debug layers says:
      D3D12 ERROR: ID3D12Device::CopyDescriptors: Source ranges and dest ranges overlap, which results in undefined behavior. [ EXECUTION ERROR #653: COPY_DESCRIPTORS_INVALID_RANGES]
      and indeed samplers are not copied to the shader visible descriptors heap ... why ?
      I have win10 1809 (x64), latest nvidia drivers and 2080RTX (I do not have any other cards, and device is initialized on 2080RTX)
      I'v compilled ModelViewer from DXSamples MiniEngine ... and it spills out that same error from within it's DynamicDescriptorHeap implementation :/
       
       
    • By Tarrasque
      Hello, 
      I am new to game development and am 4 courses away from obtaining an undergraduate degree in the field where I am specializing in game play programming. The course I am currently in is designed to help us with the transition period from being a student and entering the job search and making this passion a profession. By the end of the course I should have a pretty good start on what will become a portfolio.
      This course is what actually brought me to this site and suggested it would be a great place to get support and to provide support when our skill level was up enough to be able to help others. So first, I would like to say hello to anyone who has taken the time to read my very first post here and a special thanks to anyone that replies with any feedback at all. I really do appreciate any and all help or criticism. 
      We were asked to create a proof of concept this week and will eventually need to create a prototype that illustrates our skills in programming. I always want to push myself to see what I can accomplish and decided to come up with an inventory system. I am not sure if it is an original thought, but I feel it would be unique enough to help me stand out from the crowd. At least I hope. 
      The concept is that a player can equip and fill a backpack. They can then drop the filled backpack and all the items will remain accounted for within it. The play can then pickup another backpack and repeat this process. It is important to note that if this is used in a multiplayer game, that another player can loot that filled backpack or pick it up and equip it.
      The question and support I am asking for is more in the realm of guidance. I have searched several places and have not had much luck in finding a good reference to build off from when it comes to developing a complex inventory system that is essentially independent from the player character. Would anyone have any tips or resource suggestions that may help me narrow the search down?
      Any suggestions would be greatly appreciated. 
      It might be important to note I plan on making the prototype using C++ within the Unreal Engine. 
      Thanks again for the time it took to read this post and I look forward to any feedback.
      Happy Gaming
      Devan Luciano
×

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!