<commit_before>Add utils.log() ... configurable.

Models:

 - Game (app)
    - Contains all other models
    - Runs loop
    - Lives
    - Bank

 - Battlefield
    - Boundaries
    - Obstacles
    - ??
    - Spawn
    - End
    
 - Baddies (subclassed)
    - Pathfinding?
    - Speed
    - Health
    - Armor/Resistances
    - Levels (such that the same baddies might get harder as the game progresses?)

 - Towers (subclassed)
    - Targeting
    - Damage
    - Rate
    - Range
    - Area Affect
    - Upgrades

TODO:
  
 * Towers
    * Placement Collision-detection
      * Can't place on another tower
      * Can't place on path (w/in scatter_range px of line between waypoints)
      * -or- Use rectangular build zones on map.
 * SVG
 * Tower upgrades
 * Advanced Targeting
 * Damage & Shield Types
<commit_msg>Todo comments<commit_after>Add utils.log() ... configurable.

Models:

 - Game (app)
    - Contains all other models
    - Runs loop
    - Lives
    - Bank

 - Battlefield
    - Boundaries
    - Obstacles
    - ??
    - Spawn
    - End
    
 - Baddies (subclassed)
    - Pathfinding?
    - Speed
    - Health
    - Armor/Resistances
    - Levels (such that the same baddies might get harder as the game progresses?)

 - Towers (subclassed)
    - Targeting
    - Damage
    - Rate
    - Range
    - Area Affect
    - Upgrades

TODO:

 * Baddies:
    * Sprites
    * Health Bars
    * Flash for "taking-hit"
 * Towers
    * Sell/Upgrade:
      * UI & clicks
      * Logic - can we afford this?
      * Check /w Battlefield to make sure only one is in UI state at a time
    * Placement Collision-detection
      * Can't place on another tower
      * Can't place on path (w/in scatter_range px of line between waypoints)
      * -or- Use rectangular build zones on map.
 * Refactor models & view into separate files & folders
 * Tower upgrades
 * Advanced Targeting
 * Damage & Shield Types

{'fraction_non_alphanumeric': 0.08184679958027283, 'fraction_numerical': 0.0, 'mean_word_length': 1.9750390015600625, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7403592', 'n_tokens_mistral': 624, 'n_tokens_neox': 589, 'n_words': 201}