Pergatory

Pergatory's SMN Gearswap

Jan 27th, 2017 (edited)
21,077
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 51.19 KB | None | 0 0
  1. -- Summoner Gearswap Lua by Pergatory - http://pastebin.com/u/pergatory
  2. -- IdleMode determines the set used after casting. You change it with "/console gs c <IdleMode>"
  3. -- The out-of-the-box modes are:
  4. -- Refresh: Uses the most refresh available.
  5. -- DT: A mix of refresh, PDT, and MDT to help when you can't avoid AOE.
  6. -- PetDT: Sacrifice refresh to reduce avatar's damage taken. WARNING: Selenian Cap drops you below 119, use with caution!
  7. -- DD: When melee mode is on and you're engaged, uses TP gear. Otherwise, avatar melee gear.
  8. -- Favor: Uses Beckoner's Horn and max smn skill to boost the favor effect.
  9. -- Zendik: Favor build with the Zendik Robe added in, for Shiva's Favor in manaburn parties. (Shut up, it sounded like a good idea at the time)
  10.  
  11. -- You can add your own modes in the IdleModes list, just make sure to add corresponding sets as well.
  12.  
  13. -- Additional Bindings:
  14. -- F9 - Toggles between a subset of IdleModes (Refresh > DT > PetDT)
  15. -- Ctrl+F9 - Toggles WeaponLock (When enabled, equips Nirvana and Elan+1, then disables those 2 slots from swapping)
  16. --       NOTE: If you don't already have the Nirvana & Elan+1 equipped, YOU WILL LOSE TP
  17.  
  18. -- Additional Commands:
  19. -- /console gs c AccMode - Toggles high-accuracy sets to be used where appropriate.
  20. -- /console gs c ImpactMode - Toggles between using normal magic BP set for Fenrir's Impact or a custom high-skill set for debuffs.
  21. -- /console gs c ForceIlvl - I have this set up to override a few specific slots where I normally use non-ilvl pieces.
  22. -- /console gs c TH - Treasure Hunter toggle. By default, this is only used for Dia, Dia II, and Diaga.
  23. -- /console gs c LagMode - Used to help BPs land in the right gear in high-lag situations.
  24. --                          Sets a timer to swap gear 0.5s after the BP is used rather than waiting for server response.
  25.  
  26. function file_unload()
  27.     send_command('unbind f9')
  28.     send_command('unbind f11')
  29.     send_command('unbind ^f9')
  30.     send_command('unbind ^f10')
  31.     enable("main","sub","range","ammo","head","neck","ear1","ear2","body","hands","ring1","ring2","back","waist","legs","feet")
  32. end
  33.  
  34. function get_sets()
  35.     send_command('bind f9 gs c ToggleIdle') -- F9 = Cycle through commonly used idle modes
  36.     send_command('bind f11 gs c ForceIlvl') -- Ctrl+F9 = Toggle ForceIlvl
  37.     send_command('bind ^f9 gs c WeaponLock') -- F10 = Toggle Melee Mode
  38.     send_command('bind ^f10 gs c TH') -- Ctrl+F10 = Treasure Hunter toggle
  39.  
  40.     -- Set your merits here. This is used in deciding between Enticer's Pants or Apogee Slacks +1.
  41.     -- To change in-game, "/console gs c MeteorStrike3" will change Meteor Strike to 3/5 merits.
  42.     -- The damage difference is very minor unless you're over 2400 TP.
  43.     -- It's ok to just always use Enticer's Pants and ignore this section.
  44.     MeteorStrike = 1
  45.     HeavenlyStrike = 1
  46.     WindBlade = 1
  47.     Geocrush = 1
  48.     Thunderstorm = 5
  49.     GrandFall = 1
  50.  
  51.     StartLockStyle = '85'
  52.     IdleMode = 'Refresh'
  53.     AccMode = false
  54.     ImpactDebuff = false
  55.     WeaponLock = false
  56.     TreasureHunter = false
  57.     THSpells = S{"Dia","Dia II","Diaga","Bio","Bio II"} -- If you want Treasure Hunter gear to swap for a spell/ability, add it here.
  58.     ForceIlvl = false
  59.     LagMode = false -- Default LagMode. If you have a lot of lag issues, change to "true".
  60.         -- Warning: LagMode can cause problems if you spam BPs during Conduit because it doesn't trust server packets to say whether the BP is readying or not.
  61.     SacTorque = true -- If you have Sacrifice Torque, this will auto-equip it when slept in order to wake up.
  62.     AutoRemedy = false -- Auto Remedy when using an ability while Paralyzed.
  63.     AutoEcho = false -- Auto Echo Drop when using an ability while Silenced.
  64.     TestMode = false
  65.  
  66.     -- Add idle modes here if you need more options for your sets
  67.     IdleModes = {'Refresh','DT','DD','PetDT','PetDD','Favor','Zendik','MEva','Enspell','Opashoro'}
  68.  
  69.     -- ===================================================================================================================
  70.     --      Sets
  71.     -- ===================================================================================================================
  72.  
  73.     -- Base Damage Taken Set - Mainly used when IdleMode is "DT"
  74.     sets.DT_Base = {
  75.         main="Nirvana",
  76.         sub="Oneiros Grip",
  77.         ammo="Epitaph",
  78.         head="Beckoner's Horn +3",
  79.         neck="Summoner's Collar +2",
  80.         ear1="Cath Palug Earring",
  81.         ear2="Beckoner's Earring +1",
  82.         body="Beckoner's Doublet +3",
  83.         hands={ name="Merlinic Dastanas", augments={'Pet: Crit.hit rate +2','"Mag.Atk.Bns."+25','"Refresh"+2','Mag. Acc.+10 "Mag.Atk.Bns."+10',}},
  84.         ring1="Inyanga Ring",
  85.         ring2="Defending Ring",
  86.         back={ name="Campestres's Cape", augments={'MND+20','Mag. Acc+20 /Mag. Dmg.+20','Mag. Acc.+10','"Mag.Atk.Bns."+10','Phys. dmg. taken-10%',}},
  87.         waist="Carrier's Sash",
  88.         legs="Inyanga Shalwar +2",
  89.         feet="Baayami Sabots +1"
  90.     }
  91.  
  92.     -- Treasure Hunter set. Don't put anything in here except TH+ gear.
  93.     -- It overwrites slots in other sets when TH toggle is on (Ctrl+F10).
  94.     sets.TH = {
  95.         head="Volte Cap",
  96.         waist="Chaac Belt",
  97.         body="Nyame Mail", -- Because otherwise Cohort Cloak and such mess up the swap
  98.         hands="Volte Bracers",
  99.         feet="Volte Boots"
  100.     }
  101.    
  102.     -- This gets equipped automatically when you have Sneak/Invis or Quickening such as from Fleet Wind.
  103.     sets.Movement = {
  104.         ring1="Shneddick Ring +1"
  105.         --feet="Herald's Gaiters"
  106.     }
  107.  
  108.     sets.precast = {}
  109.  
  110.     -- Fast Cast
  111.     sets.precast.FC = {
  112.         main={ name="Grioavolr", augments={'"Fast Cast"+6','INT+2','"Mag.Atk.Bns."+17',}}, -- +10
  113.         sub="Clerisy Strap +1", -- +3
  114.         --ammo="Sapience Orb",
  115.         head="Amalric Coif +1", -- +11
  116.         neck="Orunmila's Torque", -- +5
  117.         ear1="Malignance Earring", -- +4
  118.         ear2="Loquacious Earring", -- +2
  119.         hands={ name="Telchine Gloves", augments={'Mag. Evasion+25','"Fast Cast"+5','Enh. Mag. eff. dur. +10',}},
  120.         body="Inyanga Jubbah +2", -- +14
  121.         ring1="Lebeche Ring",
  122.         ring2="Kishar Ring", -- +4
  123.         back={ name="Campestres's Cape", augments={'Pet: M.Acc.+20 Pet: M.Dmg.+20','Eva.+20 /Mag. Eva.+20','Pet: Mag. Acc.+10','"Fast Cast"+10',}},
  124.         waist="Witful Belt", -- +3
  125.         legs={ name="Merlinic Shalwar", augments={'"Fast Cast"+6','CHR+6','Mag. Acc.+14','"Mag.Atk.Bns."+14',}},
  126.         feet="Regal Pumps +1" -- +5~7
  127.     }
  128.  
  129.     sets.precast["Dispelga"] = set_combine(sets.precast.FC, {
  130.         main="Daybreak",
  131.         sub="Ammurapi Shield"
  132.     })
  133.  
  134.     sets.midcast = {}
  135.  
  136.     -- BP Timer Gear
  137.     -- Use BP Recast Reduction here, along with Avatar's Favor gear.
  138.     -- Avatar's Favor skill tiers are 512 / 575 / 670.
  139.     sets.midcast.BP = {
  140.         main={ name="Espiritus", augments={'Summoning magic skill +15','Pet: Mag. Acc.+30','Pet: Damage taken -4%',}},
  141.         sub="Vox Grip",
  142.         ammo="Sancus Sachet +1",
  143.         head="Beckoner's Horn +3", -- Always use Beckoner's Horn here.
  144.         neck="Incanter's Torque",
  145.         ear1="Cath Palug Earring",
  146.         ear2="Lodurr Earring",
  147.         body="Baayami Robe +1",
  148.         hands="Baayami Cuffs +1",
  149.         ring1={name="Stikini Ring +1", bag="wardrobe2"},
  150.         ring2="Evoker's Ring",
  151.         back={ name="Conveyance Cape", augments={'Summoning magic skill +5','Pet: Enmity+12','Blood Pact Dmg.+2',}},
  152.         waist="Kobo Obi",
  153.         legs="Baayami Slops +1",
  154.         feet="Baayami Sabots +1"
  155.     }
  156.    
  157.     -- Shock Squall is too fast to swap gear in pet_midcast() or otherwise. It'll generally land in your BP timer set.
  158.     -- I settle for the 670 skill favor tier in this set, so that I can fit more Pet:MAcc although it's usually not necessary.
  159.     sets.midcast.BP["Shock Squall"] = set_combine(sets.midcast.BP, {
  160.         neck="Summoner's Collar +2",
  161.         ear1="Enmerkar Earring",
  162.         ear2="Lugalbanda Earring",
  163.         ring1="Cath Palug Ring",
  164.         ring2="Fickblix's Ring",
  165.         back={ name="Campestres's Cape", augments={'Pet: M.Acc.+20 Pet: M.Dmg.+20','Eva.+20 /Mag. Eva.+20','Pet: Mag. Acc.+10','"Fast Cast"+10',}},
  166.         waist="Incarnation Sash",
  167.     })
  168.  
  169.     -- Elemental Siphon sets. Zodiac Ring is affected by day, Chatoyant Staff by weather, and Twilight Cape by both.
  170.     sets.midcast.Siphon = {
  171.         main={ name="Espiritus", augments={'Summoning magic skill +15','Pet: Mag. Acc.+30','Pet: Damage taken -4%',}},
  172.         sub="Vox Grip",
  173.         ammo="Esper Stone +1",
  174.         head="Baayami Hat +1",
  175.         neck="Incanter's Torque",
  176.         ear1="Cath Palug Earring",
  177.         ear2="Lodurr Earring",
  178.         body="Baayami Robe +1",
  179.         hands="Baayami Cuffs +1",
  180.         ring1={name="Stikini Ring +1", bag="wardrobe2"},
  181.         ring2="Evoker's Ring",
  182.         back={ name="Conveyance Cape", augments={'Summoning magic skill +5','Pet: Enmity+12','Blood Pact Dmg.+2',}},
  183.         waist="Kobo Obi",
  184.         legs="Baayami Slops +1",
  185.         feet="Beckoner's Pigaches +3"
  186.     }
  187.  
  188.     sets.midcast.SiphonZodiac = set_combine(sets.midcast.Siphon, { ring1="Zodiac Ring" })
  189.  
  190.     sets.midcast.SiphonWeather = set_combine(sets.midcast.Siphon, { main="Chatoyant Staff" })
  191.    
  192.     sets.midcast.SiphonWeatherZodiac = set_combine(sets.midcast.SiphonZodiac, { main="Chatoyant Staff" })
  193.  
  194.     -- Summoning Midcast, cap spell interruption if possible (Baayami Robe gives 100, need 2 more)
  195.     -- PDT isn't a bad idea either, so don't overwrite a lot from the DT set it inherits from.
  196.     sets.midcast.Summon = set_combine(sets.DT_Base, {
  197.         body="Baayami Robe +1",
  198.         waist="Rumination Sash"
  199.     })
  200.  
  201.     -- If you ever lock your weapon, keep that in mind when building cure potency set.
  202.     sets.midcast.Cure = {
  203.         main="Nirvana",
  204.         sub="Clerisy Strap +1",
  205.         head={ name="Vanya Hood", augments={'MP+50','"Cure" potency +7%','Enmity-6',}},
  206.         neck="Orunmila's Torque",
  207.         ear1="Meili Earring",
  208.         ear2="Novia Earring",
  209.         body="Zendik Robe",
  210.         hands={ name="Telchine Gloves", augments={'Mag. Evasion+25','"Fast Cast"+5','Enh. Mag. eff. dur. +10',}},
  211.         ring1="Lebeche Ring",
  212.         ring2="Menelaus's Ring",
  213.         back="Tempered Cape +1",
  214.         waist="Luminary Sash",
  215.         legs="Convoker's Spats +3",
  216.         feet={ name="Vanya Clogs", augments={'MP+50','"Cure" potency +7%','Enmity-6',}}
  217.     }
  218.  
  219.     sets.midcast.Cursna = set_combine(sets.precast.FC, {
  220.         neck="Debilis Medallion",
  221.         ear1="Meili Earring",
  222.         ear2="Beatific Earring",
  223.         ring1="Menelaus's Ring",
  224.         ring2="Haoma's Ring",
  225.         back="Tempered Cape +1",
  226.         waist="Bishop's Sash",
  227.         feet={ name="Vanya Clogs", augments={'Healing magic skill +20','"Cure" spellcasting time -7%','Magic dmg. taken -3',}}
  228.     })
  229.    
  230.     -- Just a standard set for spells that have no set
  231.     sets.midcast.EnmityRecast = set_combine(sets.precast.FC, {
  232.         main="Nirvana",
  233.         ear1="Novia Earring",
  234.         body={ name="Apo. Dalmatica +1", augments={'Summoning magic skill +20','Enmity-6','Pet: Damage taken -4%',}}
  235.     })
  236.  
  237.     -- Strong alternatives: Daybreak and Ammurapi Shield, Cath Crown, Gwati Earring
  238.     sets.midcast.Enfeeble = {
  239.         main="Contemplator +1",
  240.         sub="Enki Strap",
  241.         head=empty,
  242.         neck="Erra Pendant",
  243.         ear1="Malignance Earring",
  244.         ear2="Dignitary's Earring",
  245.         body="Cohort Cloak +1",
  246.         hands="Inyanga Dastanas +2",
  247.         ring1={name="Stikini Ring +1", bag="wardrobe2"},
  248.         ring2={name="Stikini Ring +1", bag="wardrobe4"},
  249.         back="Aurist's Cape +1",
  250.         waist="Luminary Sash",
  251.         legs="Inyanga Shalwar +2",
  252.         feet="Skaoi Boots"
  253.     }
  254.     sets.midcast.Enfeeble.INT = set_combine(sets.midcast.Enfeeble, {
  255.         waist="Acuity Belt +1"
  256.     })
  257.  
  258.     sets.midcast.Enhancing = {
  259.         main={ name="Gada", augments={'Enh. Mag. eff. dur. +6','DEX+1','Mag. Acc.+5','"Mag.Atk.Bns."+18','DMG:+4',}},
  260.         sub="Ammurapi Shield",
  261.         head={ name="Telchine Cap", augments={'Mag. Evasion+24','"Conserve MP"+4','Enh. Mag. eff. dur. +10',}},
  262.         neck="Incanter's Torque",
  263.         ear1="Mimir Earring",
  264.         ear2="Andoaa Earring",
  265.         body={ name="Telchine Chas.", augments={'Mag. Evasion+25','"Conserve MP"+5','Enh. Mag. eff. dur. +10',}},
  266.         hands={ name="Telchine Gloves", augments={'Mag. Evasion+25','"Fast Cast"+5','Enh. Mag. eff. dur. +10',}},
  267.         ring1={name="Stikini Ring +1", bag="wardrobe2"},
  268.         ring2={name="Stikini Ring +1", bag="wardrobe4"},
  269.         back="Merciful Cape",
  270.         waist="Embla Sash",
  271.         legs={ name="Telchine Braconi", augments={'Mag. Evasion+25','"Conserve MP"+4','Enh. Mag. eff. dur. +10',}},
  272.         feet={ name="Telchine Pigaches", augments={'Mag. Evasion+24','"Conserve MP"+3','Enh. Mag. eff. dur. +10',}}
  273.     }
  274.  
  275.     sets.midcast.Stoneskin = set_combine(sets.midcast.Enhancing, {
  276.         neck="Nodens Gorget",
  277.         ear2="Earthcry Earring",
  278.         waist="Siegel Sash",
  279.         --legs="Shedir Seraweels"
  280.     })
  281.  
  282.     sets.midcast.Nuke = {
  283.         main={ name="Grioavolr", augments={'"Fast Cast"+6','INT+2','"Mag.Atk.Bns."+17',}},
  284.         sub="Niobid Strap",
  285.         head="Cath Palug Crown",
  286.         neck="Sanctity Necklace",
  287.         ear1="Malignance Earring",
  288.         ear2="Friomisi Earring",
  289.         body={ name="Amalric Doublet +1", augments={'MP+80','Mag. Acc.+20','"Mag.Atk.Bns."+20',}},
  290.         hands={ name="Amalric Gages +1", augments={'INT+12','Mag. Acc.+20','"Mag.Atk.Bns."+20',}},
  291.         ring1="Freke Ring",
  292.         ring2="Shiva Ring +1",
  293.         back={ name="Campestres's Cape", augments={'MND+20','Mag. Acc+20 /Mag. Dmg.+20','Mag. Acc.+10','"Mag.Atk.Bns."+10','Phys. dmg. taken-10%',}},
  294.         waist="Eschan Stone",
  295.         legs={ name="Amalric Slops +1", augments={'MP+80','Mag. Acc.+20','"Mag.Atk.Bns."+20',}},
  296.         feet={ name="Amalric Nails +1", augments={'Mag. Acc.+20','"Mag.Atk.Bns."+20','"Conserve MP"+7',}}
  297.     }
  298.  
  299.     sets.midcast["Refresh"] = set_combine(sets.midcast.Enhancing, {
  300.         head="Amalric Coif +1",
  301.         waist="Gishdubar Sash"
  302.     })
  303.  
  304.     sets.midcast["Aquaveil"] = set_combine(sets.midcast.Enhancing, {
  305.         main="Vadose Rod",
  306.         head="Amalric Coif +1",
  307.         waist="Emphatikos Rope",
  308.     })
  309.  
  310.     sets.midcast["Dispelga"] = set_combine(sets.midcast.Enfeeble, {
  311.         main="Daybreak",
  312.         sub="Ammurapi Shield"
  313.     })
  314.  
  315.     sets.midcast["Mana Cede"] = { hands="Beckoner's Bracers +3" }
  316.  
  317.     sets.midcast["Astral Flow"] = { head="Glyphic Horn +3" }
  318.    
  319.     -- ===================================================================================================================
  320.     --  Weaponskills
  321.     -- ===================================================================================================================
  322.  
  323.     -- Magic accuracy can be nice here to land the defense down effect. Also keep in mind big damage Garland can make it
  324.     -- harder for multiple people to get AM3 on trash mobs before popping an NM.
  325.     sets.midcast["Garland of Bliss"] = {
  326.         head="Nyame Helm",
  327.         neck="Sanctity Necklace",
  328.         ear1="Malignance Earring",
  329.         ear2="Dignitary's Earring",
  330.         body="Nyame Mail",
  331.         hands="Nyame Gauntlets",
  332.         ring1={name="Stikini Ring +1", bag="wardrobe2"},
  333.         ring2={name="Stikini Ring +1", bag="wardrobe4"},
  334.         back="Aurist's Cape +1",
  335.         waist="Eschan Stone",
  336.         legs="Nyame Flanchard",
  337.         feet="Nyame Sollerets"
  338.     }
  339.  
  340.     -- My set focuses on accuracy here to make skillchains with Ifrit
  341.     -- Just like Garland, it's not hard to improve on the damage from this set if that's what you're after.
  342.     sets.midcast["Shattersoul"] = {
  343.         head="Beckoner's Horn +3",
  344.         neck="Fotia Gorget",
  345.         ear1="Zennaroi Earring",
  346.         ear2="Telos Earring",
  347.         body="Tali'ah Manteel +2",
  348.         hands="Nyame Gauntlets",
  349.         ring1="Freke Ring",
  350.         ring2="Metamorph Ring +1",
  351.         back={ name="Campestres's Cape", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Dbl.Atk."+10','Phys. dmg. taken-10%',}},
  352.         waist="Fotia Belt",
  353.         legs="Nyame Flanchard",
  354.         feet="Beckoner's Pigaches +3"
  355.     }
  356.  
  357.     sets.midcast["Cataclysm"] = set_combine(sets.midcast.Nuke, {})
  358.    
  359.     sets.midcast["Shell Crusher"] = set_combine(sets.midcast["Garland of Bliss"], {})
  360.    
  361.     sets.midcast["Black Halo"] = set_combine(sets.midcast["Garland of Bliss"], {})
  362.    
  363.     sets.midcast["Oshala"] = set_combine(sets.midcast["Garland of Bliss"], {
  364.         ear2="Telos Earring",
  365.         neck="Shulmanu Collar",
  366.         ring1="Epaminondas's Ring",
  367.         ring2="Metamorph Ring +1",
  368.         waist="Acuity Belt +1",
  369.     })
  370.  
  371.     sets.pet_midcast = {}
  372.  
  373.     -- Main physical pact set (Volt Strike, Pred Claws, etc.)
  374.     -- Prioritize BP Damage & Pet: Double Attack
  375.     -- Strong Alternatives:
  376.     --   Gridarvor, Apogee Crown, Apogee Pumps, AF body, Apogee Dalmatica, Shulmanu Collar (equal to ~R15 Collar), Gelos Earring,
  377.     --   Regal Belt, Varar Ring, Kyrene's Earring
  378.     sets.pet_midcast.Physical_BP = {
  379.         main="Opashoro",
  380.         sub="Elan Strap +1",
  381.         ammo="Epitaph",
  382.         head={ name="Helios Band", augments={'Pet: Attack+30 Pet: Rng.Atk.+30','Pet: "Dbl. Atk."+8','Blood Pact Dmg.+7',}},
  383.         neck="Summoner's Collar +2",
  384.         ear1="Lugalbanda Earring",
  385.         ear2="Beckoner's Earring +1",
  386.         body="Glyphic Doublet +3",
  387.         hands={ name="Merlinic Dastanas", augments={'Pet: Attack+24 Pet: Rng.Atk.+24','Blood Pact Dmg.+9','Pet: STR+10','Pet: Mag. Acc.+7',}},
  388.         ring1="Cath Palug Ring",
  389.         ring2="Fickblix's Ring",
  390.         back={ name="Campestres's Cape", augments={'Pet: Acc.+20 Pet: R.Acc.+20 Pet: Atk.+20 Pet: R.Atk.+20','Eva.+20 /Mag. Eva.+20','Pet: Attack+10 Pet: Rng.Atk.+10','Pet: "Regen"+10','Pet: Damage taken -5%',}},
  391.         waist="Incarnation Sash",
  392.         legs={ name="Apogee Slacks +1", augments={'Pet: STR+20','Blood Pact Dmg.+14','Pet: "Dbl. Atk."+4',}},
  393.         feet={ name="Helios Boots", augments={'Pet: Accuracy+28 Pet: Rng. Acc.+28','Pet: "Dbl. Atk."+8','Blood Pact Dmg.+7',}}
  394.     }
  395.  
  396.     -- Physical Pact AM3 set, less emphasis on Pet:DA
  397.     sets.pet_midcast.Physical_BP_AM3 = set_combine(sets.pet_midcast.Physical_BP, {
  398.         body="Convoker's Doublet +3",
  399.         ring1="Varar Ring +1",
  400.         feet={ name="Apogee Pumps +1", augments={'MP+80','Pet: Attack+35','Blood Pact Dmg.+8',}}
  401.     })
  402.  
  403.     -- Physical pacts which benefit more from TP than Pet:DA (like Spinning Dive and other pacts you never use except that one time)
  404.     sets.pet_midcast.Physical_BP_TP = set_combine(sets.pet_midcast.Physical_BP, {
  405.         head={ name="Apogee Crown +1", augments={'MP+80','Pet: Attack+35','Blood Pact Dmg.+8',}},
  406.         body="Convoker's Doublet +3",
  407.         ring1="Varar Ring +1",
  408.         waist="Regal Belt",
  409.         legs="Enticer's Pants",
  410.         feet={ name="Apogee Pumps +1", augments={'MP+80','Pet: Attack+35','Blood Pact Dmg.+8',}}
  411.     })
  412.  
  413.     -- Used for all physical pacts when AccMode is true
  414.     sets.pet_midcast.Physical_BP_Acc = set_combine(sets.pet_midcast.Physical_BP, {
  415.         head={ name="Apogee Crown +1", augments={'MP+80','Pet: Attack+35','Blood Pact Dmg.+8',}},
  416.         body="Convoker's Doublet +3",
  417.         hands={ name="Merlinic Dastanas", augments={'Pet: Accuracy+28 Pet: Rng. Acc.+28','Blood Pact Dmg.+10','Pet: DEX+9','Pet: Mag. Acc.+9','Pet: "Mag.Atk.Bns."+3',}},
  418.         feet="Beckoner's Pigaches +3"
  419.     })
  420.  
  421.     -- Base magic pact set
  422.     -- Prioritize BP Damage & Pet:MAB
  423.     -- Strong Alternatives:
  424.     -- Espiritus, Apogee Crown, Adad Amulet (equal to ~R12 Collar)
  425.     sets.pet_midcast.Magic_BP_Base = {
  426.         main={ name="Grioavolr", augments={'Blood Pact Dmg.+10','Pet: STR+5','Pet: Mag. Acc.+18','Pet: "Mag.Atk.Bns."+25',}},
  427.         sub="Elan Strap +1",
  428.         ammo="Epitaph",
  429.         head="Cath Palug Crown",
  430.         neck="Summoner's Collar +2",
  431.         ear1="Lugalbanda Earring",
  432.         ear2="Beckoner's Earring +1",
  433.         body={ name="Apo. Dalmatica +1", augments={'MP+80','Pet: "Mag.Atk.Bns."+35','Blood Pact Dmg.+8',}},
  434.         hands={ name="Merlinic Dastanas", augments={'Pet: Mag. Acc.+25 Pet: "Mag.Atk.Bns."+25','Blood Pact Dmg.+10','Pet: "Mag.Atk.Bns."+7',}},
  435.         ring1={name="Varar Ring +1", bag="wardrobe2"},
  436.         --ring2={name="Varar Ring +1", bag="wardrobe4"},
  437.         ring2="Fickblix's Ring",
  438.         back={ name="Campestres's Cape", augments={'Pet: M.Acc.+20 Pet: M.Dmg.+20','Eva.+20 /Mag. Eva.+20','Pet: Mag. Acc.+10','"Fast Cast"+10',}},
  439.         waist="Regal Belt",
  440.         feet={ name="Apogee Pumps +1", augments={'MP+80','Pet: "Mag.Atk.Bns."+35','Blood Pact Dmg.+8',}}
  441.     }
  442.    
  443.     -- Some magic pacts benefit more from TP than others.
  444.     -- Note: This set will only be used on merit pacts if you have less than 4 merits.
  445.     --       Make sure to update your merit values at the top of this Lua.
  446.     sets.pet_midcast.Magic_BP_TP = set_combine(sets.pet_midcast.Magic_BP_Base, {
  447.         legs="Enticer's Pants"
  448.     })
  449.  
  450.     -- NoTP set used when you don't need Enticer's
  451.     sets.pet_midcast.Magic_BP_NoTP = set_combine(sets.pet_midcast.Magic_BP_Base, {
  452.         legs={ name="Apogee Slacks +1", augments={'MP+80','Pet: "Mag.Atk.Bns."+35','Blood Pact Dmg.+8',}}
  453.     })
  454.  
  455.     sets.pet_midcast.Magic_BP_TP_Acc = set_combine(sets.pet_midcast.Magic_BP_TP, {
  456.         head={ name="Merlinic Hood", augments={'Pet: Mag. Acc.+21 Pet: "Mag.Atk.Bns."+21','Blood Pact Dmg.+7','Pet: INT+6','Pet: "Mag.Atk.Bns."+11',}},
  457.         body="Convoker's Doublet +3",
  458.         hands={ name="Merlinic Dastanas", augments={'Pet: Mag. Acc.+29','Blood Pact Dmg.+10','Pet: INT+7','Pet: "Mag.Atk.Bns."+10',}}
  459.     })
  460.  
  461.     sets.pet_midcast.Magic_BP_NoTP_Acc = set_combine(sets.pet_midcast.Magic_BP_NoTP, {
  462.         head={ name="Merlinic Hood", augments={'Pet: Mag. Acc.+21 Pet: "Mag.Atk.Bns."+21','Blood Pact Dmg.+7','Pet: INT+6','Pet: "Mag.Atk.Bns."+11',}},
  463.         body="Convoker's Doublet +3",
  464.         hands={ name="Merlinic Dastanas", augments={'Pet: Mag. Acc.+29','Blood Pact Dmg.+10','Pet: INT+7','Pet: "Mag.Atk.Bns."+10',}}
  465.     })
  466.  
  467.     -- Favor BP Damage above all. Pet:MAB also very strong.
  468.     -- Pet: Accuracy, Attack, Magic Accuracy moderately important.
  469.     -- Strong Alternatives:
  470.     -- Keraunos, Grioavolr, Espiritus, Was, Apogee Crown, Apogee Dalmatica, Adad Amulet
  471.     sets.pet_midcast.FlamingCrush = {
  472.         main="Opashoro",
  473.         sub="Elan Strap +1",
  474.         ammo="Epitaph",
  475.         head="Cath Palug Crown",
  476.         neck="Summoner's Collar +2",
  477.         ear1="Lugalbanda Earring",
  478.         ear2="Beckoner's Earring +1",
  479.         body="Convoker's Doublet +3",
  480.         hands={ name="Merlinic Dastanas", augments={'Pet: Mag. Acc.+25 Pet: "Mag.Atk.Bns."+25','Blood Pact Dmg.+10','Pet: "Mag.Atk.Bns."+7',}},
  481.         ring1={name="Varar Ring +1", bag="wardrobe2"},
  482.         ring2="Fickblix's Ring",
  483.         back={ name="Campestres's Cape", augments={'Pet: Acc.+20 Pet: R.Acc.+20 Pet: Atk.+20 Pet: R.Atk.+20','Eva.+20 /Mag. Eva.+20','Pet: Attack+10 Pet: Rng.Atk.+10','Pet: "Regen"+10','Pet: Damage taken -5%',}},
  484.         waist="Regal Belt",
  485.         legs={ name="Apogee Slacks +1", augments={'MP+80','Pet: "Mag.Atk.Bns."+35','Blood Pact Dmg.+8',}},
  486.         feet={ name="Apogee Pumps +1", augments={'MP+80','Pet: "Mag.Atk.Bns."+35','Blood Pact Dmg.+8',}}
  487.     }
  488.  
  489.     sets.pet_midcast.FlamingCrush_Acc = set_combine(sets.pet_midcast.FlamingCrush, {
  490.         hands={ name="Merlinic Dastanas", augments={'Pet: Accuracy+28 Pet: Rng. Acc.+28','Blood Pact Dmg.+10','Pet: DEX+9','Pet: Mag. Acc.+9','Pet: "Mag.Atk.Bns."+3',}},
  491.         feet="Beckoner's Pigaches +3"
  492.     })
  493.  
  494.     -- Pet: Magic Acc set - Mainly used for debuff pacts like Bitter Elegy
  495.     sets.pet_midcast.MagicAcc_BP = {
  496.         main="Opashoro",
  497.         sub="Vox Grip",
  498.         ammo="Epitaph",
  499.         head="Beckoner's Horn +3",
  500.         neck="Summoner's Collar +2",
  501.         ear1="Enmerkar Earring",
  502.         ear2="Lugalbanda Earring",
  503.         body="Convoker's Doublet +3",
  504.         hands="Lamassu Mitts +1",
  505.         ring1="Cath Palug Ring",
  506.         ring2="Fickblix's Ring",
  507.         back={ name="Campestres's Cape", augments={'Pet: M.Acc.+20 Pet: M.Dmg.+20','Eva.+20 /Mag. Eva.+20','Pet: Mag. Acc.+10','"Fast Cast"+10',}},
  508.         waist="Regal Belt",
  509.         legs="Convoker's Spats +3",
  510.         feet="Bunzi's Sabots"
  511.     }
  512.  
  513.     sets.pet_midcast.Debuff_Rage = sets.pet_midcast.MagicAcc_BP
  514.  
  515.     -- Pure summoning magic set, mainly used for buffs like Hastega II.
  516.     -- Strong Alternatives:
  517.     -- Andoaa Earring, Summoning Earring, Lamassu Mitts +1, Caller's Pendant
  518.     sets.pet_midcast.SummoningMagic = {
  519.         main={ name="Espiritus", augments={'Summoning magic skill +15','Pet: Mag. Acc.+30','Pet: Damage taken -4%',}},
  520.         sub="Vox Grip",
  521.         ammo="Epitaph",
  522.         head="Baayami Hat +1",
  523.         neck="Incanter's Torque",
  524.         ear1="Cath Palug Earring",
  525.         ear2="Lodurr Earring",
  526.         body="Baayami Robe +1",
  527.         hands="Baayami Cuffs +1",
  528.         ring1={name="Stikini Ring +1", bag="wardrobe2"},
  529.         ring2="Evoker's Ring",
  530.         back={ name="Conveyance Cape", augments={'Summoning magic skill +5','Pet: Enmity+12','Blood Pact Dmg.+2',}},
  531.         waist="Kobo Obi",
  532.         legs="Baayami Slops +1",
  533.         feet="Baayami Sabots +1"
  534.     }
  535.  
  536.     sets.pet_midcast.Buff = sets.pet_midcast.SummoningMagic
  537.    
  538.     -- Wind's Blessing set. Pet:MND increases potency.
  539.     sets.pet_midcast.Buff_MND = set_combine(sets.pet_midcast.Buff, {
  540.         main="Opashoro",
  541.         neck="Summoner's Collar +2",
  542.         ear2="Beckoner's Earring +1",
  543.         hands="Lamassu Mitts +1",
  544.         back={ name="Campestres's Cape", augments={'Pet: Acc.+20 Pet: R.Acc.+20 Pet: Atk.+20 Pet: R.Atk.+20','Eva.+20 /Mag. Eva.+20','Pet: Attack+10 Pet: Rng.Atk.+10','Pet: "Regen"+10','Pet: Damage taken -5%',}},
  545.         legs="Assiduity Pants +1",
  546.         feet="Bunzi's Sabots"
  547.     })
  548.  
  549.     -- Don't drop Avatar level in this set if you can help it.
  550.     -- You can use Avatar:HP+ gear to increase the HP recovered, but most of it will decrease your own max HP.
  551.     sets.pet_midcast.Buff_Healing = set_combine(sets.pet_midcast.Buff, {
  552.         main="Opashoro",
  553.         back={ name="Campestres's Cape", augments={'Pet: Acc.+20 Pet: R.Acc.+20 Pet: Atk.+20 Pet: R.Atk.+20','Eva.+20 /Mag. Eva.+20','Pet: Attack+10 Pet: Rng.Atk.+10','Pet: "Regen"+10','Pet: Damage taken -5%',}},
  554.         --body={ name="Apo. Dalmatica +1", augments={'Summoning magic skill +20','Enmity-6','Pet: Damage taken -4%',}},
  555.         --feet={ name="Apogee Pumps +1", augments={'MP+80','Pet: "Mag.Atk.Bns."+35','Blood Pact Dmg.+8',}}
  556.     })
  557.  
  558.     -- This set is used for certain blood pacts when ImpactDebuff mode is turned ON. (/console gs c ImpactDebuff)
  559.     -- These pacts are normally used with magic damage gear, but they're also strong debuffs when enhanced by summoning skill.
  560.     -- This set is safe to ignore.
  561.     sets.pet_midcast.Impact = set_combine(sets.pet_midcast.SummoningMagic, {
  562.         main="Opashoro",
  563.         head="Beckoner's Horn +3",
  564.         ear1="Enmerkar Earring",
  565.         ear2="Lugalbanda Earring",
  566.         hands="Lamassu Mitts +1"
  567.     })
  568.    
  569.     -- ===================================================================================================================
  570.     -- Aftercast Sets
  571.     -- ===================================================================================================================
  572.     -- Syntax: sets.aftercast.{IdleMode}.{PetName|Spirit|Avatar}.{PlayerStatus}.{LowMP}.{ForceIlvl}
  573.  
  574.     -- Example: sets.aftercast.DT["Cait Sith"] will be a set used when IdleMode is "DT" and you have Cait Sith summoned.
  575.  
  576.     -- This is your default idle gear used as a baseline for most idle sets below. Put gear here and you won't have to repeat it over and over.
  577.     -- I focus on refresh. Strong alternatives: Asteria Mitts, Convoker Horn, Shomonjijoe
  578.     sets.aftercast = {
  579.         main="Mpaca's Staff",
  580.         sub="Oneiros Grip",
  581.         ammo="Epitaph",
  582.         head="Beckoner's Horn +3",
  583.         neck="Loricate Torque +1",
  584.         ear1="Cath Palug Earring",
  585.         ear2="Beckoner's Earring +1",
  586.         body={ name="Apo. Dalmatica +1", augments={'MP+80','Pet: "Mag.Atk.Bns."+35','Blood Pact Dmg.+8',}},
  587.         hands={ name="Merlinic Dastanas", augments={'Pet: Crit.hit rate +2','"Mag.Atk.Bns."+25','"Refresh"+2','Mag. Acc.+10 "Mag.Atk.Bns."+10',}},
  588.         ring1="Shneddick Ring +1",
  589.         --ring1={name="Stikini Ring +1", bag="wardrobe2"},
  590.         ring2="Defending Ring",
  591.         back={ name="Campestres's Cape", augments={'MND+20','Mag. Acc+20 /Mag. Dmg.+20','Mag. Acc.+10','"Mag.Atk.Bns."+10','Phys. dmg. taken-10%',}},
  592.         waist="Regal Belt",
  593.         legs="Assiduity Pants +1",
  594.         --feet="Herald's Gaiters"
  595.         feet="Baayami Sabots +1"
  596.     }
  597.    
  598.     -- sets.aftercast.ForceIlvl = set_combine(sets.aftercast, {
  599.         -- feet="Baayami Sabots +1"
  600.     -- })
  601.     sets.aftercast.LowMP = set_combine(sets.aftercast, {
  602.         waist="Fucho-no-obi"
  603.     })
  604.     -- sets.aftercast.LowMP.ForceIlvl = set_combine(sets.aftercast.LowMP, {
  605.         -- feet="Baayami Sabots +1"
  606.     -- })
  607.    
  608.     -- Main perpetuation set ~~ Strong Alternatives:
  609.     -- Gridarvor, Asteria Mitts, Shomonjijoe, Convoker's Horn, Evans Earring, Isa Belt
  610.     sets.aftercast.Avatar = {
  611.         main="Nirvana",
  612.         sub="Oneiros Grip",
  613.         ammo="Epitaph",
  614.         head="Beckoner's Horn +3",
  615.         neck="Caller's Pendant",
  616.         ear1="Cath Palug Earring",
  617.         ear2="Beckoner's Earring +1",
  618.         body={ name="Apo. Dalmatica +1", augments={'Summoning magic skill +20','Enmity-6','Pet: Damage taken -4%',}},
  619.         hands={ name="Merlinic Dastanas", augments={'Pet: Crit.hit rate +2','"Mag.Atk.Bns."+25','"Refresh"+2','Mag. Acc.+10 "Mag.Atk.Bns."+10',}},
  620.         ring1={name="Stikini Ring +1", bag="wardrobe2"},
  621.         ring2="Evoker's Ring",
  622.         back={ name="Campestres's Cape", augments={'Pet: Acc.+20 Pet: R.Acc.+20 Pet: Atk.+20 Pet: R.Atk.+20','Eva.+20 /Mag. Eva.+20','Pet: Attack+10 Pet: Rng.Atk.+10','Pet: "Regen"+10','Pet: Damage taken -5%',}},
  623.         waist="Lucidity Sash",
  624.         legs="Assiduity Pants +1",
  625.         feet="Baayami Sabots +1"
  626.     }
  627.     -- If you have Fucho and don't need Lucidity Sash for perp down, you can uncomment the belt here to enable using it.
  628.     sets.aftercast.Avatar.LowMP = set_combine(sets.aftercast.Avatar, {
  629.         --waist="Fucho-no-obi"
  630.     })
  631.    
  632.     -- Damage Taken set
  633.     sets.aftercast.DT = set_combine(sets.DT_Base, {
  634.     })
  635.    
  636.     sets.aftercast.DT.Avatar = set_combine(sets.aftercast.DT, {
  637.         waist="Isa Belt"
  638.     })
  639.    
  640.     -- You aren't likely to be in PetDT mode without an avatar for long, but I default to the DT set in that scenario.
  641.     sets.aftercast.PetDT = set_combine(sets.aftercast.DT, {
  642.     })
  643.  
  644.     -- Pet:DT build. Equipped when IdleMode is "PetDT".
  645.     -- Strong alternatives:
  646.     -- Selenian Cap, Enticer's Pants, Enmerkar Earring, Handler's Earring, Rimeice Earring, Tali'ah Seraweels
  647.     sets.aftercast.PetDT.Avatar = {
  648.         main="Nirvana",
  649.         sub="Oneiros Grip",
  650.         ammo="Epitaph",
  651.         head={ name="Apogee Crown +1", augments={'Pet: Accuracy+25','"Avatar perpetuation cost"+7','Pet: Damage taken -4%',}},
  652.         neck="Summoner's Collar +2",
  653.         ear1="Enmerkar Earring",
  654.         ear2="Beckoner's Earring +1",
  655.         body={ name="Apo. Dalmatica +1", augments={'Summoning magic skill +20','Enmity-6','Pet: Damage taken -4%',}},
  656.         hands={ name="Telchine Gloves", augments={'Pet: DEF+17','Pet: "Regen"+3','Pet: Damage taken -4%',}},
  657.         --ring1="Thurandaut Ring +1",
  658.         ring1={name="Stikini Ring +1", bag="wardrobe2"},
  659.         ring2={name="Stikini Ring +1", bag="wardrobe4"},
  660.         back={ name="Campestres's Cape", augments={'Pet: Acc.+20 Pet: R.Acc.+20 Pet: Atk.+20 Pet: R.Atk.+20','Eva.+20 /Mag. Eva.+20','Pet: Attack+10 Pet: Rng.Atk.+10','Pet: "Regen"+10','Pet: Damage taken -5%',}},
  661.         waist="Isa Belt",
  662.         legs="Bunzi's Pants",
  663.         feet={ name="Telchine Pigaches", augments={'Pet: DEF+14','Pet: "Regen"+3','Pet: Damage taken -4%',}}
  664.     }
  665.    
  666.     sets.aftercast.Opashoro = set_combine(sets.aftercast, {})
  667.     -- When using Opashoro's aftermath I need more perp down that usual
  668.     sets.aftercast.Opashoro.Avatar = set_combine(sets.aftercast.Avatar, {
  669.         body="Beckoner's Doublet +3",
  670.     })
  671.     sets.aftercast.Opashoro.Avatar.Engaged = set_combine(sets.aftercast.Opashoro.Avatar, {})
  672.    
  673.  
  674.     -- Sets below this point are very niche. You can safely skip them and any modes that use them if you want.
  675.    
  676.     -- These 2 sets are for when you're in DD mode but not actually engaged to something.
  677.     sets.aftercast.DD = set_combine(sets.aftercast, {
  678.     })
  679.    
  680.     sets.aftercast.DD.Avatar = set_combine(sets.aftercast.Avatar, {
  681.     })
  682.    
  683.     -- Main melee set
  684.     -- If you want specific things equipped only when an avatar is out, modify "sets.aftercast.DD.Avatar.Engaged" below.
  685.     sets.aftercast.DD.Engaged = set_combine(sets.aftercast.DD.Avatar, {
  686.         --head="Beckoner's Horn +3",
  687.         head="Bunzi's Hat",
  688.         neck="Shulmanu Collar",
  689.         ear1="Telos Earring",
  690.         ear2="Cessance Earring",
  691.         body="Tali'ah Manteel +2",
  692.         hands="Bunzi's Gloves",
  693.         ring1={ name="Chirich Ring +1", bag="wardrobe2" },
  694.         ring2="Fickblix's Ring",
  695.         back={ name="Campestres's Cape", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Dbl.Atk."+10','Phys. dmg. taken-10%',}},
  696.         waist="Cetl Belt",
  697.         legs="Nyame Flanchard",
  698.         feet="Beckoner's Pigaches +3"
  699.     })
  700.    
  701.     -- Main melee set when engaged with an avatar out. Usually doesn't have many changes from the above set.
  702.     sets.aftercast.DD.Avatar.Engaged = set_combine(sets.aftercast.DD.Engaged, {
  703.         --ear2="Sroda Earring"
  704.     })
  705.  
  706.     sets.aftercast.Enspell = set_combine(sets.aftercast, {})
  707.     sets.aftercast.Enspell.Avatar = set_combine(sets.aftercast.Avatar, {})
  708.    
  709.     -- Enspell set I mainly use for Peach Power. Load up on accuracy & magic accuracy. Doesn't seem to help much honestly, it's a work in progress.
  710.     sets.aftercast.Enspell.Engaged = set_combine(sets.aftercast.DD.Avatar.Engaged, {
  711.         ear1="Crepuscular Earring",
  712.         ear2="Beckoner's Earring +1",
  713.         body="Beckoner's Doublet +3", --replaces feet for perp cost
  714.         ring1="Metamorph Ring +1",
  715.         waist="Orpheus's Sash",
  716.         feet="Nyame Sollerets",
  717.     })
  718.     sets.aftercast.Enspell.Avatar.Engaged = set_combine(sets.aftercast.Enspell.Engaged, {})
  719.    
  720.     sets.aftercast.Favor = set_combine(sets.aftercast, {
  721.     })
  722.    
  723.     -- Used when IdleMode is "Favor" to maximize avatar's favor effect.
  724.     -- Skill tiers are 512 / 575 / 670 / 735
  725.     sets.aftercast.Favor.Avatar = set_combine(sets.aftercast.Avatar, {
  726.         head="Beckoner's Horn +3",
  727.         --ear2="Lodurr Earring",
  728.         body="Beckoner's Doublet +3",
  729.         hands="Baayami Cuffs +1",
  730.         legs="Baayami Slops +1",
  731.         feet="Baayami Sabots +1"
  732.     })
  733.  
  734.     sets.aftercast.PetDD = set_combine(sets.aftercast, {
  735.     })
  736.  
  737.     -- Avatar Melee set. You really don't need this set. It's only here because I can't bring myself to throw it away.
  738.     sets.aftercast.PetDD.Avatar = set_combine(sets.aftercast.Avatar, {
  739.         ear2="Rimeice Earring",
  740.         body="Glyphic Doublet +3",
  741.         hands={ name="Helios Gloves", augments={'Pet: Accuracy+22 Pet: Rng. Acc.+22','Pet: "Dbl. Atk."+8','Pet: Haste+6',}},
  742.         ring2="Fickblix's Ring",
  743.         waist="Klouskap Sash",
  744.         feet={ name="Helios Boots", augments={'Pet: Accuracy+21 Pet: Rng. Acc.+21','Pet: "Dbl. Atk."+8','Pet: Haste+6',}}
  745.     })
  746.  
  747.     sets.aftercast.Zendik = set_combine(sets.aftercast, {
  748.         body="Zendik Robe"
  749.     })
  750.     -- sets.aftercast.Zendik.ForceIlvl = set_combine(sets.aftercast.Zendik, {
  751.         -- feet="Baayami Sabots +1"
  752.     -- })
  753.     sets.aftercast.Zendik.LowMP = set_combine(sets.aftercast.Zendik, {
  754.         waist="Fucho-no-obi"
  755.     })
  756.     -- sets.aftercast.Zendik.LowMP.ForceIlvl = set_combine(sets.aftercast.Zendik.LowMP, {
  757.         -- feet="Baayami Sabots +1"
  758.     -- })
  759.  
  760.     sets.aftercast.Zendik.Avatar = set_combine(sets.aftercast.Favor.Avatar, {
  761.         body="Zendik Robe"
  762.     })
  763.  
  764.     -- I use this mode for Mewing Lullaby duty in V20+ Gaol. Heaviest defense possible, less attention toward MP management.
  765.     sets.aftercast.MEva = set_combine(sets.aftercast.DT, {
  766.         sub="Khonsu",
  767.         hands="Nyame Gauntlets",
  768.         feet="Baayami Sabots +1"
  769.     })
  770.  
  771.     sets.aftercast.MEva.Avatar = set_combine(sets.aftercast.MEva, {
  772.         ear1="Enmerkar Earring",
  773.         waist="Isa Belt",
  774.         back={ name="Campestres's Cape", augments={'Pet: Acc.+20 Pet: R.Acc.+20 Pet: Atk.+20 Pet: R.Atk.+20','Eva.+20 /Mag. Eva.+20','Pet: Attack+10 Pet: Rng.Atk.+10','Pet: "Regen"+10','Pet: Damage taken -5%',}},
  775.     })
  776.  
  777.     -- Idle set used when you have a spirit summoned. Glyphic Spats will make them cast more frequently.
  778.     sets.aftercast.Spirit = {
  779.         main="Nirvana",
  780.         sub="Vox Grip",
  781.         ammo="Epitaph",
  782.         head="Beckoner's Horn +3",
  783.         neck="Incanter's Torque",
  784.         ear1="Cath Palug Earring",
  785.         ear2="Evans Earring",
  786.         body="Baayami Robe +1",
  787.         hands="Baayami Cuffs +1",
  788.         ring1={name="Stikini Ring +1", bag="wardrobe2"},
  789.         ring2="Evoker's Ring",
  790.         back={ name="Conveyance Cape", augments={'Summoning magic skill +5','Pet: Enmity+12','Blood Pact Dmg.+2',}},
  791.         waist="Lucidity Sash",
  792.         legs="Glyphic Spats +3",
  793.         feet="Baayami Sabots +1"
  794.     }
  795.     sets.aftercast.Favor.Spirit = set_combine(sets.aftercast.Spirit, {
  796.     })
  797.     sets.aftercast.Zendik.Spirit = set_combine(sets.aftercast.Favor.Spirit, {
  798.     })
  799.    
  800.     sets.aftercast.Town = set_combine(sets.aftercast.Avatar, {
  801.         main="Opashoro",
  802.         sub="Oneiros Grip",
  803.         neck="Summoner's Collar +2",
  804.         hands="Nyame Gauntlets",
  805.         ring1="Shneddick Ring +1",
  806.         ring2="Fickblix's Ring",
  807.         waist="Ninurta's Sash",
  808.         legs="Bunzi's Pants",
  809.     })
  810.  
  811.     -- ===================================================================================================================
  812.     --      End of Sets
  813.     -- ===================================================================================================================
  814.  
  815.     Buff_BPs_Duration = S{'Shining Ruby','Aerial Armor','Frost Armor','Rolling Thunder','Crimson Howl','Lightning Armor','Ecliptic Growl','Glittering Ruby','Earthen Ward','Hastega','Noctoshield','Ecliptic Howl','Dream Shroud','Earthen Armor','Fleet Wind','Inferno Howl','Heavenward Howl','Hastega II','Soothing Current','Crystal Blessing','Katabatic Blades'}
  816.     Buff_BPs_Healing = S{'Healing Ruby','Healing Ruby II','Whispering Wind','Spring Water'}
  817.     Buff_BPs_MND = S{"Wind's Blessing"}
  818.     Debuff_BPs = S{'Mewing Lullaby','Eerie Eye','Lunar Cry','Lunar Roar','Nightmare','Pavor Nocturnus','Ultimate Terror','Somnolence','Slowga','Tidal Roar','Diamond Storm','Sleepga','Shock Squall','Bitter Elegy','Lunatic Voice'}
  819.     Debuff_Rage_BPs = S{'Moonlit Charge','Tail Whip'}
  820.  
  821.     Magic_BPs_NoTP = S{'Holy Mist','Nether Blast','Aerial Blast','Searing Light','Diamond Dust','Earthen Fury','Zantetsuken','Tidal Wave','Judgment Bolt','Inferno','Howling Moon','Ruinous Omen','Night Terror','Thunderspark','Tornado II','Sonic Buffet'}
  822.     Magic_BPs_TP = S{'Impact','Conflag Strike','Level ? Holy','Lunar Bay'}
  823.     Merit_BPs = S{'Meteor Strike','Geocrush','Grand Fall','Wind Blade','Heavenly Strike','Thunderstorm'}
  824.     Physical_BPs_TP = S{'Rock Buster','Mountain Buster','Crescent Fang','Spinning Dive','Roundhouse'}
  825.    
  826.     ZodiacElements = S{'Fire','Earth','Water','Wind','Ice','Lightning'}
  827.  
  828.     TownIdle = S{"windurst woods","windurst waters","windurst walls","port windurst","bastok markets","bastok mines","port bastok","southern san d'oria","northern san d'oria","port san d'oria","upper jeuno","lower jeuno","port jeuno","ru'lude gardens","norg","kazham","tavnazian safehold","rabao","selbina","mhaura","aht urhgan whitegate","al zahbi","nashmau","western adoulin","eastern adoulin"}
  829.     --Salvage = S{"Bhaflau Remnants","Zhayolm Remnants","Arrapago Remnants","Silver Sea Remnants"}
  830.  
  831.     -- Select initial macro set and set lockstyle
  832.     -- This section likely requires changes or removal if you aren't Pergatory
  833.     -- NOTE: This doesn't change your macro set for you during play, your macros have to do that. This is just for when the Lua is loaded.
  834.     if pet.isvalid then
  835.         if pet.name=='Fenrir' then
  836.             send_command('input /macro book 10;wait .1;input /macro set 2;wait 3;input /lockstyleset '..StartLockStyle)
  837.         elseif pet.name=='Ifrit' then
  838.             send_command('input /macro book 10;wait .1;input /macro set 3;wait 3;input /lockstyleset '..StartLockStyle)
  839.         elseif pet.name=='Titan' then
  840.             send_command('input /macro book 10;wait .1;input /macro set 4;wait 3;input /lockstyleset '..StartLockStyle)
  841.         elseif pet.name=='Leviathan' then
  842.             send_command('input /macro book 10;wait .1;input /macro set 5;wait 3;input /lockstyleset '..StartLockStyle)
  843.         elseif pet.name=='Garuda' then
  844.             send_command('input /macro book 10;wait .1;input /macro set 6;wait 3;input /lockstyleset '..StartLockStyle)
  845.         elseif pet.name=='Shiva' then
  846.             send_command('input /macro book 10;wait .1;input /macro set 7;wait 3;input /lockstyleset '..StartLockStyle)
  847.         elseif pet.name=='Ramuh' then
  848.             send_command('input /macro book 10;wait .1;input /macro set 8;wait 3;input /lockstyleset '..StartLockStyle)
  849.         elseif pet.name=='Diabolos' then
  850.             send_command('input /macro book 10;wait .1;input /macro set 9;wait 3;input /lockstyleset '..StartLockStyle)
  851.         elseif pet.name=='Cait Sith' then
  852.             send_command('input /macro book 11;wait .1;input /macro set 2;wait 3;input /lockstyleset '..StartLockStyle)
  853.         elseif pet.name=='Siren' then
  854.             send_command('input /macro book 11;wait .1;input /macro set 4;wait 3;input /lockstyleset '..StartLockStyle)
  855.         end
  856.     else
  857.         send_command('input /macro book 10;wait .1;input /macro set 1;wait 3;input /lockstyleset '..StartLockStyle)
  858.     end
  859.     -- End macro set / lockstyle section
  860. end
  861.  
  862. -- ===================================================================================================================
  863. --      Gearswap rules below this point - Modify at your own peril
  864. -- ===================================================================================================================
  865.  
  866. function pretarget(spell,action)
  867.     if not buffactive['Muddle'] then
  868.         -- Auto Remedy --
  869.         if AutoRemedy and (spell.action_type == 'Magic' or spell.type == 'JobAbility') then
  870.             if buffactive['Paralysis'] or (buffactive['Silence'] and not AutoEcho) then
  871.                 cancel_spell()
  872.                 send_command('input /item "Remedy" <me>')
  873.             end
  874.         end
  875.         -- Auto Echo Drop --
  876.         if AutoEcho and spell.action_type == 'Magic' and buffactive['Silence'] then
  877.             cancel_spell()
  878.             send_command('input /item "Echo Drops" <me>')
  879.         end
  880.     end
  881. end
  882.  
  883. function precast(spell)
  884.     if (pet.isvalid and pet_midaction() and not spell.type=="SummonerPact") or spell.type=="Item" then
  885.         -- Do not swap if pet is mid-action. I added the type=SummonerPact check because sometimes when the avatar
  886.         -- dies mid-BP, pet.isvalid and pet_midaction() continue to return true for a brief time.
  887.         return
  888.     end
  889.     -- Spell fast cast
  890.     if sets.precast[spell.english] then
  891.         equip(sets.precast[spell.english])
  892.     elseif spell.action_type=="Magic" then
  893.         if spell.name=="Stoneskin" then
  894.             equip(sets.precast.FC,{waist="Siegel Sash"})
  895.         else
  896.             equip(sets.precast.FC)
  897.         end
  898.     end
  899. end
  900.  
  901. function midcast(spell)
  902.     if (pet.isvalid and pet_midaction()) or spell.type=="Item" then
  903.         return
  904.     end
  905.     -- BP Timer gear needs to swap here
  906.     if (spell.type=="BloodPactWard" or spell.type=="BloodPactRage") then
  907.         if not buffactive["Astral Conduit"] then
  908.             equipSet = sets.midcast.BP
  909.             if equipSet[spell.name] then
  910.                 equipSet = equipSet[spell.name]
  911.             end
  912.             equip(equipSet)
  913.         end
  914.         -- If lag compensation mode is on, set up a timer to equip the BP gear.
  915.         if LagMode then
  916.             send_command('wait 0.5;gs c EquipBP '..spell.name)
  917.         end
  918.     -- Spell Midcast & Potency Stuff
  919.     elseif sets.midcast[spell.english] then
  920.         equip(sets.midcast[spell.english])
  921.     elseif spell.name=="Elemental Siphon" then
  922.         if pet.element==world.day_element and ZodiacElements:contains(pet.element) then
  923.             if pet.element==world.weather_element then
  924.                 equip(sets.midcast.SiphonWeatherZodiac)
  925.             else
  926.                 equip(sets.midcast.SiphonZodiac)
  927.             end
  928.         else
  929.             if pet.element==world.weather_element then
  930.                 equip(sets.midcast.SiphonWeather)
  931.             else
  932.                 equip(sets.midcast.Siphon)
  933.             end
  934.         end
  935.     elseif spell.type=="SummonerPact" then
  936.         equip(sets.midcast.Summon)
  937.     elseif string.find(spell.name,"Cure") or string.find(spell.name,"Curaga") then
  938.         equip(sets.midcast.Cure)
  939.     elseif string.find(spell.name,"Protect") or string.find(spell.name,"Shell") then
  940.         equip(sets.midcast.Enhancing,{ring2="Sheltered Ring"})
  941.     elseif spell.skill=="Enfeebling Magic" then
  942.         equip(sets.midcast.Enfeeble)
  943.     elseif spell.skill=="Enhancing Magic" then
  944.         equip(sets.midcast.Enhancing)
  945.     elseif spell.skill=="Elemental Magic" then
  946.         equip(sets.midcast.Nuke)
  947.     elseif spell.action_type=="Magic" then
  948.         equip(sets.midcast.EnmityRecast)
  949.     else
  950.         idle()
  951.     end
  952.     -- Treasure Hunter
  953.     if TreasureHunter and THSpells:contains(spell.name) then
  954.         equip(sets.TH)
  955.     end
  956.     -- Auto-cancel existing buffs
  957.     if spell.name=="Stoneskin" and buffactive["Stoneskin"] then
  958.         windower.send_command('cancel 37;')
  959.     elseif spell.name=="Sneak" and buffactive["Sneak"] and spell.target.type=="SELF" then
  960.         windower.send_command('cancel 71;')
  961.     elseif spell.name=="Utsusemi: Ichi" and buffactive["Copy Image"] then
  962.         windower.send_command('wait 1;cancel 66;')
  963.     end
  964. end
  965.  
  966. function aftercast(spell)
  967.     if pet_midaction() or spell.type=="Item" then
  968.         return
  969.     end
  970.     if not string.find(spell.type,"BloodPact") then
  971.         idle()
  972.     end
  973. end
  974.  
  975. function pet_change(pet,gain)
  976.     if (not (gain and pet_midaction())) then
  977.         idle()
  978.     end
  979. end
  980.  
  981. function status_change(new,old)
  982.     if not midaction() and not pet_midaction() then
  983.         idle()
  984.     end
  985. end
  986.  
  987. function buff_change(name,gain)
  988.     if name=="quickening" and not pet_midaction() then
  989.         idle()
  990.     end
  991.     if SacTorque and name=="sleep" and gain and pet.isvalid then
  992.         equip({neck="Sacrifice Torque"})
  993.         disable("neck")
  994.         if buffactive["Stoneskin"] then
  995.             windower.send_command('cancel 37;')
  996.         end
  997.     end
  998.     if SacTorque and name=="sleep" and not gain then
  999.         enable("neck")
  1000.     end
  1001. end
  1002.  
  1003. function pet_midcast(spell)
  1004.     if not LagMode then
  1005.         equipBPGear(spell.name)
  1006.     end
  1007. end
  1008.  
  1009. function pet_aftercast(spell)
  1010.     idle()
  1011. end
  1012.  
  1013. function equipBPGear(spell)
  1014.     if spell=="Shock Squall" then
  1015.         return -- Don't bother for Shock Squall, it already went off by the time we get here
  1016.     end
  1017.     if spell=="Perfect Defense" then
  1018.         equip(sets.pet_midcast.SummoningMagic)
  1019.     elseif Debuff_BPs:contains(spell) then
  1020.         equip(sets.pet_midcast.MagicAcc_BP)
  1021.     elseif Buff_BPs_Healing:contains(spell) then
  1022.         equip(sets.pet_midcast.Buff_Healing)
  1023.     elseif Buff_BPs_Duration:contains(spell) then
  1024.         equip(sets.pet_midcast.Buff)
  1025.     elseif Buff_BPs_MND:contains(spell) then
  1026.         equip(sets.pet_midcast.Buff_MND)
  1027.     elseif spell=="Flaming Crush" then
  1028.         if AccMode then
  1029.             equip(sets.pet_midcast.FlamingCrush_Acc)
  1030.         else
  1031.             equip(sets.pet_midcast.FlamingCrush)
  1032.         end
  1033.     elseif ImpactDebuff and (spell=="Impact" or spell=="Conflag Strike") then
  1034.         equip(sets.pet_midcast.Impact)
  1035.     elseif Magic_BPs_NoTP:contains(spell) then
  1036.         if AccMode then
  1037.             equip(sets.pet_midcast.Magic_BP_NoTP_Acc)
  1038.         else
  1039.             equip(sets.pet_midcast.Magic_BP_NoTP)
  1040.         end
  1041.     elseif Magic_BPs_TP:contains(spell) or string.find(spell," II") or string.find(spell," IV") then
  1042.         if AccMode then
  1043.             equip(sets.pet_midcast.Magic_BP_TP_Acc)
  1044.         else
  1045.             equip(sets.pet_midcast.Magic_BP_TP)
  1046.         end
  1047.     elseif Merit_BPs:contains(spell) then
  1048.         if AccMode then
  1049.             equip(sets.pet_midcast.Magic_BP_TP_Acc)
  1050.         elseif spell=="Meteor Strike" and MeteorStrike>4 then
  1051.             equip(sets.pet_midcast.Magic_BP_NoTP)
  1052.         elseif spell=="Geocrush" and Geocrush>4 then
  1053.             equip(sets.pet_midcast.Magic_BP_NoTP)
  1054.         elseif spell=="Grand Fall" and GrandFall>4 then
  1055.             equip(sets.pet_midcast.Magic_BP_NoTP)
  1056.         elseif spell=="Wind Blade" and WindBlade>4 then
  1057.             equip(sets.pet_midcast.Magic_BP_NoTP)
  1058.         elseif spell=="Heavenly Strike" and HeavenlyStrike>4 then
  1059.             equip(sets.pet_midcast.Magic_BP_NoTP)
  1060.         elseif spell=="Thunderstorm" and Thunderstorm>4 then
  1061.             equip(sets.pet_midcast.Magic_BP_NoTP)
  1062.         else
  1063.             equip(sets.pet_midcast.Magic_BP_TP)
  1064.         end
  1065.     elseif Debuff_Rage_BPs:contains(spell) then
  1066.         equip(sets.pet_midcast.Debuff_Rage)
  1067.     else
  1068.         if AccMode then
  1069.             equip(sets.pet_midcast.Physical_BP_Acc)
  1070.         elseif Physical_BPs_TP:contains(spell) then
  1071.             equip(sets.pet_midcast.Physical_BP_TP)
  1072.         elseif buffactive["Aftermath: Lv.3"] and not IdleMode=="Opashoro" then
  1073.             equip(sets.pet_midcast.Physical_BP_AM3)
  1074.         else
  1075.             equip(sets.pet_midcast.Physical_BP)
  1076.         end
  1077.     end
  1078.     -- Custom Timers
  1079.     if spell=="Mewing Lullaby" and string.find(world.area,"Walk of Echoes %[P") then
  1080.         send_command('timers create "Mewing Resist: can go @ 30s" 60 down') -- In Gaol, underperforms if used every 20s. 60s is full potency.
  1081.         -- Tip: I found it was best to go after 30 seconds. It doesn't fully drain them but you can't afford to wait the full 60.
  1082.         -- Use the time between this to use BP:Rages for additional damage! They feed no TP, as long as your avatar doesn't attack.
  1083.     end
  1084. end
  1085.  
  1086. -- This command is called whenever you input "gs c <command>"
  1087. function self_command(command)
  1088.     is_valid = command:lower()=="idle"
  1089.    
  1090.     for _, v in ipairs(IdleModes) do
  1091.         if command:lower()==v:lower() then
  1092.             IdleMode = v
  1093.             send_command('console_echo "Idle Mode: ['..IdleMode..']"')
  1094.             idle()
  1095.             return
  1096.         end
  1097.     end
  1098.     if string.sub(command,1,7)=="EquipBP" then
  1099.         equipBPGear(string.sub(command,9,string.len(command)))
  1100.         return
  1101.     elseif command:lower()=="accmode" then
  1102.         AccMode = AccMode==false
  1103.         is_valid = true
  1104.         send_command('console_echo "AccMode: '..tostring(AccMode)..'"')
  1105.     elseif command:lower()=="impactmode" then
  1106.         ImpactDebuff = ImpactDebuff==false
  1107.         is_valid = true
  1108.         send_command('console_echo "Impact Debuff: '..tostring(ImpactDebuff)..'"')
  1109.     elseif command:lower()=="forceilvl" then
  1110.         ForceIlvl = ForceIlvl==false
  1111.         is_valid = true
  1112.         send_command('console_echo "Force iLVL: '..tostring(ForceIlvl)..'"')
  1113.     elseif command:lower()=="lagmode" then
  1114.         LagMode = LagMode==false
  1115.         is_valid = true
  1116.         send_command('console_echo "Lag Compensation Mode: '..tostring(LagMode)..'"')
  1117.     elseif command:lower()=="th" then
  1118.         TreasureHunter = TreasureHunter==false
  1119.         is_valid = true
  1120.         send_command('console_echo "Treasure Hunter Mode: '..tostring(TreasureHunter)..'"')
  1121.     elseif command:lower()=="test" then
  1122.         TestMode = TestMode==false
  1123.         is_valid = true
  1124.         send_command('console_echo "Test Mode: '..tostring(TestMode)..'"')
  1125.     elseif command:lower()=="weaponlock" then
  1126.         if WeaponLock then
  1127.             enable("main","sub")
  1128.             WeaponLock = false
  1129.         else
  1130.             equip({main="Nirvana",sub="Elan Strap +1"})
  1131.             disable("main","sub")
  1132.             WeaponLock = true
  1133.         end
  1134.         is_valid = true
  1135.         send_command('console_echo "Weapon Lock: '..tostring(WeaponLock)..'"')
  1136.     elseif command=="ToggleIdle" then
  1137.         is_valid = true
  1138.         -- If you want to change the sets cycled with F9, this is where you do it
  1139.         if IdleMode=="Refresh" then
  1140.             IdleMode = "DT"
  1141.         elseif IdleMode=="DT" then
  1142.             IdleMode = "PetDT"
  1143.         elseif IdleMode=="PetDT" then
  1144.             IdleMode = "DD"
  1145.         else
  1146.             IdleMode = "Refresh"
  1147.         end
  1148.         send_command('console_echo "Idle Mode: ['..IdleMode..']"')
  1149.     elseif command:lower()=="lowhp" then
  1150.         -- Use for "Cure 500 HP" objectives in Omen
  1151.         equip({head="Apogee Crown +1",body={ name="Apo. Dalmatica +1", augments={'MP+80','Pet: "Mag.Atk.Bns."+35','Blood Pact Dmg.+8',}},legs="Apogee Slacks +1",feet="Apogee Pumps +1",back="Campestres's Cape"})
  1152.         return
  1153.     elseif string.sub(command:lower(),1,12)=="meteorstrike" then
  1154.         MeteorStrike = string.sub(command,13,13)
  1155.         send_command('console_echo "Meteor Strike: '..MeteorStrike..'/5"')
  1156.         is_valid = true
  1157.     elseif string.sub(command:lower(),1,8)=="geocrush" then
  1158.         Geocrush = string.sub(command,9,9)
  1159.         send_command('console_echo "Geocrush: '..Geocrush..'/5"')
  1160.         is_valid = true
  1161.     elseif string.sub(command:lower(),1,9)=="grandfall" then
  1162.         GrandFall = string.sub(command,10,10)
  1163.         send_command('console_echo "Grand Fall: '..GrandFall..'/5"')
  1164.         is_valid = true
  1165.     elseif string.sub(command:lower(),1,9)=="windblade" then
  1166.         WindBlade = +string.sub(command,10,10)
  1167.         send_command('console_echo "Wind Blade: '..WindBlade..'/5"')
  1168.         is_valid = true
  1169.     elseif string.sub(command:lower(),1,14)=="heavenlystrike" then
  1170.         HeavenlyStrike = string.sub(command,15,15)
  1171.         send_command('console_echo "Heavenly Strike: '..HeavenlyStrike..'/5"')
  1172.         is_valid = true
  1173.     elseif string.sub(command:lower(),1,12)=="thunderstorm" then
  1174.         Thunderstorm = string.sub(command,13,13)
  1175.         send_command('console_echo "Thunderstorm: '..Thunderstorm..'/5"')
  1176.         is_valid = true
  1177.     elseif command:lower()=="opa" then
  1178.         is_valid = true
  1179.         enable("main","sub")
  1180.         equip({main="Opashoro",sub="Elan Strap +1"})
  1181.         if WeaponLock then
  1182.             disable("main","sub")
  1183.         end
  1184.     end
  1185.  
  1186.     if is_valid then
  1187.         if not midaction() and not pet_midaction() then
  1188.             idle()
  1189.         end
  1190.     else
  1191.         sanitized = command:gsub("\"", "")
  1192.         send_command('console_echo "Invalid self_command: '..sanitized..'"') -- Note: If you use Gearinfo, comment out this line
  1193.     end
  1194. end
  1195.  
  1196. -- This function is for returning to aftercast gear after an action/event.
  1197. function idle()
  1198.     equipSet = sets.aftercast
  1199.     if TownIdle:contains(world.area:lower()) then
  1200.         equipSet = sets.aftercast.Town
  1201.     end
  1202.     if equipSet[IdleMode] then
  1203.         equipSet = equipSet[IdleMode]
  1204.     end
  1205.     if pet.isvalid then
  1206.         if equipSet[pet.name] then
  1207.             equipSet = equipSet[pet.name]
  1208.         elseif string.find(pet.name,'Spirit') and equipSet["Spirit"] then
  1209.             equipSet = equipSet["Spirit"]
  1210.         elseif equipSet["Avatar"] then
  1211.             equipSet = equipSet["Avatar"]
  1212.         end
  1213.     end
  1214.     if equipSet[player.status] then
  1215.         equipSet = equipSet[player.status]
  1216.     end
  1217.     if player.mpp < 50 and equipSet["LowMP"] then
  1218.         equipSet = equipSet["LowMP"]
  1219.     end
  1220.     if ForceIlvl and equipSet["ForceIlvl"] then
  1221.         equipSet = equipSet["ForceIlvl"]
  1222.     end
  1223.     equip(equipSet)
  1224.  
  1225.     if (buffactive['Quickening'] or buffactive['Sneak'] or buffactive['Invisible']) and IdleMode~='DT' then
  1226.         --if not ForceIlvl then
  1227.             equip(sets.Movement)
  1228.         --end
  1229.     end
  1230.     -- Balrahn's Ring
  1231.     --if Salvage:contains(world.area) then
  1232.     --  equip({ring2="Balrahn's Ring"})
  1233.     --end
  1234.     -- Maquette Ring
  1235.     --if world.area=='Maquette Abdhaljs-Legion' and not IdleMode=='DT' then
  1236.     --  equip({ring2="Maquette Ring"})
  1237.     --end
  1238. end
Add Comment
Please, Sign In to add comment