# 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   

log    = require '/Users/kodi/s/ko/js/tools/log'

Item   = require './item'
Action = require './action'
Timer  = require './timer'

class Bullet extends Item
    
    constructor: () ->
        @size = 0.2
        @src_object = null
        
        geom = new THREE.SphereGeometry 1, 16, 16
        mat  = new THREE.MeshPhongMaterial 
            color:          0x2222ff
            side:           THREE.FrontSide
            shading:        THREE.SmoothShading
            transparent:    true
            opacity:        0.8
            shininess:      5
        @mesh = new THREE.Mesh geom, mat
        @mesh.scale.set @size, @size, @size
        super
        @addAction new Action @, Action.FLY,     "fly",     40
        @addAction new Action @, Action.EXPLODE, "explode", 200
            
    @shootFromBot: (bot) ->
        bullet = new Bullet()
        world.addObject bullet 
        bullet.direction = bot.getCurrentDir()
        bullet.setPosition bot.position.plus bullet.direction.mul 1/2.0
        bullet.src_object = bot
        # log 'shootFromBot', bullet.direction, bullet.position
        world.playSound 'BULLET_SHOT', bot.getPos()
    
        return if bullet.hitObjectAtPos bullet.position.plus bullet.direction.mul 1/2.0
    
        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
            # color.setAlpha(0.8 * (1.0-relTime))
    
    step: (step) -> 
        @mesh.position.copy @current_position
        @mesh.scale.set @size, @size, @size
    
    hitObjectAtPos: (pos) ->
        if world.isInvalidPos(pos) or world.isOccupiedPos pos
            hitObject = world.getRealOccupantAtPos pos
            if hitObject != @src_object
                if hitObject?
                    hitObject.bulletImpact()
                    world.playSound hitObject.bulletHitSound?() ? 'BULLET_HIT_OBJECT'
                    # if hitObject instanceof Mutant and not hitObject.isDead()
                        # world.playSound 'BULLET_HIT_MUTANT', pos
                    # else if hitObject == world.player
                        # world.playSound 'BULLET_HIT_PLAYER', pos
                    # else
                        # world.playSound 'BULLET_HIT_OBJECT', pos
                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 1/2.0
                return
            Timer.addAction @getActionWithId Action.FLY
        else if action.id == Action.EXPLODE
            world.deleteObject @
            
module.exports = Bullet
