
function ia.update_hero()

    if sprites.hero.state == templates.DEAD then
        if sprites.hero.cooldown > 0 then
            local tx1, tx2, ty = (sprites.hero.pos.x+4)>>3, (sprites.hero.pos.x+11)>>3, (sprites.hero.pos.y+1)>>3
            local tile_under_me1 = map.tile(tx1,ty+2)
            local tile_under_me2 = map.tile(tx2,ty+2)
            if tile_under_me1 == 0 and tile_under_me2 == 0 then
                if rooms.pos.y<84 and ty+2>rooms.pos.y+12 then
                    game.change_room(0,1)
                else
                    if sprites.hero.cooldown % 4 == 0 then
                        sprites.hero.pos.y = sprites.hero.pos.y + 1
                    end
                end
            end
            sprites.hero.cooldown = sprites.hero.cooldown - 1
            if sprites.hero.cooldown == 0 then
                sprites.lights_out()
            end
        end
        return
    end

    -- Update hero
    local anim = "hero_stand"
    local move_anim = "hero_walk"

    -- Si estem en cooldown desde l'ultim dispar, decrementem el contador
    -- Si estem en cooldown desde l'ultim dispar, decrementem el contador
    if sprites.hero.gun_cooldown > 0 then
        sprites.hero.gun_cooldown = sprites.hero.gun_cooldown - 1
    end

    if sprites.hero.cooldown > 0 then
        sprites.hero.cooldown = sprites.hero.cooldown - 1
    end

    -- Si estem en jump_throttle desde l'ultim bot, decrementem el contador
    if sprites.hero.jump_throttle > 0 then
        sprites.hero.jump_throttle = sprites.hero.jump_throttle - 1
    end

    if sprites.hero.state == templates.DYING then
        if (sprites.hero.cooldown//5) % 2 == 0 then
            sprites.hero.invisible = true
        else
            sprites.hero.invisible = nil
        end
        if sprites.hero.cooldown == 0 then
            sprites.hero.state = templates.ALIVE
            sprites.hero.invisible = nil
        end
    end

    -- Si li han pegat...
    if sprites.hero.has_been_hit then
        if sprites.hero.flipped then
            local tx, ty = (sprites.hero.pos.x+12)>>3, (sprites.hero.pos.y+16)>>3
            if map.tile(tx,ty) < 16 and map.tile(tx,ty-1) < 16 then
                if tx>rooms.pos.x+19 then
                    game.change_room(1,0)
                else
                    sprites.hero.pos.x = sprites.hero.pos.x + 1
                end
            end
        else
            local tx, ty = (sprites.hero.pos.x+3)>>3, (sprites.hero.pos.y+16)>>3
            if map.tile(tx,ty) < 16 and map.tile(tx,ty-1) < 16 then
                if tx<rooms.pos.x then
                    game.change_room(-1,0)
                else
                    sprites.hero.pos.x = sprites.hero.pos.x - 1
                end
            end
        end
        sprites.hero.has_been_hit = sprites.hero.has_been_hit - 1
        if sprites.hero.has_been_hit == 0 then
            sprites.hero.has_been_hit = nil;
        end
    end

    -- si està en l'animació de disparar, no podem fer res i eixim ja
    if sprites.hero.shooting then
        -- A no ser que siga l'ultim frame, en tal cas tornem a estar de peu i au
        if sprites.hero.current_frame==3 then
            sprites.hero.shooting = false
            sprites.set_animation(sprites.hero, "hero_stand")
        else
            return
        end
    end

    -- SI ESTÀ BOTANT...
    if sprites.hero.jumping > 0 then
        anim = "hero_jump"
        move_anim = "hero_jump"
        local tx1, tx2, ty = (sprites.hero.pos.x+4)>>3, (sprites.hero.pos.x+11)>>3, (sprites.hero.pos.y)>>3
        --draw.rect(tx1<<3,ty<<3,8,8,8)
        --draw.rect(tx2<<3,ty<<3,8,8,28)
        if map.tile(tx1,ty) < 16 and map.tile(tx2,ty) < 16 then
            --if ty+1<rooms.pos.y then
            --    game.change_room(0,-1)
            --else
                if sprites.hero.jumping > 1 then sprites.hero.pos.y = sprites.hero.pos.y - 1 end
            --end
        else
            sprites.hero.jumping = 0
            sprites.hero.jump_throttle = 10
        end
        sprites.hero.jumping = sprites.hero.jumping - 1
    else
    -- SI NO ESTÀ BOTANT...
        -- SI ESTÀ EN UNES ESCALERES...
        local txm, ty = (sprites.hero.pos.x+8)>>3, (sprites.hero.pos.y+8)>>3
        if (map.tile(txm,ty) > 0 and map.tile(txm,ty) < 16) or (map.tile(txm,ty+1) > 0 and map.tile(txm,ty+1) < 16) then
            anim = "hero_stairs_idle"
            move_anim = "hero_stairs"
            -- SI PULSA AMUNT...
            if key.down(key.UP) or pad.down(pad.UP) then
                anim = move_anim
                local tx1, tx2, ty = (sprites.hero.pos.x+8)>>3, (sprites.hero.pos.x+11)>>3, (sprites.hero.pos.y)>>3
                if map.tile(tx1,ty) < 16 then --or map.tile(tx2,ty) < 16 then
                    if ty+1<rooms.pos.y then
                        game.change_room(0,-1)
                    else
                        sprites.hero.pos.y = sprites.hero.pos.y - 1
                    end
                end
            -- SI PULSA AVALL...
            elseif key.down(key.DOWN) or pad.down(pad.DOWN) then
                anim = move_anim
                local tx1, tx2, ty = (sprites.hero.pos.x+4)>>3, (sprites.hero.pos.x+11)>>3, (sprites.hero.pos.y+1)>>3
                if map.tile(tx1,ty+2) < 16 or map.tile(tx2,ty+2) < 16 then
                    if ty+2>rooms.pos.y+12 then
                        game.change_room(0,1)
                    else
                        sprites.hero.pos.y = sprites.hero.pos.y + 1
                    end
                end
            end
        else
        -- SI NO ESTÀ EN UNES ESCALERES...
            local tx1, txm, tx2, ty = (sprites.hero.pos.x+4)>>3, (sprites.hero.pos.x+8)>>3, (sprites.hero.pos.x+11)>>3, (sprites.hero.pos.y+1)>>3
            -- SI ESTÀ CAIGUENT...
            local tile_under_me1 = map.tile(tx1,ty+2)
            local tile_under_me2 = map.tile(tx2,ty+2)
            if tile_under_me1 == 0 and tile_under_me2 == 0 then
                if rooms.pos.y<84 and ty+2>rooms.pos.y+12 then
                    game.change_room(0,1)
                else
                    if sprites.hero.pos.y >= 808 then
                        sprites.hero.hit(0)
                        return
                    end
                    sprites.hero.pos.y = sprites.hero.pos.y + 2
                end
            else
            -- SI NO ESTÀ CAIGUENT...
                if tile_under_me1==84 then
                    map.tile(tx1,ty+2,68)
                    local broken_tile = templates.create("brick", {pos={x=tx1<<3, y=(ty+2)<<3}, flipped=sprites.hero.flipped})
                    table.insert(sprites.list, broken_tile)
                end
                if tile_under_me2==84 then
                    map.tile(tx2,ty+2,68)
                    local broken_tile = templates.create("brick", {pos={x=tx2<<3, y=(ty+2)<<3}, flipped=sprites.hero.flipped})
                    table.insert(sprites.list, broken_tile)
                end
                if tile_under_me1>=16 or tile_under_me1>=16 then
                    sprites.hero.pos.y = (ty<<3)-1
                end
                anim = "hero_stand"
                if sprites.hero.state == templates.ALIVE then sprites.save_safe_pos() end
                -- SI ESTÀ SOBRE UNES ESCALERES I POLSA AVALL...
                if (map.tile(txm,ty+2) < 16 and map.tile(txm,ty+2) > 0) then
                    if key.down(key.DOWN) or pad.down(pad.DOWN) then
                        anim = "hero_stairs"
                        --local tx1, tx2, ty = (sprites.hero.pos.x+4)>>3, (sprites.hero.pos.x+11)>>3, (sprites.hero.pos.y+1)>>3
                        --if map.tile(tx1,ty+2) < 16 or map.tile(tx2,ty+2) < 16 then
                        sprites.hero.pos.x = (txm << 3)-4
                        sprites.hero.pos.y = sprites.hero.pos.y + 1
                        --end
                    end
                end
                -- SI POLSA BOTAR...
                if ( key.down(key.X) or pad.down(pad.A) ) and sprites.hero.jump_throttle == 0 then
                    sprites.hero.jumping = 17

                    -- SI POLSA DISPAR...
                elseif (sprites.hero.gun_cooldown==0) and (key.down(key.Z) or pad.down(pad.B)) then
                    sprites.hero.shooting = true
                    sprites.hero.gun_cooldown = 20
                    local bullet = templates.create("bullet", {pos={x=sprites.hero.pos.x, y=sprites.hero.pos.y+7}, flipped=sprites.hero.flipped})
                    table.insert(sprites.list, bullet)
                    anim = "hero_shoot"
                end
            end
        end
    end
    -- ESTIGA COM ESTIGA, SI POLSA ESQUERRA O DRETA...
    if not sprites.hero.shooting and not sprites.hero.has_been_hit then
        if key.down(key.LEFT) or pad.down(pad.LEFT) then
            sprites.hero.flipped = true
            anim = move_anim
            local tx, ty = (sprites.hero.pos.x+3)>>3, (sprites.hero.pos.y+16)>>3
            if map.tile(tx,ty) < 16 and map.tile(tx,ty-1) < 16 then
                if tx<rooms.pos.x then
                    game.change_room(-1,0)
                else
                    sprites.hero.pos.x = sprites.hero.pos.x - 1
                end
            end
        elseif key.down(key.RIGHT) or pad.down(pad.RIGHT) then
            sprites.hero.flipped = false
            anim = move_anim
            local tx, ty = (sprites.hero.pos.x+12)>>3, (sprites.hero.pos.y+16)>>3
            if map.tile(tx,ty) < 16 and map.tile(tx,ty-1) < 16 then
                if tx>rooms.pos.x+19 then
                    game.change_room(1,0)
                else
                    sprites.hero.pos.x = sprites.hero.pos.x + 1
                end
            end
        end
    end
    sprites.set_animation(sprites.hero, anim)
end


function ia.hero_hit(live)
    live = live or sprites.hero.lives-1
    local light_table = {[0]=20, 30, 50, 80, 100}
    local red_table = {[0]=0, 0.25, 0.5, 0.75, 1}
    if live==4 then
        tweening.add(1,0,0.25,easing.linear,function(value,n,finished)palfade.fade_white(value)end)
    else
        tweening.add(1,0,0.25,easing.linear,function(value,n,finished)palfade.fade_red(value)end)
    end
    local start_light = light_table[sprites.hero.lives]
    local start_red = red_table[sprites.hero.lives]
    local end_light = light_table[live]
    local end_red = red_table[live]

    sprites.hero.lives = live
    tweening.add(start_light,end_light,1,easing.linear,function(value,n,finished)sprites.hero.light = value end)
    tweening.add(start_red,end_red,1,easing.linear,function(value,n,finished)palfade.fade_reddish(value)end)

    if sprites.hero.lives == 0 then
        sprites.hero.state = templates.DEAD
        sprites.hero.invisible = nil
        sprites.hero.surf = surf.load("gfx/mummy.gif")
        sprites.set_animation(sprites.hero, "mummy_dying")
        sprites.hero.jumping = 0
        sprites.hero.cooldown = 120
    elseif sprites.hero.lives < 4 then
        sprites.hero.state = templates.DYING
        sprites.hero.cooldown = 60
        sprites.hero.shooting = false
        sprites.set_animation(sprites.hero, "hero_stand")
        sprites.hero.jumping = 8
        sprites.hero.has_been_hit = 16
    end
end

function ia.hero_give_key(color)
    if sprites.hero.keys[color] then return false end
    sprites.hero.keys[color] = true
    tweening.add(1,0,0.25,easing.linear,function(value,n,finished)palfade.fade_white(value)end)
    return true
end

function ia.hero_reset()
    sprites.hero.state = templates.ALIVE
    sprites.hero.invisible = nil
    sprites.hero.lives = 4
    sprites.hero.surf = surf.load("gfx/morcus.gif")
    sprites.hero.animation = "hero_stand"
    sprites.hero.current_frame = 1
    sprites.hero.current_wait = 1
    sprites.hero.flipped = false
    sprites.hero.light = 100
    sprites.hero.pos = {x=sprites.last_safe_pos.x,y=sprites.last_safe_pos.y}
    sprites.hero.shooting = false

    rooms.go_to_room(sprites.last_safe_room)
    palfade.init()
end