魔法作成システム(ルドラの言霊システムっぽいの)

フォーラムルール
素材の利用規約を決めたいけど、どんなことを書けばいいのか分からない場合は、
素材のテンプレートをご利用下さい。
アバター
うなぎおおとろ
記事: 60
登録日時: 2017年7月16日(日) 13:38

魔法作成システム(ルドラの言霊システムっぽいの)

投稿記事by うなぎおおとろ » 2017年7月23日(日) 23:01

画像 #クレジット必要
※readmeかゲーム内に記述してください

画像 #営利可(素材販売ダメ)

画像 #改変可

画像 #素材だけの再配布も可

画像 #アダルトOK
画像 #グロOK

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

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

[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

添付ファイル
魔法作成システムv1.2.txt
(28.88 KiB) ダウンロード数: 100 回
最後に編集したユーザー うなぎおおとろ on 2017年8月16日(水) 16:49 [ 編集 1 回目 ]

アバター
うなぎおおとろ
記事: 60
登録日時: 2017年7月16日(日) 13:38

Re: 魔法作成システム(ルドラの言霊システムっぽいの)

投稿記事by うなぎおおとろ » 2017年7月28日(金) 19:32

ver1.1に更新しました。
・複数のパターンを設定可能に
・データベース上のスキル名を省略可能に
・データベース上のスキルで範囲が一つだけの場合に[]を省略可能に
・魔法削除時に$data_skillsから削除されない不具合を修正
アバター
うなぎおおとろ
記事: 60
登録日時: 2017年7月16日(日) 13:38

Re: 魔法作成システム(ルドラの言霊システムっぽいの)

投稿記事by うなぎおおとろ » 2017年8月16日(水) 16:49

ver1.2に更新しました
・リセット時に登録した魔法が初期化されない不具合を修正

“Ace:スクリプト素材(RGSS3)” へ戻る