查看: 919|回复: 1

[有事请教] 想请问一下RMVA 有没有捏脸的脚本或插件

[复制链接]
梦石
0
星屑
1239
在线时间
143 小时
注册时间
2020-8-21
回帖
44

极短22参与

发表于 2025-8-5 06:00:09 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
想制作一个有一点meta元素的游戏,想在一开始让角色的脸可以被捏加一点氛围。
梦石
0
星屑
29896
在线时间
5733 小时
注册时间
2016-3-8
回帖
1653
发表于 2025-8-5 09:35:47 | 显示全部楼层
https://forums.rpgmakerweb.com/i ... cter-creation.5775/
或者
https://endressdreamer.fool.jp/RGSS3_14.html
[pre lang="ruby"]#==============================================================================
# ■ 主人公の外見とフェイスを編集可能にするスクリプト
#    Ver 0.03 2012/01/10 パーツの重ね順の不具合を修正
#    Ver 0.02 2011/12/25 著作権表示を変更
#    Ver 0.01 2011/12/18
#    http://fweb.midi.co.jp/~mikagami/atelier/
#------------------------------------------------------------------------------
#
# このスクリプトは、VX Ace にもれなく付属する「キャラクター生成」ツールの
# 素材を利用し、ゲーム上でも同様のキャラクター生成を可能にするものです。
# このスクリプト単体では動作しません。必ずプロジェクト(の画像ファイル)ごと
# 導入して下さい。
#
# ※注意!
# ・歩行グラフィックは、元ツールの素材全てを使用しているので、同等のキャラが
#  出来るはずです。フェイスに関しては、意図的に素材を限定しています。
#  具体的には、「顔の輪郭」「目」「鼻」「口」「目の高さ」「襟元」「文様」
#  「装身具」の素材が使用していなかったり、1種類のみ、などとなっています。
# ・使用方法はプロジェクトを参考にして下さい。
# ・フェイスパーツのうち、影?のパーツの合成に失敗していると思います。
#  とりあえずよく分からない&現状でもそれほど違和感がないので、
#  そのままにしてあります。(前髪や眉毛、目の影の部分です。)
# ・比較的独立性が高いスクリプトなので、スクリプトの競合が起こる可能性は
#  高くないと思います。ただし Cacheモジュールで一部上書き定義をしているので
#  そこだけは注意。(↓590行目あたり)
# ・各パーツの画像ファイルはキャラ作成のたびに存在チェックをしているので、
#  無駄に重いかもしれません。ただし作成さえしてしまえばキャラクタ画像は
#  キャッシングされるので、それほど問題ないはずです。
# ・各パーツの画像ファイルは "Graphics/System/" へ入れてますが、
#  大した意味はありません。
# ・各パーツの画像ファイルのファイル名の先頭に "@" を付けていますが、
#  大した意味はありません。
# ・ひととおりの動作確認はしていますが、パーツの重ね合わせの順番等が
#  間違っていたり、その他不具合がある可能性があります。
# ・このスクリプトの著作権は著者にあります。
#  ですがスクリプトの利用や改造・再配布に著者の許可は必要ありません。
#  著者には未完成な部分の補完や改造依頼に対する対応義務はありません。
#  他者に改造依頼するより、あなた自身が改造すれば、みんなが幸せになります。
#
#==============================================================================
#==============================================================================
#    ☆VXAce RGSS3 「キャラエディット改」☆
#      EnDlEss DREamER
#     URL:http://mitsu-evo.6.ql.bz/
#     製作者 mitsu-evo
#     Last:2014/2/23
#   ゲーム内でキャラクター生成ツールとほぼ同等のエディットが可能となる。
#     ▼ 素材よりも下に。
#==============================================================================
$ed_rgss3 = {} if $ed_rgss3 == nil
$ed_rgss3["ed_chara_custom"] = true

=begin

  ★ 概要 ★

  ・上記、元制作者様の仰せの通りに改変した素材です。
  ・主な変更点は・・・
   1.パーツのフォルダが「Graphics」フォルダ内に純正生成ツールの
    フォルダ「Generator」を丸ごと入れてます。
   2.口元パーツについて数点の改変素材が追加されています。
   3.「文様」「目の高さ」は設定できません。
   4.エディット後「決定」を押した時に表情別の顔グラが自動で追加されます。
   5.キャラ制作後「決定」をするとPNGで顔グラが出力されます。


  ★ 自動表情作成処理について ★

  ・眉毛と口元のパーツを変更することによって作成しています。
   作成した顔をベースにして7つの顔を自動作成しています。
  ・処理部分については以下の★部分の解説を参照。
   925行目~1055行目付近までが自動表情作成部分。
  #--------------------------------------------------------------------------
  # ● 攻撃顔の取得
  #     character_name  : actor の character_name
  #--------------------------------------------------------------------------
  def self.atk_face(character_name)★character_nameは歩行グラ含みの名前。
    currents = get_face_name(character_name,true)
    return get_character_default if currents[NO_CLOTH] == nil
    sex = get_sex2(character_name)   ★ sexは「0:男」「1:女」となっている
    # 眉毛と口のパーツ番号設定
    if currents[NO_EYEBROWS][0] == 3 ★ currentsはパーツリストのNO_EYEBROWS 番目
      # 平八眉毛の場合          [Eyebrows??,色番号]という配列。??は任意の値 
      eb_num = sex == 0 ? "04" : "04"  
    else
      # それ以外
      eb_num = sex == 0 ? "02" : "02" ★ eb_numは眉毛パーツの何番目のファイルか?
    end                  を男女別で指定している。
    m_num = sex == 0 ? "10" : "14"  ★ これは口元のファイル名を指定している。
    currents[9][0] = EYEBROWS_M + eb_num  ★ 眉毛本体のパーツ
    currents[8][0] = EYEBROWS_M + eb_num + "s" ★ 眉毛の合成パーツ
    currents[5][0] = MOUTH_M + m_num      ★ 口のパーツ
    return get_name(currents,sex)  ★ 最終的に変更後のcharacter_nameを返す。
  end
  
   ★ 自動表情設定の変更方法 ★
  ・currentsの配列の内容は「get_face_name」メソッドを参照。
   定数でEYEBROWS_MやEYES_Mなどが記述された部分があるので
  ・parts[??]の番号をcurrents[??][0] = ・・・・と入れる。
  
   currents[??][0] = FRONT_HAIR_Mなどの定数 + 文字列の番号
  
   が基本。FRONT_HAIR_Mは変える場所によって違う定数を使用。
   参照するパーツのファイル名が入る。
   合成パーツがある場合も同様に行い、最後に+"s"とか"a"とかパーツごとに入れる。
   実際のファイル名と確認しながら行うと間違いが少なくなる。
  ・なお、顔グラ自動作成順はバトルレイアウト変更の表情変化に準じている。



=end
class Bitmap
  #--------------------------------------------------------------------------
  # ● ピング画像として保存
  #     filename : ファイル名
  #     alpha    : アルファチャンネルの有無
  #--------------------------------------------------------------------------
  def save_png(filename, alpha = false)
    # 識別
    sgnt = "\x89PNG\r\n\x1a\n"
    # ヘッダ
    ihdr = chunk('IHDR', [width,height,8,(alpha ? 6 : 2),0,0,0].pack('N2C5'))
    # 画像データ
    data = []
    for y in 0...height
      data << 0
      for x in 0...width
        color = self.get_pixel(x, y)
        data << color.red
        data << color.green
        data << color.blue
        data << color.alpha if alpha
      end
    end
    idat = chunk('IDAT', Zlib::Deflate.deflate(data.pack('C*')))
    # 終端
    iend = chunk('IEND', "")
    # ファイルに書き出す
    File.open(filename, 'wb'){ |file|
      file.write(sgnt)
      file.write(ihdr)
      file.write(idat)
      file.write(iend)}
  end
  private
  #--------------------------------------------------------------------------
  # ● チャンクの作成
  #--------------------------------------------------------------------------
  def chunk(name, data)
    return [data.size, name, data, Zlib.crc32(name + data)].pack('NA4A*N')
  end
end
module CustomChara
  #--------------------------------------------------------------------------
  # ● 定数
  #--------------------------------------------------------------------------
  # PNG出力するかどうか?(プロジェクトフォルダ内に作成)
  OUTPUT_PNG = false
  # カラーの数
  HAIR_COLOR       = 8
  EYE_COLOR        = 8
  SKIN_COLOR       = 4
  CLOTH_M_COLOR    = 8
  CLOTH_F_COLOR    = 8
  CLOAK_COLOR      = 8
  WING_COLOR       = 8
  GLASSES_COLOR    = 8
  ACC1_COLOR       = 8
  ACC2_COLOR       = 8
  #========== 歩行グラフィック用
  # 前髪
  FRONT_HAIR_M    = 'FrontHair' # ファイル名
  FRONT_HAIR_NUM  = [16,16] # 素材の数[男の数,女の数]
  # 後髪
  REAR_HAIR_M     = 'RearHair'
  REAR_HAIR_NUM   = [16,16]
  # ヒゲ
  BEARD_M         = 'Beard'
  BEARD_NUM       = [4,0]  # 男は3つだが、髭なしも含めて4つ
  # 服
  CLOTH_M         = 'Cloth'
  CLOTH_NUM       = [20,20]
  # 頭・輪郭
  HEAD_M           = 'Head'
  FACE_M           = 'Face'
  FACE_NUM         = [8,12]
  # 首
  NECK_M           = 'Neck'
  NECK_NUM         = [16,16]
  # 眉毛
  EYEBROWS_M       = 'Eyebrows'
  EYEBROWS_NUM     = [9,9]
  # 目
  EYES_M           = 'Eyes'
  EYES_NUM         = [10,11]
  # 耳
  EARS_M           = 'Ears'
  EARS_NUM         = [3,3]
  # 口
  MOUTH_M          = 'Mouth'
  MOUTH_NUM        = [11,15]
  # 鼻
  NOSE_M           = 'Nose'
  NOSE_NUM         = [10,11]
  # 獣耳
  KEMONO_M         = 'Kemono'
  KEMONO_NUM       = [6,6] # 共通パーツは男女同じ数を入れる。獣耳なし入れて6つ
  # 尻尾
  TAIL_M           = 'Tail'
  TAIL_NUM         = [6,6] # 共通 数+1
  # マント
  CLOAK_M          = 'Cloak'
  CLOAK_NUM        = [9,9] # 共通 数+1
  # 羽
  WING_M           = 'Wing'
  WING_NUM         = [4,4] # 共通 数+1
  # メガネ
  GLASSES_M        = 'Glasses'
  GLASSES_NUM      = [7,7] # 共通 数+1
  # 装身具1
  ACC1_M           = 'Acc1_'
  ACC1_NUM         = [6,6] # 共通 数+1
  # 装身具2
  ACC2_M           = 'Acc2_'
  ACC2_NUM         = [16,16] # 共通 数+1
  # 画像ファイルなし
  NONE             = '@NONE'
  # パーツ画像の重ねる順番の定義
  NO_WING1      = 0   # 00 羽1
  NO_TAIL1      = 1   # 01 尻尾1
  NO_REAR_HAIR1 = 2   # 02 後髪1
  NO_CLOAK1     = 3   # 03 マント1
  NO_CLOTH      = 4   # 04 服
  NO_SKIN       = 5   # 05 肌
  NO_TAIL2      = 6   # 06 尻尾2
  NO_HEAD       = 7   # 07 頭(歩行グラ)
  NO_FACE       = 8   # 08 顔
  NO_EARS1      = 9   # 09 耳1
  NO_EYEBROWS   = 10  # 10 眉毛
  NO_EYES       = 11  # 11 目
  NO_NOSE       = 12  # 12 鼻
  NO_MOUTH      = 13  # 13 口
  NO_GLASSES    = 14  # 14 メガネ
  NO_CLOAK2     = 15  # 15 マント2
  NO_BEARD      = 16  # 16 ヒゲ
  NO_REAR_HAIR2 = 17  # 17 後髪2
  NO_ACC1       = 18  # 18 装身具1
  NO_FRONT_HAIR = 19  # 19 前髪
  NO_EARS2      = 20  # 20 耳2
  NO_KEMONO     = 21  # 21 獣耳
  NO_ACC2       = 22  # 22 装身具2
  NO_WING2      = 23  # 23 羽2
  NO_NECK       = 24  # 24 襟元
  
  #--------------------------------------------------------------------------
  # ● 指定画像ファイルの存在チェックGenerator
  #--------------------------------------------------------------------------
  def self.file_exist?(file_name)
    FileTest.exist?('Graphics/System/' + file_name + '.png')
  end
  #--------------------------------------------------------------------------
  # ● 指定顔グラ画像ファイルの存在チェック
  #--------------------------------------------------------------------------
  def self.face_file_exist?(file_name,sex=0,acc=false)
    sex_dir = sex == 0 ? "Male" : "Female"
   
    if acc
      # アクセサリー類
      FileTest.exist?('Graphics/Generator/Face/' + file_name + '.png')
    else
      # 男女別パーツ
      FileTest.exist?('Graphics/Generator/Face/'+ sex_dir + "/" + file_name + '.png')
    end
  end
  #--------------------------------------------------------------------------
  # ● 指定歩行画像ファイルの存在チェック
  #--------------------------------------------------------------------------
  def self.walk_file_exist?(file_name,sex=0,acc=false)
    sex_dir = sex == 0 ? "Male" : "Female"
    if acc
      # アクセサリー類
      FileTest.exist?('Graphics/Generator/Mini/' + file_name + '.png')
    else
      # 男女別パーツ
      FileTest.exist?('Graphics/Generator/Mini/'+ sex_dir + "/" + file_name + '.png')
    end
  end
  #--------------------------------------------------------------------------
  # ● カスタム歩行グラフィックの配列を取得
  #     character_name  : actor の character_name
  #--------------------------------------------------------------------------
  def self.get_character_arr(character_name)
    c_name = character_name.dup
    delete_end_sex_name(c_name)
    currents = []
    if c_name[/^\$\*/]
      for parts_info in c_name.scan(/\*[^\*]+/)
        currents.push([$1, $2.to_i]) if parts_info[/^\*(.+),(\d+)$/]
      end
    end
    return currents
  end
  #--------------------------------------------------------------------------
  # ● カスタム歩行ネーム・フェイスネームを返す
  #     parts_arr  : 新しいパーツ配列
  #--------------------------------------------------------------------------
  def self.get_name(parts_arr,sex)
    character_name = "$"
    for i in 0...parts_arr.size
      character_name += sprintf("*%s,%d", parts_arr[0], parts_arr[1])
    end
    e_name = character_name[/\w\z/]
    if e_name == "M" or e_name == "F"
      return character_name
    else
      character_name += sex == 0 ? "M" : "F"
      return character_name
    end
  end
  #--------------------------------------------------------------------------
  # ● カスタム歩行グラフィックの初期状態を返す
  #     sex  : 性別 0:男 1:女
  #--------------------------------------------------------------------------
  def self.get_character_default(sex = 0)
    parts = [[]]
    @sex = sex
    if sex == 0
      parts[NO_FRONT_HAIR] = [FRONT_HAIR_M + "01", 0]
      parts[NO_REAR_HAIR1] = [REAR_HAIR_M + "01", 0]
      parts[NO_REAR_HAIR2] = [REAR_HAIR_M + "01", 8]
      parts[NO_CLOTH]      = [CLOTH_M + "01", 0]
      parts[NO_SKIN]       = [CLOTH_M + "01", 11]
    else
      parts[NO_FRONT_HAIR] = [FRONT_HAIR_M + "01", 0]
      parts[NO_REAR_HAIR1] = [REAR_HAIR_M + "01", 0]
      parts[NO_REAR_HAIR2] = [REAR_HAIR_M + "01", 8]
      parts[NO_CLOTH]      = [CLOTH_M + "01", 0]
      parts[NO_SKIN]       = [CLOTH_M + "01", 11]
    end
    parts[NO_WING1]   = [NONE, 0]
    parts[NO_WING2]   = [NONE, 8]
    parts[NO_TAIL1]   = [NONE, 0]
    parts[NO_TAIL2]   = [NONE, 8]
    parts[NO_CLOAK1]  = [NONE, 0]
    parts[NO_CLOAK2]  = [NONE, 8]
    parts[NO_HEAD]    = [HEAD_M, 0]
    parts[NO_EARS1]   = [EARS_M + "01", 0]
    parts[NO_EARS2]   = [EARS_M + "01", 8]
    parts[NO_EYES]    = [EYES_M + "01", 0]
    parts[NO_GLASSES] = [NONE, 0]
    parts[NO_ACC1]    = [NONE, 0]
    parts[NO_ACC2]    = [NONE, 0]
    parts[NO_BEARD]   = [NONE, 0]
    parts[NO_KEMONO]  = [NONE, 0]
   
    # 追加項目
    parts[NO_FACE]    = [FACE_M + "01", 0]
    parts[NO_NECK]    = [NECK_M + "01", 0]
    parts[NO_NOSE]    = [NOSE_M + "01", 0]
    parts[NO_MOUTH]   = [MOUTH_M + "01", 0]
    parts[NO_EYEBROWS] = [EYEBROWS_M + "01", 0]
    return get_name(parts,sex)
  end
  #--------------------------------------------------------------------------
  # ● キャラの性別を取得
  #     character_name  : actor の character_name
  #--------------------------------------------------------------------------
  def self.get_sex(character_name)
    currents = get_character_arr(character_name)
    return 0 if currents[NO_CLOTH] == nil # デフォルトは男とする
   
    if currents[NO_CLOTH][0][/^#{CLOTH_M}/]
      return 0  # 男
    else
      return 1  # 女
    end
  end
  #--------------------------------------------------------------------------
  # ● キャラクターネームの末尾で性別を判別する。
  #--------------------------------------------------------------------------
  def self.get_sex2(character_name)
    return 0 if character_name == nil
    sexname = character_name[/\w\z/]
    if sexname == "F"
      return 1
    else#if sexname == "M"
      return 0
    end
  end
  #--------------------------------------------------------------------------
  # ● キャラクターネームの末尾にある性別判定用文字を削除して返す。
  #--------------------------------------------------------------------------
  def self.delete_end_sex_name(character_name)
    sexname = character_name[/\w\z/]
    if sexname == "F"
      character_name.chop!
    elsif sexname == "M"
      character_name.chop!
    end
    return character_name
  end
  #--------------------------------------------------------------------------
  # ● キャラの性別を変更
  #     character_name  : actor の character_name
  #--------------------------------------------------------------------------
  def self.change_sex(character_name)
    #delete_end_sex_name(character_name)
    return get_character_default((get_sex2(character_name)== 0 ? 1 : 0))
  end
  #--------------------------------------------------------------------------
  # ● 歩行パーツがアクセサリー類かどうかを取得
  #--------------------------------------------------------------------------
  def self.get_acc_file_walk(p_name)
    case p_name
    when /^(Acc1_)/
      return true
    when /^(Acc2_)/
      return true
    when /^(Cloak)/
      return true
    when /^(Ears)/
      return true
    when /^(Eyes)/
      return true
    when /^(Glasses)/
      return true
    when /^(Kemono)/
      return true
    when /^(Head)/
      return true
    when /^(Tail)/
      return true
    when /^(Wing)/
      return true
    else
      return false
    end
  end
  #--------------------------------------------------------------------------
  # ● 顔グラパーツがアクセサリー類かどうかを取得
  #--------------------------------------------------------------------------
  def self.get_acc_file_face(p_name)
    case p_name
    when /^(Acc1_)/
      return true
    when /^(Acc2_)/
      return true
    #when /^(Neck)/
    #  return true
    when /^(Ears)/
      return true
    when /^(Eyebrows)/
      return true
    when /^(Glasses)/
      return true
    when /^(Kemono)/
      return true
    when /^(Tattoo)/
      return true
    else
      return false
    end
  end
  #--------------------------------------------------------------------------
  # ● 顔グラパーツのチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #     p_name : パーツ名
  #     p_num  : パーツ数
  #     sex    : 性別
  #     pos1   : 変更位置1
  #     pos2   : 変更位置2
  #--------------------------------------------------------------------------
  def self.face_change_parts(character_name, dir, p_name, p_num, sex, pos1, pos2 = nil)
    dir = -1 if dir != 1
    currents = get_character_arr(character_name)
    return get_character_default if currents[NO_CLOTH] == nil
    pic_name = currents[pos1][0]
    number = pic_name[/^#{p_name}(\d+)/] ? ($1.to_i + dir) : dir
    if get_acc_file_face(p_name)
      number = 1 if number > p_num
      number = p_num if number < 1
      acc = true
    else
      number = 0 if number > p_num
      number = p_num if number < 0
      acc = false
    end
    pic_name = p_name + sprintf("%02d", number)
    pic_name = NONE unless face_file_exist?(pic_name,sex,acc)
    currents[pos1][0] = pic_name
    currents[pos2][0] = pic_name if pos2 != nil
    return get_name(currents,sex)
  end
  #--------------------------------------------------------------------------
  # ● 歩行パーツのチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #     p_name : パーツ名
  #     p_num  : パーツ数
  #     sex    : 性別
  #     pos1   : 変更位置1
  #     pos2   : 変更位置2
  #--------------------------------------------------------------------------
  def self.walk_change_parts(character_name, dir, p_name, p_num, sex, pos1, pos2 = nil)
    dir = -1 if dir != 1
    currents = get_character_arr(character_name)
    return get_character_default if currents[NO_CLOTH] == nil
    pic_name = currents[pos1][0]
    number = pic_name[/^#{p_name}(\d+)/] ? ($1.to_i + dir) : dir
    if get_acc_file_walk(p_name)
      number = 1 if number > p_num
      number = p_num if number < 1
      acc = true
    else
      number = 0 if number > p_num
      number = p_num if number < 0
      acc = false
    end
    pic_name = p_name + sprintf("%02d", number)
    pic_name = NONE unless walk_file_exist?(pic_name,sex,acc)
    currents[pos1][0] = pic_name
    currents[pos2][0] = pic_name if pos2 != nil
    return get_name(currents,sex)
  end
  #--------------------------------------------------------------------------
  # ● パーツのチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #     p_name : パーツ名
  #     p_num  : パーツ数
  #     sex    : 性別
  #     mode   : 顔グラか歩行グラか。 0:両方 1:顔グラのみ 2:歩行グラのみ
  #     pos1   : 変更位置1
  #     pos2   : 変更位置2
  #--------------------------------------------------------------------------
  def self.change_parts(character_name, dir, p_name, p_num, sex, mode,pos1, pos2 = nil)
    name1 = face_change_parts(character_name, dir, p_name, p_num, sex, pos1, pos2)
    name2 = walk_change_parts(character_name, dir, p_name, p_num, sex, pos1, pos2)
    return name2 if mode == 2
    return name1 if mode == 1
    return name1
  end
  #--------------------------------------------------------------------------
  # ● 次の前髪にチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #--------------------------------------------------------------------------
  def self.next_front_hair(character_name, dir = 1)
    sex = get_sex2(character_name)
    p_name = FRONT_HAIR_M
    p_num = FRONT_HAIR_NUM[sex]
    return change_parts(character_name, dir, p_name, p_num, sex, 0,NO_FRONT_HAIR)
  end
  #--------------------------------------------------------------------------
  # ● 次の後髪にチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #--------------------------------------------------------------------------
  def self.next_rear_hair(character_name, dir = 1)
    sex = get_sex2(character_name)
    p_name = REAR_HAIR_M
    p_num = REAR_HAIR_NUM[sex]
    return change_parts(character_name, dir, p_name, p_num, sex, 0,NO_REAR_HAIR1, NO_REAR_HAIR2)
  end
  #--------------------------------------------------------------------------
  # ● 次の顔にチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #--------------------------------------------------------------------------
  def self.next_face(character_name, dir = 1)
    sex = get_sex2(character_name)
    return change_parts(character_name, dir, FACE_M, FACE_NUM[sex], sex, 1,NO_FACE)
  end
  #--------------------------------------------------------------------------
  # ● 次の首にチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #--------------------------------------------------------------------------
  def self.next_neck(character_name, dir = 1)
    sex = get_sex2(character_name)
    return change_parts(character_name, dir, NECK_M, NECK_NUM[sex], sex, 1,NO_NECK)
  end
  #--------------------------------------------------------------------------
  # ● 次の耳にチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #--------------------------------------------------------------------------
  def self.next_ears(character_name, dir = 1)
    sex = get_sex2(character_name)
    return change_parts(character_name, dir, EARS_M, EARS_NUM[sex], sex, 0,NO_EARS1, NO_EARS2)
  end
  #--------------------------------------------------------------------------
  # ● 次の眉毛にチェンジ
  #     character_name  : actor の character_name

  #     dir  : 進む方向 1:次へ -1:前へ
  #--------------------------------------------------------------------------
  def self.next_eyebrows(character_name, dir = 1)
    sex = get_sex2(character_name)
    return change_parts(character_name, dir, EYEBROWS_M, EYEBROWS_NUM[sex], sex, 1,NO_EYEBROWS)
  end
  #--------------------------------------------------------------------------
  # ● 次の目にチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #--------------------------------------------------------------------------
  def self.next_eyes(character_name, dir = 1)
    sex = get_sex2(character_name)
    return change_parts(character_name, dir, EYES_M, EYES_NUM[sex], sex, 1,NO_EYES)
  end
  #--------------------------------------------------------------------------
  # ● 次の口にチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #--------------------------------------------------------------------------
  def self.next_mouth(character_name, dir = 1)
    sex = get_sex2(character_name)
    return change_parts(character_name, dir, MOUTH_M, MOUTH_NUM[sex], sex, 1,NO_MOUTH)
  end
  #--------------------------------------------------------------------------
  # ● 次の鼻にチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #--------------------------------------------------------------------------
  def self.next_nose(character_name, dir = 1)
    sex = get_sex2(character_name)
    return change_parts(character_name, dir, NOSE_M, NOSE_NUM[sex], sex, 1,NO_NOSE)
  end
  #--------------------------------------------------------------------------
  # ● 次の獣耳にチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #--------------------------------------------------------------------------
  def self.next_kemono(character_name, dir = 1)
    sex = get_sex2(character_name)
    return change_parts(character_name, dir, KEMONO_M, KEMONO_NUM[sex], sex, 0,NO_KEMONO)
  end
  #--------------------------------------------------------------------------
  # ● 次の尻尾にチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #--------------------------------------------------------------------------
  def self.next_tail(character_name, dir = 1)
    sex = get_sex2(character_name)
    return change_parts(character_name, dir, TAIL_M, TAIL_NUM[sex], sex, 2,NO_TAIL1, NO_TAIL2)
  end
  #--------------------------------------------------------------------------
  # ● 次のヒゲにチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #--------------------------------------------------------------------------
  def self.next_beard(character_name, dir = 1)
    sex = get_sex2(character_name)
    p_name = BEARD_M#"Beard"
    p_num = BEARD_NUM[sex]
    return change_parts(character_name, dir, p_name, p_num, sex, 0,NO_BEARD)
  end
  #--------------------------------------------------------------------------
  # ● 次の服にチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #--------------------------------------------------------------------------
  def self.next_cloth(character_name, dir = 1)
    sex = get_sex2(character_name)
    p_name = CLOTH_M#"Cloth"
    p_num = CLOTH_NUM[sex]#20
    return change_parts(character_name, dir, p_name, p_num, sex, 2,NO_CLOTH)
  end
  #--------------------------------------------------------------------------
  # ● 次のマントにチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #--------------------------------------------------------------------------
  def self.next_cloak(character_name, dir = 1)
    sex = get_sex2(character_name)
    return change_parts(character_name, dir, CLOAK_M, CLOAK_NUM[sex],sex, 2,NO_CLOAK1, NO_CLOAK2)
  end
  #--------------------------------------------------------------------------
  # ● 次の羽にチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #--------------------------------------------------------------------------
  def self.next_wing(character_name, dir = 1)
    sex = get_sex2(character_name)
    return change_parts(character_name, dir, WING_M, WING_NUM[sex],sex, 2,NO_WING1, NO_WING2)
  end
  #--------------------------------------------------------------------------
  # ● 次のメガネにチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #--------------------------------------------------------------------------
  def self.next_glasses(character_name, dir = 1)
    sex = get_sex2(character_name)
    return change_parts(character_name, dir, GLASSES_M, GLASSES_NUM[sex],sex,1,NO_GLASSES)
  end
  #--------------------------------------------------------------------------
  # ● 次の装身具1にチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #--------------------------------------------------------------------------
  def self.next_acc1(character_name, dir = 1)
    sex = get_sex2(character_name)
    return change_parts(character_name, dir, ACC1_M, ACC1_NUM[sex],sex,0,NO_ACC1)
  end
  #--------------------------------------------------------------------------
  # ● 次の装身具2にチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #--------------------------------------------------------------------------
  def self.next_acc2(character_name, dir = 1)
    sex = get_sex2(character_name)
    return change_parts(character_name, dir, ACC2_M, ACC2_NUM[sex], sex,0,NO_ACC2)
  end
  
  
  

  #--------------------------------------------------------------------------
  # ● 髪色のチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #--------------------------------------------------------------------------
  def self.change_hair_color(character_name, dir = 1)
    dir = -1 if dir != 1
    currents = get_character_arr(character_name)
    return get_character_default if currents[NO_CLOTH] == nil
    number = currents[NO_FRONT_HAIR][1] + dir
    number = 0 if number >= HAIR_COLOR
    number = HAIR_COLOR - 1 if number < 0
    currents[NO_FRONT_HAIR][1] = number
    currents[NO_REAR_HAIR1][1] = number
    currents[NO_REAR_HAIR2][1] = number + 8
    currents[NO_TAIL1][1] = number
    currents[NO_TAIL2][1] = number + 8
    currents[NO_BEARD][1] = number
    currents[NO_KEMONO][1] = number
    sex = get_sex2(character_name)
    return get_name(currents,sex)
  end
  #--------------------------------------------------------------------------
  # ● 目の色のチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #--------------------------------------------------------------------------
  def self.change_eye_color(character_name, dir = 1)
    dir = -1 if dir != 1
    currents = get_character_arr(character_name)
    return get_character_default if currents[NO_CLOTH] == nil
    number = currents[NO_EYES][1] + dir
    number = 0 if number >= EYE_COLOR
    number = EYE_COLOR - 1 if number < 0
    currents[NO_EYES][1] = number
    sex = get_sex2(character_name)
    return get_name(currents,sex)
  end
  #--------------------------------------------------------------------------
  # ● 肌の色のチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #--------------------------------------------------------------------------
  def self.change_skin_color(character_name, dir = 1)
    dir = -1 if dir != 1
    currents = get_character_arr(character_name)
    return get_character_default if currents[NO_CLOTH] == nil
    number = currents[NO_HEAD][1] + dir
    number = 0 if number >= SKIN_COLOR
    number = SKIN_COLOR - 1 if number < 0
    currents[NO_HEAD][1] = number
    currents[NO_FACE][1] = number
    currents[NO_MOUTH][1] = number
    currents[NO_NOSE][1] = number
    currents[NO_SKIN][1] = (number == 0 ? 11 : number + 7)
    currents[NO_EARS1][1] = number
    currents[NO_EARS2][1] = number + 8
    sex = get_sex2(character_name)
    return get_name(currents,sex)
  end
  #--------------------------------------------------------------------------
  # ● 服の色のチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #--------------------------------------------------------------------------
  def self.change_cloth_color(character_name, dir = 1)
    if get_sex(character_name) == 0
      p_num  = CLOTH_M_COLOR
    else
      p_num  = CLOTH_F_COLOR
    end
    return change_color(character_name, dir, p_num, NO_CLOTH)
  end
  #--------------------------------------------------------------------------
  # ● マントの色のチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #--------------------------------------------------------------------------
  def self.change_cloak_color(character_name, dir = 1)
    return change_color(character_name, dir, CLOAK_COLOR, NO_CLOAK1, NO_CLOAK2)
  end
  #--------------------------------------------------------------------------
  # ● 羽の色のチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #--------------------------------------------------------------------------
  def self.change_wing_color(character_name, dir = 1)
    return change_color(character_name, dir, WING_COLOR, NO_WING1, NO_WING2)
  end
  #--------------------------------------------------------------------------
  # ● メガネの色のチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #--------------------------------------------------------------------------
  def self.change_glasses_color(character_name, dir = 1)
    return change_color(character_name, dir, GLASSES_COLOR, NO_GLASSES)
  end
  #--------------------------------------------------------------------------
  # ● 装身具1の色のチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #--------------------------------------------------------------------------
  def self.change_acc1_color(character_name, dir = 1)
    return change_color(character_name, dir, ACC1_COLOR, NO_ACC1)
  end
  #--------------------------------------------------------------------------
  # ● 装身具2の色のチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #--------------------------------------------------------------------------
  def self.change_acc2_color(character_name, dir = 1)
    return change_color(character_name, dir, ACC2_COLOR, NO_ACC2)
  end
  #--------------------------------------------------------------------------
  # ● パーツの色のチェンジ
  #     character_name  : actor の character_name
  #     dir  : 進む方向 1:次へ -1:前へ
  #     p_num  : パーツの色数
  #     pos1   : 変更位置1
  #     pos2   : 変更位置2
  #--------------------------------------------------------------------------
  def self.change_color(character_name, dir, p_num, pos1, pos2 = nil)
    dir = -1 if dir != 1
    currents = get_character_arr(character_name)
    return get_character_default if currents[NO_CLOTH] == nil
    number = currents[pos1][1] + dir
    number = 0 if number >= p_num
    number = p_num - 1 if number < 0
    currents[pos1][1] = number
    currents[pos2][1] = number + 8 if pos2 != nil
    sex = get_sex2(character_name)
    return get_name(currents,sex)
  end
  #--------------------------------------------------------------------------
  # ● 歩行グラを元に、フェイスネームを作成する
  #     character_name  : actor の character_name
  #     parts_arry      : true でパーツリスト配列を返す。
  #--------------------------------------------------------------------------
  def self.get_face_name(character_name,parts_arry=false)
    sex = get_sex2(character_name)
    currents = get_character_arr(character_name)
    return "" if currents[NO_CLOTH] == nil
    parts = [[]]
      pic_name = get_face_parts_name(currents[NO_REAR_HAIR1][0], REAR_HAIR_M, sex)
      parts[0] = [pic_name, currents[NO_REAR_HAIR1][1]]

      # 変更項目
      pic_name = get_face_parts_name(currents[NO_NECK][0], NECK_M, sex)
      parts[1] = [pic_name, currents[NO_NECK][1]]
      pic_name = get_face_parts_name(currents[NO_NECK][0], NECK_M, sex,"a")
      parts[16] = [pic_name, currents[NO_NECK][1]]
      pic_name = get_face_parts_name(currents[NO_FACE][0], FACE_M, sex)
      parts[2] = [pic_name, currents[NO_FACE][1]]
      pic_name = get_face_parts_name(currents[NO_NOSE][0], NOSE_M, sex)
      parts[4] = [pic_name, currents[NO_NOSE][1]]
      pic_name = get_face_parts_name(currents[NO_MOUTH][0], MOUTH_M, sex)
      parts[5] = [pic_name, currents[NO_MOUTH][1]]
      pic_name = get_face_parts_name(currents[NO_EYES][0], EYES_M, sex)
      parts[6] = [pic_name, currents[NO_EYES][1]]
      pic_name = get_face_parts_name(currents[NO_EYES][0], EYES_M, sex,"s")
      parts[7] = [pic_name, currents[NO_EYES][1]]
      
      
      pic_name = get_face_parts_name(currents[NO_REAR_HAIR1][0], REAR_HAIR_M, sex, "a")
      parts[10] = [pic_name, currents[NO_REAR_HAIR1][1]]
      pic_name = get_face_parts_name(currents[NO_FRONT_HAIR][0], FRONT_HAIR_M, sex, "s")
      parts[11] = [pic_name, currents[NO_FRONT_HAIR][1]]
      pic_name = get_face_parts_name(currents[NO_BEARD][0], BEARD_M, sex)
      parts[12] = [pic_name, currents[NO_BEARD][1]]
      pic_name = get_face_parts_name(currents[NO_FRONT_HAIR][0], FRONT_HAIR_M, sex)
      parts[15] = [pic_name, currents[NO_FRONT_HAIR][1]]
   
      
    pic_name = get_face_parts_name(currents[NO_EARS1][0], EARS_M, sex)
    parts[3] = [pic_name, currents[NO_EARS1][1]]
   
    pic_name = get_face_parts_name(currents[NO_EYEBROWS][0], EYEBROWS_M, sex)
    parts[9] = [pic_name, currents[NO_EYEBROWS][1]]
    pic_name = get_face_parts_name(currents[NO_EYEBROWS][0], EYEBROWS_M, sex,"s")
    parts[8] = [pic_name, currents[NO_EYEBROWS][1]]
   
   
   
    pic_name = get_face_parts_name(currents[NO_GLASSES][0], GLASSES_M, sex)
    parts[13] = [pic_name, currents[NO_GLASSES][1]]
   
    pic_name = get_face_parts_name(currents[NO_ACC1][0], ACC1_M, sex)
    parts[14] = [pic_name, currents[NO_ACC1][1]]
   
    pic_name = get_face_parts_name(currents[NO_KEMONO][0], KEMONO_M, sex)
    parts[17] = [pic_name, currents[NO_KEMONO][1]]
   
    pic_name = get_face_parts_name(currents[NO_ACC2][0], ACC2_M, sex)
    parts[18] = [pic_name, currents[NO_ACC2][1]]
   
    return parts if parts_arry # 顔のパーツリストを取得したい場合(自動表情処理用)
    return get_name(parts,sex) # 通常の処理
  end
  #--------------------------------------------------------------------------
  # ● フェイス用のパーツ名を取得
  #--------------------------------------------------------------------------
  def self.get_face_parts_name(c_name, parts_name, sex, s = "")
    return c_name if c_name == NONE
    name = c_name[/(\d+)$/] ? (parts_name + $1 + s) : parts_name
    acc = get_acc_file_face(name)
    return (face_file_exist?(name,sex,acc) ? name : NONE)
  end
  
  #--------------------------------------------------------------------------
  # ● 攻撃顔の取得
  #     character_name  : actor の character_name
  #--------------------------------------------------------------------------
  def self.atk_face(character_name)
    currents = get_face_name(character_name,true)
    return get_character_default if currents[NO_CLOTH] == nil
    sex = get_sex2(character_name)
    # 眉毛と口のパーツ番号設定
    if currents[NO_EYEBROWS][0] == 3
      # 平八眉毛の場合
      eb_num = sex == 0 ? "04" : "04"
    else
      # それ以外
      eb_num = sex == 0 ? "02" : "02"
    end
    m_num = sex == 0 ? "10" : "14"
    currents[9][0] = EYEBROWS_M + eb_num
    currents[8][0] = EYEBROWS_M + eb_num + "s"
    currents[5][0] = MOUTH_M + m_num
    return get_name(currents,sex)
  end
  #--------------------------------------------------------------------------
  # ● 被ダメージ顔の取得
  #     character_name  : actor の character_name
  #--------------------------------------------------------------------------
  def self.dmg_face(character_name)
    currents = get_face_name(character_name,true)
    return get_character_default if currents[NO_CLOTH] == nil
    sex = get_sex2(character_name)
    # 眉毛と口のパーツ番号設定
    # 眉毛と口のパーツ番号設定
    if currents[NO_EYEBROWS][0] == 3
      # 平八眉毛の場合
      eb_num = sex == 0 ? "04" : "04"
    else
      # それ以外
      eb_num = sex == 0 ? "02" : "02"
    end
    m_num = sex == 0 ? "11" : "15"
    currents[9][0] = EYEBROWS_M + eb_num
    currents[8][0] = EYEBROWS_M + eb_num + "s"
    currents[5][0] = MOUTH_M + m_num
    return get_name(currents,sex)
  end
  #--------------------------------------------------------------------------
  # ● 状態異常顔の取得
  #     character_name  : actor の character_name
  #--------------------------------------------------------------------------
  def self.state_face(character_name)
    currents = get_face_name(character_name,true)
    return get_character_default if currents[NO_CLOTH] == nil
    sex = get_sex2(character_name)
    # 眉毛と口のパーツ番号設定
    eb_num = sex == 0 ? "08" : "08"
    m_num = sex == 0 ? "03" : "12"
    currents[9][0] = EYEBROWS_M + eb_num
    currents[8][0] = EYEBROWS_M + eb_num + "s"
    currents[5][0] = MOUTH_M + m_num
    return get_name(currents,sex)
  end
  #--------------------------------------------------------------------------
  # ● 戦闘不能顔の取得
  #     character_name  : actor の character_name
  #--------------------------------------------------------------------------
  def self.dead_face(character_name)
    currents = get_face_name(character_name,true)
    return get_character_default if currents[NO_CLOTH] == nil
    sex = get_sex2(character_name)
    # 眉毛と口のパーツ番号設定
    eb_num = sex == 0 ? "08" : "08"
    m_num = sex == 0 ? "10" : "14"
    currents[9][0] = EYEBROWS_M + eb_num
    currents[8][0] = EYEBROWS_M + eb_num + "s"
    currents[5][0] = MOUTH_M + m_num
    return get_name(currents,sex)
  end
  #--------------------------------------------------------------------------
  # ● 勝利顔の取得
  #     character_name  : actor の character_name
  #--------------------------------------------------------------------------
  def self.vic_face(character_name)
    currents = get_face_name(character_name,true)
    return get_character_default if currents[NO_CLOTH] == nil
    sex = get_sex2(character_name)
    # 眉毛と口のパーツ番号設定
    #eb_num = sex == 0 ? 8 : 8
    m_num = sex == 0 ? "09" : "04"
    #currents[9][0] = EYEBROWS_M + eb_num.to_s
    #currents[8][0] = EYEBROWS_M + eb_num + "s"
    currents[5][0] = MOUTH_M + m_num
    return get_name(currents,sex)
  end
  #--------------------------------------------------------------------------
  # ● 瀕死顔の取得
  #     character_name  : actor の character_name
  #--------------------------------------------------------------------------
  def self.pinch_face(character_name)
    currents = get_face_name(character_name,true)
    return get_character_default if currents[NO_CLOTH] == nil
    sex = get_sex2(character_name)
    # 眉毛と口のパーツ番号設定
    eb_num = sex == 0 ? "08" : "08"
    m_num = sex == 0 ? "11" : "15"
    currents[9][0] = EYEBROWS_M + eb_num
    currents[8][0] = EYEBROWS_M + eb_num + "s"
    currents[5][0] = MOUTH_M + m_num
    return get_name(currents,sex)
  end
  #--------------------------------------------------------------------------
  # ● 詠唱顔の取得
  #     character_name  : actor の character_name
  #--------------------------------------------------------------------------
  def self.chant_face(character_name)
    currents = get_face_name(character_name,true)
    return get_character_default if currents[NO_CLOTH] == nil
    sex = get_sex2(character_name)
    # 眉毛と口のパーツ番号設定
    if currents[NO_EYEBROWS][0] == 3
      # 平八眉毛の場合
      eb_num = sex == 0 ? "04" : "04"
    else
      # それ以外
      eb_num = sex == 0 ? "02" : "02"
    end
    m_num = sex == 0 ? "02" : "12"
    currents[9][0] = EYEBROWS_M + eb_num
    currents[8][0] = EYEBROWS_M + eb_num + "s"
    currents[5][0] = MOUTH_M + m_num
    return get_name(currents,sex)
  end
end

module Cache
  #--------------------------------------------------------------------------
  # ● 顔グラをPNGファイルで出力
  #--------------------------------------------------------------------------
  def self.save_face_png(filename)
    return unless CustomChara::OUTPUT_PNG
    bitmap = self.make_facial_expression(filename)
    save_filename = Time.now.strftime("%Y%m%d%H%M%S") + ".png"
    # PNG出力
    bitmap.save_png(save_filename,true)
  end
  #--------------------------------------------------------------------------
  # ● キャラエディット顔グラ取得
  #--------------------------------------------------------------------------
  def self.gene_face(filename,sex,acc)
    sex_dir = sex == 0 ? "Male" : "Female"
    if acc
      # アクセサリー類
      if FileTest.exist?('Graphics/Generator/Face/' + filename + '.png')
        return load_bitmap("Graphics/Generator/Face/", filename)
      end
    else
      # 男女別パーツ
      if FileTest.exist?('Graphics/Generator/Face/' + sex_dir +  "/" +
        filename + '.png')
        return load_bitmap("Graphics/Generator/Face/" + sex_dir + "/", filename)
      end
    end
    return empty_bitmap
  end
  #--------------------------------------------------------------------------
  # ● キャラエディット歩行グラ取得
  #--------------------------------------------------------------------------
  def self.gene_mini(filename,sex,acc)
    sex_dir = sex == 0 ? "Male" : "Female"
    if acc
      # アクセサリー類
      if FileTest.exist?('Graphics/Generator/Mini/' + filename + '.png')
        return load_bitmap("Graphics/Generator/Mini/", filename)
      end
    else
      # 男女別パーツ
      if FileTest.exist?('Graphics/Generator/Mini/' + sex_dir +  "/" +
        filename + '.png')
        return load_bitmap("Graphics/Generator/Mini/" + sex_dir + "/", filename)
      end
    end
    return empty_bitmap
  end
  #--------------------------------------------------------------------------
  # ● キャラクターネームの末尾で性別を判別する。
  #--------------------------------------------------------------------------
  def self.get_sex2(character_name)
    sexname = character_name[/\w\z/]
    if sexname == "F"
      return 1
    else#if sexname == "M"
      return 0
    end
  end
  #--------------------------------------------------------------------------
  # ● キャラクターネームの末尾にある性別判定用文字を削除して返す。
  #--------------------------------------------------------------------------
  def self.delete_end_sex_name(character_name)
    sexname = character_name[/\w\z/]
    if sexname == "F"
      return character_name.chop
    elsif sexname == "M"
      return character_name.chop
    end
  end
  #--------------------------------------------------------------------------
  # ◎ 歩行グラフィックの取得(上書き定義)
  #     filename : ファイル名
  #--------------------------------------------------------------------------
  def self.character(filename)
    folder_name = "Graphics/Characters/"
    path = folder_name + filename
    if filename[/^\$\*/] == nil
      # 通常の画像ファイル読み込み
      return load_bitmap(folder_name, filename)
    elsif @cache.include?(path) and not @cache[path].disposed?
      # カスタムキャラ画像が作成済みなので読み込み
      return load_bitmap(folder_name, filename)
    end
    # 画像を生成する
    sex = get_sex2(filename)
    f_name = delete_end_sex_name(filename)
    bitmap = Bitmap.new(96, 128)
    for parts_info in f_name.scan(/\*[^\*]+/)
      if parts_info[/^\*(.+),(\d+)$/]
        next if $1 == "$"
        next if $1 == CustomChara::NONE
        acc = CustomChara.get_acc_file_walk($1)
        src_rect = Rect.new(($2.to_i) % 8 * 96, ($2.to_i) / 8 * 128, 96, 128)
        bitmap.blt(0, 0, self.gene_mini($1,sex,acc), src_rect)
      end
    end
    @cache[path] = bitmap
    return @cache[path]
  end
  
  #--------------------------------------------------------------------------
  # ◎ 顔グラフィックの取得(上書き定義)
  #--------------------------------------------------------------------------
  def self.face(filename)
    folder_name = "Graphics/Faces/"
    path = folder_name + filename
    if filename[/^\$\*/] == nil
      # 通常の画像ファイル読み込み
      return load_bitmap(folder_name, filename)
    elsif @cache.include?(path) and not @cache[path].disposed?
      # カスタムキャラ画像が作成済みなので読み込み
      return load_bitmap(folder_name, filename)
    end
    # 画像を生成する
=begin
    sex = get_sex2(filename)
    f_name = delete_end_sex_name(filename)
    bitmap = Bitmap.new(96 * 4, 96 * 2) # 顔グラ画像のサイズ
    for parts_info in f_name.scan(/\*[^\*]+/)
      if parts_info[/^\*(.+),(\d+)$/]
        name = $1
        num  = $2.to_i
        next if name == "$"
        next if name == CustomChara::NONE
        acc = CustomChara.get_acc_file_face(name)
        src_rect = Rect.new(num % 4 * 128 + 16, num / 4 * 128 + 16, 96, 96)
        op = (name[/s$/] ? 128 : 255)
        # 画像を0,0に作成している。
        bitmap.blt(0, 0, self.gene_face(name,sex,acc), src_rect, op)
      end
    end
=end
    bitmap = self.make_facial_expression(filename)
    @cache[path] = bitmap
    return @cache[path]
  end
  #--------------------------------------------------------------------------
  # ◎ 顔グラ表情の作成
  #--------------------------------------------------------------------------
  def self.make_facial_expression(filename)
    @mf_bitmap = Bitmap.new(96 * 4, 96 * 2) # 顔グラ画像のサイズ
    or_filename = filename.dup
    index = 0
    x = 0
    y = 0
    index..8.times{|i|
      # 顔グラの座標設定。4以降は下の段に作成。
      if i == 4
        x = 0
        y = 96
      end
      x += 96 unless i % 4 == 0
      name = facial_files(or_filename,i)
      make_face_bitmap(name,x,y)}
    return @mf_bitmap
  end
  #--------------------------------------------------------------------------
  # ◎ 顔グラフィック作成部分の処理
  #    filename : パーツデータの文字列
  #    x・y     : 顔グラ画像の貼り付け位置
  #--------------------------------------------------------------------------
  def self.make_face_bitmap(filename,x=0,y=0)
    # 画像を生成する
    sex = get_sex2(filename)
    f_name = delete_end_sex_name(filename)
    @mf_bitmap ||= Bitmap.new(96 * 4, 96 * 2) # 顔グラ画像のサイズ
    for parts_info in f_name.scan(/\*[^\*]+/)
      if parts_info[/^\*(.+),(\d+)$/]
        name = $1
        num  = $2.to_i
        next if name == "$"
        next if name == CustomChara::NONE
        acc = CustomChara.get_acc_file_face(name)
        src_rect = Rect.new(num % 4 * 128 + 16, num / 4 * 128 + 16, 96, 96)
        op = (name[/s$/] ? 128 : 255)
        # 画像を0,0に作成している。
        @mf_bitmap.blt(x, y, self.gene_face(name,sex,acc), src_rect, op)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ◎ 顔グラフィック作成部分の処理
  #    filename : パーツデータの文字列
  #    index    : 表情のパーツデータインデックス
  #--------------------------------------------------------------------------
  def self.facial_files(filename, index)
    case index
    when 0
      return CustomChara.get_face_name(filename)
    when 1
      return CustomChara.atk_face(filename)
    when 2
      return CustomChara.dmg_face(filename)
    when 3
      return CustomChara.state_face(filename)
    when 4
      return CustomChara.dead_face(filename)
    when 5
      return CustomChara.vic_face(filename)
    when 6
      return CustomChara.pinch_face(filename)
    when 7
      return CustomChara.chant_face(filename)
    end
  end
end

class Window_CharaLooking < Window_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    super(8, 24, window_width, window_height)
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウ幅の取得
  #--------------------------------------------------------------------------
  def window_width
    64 * 3 + 96 + 32
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウ高さの取得
  #--------------------------------------------------------------------------
  def window_height
    64 * 2 + 32
  end
  #--------------------------------------------------------------------------
  # ● グラフィックの設定
  #--------------------------------------------------------------------------
  def set_character(c_name)
    if c_name != @charactor_name
      @charactor_name = c_name
      refresh
    end
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    contents.clear
    return if @charactor_name == nil
    #face_name = CustomChara.get_face_name(@charactor_name)
    draw_face(@charactor_name, 0, 0, 18)
    bitmap = Bitmap.new(64, 64)
    src_rect = Rect.new(32, 0, 32, 32)
    bitmap.stretch_blt(bitmap.rect, Cache.character(@charactor_name), src_rect)
    contents.blt(104 + 64, 72, bitmap, bitmap.rect)
    bitmap.clear
    src_rect = Rect.new(32, 32, 32, 32)
    bitmap.stretch_blt(bitmap.rect, Cache.character(@charactor_name), src_rect)
    contents.blt(104, 32, bitmap, bitmap.rect)
    bitmap.clear
    src_rect = Rect.new(32, 64, 32, 32)
    bitmap.stretch_blt(bitmap.rect, Cache.character(@charactor_name), src_rect)
    contents.blt(104 + 128, 32, bitmap, bitmap.rect)
    bitmap.clear
    src_rect = Rect.new(32, 96, 32, 32)
    bitmap.stretch_blt(bitmap.rect, Cache.character(@charactor_name), src_rect)
    contents.blt(104 + 64, 0, bitmap, bitmap.rect)
    bitmap.dispose
  end
end

class Window_CustomCharaCommand < Window_Command
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    super(188, 216)
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウ幅の取得
  #--------------------------------------------------------------------------
  def window_width
    return 140
  end
  #--------------------------------------------------------------------------
  # ● コマンドリストの作成
  #--------------------------------------------------------------------------
  def make_command_list
    add_command("性別の変更", :sex)
    add_command("顔の変更",   :face)
    add_command("服装の変更", :cloth)
    add_command("決定",       :complete)
    add_command("キャンセル", :cancel)
  end
  #--------------------------------------------------------------------------
  # ● アライメントの取得
  #--------------------------------------------------------------------------
  def alignment
    return 1
  end
end

class Window_CustomCharaCommand_Base < Window_Command
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    super(336, 24)
    deactivate
    hide
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウ幅の取得
  #--------------------------------------------------------------------------
  def window_width
    return 200
  end
  #--------------------------------------------------------------------------
  # ● 項目の描画
  #--------------------------------------------------------------------------
  def draw_item(index)
    change_color(normal_color, command_enabled?(index))
    r = item_rect_for_text(index)
    draw_text(r, command_name(index), alignment)
    contents.blt(r.x,         r.y + 5, Cache.system("Window"), Rect.new( 80,24,8,16))
    contents.blt(r.width - 4, r.y + 5, Cache.system("Window"), Rect.new(104,24,8,16))
  end
  #--------------------------------------------------------------------------
  # ● アライメントの取得
  #--------------------------------------------------------------------------
  def alignment
    return 1
  end
  #--------------------------------------------------------------------------
  # ● 決定処理の有効状態を取得
  #--------------------------------------------------------------------------
  def ok_enabled?
    false
  end
end

class Window_CustomCharaCommand1 < Window_CustomCharaCommand_Base
  #--------------------------------------------------------------------------
  # ● コマンドリストの作成
  #--------------------------------------------------------------------------
  def make_command_list
    add_command("前髪",   :n_front)
    add_command("後髪",   :n_rear)
    add_command("輪郭",   :n_face)
    add_command("耳",     :n_ears)
    add_command("眉毛",   :n_eyebrows)
    add_command("目",     :n_eyes)
    add_command("鼻",     :n_nose)
    add_command("口",     :n_mouth)
    add_command("ヒゲ",   :n_beard)
    add_command("獣耳",   :n_kemono)
    add_command("尻尾",   :n_tail)
    add_command("襟元",   :n_neck)
    add_command("髪の色", :c_hair)
    add_command("目の色", :c_eyes)
    add_command("肌の色", :c_skin)
  end
end

class Window_CustomCharaCommand2 < Window_CustomCharaCommand_Base
  #--------------------------------------------------------------------------
  # ● コマンドリストの作成
  #--------------------------------------------------------------------------
  def make_command_list
    add_command("服",          :n_cloth)
    add_command("服の色",      :c_cloth)
    add_command("マント",      :n_cloak)
    add_command("マントの色",  :c_cloak)
    add_command("羽",          :n_wing)
    add_command("羽の色",      :c_wing)
    add_command("メガネ",      :n_glasses)
    add_command("メガネの色",  :c_glasses)
    add_command("装身具1",     :n_acc1)
    add_command("装身具1の色", :c_acc1)
    add_command("装身具2",     :n_acc2)
    add_command("装身具2の色", :c_acc2)
  end
end

class Scene_CustomChara < Scene_MenuBase
  #--------------------------------------------------------------------------
  # ● 準備
  #--------------------------------------------------------------------------
  def prepare(actor_id)
    @actor_id = actor_id
  end
  #--------------------------------------------------------------------------
  # ● 開始処理
  #--------------------------------------------------------------------------
  def start
    super
    @actor = $game_actors[@actor_id]
    name = @actor.character_name
    if name[/^\$\*/] == nil
      @character_name = CustomChara.get_character_default(0)
    else
      @character_name = @actor.character_name
    end
    @looking_window = Window_CharaLooking.new
    @looking_window.set_character(@character_name)
    create_command_window
  end
  #--------------------------------------------------------------------------
  # ● コマンドウィンドウの作成
  #--------------------------------------------------------------------------
  def create_command_window
    @command_window = Window_CustomCharaCommand.new
    @command_window.set_handler(:sex,      method(:on_sex))
    @command_window.set_handler(:face,     method(:on_face))
    @command_window.set_handler(:cloth,    method(:on_cloth))
    @command_window.set_handler(:complete, method(:on_complete))
    @command_window.set_handler(:cancel,   method(:return_scene))
    @command_window1 = Window_CustomCharaCommand1.new
    @command_window1.set_handler(:cancel, method(:on_cmd_cancel))
    @command_window2 = Window_CustomCharaCommand2.new
    @command_window2.set_handler(:cancel, method(:on_cmd_cancel))
  end
  #--------------------------------------------------------------------------
  # ● 入力[性別の変更]
  #--------------------------------------------------------------------------
  def on_sex
    @character_name = CustomChara.change_sex(@character_name)
    @looking_window.set_character(@character_name)
    @command_window.activate
  end
  #--------------------------------------------------------------------------
  # ● 入力[顔の変更]
  #--------------------------------------------------------------------------
  def on_face
    @command_window1.show
    @command_window1.activate
  end
  #--------------------------------------------------------------------------
  # ● 入力[服装の変更]
  #--------------------------------------------------------------------------
  def on_cloth
    @command_window2.show
    @command_window2.activate
  end
  #--------------------------------------------------------------------------
  # ● コマンドのキャンセル
  #--------------------------------------------------------------------------
  def on_cmd_cancel
    @command_window1.hide
    @command_window2.hide
    @command_window.activate
  end
  #--------------------------------------------------------------------------
  # ● 入力[決定]
  #--------------------------------------------------------------------------
  def on_complete
    fn = CustomChara.get_face_name(@character_name)
    Cache.save_face_png(@character_name)
    @actor.set_graphic(@character_name, 0, @character_name, 0)
    $game_player.refresh
    return_scene
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    update_basic
    update_character
  end
  #--------------------------------------------------------------------------
  # ● カスタムキャラの更新
  #--------------------------------------------------------------------------
  def update_character
    return if @command_window1.active == false and @command_window2.active == false
    value = 0
    value =  1 if Input.repeat?(:RIGHT)
    value = -1 if Input.repeat?(:LEFT)
    return if value == 0
    symbol = @command_window1.current_symbol if @command_window1.active
    symbol = @command_window2.current_symbol if @command_window2.active
    case symbol
    when :n_front
      @character_name = CustomChara.next_front_hair(@character_name, value)
    when :n_rear
      @character_name = CustomChara.next_rear_hair(@character_name, value)
    when :n_face
      @character_name = CustomChara.next_face(@character_name, value)
    when :n_ears
      @character_name = CustomChara.next_ears(@character_name, value)
    when :n_eyebrows
      @character_name = CustomChara.next_eyebrows(@character_name, value)
    when :n_eyes
      @character_name = CustomChara.next_eyes(@character_name, value)
    when :n_nose
      @character_name = CustomChara.next_nose(@character_name, value)
    when :n_mouth
      @character_name = CustomChara.next_mouth(@character_name, value)
    when :n_beard
      @character_name = CustomChara.next_beard(@character_name, value)
    when :n_kemono
      @character_name = CustomChara.next_kemono(@character_name, value)
    when :n_tail
      @character_name = CustomChara.next_tail(@character_name, value)
    when :n_neck
      @character_name = CustomChara.next_neck(@character_name, value)
      
   
    when :c_hair
      @character_name = CustomChara.change_hair_color(@character_name, value)
    when :c_eyes
      @character_name = CustomChara.change_eye_color(@character_name, value)
    when :c_skin
      @character_name = CustomChara.change_skin_color(@character_name, value)
    when :n_cloth
      @character_name = CustomChara.next_cloth(@character_name, value)
    when :c_cloth
      @character_name = CustomChara.change_cloth_color(@character_name, value)
    when :n_cloak
      @character_name = CustomChara.next_cloak(@character_name, value)
    when :c_cloak
      @character_name = CustomChara.change_cloak_color(@character_name, value)
    when :n_wing
      @character_name = CustomChara.next_wing(@character_name, value)
    when :c_wing
      @character_name = CustomChara.change_wing_color(@character_name, value)
    when :n_glasses
      @character_name = CustomChara.next_glasses(@character_name, value)
    when :c_glasses
      @character_name = CustomChara.change_glasses_color(@character_name, value)
    when :n_acc1
      @character_name = CustomChara.next_acc1(@character_name, value)
    when :c_acc1
      @character_name = CustomChara.change_acc1_color(@character_name, value)
    when :n_acc2
      @character_name = CustomChara.next_acc2(@character_name, value)
    when :c_acc2
      @character_name = CustomChara.change_acc2_color(@character_name, value)
    end
    Sound.play_cursor
    @looking_window.set_character(@character_name)
  end
end

#==============================================================================
# ■ Game_Actor
#------------------------------------------------------------------------------
#  アクターを扱うクラスです。このクラスは Game_Actors クラス($game_actors)
# の内部で使用され、Game_Party クラス($game_party)からも参照されます。
#==============================================================================

class Game_Actor < Game_Battler
  attr_accessor :sex             # 性別
  #--------------------------------------------------------------------------
  # ● グラフィックの変更
  #--------------------------------------------------------------------------
  alias ed_chara_edit_set_graphic set_graphic
  def set_graphic(character_name, character_index, face_name, face_index)
    sexname = character_name[/\w\z/]
    if sexname == "F"
      self.sex = 1
    elsif sexname == "M"
      self.sex = 0
    end
    ed_chara_edit_set_graphic(character_name, character_index, face_name, face_index)
  end
end
#==============================================================================
# ■ Game_Character
#------------------------------------------------------------------------------
#  主に移動ルートなどの処理を追加したキャラクターのクラスです。Game_Player、
# Game_Follower、GameVehicle、Game_Event のスーパークラスとして使用されます。
#==============================================================================

class Game_CharacterBase
  attr_accessor :sex             # 性別
  #--------------------------------------------------------------------------
  # ● 公開メンバ変数の初期化
  #--------------------------------------------------------------------------
  alias ed_chara_edit_init_public_members init_public_members
  def init_public_members
    ed_chara_edit_init_public_members
    @sex = 0
  end
end
#==============================================================================
# ■ Game_Player
#------------------------------------------------------------------------------
#  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの
# 機能を持っています。このクラスのインスタンスは $game_player で参照されます。
#==============================================================================

class Game_Player < Game_Character
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  alias ed_chara_edit_refresh refresh
  def refresh
    @sex = actor ? actor.sex : 0
    ed_chara_edit_refresh
  end
end
#==============================================================================
# ■ Game_Follower
#------------------------------------------------------------------------------
#  フォロワーを扱うクラスです。フォロワーとは、隊列歩行で表示する、先頭以外の
# 仲間キャラクターのことです。Game_Followers クラスの内部で参照されます。
#==============================================================================

class Game_Follower < Game_Character
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  alias ed_chara_edit_refresh refresh
  def refresh
    ed_chara_edit_refresh
    @sex = visible? ? actor.sex : ""
  end
end
class Game_Interpreter
  #--------------------------------------------------------------------------
  # ● 主人公外見変更シーンの遷移処理
  #--------------------------------------------------------------------------
  def command_custom_chara(actor_id)
    return if $game_party.in_battle
    if $data_actors[actor_id]
      SceneManager.call(Scene_CustomChara)
      SceneManager.scene.prepare(actor_id)
      Fiber.yield
    end
  end
end[/pre]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部