魔法作成システム(ルドラの言霊システムっぽいの)
Posted: 2017年7月23日(日) 23:01

※readmeかゲーム内に記述してください





魔法名を入力すると自動的に魔法を作成できるようになるスクリプト素材です。
ルドラの秘宝にある言霊システムみたいなものが作れるようになります。

スクリプトの使用に正規表現の理解が必要なので、もしかすると少し難しいかもしれません。

[7/27追記]
バージョンを0.7から1.0に変更しました。
<変更点>
・派生設定(詳しくはスクリプト内で)
・魔法一覧で魔法の並び替えを導入
・作成可能な魔法の最大数を設定可能に
・消費MP分散度の一括設定を可能に
・イベントで魔法の取得を容易にできるように
コード: 全て選択
=begin
魔法作成システム ver1.1
byうなぎおおとろ(Twitter http://twitter.com/unagiootoro8388)
魔法名を入力すると自動的に魔法を作成できるようになるスクリプト素材です。
ルドラの秘宝にある言霊システムみたいなものが作れるようになります。
このスクリプトを使用する際は、readmeかゲーム内にクレジットの記載が必要です。
使用報告は不要ですが、もししていただけると作者が喜びます(^O^)
<魔法一覧>
このスクリプトを導入すると、メニュー画面に「魔法一覧」という項目が追加されます。
そこで魔法の登録、及び削除を行うことができます。また、Aボタンを押すことで
魔法の並び替えを行うことができます。
<イベントで魔法を作成する方法>
イベントコマンドのスクリプトで、
$magics.add("魔法名")
と入力すると、魔法を作成することができます。
ゲーム開始から一部の魔法は覚えているようにしたい場合や、人と話すと
魔法を教えてもらえるようにしたい場合などにお使いください。
<更新履歴>
ver1.2
・リセット時に登録した魔法が初期化されない不具合を修正
ver1.1
・複数のパターンを設定可能に
・データベース上のスキル名を省略可能に
・データベース上のスキルで範囲が一つだけの場合に[]を省略可能に
・魔法削除時に$data_skillsから削除されない不具合を修正
=end
class Magics
#ここからは設定です===========================================================
#入力可能な文字数。
Max_char = 6
#魔法使用時のメッセージ。
#「%s」には魔法名が入ります。
Message = "は%sを唱えた!"
#作成した魔法の一覧を表示するメニュー名
Menu_command_name = "魔法一覧"
#デフォルトの消費MP分散度
Default_dispersion = 50..150
#作成可能な魔法の最大数
Max_magic_num = 100
=begin
魔法パターンの設定
<設定方法>
[パターン, データベース上のスキル or [派生名, ()の位置], 消費MPの分散度設定]
という形で設定します。
パターン…文字列または正規表現で指定します。
複数のパターンを設定することも可能です。
その場合、
[パターン1, パターン2, ...]
というように指定します。
複数のパターンを指定した場合、それらのパターンのうち、どれか一つでも
マッチするものがあれば、その設定が使用されます。
正規表現とは、文字列の集合を一つの文字列で表す方法です。
詳しくは割愛しますが、//で囲まれた文字列が正規表現となります。
例えば、/ホイミ/は、"ベホイミ"と"ホイミスライム"の両方と一致します。
また、正規表現中の記号である「^」はパターンが先頭一致を表し、
「$」は後方一致を表します。つまり、
/^ホイミ/は"ホイミスライム"とマッチしますが、
"ベホイミ"とはマッチしません。
なお、設定の一番最後の//はどんな文字列でもマッチします。
データベース上のスキル…その名の通り、データベースに登録されたスキルです。
例えば、"ファイア"と設定した場合、データベースの
名前がファイアのスキルが実際の魔法となります。
なお、スキル名を直接入力するほかに、スキルのIDを
入力することでも、指定することができます。この場合、
データベースでスキル名が重複していても問題ありません。
最後に、スタートスキルID..エンドスキルIDという
形式で設定した場合、その範囲内から入力された魔法名
をキーとしてランダムにスキルが選択されます。
また[10..20, 30, 40..50]というように設定することで
複数の範囲を設定することもできます。
この項目を省略した場合、パターンが文字列であれば、
パターンの文字列をデータベース上のスキル名として
扱います。
[派生名, ()の位置]…「★魔法の派生について」で説明します。
消費MPの分散度設定…ここに「最低%..最高%」という形式で設定することで、
同じスキルが元でも魔法名によって消費MPが異なるようにする
設定ができます。なお、この項目は省略可能です。
省略した場合は、消費MPの分散度設定は適用されません。
また、trueを設定した場合、デフォルトの消費MP分散度が
適用されます。
事前に用意された設定を参考にすると、割と分かりやすいかと思うので、
6番目の設定の
["ドアンガ", "ファイアⅡ"], [/^ドアンガ/, "ファイアⅡ", 50..150],
を例に説明します。
まず、["ドアンガ", "ファイアⅡ"]ですが、これはドアンガが入力された場合、
魔法の正体はデータベース上のスキルのファイアⅡとなります。
次に、[/^ドアンガ/, "ファイアⅡ", 50..150]ですが、
これは先頭がドアンガである何かしらの魔法名が入力された場合、ファイアⅡを
指定することを表します。また、その際消費MPは入力された魔法名によって
50%~150%の間で変化することを表します。
なお、設定は上に記述されものから優先的に適応されます。
そのため、[/コルド/, "アイス"], [/^レコルド/, "アイスⅡ"],
という順に設定すると、レコルドの正体はアイスⅡでなく、アイスに
なってしまうので、注意してください。
★魔法の派生について
特定のワードが末尾にある場合、そのワードを除いた魔法名から作成される魔法の
効果範囲を全体化したい場合などに使用します。派生を使用するときは、
[パターン, [派生名, パターン中の()の位置]]
の形式で設定します。なお、この場合、消費MPの分散度設定は使用しません。
パターン…正規表現を指定します。複数の正規表現を指定することも可能です。
派生名…魔法を派生される場合に、どのような派生を行うのかを識別するために
使用します。
()の位置…パターンの正規表現//の中で、左から何番目の()を
使用するのかを示します。一番左の場合、1になります。
1番目の設定の
[/(.+)オル$/, ["全体", 1]],
を例に説明します。
この場合、/(.+)オル$/は、最後がオルとなる文字列すべてとマッチします。
そして、パターン中の1番目の ()の中の.+のパターン該当する文字列、
(正規表現の.+は一文字以上の任意の文字列という意味)
すなわち入力された文字列からオルを取り除いた文字列をキーとし、
魔法パターンを再検索します。そして該当するパターンを発見した場合、
そのパターンから特定されたデータベース上のスキルをもとに派生設定の
テーブルを検索し、一致するデータを発見するとそのデータにある派生先魔法に
該当するデータベース上のスキルの効果を持つ魔法を作成します。
そのため、アンガオルと入力された場合、最初に1番目の設定とマッチし、
次にアンガオルから抽出されたアンガが7番目の設定とマッチします。
このとき、アンガの対象となるファイアは派生設定では、派生名が全体のとき
フレイムに派生すると設定されているため、アンガオルはデータベース上の
フレイムに該当する魔法として作成されます。
=end
Magic_table = [
[/(.+)オル$/, ["全体", 1]],
[[/^ミナ(.+)/, /(.+)ナ$/], ["全体", 1]],
[[/^オメガ(.+)/, /ギガ(.+)/], ["上位", 1]],
["ドアンガ", "ファイアⅡ"], [/^ドアンガ/, "ファイアⅡ", true],
["アンガ", "ファイア"], [/アンガ/, "ファイア", true],
["レコルド", "アイスⅡ"], [/^レコルド/, "アイスⅡ", true],
["コルド", "アイス"], [/コルド/, "アイス", true],
["サボルド", "サンダーⅡ"], [/^サボルド/, "サンダーⅡ", true],
["ボルド", "サンダー"], [/^ボルド/, "サンダー", true],
["アクアス", "ウォーター"], [/アクアス/, "ウォーター", true],
["マグニ", "ストーン"], [/^マグニ/, "ストーン", true],
["ハリケン", "ウィンド"], [/^ハリケン/, "ウィンド", true],
["ヒセイ", "セイント"], [/^ヒセイ/, "セイント", true],
["グード", "シェイド"], [/^グード/, "シェイド", true],
["ハノグァ", "バースト"], [/^ハノグァ/, "バースト", true],
["カゼンカイク", "ヒールⅢ"],
["ゼカイク", "ヒールⅡ"], [/^ゼカイク/, "ヒールⅡ", true],
["カイク", "ヒール"], [/^カイク/, "ヒール", true],
["ヨナオルス", "キュアⅡ"], [/^ヨナオルス/, "キュアⅡ", true],
["ナオルス", "キュア"], [/^ナオルス/, "キュア", true],
["シンリザレク", "レイズⅡ"],
["リザレク", "レイズ"], [/リザレク/, "レイズ", true],
["フォスアプ", "ウェポンブレス"], [/フォスアプ$/, "ウェポンブレス", true],
["ヘナフォス", "ウェポンカース"], [/^ヘナフォス/, "ウェポンカース", true],
["バリドアプ", "アーマーブレス"], [/バリドアプ$/, "アーマーブレス", true],
["ヘナバリド", "アーマーカース"], [/^ヘナバリド/, "アーマーカース", true],
["ディンアプ", "ディバインブレス"], [/ディンアプ$/, "ディバインブレス", true],
["ヘナディン", "ディバインカース"], [/^ヘナディン/, "ディバインカース", true],
["ソックアプ", "クイックムーブ"], [/ソックアプ$/, "クイックムーブ", true],
["ヘナソック", "スロームーブ"], [/^ヘナソック/, "スロームーブ", true],
["セイゲート", "ライフドレイン"], [/セイゲート/, "ライフドレイン", true],
["マナゲート", "マナドレイン"], [/マナゲート/, "マナドレイン", true],
["ドグ", "ポイズン"], [/ドグ/, "ポイズン", true],
["イミエナ", "ブラインド"], [/イミエナ/, "ブラインド", true],
["シャラフ", "サイレンス"], [/シャラフ/, "サイレンス", true],
["パニクル", "コンフューズ"], [/パニクル/, "コンフューズ", true],
["ネスプ", "スリープ"], [/ネスプ/, "スリープ", true],
["ビギリ", "パラライズ"], [/ビギリ/, "パラライズ", true],
[//, 26..74, 50..150],
]
=begin
魔法の派生設定
[派生元魔法、派生名、派生先魔法]の形式で設定します。
派生元魔法…派生元のスキルのデータベース上での名前、
もしくはスキルIDを設定します。
派生名…派生の種別を識別するために設定する名前です。
派生先魔法…派生先のスキルのデータベース上での名前、
もしくはスキルIDを設定します。
=end
Magic_derive = [
["ファイア", "全体", "フレイム"],
["ファイアⅡ", "全体", "フレイムⅡ"],
["アイス", "全体", "ブリザード"],
["アイスⅡ", "全体", "ブリザードⅡ"],
["サンダー", "全体", "スパーク"],
["サンダーⅡ", "全体", "スパークⅡ"],
["ウォーター", "全体", "ウェーブ"],
["ストーン", "全体", "クェイク"],
["ウィンド", "全体", "トルネード"],
["セイント", "全体", "スターライト"],
["シェイド", "全体", "ダークネス"],
["バースト", "全体", "ニュークリア"],
["ヒール", "全体", "リカバー"],
["ヒールⅡ", "全体", "リカバーⅡ"],
["ファイア", "上位", "ファイアⅡ"],
["フレイム", "上位", "フレイムⅡ"],
["アイス", "上位", "アイスⅡ"],
["ブリザード", "上位", "ブリザードⅡ"],
["サンダー", "上位", "サンダーⅡ"],
["スパーク", "上位", "スパークⅡ"],
["ヒール", "上位", "ヒールⅡ"],
["ヒールⅡ", "上位", "ヒールⅢ"],
["リカバー", "上位", "リカバーⅡ"],
["キュア", "上位", "キュアⅡ"],
["レイズ", "上位", "レイズⅡ"],
]
#設定はここまでです===========================================================
include Enumerable
def initialize
@magics = Array.new
end
def [](index)
@magics[index]
end
def []=(index, magic)
@magics[index] = magic
end
def each(&block)
if block
@magics.each(&block)
else
@magics.each
end
end
def to_a
@magics
end
alias to_ary to_a
def length
@magics.length
end
def <<(magic)
return unless magic
@magics << magic
$data_skills << magic
end
def include_magic?(magic_name)
@magics.each_with_index do |magic, i|
return false unless magic
return i if magic.name == magic_name
end
false
end
def delete_magic(magic_name)
@magics.each do |magic|
if magic.name == magic_name
@magics.delete(magic)
$data_skills[magic.id] = nil
end
end
end
def add(name)
if i = include_magic?(name)
magic = @magics.delete_at(i)
@magics << magic
else
self << create_magic(*search_skill(name))
end
end
def sort_by_id
@magics.sort! do |magic1, magic2|
res = magic1.from_id <=> magic2.from_id
res == 0 ? magic1.mp_cost <=> magic2.mp_cost : res
end
end
def sort_by_aiueo
@magics.sort! do |magic1, magic2|
res = magic1.name <=> magic2.name
res == 0 ? magic1.mp_cost <=> magic2.mp_cost : res
end
end
private
def search_skill(name)
Magic_table.each do |key, val, dispersion|
res, md = judge_key(key, name)
next unless res
if val.is_a?(String)
skill = search_skill_by_name(val)
elsif val.is_a?(Integer)
skill = $data_skills[val]
elsif val.is_a?(Range)
skill = skill_random(name, [val])
elsif val.is_a?(Array)
if val[0].is_a?(String)
skill, dispersion, hash_name = get_derive_skill(val[0], md[val[1]])
else
skill = skill_random(name, val)
end
elsif !val
p key
skill = search_skill_by_name(key)
end
next unless skill
return [skill, name, dispersion, hash_name]
end
nil
end
def judge_key(key, name)
if key.is_a?(Array)
key.each do |ptn|
return true, $~ if ptn === name
end
end
return true, $~ if key === name
return false, nil
end
def search_skill_by_name(name)
$data_skills.compact.each do |skill|
return skill if skill.name == name
end
nil
end
def get_derive_skill(derive, key)
skill, name, dispersion = search_skill(key)
Magic_derive.each do |name1, derive2, name2|
if name1 == skill.name && derive == derive2
return [search_skill_by_name(name2), dispersion, name]
end
end
nil
end
def create_magic(skill, name, dispersion, hash_name)
return nil unless skill
magic = skill.clone
magic.from_id = magic.id
magic.id = $data_skills.length
magic.name = name
magic.message1 = sprintf(Message, name)
if dispersion
dispersion = Default_dispersion if dispersion == true
hash_name = name unless hash_name
magic.mp_cost = magic.mp_cost * get_hash_num(hash_name, dispersion) / 100
end
magic
end
def skill_random(name, magic_range)
ary = []
magic_range.each do |obj|
if obj.is_a?(Integer)
ary << obj
elsif obj.is_a?(Range)
ary.concat(obj.to_a)
end
end
id = ary[get_hash_num(name, ary.length)]
$data_skills[id]
end
def get_hash_num(name, rand_val)
seed = name.unpack("H*")[0].to_i(16)
Random.new(seed).rand(rand_val)
end
end
module DataManager
class << self
alias magic__create_game_objects create_game_objects
end
def self.create_game_objects
magic__create_game_objects
$magics = Magics.new
end
end
class RPG::Skill
attr_accessor :from_id
end
class Scene_MagicName < Scene_MenuBase
def start
super
@edit_window = Window_MagicNameEdit.new(@skill_id, Magics::Max_char)
@input_window = Window_MagicNameInput.new(@edit_window)
@input_window.set_handler(:ok, method(:on_input_ok))
@input_window.set_handler(:cancel, method(:return_scene))
end
def on_input_ok
$magics.add(@edit_window.name)
return_scene
end
end
class Window_MagicNameEdit < Window_Base
attr_reader :name
attr_reader :index
attr_reader :max_char
def initialize(skill_id, max_char)
x = (Graphics.width - 360) / 2
y = (Graphics.height - (fitting_height(1) + fitting_height(9) + 8)) / 2
super(x, y, 360, fitting_height(1))
@skill_id = skill_id
@max_char = max_char
@name = ""
@index = @name.size
deactivate
refresh
end
def restore_default
end
def add(ch)
return false if @index >= @max_char
@name += ch
@index += 1
refresh
return true
end
def back
return false if @index == 0
@index -= 1
@name = @name[0, @index]
refresh
return true
end
def face_width
return 96
end
def char_width
text_size($game_system.japanese? ? "あ" : "A").width
end
def left
return ((@max_char + 1) * char_width) - char_width / 2
end
def item_rect(index)
Rect.new(left + index * char_width, 0, char_width, line_height)
end
def underline_rect(index)
rect = item_rect(index)
rect.x += 1
rect.y += rect.height - 4
rect.width -= 2
rect.height = 2
rect
end
def underline_color
color = normal_color
color.alpha = 48
color
end
def draw_underline(index)
contents.fill_rect(underline_rect(index), underline_color)
end
def draw_char(index)
rect = item_rect(index)
rect.x -= 1
rect.width += 4
change_color(normal_color)
draw_text(rect, @name[index] || "")
end
def refresh
contents.clear
@max_char.times {|i| draw_underline(i) }
@name.size.times {|i| draw_char(i) }
cursor_rect.set(item_rect(@index))
end
end
class Window_MagicNameInput < Window_NameInput
String_table = [ 'ア','イ','ウ','エ','オ', 'ガ','ギ','グ','ゲ','ゴ',
'カ','キ','ク','ケ','コ', 'ザ','ジ','ズ','ゼ','ゾ',
'サ','シ','ス','セ','ソ', 'ダ','ヂ','ヅ','デ','ド',
'タ','チ','ツ','テ','ト', 'バ','ビ','ブ','ベ','ボ',
'ナ','ニ','ヌ','ネ','ノ', 'パ','ピ','プ','ペ','ポ',
'ハ','ヒ','フ','ヘ','ホ', 'ァ','ィ','ゥ','ェ','ォ',
'マ','ミ','ム','メ','モ', 'ッ','ャ','ュ','ョ','ー',
'ヤ','ユ','ヨ','ワ','ン', 'ラ','リ','ル','レ','ロ',
'ヴ', '', '', '', '', '', '', '', '取消', '決定']
def table
[String_table]
end
def on_name_ok
if @edit_window.name.empty?
if @edit_window.restore_default
Sound.play_ok
else
Sound.play_buzzer
end
else
Sound.play_ok
call_ok_handler
end
end
def on_cancel
Sound.play_cancel
call_cancel_handler
end
def cursor_down(wrap)
if @index == 70
@index = 80
elsif @index == 78
@index = 88
elsif @index == 79
@index = 89
elsif @index < 70 or wrap
if @index == 80
@index = 0
elsif @index == 88
@index = 8
elsif @index == 89
@index = 9
else
@index = (index + 10) % 80
end
end
end
def cursor_up(wrap)
if @index == 10
@index = 0
elsif @index == 18
@index = 8
elsif @index == 19
@index = 9
elsif @index >= 10 or wrap
if @index == 0
@index = 80
elsif @index == 8
@index = 88
elsif @index == 9
@index = 89
else
@index = (index + 70) % 80
end
end
end
def cursor_right(wrap)
if @index == 89 and wrap
@index = 80
elsif @index == 80
@index = 88
elsif @index == 88
@index = 89
elsif @index % 10 < 9 and @index < 81
@index += 1
elsif wrap
@index -= 9
end
end
def cursor_left(wrap)
if @index == 80 and wrap
@index = 89
elsif @index == 88
@index = 80
elsif @index % 10 > 0
@index -= 1
elsif wrap
@index += 9
end
end
def character
@index <= 80 ? table[@page][@index] : ""
end
def process_jump
if @index != 89
@index = 89
Sound.play_cursor
end
end
def is_ok?
@index == 89
end
def is_cancel?
@index == 88
end
def process_ok
if !character.empty?
on_name_add
elsif is_ok?
on_name_ok
elsif is_cancel?
on_cancel
end
end
end
module DataManager
class << self
alias magic__make_save_contents make_save_contents
alias magic__extract_save_contents extract_save_contents
end
def self.make_save_contents
contents = magic__make_save_contents
contents[:magics] = $magics
contents[:skills] = $data_skills
contents
end
def self.extract_save_contents(contents)
magic__extract_save_contents(contents)
$magics = contents[:magics]
$data_skills = contents[:skills]
end
end
class Game_Actor < Game_Battler
def skills
skills = (@skills | added_skills).sort.collect {|id| $data_skills[id] }
skills | $magics
end
end
class Window_MenuCommand
alias magic__add_original_commands add_original_commands
def add_original_commands
magic__add_original_commands
add_command(Magics::Menu_command_name, :magic_list)
end
end
class Scene_Menu
alias magic__create_command_window create_command_window
def create_command_window
magic__create_command_window
@command_window.set_handler(:magic_list, method(:command_magic_list))
end
def command_magic_list
SceneManager.call(Scene_MagicList)
end
end
class Scene_MagicList < Scene_MenuBase
def start
super
create_window_magic_list
create_window_magic_control
create_window_magic_sort
end
def update
super
magic_sort if Input.trigger?(:A)
end
def create_window_magic_list
help_window = Window_Help.new
y = help_window.height
height = Graphics.height - y
@window_magic_list = Window_MagicList.new(0, y, Graphics.width, height)
@window_magic_list.set_handler(:cancel, method(:return_scene))
@window_magic_list.set_handler(:ok, method(:magic_list_ok))
@window_magic_list.help_window = help_window
@window_magic_list.refresh
@window_magic_list.activate
end
def create_window_magic_control
@window_magic_control = Window_MagicControl.new
@window_magic_control.set_handler(:delete, method(:magic_control_delete))
@window_magic_control.set_handler(:no_delete, method(:magic_control_cancel))
@window_magic_control.set_handler(:cancel, method(:magic_control_cancel))
end
def create_window_magic_sort
@window_magic_sort = Window_MagicSort.new
@window_magic_sort.set_handler(:sort_by_id, method(:magic_sort_by_id))
@window_magic_sort.set_handler(:sort_by_aiueo, method(:magic_sort_by_aiueo))
@window_magic_sort.set_handler(:no_sort, method(:magic_sort_cancel))
@window_magic_sort.set_handler(:cancel, method(:magic_sort_cancel))
end
def magic_list_ok
if @window_magic_list.item
@window_magic_control.open
@window_magic_control.activate
else
@window_magic_list.help_window.hide
SceneManager.call(Scene_MagicName)
end
end
def magic_control_delete
$magics.delete_magic(@window_magic_list.item.name)
magic_control_cancel
@window_magic_list.refresh
end
def magic_control_cancel
@window_magic_control.close
@window_magic_control.deactivate
@window_magic_list.activate
end
def magic_sort
if Input.trigger?(:A)
magic_control_cancel
@window_magic_list.deactivate
@window_magic_sort.open
@window_magic_sort.activate
end
end
def magic_sort_by_id
$magics.sort_by_id
magic_sort_cancel
@window_magic_list.refresh
end
def magic_sort_by_aiueo
$magics.sort_by_aiueo
magic_sort_cancel
@window_magic_list.refresh
end
def magic_sort_cancel
@window_magic_sort.close
@window_magic_sort.deactivate
@window_magic_list.activate
end
end
class Window_MagicList < Window_Selectable
def initialize(x, y, width, height)
super
@index = 0
@stype_id = 1
@data = []
end
def col_max
return 2
end
def item_max
if @data
if @data.length < Magics::Max_magic_num
@data.length + 1
else
@data.length
end
else
1
end
end
def item
@data && index >= 0 ? @data[index] : nil
end
def make_item_list
@data = $magics
end
def draw_item(index)
skill = @data[index]
if skill
rect = item_rect(index)
rect.width -= 4
draw_item_name(skill, rect.x, rect.y, true)
draw_skill_cost(rect, skill)
end
end
def draw_skill_cost(rect, skill)
change_color(mp_cost_color, true)
draw_text(rect, skill.mp_cost, 2)
end
def update_help
if item
@help_window.set_item(item)
else
@help_window.set_text("新しい魔法を追加します。")
end
end
def item
$magics[index]
end
def refresh
make_item_list
create_contents
draw_all_items
end
end
class Window_MagicControl < Window_Command
def initialize
super(0, 0)
update_placement
self.openness = 0
end
def update_placement
self.x = (Graphics.width - width) / 2
self.y = (Graphics.height - height) / 2
end
def make_command_list
add_command("削除する", :delete)
add_command("削除しない", :no_delete)
end
end
class Window_MagicSort < Window_Command
def initialize
super(0, 0)
update_placement
self.openness = 0
end
def window_width
280
end
def update_placement
self.x = (Graphics.width - width) / 2
self.y = (Graphics.height - height) / 2
end
def make_command_list
add_command("並び替える(種類順)", :sort_by_id)
add_command("並び替える(アイウエオ順)", :sort_by_aiueo)
add_command("並び替えない", :no_sort)
end
end