You Spoony Guide! - A Troubadour's Libretto

言語: JP EN DE FR
2010-06-21
New Items
users online
フォーラム » FFXI » Jobs » Bard » You Spoony Guide! - A Troubadour's Libretto
You Spoony Guide! - A Troubadour's Libretto
First Page 2 3 ... 62 63
 Asura.Crevox
Offline
サーバ: Asura
Game: FFXI
user: Crevox
Posts: 365
By Asura.Crevox 2023-01-29 17:35:10  
Asura.Sechs said: »
What do you mean with "priority"? Which songs to cast first, i.e. order? Or do you mean which songs are on average more "important"?

Which are more important to have on and are more useful for DPS/klll speed in general. Not the order.
 Asura.Dexprozius
Offline
サーバ: Asura
Game: FFXI
Posts: 353
By Asura.Dexprozius 2023-01-29 17:54:11  
That depends entirely on the situation, i.e. what content your tackling and what your party needs based on their gear/capabilities.

Marches are typically your most important, particularly Honor March as its a march/madrigal/and minuet in one. Should you do 2 marches? That depends if they're getting haste from other sources. Geo/Blu/Rdm etc.

Generally, after marches, if your party is all melee focused you can't go wrong with a couple Minuets. Be it 1, 2 or 3 depending on if you have Daurdabla or if you're clarion calling. When you do get Daurdabla and doing 5 songs, sometimes people prefer a different 5th song than Minuet 3 since it's lower attack. Often times that's where you'll sub in a Blade Madrigal if acc is lacking, a Minne V if people are taking hits often, or a Herculean Etude to boost WSD.

I definitely wouldnt consider Madrigal a "staple" and definitely wouldn't rank it in importance over minuet. Brd's main job is to boost the damage of the party, and madrigal should only be used when the evasion of the target(s) requires it. When it's necessary, its Extremely important, but in general play your DD's should be managing their own accuracy.

Also regardless however many songs you can cast, don't forget to neglect the tank and healer. If your inexperienced or slow, bare minimum you should be slapping a defense song on the tank and a ballad on the healer. If you get a little faster during your nitro window, you can start doing 2 Minnes/Mambos on the tank + a ballad or sirvente, then 2 ballads + Minne or Dirge or Paeon on the mage.

Having said this, you also should consider if you're meleeing as well (which you should be), and you may want to pianissimo yourself a madrigal since Brd's stats lack compared to other DDs, especially if you offhand a Centovente. ALSO, if your Tank/Healer are good and dont need as much support, you can make due with giving them just 1 or 2 songs instead of spending all that time buffing them, and instead start DDing sooner to contribute to the kill speed of the group. (this is most notably in sheol C runs, less so in difficult boss fights)

TL;DR, I'd say the answer to your question is more nuanced than a simply hierarchy. However to simplify it, March > Minuet > "Whatever the party needs" would be the order
[+]
Offline
Posts: 1109
By DaneBlood 2023-01-29 22:30:36  
Asura.Dexprozius said: »
Having said this, you also should consider if you're meleeing as well (which you should be)

I cant agree more on this part. once you song are up falling back to crow control with lullaby and DD with /nin /dnc or assistisng the whm on /whm, its important to keep on going pushing the envelope.

This is where you show the difference between a main player of bard and just another mule. If I want 4dd songs and a ballad on the healer only, I can just bring a mule and handle that easily. But falling back to DPS is where you show the true potential of bard.
 Carbuncle.Maletaru
Offline
サーバ: Carbuncle
Game: FFXI
user: maletaru
Posts: 1520
By Carbuncle.Maletaru 2023-01-29 23:04:17  
It's also worth noting that if you do all your DD songs with the mage and tank in range and they get NiTro Minuet & March, you will not be able to apply 5 new songs to your WHM and tank. If you put 3 ballads on the WHM, for example, they will just keep replacing each other and not replacing the Minuets.

It's possible to re-apply "dummy" versions of the melee songs to your tank/healer, THEN apply their real songs, but my recommendation is to have the healer and tank go out of range when you do the melee songs, if possible. Then you can apply the 5 songs of your choice to them.

That said, the NiTro window is very stressful some of the time and if your healer can get by with a single Ballad it makes your life a whole lot easier.
 Asura.Sechs
Offline
サーバ: Asura
Game: FFXI
user: Akumasama
Posts: 9876
By Asura.Sechs 2023-01-30 01:04:40  
Asura.Crevox said: »
Asura.Sechs said: »
What do you mean with "priority"? Which songs to cast first, i.e. order? Or do you mean which songs are on average more "important"?

Which are more important to have on and are more useful for DPS/klll speed in general. Not the order.
Then it's very hard to give you one-answer-to-rule-them-all because it's entirely dependant on the situation.
You asked for DPS, so let's leave aside other generic support songs for mages or tank and let's focus on DPS.

The two most important things you can do as a BRD is capping Haste and Accuracy as those two, when uncapped, are by far the biggest damage increase for your DPS.
Please allow me to elaborate further


Haste
If your party has no other source of haste, you are going to have Honor March and Victory March, those two songs alone will cap melee haste.(it caps at roughly ~43,75 haste)

If your party has other sources of haste (Haste2 from RDM or SMN, or Indihaste from GEO) then Honor March alone will suffice.
If you have Soul Voice active, then even just Haste1 will be enough to cap with only Honor March up.
In these two situation you need only one song slot (HM) to cap haste for your pt.


Accuracy
This is going to depend a lot on the target you're fighting and the accuracy level of your DPS. These days I'd dare say it's hard to find situations where you need TWO madrigals. Most of the time you'll need none because HM also provides some accuracy. But if you find out you really need acc, then in general Blade Madrigal, in addition to HM, will be more than enough, i.e. one song slot.


The rest
The remaining song slots (2-4 depending on the previously discussed situations) will be used for Minuets, which provides a static buff to attack, which will then furtherly multiplied by Att% buffs that your DPSs may or may not have available (Smite job trait, Indi Fury, Berserk, Chaos Roll, Ifrit's Warcy etc).

If you have soulvoice up then most of the time using 3-4 song slots for Minuets is gonna be too much (i.e. above the cap). For these situations you're gonna use at least one Etude song. You need to pick one that will be favoured by your current DPS. In case of conflicting necessities then the best compromise is probably Herculean Etude (STR). Or you may decide to reserve one slot to other specific needs of the current setup, like one Minne for physical defense, Scherzo against very dangerous moves, or something else like a generic Ballad.


In general
It depends a lot on your party/jobs setup but I find the most common combination is 2 Marches and 3 Minuets.
[+]
 Carbuncle.Maletaru
Offline
サーバ: Carbuncle
Game: FFXI
user: maletaru
Posts: 1520
By Carbuncle.Maletaru 2023-01-30 11:45:08  
Sech's summary is good, only thing I would add is Dirge & Carol, which are huge for certain situations. It really comes down to what your group needs to kill the enemy at hand. Dirge can really help keep hate on the tank, especially for long fights against single mobs, like Odyssey bosses at high vengeance level or W3 Dynamis [D] bosses. It isn't as relevant if your DDs are using magical or hybrid WS, or if they have /DRG to Super Jump their hate away.

Are you seeing now how there isn't just a default set of songs for all situations?

It also depends if you're using CC and have Daurdabla, or if you have Soul Voice up, whether you have a GEO, which GEO buffs they're using, etc. If you have Chaos, Fury, Frailty, Dia 3, and Corrosive Ooze, you'll probably want an Etude or two since attack will easily be capped.

Talk to your party about what they're after, how their accuracy sets are, etc. to determine what the best songs are.
[+]
 Phoenix.Capuchin
Offline
サーバ: Phoenix
Game: FFXI
user: Anza
Posts: 3477
By Phoenix.Capuchin 2023-01-30 17:37:20  
A couple additional points:

1) Marcato (150% song potency for the next ONE song) is an important ability that I sometimes see less experienced BRDs using poorly.

* Remember to use Marcato whenever it's up and it's time to re-sing; meaning every time you sing NiTro songs for a Carnwenhan BRD, and likely every other set of songs for a non-Mythic BRD.

* For Marsyas owners: Marcato should normally be used to power up Honor March, unless you have a very good reason to increase the strength of a different song (see below). Marcato+HM adds Atk+116, Acc+29, and about 8.5% haste. Compare that to using Marcato on Valor Minuet V, which only gains Atk+111 (assuming Song potency +8), and it's obvious that HM is the better call.

* Without Marsyas: You're usually going to be using two Marches that will already cap party haste, so additional potency from Marcato is going to be useless in that situation (same logic applies for situations like when the Bard is doing only one March because another job like a RDM or SMN is also giving Haste II to those who need it and already putting them at capped haste). Therefore, usually your Attack song is the next most important BRD song, so general rule of thumb should be to use Marcato for your highest Minuet, unless you have a very good reason to prioritize something else (see next bullet for some examples).

* On occasion you might consider Marcato for a different song. Party really struggling for accuracy? Marcato Blade Madrigal adds Acc+54 above the normal Acc+108 from a song+8 bard (a bigger Acc buff than Marcato+HM), and you may prefer to prioritize Acc over Atk. Or maybe you're super sure your party is capping attack already from other buffs/debuffs, so you don't need any more Haste OR attack... well, then you might want to Marcato something else like an Etude if you're using one, or if you're using a common March/March/Min/Min, perhaps you save the Marcato for a Ballad on the backline, or to Pianissimo Sirvente or Minne on a tank (or Dirge on a heavy DD), etc. But the point is, those situations are rare - Marcato is usually for Honor March, or Minuet V for non-Aeonic BRDs.

* Re: capped attack. In that situation, stacking even more attack with Marcato Minuet is not adding anything of value. However, I'd strongly advise people to not assume all your DDs are attack capped unless you're ABSOLUTELY POSITIVE that is the case. It can be quite hard to judge, and it is very easy to lose capped attack for some period of time (for example, Dia drops from the mob, a GEO bubble gets destroyed, a Chaos Roll or Minuet gets dispelled, a mob uses a defense boosting TP move, somebody forgets to use Angon/Tachi:Ageha/Full Break, whatever). Erring on the side of adding more attack is the safer call for the vast majority of sitautions.

2) Another common reason to use a Madrigal would be if you have players using low accuracy non-ilevel weapons such as an offhand Magian TP Bonus +1000 weapon (frequent for jobs like THF DNC BLU) or a Kraken Club.

And there ARE still situations where even with lv119 weapons you will need party acc buffs due to evasive mobs. For example, it's pretty standard to use Blade Madrigal as one of your songs for Dyna Divergence wave 3 (even though that's not necessary for most parties in wave 1-2).
[+]
 Asura.Dexprozius
Offline
サーバ: Asura
Game: FFXI
Posts: 353
By Asura.Dexprozius 2023-01-30 17:40:08  
Carbuncle.Maletaru said: »
It's also worth noting that if you do all your DD songs with the mage and tank in range and they get NiTro Minuet & March, you will not be able to apply 5 new songs to your WHM and tank. If you put 3 ballads on the WHM, for example, they will just keep replacing each other and not replacing the Minuets.

It's possible to re-apply "dummy" versions of the melee songs to your tank/healer, THEN apply their real songs, but my recommendation is to have the healer and tank go out of range when you do the melee songs, if possible. Then you can apply the 5 songs of your choice to them.

That said, the NiTro window is very stressful some of the time and if your healer can get by with a single Ballad it makes your life a whole lot easier.

That's partially not true. It just depends how long you let the Minuets decay. In particular, you can sing dummies 1st starting with Marches to get DDs rolling mid buff. Then if you NiTro sing the Minuets 1st, then 2 Marches, you can generally give your PLD 2 Minnes and a Ballad overwriting the Minuets, as they've decayed for maybe 15-20seconds by that point, and then you can Ballad x2 your WHM/SCH.

Realistically the trick is juggling timers, making sure you do your lowest duration ones last to ensure they overwrite. I went a LONG time using the Empyrean legs for Ballad, and found that the Inyanga +2 were much better because at the cost of 1 potency on your Ballads, you're able to more consistently overwrite melee songs on your mages.

If you're trying to do 5 songs on your mages after the 5 songs on your melee, the same principle should apply here, but realistically the mages would want haste too, so you wouldnt really need to do 5 new songs, just 3, maybe 4.
Offline
Posts: 255
By trinironnie 2023-02-18 16:14:45  
Anyone got a BRD lua that allows you to have DD weapons? Switches to carn for songs then back the originial DD weapon ?
Offline
Posts: 40
By quelthos 2023-02-18 16:58:57  
trinironnie said: »
Anyone got a BRD lua that allows you to have DD weapons? Switches to carn for songs then back the originial DD weapon ?

Mine has weapon toggles with windows key + R or E.
windows key + W for weapon lock.
by default it switches to carn to sing unless you weapon lock.
So if you have naegling or other weapons toggled, it will try to switch to carn then back.
Code
-- Initialization function for this job file.
function get_sets()
    mote_include_version = 2

    -- Load and initialize the include file.
    include('Mote-Include.lua')
    res = require 'resources'
end


-- Setup vars that are user-independent.  state.Buff vars initialized here will automatically be tracked.
function job_setup()
    state.SongMode = M{['description']='Song Mode', 'None', 'Placeholder'}

    state.Buff['Pianissimo'] = buffactive['pianissimo'] or false

    no_swap_gear = S{"Warp Ring", "Dim. Ring (Dem)", "Dim. Ring (Holla)", "Dim. Ring (Mea)",
              "Trizek Ring", "Echad Ring", "Facility Ring", "Capacity Ring"}
    elemental_ws = S{"Aeolian Edge"}


end

-------------------------------------------------------------------------------------------------------------------
-- User setup functions for this job.  Recommend that these be overridden in a sidecar file.
-------------------------------------------------------------------------------------------------------------------

-- Setup vars that are user-dependent.  Can override this function in a sidecar file.
function user_setup()
    state.OffenseMode:options('Normal')
    state.HybridMode:options('Normal')
    state.WeaponskillMode:options('Normal')
    state.CastingMode:options('Normal', 'Resistant')
    state.IdleMode:options('Normal', 'Refresh')

    state.LullabyMode = M{['description']='Lullaby Instrument', 'Harp', 'Horn'}

    state.Carol = M{['description']='Carol',
        'Fire Carol', 'Fire Carol II', 'Ice Carol', 'Ice Carol II', 'Wind Carol', 'Wind Carol II',
        'Earth Carol', 'Earth Carol II', 'Lightning Carol', 'Lightning Carol II', 'Water Carol', 'Water Carol II',
        'Light Carol', 'Light Carol II', 'Dark Carol', 'Dark Carol II',
        }

    state.Threnody = M{['description']='Threnody',
        'Fire Threnody II', 'Ice Threnody II', 'Wind Threnody II', 'Earth Threnody II',
        'Ltng. Threnody II', 'Water Threnody II', 'Light Threnody II', 'Dark Threnody II',
        }

    state.Etude = M{['description']='Etude', 'Sinewy Etude', 'Herculean Etude', 'Learned Etude', 'Sage Etude',
        'Quick Etude', 'Swift Etude', 'Vivacious Etude', 'Vital Etude', 'Dextrous Etude', 'Uncanny Etude',
        'Spirited Etude', 'Logical Etude', 'Enchanting Etude', 'Bewitching Etude'}

    state.WeaponSet = M{['description']='Weapon Set', 'Mordant', 'Naegling', 'Tauret', 'Rudra'}
    state.WeaponLock = M(false, 'Weapon Lock')
    -- state.CP = M(false, "Capacity Points Mode")

    -- Additional local binds
   -- include('Global-Binds.lua') -- OK to remove this line
   -- include('Global-GEO-Binds.lua') -- OK to remove this line

    -- Adjust this if using the Terpander (new +song instrument)
    info.ExtraSongInstrument = 'Daurdabla'
    -- How many extra songs we can keep from Daurdabla/Terpander
    info.ExtraSongs = 2

    --send_command('bind ^` input /ma "Chocobo Mazurka" <me>')
	send_command('bind @` gs c cycle LullabyMode')
	send_command('bind ^` gs c cycle SongMode')
    --send_command('bind !p input /ja "Pianissimo" <me>')

    --send_command('bind ^insert gs c cycleback Etude')
    --send_command('bind ^delete gs c cycle Etude')
    --send_command('bind ^home gs c cycleback Carol')
    --send_command('bind ^end gs c cycle Carol')
    --send_command('bind ^pageup gs c cycleback Threnody')
    --send_command('bind ^pagedown gs c cycle Threnody')

    send_command('bind @w gs c toggle WeaponLock')
    -- send_command('bind @c gs c toggle CP')
    send_command('bind @e gs c cycleback WeaponSet')
    send_command('bind @r gs c cycle WeaponSet')
    send_command('bind ` tc nearest')
    --send_command('bind ^numpad7 input /ws "Savage Blade" <t>')
    --send_command('bind ^numpad7 input /ws "Mordant Rime" <t>')
    --send_command('bind ^numpad4 input /ws "Evisceration" <t>')
    --send_command('bind ^numpad5 input /ws "Rudra\'s Storm" <t>')
    --send_command('bind ^numpad1 input /ws "Aeolian Edge" <t>')

    select_default_macro_book()

    state.Auto_Kite = M(false, 'Auto_Kite')
    Haste = 0
    DW_needed = 0
    DW = false
    moving = false
    update_combat_form()
    determine_haste_group()
end


-- Called when this job file is unloaded (eg: job change)
function user_unload()
    send_command('unbind ^`')
    send_command('unbind !`')
    send_command('unbind ^backspace')
    send_command('unbind !insert')
    send_command('unbind !delete')
    send_command('unbind ^insert')
    send_command('unbind ^delete')
    send_command('unbind ^home')
    send_command('unbind ^end')
    send_command('unbind ^pageup')
    send_command('unbind ^pagedown')
    send_command('unbind @`')
    send_command('unbind @w')
    send_command('unbind `')
    -- send_command('unbind @c')
    send_command('unbind @e')
    send_command('unbind @r')
    send_command('unbind ^numpad7')
    send_command('unbind ^numpad4')
    send_command('unbind ^numpad5')
    send_command('unbind ^numpad1')
end


-- Define sets and vars used by this job file.
function init_gear_sets()

    ------------------------------------------------------------------------------------------------
    ---------------------------------------- Precast Sets ------------------------------------------
    ------------------------------------------------------------------------------------------------

    -- Fast cast sets for spells
    sets.precast.FC = {
	--main="Kali",
    head="Nahtirah Hat",
    body="Inyanga Jubbah +2",
    hands="Leyline Gloves",
    legs="Aya. Cosciales +2",
    feet="Fili Cothurnes +2",
    neck="Baetyl Pendant",
    waist="Embla Sash",
    left_ear="Loquac. Earring",
    right_ear="Etiolation Earring",
    left_ring="Kishar Ring",
    right_ring="Weather. Ring",
    back={ name="Fi Follet Cape +1", augments={'Path: A',}},
        }

    sets.precast.FC['Enhancing Magic'] = set_combine(sets.precast.FC, {waist="Siegel Sash"})

    sets.precast.FC.Cure = set_combine(sets.precast.FC, {
        feet="Kaykaus Boots +1", --0/7
        ear2="Mendi. Earring", --0/5
        })

    sets.precast.FC.BardSong = set_combine(sets.precast.FC, {
		--main="Kali",
		range="Gjallarhorn",
        head="Fili Calot +2", --14
        --body="Brioso Justau. +3", --15
        --feet="Bihu Slippers +3", --9
        })
		
	sets.precast.FC["Honor March"] = set_combine(sets.precast.FC.BardSong,{range="Marsyas"})

    sets.precast.FC.SongPlaceholder = set_combine(sets.precast.FC.BardSong, {range=info.ExtraSongInstrument})

    sets.precast.FC.Dispelga = set_combine(sets.precast.FC, {main="Daybreak", sub="Ammurapi Shield", waist="Shinjutsu-no-Obi +1"})

    -- Precast sets to enhance JAs

    sets.precast.JA.Nightingale = {feet="Bihu Slippers +3"}
    sets.precast.JA.Troubadour = {body="Bihu Jstcorps. +3"}
    sets.precast.JA['Soul Voice'] = {legs="Bihu Cannions +3"}

    -- Waltz set (chr and vit)
    sets.precast.Waltz = {}


    ------------------------------------------------------------------------------------------------
    ------------------------------------- Weapon Skill Sets ----------------------------------------
    ------------------------------------------------------------------------------------------------

    -- Default set for any weaponskill that isn't any more specifically defined
    sets.precast.WS = {
    range={ name="Linos", augments={'Attack+16','Weapon skill damage +3%','Quadruple Attack +2',}},
    head="Nyame Helm",
    body="Bihu Jstcorps. +3",
    hands="Nyame Gauntlets",
	legs="Nyame Flanchard",		
    feet="Nyame Sollerets",
    neck="Rep. Plat. Medal",
    waist={ name="Sailfi Belt +1", augments={'Path: A',}},
    ear1={ name="Moonshade Earring", augments={'Attack+4','TP Bonus +250',}},
	ear2="Ishvara Earring",
    left_ring="Epaminondas's Ring",
    right_ring="Sroda Ring",
    back={ name="Intarabus's Cape", augments={'STR+20','Accuracy+20 Attack+20','STR+10','Weapon skill damage +10%',}},
        }

    -- Specific weaponskill sets.  Uses the base set if an appropriate WSMod version isn't found.
    sets.precast.WS['Evisceration'] = set_combine(sets.precast.WS, {
		head={ name="Blistering Sallet +1", augments={'Path: A',}},
		body="Ayanmo Corazza +2",
		neck="Fotia Gorget",
		right_ear="Mache Earring +1",
		left_ring="Begrudging Ring",
		right_ring="Hetairoi Ring",
		waist="Fotia Belt",
		back={ name="Intarabus's Cape", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','Weapon skill damage +10%',}},
        })

    sets.precast.WS['Mordant Rime'] = set_combine(sets.precast.WS, {
		head="Bihu Roundlet +3",
		body="Bihu Jstcorps. +3",
		hands="Bihu Cuffs +3",
		legs="Bihu Cannions +3",
		feet="Bihu Slippers +3",
        ear1="Regal Earring",
		right_ring={ name="Metamor. Ring +1", augments={'Path: A',}},
		waist="Kentarch Belt +1",
		back={ name="Intarabus's Cape", augments={'CHR+20','Accuracy+20 Attack+20','CHR+10','Weapon skill damage +10%',}},
        })

    sets.precast.WS['Rudra\'s Storm'] = set_combine(sets.precast.WS, {
		waist="Kentarch Belt +1",
		right_ring="Ilabrat Ring",
		back={ name="Intarabus's Cape", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','Weapon skill damage +10%',}},
        })

    sets.precast.WS['Aeolian Edge'] = set_combine(sets.precast.WS, {
		waist="Orpheus's Sash",
		neck="Sibyl Scarf",
        waist="Orpheus's Sash",
		ear2="Friomisi Earring",
		right_ring={ name="Metamor. Ring +1", augments={'Path: A',}},
		back="Izdubar Mantle",
        })

    sets.precast.WS['Savage Blade'] = set_combine(sets.precast.WS, {
        })

    sets.precast.WS['Exenterator'] = set_combine(sets.precast.WS, {
        })
    ------------------------------------------------------------------------------------------------
    ---------------------------------------- Midcast Sets ------------------------------------------
    ------------------------------------------------------------------------------------------------

    -- General set for recast times.
    sets.midcast.FastRecast = sets.precast.FC

    sets.midcast.SpellInterrupt = {
        ammo="Staunch Tathlum +1", --11
        --body="Ros. Jaseran +1", --25
        hands=gear.Chironic_WSD_hands, --20
        --legs="Querkening Brais" --15
        neck="Loricate Torque +1", --5
        ear1="Halasz Earring", --5
        ear2="Magnetic Earring", --8
        ring2="Evanescence Ring", --5
        waist="Rumination Sash", --10
        }

    sets.midcast.Utsusemi = sets.midcast.SpellInterrupt

    -- Gear to enhance certain classes of songs.
    sets.midcast.Ballad = {legs="Fili Rhingrave +2"}
    sets.midcast.Carol = {hands="Mousai Gages +1"}
    sets.midcast.Etude = {head="Mousai Turban +1"}
    sets.midcast.HonorMarch = {range="Marsyas", hands="Fili Manchettes +2"}
    sets.midcast.Lullaby = {body="Fili Hongreline +2"}
    sets.midcast.Madrigal = {head="Fili Calot +2"}
    sets.midcast.Mambo = {feet="Mou. Crackows +1"}
    sets.midcast.March = {hands="Fili Manchettes +2"}
    sets.midcast.Minne = {legs="Mou. Seraweels +1"}
    sets.midcast.Minuet = {body="Fili Hongreline +2"}
    sets.midcast.Paeon = {head="Brioso Roundlet +3",range=info.ExtraSongInstrument} --for singer addon dummy
    sets.midcast.Threnody = {body="Mou. Manteel +1"}
    sets.midcast['Adventurer\'s Dirge'] = {range="Marsyas", hands="Bihu Cuffs +3"}
    sets.midcast['Foe Sirvente'] = {head="Bihu Roundlet +3"}
    sets.midcast['Magic Finale'] = {legs="Fili Rhingrave +2"}
    sets.midcast["Sentinel's Scherzo"] = {feet="Fili Cothurnes +2"}
    sets.midcast["Chocobo Mazurka"] = {range="Marsyas"}

    -- For song buffs (duration and AF3 set bonus)
    sets.midcast.SongEnhancing = {
        main="Carnwenhan",
        range="Gjallarhorn",
        head="Fili Calot +2",
        body="Fili Hongreline +2",
        hands="Fili Manchettes +2",
        legs="Inyanga Shalwar +2",
        feet="Brioso Slippers +3",
        neck="Mnbw. Whistle +1",
		waist="Flume Belt",
		left_ear={ name="Odnowa Earring +1", augments={'Path: A',}},
		right_ear="Genmei Earring",
		left_ring="Defending Ring",
		right_ring={ name="Gelatinous Ring +1", augments={'Path: A',}},
		back={ name="Intarabus's Cape", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Store TP"+10','Phys. dmg. taken-10%',}},
        }

    -- For song defbuffs (duration primary, accuracy secondary)
    sets.midcast.SongEnfeeble = {
    main="Carnwenhan",
    sub="Ammurapi Shield",
    range="Gjallarhorn",
	head="Brioso Roundlet +3",
	body="Brioso Justau. +3",	
    hands="Brioso Cuffs +3",
    legs="Inyanga Shalwar +2",
    feet="Brioso Slippers +3",
        neck="Mnbw. Whistle +1",
        ear1="Digni. Earring",
        ear2="Regal Earring",
        ring1={name="Stikini Ring +1", bag="wardrobe2"},
        ring2={name="Stikini Ring +1", bag="wardrobe3"},
        waist="Acuity Belt +1",
        back="Aurist's Cape +1",
        }

    -- For song defbuffs (accuracy primary, duration secondary)
    sets.midcast.SongEnfeebleAcc = set_combine(sets.midcast.SongEnfeeble, {legs="Brioso Cannions +3"})

    -- For Horde Lullaby maxiumum AOE range.
    sets.midcast.SongStringSkill =  set_combine(sets.midcast.Lullaby, {
		body="Brioso Justau. +3",	
		hands="Inyan. Dastanas +2",
        ear1="Gersemi Earring",
        ear2="Darkside Earring",
        })

    -- Placeholder song; minimize duration to make it easy to overwrite.
    sets.midcast.SongPlaceholder = set_combine(sets.precast.FC, {range=info.ExtraSongInstrument})

    -- Other general spells and classes.
    sets.midcast.Cure = {
        main="Daybreak", --30
        sub="Ammurapi Shield",
    head="Kaykaus Mitra +1",
    body="Kaykaus Bliaut +1",
    hands="Kaykaus Cuffs +1",
    legs="Kaykaus Tights +1",
    feet="Kaykaus Boots +1",
    neck="Incanter's Torque",
    waist="Luminary Sash",
    left_ear="Mendi. Earring",
    right_ear="Meili Earring",
    ring1={name="Stikini Ring +1", bag="wardrobe2"},
    right_ring="Sirona's Ring",
	back="Solemnity Cape",
        }

    sets.midcast.Curaga = set_combine(sets.midcast.Cure, {
        })

    sets.midcast.StatusRemoval = {
        head="Vanya Hood",
        body="Vanya Robe",
        legs="Aya. Cosciales +2",
        feet="Vanya Clogs",
        neck="Incanter's Torque",
        ear2="Meili Earring",
        ring1="Menelaus's Ring",
        ring2="Haoma's Ring",
        back=gear.BRD_Song_Cape,
        waist="Bishop's Sash",
        }

    sets.midcast.Cursna = set_combine(sets.midcast.StatusRemoval, {
        hands="Hieros Mittens",
        neck="Debilis Medallion",
        ear1="Beatific Earring",
        back="Oretan. Cape +1",
        })

    sets.midcast['Enhancing Magic'] = {
        main="Carnwenhan",
        sub="Ammurapi Shield",
		head={ name="Telchine Cap", augments={'Enh. Mag. eff. dur. +10',}},
		body={ name="Telchine Chas.", augments={'Enh. Mag. eff. dur. +9',}},
		hands={ name="Telchine Gloves", augments={'Enh. Mag. eff. dur. +9',}},
		legs={ name="Telchine Braconi", augments={'Enh. Mag. eff. dur. +10',}},
		feet={ name="Telchine Pigaches", augments={'Enh. Mag. eff. dur. +9',}},
        neck="Incanter's Torque",
        ear1="Mimir Earring",
        ear2="Andoaa Earring",
        ring1={name="Stikini Ring +1", bag="wardrobe2"},
        ring2={name="Stikini Ring +1", bag="wardrobe3"},
        back="Fi Follet Cape +1",
        waist="Embla Sash",
        }

    sets.midcast.Regen = set_combine(sets.midcast['Enhancing Magic'], {head="Inyanga Tiara +2"})
    sets.midcast.Haste = sets.midcast['Enhancing Magic']
    sets.midcast.Refresh = set_combine(sets.midcast['Enhancing Magic'], {waist="Gishdubar Sash", back="Grapevine Cape"})
    sets.midcast.Stoneskin = set_combine(sets.midcast['Enhancing Magic'], {neck="Nodens Gorget", waist="Siegel Sash"})
    sets.midcast.Aquaveil = set_combine(sets.midcast['Enhancing Magic'], {waist="Emphatikos Rope"})
    sets.midcast.Protect = set_combine(sets.midcast['Enhancing Magic'], {ring2="Sheltered Ring"})
    sets.midcast.Protectra = sets.midcast.Protect
    sets.midcast.Shell = sets.midcast.Protect
    sets.midcast.Shellra = sets.midcast.Shell

    sets.midcast['Enfeebling Magic'] = {
        main="Carnwenhan",
        sub="Ammurapi Shield",
		head="C. Palug Crown",
		body="Inyanga Jubbah +2",
		hands="Inyan. Dastanas +2",
		legs="Inyanga Shalwar +2",
		feet="Brioso Slippers +3",		
        neck="Mnbw. Whistle +1",
        ear1="Digni. Earring",
        ear2="Vor Earring",
        ring1="Kishar Ring",
        ring2="Metamor. Ring +1",
        waist="Acuity Belt +1",
        back="Aurist's Cape +1",
        }

    sets.midcast.Dispelga = set_combine(sets.midcast['Enfeebling Magic'], {main="Daybreak", sub="Ammurapi Shield", waist="Shinjutsu-no-Obi +1"})

    ------------------------------------------------------------------------------------------------
    ----------------------------------------- Idle Sets --------------------------------------------
    ------------------------------------------------------------------------------------------------

    sets.idle = {
	range="Gjallarhorn",
    head="Nyame Helm",
    body="Nyame Mail",
    hands="Nyame Gauntlets",
    legs="Nyame Flanchard",
    feet="Nyame Sollerets",
    neck="Elite Royal Collar",
    waist="Flume Belt",
    left_ear="Tuisto Earring",
    right_ear={ name="Odnowa Earring +1", augments={'Path: A',}},
    left_ring="Defending Ring",
    right_ring={ name="Gelatinous Ring +1", augments={'Path: A',}},
    back={ name="Intarabus's Cape", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Store TP"+10','Phys. dmg. taken-10%',}},
        }
    sets.idle.Refresh = set_combine(sets.idle, {
    head="Inyanga Tiara +2",
    body="Inyanga Jubbah +2",
    hands="Inyanga Dastanas +2",
    legs="Inyanga Shalwar +2",
    feet="Inyanga Crackows +2",
    left_ear="Genmei Earring",
    right_ear="Etiolation Earring",
    ring1={name="Stikini Ring +1", bag="wardrobe2"},
    ring2={name="Stikini Ring +1", bag="wardrobe3"},
        })
    sets.idle.Town = set_combine(sets.idle, {
        })
    ------------------------------------------------------------------------------------------------
    ---------------------------------------- Defense Sets ------------------------------------------
    ------------------------------------------------------------------------------------------------
	sets.enmity = set_combine(sets.idle, {
	main="Mafic Cudgel",
	sub="Genmei Shield",
	ammo="Sapience Orb",
    head="Halitus Helm",
    neck="Unmoving Collar +1",
    ear1="Trux Earring",
    ear2="Cryptic Earring",
    body="Emet Harness +1",
    ring1="Supershear Ring",
    ring2="Pernicious Ring",
    back="Reiki Cloak",
    waist="Trance Belt",
    legs="Zoar Subligar +1",
	})
    sets.midcast['Foe Requiem'] = sets.enmity
    sets.midcast['Foe Requiem II'] = sets.enmity
    sets.midcast['Foe Requiem III'] = sets.enmity

    sets.defense.PDT = sets.idle.DT
    sets.defense.MDT = sets.idle.DT

    sets.Kiting = {feet="Fili Cothurnes +2"}
    sets.latent_refresh = {waist="Fucho-no-obi"}

    ------------------------------------------------------------------------------------------------
    ---------------------------------------- Engaged Sets ------------------------------------------
    ------------------------------------------------------------------------------------------------

    -- Engaged sets

    -- Variations for TP weapon and (optional) offense/defense modes.  Code will fall back on previous
    -- sets if more refined versions aren't defined.
    -- If you create a set with both offense and defense modes, the offense mode should be first.
    -- EG: sets.engaged.Dagger.Accuracy.Evasion

    sets.engaged = {
    range={ name="Linos", augments={'Accuracy+15','"Store TP"+3','DEX+7',}},
	--ammo="Coiste Bodhar",
    head="Aya. Zucchetto +2", --6
    body="Ayanmo Corazza +2", --4
    hands="Gazu Bracelets +1", --15
    legs="Nyame Flanchard", --5
    feet="Nyame Sollerets", --3
    neck="Bard's Charm +2",
    waist={ name="Kentarch Belt +1", augments={'Path: A',}},
    left_ear="Cessance Earring",
    right_ear="Telos Earring",
        ring1={name="Chirich Ring +1", bag="wardrobe2"},
        ring2={name="Chirich Ring +1", bag="wardrobe3"},
    back={ name="Intarabus's Cape", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Store TP"+10','Phys. dmg. taken-10%',}},
        }

    sets.engaged.Acc = set_combine(sets.engaged, {
        })

    -- * DNC Subjob DW Trait: +15%
    -- * NIN Subjob DW Trait: +25%

    -- No Magic Haste (74% DW to cap)
    sets.engaged.DW = set_combine(sets.engaged, {
        ear1="Eabani Earring", --4
        waist="Reiki Yotai", --7
		})

    sets.engaged.DW.Acc = set_combine(sets.engaged.DW, {
        })

    -- 15% Magic Haste (67% DW to cap)
    sets.engaged.DW.LowHaste = set_combine(sets.engaged.DW, {
        })
    sets.engaged.DW.Acc.LowHaste = set_combine(sets.engaged.DW, {
        })

    -- 30% Magic Haste (56% DW to cap)
    sets.engaged.DW.MidHaste = set_combine(sets.engaged.DW, {
        })
    sets.engaged.DW.Acc.MidHaste = set_combine(sets.engaged.DW, {
        })

    -- 35% Magic Haste (51% DW to cap)
    sets.engaged.DW.HighHaste = set_combine(sets.engaged.DW, {
        })
    sets.engaged.DW.Acc.HighHaste = set_combine(sets.engaged.DW, {
        })

    -- 45% Magic Haste (36% DW to cap)
    sets.engaged.DW.MaxHaste = set_combine(sets.engaged.DW, {
        })

    sets.engaged.DW.MaxHaste.Acc = set_combine(sets.engaged.DW, {
        })

    sets.engaged.DW.MaxHastePlus = set_combine(sets.engaged.DW, {
        })
    sets.engaged.DW.Acc.MaxHastePlus = set_combine(sets.engaged.DW, {
        })

    --sets.engaged.Aftermath = set_combine(sets.engaged, {})

    ------------------------------------------------------------------------------------------------
    ---------------------------------------- Hybrid Sets -------------------------------------------
    ------------------------------------------------------------------------------------------------

    sets.engaged.Hybrid = {
        }

    sets.engaged.DT = set_combine(sets.engaged, sets.engaged.Hybrid)
    sets.engaged.Acc.DT = set_combine(sets.engaged.Acc, sets.engaged.Hybrid)

    sets.engaged.DW.DT = set_combine(sets.engaged.DW, sets.engaged.Hybrid)
    sets.engaged.DW.Acc.DT = set_combine(sets.engaged.DW.Acc, sets.engaged.Hybrid)

    sets.engaged.DW.DT.LowHaste = set_combine(sets.engaged.DW.LowHaste, sets.engaged.Hybrid)
    sets.engaged.DW.Acc.DT.LowHaste = set_combine(sets.engaged.DW.Acc.LowHaste, sets.engaged.Hybrid)

    sets.engaged.DW.DT.MidHaste = set_combine(sets.engaged.DW.MidHaste, sets.engaged.Hybrid)
    sets.engaged.DW.Acc.DT.MidHaste = set_combine(sets.engaged.DW.Acc.MidHaste, sets.engaged.Hybrid)

    sets.engaged.DW.DT.HighHaste = set_combine(sets.engaged.DW.HighHaste, sets.engaged.Hybrid)
    sets.engaged.DW.Acc.DT.HighHaste = set_combine(sets.engaged.DW.Acc.HighHaste, sets.engaged.Hybrid)

    sets.engaged.DW.DT.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, sets.engaged.Hybrid)
    sets.engaged.DW.Acc.DT.MaxHaste = set_combine(sets.engaged.DW.Acc.MaxHaste, sets.engaged.Hybrid)

    sets.engaged.DW.DT.MaxHastePlus = set_combine(sets.engaged.DW.MaxHastePlus, sets.engaged.Hybrid)
    sets.engaged.DW.Acc.DT.MaxHastePlus = set_combine(sets.engaged.DW.Acc.MaxHastePlus, sets.engaged.Hybrid)


    ------------------------------------------------------------------------------------------------
    ---------------------------------------- Special Sets ------------------------------------------
    ------------------------------------------------------------------------------------------------

    --sets.SongDWDuration = {main="Carnwenhan", sub="Kali"}

    sets.buff.Doom = {
        --neck="Nicander's Necklace", --20
        ring1={name="Eshmun's Ring", bag="wardrobe3"}, --20
        ring2={name="Eshmun's Ring", bag="wardrobe4"}, --20
        waist="Gishdubar Sash", --10
        }

    sets.Obi = {waist="Hachirin-no-Obi"}
    -- sets.CP = {back="Mecisto. Mantle"}
    --sets.Reive = {neck="Ygnas's Resolve +1"}

    sets.Mordant = {main="Carnwenhan", sub="Ternion Dagger +1"}
    --sets.Twashtar = {main="Twashtar", sub="Taming Sari"}
    sets.Rudra = {main="Carnwenhan", sub="Fusetto +2"}
    sets.Naegling = {main="Naegling", sub="Fusetto +2"}
    sets.Tauret = {main="Tauret", sub="Fusetto +2"}
	--sets.Trial = {main="Fusetto +1", sub="Esikuva"}

    sets.DefaultShield = {sub="Genmei Shield"}

end


-------------------------------------------------------------------------------------------------------------------
-- Job-specific hooks for standard casting events.
-------------------------------------------------------------------------------------------------------------------

-- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
-- Set eventArgs.useMidcastGear to true if we want midcast gear equipped on precast.
function job_precast(spell, action, spellMap, eventArgs)
    if spell.type == 'BardSong' then
        --[[ Auto-Pianissimo
        if ((spell.target.type == 'PLAYER' and not spell.target.charmed) or (spell.target.type == 'NPC' and spell.target.in_party)) and
            not state.Buff['Pianissimo'] then

            local spell_recasts = windower.ffxi.get_spell_recasts()
            if spell_recasts[spell.recast_id] < 2 then
                send_command('@input /ja "Pianissimo" <me>; wait 1.5; input /ma "'..spell.name..'" '..spell.target.name)
                eventArgs.cancel = true
                return
            end
        end]]
        if spell.name == 'Honor March' then
            equip({range="Marsyas"})
        end
        if string.find(spell.name,'Lullaby') then
            if buffactive.Troubadour then
                equip({range="Marsyas"})
            elseif state.LullabyMode.value == 'Harp' and spell.english:contains('Horde') then
                equip({range="Daurdabla"})
            else
                --equip({range="Gjallarhorn"})
                equip({range="Blurred Harp +1"})
            end
        end
    end
    if spellMap == 'Utsusemi' then
        if buffactive['Copy Image (3)'] or buffactive['Copy Image (4+)'] then
            cancel_spell()
            add_to_chat(123, '**!! '..spell.english..' Canceled: [3+ IMAGES] !!**')
            eventArgs.handled = true
            return
        elseif buffactive['Copy Image'] or buffactive['Copy Image (2)'] then
            send_command('cancel 66; cancel 444; cancel Copy Image; cancel Copy Image (2)')
        end
    end
end

function job_post_precast(spell, action, spellMap, eventArgs)
    if spell.type == 'WeaponSkill' then
        if elemental_ws:contains(spell.name) then
            -- Matching double weather (w/o day conflict).
            if spell.element == world.weather_element and (get_weather_intensity() == 2 and spell.element ~= elements.weak_to[world.day_element]) then
                equip({waist="Hachirin-no-Obi"})
            -- Target distance under 1.7 yalms.
            elseif spell.target.distance < (1.7 + spell.target.model_size) then
                equip({waist="Orpheus's Sash"})
            -- Matching day and weather.
            elseif spell.element == world.day_element and spell.element == world.weather_element then
                equip({waist="Hachirin-no-Obi"})
            -- Target distance under 8 yalms.
            elseif spell.target.distance < (8 + spell.target.model_size) then
                equip({waist="Orpheus's Sash"})
            -- Match day or weather.
            elseif spell.element == world.day_element or spell.element == world.weather_element then
                equip({waist="Hachirin-no-Obi"})
            end
        end
    end
end

-- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
function job_midcast(spell, action, spellMap, eventArgs)
    if spell.type == 'BardSong' then
        -- layer general gear on first, then let default handler add song-specific gear.
        local generalClass = get_song_class(spell)
        if generalClass and sets.midcast[generalClass] then
            equip(sets.midcast[generalClass])
        end
		state.SongMode:reset() -- reset after each dummy song
        if spell.name == 'Honor March' then
            equip({range="Marsyas"})
        end
        if string.find(spell.name,'Lullaby') then
            if buffactive.Troubadour then
                equip({range="Marsyas"})
            elseif state.LullabyMode.value == 'Harp' and spell.english:contains('Horde') then
                equip({range="Daurdabla"})
                equip(sets.midcast.SongStringSkill)
            else
                --equip({range="Gjallarhorn"})
                equip({range="Blurred Harp +1"})
            end
        end
    end
end

function job_post_midcast(spell, action, spellMap, eventArgs)
    if spell.type == 'BardSong' then
        if player.status ~= 'Engaged' and state.WeaponLock.value == false and (player.sub_job == 'DNC' or player.sub_job == 'NIN') then
            equip(sets.SongDWDuration)
        end
    end
end

function job_aftercast(spell, action, spellMap, eventArgs)
    if spell.english:contains('Lullaby') and not spell.interrupted then
        get_lullaby_duration(spell)
    end
    if player.status ~= 'Engaged' and state.WeaponLock.value == false then
        check_weaponset()
    end
    if player.status == 'Engaged' and state.WeaponLock.value == false then
        check_weaponset()
    end
end

function job_buff_change(buff,gain)

--    if buffactive['Reive Mark'] then
--        if gain then
--            equip(sets.Reive)
--            disable('neck')
--        else
--            enable('neck')
--        end
--    end

    if buff == "doom" then
                if gain then           
                        equip(sets.buff.Doom)
                        send_command('@input /p Doomed, please Cursna.')
                        send_command('@input /item "Holy Water" <me>')					
                        disable('ring1','ring2','waist')
                elseif not gain and not player.status == "Dead" and not player.status == "Engaged Dead" then
                        enable('ring1','ring2','waist')
                        send_command('input /p Doom removed, Thank you.')
                        handle_equipping_gear(player.status)
                else
                        enable('ring1','ring2','waist')
                        send_command('input /p '..player.name..' is no longer Doom Thank you !')
                end
    end

end

-- Handle notifications of general user state change.
function job_state_change(stateField, newValue, oldValue)
    if state.WeaponLock.value == true then
        disable('main','sub')
    else
        enable('main','sub')
    end

    check_weaponset()
end

-------------------------------------------------------------------------------------------------------------------
-- User code that supplements standard library decisions.
-------------------------------------------------------------------------------------------------------------------

-- Called by the 'update' self-command, for common needs.
-- Set eventArgs.handled to true if we don't want automatic equipping of gear.
function job_handle_equipping_gear(playerStatus, eventArgs)
    check_gear()
    update_combat_form()
    determine_haste_group()
    check_moving()
end

function job_update(cmdParams, eventArgs)
    handle_equipping_gear(player.status)
end

function update_combat_form()
    if player.sub_job == 'NIN' then
		state.CombatForm:set('DW')
	else
        state.CombatForm:reset()
	end
end

-- Called for direct player commands.
function job_self_command(cmdParams, eventArgs)
    if cmdParams[1]:lower() == 'etude' then
        send_command('@input /ma '..state.Etude.value..' <stpc>')
    elseif cmdParams[1]:lower() == 'carol' then
        send_command('@input /ma '..state.Carol.value..' <stpc>')
    elseif cmdParams[1]:lower() == 'threnody' then
        send_command('@input /ma '..state.Threnody.value..' <stnpc>')
    end

    gearinfo(cmdParams, eventArgs)
end

-- Modify the default melee set after it was constructed.
--function customize_melee_set(meleeSet)
    --if buffactive['Aftermath: Lv.3'] and player.equipment.main == "Carnwenhan" then
        --meleeSet = set_combine(meleeSet, sets.engaged.Aftermath)
    --end

    --check_weaponset()

    --return meleeSet
--end

function get_custom_wsmode(spell, action, spellMap)
    local wsmode
    if state.OffenseMode.value == 'MidAcc' or state.OffenseMode.value == 'HighAcc' then
        wsmode = 'Acc'
    end

    return wsmode
end

-- Modify the default idle set after it was constructed.
function customize_idle_set(idleSet)
    -- if state.CP.current == 'on' then
    --     equip(sets.CP)
    --     disable('back')
    -- else
    --     enable('back')
    -- end
	--if player.sub_job == 'WHM' then
		--idleSet = set_combine(idleSet, sets.idle.refresh)
	--end
    --if player.mpp < 51 then
        --idleSet = set_combine(idleSet, sets.idle.refresh)
    --end
    if state.Auto_Kite.value == true then

       idleSet = set_combine(idleSet, sets.Kiting)
    end

    return idleSet
end

-- Set eventArgs.handled to true if we don't want the automatic display to be run.
function display_current_job_state(eventArgs)
    local cf_msg = ''
    if state.CombatForm.has_value then
        cf_msg = ' (' ..state.CombatForm.value.. ')'
    end

    local m_msg = state.OffenseMode.value
    if state.HybridMode.value ~= 'Normal' then
        m_msg = m_msg .. '/' ..state.HybridMode.value
    end

    local ws_msg = state.WeaponskillMode.value

    local c_msg = state.CastingMode.value

    local d_msg = 'None'
    if state.DefenseMode.value ~= 'None' then
        d_msg = state.DefenseMode.value .. state[state.DefenseMode.value .. 'DefenseMode'].value
    end

    local i_msg = state.IdleMode.value

    local msg = ''
    if state.Kiting.value then
        msg = msg .. ' Kiting: On |'
    end

    add_to_chat(002, '| ' ..string.char(31,210).. 'Melee' ..cf_msg.. ': ' ..string.char(31,001)..m_msg.. string.char(31,002)..  ' |'
        ..string.char(31,207).. ' WS: ' ..string.char(31,001)..ws_msg.. string.char(31,002)..  ' |'
        ..string.char(31,060).. ' Magic: ' ..string.char(31,001)..c_msg.. string.char(31,002)..  ' |'
        ..string.char(31,004).. ' Defense: ' ..string.char(31,001)..d_msg.. string.char(31,002)..  ' |'
        ..string.char(31,008).. ' Idle: ' ..string.char(31,001)..i_msg.. string.char(31,002)..  ' |'
        ..string.char(31,002)..msg)

    eventArgs.handled = true
end

-------------------------------------------------------------------------------------------------------------------
-- Utility functions specific to this job.
-------------------------------------------------------------------------------------------------------------------

-- Determine the custom class to use for the given song.
function get_song_class(spell)
    -- Can't use spell.targets:contains() because this is being pulled from resources
    if set.contains(spell.targets, 'Enemy') then
        if state.CastingMode.value == 'Resistant' then
            return 'SongEnfeebleAcc'
        else
            return 'SongEnfeeble'
        end
    elseif state.SongMode.value == 'Placeholder' then
        return 'SongPlaceholder'
    else
        return 'SongEnhancing'
    end
end

function get_lullaby_duration(spell)
    local self = windower.ffxi.get_player()

    local troubadour = false
    local clarioncall = false
    local soulvoice = false
    local marcato = false

    for i,v in pairs(self.buffs) do
        if v == 348 then troubadour = true end
        if v == 499 then clarioncall = true end
        if v == 52 then soulvoice = true end
        if v == 231 then marcato = true end
    end

    local mult = 1

    if player.equipment.range == 'Daurdabla' then mult = mult + 0.3 end -- change to 0.25 with 90 Daur
    if player.equipment.range == "Gjallarhorn" then mult = mult + 0.4 end -- change to 0.3 with 95 Gjall
    if player.equipment.range == "Marsyas" then mult = mult + 0.5 end

    if player.equipment.main == "Carnwenhan" then mult = mult + 0.5 end -- 0.1 for 75, 0.4 for 95, 0.5 for 99/119
    if player.equipment.main == "Legato Dagger" then mult = mult + 0.05 end
    if player.equipment.main == "Kali" then mult = mult + 0.05 end
    if player.equipment.sub == "Kali" then mult = mult + 0.05 end
    if player.equipment.sub == "Legato Dagger" then mult = mult + 0.05 end
    if player.equipment.neck == "Aoidos' Matinee" then mult = mult + 0.1 end
    if player.equipment.neck == "Mnbw. Whistle" then mult = mult + 0.2 end
    if player.equipment.neck == "Mnbw. Whistle +1" then mult = mult + 0.3 end
    if player.equipment.body == "Fili Hongreline +2" then mult = mult + 0.12 end
    if player.equipment.legs == "Inyanga Shalwar +1" then mult = mult + 0.15 end
    if player.equipment.legs == "Inyanga Shalwar +2" then mult = mult + 0.17 end
    if player.equipment.feet == "Brioso Slippers" then mult = mult + 0.1 end
    if player.equipment.feet == "Brioso Slippers +1" then mult = mult + 0.11 end
    if player.equipment.feet == "Brioso Slippers +2" then mult = mult + 0.13 end
    if player.equipment.feet == "Brioso Slippers +3" then mult = mult + 0.15 end
    if player.equipment.hands == 'Brioso Cuffs +1' then mult = mult + 0.1 end
    if player.equipment.hands == 'Brioso Cuffs +2' then mult = mult + 0.1 end
    if player.equipment.hands == 'Brioso Cuffs +3' then mult = mult + 0.2 end

    --JP Duration Gift
    if self.job_points.brd.jp_spent >= 1200 then
        mult = mult + 0.05
    end

    if troubadour then
        mult = mult * 2
    end

    if spell.en == "Foe Lullaby II" or spell.en == "Horde Lullaby II" then
        base = 60
    elseif spell.en == "Foe Lullaby" or spell.en == "Horde Lullaby" then
        base = 30
    end

    totalDuration = math.floor(mult * base)

    -- Job Points Buff
    totalDuration = totalDuration + self.job_points.brd.lullaby_duration
    if troubadour then
        totalDuration = totalDuration + self.job_points.brd.lullaby_duration
        -- adding it a second time if Troubadour up
    end

    if clarioncall then
        if troubadour then
            totalDuration = totalDuration + (self.job_points.brd.clarion_call_effect * 2 * 2)
            -- Clarion Call gives 2 seconds per Job Point upgrade.  * 2 again for Troubadour
        else
            totalDuration = totalDuration + (self.job_points.brd.clarion_call_effect * 2)
            -- Clarion Call gives 2 seconds per Job Point upgrade.
        end
    end

    if marcato and not soulvoice then
        totalDuration = totalDuration + self.job_points.brd.marcato_effect
    end

    -- Create the custom timer
    if spell.english == "Foe Lullaby II" or spell.english == "Horde Lullaby II" then
        send_command('@timers c "Lullaby II ['..spell.target.name..']" ' ..totalDuration.. ' down spells/00377.png')
    elseif spell.english == "Foe Lullaby" or spell.english == "Horde Lullaby" then
        send_command('@timers c "Lullaby ['..spell.target.name..']" ' ..totalDuration.. ' down spells/00376.png')
    end
end

function determine_haste_group()
    classes.CustomMeleeGroups:clear()
    if DW == true then
        if DW_needed <= 12 then
            classes.CustomMeleeGroups:append('MaxHaste')
        elseif DW_needed > 12 and DW_needed <= 21 then
            classes.CustomMeleeGroups:append('MaxHastePlus')
        elseif DW_needed > 21 and DW_needed <= 27 then
            classes.CustomMeleeGroups:append('HighHaste')
        elseif DW_needed > 27 and DW_needed <= 31 then
            classes.CustomMeleeGroups:append('MidHaste')
        elseif DW_needed > 31 and DW_needed <= 42 then
            classes.CustomMeleeGroups:append('LowHaste')
        elseif DW_needed > 42 then
            classes.CustomMeleeGroups:append('')
        end
    end
end

function gearinfo(cmdParams, eventArgs)
    if cmdParams[1] == 'gearinfo' then
        if type(tonumber(cmdParams[2])) == 'number' then
            if tonumber(cmdParams[2]) ~= DW_needed then
            DW_needed = tonumber(cmdParams[2])
            DW = true
            end
        elseif type(cmdParams[2]) == 'string' then
            if cmdParams[2] == 'false' then
                DW_needed = 0
                DW = false
            end
        end
        if type(tonumber(cmdParams[3])) == 'number' then
            if tonumber(cmdParams[3]) ~= Haste then
                Haste = tonumber(cmdParams[3])
            end
        end
        if type(cmdParams[4]) == 'string' then
            if cmdParams[4] == 'true' then
                moving = true
            elseif cmdParams[4] == 'false' then
                moving = false
            end
        end
        if not midaction() then
            job_update()
        end
    end
end

function check_moving()
    if state.DefenseMode.value == 'None'  and state.Kiting.value == false then
        if state.Auto_Kite.value == false and moving then
            state.Auto_Kite:set(true)
        elseif state.Auto_Kite.value == true and moving == false then
            state.Auto_Kite:set(false)
        end
    end
end

function check_gear()
    if no_swap_gear:contains(player.equipment.left_ring) then
        disable("ring1")
    else
        enable("ring1")
    end
    if no_swap_gear:contains(player.equipment.right_ring) then
        disable("ring2")
    else
        enable("ring2")
    end
end

function check_weaponset()
    equip(sets[state.WeaponSet.current])
    if player.sub_job ~= 'NIN' and player.sub_job ~= 'DNC' then
       equip(sets.DefaultShield)
    end
end

function customize_melee_set(meleeSet)
    check_weaponset()

    return meleeSet
end


windower.register_event('zone change',
    function()
        if no_swap_gear:contains(player.equipment.left_ring) then
            enable("ring1")
            equip(sets.idle)
        end
        if no_swap_gear:contains(player.equipment.right_ring) then
            enable("ring2")
            equip(sets.idle)
        end
    end
)

Offline
Posts: 255
By trinironnie 2023-02-19 10:35:20  
quelthos said: »
trinironnie said: »
Anyone got a BRD lua that allows you to have DD weapons? Switches to carn for songs then back the originial DD weapon ?

Mine has weapon toggles with windows key + R or E.
windows key + W for weapon lock.
by default it switches to carn to sing unless you weapon lock.
So if you have naegling or other weapons toggled, it will try to switch to carn then back.
Code
-- Initialization function for this job file.
function get_sets()
    mote_include_version = 2

    -- Load and initialize the include file.
    include('Mote-Include.lua')
    res = require 'resources'
end


-- Setup vars that are user-independent.  state.Buff vars initialized here will automatically be tracked.
function job_setup()
    state.SongMode = M{['description']='Song Mode', 'None', 'Placeholder'}

    state.Buff['Pianissimo'] = buffactive['pianissimo'] or false

    no_swap_gear = S{"Warp Ring", "Dim. Ring (Dem)", "Dim. Ring (Holla)", "Dim. Ring (Mea)",
              "Trizek Ring", "Echad Ring", "Facility Ring", "Capacity Ring"}
    elemental_ws = S{"Aeolian Edge"}


end

-------------------------------------------------------------------------------------------------------------------
-- User setup functions for this job.  Recommend that these be overridden in a sidecar file.
-------------------------------------------------------------------------------------------------------------------

-- Setup vars that are user-dependent.  Can override this function in a sidecar file.
function user_setup()
    state.OffenseMode:options('Normal')
    state.HybridMode:options('Normal')
    state.WeaponskillMode:options('Normal')
    state.CastingMode:options('Normal', 'Resistant')
    state.IdleMode:options('Normal', 'Refresh')

    state.LullabyMode = M{['description']='Lullaby Instrument', 'Harp', 'Horn'}

    state.Carol = M{['description']='Carol',
        'Fire Carol', 'Fire Carol II', 'Ice Carol', 'Ice Carol II', 'Wind Carol', 'Wind Carol II',
        'Earth Carol', 'Earth Carol II', 'Lightning Carol', 'Lightning Carol II', 'Water Carol', 'Water Carol II',
        'Light Carol', 'Light Carol II', 'Dark Carol', 'Dark Carol II',
        }

    state.Threnody = M{['description']='Threnody',
        'Fire Threnody II', 'Ice Threnody II', 'Wind Threnody II', 'Earth Threnody II',
        'Ltng. Threnody II', 'Water Threnody II', 'Light Threnody II', 'Dark Threnody II',
        }

    state.Etude = M{['description']='Etude', 'Sinewy Etude', 'Herculean Etude', 'Learned Etude', 'Sage Etude',
        'Quick Etude', 'Swift Etude', 'Vivacious Etude', 'Vital Etude', 'Dextrous Etude', 'Uncanny Etude',
        'Spirited Etude', 'Logical Etude', 'Enchanting Etude', 'Bewitching Etude'}

    state.WeaponSet = M{['description']='Weapon Set', 'Mordant', 'Naegling', 'Tauret', 'Rudra'}
    state.WeaponLock = M(false, 'Weapon Lock')
    -- state.CP = M(false, "Capacity Points Mode")

    -- Additional local binds
   -- include('Global-Binds.lua') -- OK to remove this line
   -- include('Global-GEO-Binds.lua') -- OK to remove this line

    -- Adjust this if using the Terpander (new +song instrument)
    info.ExtraSongInstrument = 'Daurdabla'
    -- How many extra songs we can keep from Daurdabla/Terpander
    info.ExtraSongs = 2

    --send_command('bind ^` input /ma "Chocobo Mazurka" <me>')
	send_command('bind @` gs c cycle LullabyMode')
	send_command('bind ^` gs c cycle SongMode')
    --send_command('bind !p input /ja "Pianissimo" <me>')

    --send_command('bind ^insert gs c cycleback Etude')
    --send_command('bind ^delete gs c cycle Etude')
    --send_command('bind ^home gs c cycleback Carol')
    --send_command('bind ^end gs c cycle Carol')
    --send_command('bind ^pageup gs c cycleback Threnody')
    --send_command('bind ^pagedown gs c cycle Threnody')

    send_command('bind @w gs c toggle WeaponLock')
    -- send_command('bind @c gs c toggle CP')
    send_command('bind @e gs c cycleback WeaponSet')
    send_command('bind @r gs c cycle WeaponSet')
    send_command('bind ` tc nearest')
    --send_command('bind ^numpad7 input /ws "Savage Blade" <t>')
    --send_command('bind ^numpad7 input /ws "Mordant Rime" <t>')
    --send_command('bind ^numpad4 input /ws "Evisceration" <t>')
    --send_command('bind ^numpad5 input /ws "Rudra\'s Storm" <t>')
    --send_command('bind ^numpad1 input /ws "Aeolian Edge" <t>')

    select_default_macro_book()

    state.Auto_Kite = M(false, 'Auto_Kite')
    Haste = 0
    DW_needed = 0
    DW = false
    moving = false
    update_combat_form()
    determine_haste_group()
end


-- Called when this job file is unloaded (eg: job change)
function user_unload()
    send_command('unbind ^`')
    send_command('unbind !`')
    send_command('unbind ^backspace')
    send_command('unbind !insert')
    send_command('unbind !delete')
    send_command('unbind ^insert')
    send_command('unbind ^delete')
    send_command('unbind ^home')
    send_command('unbind ^end')
    send_command('unbind ^pageup')
    send_command('unbind ^pagedown')
    send_command('unbind @`')
    send_command('unbind @w')
    send_command('unbind `')
    -- send_command('unbind @c')
    send_command('unbind @e')
    send_command('unbind @r')
    send_command('unbind ^numpad7')
    send_command('unbind ^numpad4')
    send_command('unbind ^numpad5')
    send_command('unbind ^numpad1')
end


-- Define sets and vars used by this job file.
function init_gear_sets()

    ------------------------------------------------------------------------------------------------
    ---------------------------------------- Precast Sets ------------------------------------------
    ------------------------------------------------------------------------------------------------

    -- Fast cast sets for spells
    sets.precast.FC = {
	--main="Kali",
    head="Nahtirah Hat",
    body="Inyanga Jubbah +2",
    hands="Leyline Gloves",
    legs="Aya. Cosciales +2",
    feet="Fili Cothurnes +2",
    neck="Baetyl Pendant",
    waist="Embla Sash",
    left_ear="Loquac. Earring",
    right_ear="Etiolation Earring",
    left_ring="Kishar Ring",
    right_ring="Weather. Ring",
    back={ name="Fi Follet Cape +1", augments={'Path: A',}},
        }

    sets.precast.FC['Enhancing Magic'] = set_combine(sets.precast.FC, {waist="Siegel Sash"})

    sets.precast.FC.Cure = set_combine(sets.precast.FC, {
        feet="Kaykaus Boots +1", --0/7
        ear2="Mendi. Earring", --0/5
        })

    sets.precast.FC.BardSong = set_combine(sets.precast.FC, {
		--main="Kali",
		range="Gjallarhorn",
        head="Fili Calot +2", --14
        --body="Brioso Justau. +3", --15
        --feet="Bihu Slippers +3", --9
        })
		
	sets.precast.FC["Honor March"] = set_combine(sets.precast.FC.BardSong,{range="Marsyas"})

    sets.precast.FC.SongPlaceholder = set_combine(sets.precast.FC.BardSong, {range=info.ExtraSongInstrument})

    sets.precast.FC.Dispelga = set_combine(sets.precast.FC, {main="Daybreak", sub="Ammurapi Shield", waist="Shinjutsu-no-Obi +1"})

    -- Precast sets to enhance JAs

    sets.precast.JA.Nightingale = {feet="Bihu Slippers +3"}
    sets.precast.JA.Troubadour = {body="Bihu Jstcorps. +3"}
    sets.precast.JA['Soul Voice'] = {legs="Bihu Cannions +3"}

    -- Waltz set (chr and vit)
    sets.precast.Waltz = {}


    ------------------------------------------------------------------------------------------------
    ------------------------------------- Weapon Skill Sets ----------------------------------------
    ------------------------------------------------------------------------------------------------

    -- Default set for any weaponskill that isn't any more specifically defined
    sets.precast.WS = {
    range={ name="Linos", augments={'Attack+16','Weapon skill damage +3%','Quadruple Attack +2',}},
    head="Nyame Helm",
    body="Bihu Jstcorps. +3",
    hands="Nyame Gauntlets",
	legs="Nyame Flanchard",		
    feet="Nyame Sollerets",
    neck="Rep. Plat. Medal",
    waist={ name="Sailfi Belt +1", augments={'Path: A',}},
    ear1={ name="Moonshade Earring", augments={'Attack+4','TP Bonus +250',}},
	ear2="Ishvara Earring",
    left_ring="Epaminondas's Ring",
    right_ring="Sroda Ring",
    back={ name="Intarabus's Cape", augments={'STR+20','Accuracy+20 Attack+20','STR+10','Weapon skill damage +10%',}},
        }

    -- Specific weaponskill sets.  Uses the base set if an appropriate WSMod version isn't found.
    sets.precast.WS['Evisceration'] = set_combine(sets.precast.WS, {
		head={ name="Blistering Sallet +1", augments={'Path: A',}},
		body="Ayanmo Corazza +2",
		neck="Fotia Gorget",
		right_ear="Mache Earring +1",
		left_ring="Begrudging Ring",
		right_ring="Hetairoi Ring",
		waist="Fotia Belt",
		back={ name="Intarabus's Cape", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','Weapon skill damage +10%',}},
        })

    sets.precast.WS['Mordant Rime'] = set_combine(sets.precast.WS, {
		head="Bihu Roundlet +3",
		body="Bihu Jstcorps. +3",
		hands="Bihu Cuffs +3",
		legs="Bihu Cannions +3",
		feet="Bihu Slippers +3",
        ear1="Regal Earring",
		right_ring={ name="Metamor. Ring +1", augments={'Path: A',}},
		waist="Kentarch Belt +1",
		back={ name="Intarabus's Cape", augments={'CHR+20','Accuracy+20 Attack+20','CHR+10','Weapon skill damage +10%',}},
        })

    sets.precast.WS['Rudra\'s Storm'] = set_combine(sets.precast.WS, {
		waist="Kentarch Belt +1",
		right_ring="Ilabrat Ring",
		back={ name="Intarabus's Cape", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','Weapon skill damage +10%',}},
        })

    sets.precast.WS['Aeolian Edge'] = set_combine(sets.precast.WS, {
		waist="Orpheus's Sash",
		neck="Sibyl Scarf",
        waist="Orpheus's Sash",
		ear2="Friomisi Earring",
		right_ring={ name="Metamor. Ring +1", augments={'Path: A',}},
		back="Izdubar Mantle",
        })

    sets.precast.WS['Savage Blade'] = set_combine(sets.precast.WS, {
        })

    sets.precast.WS['Exenterator'] = set_combine(sets.precast.WS, {
        })
    ------------------------------------------------------------------------------------------------
    ---------------------------------------- Midcast Sets ------------------------------------------
    ------------------------------------------------------------------------------------------------

    -- General set for recast times.
    sets.midcast.FastRecast = sets.precast.FC

    sets.midcast.SpellInterrupt = {
        ammo="Staunch Tathlum +1", --11
        --body="Ros. Jaseran +1", --25
        hands=gear.Chironic_WSD_hands, --20
        --legs="Querkening Brais" --15
        neck="Loricate Torque +1", --5
        ear1="Halasz Earring", --5
        ear2="Magnetic Earring", --8
        ring2="Evanescence Ring", --5
        waist="Rumination Sash", --10
        }

    sets.midcast.Utsusemi = sets.midcast.SpellInterrupt

    -- Gear to enhance certain classes of songs.
    sets.midcast.Ballad = {legs="Fili Rhingrave +2"}
    sets.midcast.Carol = {hands="Mousai Gages +1"}
    sets.midcast.Etude = {head="Mousai Turban +1"}
    sets.midcast.HonorMarch = {range="Marsyas", hands="Fili Manchettes +2"}
    sets.midcast.Lullaby = {body="Fili Hongreline +2"}
    sets.midcast.Madrigal = {head="Fili Calot +2"}
    sets.midcast.Mambo = {feet="Mou. Crackows +1"}
    sets.midcast.March = {hands="Fili Manchettes +2"}
    sets.midcast.Minne = {legs="Mou. Seraweels +1"}
    sets.midcast.Minuet = {body="Fili Hongreline +2"}
    sets.midcast.Paeon = {head="Brioso Roundlet +3",range=info.ExtraSongInstrument} --for singer addon dummy
    sets.midcast.Threnody = {body="Mou. Manteel +1"}
    sets.midcast['Adventurer\'s Dirge'] = {range="Marsyas", hands="Bihu Cuffs +3"}
    sets.midcast['Foe Sirvente'] = {head="Bihu Roundlet +3"}
    sets.midcast['Magic Finale'] = {legs="Fili Rhingrave +2"}
    sets.midcast["Sentinel's Scherzo"] = {feet="Fili Cothurnes +2"}
    sets.midcast["Chocobo Mazurka"] = {range="Marsyas"}

    -- For song buffs (duration and AF3 set bonus)
    sets.midcast.SongEnhancing = {
        main="Carnwenhan",
        range="Gjallarhorn",
        head="Fili Calot +2",
        body="Fili Hongreline +2",
        hands="Fili Manchettes +2",
        legs="Inyanga Shalwar +2",
        feet="Brioso Slippers +3",
        neck="Mnbw. Whistle +1",
		waist="Flume Belt",
		left_ear={ name="Odnowa Earring +1", augments={'Path: A',}},
		right_ear="Genmei Earring",
		left_ring="Defending Ring",
		right_ring={ name="Gelatinous Ring +1", augments={'Path: A',}},
		back={ name="Intarabus's Cape", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Store TP"+10','Phys. dmg. taken-10%',}},
        }

    -- For song defbuffs (duration primary, accuracy secondary)
    sets.midcast.SongEnfeeble = {
    main="Carnwenhan",
    sub="Ammurapi Shield",
    range="Gjallarhorn",
	head="Brioso Roundlet +3",
	body="Brioso Justau. +3",	
    hands="Brioso Cuffs +3",
    legs="Inyanga Shalwar +2",
    feet="Brioso Slippers +3",
        neck="Mnbw. Whistle +1",
        ear1="Digni. Earring",
        ear2="Regal Earring",
        ring1={name="Stikini Ring +1", bag="wardrobe2"},
        ring2={name="Stikini Ring +1", bag="wardrobe3"},
        waist="Acuity Belt +1",
        back="Aurist's Cape +1",
        }

    -- For song defbuffs (accuracy primary, duration secondary)
    sets.midcast.SongEnfeebleAcc = set_combine(sets.midcast.SongEnfeeble, {legs="Brioso Cannions +3"})

    -- For Horde Lullaby maxiumum AOE range.
    sets.midcast.SongStringSkill =  set_combine(sets.midcast.Lullaby, {
		body="Brioso Justau. +3",	
		hands="Inyan. Dastanas +2",
        ear1="Gersemi Earring",
        ear2="Darkside Earring",
        })

    -- Placeholder song; minimize duration to make it easy to overwrite.
    sets.midcast.SongPlaceholder = set_combine(sets.precast.FC, {range=info.ExtraSongInstrument})

    -- Other general spells and classes.
    sets.midcast.Cure = {
        main="Daybreak", --30
        sub="Ammurapi Shield",
    head="Kaykaus Mitra +1",
    body="Kaykaus Bliaut +1",
    hands="Kaykaus Cuffs +1",
    legs="Kaykaus Tights +1",
    feet="Kaykaus Boots +1",
    neck="Incanter's Torque",
    waist="Luminary Sash",
    left_ear="Mendi. Earring",
    right_ear="Meili Earring",
    ring1={name="Stikini Ring +1", bag="wardrobe2"},
    right_ring="Sirona's Ring",
	back="Solemnity Cape",
        }

    sets.midcast.Curaga = set_combine(sets.midcast.Cure, {
        })

    sets.midcast.StatusRemoval = {
        head="Vanya Hood",
        body="Vanya Robe",
        legs="Aya. Cosciales +2",
        feet="Vanya Clogs",
        neck="Incanter's Torque",
        ear2="Meili Earring",
        ring1="Menelaus's Ring",
        ring2="Haoma's Ring",
        back=gear.BRD_Song_Cape,
        waist="Bishop's Sash",
        }

    sets.midcast.Cursna = set_combine(sets.midcast.StatusRemoval, {
        hands="Hieros Mittens",
        neck="Debilis Medallion",
        ear1="Beatific Earring",
        back="Oretan. Cape +1",
        })

    sets.midcast['Enhancing Magic'] = {
        main="Carnwenhan",
        sub="Ammurapi Shield",
		head={ name="Telchine Cap", augments={'Enh. Mag. eff. dur. +10',}},
		body={ name="Telchine Chas.", augments={'Enh. Mag. eff. dur. +9',}},
		hands={ name="Telchine Gloves", augments={'Enh. Mag. eff. dur. +9',}},
		legs={ name="Telchine Braconi", augments={'Enh. Mag. eff. dur. +10',}},
		feet={ name="Telchine Pigaches", augments={'Enh. Mag. eff. dur. +9',}},
        neck="Incanter's Torque",
        ear1="Mimir Earring",
        ear2="Andoaa Earring",
        ring1={name="Stikini Ring +1", bag="wardrobe2"},
        ring2={name="Stikini Ring +1", bag="wardrobe3"},
        back="Fi Follet Cape +1",
        waist="Embla Sash",
        }

    sets.midcast.Regen = set_combine(sets.midcast['Enhancing Magic'], {head="Inyanga Tiara +2"})
    sets.midcast.Haste = sets.midcast['Enhancing Magic']
    sets.midcast.Refresh = set_combine(sets.midcast['Enhancing Magic'], {waist="Gishdubar Sash", back="Grapevine Cape"})
    sets.midcast.Stoneskin = set_combine(sets.midcast['Enhancing Magic'], {neck="Nodens Gorget", waist="Siegel Sash"})
    sets.midcast.Aquaveil = set_combine(sets.midcast['Enhancing Magic'], {waist="Emphatikos Rope"})
    sets.midcast.Protect = set_combine(sets.midcast['Enhancing Magic'], {ring2="Sheltered Ring"})
    sets.midcast.Protectra = sets.midcast.Protect
    sets.midcast.Shell = sets.midcast.Protect
    sets.midcast.Shellra = sets.midcast.Shell

    sets.midcast['Enfeebling Magic'] = {
        main="Carnwenhan",
        sub="Ammurapi Shield",
		head="C. Palug Crown",
		body="Inyanga Jubbah +2",
		hands="Inyan. Dastanas +2",
		legs="Inyanga Shalwar +2",
		feet="Brioso Slippers +3",		
        neck="Mnbw. Whistle +1",
        ear1="Digni. Earring",
        ear2="Vor Earring",
        ring1="Kishar Ring",
        ring2="Metamor. Ring +1",
        waist="Acuity Belt +1",
        back="Aurist's Cape +1",
        }

    sets.midcast.Dispelga = set_combine(sets.midcast['Enfeebling Magic'], {main="Daybreak", sub="Ammurapi Shield", waist="Shinjutsu-no-Obi +1"})

    ------------------------------------------------------------------------------------------------
    ----------------------------------------- Idle Sets --------------------------------------------
    ------------------------------------------------------------------------------------------------

    sets.idle = {
	range="Gjallarhorn",
    head="Nyame Helm",
    body="Nyame Mail",
    hands="Nyame Gauntlets",
    legs="Nyame Flanchard",
    feet="Nyame Sollerets",
    neck="Elite Royal Collar",
    waist="Flume Belt",
    left_ear="Tuisto Earring",
    right_ear={ name="Odnowa Earring +1", augments={'Path: A',}},
    left_ring="Defending Ring",
    right_ring={ name="Gelatinous Ring +1", augments={'Path: A',}},
    back={ name="Intarabus's Cape", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Store TP"+10','Phys. dmg. taken-10%',}},
        }
    sets.idle.Refresh = set_combine(sets.idle, {
    head="Inyanga Tiara +2",
    body="Inyanga Jubbah +2",
    hands="Inyanga Dastanas +2",
    legs="Inyanga Shalwar +2",
    feet="Inyanga Crackows +2",
    left_ear="Genmei Earring",
    right_ear="Etiolation Earring",
    ring1={name="Stikini Ring +1", bag="wardrobe2"},
    ring2={name="Stikini Ring +1", bag="wardrobe3"},
        })
    sets.idle.Town = set_combine(sets.idle, {
        })
    ------------------------------------------------------------------------------------------------
    ---------------------------------------- Defense Sets ------------------------------------------
    ------------------------------------------------------------------------------------------------
	sets.enmity = set_combine(sets.idle, {
	main="Mafic Cudgel",
	sub="Genmei Shield",
	ammo="Sapience Orb",
    head="Halitus Helm",
    neck="Unmoving Collar +1",
    ear1="Trux Earring",
    ear2="Cryptic Earring",
    body="Emet Harness +1",
    ring1="Supershear Ring",
    ring2="Pernicious Ring",
    back="Reiki Cloak",
    waist="Trance Belt",
    legs="Zoar Subligar +1",
	})
    sets.midcast['Foe Requiem'] = sets.enmity
    sets.midcast['Foe Requiem II'] = sets.enmity
    sets.midcast['Foe Requiem III'] = sets.enmity

    sets.defense.PDT = sets.idle.DT
    sets.defense.MDT = sets.idle.DT

    sets.Kiting = {feet="Fili Cothurnes +2"}
    sets.latent_refresh = {waist="Fucho-no-obi"}

    ------------------------------------------------------------------------------------------------
    ---------------------------------------- Engaged Sets ------------------------------------------
    ------------------------------------------------------------------------------------------------

    -- Engaged sets

    -- Variations for TP weapon and (optional) offense/defense modes.  Code will fall back on previous
    -- sets if more refined versions aren't defined.
    -- If you create a set with both offense and defense modes, the offense mode should be first.
    -- EG: sets.engaged.Dagger.Accuracy.Evasion

    sets.engaged = {
    range={ name="Linos", augments={'Accuracy+15','"Store TP"+3','DEX+7',}},
	--ammo="Coiste Bodhar",
    head="Aya. Zucchetto +2", --6
    body="Ayanmo Corazza +2", --4
    hands="Gazu Bracelets +1", --15
    legs="Nyame Flanchard", --5
    feet="Nyame Sollerets", --3
    neck="Bard's Charm +2",
    waist={ name="Kentarch Belt +1", augments={'Path: A',}},
    left_ear="Cessance Earring",
    right_ear="Telos Earring",
        ring1={name="Chirich Ring +1", bag="wardrobe2"},
        ring2={name="Chirich Ring +1", bag="wardrobe3"},
    back={ name="Intarabus's Cape", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Store TP"+10','Phys. dmg. taken-10%',}},
        }

    sets.engaged.Acc = set_combine(sets.engaged, {
        })

    -- * DNC Subjob DW Trait: +15%
    -- * NIN Subjob DW Trait: +25%

    -- No Magic Haste (74% DW to cap)
    sets.engaged.DW = set_combine(sets.engaged, {
        ear1="Eabani Earring", --4
        waist="Reiki Yotai", --7
		})

    sets.engaged.DW.Acc = set_combine(sets.engaged.DW, {
        })

    -- 15% Magic Haste (67% DW to cap)
    sets.engaged.DW.LowHaste = set_combine(sets.engaged.DW, {
        })
    sets.engaged.DW.Acc.LowHaste = set_combine(sets.engaged.DW, {
        })

    -- 30% Magic Haste (56% DW to cap)
    sets.engaged.DW.MidHaste = set_combine(sets.engaged.DW, {
        })
    sets.engaged.DW.Acc.MidHaste = set_combine(sets.engaged.DW, {
        })

    -- 35% Magic Haste (51% DW to cap)
    sets.engaged.DW.HighHaste = set_combine(sets.engaged.DW, {
        })
    sets.engaged.DW.Acc.HighHaste = set_combine(sets.engaged.DW, {
        })

    -- 45% Magic Haste (36% DW to cap)
    sets.engaged.DW.MaxHaste = set_combine(sets.engaged.DW, {
        })

    sets.engaged.DW.MaxHaste.Acc = set_combine(sets.engaged.DW, {
        })

    sets.engaged.DW.MaxHastePlus = set_combine(sets.engaged.DW, {
        })
    sets.engaged.DW.Acc.MaxHastePlus = set_combine(sets.engaged.DW, {
        })

    --sets.engaged.Aftermath = set_combine(sets.engaged, {})

    ------------------------------------------------------------------------------------------------
    ---------------------------------------- Hybrid Sets -------------------------------------------
    ------------------------------------------------------------------------------------------------

    sets.engaged.Hybrid = {
        }

    sets.engaged.DT = set_combine(sets.engaged, sets.engaged.Hybrid)
    sets.engaged.Acc.DT = set_combine(sets.engaged.Acc, sets.engaged.Hybrid)

    sets.engaged.DW.DT = set_combine(sets.engaged.DW, sets.engaged.Hybrid)
    sets.engaged.DW.Acc.DT = set_combine(sets.engaged.DW.Acc, sets.engaged.Hybrid)

    sets.engaged.DW.DT.LowHaste = set_combine(sets.engaged.DW.LowHaste, sets.engaged.Hybrid)
    sets.engaged.DW.Acc.DT.LowHaste = set_combine(sets.engaged.DW.Acc.LowHaste, sets.engaged.Hybrid)

    sets.engaged.DW.DT.MidHaste = set_combine(sets.engaged.DW.MidHaste, sets.engaged.Hybrid)
    sets.engaged.DW.Acc.DT.MidHaste = set_combine(sets.engaged.DW.Acc.MidHaste, sets.engaged.Hybrid)

    sets.engaged.DW.DT.HighHaste = set_combine(sets.engaged.DW.HighHaste, sets.engaged.Hybrid)
    sets.engaged.DW.Acc.DT.HighHaste = set_combine(sets.engaged.DW.Acc.HighHaste, sets.engaged.Hybrid)

    sets.engaged.DW.DT.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, sets.engaged.Hybrid)
    sets.engaged.DW.Acc.DT.MaxHaste = set_combine(sets.engaged.DW.Acc.MaxHaste, sets.engaged.Hybrid)

    sets.engaged.DW.DT.MaxHastePlus = set_combine(sets.engaged.DW.MaxHastePlus, sets.engaged.Hybrid)
    sets.engaged.DW.Acc.DT.MaxHastePlus = set_combine(sets.engaged.DW.Acc.MaxHastePlus, sets.engaged.Hybrid)


    ------------------------------------------------------------------------------------------------
    ---------------------------------------- Special Sets ------------------------------------------
    ------------------------------------------------------------------------------------------------

    --sets.SongDWDuration = {main="Carnwenhan", sub="Kali"}

    sets.buff.Doom = {
        --neck="Nicander's Necklace", --20
        ring1={name="Eshmun's Ring", bag="wardrobe3"}, --20
        ring2={name="Eshmun's Ring", bag="wardrobe4"}, --20
        waist="Gishdubar Sash", --10
        }

    sets.Obi = {waist="Hachirin-no-Obi"}
    -- sets.CP = {back="Mecisto. Mantle"}
    --sets.Reive = {neck="Ygnas's Resolve +1"}

    sets.Mordant = {main="Carnwenhan", sub="Ternion Dagger +1"}
    --sets.Twashtar = {main="Twashtar", sub="Taming Sari"}
    sets.Rudra = {main="Carnwenhan", sub="Fusetto +2"}
    sets.Naegling = {main="Naegling", sub="Fusetto +2"}
    sets.Tauret = {main="Tauret", sub="Fusetto +2"}
	--sets.Trial = {main="Fusetto +1", sub="Esikuva"}

    sets.DefaultShield = {sub="Genmei Shield"}

end


-------------------------------------------------------------------------------------------------------------------
-- Job-specific hooks for standard casting events.
-------------------------------------------------------------------------------------------------------------------

-- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
-- Set eventArgs.useMidcastGear to true if we want midcast gear equipped on precast.
function job_precast(spell, action, spellMap, eventArgs)
    if spell.type == 'BardSong' then
        --[[ Auto-Pianissimo
        if ((spell.target.type == 'PLAYER' and not spell.target.charmed) or (spell.target.type == 'NPC' and spell.target.in_party)) and
            not state.Buff['Pianissimo'] then

            local spell_recasts = windower.ffxi.get_spell_recasts()
            if spell_recasts[spell.recast_id] < 2 then
                send_command('@input /ja "Pianissimo" <me>; wait 1.5; input /ma "'..spell.name..'" '..spell.target.name)
                eventArgs.cancel = true
                return
            end
        end]]
        if spell.name == 'Honor March' then
            equip({range="Marsyas"})
        end
        if string.find(spell.name,'Lullaby') then
            if buffactive.Troubadour then
                equip({range="Marsyas"})
            elseif state.LullabyMode.value == 'Harp' and spell.english:contains('Horde') then
                equip({range="Daurdabla"})
            else
                --equip({range="Gjallarhorn"})
                equip({range="Blurred Harp +1"})
            end
        end
    end
    if spellMap == 'Utsusemi' then
        if buffactive['Copy Image (3)'] or buffactive['Copy Image (4+)'] then
            cancel_spell()
            add_to_chat(123, '**!! '..spell.english..' Canceled: [3+ IMAGES] !!**')
            eventArgs.handled = true
            return
        elseif buffactive['Copy Image'] or buffactive['Copy Image (2)'] then
            send_command('cancel 66; cancel 444; cancel Copy Image; cancel Copy Image (2)')
        end
    end
end

function job_post_precast(spell, action, spellMap, eventArgs)
    if spell.type == 'WeaponSkill' then
        if elemental_ws:contains(spell.name) then
            -- Matching double weather (w/o day conflict).
            if spell.element == world.weather_element and (get_weather_intensity() == 2 and spell.element ~= elements.weak_to[world.day_element]) then
                equip({waist="Hachirin-no-Obi"})
            -- Target distance under 1.7 yalms.
            elseif spell.target.distance < (1.7 + spell.target.model_size) then
                equip({waist="Orpheus's Sash"})
            -- Matching day and weather.
            elseif spell.element == world.day_element and spell.element == world.weather_element then
                equip({waist="Hachirin-no-Obi"})
            -- Target distance under 8 yalms.
            elseif spell.target.distance < (8 + spell.target.model_size) then
                equip({waist="Orpheus's Sash"})
            -- Match day or weather.
            elseif spell.element == world.day_element or spell.element == world.weather_element then
                equip({waist="Hachirin-no-Obi"})
            end
        end
    end
end

-- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
function job_midcast(spell, action, spellMap, eventArgs)
    if spell.type == 'BardSong' then
        -- layer general gear on first, then let default handler add song-specific gear.
        local generalClass = get_song_class(spell)
        if generalClass and sets.midcast[generalClass] then
            equip(sets.midcast[generalClass])
        end
		state.SongMode:reset() -- reset after each dummy song
        if spell.name == 'Honor March' then
            equip({range="Marsyas"})
        end
        if string.find(spell.name,'Lullaby') then
            if buffactive.Troubadour then
                equip({range="Marsyas"})
            elseif state.LullabyMode.value == 'Harp' and spell.english:contains('Horde') then
                equip({range="Daurdabla"})
                equip(sets.midcast.SongStringSkill)
            else
                --equip({range="Gjallarhorn"})
                equip({range="Blurred Harp +1"})
            end
        end
    end
end

function job_post_midcast(spell, action, spellMap, eventArgs)
    if spell.type == 'BardSong' then
        if player.status ~= 'Engaged' and state.WeaponLock.value == false and (player.sub_job == 'DNC' or player.sub_job == 'NIN') then
            equip(sets.SongDWDuration)
        end
    end
end

function job_aftercast(spell, action, spellMap, eventArgs)
    if spell.english:contains('Lullaby') and not spell.interrupted then
        get_lullaby_duration(spell)
    end
    if player.status ~= 'Engaged' and state.WeaponLock.value == false then
        check_weaponset()
    end
    if player.status == 'Engaged' and state.WeaponLock.value == false then
        check_weaponset()
    end
end

function job_buff_change(buff,gain)

--    if buffactive['Reive Mark'] then
--        if gain then
--            equip(sets.Reive)
--            disable('neck')
--        else
--            enable('neck')
--        end
--    end

    if buff == "doom" then
                if gain then           
                        equip(sets.buff.Doom)
                        send_command('@input /p Doomed, please Cursna.')
                        send_command('@input /item "Holy Water" <me>')					
                        disable('ring1','ring2','waist')
                elseif not gain and not player.status == "Dead" and not player.status == "Engaged Dead" then
                        enable('ring1','ring2','waist')
                        send_command('input /p Doom removed, Thank you.')
                        handle_equipping_gear(player.status)
                else
                        enable('ring1','ring2','waist')
                        send_command('input /p '..player.name..' is no longer Doom Thank you !')
                end
    end

end

-- Handle notifications of general user state change.
function job_state_change(stateField, newValue, oldValue)
    if state.WeaponLock.value == true then
        disable('main','sub')
    else
        enable('main','sub')
    end

    check_weaponset()
end

-------------------------------------------------------------------------------------------------------------------
-- User code that supplements standard library decisions.
-------------------------------------------------------------------------------------------------------------------

-- Called by the 'update' self-command, for common needs.
-- Set eventArgs.handled to true if we don't want automatic equipping of gear.
function job_handle_equipping_gear(playerStatus, eventArgs)
    check_gear()
    update_combat_form()
    determine_haste_group()
    check_moving()
end

function job_update(cmdParams, eventArgs)
    handle_equipping_gear(player.status)
end

function update_combat_form()
    if player.sub_job == 'NIN' then
		state.CombatForm:set('DW')
	else
        state.CombatForm:reset()
	end
end

-- Called for direct player commands.
function job_self_command(cmdParams, eventArgs)
    if cmdParams[1]:lower() == 'etude' then
        send_command('@input /ma '..state.Etude.value..' <stpc>')
    elseif cmdParams[1]:lower() == 'carol' then
        send_command('@input /ma '..state.Carol.value..' <stpc>')
    elseif cmdParams[1]:lower() == 'threnody' then
        send_command('@input /ma '..state.Threnody.value..' <stnpc>')
    end

    gearinfo(cmdParams, eventArgs)
end

-- Modify the default melee set after it was constructed.
--function customize_melee_set(meleeSet)
    --if buffactive['Aftermath: Lv.3'] and player.equipment.main == "Carnwenhan" then
        --meleeSet = set_combine(meleeSet, sets.engaged.Aftermath)
    --end

    --check_weaponset()

    --return meleeSet
--end

function get_custom_wsmode(spell, action, spellMap)
    local wsmode
    if state.OffenseMode.value == 'MidAcc' or state.OffenseMode.value == 'HighAcc' then
        wsmode = 'Acc'
    end

    return wsmode
end

-- Modify the default idle set after it was constructed.
function customize_idle_set(idleSet)
    -- if state.CP.current == 'on' then
    --     equip(sets.CP)
    --     disable('back')
    -- else
    --     enable('back')
    -- end
	--if player.sub_job == 'WHM' then
		--idleSet = set_combine(idleSet, sets.idle.refresh)
	--end
    --if player.mpp < 51 then
        --idleSet = set_combine(idleSet, sets.idle.refresh)
    --end
    if state.Auto_Kite.value == true then

       idleSet = set_combine(idleSet, sets.Kiting)
    end

    return idleSet
end

-- Set eventArgs.handled to true if we don't want the automatic display to be run.
function display_current_job_state(eventArgs)
    local cf_msg = ''
    if state.CombatForm.has_value then
        cf_msg = ' (' ..state.CombatForm.value.. ')'
    end

    local m_msg = state.OffenseMode.value
    if state.HybridMode.value ~= 'Normal' then
        m_msg = m_msg .. '/' ..state.HybridMode.value
    end

    local ws_msg = state.WeaponskillMode.value

    local c_msg = state.CastingMode.value

    local d_msg = 'None'
    if state.DefenseMode.value ~= 'None' then
        d_msg = state.DefenseMode.value .. state[state.DefenseMode.value .. 'DefenseMode'].value
    end

    local i_msg = state.IdleMode.value

    local msg = ''
    if state.Kiting.value then
        msg = msg .. ' Kiting: On |'
    end

    add_to_chat(002, '| ' ..string.char(31,210).. 'Melee' ..cf_msg.. ': ' ..string.char(31,001)..m_msg.. string.char(31,002)..  ' |'
        ..string.char(31,207).. ' WS: ' ..string.char(31,001)..ws_msg.. string.char(31,002)..  ' |'
        ..string.char(31,060).. ' Magic: ' ..string.char(31,001)..c_msg.. string.char(31,002)..  ' |'
        ..string.char(31,004).. ' Defense: ' ..string.char(31,001)..d_msg.. string.char(31,002)..  ' |'
        ..string.char(31,008).. ' Idle: ' ..string.char(31,001)..i_msg.. string.char(31,002)..  ' |'
        ..string.char(31,002)..msg)

    eventArgs.handled = true
end

-------------------------------------------------------------------------------------------------------------------
-- Utility functions specific to this job.
-------------------------------------------------------------------------------------------------------------------

-- Determine the custom class to use for the given song.
function get_song_class(spell)
    -- Can't use spell.targets:contains() because this is being pulled from resources
    if set.contains(spell.targets, 'Enemy') then
        if state.CastingMode.value == 'Resistant' then
            return 'SongEnfeebleAcc'
        else
            return 'SongEnfeeble'
        end
    elseif state.SongMode.value == 'Placeholder' then
        return 'SongPlaceholder'
    else
        return 'SongEnhancing'
    end
end

function get_lullaby_duration(spell)
    local self = windower.ffxi.get_player()

    local troubadour = false
    local clarioncall = false
    local soulvoice = false
    local marcato = false

    for i,v in pairs(self.buffs) do
        if v == 348 then troubadour = true end
        if v == 499 then clarioncall = true end
        if v == 52 then soulvoice = true end
        if v == 231 then marcato = true end
    end

    local mult = 1

    if player.equipment.range == 'Daurdabla' then mult = mult + 0.3 end -- change to 0.25 with 90 Daur
    if player.equipment.range == "Gjallarhorn" then mult = mult + 0.4 end -- change to 0.3 with 95 Gjall
    if player.equipment.range == "Marsyas" then mult = mult + 0.5 end

    if player.equipment.main == "Carnwenhan" then mult = mult + 0.5 end -- 0.1 for 75, 0.4 for 95, 0.5 for 99/119
    if player.equipment.main == "Legato Dagger" then mult = mult + 0.05 end
    if player.equipment.main == "Kali" then mult = mult + 0.05 end
    if player.equipment.sub == "Kali" then mult = mult + 0.05 end
    if player.equipment.sub == "Legato Dagger" then mult = mult + 0.05 end
    if player.equipment.neck == "Aoidos' Matinee" then mult = mult + 0.1 end
    if player.equipment.neck == "Mnbw. Whistle" then mult = mult + 0.2 end
    if player.equipment.neck == "Mnbw. Whistle +1" then mult = mult + 0.3 end
    if player.equipment.body == "Fili Hongreline +2" then mult = mult + 0.12 end
    if player.equipment.legs == "Inyanga Shalwar +1" then mult = mult + 0.15 end
    if player.equipment.legs == "Inyanga Shalwar +2" then mult = mult + 0.17 end
    if player.equipment.feet == "Brioso Slippers" then mult = mult + 0.1 end
    if player.equipment.feet == "Brioso Slippers +1" then mult = mult + 0.11 end
    if player.equipment.feet == "Brioso Slippers +2" then mult = mult + 0.13 end
    if player.equipment.feet == "Brioso Slippers +3" then mult = mult + 0.15 end
    if player.equipment.hands == 'Brioso Cuffs +1' then mult = mult + 0.1 end
    if player.equipment.hands == 'Brioso Cuffs +2' then mult = mult + 0.1 end
    if player.equipment.hands == 'Brioso Cuffs +3' then mult = mult + 0.2 end

    --JP Duration Gift
    if self.job_points.brd.jp_spent >= 1200 then
        mult = mult + 0.05
    end

    if troubadour then
        mult = mult * 2
    end

    if spell.en == "Foe Lullaby II" or spell.en == "Horde Lullaby II" then
        base = 60
    elseif spell.en == "Foe Lullaby" or spell.en == "Horde Lullaby" then
        base = 30
    end

    totalDuration = math.floor(mult * base)

    -- Job Points Buff
    totalDuration = totalDuration + self.job_points.brd.lullaby_duration
    if troubadour then
        totalDuration = totalDuration + self.job_points.brd.lullaby_duration
        -- adding it a second time if Troubadour up
    end

    if clarioncall then
        if troubadour then
            totalDuration = totalDuration + (self.job_points.brd.clarion_call_effect * 2 * 2)
            -- Clarion Call gives 2 seconds per Job Point upgrade.  * 2 again for Troubadour
        else
            totalDuration = totalDuration + (self.job_points.brd.clarion_call_effect * 2)
            -- Clarion Call gives 2 seconds per Job Point upgrade.
        end
    end

    if marcato and not soulvoice then
        totalDuration = totalDuration + self.job_points.brd.marcato_effect
    end

    -- Create the custom timer
    if spell.english == "Foe Lullaby II" or spell.english == "Horde Lullaby II" then
        send_command('@timers c "Lullaby II ['..spell.target.name..']" ' ..totalDuration.. ' down spells/00377.png')
    elseif spell.english == "Foe Lullaby" or spell.english == "Horde Lullaby" then
        send_command('@timers c "Lullaby ['..spell.target.name..']" ' ..totalDuration.. ' down spells/00376.png')
    end
end

function determine_haste_group()
    classes.CustomMeleeGroups:clear()
    if DW == true then
        if DW_needed <= 12 then
            classes.CustomMeleeGroups:append('MaxHaste')
        elseif DW_needed > 12 and DW_needed <= 21 then
            classes.CustomMeleeGroups:append('MaxHastePlus')
        elseif DW_needed > 21 and DW_needed <= 27 then
            classes.CustomMeleeGroups:append('HighHaste')
        elseif DW_needed > 27 and DW_needed <= 31 then
            classes.CustomMeleeGroups:append('MidHaste')
        elseif DW_needed > 31 and DW_needed <= 42 then
            classes.CustomMeleeGroups:append('LowHaste')
        elseif DW_needed > 42 then
            classes.CustomMeleeGroups:append('')
        end
    end
end

function gearinfo(cmdParams, eventArgs)
    if cmdParams[1] == 'gearinfo' then
        if type(tonumber(cmdParams[2])) == 'number' then
            if tonumber(cmdParams[2]) ~= DW_needed then
            DW_needed = tonumber(cmdParams[2])
            DW = true
            end
        elseif type(cmdParams[2]) == 'string' then
            if cmdParams[2] == 'false' then
                DW_needed = 0
                DW = false
            end
        end
        if type(tonumber(cmdParams[3])) == 'number' then
            if tonumber(cmdParams[3]) ~= Haste then
                Haste = tonumber(cmdParams[3])
            end
        end
        if type(cmdParams[4]) == 'string' then
            if cmdParams[4] == 'true' then
                moving = true
            elseif cmdParams[4] == 'false' then
                moving = false
            end
        end
        if not midaction() then
            job_update()
        end
    end
end

function check_moving()
    if state.DefenseMode.value == 'None'  and state.Kiting.value == false then
        if state.Auto_Kite.value == false and moving then
            state.Auto_Kite:set(true)
        elseif state.Auto_Kite.value == true and moving == false then
            state.Auto_Kite:set(false)
        end
    end
end

function check_gear()
    if no_swap_gear:contains(player.equipment.left_ring) then
        disable("ring1")
    else
        enable("ring1")
    end
    if no_swap_gear:contains(player.equipment.right_ring) then
        disable("ring2")
    else
        enable("ring2")
    end
end

function check_weaponset()
    equip(sets[state.WeaponSet.current])
    if player.sub_job ~= 'NIN' and player.sub_job ~= 'DNC' then
       equip(sets.DefaultShield)
    end
end

function customize_melee_set(meleeSet)
    check_weaponset()

    return meleeSet
end


windower.register_event('zone change',
    function()
        if no_swap_gear:contains(player.equipment.left_ring) then
            enable("ring1")
            equip(sets.idle)
        end
        if no_swap_gear:contains(player.equipment.right_ring) then
            enable("ring2")
            equip(sets.idle)
        end
    end
)
Thank you <3
necroskull Necro Bump Detected! [118 days between previous and next post]
 Ragnarok.Primex
Offline
サーバ: Ragnarok
Game: FFXI
Posts: 229
By Ragnarok.Primex 2023-06-17 11:35:19  
It's been a while since I had a BRD alt.
Only know how to utulise daur and ghorn. Aeonic and honor march made my brain hurt.
What's the optimal way to resource manage these 3 instruments.
Nitro 4x songs with Daur and then 4x fresh songs with Ghorn was simple enough. How has aeonic changed this?
sorry I'm really outdated.
 Asura.Disclai
Offline
サーバ: Asura
Game: FFXI
user: Disclai
By Asura.Disclai 2023-06-17 12:00:05  
Ragnarok.Primex said: »
Nitro 4x songs with Daur and then 4x fresh songs with Ghorn was simple enough. How has aeonic changed this?

There is almost never any reason to sing a full suite of dummies. The only situation you want to do that in is if you need to sing full distinct sets of songs on 3+ people, which is rare.

Otherwise, you only ever need to sing 2 dummies with Daurdabla to open up the slots. Sing 2-3 (depending on Clarion) regular, full potency NiTro songs, then 2 dummies, then the final 2 regular songs. This is significantly faster and better, given how time-intensive a lot of endgame content is.

To answer your question, typically the first song I sing is a Marcato'd HM, which will be your longest song even though it's first, because Marcato increases its duration. So you won't have to worry about it ever being overwritten even though it's first.
[+]
Offline
Posts: 8843
By SimonSes 2023-06-17 12:52:07  
Going further, it's best to sing songs you want to cast as dummy, not some shitty resist songs or whatever.

So for example if you want honor,madrigal,minuetv,minuetiv just sing minuetv and minuetiv as dummies (less duration gear and with daurdabla). This way you have weaker version of both minuets asap and can use them, instead of having useless dummies. This is especially important when you face a mob with a dispel and try to reapply songs mid fight.
[+]
 Asura.Toralin
Offline
サーバ: Asura
Game: FFXI
user: toralin
Posts: 1361
By Asura.Toralin 2023-06-17 13:26:19  
SimonSes said: »
Going further, it's best to sing songs you want to cast as dummy, not some shitty resist songs or whatever.

So for example if you want honor,madrigal,minuetv,minuetiv just sing minuetv and minuetiv as dummies (less duration gear and with daurdabla). This way you have weaker version of both minuets asap and can use them, instead of having useless dummies. This is especially important when you face a mob with a dispel and try to reapply songs mid fight.

What you got against Goblin Gavotte :(
[+]
 Siren.Bruno
Offline
サーバ: Siren
Game: FFXI
user: BruHouse
Posts: 398
By Siren.Bruno 2023-06-17 13:29:47  
STR+5 on empyrean set bonus!
 Ragnarok.Primex
Offline
サーバ: Ragnarok
Game: FFXI
Posts: 229
By Ragnarok.Primex 2023-06-17 16:09:50  
the SU5 dagger for songs or the mythic?
SU5 DA+4% effect is party-wide or?
Offline
Posts: 2231
By Nariont 2023-06-17 16:35:12  
It's just for you, only when main-handing it
 Asura.Sensarity
Offline
サーバ: Asura
Game: FFXI
user: Meeeeeep
Posts: 125
By Asura.Sensarity 2023-06-17 17:06:16  
Ragnarok.Primex said: »
the SU5 dagger for songs or the mythic?
SU5 DA+4% effect is party-wide or?
Carn for singing. SU5 only affects you and is not worth it because Naegling exists.
[+]
 Asura.Sechs
Offline
サーバ: Asura
Game: FFXI
user: Akumasama
Posts: 9876
By Asura.Sechs 2023-06-17 17:53:10  
Asura.Sensarity said: »
Ragnarok.Primex said: »
the SU5 dagger for songs or the mythic?
SU5 DA+4% effect is party-wide or?
Carn for singing. SU5 only affects you and is not worth it because Naegling exists.
Spoiler: it wouldn't be worth it even if Naegling didn't exist, alas.
First Page 2 3 ... 62 63
Log in to post.