Coded all by me, except for two things. | | \/
Credit to @xOnic for the intro! Credit to @cs393200 for the talk!