Advertisement
Guest User

COR.lua

a guest
Jan 9th, 2016
667
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 24.16 KB | None | 0 0
  1. -------------------------------------------------------------------------------------------------------------------
  2. -- Setup functions for this job.  Generally should not be modified.
  3. -------------------------------------------------------------------------------------------------------------------
  4.  
  5. --[[
  6.     gs c toggle LuzafRing -- Toggles use of Luzaf Ring on and off
  7.    
  8.     Offense mode is melee or ranged.  Used ranged offense mode if you are engaged
  9.     for ranged weaponskills, but not actually meleeing.
  10.    
  11.     Weaponskill mode, if set to 'Normal', is handled separately for melee and ranged weaponskills.
  12. --]]
  13.  
  14. include 'organizer-lib'
  15.  
  16. -- Initialization function for this job file.
  17. function get_sets()
  18.     mote_include_version = 2
  19.    
  20.     -- Load and initialize the include file.
  21.     include('Mote-Include.lua')
  22. end
  23.  
  24. -- Setup vars that are user-independent.  state.Buff vars initialized here will automatically be tracked.
  25. function job_setup()
  26.     -- Whether to use Luzaf's Ring
  27.     state.LuzafRing = M(false, "Luzaf's Ring")
  28.     -- Whether a warning has been given for low ammo
  29.     state.warned = M(false)
  30.  
  31.     define_roll_values()
  32. end
  33.  
  34. -------------------------------------------------------------------------------------------------------------------
  35. -- User setup functions for this job.  Recommend that these be overridden in a sidecar file.
  36. -------------------------------------------------------------------------------------------------------------------
  37.  
  38. -- Setup vars that are user-dependent.  Can override this function in a sidecar file.
  39. function user_setup()
  40.     state.OffenseMode:options('Ranged', 'Melee', 'Acc')
  41.     state.RangedMode:options('Normal', 'Acc')
  42.     state.WeaponskillMode:options('Normal', 'Acc', 'Att', 'Mod')
  43.     state.CastingMode:options('Normal', 'Resistant')
  44.     state.IdleMode:options('Normal', 'PDT', 'Refresh')
  45.  
  46.     gear.RAbullet = "Adlivun Bullet"
  47.     gear.WSbullet = "Divine Bullet"
  48.     gear.MAbullet = "Divine Bullet"
  49.     gear.QDbullet = "Animikii Bullet"
  50.     options.ammo_warning_limit = 15
  51.  
  52.     -- Additional local binds
  53.     send_command('bind ^` input /ja "Double-up" <me>')
  54.     send_command('bind !` input /ja "Bolter\'s Roll" <me>')
  55.  
  56.     select_default_macro_book()
  57. end
  58.  
  59.  
  60. -- Called when this job file is unloaded (eg: job change)
  61. function user_unload()
  62.     send_command('unbind ^`')
  63.     send_command('unbind !`')
  64. end
  65.  
  66. -- Define sets and vars used by this job file.
  67. function init_gear_sets()
  68.    
  69.     --------------------------------------
  70.     -- Start defining the sets
  71.     --------------------------------------
  72.    
  73.     -- Gear for organizer to collect
  74.         sets.org1 = {range="Doomsday",
  75.         main="Fettering Blade",
  76.         sub="Odium"}
  77.         sets.org2 = {range="Compensator"}
  78.         sets.org3 = {range="Holliday"}
  79.  
  80.     -- Precast Sets
  81.     -- Precast sets to enhance JA
  82.     sets.precast.JA['Triple Shot'] = {body="Chasseur's Frac +1"}
  83.     sets.precast.JA['Snake Eye'] = {legs="Lanun Culottes +1"}
  84.     sets.precast.JA['Wild Card'] = {feet="Lanun Bottes +1"}
  85.     sets.precast.JA['Random Deal'] = {body="Lanun Frac +1"}
  86.     sets.precast.CorsairRoll = {head="Lanun Tricorne +1",
  87.         hands="Chasseur's Gants +1",
  88.         ring1="Barataria Ring",
  89.         back={ name="Gunslinger's Cape", augments={'Enmity-2','"Mag.Atk.Bns."+1','"Phantom Roll" ability delay -5','Weapon skill damage +1%',}}}  
  90.     sets.precast.CorsairRoll["Caster's Roll"] = set_combine(sets.precast.CorsairRoll, {legs="Nvrch. Culottes +2"})
  91.     sets.precast.CorsairRoll["Courser's Roll"] = set_combine(sets.precast.CorsairRoll, {feet="Chass. Bottes +1"})
  92.     sets.precast.CorsairRoll["Blitzer's Roll"] = set_combine(sets.precast.CorsairRoll, {head="Chass. Tricorne +1"})
  93.     sets.precast.CorsairRoll["Tactician's Roll"] = set_combine(sets.precast.CorsairRoll, {body="Chasseur's Frac +1"})
  94.     sets.precast.CorsairRoll["Allies' Roll"] = set_combine(sets.precast.CorsairRoll, {hands="Chasseur's Gants +1"})
  95.     sets.precast.LuzafRing = {ring2="Luzaf's Ring"}
  96.     sets.precast.FoldDoubleBust = {hands="Lanun Gants +1"}
  97.     sets.precast.CorsairShot = {}
  98.    
  99.     -- Waltz set (chr and vit)
  100.     sets.precast.Waltz = {}
  101.        
  102.     -- Don't need any special gear for Healing Waltz.
  103.     sets.precast.Waltz['Healing Waltz'] = {}
  104.  
  105.     -- Fast cast sets for spells
  106.     sets.precast.FC = {head="Haruspex Hat",
  107.         ear1="Etiolation Earring",
  108.         ear2="Loquacious Earring",
  109.         body="Taeon Tabard",
  110.         hands="Leyline Gloves",
  111.         ring1="Prolix Ring",
  112.         legs="Taeon Tights",
  113.         feet="Taeon Boots"}
  114.     sets.precast.FC.Utsusemi = set_combine(sets.precast.FC, {neck="Magoraga Beads",back="Mujin Mantle"})
  115.    
  116.     -- Gear for snapshot
  117.     sets.precast.RA = {ammo=gear.RAbullet,
  118.         head="Aurore Beret +1",
  119.         body="Pursuer's Doublet",
  120.         hands="Lanun Gants +1",
  121.         back="Navarch's Mantle",
  122.         legs="Nahtirah Trousers",
  123.         feet="Wurrukatte Boots"}
  124.        
  125.     -- Weaponskill sets
  126.     -- Default set for any weaponskill that isn't any more specifically defined
  127.     sets.precast.WS = {}
  128.  
  129.     -- Specific weaponskill sets.  Uses the base set if an appropriate WSMod version isn't found.
  130.     sets.precast.WS['Evisceration'] = sets.precast.WS
  131.     sets.precast.WS['Exenterator'] = sets.precast.WS
  132.     sets.precast.WS['Requiescat'] = sets.precast.WS
  133.     sets.precast.WS['Last Stand'] = {ammo=gear.WSbullet,
  134.         head="Chass. Tricorne +1",
  135.         neck="Fotia Gorget",
  136.         ear1="Clearview Earring",
  137.         ear2="Enervating Earring",
  138.         body="Pursuer's Doublet",
  139.         hands="Pursuer's Cuffs",
  140.         ring1="Karieyh Ring",
  141.         ring2="Bellona's Ring",
  142.         back={ name="Gunslinger's Cape", augments={'Enmity-2','"Mag.Atk.Bns."+3','"Phantom Roll" ability delay -2','Weapon skill damage +5%',}},
  143.         waist="Fotia Belt",
  144.         legs="Nahtirah Trousers",
  145.         feet={ name="Herculean Boots", augments={'Rng.Acc.+23 Rng.Atk.+23','"Subtle Blow"+6','DEX+10','Rng.Acc.+15',}},}
  146.     sets.precast.WS['Last Stand'].Acc = {ammo=gear.WSbullet,
  147.         head="Chass. Tricorne +1",
  148.         neck="Fotia Gorget",
  149.         ear1="Clearview Earring",
  150.         ear2="Enervating Earring",
  151.         body="Pursuer's Doublet",
  152.         hands="Floral Gauntlets",
  153.         ring1="Karieyh Ring",
  154.         ring2="Hajduk Ring",
  155.         back={ name="Gunslinger's Cape", augments={'Enmity-2','"Mag.Atk.Bns."+3','"Phantom Roll" ability delay -2','Weapon skill damage +5%',}},
  156.         waist="Fotia Belt",
  157.         legs="Nahtirah Trousers",
  158.         feet={ name="Herculean Boots", augments={'Rng.Acc.+23 Rng.Atk.+23','"Subtle Blow"+6','DEX+10','Rng.Acc.+15',}},}
  159.     sets.precast.WS['Wildfire'] = {ammo=gear.MAbullet,
  160.         head="Herculean Helm",
  161.         neck="Deviant Necklace",
  162.         ear1="Friomisi Earring",
  163.         ear2="Hecate's Earring",
  164.         body="Samnuha Coat",
  165.         hands="Taeon Gloves",
  166.         ring1="Karieyh Ring",
  167.         ring2="Fenrir Ring",
  168.         back={ name="Gunslinger's Cape", augments={'Enmity-2','"Mag.Atk.Bns."+3','"Phantom Roll" ability delay -2','Weapon skill damage +5%',}},   
  169.         waist="Eschan Stone",
  170.         legs="Herculean Trousers",
  171.         feet={ name="Herculean Boots", augments={'"Mag.Atk.Bns."+21','Crit. hit damage +3%','STR+7',}}}
  172.     sets.precast.WS['Wildfire'].Brew = sets.precast.WS['Wildfire']
  173.     sets.precast.WS['Leaden Salute'] = sets.precast.WS['Wildfire']
  174.  
  175.     -- Midcast Sets
  176.     sets.midcast.FastRecast = {}
  177.  
  178.     -- Specific spells and JA
  179.     sets.midcast.Utsusemi = sets.precast.FC.Utsusemi
  180.     sets.midcast.CorsairShot = {ammo=gear.QDbullet,
  181.         head="Herculean Helm",
  182.         neck="Deviant Necklace",
  183.         ear1="Friomisi Earring",
  184.         ear2="Hecate's Earring",
  185.         body="Samnuha Coat",
  186.         hands="Pursuer's Cuffs",
  187.         ring1="Acumen Ring",
  188.         ring2="Fenrir Ring",
  189.         back={ name="Gunslinger's Cape", augments={'Enmity-2','"Mag.Atk.Bns."+3','"Phantom Roll" ability delay -2','Weapon skill damage +5%',}},
  190.         waist="Eschan Stone",
  191.         legs="Herculean Trousers",
  192.         feet={ name="Herculean Boots", augments={'"Mag.Atk.Bns."+21','Crit. hit damage +3%','STR+7',}}}
  193.     sets.midcast.CorsairShot.Acc = {ammo=gear.QDbullet,
  194.         head="Lak. Hat +1",
  195.         neck="Deviant Necklace",
  196.         ear1="Lifestorm Earring",
  197.         ear2="Psystorm Earring",
  198.         body="Samnuha Coat",
  199.         hands="Pursuer's Cuffs",
  200.         ring1="Sangoma Ring",
  201.         ring2="Perception Ring",
  202.         back={ name="Gunslinger's Cape", augments={'Enmity-2','"Mag.Atk.Bns."+3','"Phantom Roll" ability delay -2','Weapon skill damage +5%',}},       
  203.         waist="Eschan Stone",
  204.         legs="Herculean Trousers",
  205.         feet="Lak. Bottes +1"}
  206.     sets.midcast.CorsairShot['Light Shot'] = sets.midcast.CorsairShot.Acc
  207.     sets.midcast.CorsairShot['Dark Shot'] = sets.midcast.CorsairShot.Acc
  208.  
  209.     -- Ranged gear
  210.     sets.midcast.RA = {ammo=gear.RAbullet,
  211.         head="Lanun Tricorne +1",
  212.         neck="Ocachi Gorget",
  213.         ear1="Clearview Earring",
  214.         ear2="Enervating Earring",
  215.         body="Pursuer's Doublet",
  216.         hands="Pursuer's Cuffs",
  217.         ring1="Bellona's Ring",
  218.         ring2="Hajduk Ring",
  219.         back="Libeccio Mantle",
  220.         waist="Eschan Stone",
  221.         legs="Pursuer's Pants",
  222.         feet={ name="Herculean Boots", augments={'Rng.Acc.+23 Rng.Atk.+23','"Subtle Blow"+6','DEX+10','Rng.Acc.+15',}}}
  223.     sets.midcast.RA.Acc = {ammo=gear.RAbullet,
  224.         head="Chass. Tricorne +1",
  225.         neck="Iqabi Necklace",
  226.         ear1="Clearview Earring",
  227.         ear2="Enervating Earring",
  228.         body="Pursuer's Doublet",
  229.         ring2="Hajduk Ring",
  230.         hands="Floral Gauntlets",
  231.         ring1="Hajduk Ring",
  232.         back={ name="Gunslinger's Cape", augments={'Enmity-2','"Mag.Atk.Bns."+3','"Phantom Roll" ability delay -2','Weapon skill damage +5%',}},
  233.         waist="Eschan Stone",
  234.         feet={ name="Herculean Boots", augments={'Rng.Acc.+23 Rng.Atk.+23','"Subtle Blow"+6','DEX+10','Rng.Acc.+15',}},
  235.         legs="Pursuer's Pants"}
  236.  
  237.     -- Sets to return to when not performing an action.
  238.     -- Resting sets
  239.     sets.resting = {}
  240.    
  241.     -- Idle sets
  242.     sets.idle = {ammo=gear.QDbullet,
  243.         head="Chass. Tricorne +1",
  244.         neck="Wiglen Gorget",
  245.         ear1="Darkness Earring",
  246.         ear2="Colossus's Earring",
  247.         body="Chasseur's Frac +1",
  248.         hands="Chasseur's Gants +1",
  249.         ring1="Sheltered Ring",
  250.         ring2="Defending Ring",
  251.         back="Xucau Mantle",
  252.         waist="Flume Belt",
  253.         legs="Blood Cuisses",
  254.         feet="Chass. Bottes +1"}
  255.     sets.idle.Town = {ammo=gear.QDbullet,
  256.         head="Chass. Tricorne +1"
  257.         ,neck="Wiglen Gorget",
  258.         ear1="Darkness Earring",
  259.         ear2="Colossus's Earring",
  260.         body="Chasseur's Frac +1",
  261.         hands="Chasseur's Gants +1",
  262.         ring1="Sheltered Ring",
  263.         ring2="Defending Ring",
  264.         back="Xucau Mantle",
  265.         waist="Flume Belt",
  266.         legs="Blood Cuisses",
  267.         feet="Chass. Bottes +1"}
  268.    
  269.     -- Defense sets
  270.     sets.defense.PDT = {ammo=gear.RAbullet,
  271.         head="Lithelimb Cap",
  272.         neck="Twilight Torque",
  273.         ear1="Darkness Earring",
  274.         ear2="Colossus's Earring",
  275.         body="Lanun Frac +1",
  276.         hands="Umuthi Gloves",
  277.         ring1="Defending Ring",
  278.         ring2="Patricius Ring",
  279.         back="Repulse Mantle",
  280.         waist="Flume Belt",
  281.         legs="Iuitl Tights",
  282.         feet="Lanun Bottes +1"}
  283.     sets.defense.MDT = {ammo=gear.RAbullet,
  284.         head="Dampening Tam",
  285.         neck="Twilight Torque",
  286.         ear1="Zennaroi Earring",
  287.         ear2="Steelflash Earring",
  288.         body="Mekosu. Harness",
  289.         hands="Floral Gauntlets",
  290.         ring1="Shadow Ring",
  291.         ring2="Defending Ring",
  292.         back="Xucau Mantle",
  293.         waist="Flume Belt",
  294.         legs="Feast Hose",
  295.         feet={ name="Herculean Boots", augments={'Accuracy+27','"Dual Wield"+4','DEX+5','Attack+11',}}}
  296.     sets.Kiting = {legs="Blood Cuisses"}
  297.  
  298.     -- Engaged sets
  299.  
  300.     -- Variations for TP weapon and (optional) offense/defense modes.  Code will fall back on previous
  301.     -- sets if more refined versions aren't defined.
  302.     -- If you create a set with both offense and defense modes, the offense mode should be first.
  303.     -- EG: sets.engaged.Dagger.Accuracy.Evasion
  304.    
  305.     -- Normal melee group
  306.     sets.engaged.Melee = {ammo=gear.RAbullet,
  307.         head={ name="Dampening Tam", augments={'DEX+10','Accuracy+15','Mag. Acc.+15','Quadruple Attack +3',}},
  308.         body={ name="Adhemar Jacket", augments={'DEX+10','AGI+10','Accuracy+15',}},
  309.         hands={ name="Adhemar Wristbands", augments={'Accuracy+15','Attack+15','"Subtle Blow"+7',}},
  310.         legs={ name="Samnuha Tights", augments={'STR+10','DEX+10','"Dbl.Atk."+3','"Triple Atk."+3',}},
  311.         feet={ name="Herculean Boots", augments={'Accuracy+27','"Dual Wield"+4','DEX+5','Attack+11',}},
  312.         neck="Asperity Necklace",
  313.         waist="Windbuffet Belt",
  314.         left_ear="Bladeborn Earring",
  315.         right_ear="Steelflash Earring",
  316.         left_ring="Epona's Ring",
  317.         right_ring="Petrov Ring",
  318.         back="Bleating Mantle"}
  319.     sets.engaged.Acc = {ammo=gear.RAbullet,
  320.         head={ name="Dampening Tam", augments={'DEX+10','Accuracy+15','Mag. Acc.+15','Quadruple Attack +3',}},
  321.         body={ name="Adhemar Jacket", augments={'DEX+10','AGI+10','Accuracy+15',}},
  322.         hands={ name="Adhemar Wristbands", augments={'Accuracy+15','Attack+15','"Subtle Blow"+7',}},
  323.         legs={ name="Samnuha Tights", augments={'STR+10','DEX+10','"Dbl.Atk."+3','"Triple Atk."+3',}},
  324.         feet={ name="Herculean Boots", augments={'Accuracy+27','"Dual Wield"+4','DEX+5','Attack+11',}},
  325.         neck="Iqabi Necklace",
  326.         waist="Eschan Stone",
  327.         left_ear="Steelflash Earring",
  328.         right_ear="Bladeborn Earring",
  329.         left_ring="Epona's Ring",
  330.         right_ring="Petrov Ring",
  331.         back="Sokolski Mantle"}
  332.     sets.engaged.Melee.DW = {ammo=gear.RAbullet,
  333.         head={ name="Dampening Tam", augments={'DEX+10','Accuracy+15','Mag. Acc.+15','Quadruple Attack +3',}},
  334.         body={ name="Adhemar Jacket", augments={'DEX+10','AGI+10','Accuracy+15',}},
  335.         hands={ name="Adhemar Wristbands", augments={'Accuracy+15','Attack+15','"Subtle Blow"+7',}},
  336.         legs={ name="Samnuha Tights", augments={'STR+10','DEX+10','"Dbl.Atk."+3','"Triple Atk."+3',}},
  337.         feet={ name="Herculean Boots", augments={'Accuracy+27','"Dual Wield"+4','DEX+5','Attack+11',}},
  338.         neck="Iqabi Necklace",
  339.         waist="Eschan Stone",
  340.         left_ear="Steelflash Earring",
  341.         right_ear="Bladeborn Earring",
  342.         left_ring="Epona's Ring",
  343.         right_ring="Petrov Ring",
  344.         back="Sokolski Mantle"}
  345.     sets.engaged.Acc.DW = {ammo=gear.RAbullet,
  346.         head={ name="Dampening Tam", augments={'DEX+10','Accuracy+15','Mag. Acc.+15','Quadruple Attack +3',}},
  347.         body={ name="Adhemar Jacket", augments={'DEX+10','AGI+10','Accuracy+15',}},
  348.         hands={ name="Adhemar Wristbands", augments={'Accuracy+15','Attack+15','"Subtle Blow"+7',}},
  349.         legs={ name="Samnuha Tights", augments={'STR+10','DEX+10','"Dbl.Atk."+3','"Triple Atk."+3',}},
  350.         feet={ name="Herculean Boots", augments={'Accuracy+27','"Dual Wield"+4','DEX+5','Attack+11',}},
  351.         neck="Asperity Necklace",
  352.         waist="Windbuffet Belt",
  353.         left_ear="Bladeborn Earring",
  354.         right_ear="Steelflash Earring",
  355.         left_ring="Epona's Ring",
  356.         right_ring="Petrov Ring",
  357.         back="Bleating Mantle"}
  358.     sets.engaged.Ranged = {ammo=gear.RAbullet,
  359.         head="Lanun Tricorne +1",
  360.         neck="Ocachi Gorget",
  361.         ear1="Clearview Earring",
  362.         ear2="Enervating Earring",
  363.         body="Pursuer's Doublet",
  364.         hands="Pursuer's Cuffs",
  365.         ring1="Bellona's Ring",
  366.         ring2="Hajduk Ring",
  367.         back="Libeccio Mantle",
  368.         waist="Eschan Stone",
  369.         legs="Pursuer's Pants",
  370.         feet={ name="Herculean Boots", augments={'Rng.Acc.+23 Rng.Atk.+23','"Subtle Blow"+6','DEX+10','Rng.Acc.+15',}}}
  371. end
  372.  
  373. -------------------------------------------------------------------------------------------------------------------
  374. -- Job-specific hooks for standard casting events.
  375. -------------------------------------------------------------------------------------------------------------------
  376.  
  377. -- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
  378. -- Set eventArgs.useMidcastGear to true if we want midcast gear equipped on precast.
  379. function job_precast(spell, action, spellMap, eventArgs)
  380.     -- Check that proper ammo is available if we're using ranged attacks or similar.
  381.     if spell.action_type == 'Ranged Attack' or spell.type == 'WeaponSkill' or spell.type == 'CorsairShot' then
  382.         do_bullet_checks(spell, spellMap, eventArgs)
  383.     end
  384.  
  385.     -- gear sets
  386.     if (spell.type == 'CorsairRoll' or spell.english == "Double-Up") and state.LuzafRing.value then
  387.         equip(sets.precast.LuzafRing)
  388.     elseif spell.type == 'CorsairShot' and state.CastingMode.value == 'Resistant' then
  389.         classes.CustomClass = 'Acc'
  390.     elseif spell.english == 'Fold' and buffactive['Bust'] == 2 then
  391.         if sets.precast.FoldDoubleBust then
  392.             equip(sets.precast.FoldDoubleBust)
  393.             eventArgs.handled = true
  394.         end
  395.     end
  396. end
  397.  
  398.  
  399. -- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
  400. function job_aftercast(spell, action, spellMap, eventArgs)
  401.     if spell.type == 'CorsairRoll' and not spell.interrupted then
  402.         display_roll_info(spell)
  403.     end
  404. end
  405.  
  406. -------------------------------------------------------------------------------------------------------------------
  407. -- User code that supplements standard library decisions.
  408. -------------------------------------------------------------------------------------------------------------------
  409.  
  410. -- Return a customized weaponskill mode to use for weaponskill sets.
  411. -- Don't return anything if you're not overriding the default value.
  412. function get_custom_wsmode(spell, spellMap, default_wsmode)
  413.     if buffactive['Transcendancy'] then
  414.         return 'Brew'
  415.     end
  416. end
  417.  
  418.  
  419. -- Called by the 'update' self-command, for common needs.
  420. -- Set eventArgs.handled to true if we don't want automatic equipping of gear.
  421. function job_update(cmdParams, eventArgs)
  422.     if newStatus == 'Engaged' and player.equipment.main == 'Chatoyant Staff' then
  423.         state.OffenseMode:set('Ranged')
  424.     end
  425. end
  426.  
  427.  
  428. -- Set eventArgs.handled to true if we don't want the automatic display to be run.
  429. function display_current_job_state(eventArgs)
  430.     local msg = ''
  431.    
  432.     msg = msg .. 'Off.: '..state.OffenseMode.current
  433.     msg = msg .. ', Rng.: '..state.RangedMode.current
  434.     msg = msg .. ', WS.: '..state.WeaponskillMode.current
  435.     msg = msg .. ', QD.: '..state.CastingMode.current
  436.  
  437.     if state.DefenseMode.value ~= 'None' then
  438.         local defMode = state[state.DefenseMode.value ..'DefenseMode'].current
  439.         msg = msg .. ', Defense: '..state.DefenseMode.value..' '..defMode
  440.     end
  441.    
  442.     if state.Kiting.value then
  443.         msg = msg .. ', Kiting'
  444.     end
  445.    
  446.     if state.PCTargetMode.value ~= 'default' then
  447.         msg = msg .. ', Target PC: '..state.PCTargetMode.value
  448.     end
  449.  
  450.     if state.SelectNPCTargets.value then
  451.         msg = msg .. ', Target NPCs'
  452.     end
  453.  
  454.     msg = msg .. ', Roll Size: ' .. ((state.LuzafRing.value and 'Large') or 'Small')
  455.    
  456.     add_to_chat(122, msg)
  457.  
  458.     eventArgs.handled = true
  459. end
  460.  
  461.  
  462. -------------------------------------------------------------------------------------------------------------------
  463. -- Utility functions specific to this job.
  464. -------------------------------------------------------------------------------------------------------------------
  465.  
  466. function define_roll_values()
  467.     rolls = {
  468.         ["Corsair's Roll"]   = {lucky=5, unlucky=9, bonus="Experience Points"},
  469.         ["Ninja Roll"]       = {lucky=4, unlucky=8, bonus="Evasion"},
  470.         ["Hunter's Roll"]    = {lucky=4, unlucky=8, bonus="Accuracy"},
  471.         ["Chaos Roll"]       = {lucky=4, unlucky=8, bonus="Attack"},
  472.         ["Magus's Roll"]     = {lucky=2, unlucky=6, bonus="Magic Defense"},
  473.         ["Healer's Roll"]    = {lucky=3, unlucky=7, bonus="Cure Potency Received"},
  474.         ["Puppet Roll"]      = {lucky=4, unlucky=8, bonus="Pet Magic Accuracy/Attack"},
  475.         ["Choral Roll"]      = {lucky=2, unlucky=6, bonus="Spell Interruption Rate"},
  476.         ["Monk's Roll"]      = {lucky=3, unlucky=7, bonus="Subtle Blow"},
  477.         ["Beast Roll"]       = {lucky=4, unlucky=8, bonus="Pet Attack"},
  478.         ["Samurai Roll"]     = {lucky=2, unlucky=6, bonus="Store TP"},
  479.         ["Evoker's Roll"]    = {lucky=5, unlucky=9, bonus="Refresh"},
  480.         ["Rogue's Roll"]     = {lucky=5, unlucky=9, bonus="Critical Hit Rate"},
  481.         ["Warlock's Roll"]   = {lucky=4, unlucky=8, bonus="Magic Accuracy"},
  482.         ["Fighter's Roll"]   = {lucky=5, unlucky=9, bonus="Double Attack Rate"},
  483.         ["Drachen Roll"]     = {lucky=3, unlucky=7, bonus="Pet Accuracy"},
  484.         ["Gallant's Roll"]   = {lucky=3, unlucky=7, bonus="Defense"},
  485.         ["Wizard's Roll"]    = {lucky=5, unlucky=9, bonus="Magic Attack"},
  486.         ["Dancer's Roll"]    = {lucky=3, unlucky=7, bonus="Regen"},
  487.         ["Scholar's Roll"]   = {lucky=2, unlucky=6, bonus="Conserve MP"},
  488.         ["Bolter's Roll"]    = {lucky=3, unlucky=9, bonus="Movement Speed"},
  489.         ["Caster's Roll"]    = {lucky=2, unlucky=7, bonus="Fast Cast"},
  490.         ["Courser's Roll"]   = {lucky=3, unlucky=9, bonus="Snapshot"},
  491.         ["Blitzer's Roll"]   = {lucky=4, unlucky=9, bonus="Attack Delay"},
  492.         ["Tactician's Roll"] = {lucky=5, unlucky=8, bonus="Regain"},
  493.         ["Allies's Roll"]    = {lucky=3, unlucky=10, bonus="Skillchain Damage"},
  494.         ["Miser's Roll"]     = {lucky=5, unlucky=7, bonus="Save TP"},
  495.         ["Companion's Roll"] = {lucky=2, unlucky=10, bonus="Pet Regain and Regen"},
  496.         ["Avenger's Roll"]   = {lucky=4, unlucky=8, bonus="Counter Rate"},
  497.     }
  498. end
  499.  
  500. function display_roll_info(spell)
  501.     rollinfo = rolls[spell.english]
  502.     local rollsize = (state.LuzafRing.value and 'Large') or 'Small'
  503.  
  504.     if rollinfo then
  505.         add_to_chat(104, spell.english..' provides a bonus to '..rollinfo.bonus..'.  Roll size: '..rollsize)
  506.         add_to_chat(104, 'Lucky roll is '..tostring(rollinfo.lucky)..', Unlucky roll is '..tostring(rollinfo.unlucky)..'.')
  507.     end
  508. end
  509.  
  510.  
  511. -- Determine whether we have sufficient ammo for the action being attempted.
  512. function do_bullet_checks(spell, spellMap, eventArgs)
  513.     local bullet_name
  514.     local bullet_min_count = 1
  515.    
  516.     if spell.type == 'WeaponSkill' then
  517.         if spell.skill == "Marksmanship" then
  518.             if spell.element == 'None' then
  519.                 -- physical weaponskills
  520.                 bullet_name = gear.WSbullet
  521.             else
  522.                 -- magical weaponskills
  523.                 bullet_name = gear.MAbullet
  524.             end
  525.         else
  526.             -- Ignore non-ranged weaponskills
  527.             return
  528.         end
  529.     elseif spell.type == 'CorsairShot' then
  530.         bullet_name = gear.QDbullet
  531.     elseif spell.action_type == 'Ranged Attack' then
  532.         bullet_name = gear.RAbullet
  533.         if buffactive['Triple Shot'] then
  534.             bullet_min_count = 3
  535.         end
  536.     end
  537.    
  538.     local available_bullets = player.inventory[bullet_name] or player.wardrobe[bullet_name]
  539.    
  540.     -- If no ammo is available, give appropriate warning and end.
  541.     if not available_bullets then
  542.         if spell.type == 'CorsairShot' and player.equipment.ammo ~= 'empty' then
  543.             add_to_chat(104, 'No Quick Draw ammo left.  Using what\'s currently equipped ('..player.equipment.ammo..').')
  544.             return
  545.         elseif spell.type == 'WeaponSkill' and player.equipment.ammo == gear.RAbullet then
  546.             add_to_chat(104, 'No weaponskill ammo left.  Using what\'s currently equipped (standard ranged bullets: '..player.equipment.ammo..').')
  547.             return
  548.         else
  549.             add_to_chat(104, 'No ammo ('..tostring(bullet_name)..') available for that action.')
  550.             eventArgs.cancel = true
  551.             return
  552.         end
  553.     end
  554.    
  555.     -- Don't allow shooting or weaponskilling with ammo reserved for quick draw.
  556.     if spell.type ~= 'CorsairShot' and bullet_name == gear.QDbullet and available_bullets.count <= bullet_min_count then
  557.         add_to_chat(104, 'No ammo will be left for Quick Draw.  Cancelling.')
  558.         eventArgs.cancel = true
  559.         return
  560.     end
  561.    
  562.     -- Low ammo warning.
  563.     if spell.type ~= 'CorsairShot' and state.warned.value == false
  564.         and available_bullets.count > 1 and available_bullets.count <= options.ammo_warning_limit then
  565.         local msg = '*****  LOW AMMO WARNING: '..bullet_name..' *****'
  566.         --local border = string.repeat("*", #msg)
  567.         local border = ""
  568.         for i = 1, #msg do
  569.             border = border .. "*"
  570.         end
  571.        
  572.         add_to_chat(104, border)
  573.         add_to_chat(104, msg)
  574.         add_to_chat(104, border)
  575.  
  576.         state.warned:set()
  577.     elseif available_bullets.count > options.ammo_warning_limit and state.warned then
  578.         state.warned:reset()
  579.     end
  580. end
  581.  
  582. -- Select default macro book on initial load or subjob change.
  583. function select_default_macro_book()
  584.     set_macro_page(1, 2)
  585. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement