     #collision routines
     collidesWith: (other) ->
         if other is 'mouse'
-            collision = false
             if @_dis.visible
-                if @get('left', false) < Greenhorn.getMouseX() < @get('right', false) and
-                @get('bottom', false) < Greenhorn.getMouseY() < @get('top', false)
-                    collision = true
+                if @get('left', false) <= Greenhorn.getMouseX() <= @get('right', false) and
+                @get('bottom', false) <= Greenhorn.getMouseY() <= @get('top', false)
+                    return true
+            return false
         else
-            collision = true
-            if @_dis.visible and
-            other._dis.visible and
-            @_dis.level == other._dis.level
-                if @get('bottom', false) > other.get('top', false) or
-                @get('top', false) < other.get('bottom', false) or
-                @get('right', false) < other.get('left', false) or
-                @get('left', false) > other.get('right', false)
-                    collision = false
-            else collision = false
-        collision
+            if @_dis.visible
+                if other._dis.visible
+                    if @_dis.level == other._dis.level
+                        if @distanceTo(other) <= @get('radius', false) + other.get('radius', false)
+                            #declare arrays
+                            myLines = []
+                            otherLines = []
+                            
+                            #create lines representing boundaries
+                            for pt, i in @_bnd
+                                if i is @_bnd.length - 1
+                                    myLines.push new Line pt, @_bnds[0]
+                                else
+                                    myLines.push new Line pt, @_bnds[i+1]
+                            for pt, i in other._bnd
+                                if i is other._bnd.length - 1
+                                    otherLines.push new Line pt, other._bnd[0]
+                                else
+                                    otherLines.push new Line pt, other._bnd[i+1]
+                            
+                            #check for collisions
+                            for myLine in myLines
+                                for otherLine in otherLines
+                                    if myLine.collidesWith otherLine
+                                        return true
+            return false
     distanceTo: (other) ->
         otherX = otherY = 0
         if other is 'mouse'

        #create default boundary if none was provided
        unless @_bnd?
            @_bnd = []
            @_bnd.push new Point -@_dis.width / 2, @_dis.height /2, @_pos.x, @_pos.y
            @_bnd.push new Point @_dis.width / 2, @_dis.height /2, @_pos.x, @_pos.y
            @_bnd.push new Point @_dis.width / 2, -@_dis.height /2, @_pos.x, @_pos.y
            @_bnd.push new Point -@_dis.width / 2, -@_dis.height /2, @_pos.x, @_pos.y

        #start updating if the engine is already running
        if Greenhorn.isRunning() then @_start()

        else if what.match /^left$/
            value = pt.x for pt in @_bnd
            value = Math.min value...
        else if what.match /^radius$/
            value = pt.get('dist') for pt in @_bnd
            value = Math.max value...
        else if what.match /^distance$/
            value = Math.sqrt @_pos.x**2 + @_pos.y**2
        else if what.match /^speed$/
