# http://codingowl.com/readblog.php?blogid=124 module.exports.CollisionCategory = class CollisionCategory @className: "CollisionCategory" constructor: (name, @superteamIndex=null, @collisionSystem) -> # @superteamIndex is null for "none", "obstacles", and "dead". # It's 0 for "ground", "air", and "ground_and_air" units with no superteams. # It's 1, 2, or 3 for the superteams it gets after that. We can only have 16 collision categories. @ground = name.search("ground") isnt -1 @air = name.search("air") isnt -1 @name = CollisionCategory.nameFor name, @superteamIndex @superteamIndex ?= 0 if @ground or @air @number = 1 << @collisionSystem.totalCategories++ if @collisionSystem.totalCategories > 16 then console.log "There should only be 16 collision categories!" @mask = 0 @collisionSystem.allCategories[@name] = @ for otherCatName, otherCat of @collisionSystem.allCategories if @collidesWith otherCat @mask = @mask | otherCat.number otherCat.mask = otherCat.mask | @number collidesWith: (cat) -> # "none" collides with nothing return false if @name is "none" or cat.name is "none" # "obstacles" collides with everything; could also try letting air units (but not ground_and_air) fly over these return true if cat.name is "obstacles" or @name is "obstacles" # "dead" collides only with obstacles return cat.name is "obstacles" if @name is "dead" return @name is "obstacles" if cat.name is "dead" # "ground_and_air_" units don't hit ground or air units on their team (so missiles don't hit same team) sameTeam = @superteamIndex and cat.superteamIndex is @superteamIndex return false if sameTeam and @ground and @air # actually, "ground_and_air" units don't hit any ground_and_air units (temp missile collision fix) return false if @ground and @air and cat.ground and cat.air # "ground" collides with "ground" return true if cat.ground and @ground # "air" collides with "air" return true if cat.air and @air # doesn't collide (probably "ground" and "air") false @nameFor: (name, superteamIndex=null) -> return name unless name.match("ground") or name.match("air") name + "_" + (superteamIndex or 0)