Guest User

Sut Gearswap

a guest
Aug 12th, 2014
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 22.12 KB | None | 0 0
  1. -------------------------------------------------------------------------------------------------------------------
  2. -- Setup functions for this job.  Generally should not be modified.
  3. -------------------------------------------------------------------------------------------------------------------
  4.  
  5. --[[
  6.     gs c toggle luzaf -- 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.     Acc on offense mode (which is intended for melee) will currently use .Acc weaponskill
  11.     mode for both melee and ranged weaponskills.  Need to fix that in core.
  12. --]]
  13.  
  14.  
  15. -- Initialization function for this job file.
  16. function get_sets()
  17.     -- Load and initialize the include file.
  18.     include('Mote-Include.lua')
  19. end
  20.  
  21. -- Setup vars that are user-independent.  state.Buff vars initialized here will automatically be tracked.
  22. function job_setup()
  23.     -- Whether to use Luzaf's Ring
  24.     state.LuzafRing = false
  25.     -- Whether a warning has been given for low ammo
  26.     state.warned = false
  27.  
  28.     define_roll_values()
  29. end
  30.  
  31. -------------------------------------------------------------------------------------------------------------------
  32. -- User setup functions for this job.  Recommend that these be overridden in a sidecar file.
  33. -------------------------------------------------------------------------------------------------------------------
  34.  
  35. -- Setup vars that are user-dependent.  Can override this function in a sidecar file.
  36. function user_setup()
  37.     -- Options: Override default values
  38.     options.OffenseModes = {'Ranged', 'Melee', 'Acc'}
  39.     options.RangedModes = {'Normal', 'Acc'}
  40.     options.WeaponskillModes = {'Normal', 'Acc', 'Att', 'Mod'}
  41.     options.CastingModes = {'Normal', 'Resistant'}
  42.     options.IdleModes = {'Normal'}
  43.     options.RestingModes = {'Normal'}
  44.     options.PhysicalDefenseModes = {'PDT'}
  45.     options.MagicalDefenseModes = {'MDT'}
  46.  
  47.     state.Defense.PhysicalMode = 'PDT'
  48.  
  49.     gear.RAbullet = "Bullet"
  50.     gear.WSbullet = "Oberon's Bullet"
  51.     gear.MAbullet = "Bronze Bullet"
  52.     gear.QDbullet = "Animikii Bullet"
  53.     options.ammo_warning_limit = 15
  54.  
  55.     -- Additional local binds
  56.     -- Cor doesn't use hybrid defense mode; using that for ranged mode adjustments.
  57.     send_command('bind ^f9 gs c cycle RangedMode')
  58.  
  59.     send_command('bind ^` input /ja "Double-up" <me>')
  60.     send_command('bind !` input /ja "Bolter\'s Roll" <me>')
  61.  
  62. end
  63.  
  64.  
  65. -- Called when this job file is unloaded (eg: job change)
  66. function user_unload()
  67.     send_command('unbind ^`')
  68.     send_command('unbind !`')
  69. end
  70.  
  71. -- Define sets and vars used by this job file.
  72. function init_gear_sets()
  73.     --------------------------------------
  74.     -- Start defining the sets
  75.     --------------------------------------
  76.    
  77.     -- Precast Sets
  78.  
  79.     -- Precast sets to enhance JAs
  80.    
  81.     sets.precast.JA['Triple Shot'] = {body="Navarch's Frac +2"}
  82.     sets.precast.JA['Snake Eye'] = {legs="Comm. Culottes +2"}
  83.     sets.precast.JA['Wild Card'] = {feet="Comm. Bottes +2"}
  84.     sets.precast.JA['Random Deal'] = {body="Comm. Frac +2"}
  85.  
  86.    
  87.     sets.precast.CorsairRoll = {head="Lanun Tricorne",hands="Navarch's Gants +2", ring2="Barataria Ring"}
  88.    
  89.     sets.precast.CorsairRoll["Caster's Roll"] = set_combine(sets.precast.CorsairRoll, {legs="Navarch's Culottes +2"})
  90.     sets.precast.CorsairRoll["Courser's Roll"] = set_combine(sets.precast.CorsairRoll, {feet="Navarch's Bottes +2"})
  91.     sets.precast.CorsairRoll["Blitzer's Roll"] = set_combine(sets.precast.CorsairRoll, {head="Navarch's Tricorne +2"})
  92.     sets.precast.CorsairRoll["Tactician's Roll"] = set_combine(sets.precast.CorsairRoll, {body="Navarch's Frac +2"})
  93.     sets.precast.CorsairRoll["Allies' Roll"] = set_combine(sets.precast.CorsairRoll, {hands="Navarch's Gants +2"})
  94.    
  95.     sets.precast.LuzafRing = {ring2="Luzaf's Ring"}
  96.     sets.precast.FoldDoubleBust = {hands="Nvrch. Gants +2"}
  97.    
  98.     sets.precast.CorsairShot = {head="Wayfarer Circlet"}
  99.    
  100.  
  101.     -- Waltz set (chr and vit)
  102.     sets.precast.Waltz = {
  103.         head="Whirlpool Mask",
  104.         body="Iuitl Vest",hands="Iuitl Wristbands",
  105.         legs="Nahtirah Trousers",feet="Iuitl Gaiters +1"}
  106.        
  107.     -- Don't need any special gear for Healing Waltz.
  108.     sets.precast.Waltz['Healing Waltz'] = {}
  109.  
  110.     -- Fast cast sets for spells
  111.    
  112.     sets.precast.FC = {head="Haruspex Hat",ear2="Loquacious Earring",hands="Thaumas Gloves",ring1="Prolix Ring"}
  113.  
  114.     sets.precast.FC.Utsusemi = set_combine(sets.precast.FC, {neck="Magoraga Beads"})
  115.  
  116.  
  117.     sets.precast.RA = {ammo=gear.RAbullet,
  118.         head="Navarch's Tricorne +2",
  119.         body="Mextli Harness",hands="Nvrch. Gants +2",
  120.         back="Navarch's Mantle",waist="Impulse Belt",legs="Thur. Tights +1",feet="Cor. Bottes +1"}
  121.  
  122.        
  123.     -- Weaponskill sets
  124.     -- Default set for any weaponskill that isn't any more specifically defined
  125.     sets.precast.WS = {
  126.         head="Lanun Tricorne",neck=gear.ElementalGorget,ear1="Altdorf's Earring",ear2="Wilhelm's Earring",
  127.         body="Tessera Saio",hands="Schutzen Mittens",ring1="Stormsoul Ring",ring2="Stormsoul Ring",
  128.         back="Amemet Mantle +1",waist=gear.ElementalBelt,legs="Thur. Tights +1",feet="Nvrch. Bottes +2"}
  129.  
  130.  
  131.     -- Specific weaponskill sets.  Uses the base set if an appropriate WSMod version isn't found.
  132.     sets.precast.WS['Evisceration'] = sets.precast.WS
  133.  
  134.     sets.precast.WS['Exenterator'] = set_combine(sets.precast.WS, {legs="Nahtirah Trousers"})
  135.  
  136.     sets.precast.WS['Requiescat'] = set_combine(sets.precast.WS, {legs="Nahtirah Trousers"})
  137.  
  138.     sets.precast.WS['Last Stand'] = {ammo=gear.WSbullet,
  139.         head="Lanun Tricorne",neck=gear.ElementalGorget,ear1="Altdorf's Earring",ear2="Wilhelm's Earring",
  140.         body="Tessera Saio",hands="Iuitl Wristbands",ring1="Rajas Ring",ring2="Stormsoul Ring",
  141.         back="Gunslinger's Cape",waist=gear.ElementalBelt,legs="Thur. Tights +1",feet="Nvrch. Bottes +2"}
  142.  
  143.     sets.precast.WS['Last Stand'].Acc = {ammo=gear.WSbullet,
  144.         head="Nvrch. Tricorne +2",neck=gear.ElementalGorget,ear1="Altdorf's Earring",ear2="Wilhelm's Earring",
  145.         body="Tessera Saio",hands="Iuitl Wristbands",ring1="Rajas Ring",ring2="Stormsoul Ring",
  146.         back="Gunslinger's Cape",waist=gear.ElementalBelt,legs="Thur. Tights +1",feet="Nvrch. Bottes +2"}
  147.  
  148.  
  149.     sets.precast.WS['Wildfire'] = {ammo=gear.MAbullet,
  150.         head="Wayfarer Circlet",neck="Stoicheion Medal",ear1="Novio Earring",ear2="Hecate's Earring",
  151.         body="Tessera Saio",hands="Iuitl Wristbands",ring1="Stormsoul Ring",ring2="Stormsoul Ring",
  152.         back="Gunslinger's Cape",waist=gear.ElementalBelt,legs="Thur. Tights +1",feet="Nvrch. Bottes +2"}
  153.  
  154.     sets.precast.WS['Wildfire'].Brew = {ammo=gear.MAbullet,
  155.         head="Wayfarer Circlet",neck="Stoicheion Medal",ear1="Novio Earring",ear2="Hecate's Earring",
  156.         body="Tessera Saio",hands="Iuitl Wristbands",ring1="Stormsoul Ring",ring2="Stormsoul Ring",
  157.         back="Gunslinger's Cape",waist=gear.ElementalBelt,legs="Shned. Tights +1",feet="Nvrch. Bottes +2"}
  158.    
  159.     sets.precast.WS['Leaden Salute'] = sets.precast.WS['Wildfire']
  160.    
  161.    
  162.     -- Midcast Sets
  163.     sets.midcast.FastRecast = {
  164.         head="Whirlpool Mask",
  165.         body="Iuitl Vest",hands="Iuitl Wristbands",
  166.         legs="Manibozho Brais",feet="Iuitl Gaiters +1"}
  167.        
  168.     -- Specific spells
  169.     sets.midcast.Utsusemi = sets.midcast.FastRecast
  170.  
  171.     sets.midcast.CorsairShot = {ammo=gear.QDbullet,
  172.         head="Pandinus Beret",neck="Stoicheion Medal",ear1="Novio Earring",ear2="Hecate's Earring",
  173.         body="Mirke Wardecors",hands="Nvrch. Gants +2",ring1="Stormsoul Ring",ring2="Stormsoul Ring",
  174.         back="Gunslinger's Cape",waist="Aquiline Belt",legs="Shned. Tights +1",feet="Nvrch. Bottes +2"}
  175.  
  176.     sets.midcast.CorsairShot.Acc = {ammo=gear.QDbullet,
  177.         head="Wayfarer Circlet",neck="Stoicheion Medal",ear1="Altdorf's Earring",ear2="Wilhelm's Earring",
  178.         body="Mirke Wardecors",hands="Nvrch. Gants +2",ring1="Stormsoul Ring",ring2="Stormsoul Ring",
  179.         back="Gunslinger's Cape",waist="Aquiline Belt",legs="Shned. Tights +1",feet="Nvrch. Bottes +2"}
  180.  
  181.     sets.midcast.CorsairShot['Light Shot'] = {ammo=gear.QDbullet,
  182.         head="Lanun Tricorne",neck="Stoicheion Medal",ear1="Altdorf's Earring",ear2="Wilhelm's Earring",
  183.         body="Mirke Wardecors",hands="Schutzen Mittens",ring1="Stormsoul Ring",ring2="Stormsoul Ring",
  184.         back="Gunslinger's Cape",waist="Aquiline Belt",legs="Thur. Tights +1",feet="Nvrch. Bottes +2"}
  185.  
  186.     sets.midcast.CorsairShot['Dark Shot'] = sets.midcast.CorsairShot['Light Shot']
  187.  
  188.  
  189.     -- Ranged gear
  190.     sets.midcast.RA = {ammo=gear.RAbullet,
  191.         head="Nvrch. Tricorne +2",neck="Peacock Amulet",ear1="Hollow Earring",ear2="Volley Earring",
  192.         body="Mextli Harness",hands="Nvrch. Gants +2",ring1="Rajas Ring",ring2="Jalzahn's Ring",
  193.         back="Gunslinger's Cape",waist="Impulse Belt",legs="Thur. Tights +1",feet="Iuitl Gaiters +1"}
  194.  
  195.     sets.midcast.RA.Acc = {ammo=gear.RAbullet,
  196.         head="Nvrch. Tricorne +2",neck="Peacock Amulet",ear1="Hollow Earring",ear2="Volley Earring",
  197.         body="Mextli Harness",hands="Nvrch. Gants +2",ring1="Rajas Ring",ring2="Jalzahn's Ring",
  198.         back="Gunslinger's Cape",waist="Impulse Belt",legs="Thur. Tights +1",feet="Cor. Bottes +1"}
  199.  
  200.    
  201.     -- Sets to return to when not performing an action.
  202.    
  203.     -- Resting sets
  204.     sets.resting = {neck="Wiglen Gorget",ring1="Sheltered Ring",ring2="Paguroidea Ring"}
  205.    
  206.  
  207.     -- Idle sets
  208.     sets.idle = {ammo=gear.RAbullet,
  209.         head="Lanun Tricorne",neck="Peacock Amulet",ear1="Novio Earring",ear2="Hecate's Earring",
  210.         body="Tessera Saio",hands="Nvrch. Gants +2",ring1="Rajas Ring",ring2="Jalzahn's Ring",
  211.         back="Gunslinger's Cape",waist="Aquiline Belt",legs="Shned. Tights +1",feet="Nvrch. Bottes +2"}
  212.  
  213.     sets.idle.Town = {ammo=gear.QDbullet,
  214.         head="Lanun Tricorne",neck="Peacock Amulet",ear1="Novio Earring",ear2="Hecate's Earring",
  215.         body="Tessera Saio",hands="Nvrch. Gants +2",ring1="Rajas Ring",ring2="Jalzahn's Ring",
  216.         back="Gunslinger's Cape",waist="Aquiline Belt",legs="Shned. Tights +1",feet="Nvrch. Bottes +2"}
  217.    
  218.     -- Defense sets
  219.     sets.defense.PDT = {
  220.         head="Whirlpool Mask",neck="Twilight Torque",ear1="Clearview Earring",ear2="Volley Earring",
  221.         body="Iuitl Vest",hands="Iuitl Wristbands",ring1="Defending Ring",ring2=gear.DarkRing.physical,
  222.         back="Shadow Mantle",waist="Flume Belt",legs="Nahtirah Trousers",feet="Iuitl Gaiters +1"}
  223.  
  224.     sets.defense.MDT = {
  225.         head="Whirlpool Mask",neck="Twilight Torque",ear1="Clearview Earring",ear2="Volley Earring",
  226.         body="Iuitl Vest",hands="Iuitl Wristbands",ring1="Defending Ring",ring2="Shadow Ring",
  227.         back="Engulfer Cape",waist="Flume Belt",legs="Nahtirah Trousers",feet="Iuitl Gaiters +1"}
  228.    
  229.  
  230.     sets.Kiting = {feet="Skadi's Jambeaux +1"}
  231.  
  232.     -- Engaged sets
  233.  
  234.     -- Variations for TP weapon and (optional) offense/defense modes.  Code will fall back on previous
  235.     -- sets if more refined versions aren't defined.
  236.     -- If you create a set with both offense and defense modes, the offense mode should be first.
  237.     -- EG: sets.engaged.Dagger.Accuracy.Evasion
  238.    
  239.     -- Normal melee group
  240.     sets.engaged.Melee = {ammo=gear.RAbullet,
  241.         head="Cuauh. Headpiece",neck="Peacock Amulet",ear1="Hollow Earring",ear2="Suppanomimi",
  242.         body="Mextli Harness",hands="Dusk Gloves +1",ring1="Rajas Ring",ring2="Adler Ring",
  243.         back="Amemet Mantle +1",waist="Twilight Belt",legs="Aurore Brais",feet="Comm. Bottes +2"}
  244.    
  245.     sets.engaged.Acc = {ammo=gear.RAbullet,
  246.         head="Cuauh. Headpiece",neck="Peacock Amulet",ear1="Hollow Earring",ear2="Suppanomimi",
  247.         body="Mextli Harness",hands="Dusk Gloves +1",ring1="Rajas Ring",ring2="Adler Ring",
  248.         back="Amemet Mantle +1",waist="Twilight Belt",legs="Aurore Brais",feet="Comm. Bottes +2"}
  249.  
  250.     sets.engaged.Melee.DW = {ammo=gear.RAbullet,
  251.         head="Cuauh. Headpiece",neck="Peacock Amulet",ear1="Hollow Earring",ear2="Suppanomimi",
  252.         body="Mextli Harness",hands="Dusk Gloves +1",ring1="Rajas Ring",ring2="Adler Ring",
  253.         back="Amemet Mantle +1",waist="Twilight Belt",legs="Aurore Brais",feet="Comm. Bottes +2"}
  254.  
  255.     sets.engaged.Acc.DW = {ammo=gear.RAbullet,
  256.         head="Cuauh. Headpiece",neck="Peacock Amulet",ear1="Hollow Earring",ear2="Suppanomimi",
  257.         body="Mextli Harness",hands="Dusk Gloves +1",ring1="Rajas Ring",ring2="Adler Ring",
  258.         back="Amemet Mantle +1",waist="Twilight Belt",legs="Aurore Brais",feet="Comm. Bottes +2"}
  259.  
  260.     sets.engaged.Ranged = {ammo=gear.RAbullet,
  261.         head="Nvrch. Tricorne +2",neck="Peacock Amulet",ear1="Hollow Earring",ear2="Volley Earring",
  262.         body="Mextli Harness",hands="Nvrch. Gants +2",ring1="Rajas Ring",ring2="Jalzahn's Ring",
  263.         back="Gunslinger's Cape",waist="Impulse Belt",legs="Thur. Tights +1",feet="Iuitl Gaiters +1"}
  264. end
  265.  
  266. -------------------------------------------------------------------------------------------------------------------
  267. -- Job-specific hooks for standard casting events.
  268. -------------------------------------------------------------------------------------------------------------------
  269.  
  270. -- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
  271. -- Set eventArgs.useMidcastGear to true if we want midcast gear equipped on precast.
  272. function job_precast(spell, action, spellMap, eventArgs)
  273.     -- Check that proper ammo is available if we're using ranged attacks or similar.
  274.     if spell.action_type == 'Ranged Attack' or spell.type == 'WeaponSkill' or spell.type == 'CorsairShot' then
  275.         do_bullet_checks(spell, spellMap, eventArgs)
  276.     end
  277.  
  278.     -- gear sets
  279.     if (spell.type == 'CorsairRoll' or spell.english == "Double-Up") and state.LuzafRing then
  280.         equip(sets.precast.LuzafRing)
  281.     elseif spell.type == 'CorsairShot' and state.CastingMode == 'Resistant' then
  282.         classes.CustomClass = 'Acc'
  283.     elseif spell.english == 'Fold' and buffactive['Bust'] == 2 then
  284.         if sets.precast.FoldDoubleBust then
  285.             equip(sets.precast.FoldDoubleBust)
  286.             eventArgs.handled = true
  287.         end
  288.     end
  289. end
  290.  
  291.  
  292. -- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
  293. function job_aftercast(spell, action, spellMap, eventArgs)
  294.     if spell.type == 'CorsairRoll' and not spell.interrupted then
  295.         display_roll_info(spell)
  296.     end
  297. end
  298.  
  299. -------------------------------------------------------------------------------------------------------------------
  300. -- Job-specific hooks for non-casting events.
  301. -------------------------------------------------------------------------------------------------------------------
  302.  
  303. -- Called when the player's status changes.
  304. function job_status_change(newStatus, oldStatus, eventArgs)
  305.     if newStatus == 'Engaged' and player.equipment.main == 'Chatoyant Staff' then
  306.         state.OffenseMode = 'Ranged'
  307.     end
  308. end
  309.  
  310. -------------------------------------------------------------------------------------------------------------------
  311. -- User code that supplements standard library decisions.
  312. -------------------------------------------------------------------------------------------------------------------
  313.  
  314. -- Return a customized weaponskill mode to use for weaponskill sets.
  315. -- Don't return anything if you're not overriding the default value.
  316. function get_custom_wsmode(spell, spellMap, default_wsmode)
  317.     if buffactive['Transcendancy'] then
  318.         return 'Brew'
  319.     end
  320. end
  321.  
  322.  
  323. -- Called by the 'update' self-command, for common needs.
  324. -- Set eventArgs.handled to true if we don't want automatic equipping of gear.
  325. function job_update(cmdParams, eventArgs)
  326.     if newStatus == 'Engaged' and player.equipment.main == 'Chatoyant Staff' then
  327.         state.OffenseMode = 'Ranged'
  328.     end
  329. end
  330.  
  331.  
  332. -- Set eventArgs.handled to true if we don't want the automatic display to be run.
  333. function display_current_job_state(eventArgs)
  334.     local defenseString = ''
  335.     if state.Defense.Active then
  336.         local defMode = state.Defense.PhysicalMode
  337.         if state.Defense.Type == 'Magical' then
  338.             defMode = state.Defense.MagicalMode
  339.         end
  340.  
  341.         defenseString = 'Defense: '..state.Defense.Type..' '..defMode..', '
  342.     end
  343.    
  344.     local rollsize = (state.LuzafRing and 'Large') or 'Small'
  345.    
  346.     local pcTarget = ''
  347.     if state.PCTargetMode ~= 'default' then
  348.         pcTarget = ', Target PC: '..state.PCTargetMode
  349.     end
  350.  
  351.     local npcTarget = ''
  352.     if state.SelectNPCTargets then
  353.         pcTarget = ', Target NPCs'
  354.     end
  355.    
  356.  
  357.     add_to_chat(122,'Off.: '..state.OffenseMode..', Rng.: '..state.RangedMode..', WS: '..state.WeaponskillMode..
  358.         ', QD: '..state.CastingMode..', '..defenseString..'Kite: '..on_off_names[state.Kiting]..
  359.         ', Roll Size: '..rollsize..pcTarget..npcTarget)
  360.  
  361.     eventArgs.handled = true
  362. end
  363.  
  364. -------------------------------------------------------------------------------------------------------------------
  365. -- User self-commands.
  366. -------------------------------------------------------------------------------------------------------------------
  367.  
  368. -- Job-specific toggles.
  369. function job_toggle_state(field)
  370.     if field:lower() == 'luzaf' then
  371.         state.LuzafRing = not state.LuzafRing
  372.         return "Use of Luzaf Ring", state.LuzafRing
  373.     end
  374. end
  375.  
  376. -------------------------------------------------------------------------------------------------------------------
  377. -- Utility functions specific to this job.
  378. -------------------------------------------------------------------------------------------------------------------
  379.  
  380. function define_roll_values()
  381.     rolls = {
  382.         ["Corsair's Roll"]   = {lucky=5, unlucky=9, bonus="Experience Points"},
  383.         ["Ninja Roll"]       = {lucky=4, unlucky=8, bonus="Evasion"},
  384.         ["Hunter's Roll"]    = {lucky=4, unlucky=8, bonus="Accuracy"},
  385.         ["Chaos Roll"]       = {lucky=4, unlucky=8, bonus="Attack"},
  386.         ["Magus's Roll"]     = {lucky=2, unlucky=6, bonus="Magic Defense"},
  387.         ["Healer's Roll"]    = {lucky=3, unlucky=7, bonus="Cure Potency Received"},
  388.         ["Puppet Roll"]      = {lucky=4, unlucky=8, bonus="Pet Magic Accuracy/Attack"},
  389.         ["Choral Roll"]      = {lucky=2, unlucky=6, bonus="Spell Interruption Rate"},
  390.         ["Monk's Roll"]      = {lucky=3, unlucky=7, bonus="Subtle Blow"},
  391.         ["Beast Roll"]       = {lucky=4, unlucky=8, bonus="Pet Attack"},
  392.         ["Samurai Roll"]     = {lucky=2, unlucky=6, bonus="Store TP"},
  393.         ["Evoker's Roll"]    = {lucky=5, unlucky=9, bonus="Refresh"},
  394.         ["Rogue's Roll"]     = {lucky=5, unlucky=9, bonus="Critical Hit Rate"},
  395.         ["Warlock's Roll"]   = {lucky=4, unlucky=8, bonus="Magic Accuracy"},
  396.         ["Fighter's Roll"]   = {lucky=5, unlucky=9, bonus="Double Attack Rate"},
  397.         ["Drachen Roll"]     = {lucky=3, unlucky=7, bonus="Pet Accuracy"},
  398.         ["Gallant's Roll"]   = {lucky=3, unlucky=7, bonus="Defense"},
  399.         ["Wizard's Roll"]    = {lucky=5, unlucky=9, bonus="Magic Attack"},
  400.         ["Dancer's Roll"]    = {lucky=3, unlucky=7, bonus="Regen"},
  401.         ["Scholar's Roll"]   = {lucky=2, unlucky=6, bonus="Conserve MP"},
  402.         ["Bolter's Roll"]    = {lucky=3, unlucky=9, bonus="Movement Speed"},
  403.         ["Caster's Roll"]    = {lucky=2, unlucky=7, bonus="Fast Cast"},
  404.         ["Courser's Roll"]   = {lucky=3, unlucky=9, bonus="Snapshot"},
  405.         ["Blitzer's Roll"]   = {lucky=4, unlucky=9, bonus="Attack Delay"},
  406.         ["Tactician's Roll"] = {lucky=5, unlucky=8, bonus="Regain"},
  407.         ["Allies's Roll"]    = {lucky=3, unlucky=10, bonus="Skillchain Damage"},
  408.         ["Miser's Roll"]     = {lucky=5, unlucky=7, bonus="Save TP"},
  409.         ["Companion's Roll"] = {lucky=2, unlucky=10, bonus="Pet Regain and Regen"},
  410.         ["Avenger's Roll"]   = {lucky=4, unlucky=8, bonus="Counter Rate"},
  411.     }
  412. end
  413.  
  414. function display_roll_info(spell)
  415.     rollinfo = rolls[spell.english]
  416.     local rollsize = (state.LuzafRing and 'Large') or 'Small'
  417.  
  418.     if rollinfo then
  419.         add_to_chat(104, spell.english..' provides a bonus to '..rollinfo.bonus..'.  Roll size: '..rollsize)
  420.         add_to_chat(104, 'Lucky roll is '..tostring(rollinfo.lucky)..', Unlucky roll is '..tostring(rollinfo.unlucky)..'.')
  421.     end
  422. end
  423.  
  424.  
  425. -- Determine whether we have sufficient ammo for the action being attempted.
  426. function do_bullet_checks(spell, spellMap, eventArgs)
  427.     local bullet_name
  428.     local bullet_min_count = 1
  429.    
  430.     if spell.type == 'WeaponSkill' then
  431.         if spell.skill == "Marksmanship" then
  432.             if spell.element == 'None' then
  433.                 -- physical weaponskills
  434.                 bullet_name = gear.WSbullet
  435.             else
  436.                 -- magical weaponskills
  437.                 bullet_name = gear.MAbullet
  438.             end
  439.         else
  440.             -- Ignore non-ranged weaponskills
  441.             return
  442.         end
  443.     elseif spell.type == 'CorsairShot' then
  444.         bullet_name = gear.QDbullet
  445.     elseif spell.action_type == 'Ranged Attack' then
  446.         bullet_name = gear.RAbullet
  447.         if buffactive['Triple Shot'] then
  448.             bullet_min_count = 3
  449.         end
  450.     end
  451.    
  452.     local available_bullets = player.inventory[bullet_name] or player.wardrobe[bullet_name]
  453.    
  454.     -- If no ammo is available, give appropriate warning and end. Also Fire Cards
  455.    
  456.     if not available_bullets then
  457.         if spell.type == 'CorsairShot' and player.equipment.ammo ~= 'empty' then
  458.             add_to_chat(104, 'No Quick Draw ammo left.  Using what\'s currently equipped ('..player.equipment.ammo..').')
  459.             return
  460.         elseif spell.type == 'WeaponSkill' and player.equipment.ammo == gear.RAbullet then
  461.             add_to_chat(104, 'No weaponskill ammo left.  Using what\'s currently equipped (standard ranged bullets: '..player.equipment.ammo..').')
  462.             return
  463.         else
  464.             add_to_chat(104, 'No ammo ('..tostring(bullet_name)..') available for that action.')
  465.             eventArgs.cancel = true
  466.             return
  467.         end
  468.     end
  469.    
  470.     if spell.type == 'CorsairShot' and player.inventory["Trump Card"] and player.inventory["Trump Card"].count < 10 then
  471.             add_to_chat(104, 'Low on trump cards!')
  472.     end
  473.    
  474.  
  475.     if spell.type == 'CorsairShot' and player.inventory["Fire Card"] and player.inventory["Fire Card"].count < 10 then
  476.             add_to_chat(104, 'Low on fire cards!')
  477.     end
  478.    
  479.  
  480.    
  481. function get_sets()
  482.     --
  483.     --
  484.     special_QDbullet = S{'Animikii Bullet','Omphalos Bullet'}
  485. end
  486.  
  487. -- Don't allow shooting or weaponskilling with ammo reserved for quick draw and stop losing Hurkan Bullets!
  488. if spell.type ~= 'CorsairShot' then
  489.     if special_QDbullet:contains(player.equipment.ammo) then
  490.         add_to_chat(104, 'Dont lose your special ammo!  Cancelling.')
  491.         eventArgs.cancel = true
  492.         return
  493.     elseif bullet_name == gear.QDbullet and available_bullets.count <= bullet_min_count then
  494.         add_to_chat(104, 'No ammo will be left for Quick Draw.  Cancelling.')
  495.         eventArgs.cancel = true
  496.         return
  497.     end
  498. end
  499.    
  500.     -- Low ammo warning.
  501.     if spell.type ~= 'CorsairShot' and not state.warned
  502.         and available_bullets.count > 1 and available_bullets.count <= options.ammo_warning_limit then
  503.         local msg = '*****  LOW AMMO WARNING: '..bullet_name..' *****'
  504.         --local border = string.repeat("*", #msg)
  505.         local border = ""
  506.         for i = 1, #msg do
  507.             border = border .. "*"
  508.         end
  509.        
  510.         add_to_chat(104, border)
  511.         add_to_chat(104, msg)
  512.         add_to_chat(104, border)
  513.  
  514.         state.warned = true
  515.     elseif available_bullets.count > options.ammo_warning_limit and state.warned then
  516.         state.warned = false
  517.     end
  518. end
Advertisement
Add Comment
Please, Sign In to add comment