kiki/coffee/bullet.coffee
monsterkodi 8da4ab64a8 misc
2016-08-30 21:01:02 +02:00

85 lines
2.9 KiB
CoffeeScript

# 0000000 000 000 000 000 00000000 000000000
# 000 000 000 000 000 000 000 000
# 0000000 000 000 000 000 0000000 000
# 000 000 000 000 000 000 000 000
# 0000000 0000000 0000000 0000000 00000000 000
Item = require './item'
Action = require './action'
Timer = require './timer'
Material = require './material'
class Bullet extends Item
constructor: () ->
@size = 0.2
@shooter = null
super
@addAction new Action @, Action.FLY, "fly", 40
@addAction new Action @, Action.EXPLODE, "explode", 200
del: ->
if @mesh?
world.scene.remove @mesh
Timer.removeActionsOfObject @
_.pull world.objects, @
@mesh = null
createMesh: ->
geom = new THREE.SphereGeometry 1, 16, 16
@mesh = new THREE.Mesh geom, Material.bullet.clone()
@mesh.scale.set @size, @size, @size
@shootFromBot: (bot) ->
bullet = new Bullet()
world.addObject bullet
bullet.direction = bot.currentDir()
bullet.setPosition bot.position.plus bullet.direction.mul 0.8
bullet.shooter = bot
bullet.mesh.material.color.set bot.mesh.material.color
world.playSound 'BULLET_SHOT', bot.getPos()
return if bullet.hitObjectAtPos bot.position.plus bullet.direction
Timer.addAction bullet.getActionWithId Action.FLY
performAction: (action) ->
relTime = action.getRelativeTime()
if action.id == Action.FLY
@current_position = @position.plus @direction.mul relTime
else if action.id == Action.EXPLODE
@size = 0.2 + relTime/2.0
@mesh?.material.opacity = 0.8 * (1.0-relTime)
step: (step) ->
@mesh.position.copy @current_position
@mesh.scale.set @size, @size, @size
hitObjectAtPos: (pos) ->
world.switchAtPos(pos)?.bulletImpact()
if world.isInvalidPos(pos) or world.isOccupiedPos pos
hitObject = world.getRealOccupantAtPos pos
if hitObject != @shooter
if hitObject?
hitObject.bulletImpact()
world.playSound hitObject.bulletHitSound?() ? 'BULLET_HIT_OBJECT'
else
world.playSound 'BULLET_HIT_WALL', pos
Timer.addAction @getActionWithId Action.EXPLODE
return true
false
finishAction: (action) -> @position = @current_position if action.name == "fly"
actionFinished: (action) ->
if action.id == Action.FLY
if @hitObjectAtPos @position.plus @direction.mul 0.5
return
Timer.addAction @getActionWithId Action.FLY
else if action.id == Action.EXPLODE
@del()
module.exports = Bullet