MENU

【GerSwap】Mote-libsで遊ぶ学者:サンプルコードあり

私の学者装備とマクロを紹介します。

目次

マクロ

私の学者マクロは4個だけで構成しています。

  • パレット1:回復
  • パレット2:強化
  • パレット3:精霊
  • パレット4:弱体

パレット1:回復

パレット1は回復と状態異常直しのパレットです。

攻ケア①は対アンデッド用の魔攻ケアルで意気昂然の章をセットで使うマクロで、攻ケア②は意気昂然の章なしのケアルマクロです。lockstyleマクロは攻撃マクロ点滅対策としてのロックスタイルセットです。

パレット2:強化

パレット2は強化魔法のパレットです。

オーラマクロは次のようにしています。

パレット3:精霊

パレット3は精霊系のパレットです。

詳しくは精霊系のマクロパレット節約術に書いておりますが、スクリプトによってパレットを節約していますので、すべての属性をこのパレットだけで完結させています。

連携①は震天トス、連携②は震天〆として使用しています。

パレット4:弱体

パレット4は弱体系のパレットです。

◆警告はパレット3に含めたかったのですが、設置するスペースがないので仕方なくパレット4に設置しています。

パレット10:その他

パレット10はその他諸々のパレットです。

セイズルはセイズルコタルディで精霊を詠唱するためのマクロで、主にジョブポなどでMBする場合に使います。

ベガリーはベガリーインスペクターで連携作成担当するときに使用するマクロです。ベガリーでは着替え無効になる時があるので、FC装備に着替えられず、震天連携を作れなくなることがあります。そのための措置として、常時FC装備で移動するためのマクロです。

6連携はベガリーお題の6連を作成するスクリプトを実行するためのマクロです。

呼び出しているマクロは次の通りです。

input /ja 震天動地の章 <me>
wait 1
input /ma エアロ <lastst>
wait 1
input /p 連携:2/6
wait 3

input /ja 震天動地の章 <me>
wait 1
input /ma ストーン <lastst>
wait 1
input /p 連携:3/6
wait 3

input /ja 震天動地の章 <me>
wait 1
input /ma エアロ <lastst>
wait 1
input /p 連携:4/6
wait 3

input /ja 震天動地の章 <me>
wait 1
input /ma ストーン <lastst>
wait 1
input /p 連携:5/6
wait 3

input /ja 震天動地の章 <me>
wait 1
input /ma エアロ <lastst>
wait 1
input /p 連携:6/6

ソースコード

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.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

コメント

コメントする

目次