For my GSD 511: Game Development I course, we made a side-shooter project. I decided to stick with the space theme since I already had some space assets I created a while back and wanted to expand on them a little bit. I’m hoping to add some more quality of life features and some better balancing, but am currently hindered by some health issues.

In the current, not well-balanced, state it may only be possible to win using the weapon swapping. I wasn’t able to complete it with the starter weapon, but maybe I’m just bad at aiming :)

Controls

  • Move with arrow keys
  • Cycle through weapons with < and >

v1.0 Features - Lecture Version

  • Data-Driven Design - uses a custom auto-loaded data_loader.gd script to pull game data from .csv files
    • uses a spreadsheet as a single source of truth
    • see Game Data Examples section for more details
  • Equipable Weapons - a variety of weapons, each with different stats
    • NOTE: weapon firing / in-game model is not implemented at this point, just in-game data pulling and weapon label
  • Enemies - a variety of enemies, each with different stats
    • NOTE: enemies are not yet implemented in game, just the data import and sprites

v2.0 Features - Lecture Version (+ Extra Content)

  • Expanded Data-Driven Design - added handling for spawns.csv to define waves, and added score values to each enemy
  • Weapon Firing - bullets spawn in front of player and travel towards enemy-side using the currently equipped weapon’s data
  • Enemy Waves - enemies spawn on right side if the screen with y-position and time between spawns pulled from the wave data
    • enemies fly towards player-side using pulled enemy data
    • enemies are destroyed when they:
      • reach the other end of the screen -> player loses a life
      • run into the player -> player loses a life
      • take damage greater than or equal to their HP from the player’s bullets -> player gets the enemy’s point value added to their score
  • More Weapon and Enemy Types - now have 5 weapons and 5 enemies
  • Player Lives - player can take damage from enemies reaching the player side or running directly into the player
  • Player Score - player gets points for each enemy killed (scores are defined in the enemy data)
  • Win/Loss Screens - appropriate screens for when player loses (has 0 lives remaining) and wins (defeats the wave), with restart buttons to play again
  • Weapon Swapping - player can cycle through every implemented weapon using the < and > keys
Game Data Examples

Weapons & Enemy Data

This data lives in a Google Sheet, which I export to .csv and drop into the project for data_loader.gd to read at runtime. The tables below are pulled directly from those exported files, so they’ll stay current as the sheet evolves. I’ve also linked the full .csv files as a downloadable reference.

Weapons

Download weapons.csv

idnamedamagefire_ratedps
wpn_laserPulse Laser100.250
wpn_plasmaPlasma Cannon350.658.33
wpn_rocketHeavy Rocket901.560
wpn_explosiveExplosive Ball500.862.5
wpn_mmMarshmallows10.110

Enemies

Download enemies.csv

idnamehpspeedvaluescreen_timettk_laser
enm_scoutScout Drone2030026.40.4
enm_cruiserArmored Cruiser16012010163.2
enm_avgStandard Ship8020059.61.37
enm_workerWorker Drone50150112.80.83
enm_bossMothership3008020244.8

Waves

Download spawns.csv

enemy_idwaity
enm_scout1.0140
enm_scout1.0300
enm_worker0.5100
enm_worker0.5200
enm_cruiser2.0220
enm_scout0.8180
enm_boss2.0150

Godot CSV Import Issue

This is how to fix the CSV data pulling if files cannot be found when exported to the web:

  1. Check the Import tab (usually in the same pane as the Scene window)
  2. If it’s showing CSV Translation, change it to Keep File (exported as is)
  3. Re-Import
  4. Repeat for each CSV file

Asset Attributions

All of the current art was made by me using Aseprite and Paint.net. The cover image was made in Canva using my sprites.

Aseprite Files

Character sprites made in Aseprite
Character sprites made in Aseprite