function init(hero) {

    hero.setName("Lantern");
    hero.setVersion("Black");
    hero.setTier(8);

    hero.setChestplate("Ring");

    hero.addPowers("lanterns:black_lantern_ring");

    hero.addAttribute("PUNCH_DAMAGE", 8, 0);
    hero.addAttribute("SPRINT_SPEED", 1.5, 1);
    hero.addAttribute("STEP_HEIGHT", 1, 0);

    hero.addKeyBind("SPELL_MENU", "Menu", 1);
    hero.addKeyBind("BLADE", "Sword", 1);
    hero.addKeyBind("SHIELD", "Shield", 1);
    hero.addKeyBind("AIM", "Chain", 1);
    hero.addKeyBind("TELEKINESIS", "Chain", 1);

    hero.addKeyBindFunc("Func_SELECT", select, "Select", 2);

    hero.addKeyBind("TRANSFORM", "Transform", 3);
    hero.addKeyBind("CHARGE", "Battery", 3)

    hero.addKeyBind("HOVER", "Hover", 4);

    hero.addKeyBind("ENERGY_PROJECTION", "Shoot Beam", 5);

    hero.setModifierEnabled(isModifierEnabled);
    hero.setKeyBindEnabled(isKeyBindEnabled);

    hero.setHasProperty(hasProperty);

    hero.addAttributeProfile("RING", ringProfile);
    hero.addAttributeProfile("TRANSFORMING", transformingProfile);
    hero.addAttributeProfile("SWORD", swordProfile);
    hero.setAttributeProfile(getProfile);

    hero.setTierOverride(tierOverride);

    hero.supplyFunction("canAim", canAim);
}

function select(player, manager) {
    var dataVar = "lanterns:dyn/black_lantern_select"
        var slot = player.getData(dataVar)

        manager.setData(player, dataVar, slot + 1)

        if (slot >= 3) {
            manager.setData(player, dataVar, 0)
        }

        return true;
}

function tierOverride(entity) {
    return entity.getData("lanterns:dyn/black_lantern_suit") ? 8 : 0;
}

function transformingProfile(profile) {
    profile.inheritDefaults();
    profile.addAttribute("PUNCH_DAMAGE", -1, 0);
    profile.addAttribute("BASE_SPEED", -5, 1);
    profile.addAttribute("SPRINT_SPEED", -5, 1);
    profile.addAttribute("STEP_HEIGHT", 0, 0);
    profile.addAttribute("JUMP_HEIGHT", -5, 0);
}
function swordProfile(profile) {
    profile.inheritDefaults();
    profile.addAttribute("PUNCH_DAMAGE", 20, 0);
    profile.addAttribute("SPRINT_SPEED", 2, 1);
    profile.addAttribute("STEP_HEIGHT", 1, 0);
}

function ringProfile(profile) {
    profile.inheritDefaults();
    profile.addAttribute("PUNCH_DAMAGE", 0, 0);
    profile.addAttribute("SPRINT_SPEED", 0, 1);
    profile.addAttribute("STEP_HEIGHT", 1, 0);
}

function getProfile(entity) {
    if (entity.getData('lanterns:dyn/black_lantern_suit_timer') > 0 && entity.getData('lanterns:dyn/black_lantern_suit_timer') < 1) {
        return "TRANSFORMING"
    } else if (!entity.getData("lanterns:dyn/black_lantern_suit")) {
        return "RING"
    } else if (entity.getData("fiskheroes:blade")) {
        return "SWORD"
    } else {
        return null
    }
}

function isModifierEnabled(entity, modifier) {
    switch (modifier.name()) {
    case "fiskheroes:flight":
        return !entity.getData("lanterns:dyn/black_battery") && entity.getData("lanterns:dyn/black_lantern_suit") && !entity.getData("fiskheroes:mask_open") && !entity.isSprinting() && !entity.getData("fiskheroes:gliding");
    case "fiskheroes:gliding":
        return !entity.getData("lanterns:dyn/black_battery") && entity.getData("lanterns:dyn/black_lantern_suit") && !entity.getData("fiskheroes:mask_open") && entity.isSprinting() || entity.getData("fiskheroes:gliding") && entity.getData("lanterns:dyn/black_lantern_suit") && !entity.getData("fiskheroes:mask_open");
    case "fiskheroes:projectile_immunity":
        return !entity.getData("lanterns:dyn/black_battery") && entity.getData("lanterns:dyn/black_lantern_suit") && !entity.getData("fiskheroes:mask_open");
    case "fiskheroes:fire_immunity":
        return !entity.getData("lanterns:dyn/black_battery") && entity.getData("lanterns:dyn/black_lantern_suit") && !entity.getData("fiskheroes:mask_open");
    case "fiskheroes:water_breathing":
        return !entity.getData("lanterns:dyn/black_battery") && entity.getData("lanterns:dyn/black_lantern_suit") && !entity.getData("fiskheroes:mask_open");
    case "fiskheroes:healing_factor":
        return !entity.getData("lanterns:dyn/black_battery") && entity.getData("lanterns:dyn/black_lantern_suit");
    case "fiskheroes:hover":
        return !entity.getData("lanterns:dyn/black_battery") && !entity.isSprinting();
    case "fiskheroes:blade":
        return !entity.getData("lanterns:dyn/black_battery") && !entity.getData("fiskheroes:glide_flying");
    case "fiskheroes:leaping":
        return !entity.getData("lanterns:dyn/black_battery") && entity.getData("lanterns:dyn/black_lantern_suit");
    case "fiskheroes:cooldown":
        return (modifier.id() == "suit_cooldown") == !entity.getData("lanterns:dyn/black_battery") || (modifier.id() == "suit_charge") == entity.getData("lanterns:dyn/black_battery")
    default:
        return true;
    }
}

function isKeyBindEnabled(entity, keyBind) {
    switch (keyBind) {
    case "SHIELD":
        return !entity.getData("lanterns:dyn/black_battery") && entity.getData("lanterns:dyn/black_lantern_select") == 2 && !entity.getData("fiskheroes:glide_flying") && !entity.getData("fiskheroes:blade") && !entity.getData("fiskheroes:energy_projection") && entity.getHeldItem().isEmpty() && entity.getData("lanterns:dyn/black_lantern_suit");
    case "TELEKINESIS":
        return !entity.getData("lanterns:dyn/black_battery") && entity.getData("lanterns:dyn/black_lantern_select") == 3 && !entity.getData("fiskheroes:blade") && !entity.getData("fiskheroes:glide_flying") && !entity.getData("fiskheroes:energy_projection") && entity.getHeldItem().isEmpty() && entity.getData("lanterns:dyn/black_lantern_suit");
    case "AIM":
        return !entity.getData("lanterns:dyn/black_battery") && entity.getData("lanterns:dyn/black_lantern_select") == 3 && !entity.getData("fiskheroes:blade") && !entity.getData("fiskheroes:glide_flying") && !entity.getData("fiskheroes:energy_projection") && entity.getHeldItem().isEmpty() && entity.getData("lanterns:dyn/black_lantern_suit");
    case "Func_SELECT":
        return !entity.getData("lanterns:dyn/black_battery") && !entity.getData("fiskheroes:blade") && !entity.getData("fiskheroes:glide_flying") && !entity.getData("fiskheroes:shield") && !entity.getData("fiskheroes:energy_projection") && entity.getHeldItem().isEmpty() && entity.getData("lanterns:dyn/black_lantern_suit");
    case "ENERGY_PROJECTION":
        return !entity.getData("lanterns:dyn/black_battery") && !entity.getData("fiskheroes:blade") && !entity.getData("fiskheroes:glide_flying") && !entity.getData("fiskheroes:shield") && entity.getHeldItem().isEmpty() && entity.getData("lanterns:dyn/black_lantern_suit");
    case "SPELL_MENU":
        return !entity.getData("lanterns:dyn/black_battery") && entity.getData("lanterns:dyn/black_lantern_select") == 0 && !entity.getData("fiskheroes:glide_flying") && !entity.getData("fiskheroes:blade") && !entity.getData("fiskheroes:shield") && !entity.getData("fiskheroes:energy_projection") && entity.getHeldItem().isEmpty() && entity.getData("lanterns:dyn/black_lantern_suit");
    case "BLADE":
        return !entity.getData("lanterns:dyn/black_battery") && entity.getData("lanterns:dyn/black_lantern_select") == 1 && !entity.getData("fiskheroes:glide_flying") && !entity.getData("fiskheroes:shield") && !entity.getData("fiskheroes:energy_projection") && entity.getHeldItem().isEmpty() && entity.getData("lanterns:dyn/black_lantern_suit");
    case "HOVER":
        return !entity.getData("lanterns:dyn/black_battery") && !entity.getData("fiskheroes:mask_open") && entity.getData("lanterns:dyn/black_lantern_suit") && !entity.getData("fiskheroes:gliding") && !entity.isSprinting();
    case "TRANSFORM":
        return !entity.getData("lanterns:dyn/black_battery") && !entity.isSneaking() && !entity.getData("fiskheroes:mask_open") && !entity.getData("fiskheroes:blade") && !entity.getData("fiskheroes:glide_flying");
    case "CHARGE":
        return entity.isSneaking() && entity.isOnGround() && (entity.getData("lanterns:dyn/black_lantern_suit_timer") == 1 || entity.getData("lanterns:dyn/black_lantern_suit_timer") == 0);
    default:
        return true;
    }
}

function hasProperty(entity, property) {
    return property == "MASK_TOGGLE" && entity.getData("lanterns:dyn/black_lantern_suit_timer") == 1 || property == "BREATHE_SPACE" && entity.getData("lanterns:dyn/black_lantern_suit_timer") == 1 && !entity.getData("fiskheroes:mask_open");
}

function canAim(entity) {
    return entity.getData("fiskheroes:grab_id") > -1;
}
