public void equip(EquipData equip_data, bool mainside = true)
    {
        string target = null;

        switch (equip_data.slot)
        {
        case Slot.arm_dual: unequip("arm_main"); unequip("arm_off"); target = "arm_dual"; break;

        case Slot.arm:
            unequip("arm_dual");
            if (!parent_actor.has_tech("dual_wield"))
            {
                // If Actor cannot dual wield weapon
                // Unequip any weapons from both arms
                unequip_if_weapon("arm_main");
                unequip_if_weapon("arm_off");
            }
            target = mainside ? "arm_main" : "arm_off";

            break;

        case Slot.body: target = "body"; break;

        case Slot.slingback: target = mainside ? "slingback_main" : "slingback_off"; break;

        case Slot.quiver: target = mainside ? "quiver_main" : "quiver_off"; break;

        case Slot.belt: target = "belt"; break;

        case Slot.belt_toolkit: target = "belt_toolkit"; break;

        case Slot.gauntlet: target = mainside ? "gauntlet_main" : "gauntlet_off"; break;

        case Slot.armbelt: target = mainside ? "armbelt_main" : "armbelt_off"; break;

        case Slot.greaves: target = mainside ? "greaves_main" : "greaves_off"; break;

        case Slot.helmet: target = "helmet"; break;

        case Slot.hipbelt: target = mainside ? "hipbelt_main" : "hipbelt_off"; break;

        default: throw new System.ArgumentException("Don't know how to equip " + equip_data.name + " to " + equip_data.slot);
        }

        unequip(target); _equip(equip_data, target);
    }
    public void deliver_to(UnitActor other, string action)
    {
        switch (action)
        {
        case "marksmanship_double_tap":
            EquipData eq = actor.check_has_equipment_with_attributes("is_bow");

            if (eq != null)
            {
                List <EquipData> ammo = actor.use_ammo("arrow_iron");
                if (ammo.Count >= 1)
                {
                    if (is_strictly_hit(other, IS_RANGED, get_delta_range(eq, other)))
                    {
                        float damage = eq.base_damage + ammo[0].base_damage;

                        if (actor.has_tech("marksmanship_bow"))
                        {
                            damage = Mathf.Pow(damage, (DEX_CA + actor.stats.dexterity) / DEX_CB);
                        }

                        Debug.Log("Damage = " + damage);
                    }
                    else
                    {
                        Debug.Log("Missed!");
                    }
                }
                else
                {
                    throw new System.InvalidOperationException("Actor does not have available arrows");
                }
            }
            else
            {
                throw new System.InvalidOperationException("Actor does not have bow equipment");
            }
            break;
        }
    }