#==============================================================================
# ■ 主人公の外見とフェイスを編集可能にするスクリプト
# Ver 0.03 2012/01/10 パーツの重ね順の不具合を修正
# Ver 0.02 2011/12/25 著作権表示を変更
# Ver 0.01 2011/12/18
# [url]http://fweb.midi.co.jp/~mikagami/atelier/[/url]
#------------------------------------------------------------------------------
#
# このスクリプトは、VX Ace にもれなく付属する「キャラクター生成」ツールの
# 素材を利用し、ゲーム上でも同様のキャラクター生成を可能にするものです。
# このスクリプト単体では動作しません。必ずプロジェクト(の画像ファイル)ごと
# 導入して下さい。
#
# ※注意!
# ・歩行グラフィックは、元ツールの素材全てを使用しているので、同等のキャラが
# 出来るはずです。フェイスに関しては、意図的に素材を限定しています。
# 具体的には、「顔の輪郭」「目」「鼻」「口」「目の高さ」「襟元」「文様」
# 「装身具」の素材が使用していなかったり、1種類のみ、などとなっています。
# ・使用方法はプロジェクトを参考にして下さい。
# ・フェイスパーツのうち、影?のパーツの合成に失敗していると思います。
# とりあえずよく分からない&現状でもそれほど違和感がないので、
# そのままにしてあります。(前髪や眉毛、目の影の部分です。)
# ・比較的独立性が高いスクリプトなので、スクリプトの競合が起こる可能性は
# 高くないと思います。ただし Cacheモジュールで一部上書き定義をしているので
# そこだけは注意。(↓590行目あたり)
# ・各パーツの画像ファイルはキャラ作成のたびに存在チェックをしているので、
# 無駄に重いかもしれません。ただし作成さえしてしまえばキャラクタ画像は
# キャッシングされるので、それほど問題ないはずです。
# ・各パーツの画像ファイルは "Graphics/System/" へ入れてますが、
# 大した意味はありません。
# ・各パーツの画像ファイルのファイル名の先頭に "@" を付けていますが、
# 大した意味はありません。
# ・ひととおりの動作確認はしていますが、パーツの重ね合わせの順番等が
# 間違っていたり、その他不具合がある可能性があります。
# ・このスクリプトの著作権は著者にあります。
# ですがスクリプトの利用や改造・再配布に著者の許可は必要ありません。
# 著者には未完成な部分の補完や改造依頼に対する対応義務はありません。
# 他者に改造依頼するより、あなた自身が改造すれば、みんなが幸せになります。
#
#==============================================================================
#==============================================================================
# ☆VXAce RGSS3 「キャラエディット改」☆
# EnDlEss DREamER
# URL:[url]http://mitsu-evo.6.ql.bz/[/url]
# 製作者 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[i][0], parts_arr[i][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