Skip to main content

Python PyGame Tower Defence - 0.8.1

A TD implemented in python and pygame.

Austin Morgan
I'm closing the gap to Beta status. I'll be giving this project the Beta tag when it hits version 0.9. I've got a lot of work to go before it gets there, but the game is already quite playable. The basics are typical to Tower Defense games all over.

There are only seven maps thus far, and only three playable. I have not put great effort into balancing them yet, as things change constantly. That said, I played through all of them before releasing this and found them to be fairly spot-on in difficulty, if a bit lacking in variety. Balance will not be a top priority until the Beta, version 0.9.

The art is nowhere close to tops and there is no sound whatsoever. I am neither an artist nor musician. If anyone would like to contribute either, I would happily give credit for your work.

Comments are welcome and encouraged!


  • Optimized the distance formula for finding enemies within range of a tower.
  • Added a chaining system: the chaining bonus increases by 1% each time an enemy is killed. It decreases automatically over time. Each tower gets a different bonus from a chain: fighter towers gain a damage bonus, archer towers gain a range bonus, and mage towers gain a speed bonus.
  • Fixed an issue with centering enemies on the path.
  • Added hp, maxhp, and ac stats for towers.
  • Added attack bonus and damage stats for enemies.
  • Enemies now attack towers in range, with a similar function to towers.
  • Towers that are at 0HP or below cannot attack until brought above 0HP.
  • Towers that get to -10 HP or below are destroyed.
  • Towers heal at a rate of 1HP per enemy wave.
  • Added the "Cleric" tower. It heals every tower and damages every enemy within range each time it fires. Its damage is unaffected by enemy armor.
  • Lowered player health to 10.
  • Fixed the formula for the location of the text for upgrades when displayed in the radial menu around a tower.
  • Removed some stats from towers that were unused.
  • Corrected a tower's totalspent variable to take into account tower abilities. Now, selling a tower gives you exactly half of everything you spent on it.
  • Changed tower abilities to modify a tower's base variables by a percentage. This way works better when stacking abilities. Certain tower stats will be modified by static amounts, and never by percentages.
  • Added a new line of abilities: specific upgrades that mimic a "class progression" or "level up" in an RPG.
  • Folded the Archer class into a variant upgrade path for the Fighter tower. Called an "archetype", similar to the Pathfinder RPG class variants, these variants change the tower in major ways in regards to both stats and purpose. In addition, an archetype usually results in a change of the tower's image. A tower can usually only have one archetype, and an archetype can usually only be chosen before any class upgrades have been applied.
  • All archer mod variables have been removed from the player class.
  • Added support for changing what stat is improved by chaining.
  • Class upgrades, including archetypes, are unlocked by completing levels.
  • Class upgrades increase the tower's level. Towers now heal their level in HP for each wave sent.
  • Added the Negative Cleric archetype, concentrating on area damage by giving up the ability to heal other towers.
  • Switched the Mage tower for the Cleric tower as the second default tower.
  • Changed the current map names to show intended progression better. "Basic0" corresponds to "Simple", and the following "Basic" maps correspond to the "Level" maps. It is recommended you clear you player.txt file.
  • Rewards are now as follows:
    • Basic0: Gives the option to sell a tower. Allows upgrading a Fighter tower.
    • Basic1: Allows upgrading Cleric towers. Opens Archer archetype.
    • Basic2: Allows ExtraDamage1 ability. Opens Mage tower for use.
    • Basic3: Allows ExtendRange1 ability. Allows the second Fighter tower level.


Home Page


Python PyGame Tower Defence 0.8.0 — 10 Mar, 2012

Python PyGame Tower Defence 0.8.1 — 14 Apr, 2012

Python PyGame Tower Defence 0.8.5 — 18 Nov, 2012

Python PyGame Tower Defence 0.8.3 — 15 Jun, 2012

Python PyGame Tower Defence 0.5.2 — 25 Feb, 2010

Python PyGame Tower Defence 0.2.4 — 7 Oct, 2009

Python PyGame Tower Defence 0.3.5 — 14 Oct, 2009

Python PyGame Tower Defence 0.2.1 — 6 Oct, 2009

Python PyGame Tower Defence 0.3.4 — 13 Oct, 2009

Python PyGame Tower Defence 0.3.2 — 12 Oct, 2009

Python PyGame Tower Defence 0.2.6 — 8 Oct, 2009

Python PyGame Tower Defence 0.3.0 — 11 Oct, 2009

Python PyGame Tower Defence 0.2.2 — 6 Oct, 2009

Python PyGame Tower Defence 0.5.7 — 1 Apr, 2010

Python PyGame Tower Defence 0.5.0 — 21 Feb, 2010

Python PyGame Tower Defence 0.5.1 — 25 Feb, 2010

Python PyGame Tower Defence 0.7.7 — 28 Jan, 2011

Python PyGame Tower Defence 0.7.5 — 9 Jan, 2011

Python PyGame Tower Defence 0.7.6 — 13 Jan, 2011

Python PyGame Tower Defence 0.5.6 — 14 Mar, 2010

Python PyGame Tower Defence 0.5.5 — 11 Mar, 2010

Python PyGame Tower Defence 0.5.3 — 2 Mar, 2010

Python PyGame Tower Defence 0.5.4 — 9 Mar, 2010

Python PyGame Tower Defence 0.8.6 — 17 Dec, 2012

Python PyGame Tower Defence 0.8.7 — 27 Aug, 2013 account Comments

  • Bemoniri 2012-01-06 14:21

    is there a way to win?:d

    James Lu 2012-06-17 21:56

    me too

  • Dylan Raub 2012-06-16 15:14

    Good to see you are still working on this! Good on ya, mate :D

  • James Lu 2012-06-17 21:55

    i'll upload my music soon
    when i get on win7...
    win 8 i can't do it, i secured it.

  • Steve 2012-06-19 02:20 is missing from the latest build... I can't get it to run even if I grab from an older build though... will have a tinker with it and see if I can figure out why not...

    Steve 2012-06-19 02:26

     Got it running, that was my fault... but is def. missing

  • Austin 2012-06-19 02:26

    Thanks for the support, Dylan!

    Steve, isn't used in version 0.8.3. I replaced that whole mess with the Player Upgrade Screen, accessed by right-clicking on the XP Bar. If you're getting an import error, just remove the "import Random" line near the top of I think that's the only one I missed.

    Thanks for all the feedback, guys!

  • A faggot 2012-07-09 12:43


  • sipiatti 2012-07-10 08:08

    ImportError: No module named Rewards
    It seems one file missed from the zipball?

  • Mich Nannings 2012-11-27 14:49

    it works nice, didnt find any bugs

  • wcb98 2013-10-08 01:30

    Great Game, but can you include python 3 builds?

  • Henry oven 2019-07-27 18:47

    Python is giving error on my laptop. My laptop has really slowed down, I think it has a virus. basketball legends

    Dan Chavarria 2019-07-27 19:01

    It was one of the games you played the most years ago, pyhon. I can't take time off now. get on top