学者のMote-libsコードです。
目次
ソースコード
Mote-libsでは、ジョブロジック部分(ジョブ名.lua)と装備セット部分(ジョブ名_gear.lua)を切り分けていますので、次のような階層構造になっています。
GearSwap/
└ data/
├ SCH.lua
└ キャラクター名/
└SCH_gear.lua
ジョブロジック
function get_sets()
mote_include_version = 2
include('Mote-Include.lua')
set_language('japanese')
end
-- Setup vars that are user-independent. state.Buff vars initialized here will automatically be tracked.
function job_setup()
state.OffenseMode:options('Normal')
state.IdleMode:options('Normal')
state.Weapons = M{'White','Black'}
state.VagaryMode = M(false, 'Vagary Task')
state.Seidr = M(false, 'セイズルコタルディ')
state.Buff['気炎万丈の章'] = buffactive['気炎万丈の章'] or false
state.Buff['意気昂然の章'] = buffactive['意気昂然の章'] or false
state.Buff['令狸執鼠の章'] = buffactive['令狸執鼠の章'] or false
state.Buff['震天動地の章'] = buffactive['震天動地の章'] or false
state.Buff['簡素清貧の章'] = buffactive['簡素清貧の章'] or false
state.Buff['勤倹小心の章'] = buffactive['勤倹小心の章'] or false
state.Buff['電光石火の章'] = buffactive['電光石火の章'] or false
state.Buff['疾風迅雷の章'] = buffactive['疾風迅雷の章'] or false
state.Buff['虚誘掩殺の策'] = buffactive['虚誘掩殺の策'] or false
state.Buff['机上演習:蓄積中'] = buffactive['机上演習:蓄積中'] or false
include('weather_obi')
end
-------------------------------------------------------------------------------------------------------------------
-- User setup functions for this job. Recommend that these be overridden in a sidecar file.
-------------------------------------------------------------------------------------------------------------------
-- Setup vars that are user-dependent. Can override this function in a sidecar file.
function user_setup()
send_command('wait 5; gs c set IdleMode Normal; gs c lockstyleset')
end
function user_unload()
send_command('input /si blank;')
end
function job_post_midcast(spell, action, spellMap, eventArgs)
if spell.skill == '強化魔法' then
if state.Buff['令狸執鼠の章'] and spell.type =='WhiteMagic' then
equip(sets.buff['令狸執鼠の章'])
end
elseif spell.skill == '精霊魔法' then
equip(get_hachirin(spell.element))
if state.Seidr.value then
equip({body="セイズルコタルディ"})
end
if state.Buff['気炎万丈の章'] then
equip(sets.buff['気炎万丈の章'])
end
if state.Buff['震天動地の章'] then
if state.VagaryMode.value then
equip(sets.Vagary)
else
equip(sets.midcast.Immanence)
end
end
if state.Buff['虚誘掩殺の策'] and spell.element == world.weather_element then
equip(sets.buff['虚誘掩殺の策'])
end
elseif spell.skill == '回復魔法' then
if (spellMap == 'Cure' or spellMap == 'Curaga') and spell.target.type == 'MONSTER' then
equip(set_combine(sets.midcast['精霊魔法'],get_hachirin(spell.element),{main="デイブレイクワンド", sub="アムラピシールド"}))
if state.Buff['意気昂然の章'] then
equip(sets.buff['意気昂然の章'])
end
else
equip(set_combine(get_hachirin(spell.element),{back="黄昏の羽衣"}))
end
end
end
function job_buff_change(buff, gain)
if buff == "机上演習:蓄積中" then
handle_equipping_gear(player.status)
elseif buff == "睡眠" then
if gain then -- 睡眠状態
equip({main="プライムスタッフ"})
end
end
end
function customize_idle_set(idleSet)
local weapon = sets.weapons[state.Weapons.value]
idleSet = set_combine(idleSet, weapon)
if state.Buff['机上演習:蓄積中'] then
idleSet = set_combine(idleSet, sets.buff['机上演習'])
elseif state.VagaryMode.value then
idleSet = set_combine(idleSet, sets.Vagary)
end
return idleSet
end
function customize_melee_set(meleeSet)
local weapon = sets.weapons[state.Weapons.value]
if player.equipment.sub == weapon.main.name then
weapon.sub.priority = 1
weapon.main.priority = 0
end
meleeSet = set_combine(meleeSet, weapon)
return meleeSet
end
function job_self_command(cmdParams, eventArgs)
if cmdParams[1] == 'lockstyleset' then
send_command('input /lockstyleset 41;')
elseif cmdParams[1] == 'white' then
send_command('gs c set Weapons white')
send_command('input /lockstyleset 52;')
elseif cmdParams[1] == 'black' then
send_command('gs c set Weapons black')
send_command('input /lockstyleset 53;')
elseif cmdParams[1] == 'aspir' then
local recasts = windower.ffxi.get_spell_recasts()
local recast_time_a2 = recasts[248]/60
local recast_time_a = recasts[247]/60
if recast_time_a2 == 0 then
send_command('input /magic '..windower.to_shift_jis('アスピルII')..' <stnpc>')
elseif recast_time_a == 0 then
send_command('input /magic '..windower.to_shift_jis('アスピル')..' <stnpc>')
else
windower.add_to_chat(30, 'アスピル リキャスト---> II: %.1fs, I: %.1fs':format(recast_time_a2, recast_time_a))
end
elseif cmdParams[1] == 'sc' then
if cmdParams[2] == 'start' then
disp_start_skillchain_message(cmdParams[3])
elseif cmdParams[2] == 'end' then
disp_end_skillchain_message(cmdParams[3])
else
windower.add_to_chat(123,'invalid argment: ' .. command)
end
end
end
sc_mb = {
['溶解'] = {'炎'},
['硬化'] = {'氷'},
['炸裂'] = {'風'},
['切断'] = {'土'},
['衝撃'] = {'雷'},
['振動'] = {'水'},
['貫通'] = {'光'},
['収縮'] = {'闇'},
['核熱'] = {'炎', '光'},
['重力'] = {'土', '闇'},
['分解'] = {'風', '雷'},
['湾曲'] = {'氷', '水'},
}
function get_auto_translate_char_squence(phrase)
local at_start = 0xFD
local at_end = 0xFD
local at_type = 0x02
local at_lang = 0x01
local phrase_id = gearswap.res.auto_translates:with('ja', phrase).id
if phrase_id then
local phrase_id_upper = bit.band(bit.rshift(phrase_id, 8), 0xFF)
local phrase_id_lower = bit.band(phrase_id, 0xFF)
if phrase_id_lower == 0x00 then
return nil
else
return string.char(at_start, at_type, at_lang, phrase_id_upper, phrase_id_lower, at_end)
end
end
return nil
end
function disp_start_skillchain_message(sc_name)
local sc_msg = get_auto_translate_char_squence(sc_name)
local sc_mb_msg = {}
for i, v in ipairs(sc_mb[sc_name]) do
sc_mb_msg[i] = get_auto_translate_char_squence(v)
end
local msg = 'input /p '..sc_msg..windower.to_shift_jis(' 1/2')..' MB:'
for i,v in ipairs(sc_mb_msg) do
msg = msg..v
end
msg = msg..windower.to_shift_jis(' → ')..' <t>'
send_command(msg)
end
function disp_end_skillchain_message(sc_name)
local sc_msg = get_auto_translate_char_squence(sc_name)
local sc_mb_msg = {}
for i, v in ipairs(sc_mb[sc_name]) do
sc_mb_msg[i] = get_auto_translate_char_squence(v)
end
local msg = 'input /p '..sc_msg..windower.to_shift_jis(' 2/2')..' MB:'
for i,v in ipairs(sc_mb_msg) do
msg = msg..v
end
msg = msg..windower.to_shift_jis(' → ')..' <t>'..windower.to_shift_jis(' ※<recast=震天動地の章>')
send_command(msg)
end
装備セット
function init_gear_sets()
sets.buff['机上演習'] = {
head="ACボード+3",
body="PDガウン+3",
waist="エンブラサッシュ",
left_ear="サバントピアス",
}
sets.buff['気炎万丈の章'] = {head="ABボネット+3"}
sets.buff['意気昂然の章'] = {head="ABボネット+3"}
sets.buff['令狸執鼠の章'] = {hands='ABブレーサー+3'}
sets.buff['震天動地の章'] = {}
sets.buff['簡素清貧の章'] = {legs="ABパンツ+3"}
sets.buff['勤倹小心の章'] = {legs="ABパンツ+3"}
sets.buff['電光石火の章'] = {feet="PDローファー+1"}
sets.buff['疾風迅雷の章'] = {feet="PDローファー+1"}
sets.buff['虚誘掩殺の策'] = {fet="ABローファー+3"}
sets.precast.JA['連環計'] = {legs="PDパンツ+3"}
sets.precast.JA['大悟徹底'] = {body="PDガウン+3"}
sets.midcast['陣頭指揮'] = {feet="PDローファー+1"}
sets.weapons = {}
sets.weapons.White = { main={name="マリグナスポール"},sub={ name="エンキストラップ"}}
sets.weapons.Black = { main={name="デイブレイクワンド"},sub={ name="アムラピシールド"}}
sets.idle = {
ammo="ストンチタスラム+1",
head="ABボネット+3",
body="ABガウン+3",
hands="ニャメガントレ",
legs="ABパンツ+3",
feet="ニャメソルレット",
neck="シビルスカーフ",
waist="キャリアーサッシュ",
left_ear="エテオレートピアス",
right_ear="ハーティーピアス",
left_ring="ピュリティーリング",
right_ring="シュネデックリング",
back={ name="ルッフケープ", augments={'Eva.+20 /Mag. Eva.+20','Occ. inc. resist. to stat. ailments+10',}},
}
sets.Vagary=
{
main="ハーミットワンド",
sub="モーグリガード",
ammo="サピエンスオーブ",
head={ name="PDボード+3", augments={'Enh. "Altruism" and "Focalization"',}},
body="ピンガチュニック+1",
hands="ACブレーサー+2",
legs="ピンガズボン",
feet="ACローファー+3",
neck="オルンミラトルク",
waist="エンブラサッシュ",
left_ear="マリグナスピアス",
right_ear="エンチャンピアス+1",
left_ring="キシャールリング",
back={ name="フィフォレケープ+1", augments={'Path: A',}},
}
sets.precast.FC = {
ammo="サピエンスオーブ",
head={ name="PDボード+3", augments={'Enh. "Altruism" and "Focalization"',}},
body="ピンガチュニック+1",
hands="ACブレーサー+2",
legs="ピンガズボン",
feet="ACローファー+3",
neck="オルンミラトルク",
waist="エンブラサッシュ",
left_ear="マリグナスピアス",
right_ear="エンチャンピアス+1",
left_ring="キシャールリング",
right_ring="メダダリング",
back={ name="フィフォレケープ+1", augments={'Path: A',}},
}
sets.precast.FC['ディスペガ'] = set_combine( sets.precast.FC,{main="デイブレイクワンド",})
sets.precast.FC['インパクト'] = set_combine( sets.precast.FC,{head=empty,body="クレパスクラプリス",})
sets.precast.WS['ロッククラッシャー'] = set_combine(sets.midcast['精霊魔法'] , {neck="クアンプネックレス"})
sets.precast.WS['アースクラッシャー'] = set_combine(sets.midcast['精霊魔法'] , {neck="クアンプネックレス"})
sets.precast.WS['カタクリスム'] = set_combine(sets.midcast['精霊魔法'] , {head="妖蟲の髪飾り+1",right_ring="アルコンリング",})
sets.precast.WS['シャインストライク '] = set_combine(sets.midcast['精霊魔法'] , {})
sets.precast.WS['セラフストライク'] = set_combine(sets.midcast['精霊魔法'] , {})
sets.precast.WS['フラッシュノヴァ'] = set_combine(sets.midcast['精霊魔法'] , {})
sets.midcast.Cure = {
main={ name="ムサ", augments={'Path: C',}},
sub="コーンスー",
ammo="ストンチタスラム+1",
head={ name="ヴァニヤフード", augments={'MP+50','"Cure" potency +7%','Enmity-6',}},
body={ name="ロゼトジャズラン+1", augments={'Path: A',}},
hands="ABブレーサー+3",
legs="ピンガズボン",
feet={ name="ヴァニヤクロッグ", augments={'MP+50','"Cure" potency +7%','Enmity-6',}},
neck="オルンミラトルク",
waist="コーネリアの黒帯",
left_ear="シテレアパール",
right_ear={ name="アバテルピアス+1", augments={'System: 1 ID: 1676 Val: 0','Mag. Acc.+11','Enmity-1',}},
left_ring="スティキニリング+1",
right_ring="スティキニリング+1",
back="サウマタージケープ",
}
sets.midcast['弱体魔法'] = {
main="ブンジロッド",
sub="アムラピシールド",
ammo="クォーツタスラム+1",
head="ABボネット+3",
body="ABガウン+3",
hands="ABブレーサー+3",
legs="ABパンツ+3",
feet="ACローファー+3",
neck={ name="アギュトストール+2", augments={'Path: A',}},
waist="オブシテナサッシュ",
left_ear="マリグナスピアス",
right_ear={ name="アバテルピアス+1", augments={'System: 1 ID: 1676 Val: 0','Mag. Acc.+11','Enmity-1',}},
left_ring="キシャールリング",
right_ring="メダダリング",
back={ name="オリストケープ+1", augments={'Path: A',}},
}
sets.midcast['ディスペガ'] = set_combine(sets.midcast['弱体魔法'] ,{main="デイブレイクワンド",})
sets.midcast['インパクト'] = set_combine(sets.midcast['弱体魔法'],{head=empty,body="クレパスクラプリス",})
sets.midcast['精霊魔法'] = {
main="ブンジロッド",
sub="アムラピシールド",
ammo={ name="ガストリタスラム+1", augments={'Path: A',}},
head="ABボネット+3",
body="ABガウン+3",
hands="ABブレーサー+3",
legs="ABパンツ+3",
feet="ABローファー+3",
neck={ name="アギュトストール+2", augments={'Path: A',}},
waist="スクリミルコード",
left_ear="王将の耳飾り",
right_ear={ name="アバテルピアス+1", augments={'System: 1 ID: 1676 Val: 0','Mag. Acc.+11','Enmity-1',}},
left_ring={ name="メタモルリング+1", augments={'Path: A',}},
right_ring="メダダリング",
back={ name="ルッフケープ", augments={'INT+20','Mag. Acc+20 /Mag. Dmg.+20','INT+10','"Mag.Atk.Bns."+10',}},
}
sets.midcast['メルトン'] = sets.midcast['精霊魔法']
sets.midcast.Helix = set_combine(sets.midcast['精霊魔法'] ,{
sub="カルミナス",
waist="スクリミルコード",
back="ブックワームケープ"
})
sets.midcast["光門の計II"] = set_combine(sets.midcast['精霊魔法'] ,{
main="デイブレイクワンド"
})
sets.midcast.Drain = set_combine(sets.midcast['精霊魔法'] ,{
main="ルビカンディティー",
legs={ name="PDパンツ+3", augments={'Enhances "Tabula Rasa" effect',}},
feet={ name="マーリンクラッコー", augments={'Mag. Acc.+30','"Drain" and "Aspir" potency +11','INT+5','"Mag.Atk.Bns."+2',}},
neck="エーラペンダント",
waist="風鳥の帯",
left_ring="エバネセンスリング",
right_ring="アルコンリング",
})
sets.midcast.Immanence={
main="ハーミットワンド",
sub="玄冥盾",
ammo="ストンチタスラム+1",
head={ name="ブリスタサリット+1", augments={'Path: A',}},
body={ name="ロゼトジャズラン+1", augments={'Path: A',}},
hands={ name="ガズブレスレット+1", augments={'Path: A',}},
legs={ name="AMスロップス+1", augments={'MP+80','"Mag.Atk.Bns."+25','Enmity-6',}},
feet="トゥティアサボ",
neck="上級近衛騎士カラー",
waist="コーネリアの黒帯",
left_ear="エテオレートピアス",
right_ear="ハーティーピアス",
left_ring="守りの指輪",
right_ring={ name="ゼラチナスリング+1", augments={'Path: A',}},
back={ name="フィフォレケープ+1", augments={'Path: A',}},
}
sets.midcast['強化魔法'] = {
main={ name="ムサ", augments={'Path: C',}},
sub="コーンスー",
head={ name="テルキネキャップ", augments={'"Conserve MP"+5','Enh. Mag. eff. dur. +10',}},
body={ name="PDガウン+3", augments={'Enhances "Enlightenment" effect',}},
hands={ name="テルキネグローブ", augments={'"Cure" potency +7%','Enh. Mag. eff. dur. +10',}},
legs={ name="テルキネブラコーニ", augments={'"Conserve MP"+5','Enh. Mag. eff. dur. +10',}},
feet={ name="テルキネピガッシュ", augments={'"Conserve MP"+5','Enh. Mag. eff. dur. +10',}},
neck="インカンタートルク",
waist="エンブラサッシュ",
right_ear="ミミルピアス",
}
sets.midcast.Regen = set_combine(sets.midcast['強化魔法'],{head="ABボネット+3",body="テルキネシャジュブ",back="ブックワームケープ"})
sets.midcast.Refresh = set_combine(sets.midcast['強化魔法'], {head="AMコイフ+1", legs="シェダルサラウィル",})
sets.midcast.BarElement = set_combine(sets.midcast['強化魔法'], {legs="シェダルサラウィル",})
sets.midcast.Phalanx = sets.midcast['強化魔法']
sets.midcast['オーラ'] = sets.midcast['強化魔法']
sets.midcast['ストンスキン'] = set_combine(sets.midcast['強化魔法'], {legs="シェダルサラウィル", neck='ノデンズゴルゲット', left_ear='アースクライピアス', waist="ジーゲルサッシュ",})
sets.midcast['アクアベール'] = set_combine(sets.midcast['強化魔法'], {main="バドースロッド", sub="アムラピシールド", head="AMコイフ+1", legs="シェダルサラウィル"})
sets.midcast['リフレシュ'] = set_combine(sets.midcast['強化魔法'], {head="AMコイフ+1"})
end
コメント