Page 2 of 2

Re: Collaborative Coding Horror Experiment

Posted: Mon Jun 09, 2014 12:15 pm
by Sheepolution
Okay I guess you can see this as altering. Personally I don't see any problems with it. It doesn't make the code look any prettier you know :P.

I could also just have changed it to player.x, player.y = x, y. But that would be changing the whole thing. I had to find a clever way to change it.

Re: Collaborative Coding Horror Experiment

Posted: Mon Jun 09, 2014 5:50 pm
by davisdude
I added enemies!
https://github.com/DaanHaaz/CCHE/pull/1

Edit:

Code: Select all

--Collaborative Coding Horror Experiment

function love.load()
	ScreenWidth = love.graphics.getWidth()
	ScreenHeight = love.graphics.getHeight()
   
   player = Player(100,100)
	
	Enemies = {}
	for _ = 1, love.math.random( 5, 10 ) do Enemies[#Enemies + 1] = NewEnemy( love.math.random( 32, ScreenWidth - 32 ), love.math.random( 32, ScreenHeight - 32 ) ) end
end


function love.update(dt)

   player:update(dt)
   for _, Enemy in ipairs( Enemies ) do Enemy:Update( dt ) end
end


function love.draw()
   local rumble = 10
   local c = healthcolor(player.health/player.health_max)
   love.graphics.setColor(c[1],c[2],c[3])
   local offset = {
      x=math.random(0,rumble),
      y=math.random(0,rumble)
   }
   local size = {
      w=love.window.getWidth()-offset.x-math.random(0,rumble),
      h=love.window.getHeight()-offset.y-math.random(0,rumble)
   }
   love.graphics.rectangle("fill",offset.x,offset.y,size.w,size.h)
   player.draw()
   
   for _, Enemy in ipairs( Enemies ) do Enemy:Draw( dt ) end
end

function love.keypressed(key)
   
end

function love.keyreleased(key)
   
end

function love.mousepressed(x,y,button)
   if button == "l" then
      player.x, player.y = player.setPlayerPosition(x, y)
   end
end

function love.mousereleased(x,y,button)
   
end

function Player(x,y)
   local self = {x=x,y=y}
   self.health = 100
   self.health_max = 100
   self.health_dt = 0
   self.health_dt_t = 0.1

   self.update = function(self,dt)
      self.health_dt = self.health_dt + dt
      if self.health_dt > self.health_dt_t then
         self.health_dt = self.health_dt - self.health_dt_t
         self:upkeep()
      end
      self:spin(dt)
   end
   self.upkeep = function(self)
     self.health = self.health - 1
   end
   function self.draw()
      love.graphics.push()
      love.graphics.translate(self.x, self.y)
      love.graphics.rotate(self.rotation)
      love.graphics.translate(-self.x, -self.y)

      love.graphics.setColor(30,80,120)
      love.graphics.circle("fill",self.x,self.y,50,50)
      love.graphics.setColor(255,255,255)
      love.graphics.circle("fill",self.x-25,self.y-15,5,50)
      love.graphics.circle("fill",self.x+25,self.y-15,5,50)
      love.graphics.arc("fill",self.x,self.y+10,20,-0,math.pi)

      love.graphics.pop()
   end

   self.rotation = 0
   function self.spin(self, dt)
      self.rotation = self.rotation + math.pi * 4 * dt
   end

   function self.setPlayerPosition(x,y)
      self.x, self.y = x, y
      return self.x, self.y
   end

   return self
end

function healthcolor(i)
   -- Clamp
   if i > 1 then i = 1 end
   if i < 0 then i = 0 end
   -- 0 -> 0.5: 255
   -- 0.5 -> 1: 255 .. 0
   local r = 255*2 - 255*2*i
   if r > 255 then r = 255 end
   -- 0 -> 0.5: 0 .. 255
   -- 0.5 -> 1: 255
   local g = 255*2*i
   if g > 255 then g = 255 end
   -- 0 -> 1: 0
   local b = 0
   return {r,g,b}
end

function NewEnemy( x, y )
	local Self = { x = x, y = y, Rotation = 0, Radius = love.math.random( 20, 50 ), Dir = 1 }
	Self.VelocityX = Self.Radius / 3
	
	Self.Rotation = 0
	function Self.Spin( Self, dt )
		Self.Rotation = Self.Rotation + math.pi * 4 * dt * Self.Dir
	end
	
	function Self.Update( Self, dt )
		Self.x = Self.x + Self.VelocityX 
		if Self.x - Self.Radius < 0 or Self.x + Self.Radius > ScreenWidth then Self.VelocityX, Self.Dir = Self.VelocityX * -1, Self.Dir * -1 end
		Self.Eyes = { 
			{ x = Self.x - ( Self.Radius / 2 ), y = Self.y - ( Self.Radius / 2 ), Radius = Self.Radius / 10 }, 
			{ x = Self.x + ( Self.Radius / 2 ), y = Self.y - ( Self.Radius / 2 ), Radius = Self.Radius / 10 }, 
		}
		Self:Spin( dt )
	end
	
	function Self.Draw( Self )
		love.graphics.push()
			love.graphics.translate( Self.x, Self.y )
			love.graphics.rotate( Self.Rotation )
			love.graphics.translate( -Self.x, -Self.y )
			
			love.graphics.setColor( 0, 0, 0 )
			love.graphics.circle( 'fill', Self.x, Self.y, Self.Radius )
			love.graphics.setColor( 255, 255, 255 )
			love.graphics.circle( 'fill', Self.Eyes[1].x, Self.Eyes[1].y, Self.Eyes[1].Radius )
			love.graphics.circle( 'fill', Self.Eyes[2].x, Self.Eyes[2].y, Self.Eyes[2].Radius )
			love.graphics.setColor( 255, 0, 0 )
			love.graphics.setLineWidth( Self.Radius / 16 )
			love.graphics.line( Self.Eyes[1].x - ( Self.Radius / 3 ), Self.Eyes[1].y - ( Self.Radius / 3 ), 
				Self.Eyes[1].x + Self.Radius / 2, Self.Eyes[1].y )
			love.graphics.line( Self.Eyes[2].x + ( Self.Radius / 3 ), Self.Eyes[2].y - ( Self.Radius / 3 ), 
				Self.Eyes[2].x - Self.Radius / 2, Self.Eyes[2].y )
			love.graphics.arc( 'fill', Self.x, Self.y + ( Self.Radius / 4 ), Self.Radius / 1.75, -0, math.pi )
		love.graphics.pop()
	end
	
	return Self
end

Re: Collaborative Coding Horror Experiment

Posted: Mon Jun 09, 2014 7:05 pm
by WetDesertRock
Perhaps a style guide is in order ;)

Maybe you could allow modification of changes if the intent and outcome can only be seen in the codebase? For instance, fixing that last commit to use agreed upon conventions.

Changing that player = Player(x,y) would also fit, as if you play the game you won't feel the difference.

Do you want to make a game that is crazy, or code in a crazy codebase?

Re: Collaborative Coding Horror Experiment

Posted: Mon Jun 09, 2014 7:41 pm
by Ranguna259
WetDesertRock wrote:Do you want to make a game that is crazy, or code in a crazy codebase?
Why not both ?

Re: Collaborative Coding Horror Experiment

Posted: Mon Jun 09, 2014 7:42 pm
by Sheepolution
WetDesertRock wrote: Do you want to make a game that is crazy, or code in a crazy codebase?
Both.

What about this: Every commit you're allowed to comment 1 line.
You're allowed to commit after 2 other's commits.

Re: Collaborative Coding Horror Experiment

Posted: Mon Jun 09, 2014 9:03 pm
by davisdude
I actually think having several different coding styles would quite contribute to the "Horror" of the experiment, which is why I intentionally did 4 space tabs (as I usually do) instead of the others. We are basing this of of something "Cthulhu Project : Let's Make Unmaintainable Code." ;)
Also, you should update the main post with the GitHub link.

Edit: Made a new commit. Is there a rule about double commiting? https://github.com/DaanHaaz/CCHE/pull/2
Gave teeth to enemies and made enemy movement speed slower.

Code: Select all

--Collaborative Coding Horror Experiment

function love.load()
	ScreenWidth = love.graphics.getWidth()
	ScreenHeight = love.graphics.getHeight()
   
   player = Player(100,100)
	
	Enemies = {}
	for _ = 1, love.math.random( 5, 10 ) do Enemies[#Enemies + 1] = NewEnemy( love.math.random( 50, ScreenWidth - 50 ), love.math.random( 50, ScreenHeight - 50 ) ) end
end


function love.update(dt)

   player:update(dt)
   for _, Enemy in pairs( Enemies ) do Enemy:Update( dt ) end
end


function love.draw()
   local rumble = 10
   local c = healthcolor(player.health/player.health_max)
   love.graphics.setColor(c[1],c[2],c[3])
   local offset = {
      x=math.random(0,rumble),
      y=math.random(0,rumble)
   }
   local size = {
      w=love.window.getWidth()-offset.x-math.random(0,rumble),
      h=love.window.getHeight()-offset.y-math.random(0,rumble)
   }
   love.graphics.rectangle("fill",offset.x,offset.y,size.w,size.h)
   player.draw()
   
   for _, Enemy in pairs( Enemies ) do Enemy:Draw( dt ) end
end

function love.keypressed(key)
   
end

function love.keyreleased(key)
   
end

function love.mousepressed(x,y,button)
   if button == "l" then
      player.x, player.y = player.setPlayerPosition(x, y)
   end
end

function love.mousereleased(x,y,button)
   
end

function Player(x,y)
   local self = {x=x,y=y}
   self.health = 100
   self.health_max = 100
   self.health_dt = 0
   self.health_dt_t = 0.1

   self.update = function(self,dt)
      self.health_dt = self.health_dt + dt
      if self.health_dt > self.health_dt_t then
         self.health_dt = self.health_dt - self.health_dt_t
         self:upkeep()
      end
      self:spin(dt)
	  self:CheckCircularCollisions( Enemies )
   end
   self.upkeep = function(self)
     self.health = self.health - 1
   end
   function self.draw()
      love.graphics.push()
      love.graphics.translate(self.x, self.y)
      love.graphics.rotate(self.rotation)
      love.graphics.translate(-self.x, -self.y)

      love.graphics.setColor(30,80,120)
      love.graphics.circle("fill",self.x,self.y,50,50)
      love.graphics.setColor(255,255,255)
      love.graphics.circle("fill",self.x-25,self.y-15,5,50)
      love.graphics.circle("fill",self.x+25,self.y-15,5,50)
      love.graphics.arc("fill",self.x,self.y+10,20,-0,math.pi)

      love.graphics.pop()
	  
	  love.graphics.setColor( 255, 255, 255 )
	  love.graphics.print( self.health )
   end

   self.rotation = 0
   function self.spin(self, dt)
      self.rotation = self.rotation + math.pi * 4 * dt
   end

   function self.setPlayerPosition(x,y)
      self.x, self.y = x, y
      return self.x, self.y
   end
   
	function self.CheckCircularCollisions( Self, CollisionTable )
		for _, Enemy in pairs( CollisionTable ) do
			local Length = GetDistance( Self.x, Self.y, Enemy.x, Enemy.y )
			if Length < 50 + Enemy.Radius then 
				Self.health = Self.health - Enemy.Damage 
				Enemy.Health = 0
			end
		end
	end

   return self
end

function GetDistance( x1, y1, x2, y2 )
	return math.sqrt( ( x1 - x2 ) ^ 2 + ( y1 - y2 ) ^ 2 )
end

function healthcolor(i)
   -- Clamp
   if i > 1 then i = 1 end
   if i < 0 then i = 0 end
   -- 0 -> 0.5: 255
   -- 0.5 -> 1: 255 .. 0
   local r = 255*2 - 255*2*i
   if r > 255 then r = 255 end
   -- 0 -> 0.5: 0 .. 255
   -- 0.5 -> 1: 255
   local g = 255*2*i
   if g > 255 then g = 255 end
   -- 0 -> 1: 0
   local b = 0
   return {r,g,b}
end

function NewEnemy( x, y )
	local Self = { x = x, y = y, Rotation = 0, Radius = love.math.random( 20, 50 ), Dir = 1, Index = #Enemies + 1 }
	Self.VelocityX = Self.Radius / 10
	Self.Damage = Self.Radius / 2
	Self.Health = Self.Radius * 5
	
	Self.Rotation = 0
	function Self.Spin( Self, dt )
		Self.Rotation = Self.Rotation + math.pi * ( Self.Radius / 20 ) * dt * Self.Dir
	end
	
	function Self.Update( Self, dt )
		if Self.Health <= 0 then Enemies[Self.Index] = nil return end
		Self.x = Self.x + Self.VelocityX 
		if Self.x - Self.Radius < 0 or Self.x + Self.Radius > ScreenWidth then Self.VelocityX, Self.Dir = Self.VelocityX * -1, Self.Dir * -1 end
		Self.Eyes = { 
			{ x = Self.x - ( Self.Radius / 2 ), y = Self.y - ( Self.Radius / 2 ), Radius = Self.Radius / 10 }, 
			{ x = Self.x + ( Self.Radius / 2 ), y = Self.y - ( Self.Radius / 2 ), Radius = Self.Radius / 10 }, 
		}
		Self:Spin( dt )
	end
	
	function Self.Draw( Self )
		love.graphics.push()
			love.graphics.translate( Self.x, Self.y )
			love.graphics.rotate( Self.Rotation )
			love.graphics.translate( -Self.x, -Self.y )
			
			-- Body
			love.graphics.setColor( 0, 0, 0 )
			love.graphics.circle( 'fill', Self.x, Self.y, Self.Radius )
			-- Eyes
			love.graphics.setColor( 255, 255, 255 )
			love.graphics.circle( 'fill', Self.Eyes[1].x, Self.Eyes[1].y, Self.Eyes[1].Radius )
			love.graphics.circle( 'fill', Self.Eyes[2].x, Self.Eyes[2].y, Self.Eyes[2].Radius )
			-- Mouth
			love.graphics.setColor( 255, 0, 0 )
			love.graphics.setLineWidth( Self.Radius / 16 )
			love.graphics.line( Self.Eyes[1].x - ( Self.Radius / 3 ), Self.Eyes[1].y - ( Self.Radius / 3 ), 
				Self.Eyes[1].x + Self.Radius / 2, Self.Eyes[1].y )
			love.graphics.line( Self.Eyes[2].x + ( Self.Radius / 3 ), Self.Eyes[2].y - ( Self.Radius / 3 ), 
				Self.Eyes[2].x - Self.Radius / 2, Self.Eyes[2].y )
			love.graphics.arc( 'fill', Self.x, Self.y + ( Self.Radius / 4 ), Self.Radius / 1.75, -0, math.pi )
			-- Teeth
			love.graphics.setColor( 255, 255, 255 )
			local MouthWidth = ( Self.Radius / 1.75 ) * 2
			local MouthStartX = Self.x - MouthWidth / 2
			local MouthY = Self.y + ( Self.Radius / 4 )
			local NumTeeth = Self.Radius
			local TeethSeperation = MouthWidth / NumTeeth
			local TeethHeight = MouthWidth / 6
			for Index = 0, NumTeeth - 1 do 
				local ToothX = MouthStartX + ( TeethSeperation * Index )
				love.graphics.polygon( 'fill', ToothX, MouthY, ToothX + ( TeethSeperation / 2 ), MouthY + TeethHeight, ToothX + TeethSeperation, MouthY )
			end
		love.graphics.pop()
	end
	
	return Self
end

Re: Collaborative Coding Horror Experiment

Posted: Mon Jun 09, 2014 10:23 pm
by Sheepolution
As long as the edits aren't too big.

We can start making all these extra rules, but in the end people should just do what feels right and have fun with it. As long as people keep the updates small, modify or comment out only a few lines, I'm okay with it.

Re: Collaborative Coding Horror Experiment

Posted: Mon Jun 09, 2014 11:01 pm
by Kingdaro
Some of the suggestion you guys make almost completely defeats the purpose of the "experiment". The point is to try to keep the code maintainable but it just ends up becoming a clusterfuck anyway. Intentionally making the code look bad is stupid. For the game to be truly seen through, the no-modification rule must accept absolutely no exceptions (aside from editing constants), even when the functionality of the modification remains the same.

EDIT: Also, the commenting rule can be circumvented as such, before:

Code: Select all

print 'Hello there!'
After (tabbing counts as adding to a line):

Code: Select all

if false then
   print 'Hello there!'
end
And a bunch of other random tricks, such as wrapping it in an unused function. Because of this, limiting comments per commit is basically pointless.

Re: Collaborative Coding Horror Experiment

Posted: Tue Jun 10, 2014 12:42 am
by OttoRobba
And if someone really wants to troll, adding a --[[ to the first line of code alters the contents but not the lines :P

Re: Collaborative Coding Horror Experiment

Posted: Mon Aug 11, 2014 3:03 am
by davisdude
Been a while, so I though I'd revive it!
Pull Request

Code: Select all

--Collaborative Coding Horror Experiment

function love.load()
	ScreenWidth = love.graphics.getWidth()
	ScreenHeight = love.graphics.getHeight()
   
   player = Player(100,100)
	
	Enemies = {}
	for _ = 1, love.math.random( 5, 10 ) do Enemies[#Enemies + 1] = NewEnemy( love.math.random( 50, ScreenWidth - 50 ), love.math.random( 50, ScreenHeight - 50 ) ) end
end


function love.update(dt)

   player:update(dt)
   for _, Enemy in pairs( Enemies ) do Enemy:Update( dt ) end
end


function love.draw()
   local rumble = 10
   local c = healthcolor(player.health/player.health_max)
   love.graphics.setColor(c[1],c[2],c[3])
   local offset = {
      x=math.random(0,rumble),
      y=math.random(0,rumble)
   }
   local size = {
      w=love.window.getWidth()-offset.x-math.random(0,rumble),
      h=love.window.getHeight()-offset.y-math.random(0,rumble)
   }
   love.graphics.rectangle("fill",offset.x,offset.y,size.w,size.h)
   player.draw()
   
   for _, Enemy in pairs( Enemies ) do Enemy:Draw( dt ) end
end

function love.keypressed(key)
   
end

function love.keyreleased(key)
   
end

function love.mousepressed(x,y,button)
   if button == "l" then
      player.x, player.y = player.setPlayerPosition(x, y)
   end
end

function love.mousereleased(x,y,button)
	
end

function Player(x,y)
   local self = {x=x,y=y}
   self.health = 100
   self.health_max = 100
   self.health_dt = 0
   self.health_dt_t = 0.1
   self.radius = 50
   self.speed = 256
   self.direction = 1

   self.update = function(self,dt)
      self.health_dt = self.health_dt + dt
      if self.health_dt > self.health_dt_t then
         self.health_dt = self.health_dt - self.health_dt_t
         self:upkeep()
      end
      self:spin(dt)
	  self:CheckCircularCollisions( Enemies )
	  
		if love.keyboard.isDown( 'w' ) then self.y = self.y - self.speed * dt end
		if love.keyboard.isDown( 'a' ) then self.x, self.direction = self.x - self.speed * dt, -1 end
		if love.keyboard.isDown( 's' ) then self.y = self.y + self.speed * dt end
		if love.keyboard.isDown( 'd' ) then self.x, self.direction = self.x + self.speed * dt, 1 end
		if not love.keyboard.isDown( 'a' ) and not love.keyboard.isDown( 'd' ) then self.direction = 0 end
		
		if love.keyboard.isDown( 'up' ) then self.radius = ( self.radius + 1 ) < 75 and self.radius + 1 or 75 end
		if love.keyboard.isDown( 'down' ) then self.radius = ( self.radius - 1 ) > 20 and self.radius - 1 or 20 end
   end
   self.upkeep = function(self)
     self.health = self.health - 1
   end
   function self.draw()
      love.graphics.push()
      love.graphics.translate(self.x, self.y)
      love.graphics.rotate(self.rotation)
      love.graphics.translate(-self.x, -self.y)

      love.graphics.setColor(30,80,120)
      love.graphics.circle("fill",self.x,self.y,self.radius,self.radius)
      love.graphics.setColor(255,255,255)
      love.graphics.circle("fill",self.x-self.radius / 2,self.y - ( self.radius / ( 10 / 3 ) ),self.radius / 10,self.radius)
      love.graphics.circle("fill",self.x+self.radius / 2,self.y - ( self.radius / ( 10 / 3 ) ),self.radius / 10,self.radius)
      love.graphics.arc("fill",self.x,self.y+(self.radius/5),self.radius/2.5,-0,math.pi)

      love.graphics.pop()
	  
	  love.graphics.setColor( 255, 255, 255 )
	  love.graphics.print( self.health )
   end

   self.rotation = 0
   function self.spin(self, dt)
      self.rotation = self.rotation + ( math.pi * 4 * dt * self.direction )
   end

   function self.setPlayerPosition(x,y)
      self.x, self.y = x, y
      return self.x, self.y
   end
   
	function self.CheckCircularCollisions( Self, CollisionTable )
		for _, Enemy in pairs( CollisionTable ) do
			local Length = GetDistance( Self.x, Self.y, Enemy.x, Enemy.y )
			if Length < self.radius + Enemy.Radius then 
				Self.health = Self.health - Enemy.Damage 
				Enemy.Health = 0
			end
		end
	end

   return self
end

function GetDistance( x1, y1, x2, y2 )
	return math.sqrt( ( x1 - x2 ) ^ 2 + ( y1 - y2 ) ^ 2 )
end

function healthcolor(i)
   -- Clamp
   if i > 1 then i = 1 end
   if i < 0 then i = 0 end
   -- 0 -> 0.5: 255
   -- 0.5 -> 1: 255 .. 0
   local r = 255*2 - 255*2*i
   if r > 255 then r = 255 end
   -- 0 -> 0.5: 0 .. 255
   -- 0.5 -> 1: 255
   local g = 255*2*i
   if g > 255 then g = 255 end
   -- 0 -> 1: 0
   local b = 0
   return {r,g,b}
end

function NewEnemy( x, y )
	local Self = { x = x, y = y, Rotation = 0, Radius = love.math.random( 20, 50 ), Dir = 1, Index = #Enemies + 1 }
	Self.VelocityX = Self.Radius / 10
	Self.Damage = Self.Radius / 2
	Self.Health = Self.Radius * 5
	
	Self.Rotation = 0
	function Self.Spin( Self, dt )
		Self.Rotation = Self.Rotation + math.pi * ( Self.Radius / 20 ) * dt * Self.Dir
	end
	
	function Self.Update( Self, dt )
		if Self.Health <= 0 then Enemies[Self.Index] = nil return end
		Self.x = Self.x + Self.VelocityX 
		if Self.x - Self.Radius < 0 or Self.x + Self.Radius > ScreenWidth then Self.VelocityX, Self.Dir = Self.VelocityX * -1, Self.Dir * -1 end
		Self.Eyes = { 
			{ x = Self.x - ( Self.Radius / 2 ), y = Self.y - ( Self.Radius / 2 ), Radius = Self.Radius / 10 }, 
			{ x = Self.x + ( Self.Radius / 2 ), y = Self.y - ( Self.Radius / 2 ), Radius = Self.Radius / 10 }, 
		}
		Self:Spin( dt )
	end
	
	function Self.Draw( Self )
		love.graphics.push()
			love.graphics.translate( Self.x, Self.y )
			love.graphics.rotate( Self.Rotation )
			love.graphics.translate( -Self.x, -Self.y )
			
			-- Body
			love.graphics.setColor( 0, 0, 0 )
			love.graphics.circle( 'fill', Self.x, Self.y, Self.Radius )
			-- Eyes
			love.graphics.setColor( 255, 255, 255 )
			love.graphics.circle( 'fill', Self.Eyes[1].x, Self.Eyes[1].y, Self.Eyes[1].Radius )
			love.graphics.circle( 'fill', Self.Eyes[2].x, Self.Eyes[2].y, Self.Eyes[2].Radius )
			-- Mouth
			love.graphics.setColor( 255, 0, 0 )
			love.graphics.setLineWidth( Self.Radius / 16 )
			love.graphics.line( Self.Eyes[1].x - ( Self.Radius / 3 ), Self.Eyes[1].y - ( Self.Radius / 3 ), 
				Self.Eyes[1].x + Self.Radius / 2, Self.Eyes[1].y )
			love.graphics.line( Self.Eyes[2].x + ( Self.Radius / 3 ), Self.Eyes[2].y - ( Self.Radius / 3 ), 
				Self.Eyes[2].x - Self.Radius / 2, Self.Eyes[2].y )
			love.graphics.arc( 'fill', Self.x, Self.y + ( Self.Radius / 4 ), Self.Radius / 1.75, -0, math.pi )
			-- Teeth
			love.graphics.setColor( 255, 255, 255 )
			local MouthWidth = ( Self.Radius / 1.75 ) * 2
			local MouthStartX = Self.x - MouthWidth / 2
			local MouthY = Self.y + ( Self.Radius / 4 )
			local NumTeeth = Self.Radius
			local TeethSeperation = MouthWidth / NumTeeth
			local TeethHeight = MouthWidth / 6
			for Index = 0, NumTeeth - 1 do 
				local ToothX = MouthStartX + ( TeethSeperation * Index )
				love.graphics.polygon( 'fill', ToothX, MouthY, ToothX + ( TeethSeperation / 2 ), MouthY + TeethHeight, ToothX + TeethSeperation, MouthY )
			end
		love.graphics.pop()
	end
	
	return Self
end
Added keyboard movement: use wasd to move, up to increase size, down to decrease size. You can still click if you want.