code:
;情報表示に関わる関数
;-------------------------------------------------
;ARG:0番のキャラの情報を表示
;-------------------------------------------------
@SHOW_INFO_CLOTH_DRAWER(CHARA_ID)
#DIM CHARA_ID
#DIM 調教中
#DIM DYNAMIC FIRST_LINE
FIRST_LINE = LINECOUNT

;初期プリセット登録処理
CALL CLOTH_DRAWER_INIT_REGIST(CHARA_ID)
;通常プリセットは常に有効に
CLOTH_PRESET_IS_VALID:CHARA_ID:0 = 1

CALL SHOW_HEADER(CHARA_ID)
PRINTL
CALL CLOTH_DRAWER_BASE_INFO(CHARA_ID)
CALL CLOTH_DRAWER_STOCK(CHARA_ID)
CALL CLOTH_DRAWER_PRESET(CHARA_ID)

FOR LOCAL, 0, 42
	PRINTL
NEXT

;-------------------------------------------------
; ポートレイト、体力などの基礎情報
;-------------------------------------------------
@CLOTH_DRAWER_BASE_INFO(CHARA_ID)
#DIM CHARA_ID
#DIMS ATR_DIV
ATR_DIV '=  @"rect = '5200, 0, 3250, 1250' border = '1px' bcolor='#%CVH(カラー_白)%' padding='2px'"
;顔グラ表示
CALL DRAW_PORTRAIT(CHARA_ID, "[サイズ:200px][POS_X:7200]", "PORTRAIT_EDIT")
LOCALS '= ""
LOCALS += @"◆ %ANAME(CHARA_ID)%"
LOCALS += "
"
LOCALS += @"%DRAW_LINEH(18)%
"
LOCALS += @"体力：%COLOR_BAR_H(BASE:CHARA_ID:体力, MAXBASE:CHARA_ID:体力, 12, カラー_黄, カラー_黄緑, カラー_ダークグレー, 1, @"%UNICODE(0x2588)%")%"
LOCALS += "

"
LOCALS += @"気力：%COLOR_BAR_H(BASE:CHARA_ID:気力, MAXBASE:CHARA_ID:気力, 12, カラー_レッド, カラー_オレンジ, カラー_ダークグレー, 1, @"%UNICODE(0x2588)%")%"
LOCALS += "

"
LOCALS += @"精神：%COLOR_BAR_H(BASE:CHARA_ID:精神力, MAXBASE:CHARA_ID:精神力, 12, カラー_ブルー, カラー_シアン, カラー_ダークグレー, 1, @"%UNICODE(0x2588)%")%"
LOCALS += "

"

HTML_PRINT @"
%LOCALS%
", 1

;-------------------------------------------------
; プリセットメニュー
;-------------------------------------------------
@CLOTH_DRAWER_PRESET(CHARA_ID)
#DIM CHARA_ID
#DIMS DYNAMIC ATR_DIV
#DIM  DYNAMIC CLOTH_ID
#DIM  DYNAMIC CLOTH_DID, MAX_CLOTH_ID
#DIM  DYNAMIC TARGET_CLOTH_DID
#DIMS DYNAMIC PRESET_LIST
#DIM  DYNAMIC ITER_I
#DIM  DYNAMIC ITER_J

ATR_DIV '=  @"rect = '5200, 1250, 3250, 2750' border = '1px' bcolor='#%CVH(カラー_白)%' padding='2px'"
LOCALS '= ""
LOCALS += @"・%ANAME(CHARA_ID)%の衣装プリセット"
LOCALS += "
"
LOCALS += @"%DRAW_LINEH(31)%
"
FOR LOCAL, 0, VARSIZE("CLOTH_PRESET_NAME")
	LOCALS += @"<button value='[CLOTH_PRESET:%TOSTR(LOCAL)%]'>[%CLOTH_PRESET_NAME:LOCAL%]</button>　"
NEXT
LOCALS += "
"
LOCALS += @"%DRAW_LINEH(31, カラー_選択不可)%
"
LOCALS += @"<button value ='[PRESET_VALID:1]'>[有効]</button>　"
IF CLOTH_DRAWER_SELECT_PRESET
	LOCALS += @"<button value ='[PRESET_VALID:0]'>[無効]</button>　"
ELSE
	;通常プリセットは無効にできない
	LOCALS += @"[無効]　"
ENDIF
IF CLOTH_PRESET_IS_VALID:CHARA_ID:CLOTH_DRAWER_SELECT_PRESET && CFLAG:CHARA_ID:ポートレイト画像タイプ == 0
	LOCALS += "<button value='SET_PORTRAIT'>[ﾎﾟｰﾄﾚｲﾄ設定]</button>"
ELSE
	LOCALS += @"[ﾎﾟｰﾄﾚｲﾄ設定]"
ENDIF
LOCALS += "
"
LOCALS += @"%DRAW_LINEH(31)%
"

LOCALS += @"◆ドロアに登録されている衣装から着こなしを指定できます

"

;各衣装のボタン
;-------------------------------------------------
FOR ITER_I, 0, CLOTH_PART_NUM - 1
	VARSET CLOTH_DID, -1
	TARGET_CLOTH_DID = -1
	CLOTH_ID = 0
	DT_SELECT "CLOTH_DRAWER", @"OWNER_CHARA_UID = {CFLAG:CHARA_ID:キャラＩＤ} AND PARTS_IDX = {ITER_I}",, CLOTH_DID
	IF RESULT
		FOR ITER_J, 0, RESULT
			PRESET_LIST = %DT_CELL_GETS("CLOTH_DRAWER", CLOTH_DID:(ITER_J), "PRESET_LIST", 1)%
			IF LIST_INDEXOF(PRESET_LIST, TOSTR(CLOTH_DRAWER_SELECT_PRESET)) != -1
				CLOTH_ID = DT_CELL_GET("CLOTH_DRAWER", CLOTH_DID:(ITER_J), "CLOTH_ID", 1)
				TARGET_CLOTH_DID = CLOTH_DID:(ITER_J)
				BREAK
			ENDIF
		NEXT
	ENDIF
	CALL GET_CLOTH_NAME(ITER_I, CLOTH_ID)
	IF CLOTH_ID && CLOTH_PRESET_IS_VALID:CHARA_ID:CLOTH_DRAWER_SELECT_PRESET
		LOCALS += @"%CLOTH_PART_NAME:ITER_I, 10, LEFT% - <button value ='[CHANGE_CLOTH:{ITER_I}]'>[%RESULTS, 18, LEFT%]</button>
"
	ELSEIF CLOTH_ID && !CLOTH_PRESET_IS_VALID:CHARA_ID:CLOTH_DRAWER_SELECT_PRESET
		LOCALS += @"%CLOTH_PART_NAME:ITER_I, 10, LEFT% - [%RESULTS, 18, LEFT%]
"
	ELSEIF CLOTH_PRESET_IS_VALID:CHARA_ID:CLOTH_DRAWER_SELECT_PRESET
		LOCALS += @"%CLOTH_PART_NAME:ITER_I, 10, LEFT% - <button value ='[CHANGE_CLOTH:{ITER_I}]'>[---]</button>
"
	ELSE
		LOCALS += @"%CLOTH_PART_NAME:ITER_I, 10, LEFT% ---
"
	ENDIF
NEXT
HTML_PRINT @"
%LOCALS%
", 1

;-------------------------------------------------
; 衣装ドロアヘッダ
;-------------------------------------------------
@CLOTH_DRAWER_STOCK(CHARA_ID)
#DIM CHARA_ID
#DIMS ATR_DIV

ATR_DIV '=  @"rect = '200, 0, 5000, 4000' border = '1px' bcolor='#%CVH(カラー_白)%' padding='2px'"
LOCALS '= ""
LOCALS += "・衣装ドロア"
LOCALS += "
"
LOCALS += @"%DRAW_LINEH(49)%
"
FOR LOCAL, 0, VARSIZE("CLOTH_PART_NAME")
	SIF LOCAL == 衣装部位_武器
		CONTINUE
	LOCALS += @"<button value='[CLOTH_CATEGORY:{LOCAL}]'>[%TOHALF(CLOTH_PART_NAME:LOCAL)%]</button> "
	SIF (LOCAL + 1) % 20 == 0
		LOCALS += "
"
NEXT
HTML_PRINT @"
%LOCALS%
", 1

CALL CLOTH_DRAWER_HOME_STOCK(CHARA_ID)
CALL CLOTH_DRAWER_CHARA_STOCK(CHARA_ID)

;-------------------------------------------------
; 拠点の在庫
;-------------------------------------------------
@CLOTH_DRAWER_HOME_STOCK(CHARA_ID)
#DIM CHARA_ID
#DIMS ATR_DIV
#DIMS DYNAMIC ITEM_NAME
#DIM  DYNAMIC STOCK
#DIM  DYNAMIC LINE_COUNT
#DIMS DYNAMIC COLUMN, 12
#DIM  CONST MAX_COLUMN = 12

ATR_DIV '=  @"rect = '200, 500, 2500, 3500' border = '1px' bcolor='#%CVH(カラー_白)%' padding='2px'"
LOCALS '= ""
LOCALS += @"・拠点の在庫"
LOCALS += "
"
LOCALS += @"%DRAW_LINEH(24)%
"
FOR LOCAL, 1, MAX_CLOTH_ID
	SIF LINE_COUNT > 0 && LINE_COUNT % MAX_COLUMN == 0
		LINE_COUNT = 0
	STOCK = HAVE_CLOTH:CLOTH_DRAWER_SELECT_CATEGORY:LOCAL
	IF STOCK > 0
		CALL GET_CLOTH_NAME(CLOTH_DRAWER_SELECT_CATEGORY, LOCAL)
		COLUMN:LINE_COUNT += @"<button value ='[CLOTH_STOCK:{LOCAL}]'>[%RESULTS, 18, LEFT%] ✕{STOCK, 2, RIGHT}</button>"
		LINE_COUNT ++
	ENDIF
NEXT

FOR LOCAL, 0, VARSIZE("COLUMN")
	LOCALS += COLUMN:LOCAL
	LOCALS += "

"
NEXT

HTML_PRINT @"
%LOCALS%
", 1

;-------------------------------------------------
; キャラの在庫
;-------------------------------------------------
@CLOTH_DRAWER_CHARA_STOCK(CHARA_ID)
#DIM CHARA_ID
#DIMS ATR_DIV
#DIM  DYNAMIC CLOTH_ID
#DIMS DYNAMIC PRESET_LIST
#DIM  DYNAMIC PARTS_IDX

#DIM  DYNAMIC LINE_COUNT
#DIMS DYNAMIC COLUMN, CLOTH_DRAWER_MAX_DRAWERNUM

PARTS_IDX = CLOTH_DRAWER_SELECT_CATEGORY

ATR_DIV '=  @"rect = '2700, 500, 2500, 3500' border = '1px' bcolor='#%CVH(カラー_白)%' padding='2px'"
LOCALS '= ""
LOCALS += @"・%ANAME(CHARA_ID)%の衣装ドロア"
LOCALS += "
"
LOCALS += @"%DRAW_LINEH(24)%
"

DT_SELECT "CLOTH_DRAWER", @"OWNER_CHARA_UID = {CFLAG:CHARA_ID:キャラＩＤ} AND PARTS_IDX = {PARTS_IDX}", "CLOTH_ID ASC",
FOR LOCAL, 0, RESULT
	CLOTH_ID = DT_CELL_GET("CLOTH_DRAWER", RESULT:(LOCAL + 1), "CLOTH_ID", 1)
	PRESET_LIST = %DT_CELL_GETS("CLOTH_DRAWER", RESULT:(LOCAL + 1), "PRESET_LIST", 1)%
	CALL GET_CLOTH_NAME(PARTS_IDX, CLOTH_ID)
	COLUMN:LINE_COUNT += @"<button value ='[CHARA_STOCK:{CLOTH_ID}]'>[%RESULTS, 18, LEFT%]</button>"
	LINE_COUNT ++
NEXT

FOR LOCAL, 0, VARSIZE("COLUMN")
	LOCALS += COLUMN:LOCAL
	LOCALS += "

"
NEXT

HTML_PRINT @"
%LOCALS%
", 1

;-------------------------------------------------
; 入力処理
;-------------------------------------------------
@CLOTH_DRAWER_INPUT(INPUT_VALUES, CHARA_ID)
#DIMS INPUT_VALUES
#DIM  CHARA_ID
#DIM  DYNAMIC CHARA_UID
#DIM  DYNAMIC PARTS_IDX
#DIM  DYNAMIC CLOTH_ID
#DIM  DYNAMIC ITEM_DID
#DIM  DYNAMIC PREV_PRESET

IF !IS_SAME_FACTION(CHARA_ID)
	RETURN
ENDIF

CHARA_UID = CFLAG:CHARA_ID:キャラＩＤ
PARTS_IDX = CLOTH_DRAWER_SELECT_CATEGORY

IF DIC_CONTAINSKEY(INPUT_VALUES, "CLOTH_CATEGORY")
	CLOTH_DRAWER_SELECT_CATEGORY = TOINT(DIC_GET(INPUT_VALUES, "CLOTH_CATEGORY"))
	;拠点在庫からキャラの衣装ドロアに登録
	;-------------------------------------------------
ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "CLOTH_STOCK")
	CLOTH_ID = TOINT(DIC_GET(INPUT_VALUES, "CLOTH_STOCK"))
	;既にドロアに登録されているか判定
	DT_SELECT "CLOTH_DRAWER",@"OWNER_CHARA_UID = {CHARA_UID} AND PARTS_IDX = {PARTS_IDX} AND CLOTH_ID = {CLOTH_ID}"
	IF RESULT > 0
		PRINTL
		CALL COLOR_PRINTW(@"この衣装は既に%ANAME(CHARA_ID)%のドロアに登録されています", カラー_注意)
		RETURN
	ENDIF
	;ドロアの登録上限に到達していないか判定
	DT_SELECT "CLOTH_DRAWER",@"OWNER_CHARA_UID = {CHARA_UID} AND PARTS_IDX = {PARTS_IDX}"
	IF RESULT == CLOTH_DRAWER_MAX_DRAWERNUM
		PRINTL
		CALL COLOR_PRINTW(@"登録数が上限に達しています", カラー_注意)
		RETURN
	ENDIF
	;登録されていなければドロアに登録
	{
		DT_ROW_ADD "CLOTH_DRAWER"
			,"CLOTH_ID", CLOTH_ID
			,"PARTS_IDX", PARTS_IDX
			,"OWNER_CHARA_UID", CHARA_UID
	}
	HAVE_CLOTH:PARTS_IDX:CLOTH_ID --
	;キャラの衣装ドロアから拠点在庫に戻す
	;-------------------------------------------------
ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "CHARA_STOCK")
	CLOTH_ID = TOINT(DIC_GET(INPUT_VALUES, "CHARA_STOCK"))
	;特定のプリセットに登録されているか判定
	DT_SELECT "CLOTH_DRAWER",@"OWNER_CHARA_UID = {CHARA_UID} AND PARTS_IDX = {PARTS_IDX} AND CLOTH_ID = {CLOTH_ID}"
	SIF RESULT < 1
		RETURN
	ITEM_DID = RESULT:1
	IF DT_CELL_GETS("CLOTH_DRAWER", ITEM_DID, "PRESET_LIST", 1) != ""
		PRINTL
		CALL COLOR_PRINTL(@"この衣装は%ANAME(CHARA_ID)%の衣装プリセットに登録されているため拠点の在庫に戻せません", カラー_注意)
		CALL COLOR_PRINTW(@"在庫に戻すにはプリセットの登録を解除してください", カラー_注意)
		RETURN
	ENDIF
	DT_ROW_REMOVE "CLOTH_DRAWER", ITEM_DID
	HAVE_CLOTH:PARTS_IDX:CLOTH_ID ++
ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "CHANGE_CLOTH")
	CALL CLOTH_DRAWER_SET_NEW_CLOTH(CHARA_ID, TOINT(DIC_GET(INPUT_VALUES, "CHANGE_CLOTH")))
ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "CLOTH_PRESET")
	CLOTH_DRAWER_SELECT_PRESET = TOINT(DIC_GET(INPUT_VALUES, "CLOTH_PRESET"))
ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "PRESET_VALID")
	CLOTH_PRESET_IS_VALID:CHARA_ID:CLOTH_DRAWER_SELECT_PRESET = TOINT(DIC_GET(INPUT_VALUES, "PRESET_VALID"))
ELSEIF INPUT_VALUES == "SET_PORTRAIT"
	CALL PORTRAIT_PRESET_MENU(CHARA_ID)
ENDIF

@CLOTH_DRAWER_SET_NEW_CLOTH(CHARA_ID, PARTS_IDX)
#DIM CHARA_ID
#DIM PARTS_IDX
#DIM DYNAMIC CLOTH_ID
#DIM DYNAMIC DID, MAX_CLOTH_ID

PRINTL
CALL DRAW_LINE()
PRINTFORML ◆%CLOTH_PART_NAME:PARTS_IDX%にセットする衣装を選択してください
PRINTL

DT_SELECT "CLOTH_DRAWER",@"OWNER_CHARA_UID = {CFLAG:CHARA_ID:キャラＩＤ} AND PARTS_IDX = {PARTS_IDX}",,DID
FOR LOCAL, 0, RESULT
	CLOTH_ID = DT_CELL_GET("CLOTH_DRAWER", DID:LOCAL, "CLOTH_ID", 1)
	CALL GET_CLOTH_NAME(PARTS_IDX, CLOTH_ID)
	HTML_PRINT @"<button value='{DID:LOCAL}'>[%RESULTS%]</button>"
NEXT
PRINTL
HTML_PRINT @"<button value='-1'>[外す]</button>"
PRINTL
HTML_PRINT @"<button value='9999'>[キャンセル]</button>"

BINPUT
SELECTCASE RESULT
	CASE 9999
		RETURN
	CASEELSE
		CALL CLOTH_DRAWER_CHANGE_CLOTH(CHARA_ID, PARTS_IDX, RESULT)
ENDSELECT

@CLOTH_DRAWER_CHANGE_CLOTH(CHARA_ID, PARTS_IDX, SET_CLOTH_DID = -1)
#DIM CHARA_ID
#DIM PARTS_IDX
#DIM SET_CLOTH_DID
#DIM DYNAMIC DID, 100
#DIMS DYNAMIC PRESET_LIST
#DIM DYNAMIC PREV_CLOTH_DID = -1
#DIM DYNAMIC PRESET_IDX
#DIMS DYNAMIC FILTER_STR

PRESET_IDX = CLOTH_DRAWER_SELECT_PRESET

;同一部位にセットされている衣装があればプリセットから解除
FILTER_STR '= @"OWNER_CHARA_UID = {CFLAG:CHARA_ID:キャラＩＤ}"
;換装する場合干渉部位の衣装があればプリセットから解除
SELECTCASE PARTS_IDX
	CASE 衣装部位_上服, 衣装部位_下服
		FILTER_STR += @"AND (PARTS_IDX = {PARTS_IDX} OR PARTS_IDX = {衣装部位_上下服})"
	CASE 衣装部位_上下服
		FILTER_STR += @"AND (PARTS_IDX = {PARTS_IDX} OR PARTS_IDX = {衣装部位_上服} OR PARTS_IDX = {衣装部位_下服})"
	CASE 衣装部位_下着上, 衣装部位_下着下
		FILTER_STR += @"AND (PARTS_IDX = {PARTS_IDX} OR PARTS_IDX = {衣装部位_上下下着})"
	CASE 衣装部位_上下下着
		FILTER_STR += @"AND (PARTS_IDX = {PARTS_IDX} OR PARTS_IDX = {衣装部位_下着下} OR PARTS_IDX = {衣装部位_下着上})"
	CASEELSE
		FILTER_STR += @"AND PARTS_IDX = {PARTS_IDX}"
ENDSELECT

DT_SELECT "CLOTH_DRAWER", FILTER_STR,,DID
IF RESULT
	FOR LOCAL, 0, RESULT
		PRESET_LIST = %DT_CELL_GETS("CLOTH_DRAWER", DID:LOCAL, "PRESET_LIST", 1)%
		IF LIST_INDEXOF(PRESET_LIST, TOSTR(PRESET_IDX)) != -1
			DT_CELL_SET "CLOTH_DRAWER", DID:LOCAL, "PRESET_LIST", LIST_REMOVEALL(PRESET_LIST, TOSTR(PRESET_IDX)), 1
		ENDIF
	NEXT
ENDIF

SIF SET_CLOTH_DID == -1
	RETURN

;選択された衣装が現在のプリセットに登録されていない場合は登録
PRESET_LIST = %DT_CELL_GETS("CLOTH_DRAWER", SET_CLOTH_DID, "PRESET_LIST", 1)%
SIF LIST_INDEXOF(PRESET_LIST, TOSTR(PRESET_IDX)) == -1
	DT_CELL_SET "CLOTH_DRAWER", SET_CLOTH_DID, "PRESET_LIST", LIST_ADD(PRESET_LIST, TOSTR(PRESET_IDX)), 1

;-------------------------------------------------
; 初期処理
; 衣装ドロアに一つも衣装の登録がない場合は、現在着用中の衣装をデフォルトとしてドロアと【通常】プリセットに登録する
;-------------------------------------------------
@CLOTH_DRAWER_INIT_REGIST(CHARA_ID)
#DIM  CHARA_ID
#DIM  DYNAMIC CHARA_UID
#DIM  DYNAMIC PARTS_IDX
#DIM  DYNAMIC CLOTH_ID
#DIM  DYNAMIC ITEM_DID

SIF CFLAG:CHARA_ID:衣装ドロア初期登録済み
	RETURN
CHARA_UID = CFLAG:CHARA_ID:キャラＩＤ
DT_SELECT "CLOTH_DRAWER",@"OWNER_CHARA_UID = {CHARA_UID}"
IF RESULT < 1
	FOR PARTS_IDX, 0, VARSIZE("CLOTH_PART_NAME")
		SIF PARTS_IDX == 衣装部位_武器
			CONTINUE
		CLOTH_ID = CLOTH:CHARA_ID:PARTS_IDX
		SIF CLOTH_ID == 0
			CONTINUE
		{
			DT_ROW_ADD "CLOTH_DRAWER"
				,"CLOTH_ID", CLOTH_ID
				,"PARTS_IDX", PARTS_IDX
				,"OWNER_CHARA_UID", CHARA_UID
				,"PRESET_LIST", "0,"
		}
	NEXT
	CFLAG:CHARA_ID:衣装ドロア初期登録済み = 1
ELSE
	CFLAG:CHARA_ID:衣装ドロア初期登録済み = 1
	RETURN
ENDIF

;-------------------------------------------------
; 衣装ドロア削除処理
; 全てのドロア登録衣装を在庫に戻す
;-------------------------------------------------
@CLOTH_DRAWER_DELETE_DRAWER(CHARA_ID)
#DIM  CHARA_ID
#DIM  DYNAMIC CHARA_UID
#DIM  DYNAMIC PARTS_IDX
#DIM  DYNAMIC CLOTH_ID
#DIM  DYNAMIC ITEM_DID, 1000
CHARA_UID = CFLAG:CHARA_ID:キャラＩＤ
DT_SELECT "CLOTH_DRAWER",@"OWNER_CHARA_UID = {CHARA_UID}",, ITEM_DID
FOR LOCAL, 0, RESULT
	CLOTH_ID = DT_CELL_GET("CLOTH_DRAWER", ITEM_DID:LOCAL, "CLOTH_ID", 1)
	PARTS_IDX = DT_CELL_GET("CLOTH_DRAWER", ITEM_DID:LOCAL, "PARTS_IDX", 1)
	DT_ROW_REMOVE "CLOTH_DRAWER", ITEM_DID:LOCAL
	SIF !CLOTH_ID
		CONTINUE
	HAVE_CLOTH:PARTS_IDX:CLOTH_ID += 1
NEXT


code:
;-------------------------------------------------
;感覚用汎用
;-------------------------------------------------
@SHOW_INFO_DESCRIPTION_SENSE(文字列, 数値)
#DIMS 文字列
#DIM 数値
SELECTCASE 数値
	CASE IS >= ランク閾値:ランク_その他:ランク_B
		PRINTFORML 開発された%文字列%はかなり敏感になっており、明らかな弱点になっている
	CASE IS >= ランク閾値:ランク_その他:ランク_C
		PRINTFORML %文字列%はかなり開発され、ずいぶん敏感になっている
	CASE IS >= ランク閾値:ランク_その他:ランク_D
		PRINTFORML %文字列%で明確に感じるようになったようだ
	CASE IS >= ランク閾値:ランク_その他:ランク_E
		PRINTFORML %文字列%で人並みに感じるようだ
	CASE IS >= ランク閾値:ランク_その他:ランク_F
		PRINTFORML %文字列%で感じ始めたようだ
	CASE IS >= ランク閾値:ランク_その他:ランク_G
		PRINTFORML %文字列%ではあまり感じないようだ
	CASEELSE
ENDSELECT

;-------------------------------------------------
;Ｃ感覚
;-------------------------------------------------
@SHOW_INFO_ERO_DESCRIPTION_0(対象, 数値)
#DIM 対象
#DIM 数値
LOCALS = \@ HAS_PENIS(対象) ? ペニス # 秘核 \@
SELECTCASE 数値
	CASE IS >= ランク閾値:ランク_その他:ランク_S
		PRINTFORML %LOCALS%は風が吹いただけで絶頂してしまうほど敏感になっている
	CASE IS >= ランク閾値:ランク_その他:ランク_A
		PRINTFORML 開発されきった%LOCALS%は、指で軽く触れただけで達するほど敏感だ
	CASEELSE
		CALL SHOW_INFO_DESCRIPTION_SENSE(LOCALS, 数値)
ENDSELECT

;-------------------------------------------------
;Ｖ感覚
;-------------------------------------------------
@SHOW_INFO_ERO_DESCRIPTION_1(対象, 数値)
#DIM 対象
#DIM 数値
SIF !HAS_VAGINA(対象)
	RETURN 0
SELECTCASE 数値
	CASE IS >= ランク閾値:ランク_その他:ランク_S
		PRINTFORML 女穴は常に快感を求めて疼き、涎を垂れ流している
	CASE IS >= ランク閾値:ランク_その他:ランク_A
		PRINTFORML 開発されきった女穴は、指で軽く触れただけで達するほど敏感だ
	CASEELSE
		CALL SHOW_INFO_DESCRIPTION_SENSE("女穴", 数値)
ENDSELECT

;-------------------------------------------------
;Ａ感覚
;-------------------------------------------------
@SHOW_INFO_ERO_DESCRIPTION_2(対象, 数値)
#DIM 対象
#DIM 数値
SELECTCASE 数値
	CASE IS >= ランク閾値:ランク_その他:ランク_S
		PRINTFORML 菊穴は常に快感を求めて疼く、貪欲な性器に作り替えられている
	CASE IS >= ランク閾値:ランク_その他:ランク_A
		PRINTFORML 開発されきった菊穴は、指で軽くほじくっただけで達するほど敏感だ
	CASEELSE
		CALL SHOW_INFO_DESCRIPTION_SENSE("菊穴", 数値)
ENDSELECT

;-------------------------------------------------
;Ｂ感覚
;-------------------------------------------------
@SHOW_INFO_ERO_DESCRIPTION_3(対象, 数値)
#DIM 対象
#DIM 数値
SELECTCASE 数値
	CASE IS >= ランク閾値:ランク_その他:ランク_S
		PRINTFORML 乳房は風が吹いただけで絶頂してしまうほど敏感になっている
	CASE IS >= ランク閾値:ランク_その他:ランク_A
		PRINTFORML 開発されきった乳房の先端は、いつでも快楽を期待し尖っている
	CASEELSE
		CALL SHOW_INFO_DESCRIPTION_SENSE("乳房", 数値)
ENDSELECT

;-------------------------------------------------
;Ｍ感覚
;-------------------------------------------------
@SHOW_INFO_ERO_DESCRIPTION_4(対象, 数値)
#DIM 対象
#DIM 数値
SELECTCASE 数値
	CASE IS >= ランク閾値:ランク_その他:ランク_S
		PRINTFORML 口は性器として生まれ変わり、その感度は食事が困難なほどだ
	CASE IS >= ランク閾値:ランク_その他:ランク_A
		PRINTFORML 開発されきった唇は、バードキスですら絶頂するほど敏感だ
	CASEELSE
		CALL SHOW_INFO_DESCRIPTION_SENSE("唇", 数値)
ENDSELECT

;-------------------------------------------------
;Ｕ感覚
;-------------------------------------------------
@SHOW_INFO_ERO_DESCRIPTION_5(対象, 数値)
#DIM 対象
#DIM 数値
SELECTCASE 数値
	CASE IS >= ランク閾値:ランク_その他:ランク_S
		PRINTFORML  尿道は性感帯として生まれ変わり、排尿の刺激ですら絶頂するほどだ
	CASE IS >= ランク閾値:ランク_その他:ランク_A
		PRINTFORML  開発されきった尿道は、完全に快楽を生み出す器官に変化した
	CASEELSE
		CALL SHOW_INFO_DESCRIPTION_SENSE("尿道", 数値)
ENDSELECT

;-------------------------------------------------
;欲望
;-------------------------------------------------
@SHOW_INFO_ERO_DESCRIPTION_12(対象, 数値)
#DIM 対象
#DIM 数値
SELECTCASE 数値
	CASE IS >= ランク閾値:ランク_その他:ランク_S
		PRINTFORML 淫らな欲望が頭を支配し、いつでも快楽を求めている
	CASE IS >= ランク閾値:ランク_その他:ランク_A
		PRINTFORML 淫乱というに足るほど欲深く、快楽を望んでいる
	CASE IS >= ランク閾値:ランク_その他:ランク_B
		PRINTFORML 淫らな行為にすっかり抵抗がなくなっている
	CASE IS >= ランク閾値:ランク_その他:ランク_C
		PRINTFORML 淫らな行為にもだいぶ慣れたようだ
ENDSELECT

;-------------------------------------------------
;性技
;-------------------------------------------------
@SHOW_INFO_ERO_DESCRIPTION_13(対象, 数値)
#DIM 対象
#DIM 数値
SELECTCASE 数値
	CASE IS >= ランク閾値:ランク_その他:ランク_S
		PRINTFORML その技巧は神と呼んでもよいほどのものだ
	CASE IS >= ランク閾値:ランク_その他:ランク_A
		PRINTFORML 巧みな技術は、誰が相手でも骨抜きにしてしまうほどだ
	CASE IS >= ランク閾値:ランク_その他:ランク_B
		PRINTFORML そこらの娼婦にも劣らない技術を身につけている
	CASE IS >= ランク閾値:ランク_その他:ランク_C
		PRINTFORML 性技がだいぶ身についてきたようだ
ENDSELECT

;-------------------------------------------------
;性知識
;-------------------------------------------------
@SHOW_INFO_ERO_DESCRIPTION_14(対象, 数値)
#DIM 対象
#DIM 数値
SELECTCASE 数値
	CASE IS >= ランク閾値:ランク_性知識:ランク_S
		PRINTFORML 性の世界の知識を極めている
	CASE IS >= ランク閾値:ランク_性知識:ランク_A
		PRINTFORML 性のことについて、ニッチな技まで知っている
	CASE IS >= ランク閾値:ランク_性知識:ランク_B
		PRINTFORML 性のことについて詳しい
	CASE IS >= ランク閾値:ランク_性知識:ランク_C
		PRINTFORML 人並みの性知識を身につけている
	CASE IS >= ランク閾値:ランク_性知識:ランク_D
		PRINTFORML 性知識はやや薄い
	CASEELSE
		PRINTFORML 性のことなどなにもわかっていない
ENDSELECT

;-------------------------------------------------
;奉仕
;-------------------------------------------------
@SHOW_INFO_ERO_DESCRIPTION_20(対象, 数値)
#DIM 対象
#DIM 数値
SELECTCASE 数値
	CASE IS >= ランク閾値:ランク_その他:ランク_S
		PRINTFORML 己は他者に奉仕するためにあると考えているほどだ
	CASE IS >= ランク閾値:ランク_その他:ランク_A
		PRINTFORML 他人への奉仕を何にも代えがたい悦びと考えている
	CASE IS >= ランク閾値:ランク_その他:ランク_B
		PRINTFORML 他人への奉仕が気に入っている
	CASE IS >= ランク閾値:ランク_その他:ランク_C
		PRINTFORML 他人への奉仕に快感を覚えている
ENDSELECT

;-------------------------------------------------
;性交
;-------------------------------------------------
@SHOW_INFO_ERO_DESCRIPTION_21(対象, 数値)
#DIM 対象
#DIM 数値
SELECTCASE 数値
	CASE IS >= ランク閾値:ランク_その他:ランク_S
		PRINTFORML 性交なしでは生きていられない
	CASE IS >= ランク閾値:ランク_その他:ランク_A
		PRINTFORML 四六時中、性交のことを考えている
	CASE IS >= ランク閾値:ランク_その他:ランク_B
		PRINTFORML 性交の快楽に溺れつつある
	CASE IS >= ランク閾値:ランク_その他:ランク_C
		PRINTFORML 性交の快感を受け入れている
ENDSELECT

;-------------------------------------------------
;レズ
;-------------------------------------------------
@SHOW_INFO_ERO_DESCRIPTION_22(対象, 数値)
#DIM 対象
#DIM 数値
SIF IS_MALE(対象)
	RETURN 0
SELECTCASE 数値
	CASE IS >= ランク閾値:ランク_その他:ランク_S
		PRINTFORML 女体の味を知り尽くしている
	CASE IS >= ランク閾値:ランク_その他:ランク_A
		PRINTFORML 同性と交わりたいと積極的に考えている
	CASE IS >= ランク閾値:ランク_その他:ランク_B
		PRINTFORML 同性との交わりに溺れつつある
	CASE IS >= ランク閾値:ランク_その他:ランク_C
		PRINTFORML 同性との行為を受け入れている
ENDSELECT

;-------------------------------------------------
;ＢＬ
;-------------------------------------------------
@SHOW_INFO_ERO_DESCRIPTION_23(対象, 数値)
#DIM 対象
#DIM 数値
SIF IS_FEMALE(対象)
	RETURN 0
SELECTCASE 数値
	CASE IS >= ランク閾値:ランク_その他:ランク_S
		PRINTFORML 男体の味を知り尽くしている
	CASE IS >= ランク閾値:ランク_その他:ランク_A
		PRINTFORML 同性と交わりたいと積極的に考えている
	CASE IS >= ランク閾値:ランク_その他:ランク_B
		PRINTFORML 同性との交わりに溺れつつある
	CASE IS >= ランク閾値:ランク_その他:ランク_C
		PRINTFORML 同性との行為を受け入れている
ENDSELECT

;-------------------------------------------------
;露出
;-------------------------------------------------
@SHOW_INFO_ERO_DESCRIPTION_24(対象, 数値)
#DIM 対象
#DIM 数値
SELECTCASE 数値
	CASE IS >= ランク閾値:ランク_その他:ランク_S
		PRINTFORML 痴態を見られることを至上の悦びとしている
	CASE IS >= ランク閾値:ランク_その他:ランク_A
		PRINTFORML 他人に己の痴態を見せたいと積極的に考えている
	CASE IS >= ランク閾値:ランク_その他:ランク_B
		PRINTFORML 己の痴態を晒す悦びに溺れつつある
	CASE IS >= ランク閾値:ランク_その他:ランク_C
		PRINTFORML 露出の快感を受け入れている
ENDSELECT

;-------------------------------------------------
;自慰
;-------------------------------------------------
@SHOW_INFO_ERO_DESCRIPTION_25(対象, 数値)
#DIM 対象
#DIM 数値
SELECTCASE 数値
	CASE IS >= ランク閾値:ランク_その他:ランク_S
		PRINTFORML 常に自らの体をまさぐっていないと生きていられない
	CASE IS >= ランク閾値:ランク_その他:ランク_A
		PRINTFORML 自慰をしていないと落ち着かないほどだ
	CASE IS >= ランク閾値:ランク_その他:ランク_B
		PRINTFORML 自慰の快感に溺れつつある
	CASE IS >= ランク閾値:ランク_その他:ランク_C
		PRINTFORML 自慰の快感を受け入れている
ENDSELECT

;-------------------------------------------------
;精愛
;-------------------------------------------------
@SHOW_INFO_ERO_DESCRIPTION_26(対象, 数値)
#DIM 対象
#DIM 数値
SELECTCASE 数値
	CASE IS >= ランク閾値:ランク_その他:ランク_S
		PRINTFORML 精液なしでは生きていられない
	CASE IS >= ランク閾値:ランク_その他:ランク_A
		PRINTFORML 立派な精液中毒だ
	CASE IS >= ランク閾値:ランク_その他:ランク_B
		PRINTFORML 精液のもたらす快感に溺れつつある
	CASE IS >= ランク閾値:ランク_その他:ランク_C
		PRINTFORML 精液に抵抗がなくなっている
ENDSELECT

;-------------------------------------------------
;射精
;-------------------------------------------------
@SHOW_INFO_ERO_DESCRIPTION_27(対象, 数値)
#DIM 対象
#DIM 数値
SIF !HAS_PENIS(対象)
	RETURN
SELECTCASE 数値
	CASE IS >= ランク閾値:ランク_その他:ランク_S
		PRINTFORML 射精の快感に頭をやられ、射精欲が思考を埋め尽くしている
	CASE IS >= ランク閾値:ランク_その他:ランク_A
		PRINTFORML 射精することを至上の喜びとしている
	CASE IS >= ランク閾値:ランク_その他:ランク_B
		PRINTFORML 射精の快感におぼれつつある
	CASE IS >= ランク閾値:ランク_その他:ランク_C
		PRINTFORML 射精の快感を受け入れている
ENDSELECT

;-------------------------------------------------
;噴乳
;-------------------------------------------------
@SHOW_INFO_ERO_DESCRIPTION_28(対象, 数値)
#DIM 対象
#DIM 数値
SELECTCASE 数値
	CASE IS >= ランク閾値:ランク_その他:ランク_S
		PRINTFORML 乳房は壊れた蛇口のように母乳を垂れ流している
	CASE IS >= ランク閾値:ランク_その他:ランク_A
		PRINTFORML たっぷりとミルクをたたえた乳房は、わずかな刺激で母乳を零す
	CASE IS >= ランク閾値:ランク_その他:ランク_B
		PRINTFORML 母乳を分泌する際の快感におぼれつつある
	CASE IS >= ランク閾値:ランク_その他:ランク_C
		PRINTFORML 母乳を分泌する快感を受け入れている
ENDSELECT

;-------------------------------------------------
;排泄
;-------------------------------------------------
@SHOW_INFO_ERO_DESCRIPTION_29(対象, 数値)
#DIM 対象
#DIM 数値
SELECTCASE 数値
	CASE IS >= ランク閾値:ランク_その他:ランク_S
		PRINTFORML 排泄行為が性行為と同義になっている
	CASE IS >= ランク閾値:ランク_その他:ランク_A
		PRINTFORML 排泄行為をしたいと積極的に考えている
	CASE IS >= ランク閾値:ランク_その他:ランク_B
		PRINTFORML 排泄のもたらす快感におぼれつつある
	CASE IS >= ランク閾値:ランク_その他:ランク_C
		PRINTFORML 排泄行為を受け入れている
ENDSELECT

;-------------------------------------------------
;触手
;-------------------------------------------------
@SHOW_INFO_ERO_DESCRIPTION_30(対象, 数値)
#DIM 対象
#DIM 数値
SELECTCASE 数値
	CASE IS >= ランク閾値:ランク_その他:ランク_S
		PRINTFORML 触手なしでは生きていられない
	CASE IS >= ランク閾値:ランク_その他:ランク_A
		PRINTFORML 人よりも触手と交わりたいと考えてすらいる
	CASE IS >= ランク閾値:ランク_その他:ランク_B
		PRINTFORML 触手のもたらす快感におぼれつつある
	CASE IS >= ランク閾値:ランク_その他:ランク_C
		PRINTFORML 触手を受け入れている
ENDSELECT

;-------------------------------------------------
;出産
;-------------------------------------------------
@SHOW_INFO_ERO_DESCRIPTION_31(対象, 数値)
#DIM 対象
#DIM 数値
SELECTCASE 数値
	CASE IS >= ランク閾値:ランク_その他:ランク_S
		PRINTFORML 己は子を孕み産むために存在すると本気で考えている
	CASE IS >= ランク閾値:ランク_その他:ランク_A
		PRINTFORML 腹に子がいないと落ち着かないほどだ
	CASE IS >= ランク閾値:ランク_その他:ランク_B
		PRINTFORML 出産のもたらす悦びに溺れつつある
	CASE IS >= ランク閾値:ランク_その他:ランク_C
		PRINTFORML 子を孕み産むことを受け入れている
ENDSELECT

;-------------------------------------------------
;マゾ
;-------------------------------------------------
@SHOW_INFO_ERO_DESCRIPTION_33(対象, 数値)
#DIM 対象
#DIM 数値
SELECTCASE 数値
	CASE IS >= ランク閾値:ランク_その他:ランク_S
		PRINTFORML 痛みや苦しみなしには生きていられない
	CASE IS >= ランク閾値:ランク_その他:ランク_A
		PRINTFORML お仕置きされたい、罰を受けたいと積極的に考えている
	CASE IS >= ランク閾値:ランク_その他:ランク_B
		PRINTFORML 痛みを快感であるとはっきりとらえている
	CASE IS >= ランク閾値:ランク_その他:ランク_C
		PRINTFORML 痛みを受け入れている
ENDSELECT

;-------------------------------------------------
;サド
;-------------------------------------------------
@SHOW_INFO_ERO_DESCRIPTION_34(対象, 数値)
#DIM 対象
#DIM 数値
SELECTCASE 数値
	CASE IS >= ランク閾値:ランク_その他:ランク_S
		PRINTFORML 誰かを虐げることこそが生きる喜びになっている
	CASE IS >= ランク閾値:ランク_その他:ランク_A
		PRINTFORML 虐げたい、罰を与えたいと積極的に考えている
	CASE IS >= ランク閾値:ランク_その他:ランク_B
		PRINTFORML 人を嬲り虐げることに快感を見出している
	CASE IS >= ランク閾値:ランク_その他:ランク_C
		PRINTFORML 人を虐げることを受け入れている
ENDSELECT

;-------------------------------------------------
;性的嗜好
;-------------------------------------------------
@SHOW_INFO_SEXUAL_PREFERENCE_DESCRIPTION(対象)
#DIM 対象

SIF GETBIT(SEXUAL_PREFERENCE:対象:0, 性的嗜好_愛撫したい)
	PRINTFORML 誰かに愛撫したいと考えている
SIF GETBIT(SEXUAL_PREFERENCE:対象:0, 性的嗜好_奉仕したい)
	PRINTFORML 誰かに奉仕したいと考えている
SIF GETBIT(SEXUAL_PREFERENCE:対象:0, 性的嗜好_性交したい)
	PRINTFORML 誰かと性交したいと考えている
SIF GETBIT(SEXUAL_PREFERENCE:対象:0, 性的嗜好_道具を使いたい)
	PRINTFORML 誰かを性具で攻めたいと考えている
SIF GETBIT(SEXUAL_PREFERENCE:対象:0, 性的嗜好_虐げたい)
	PRINTFORML 誰かを虐げたいと考えている
SIF GETBIT(SEXUAL_PREFERENCE:対象:0, 性的嗜好_辱めたい)
	PRINTFORML 誰かを辱めたいと考えている
SIF GETBIT(SEXUAL_PREFERENCE:対象:0, 性的嗜好_触手で犯したい)
	PRINTFORML 誰かを触手で犯したいと考えている
SIF GETBIT(SEXUAL_PREFERENCE:対象:0, 性的嗜好_愛撫されたい)
	PRINTFORML 誰かに愛撫されたいと考えている
SIF GETBIT(SEXUAL_PREFERENCE:対象:0, 性的嗜好_奉仕されたい)
	PRINTFORML 誰かに奉仕されたいと考えている
SIF GETBIT(SEXUAL_PREFERENCE:対象:0, 性的嗜好_性交されたい)
	PRINTFORML 誰かに性交されたいと考えている
SIF GETBIT(SEXUAL_PREFERENCE:対象:0, 性的嗜好_道具を使われたい)
	PRINTFORML 誰かに性具で攻められたいと考えている
SIF GETBIT(SEXUAL_PREFERENCE:対象:0, 性的嗜好_虐げられたい)
	PRINTFORML 誰かに虐げられたいと考えている
SIF GETBIT(SEXUAL_PREFERENCE:対象:0, 性的嗜好_辱められたい)
	PRINTFORML 誰かに辱められたいと考えている
SIF GETBIT(SEXUAL_PREFERENCE:対象:0, 性的嗜好_触手で犯されたい)
	PRINTFORML 誰かに触手で犯されたいと考えている
SIF GETBIT(SEXUAL_PREFERENCE:対象:0, 性的嗜好_縛られたい)
	PRINTFORML 縛り上げられて犯されたい願望を秘めている
SIF GETBIT(SEXUAL_PREFERENCE:対象:0, 性的嗜好_獣と交わりたい)
	PRINTFORML 獣と交わりたい願望を秘めている
SIF GETBIT(SEXUAL_PREFERENCE:対象:0, 性的嗜好_露出したい)
	PRINTFORML 自らの肉体を衆目に晒したい願望を秘めている
SIF GETBIT(SEXUAL_PREFERENCE:対象:0, 性的嗜好_催眠をかけられたい)
	PRINTFORML 催眠をかけられ、人形のようにされたい願望を秘めている
SIF GETBIT(SEXUAL_PREFERENCE:対象:0, 性的嗜好_春を売りたい)
	PRINTFORML 見知らぬ相手に春を売りたい願望を秘めている
SIF GETBIT(SEXUAL_PREFERENCE:対象:0, 性的嗜好_撮影されたい)
	PRINTFORML 己の痴態を撮影されたい願望を秘めている
SIF GETBIT(SEXUAL_PREFERENCE:対象:0, 性的嗜好_汚されたい)
	PRINTFORML 排泄物で汚されたい願望を秘めている
SIF GETBIT(SEXUAL_PREFERENCE:対象:0, 性的嗜好_調教されたい)
	PRINTFORML 性的調教を受けたい願望を秘めている
SIF GETBIT(SEXUAL_PREFERENCE:対象:0, 性的嗜好_輪姦されたい)
	PRINTFORML 何人もの相手に輪姦されたい願望を秘めている
SIF GETBIT(SEXUAL_PREFERENCE:対象:0, 性的嗜好_妊娠したい)
	PRINTFORML 誰かの種で孕まされたい願望を秘めている
SIF GETBIT(SEXUAL_PREFERENCE:対象:0, 性的嗜好_近親相姦したい)
	PRINTFORML 血縁者と交わりたい願望を秘めている
SIF GETBIT(SEXUAL_PREFERENCE:対象:0, 性的嗜好_同性と交わりたい)
	PRINTFORML 同性と交わりたい願望を秘めている

repo_name: napo/erafl

license: unknown


code:
;-------------------------------------------------
;カテゴリータイトル
;　ARGS:0=表示するテキスト（全角３文字まで）
;-------------------------------------------------
@SMALL_TITLE(ARGS:0, ARG:1 = -1)
#DIM ARGSLEN
ARGSLEN = STRLENS(ARGS:0)
SETCOLOR カラー_シルバー
;テキスト表示に半角4マス
;左右に2スペースで総半角8マス
PRINTFORM %TOSTR_SPACE(LIMIT(6 - ARGSLEN, 0, 2))%
IF ARG:1 == -1
	PRINTFORM %ARGS:0, MAX(ARGSLEN, 4), LEFT%
ELSE
	PRINTBUTTON @"%ARGS:0, MAX(ARGSLEN, 4), LEFT%", ARG:1
ENDIF
PRINTFORM %TOSTR_SPACE(2 - ABS(MIN(6 - ARGSLEN, 0)))%
RESETCOLOR
RETURN

;-------------------------------------------------
;カテゴリータイトルに対応するインデント
;　ARG:0=1　ABLやEXPなどの間に入れるスペース
;-------------------------------------------------
@SMALL_TITLE_SPACE(ARG:0)
#FUNCTIONS
IF ARG:0 == 1
	PRINTFORM %TOSTR_SPACE(4)%
ELSE
	PRINTFORM %TOSTR_SPACE(8)%
ENDIF
RETURNF

;-------------------------------------------------
;グラデーションバー（三角矢印型・好みのユニコードに変えてください）
;　GBAR_NOW			現在値　BASE:(ARG:0):気力など
;　GBAR_MAX			最大値　MAXBASE:(ARG:0):気力など
;　GBAR_MAX_SQUARE	バーの幅（ユニコードの個数）
;　GBAR_ONCOLOR		オンの色（グラデーションは自動的にかける）
;　GBAR_OFFCOLOR	オフの色・指定不要（オフの色はそのまま表示・デフォルトで0x222222）
;　GBAR_ANGLE		色相をどちらの角度に動かすか・指定不要（0=プラス 1=マイナス デフォルト0）
;					そのままでは自然な色相にならないとき用
;-------------------------------------------------
@PRINT_GRADATIONBAR(GBAR_NOW, GBAR_MAX, GBAR_MAX_SQUARE, GBAR_ONCOLOR, GBAR_OFFCOLOR, GBAR_ANGLE)
#DIM GBAR_NOW
#DIM GBAR_MAX
#DIM GBAR_MIN
#DIM GBAR_MAX_SQUARE
#DIM GBAR_ONCOLOR
#DIM GBAR_OFFCOLOR
#DIM GBAR_ANGLE
#DIM GBAR_H
#DIM GBAR_S
#DIM GBAR_V
#DIM GBAR_ONE_SQUARE
#DIM GBAR_NOW_SQUARE

;バーの初期値調整
;最小値はデフォルトで０
GBAR_MIN = 0
GBAR_ONE_SQUARE = 0
GBAR_NOW_SQUARE = 0

IF !GBAR_OFFCOLOR
	GBAR_OFFCOLOR = 0x222222
ENDIF

;カラー初期値調整
GBAR_H = RGB_TO_H(GBAR_ONCOLOR) - (GBAR_MAX_SQUARE / 2)
GBAR_S = RGB_TO_S(GBAR_ONCOLOR) - GBAR_MAX_SQUARE * 2
GBAR_V = RGB_TO_V(GBAR_ONCOLOR)
IF GBAR_H <= 3
	GBAR_H = 359
ENDIF
IF GBAR_S <= 10
	GBAR_S = 10
ENDIF
IF GBAR_V >= 80
	GBAR_V = 80
ENDIF

;もしバーのGBAR_MAX（最大値）がBAR_MAX_SQUARE（バー幅・ユニコード個数）より小さいなら
IF GBAR_MAX < GBAR_MAX_SQUARE
	;最大値はユニコード個数で上書き
	GBAR_MAX = GBAR_MAX_SQUARE
ENDIF

;GBAR_ONE_SQUARE（ひとつのマスに色をつけるにつき、数値いくつ分増えたとみなすのか）を求める
GBAR_ONE_SQUARE = GBAR_MAX / GBAR_MAX_SQUARE

;１未満になってしまうなら１
IF GBAR_ONE_SQUARE < 1
	GBAR_ONE_SQUARE = 1
ENDIF

;GBAR_NOW（現在値）は何マス分かを求める
GBAR_NOW_SQUARE = GBAR_NOW / GBAR_ONE_SQUARE

;もし現在値が１未満なら０
IF GBAR_NOW_SQUARE < 1
	GBAR_NOW_SQUARE = 0
ENDIF

;GBAR_MAX_SQUARE（バーの幅・ユニコード個数）まで繰り返し
FOR LOCAL:0, 0, GBAR_MAX_SQUARE
	;GBAR_NOW_SQUARE（現在値のマス数）以下ならオンカラー（色付け）
	IF LOCAL:0 < GBAR_NOW_SQUARE
		SETCOLOR HSV_TO_RGB(LIMIT(GBAR_H, 0, 359), LIMIT(GBAR_S, 0, 100), LIMIT(GBAR_V, 0, 100))
		PRINTFORM %UNICODE(0x25B6)%
		;マスを表示するたびに色相・彩度・輝度を動かしてグラデーションをかける
		IF GBAR_ANGLE
			GBAR_H -= 3
			GBAR_V -= 2
			GBAR_S += 2
			IF GBAR_H <= 2
				GBAR_H = 359
			ENDIF
			IF GBAR_S >= 100
				GBAR_S = 100
			ENDIF
		ELSE
			GBAR_H += 3
			GBAR_V -= 2
			GBAR_S += 2
			IF GBAR_H >= 358
				GBAR_H = 1
			ENDIF
			IF GBAR_S >= 100
				GBAR_S = 100
			ENDIF
		ENDIF
		;GBAR_NOW_SQUARE（現在値のマス数）以上ならオフカラー（グレー）
	ELSE
		SETCOLOR GBAR_OFFCOLOR
		PRINTFORM %UNICODE(0x25B6)%
	ENDIF
NEXT
RESETCOLOR

RETURN 0

;-------------------------------------------------
;向かい合う矢印を表示するバー　グラデーションはしない
;GBAR_LEFT 左側矢印に用いる数値
;GBAR_RIGHT 右側矢印に用いる数値
;GBAR_MAX_SQUARE 合計の矢印数
;GBAR_LEFT/RIGHTCOLOR それぞれ矢印に用いる色
;-------------------------------------------------
@PRINT_VERSUSBAR(GBAR_LEFT, GBAR_RIGHT, GBAR_MAX_SQUARE, GBAR_LEFTCOLOR, GBAR_RIGHTCOLOR)
#DIM GBAR_LEFT
#DIM GBAR_RIGHT
#DIM GBAR_LEFT_SQUARE
#DIM GBAR_MAX_SQUARE
#DIM GBAR_LEFTCOLOR
#DIM GBAR_RIGHTCOLOR
#DIM GBAR_ONE_SQUARE

;両方ゼロならともに最大に
IF ALLSAMES(0, GBAR_LEFT, GBAR_RIGHT)
	GBAR_LEFT = GBAR_MAX_SQUARE
	GBAR_RIGHT = GBAR_MAX_SQUARE
ENDIF

;もし左右の値の合計が三角形合計より小さければ、GBAR_MAX_SQUAREをかけることで無理やりええかんじにする
IF GBAR_LEFT + GBAR_RIGHT < GBAR_MAX_SQUARE
	GBAR_LEFT = GBAR_LEFT * GBAR_MAX_SQUARE
	GBAR_RIGHT = GBAR_RIGHT * GBAR_MAX_SQUARE
ENDIF

;GBAR_ONE_SQUARE（ひとつのマスに色をつけるにつき、数値いくつ分増えたとみなすのか）を求める
GBAR_ONE_SQUARE = (GBAR_LEFT + GBAR_RIGHT) / GBAR_MAX_SQUARE

;１未満になってしまうなら１
IF GBAR_ONE_SQUARE < 1
	GBAR_ONE_SQUARE = 1
ENDIF

;GBAR_LEFT（現在値）は何マス分かを求める
GBAR_LEFT_SQUARE = GBAR_LEFT / GBAR_ONE_SQUARE

;もし現在値が１未満なら０
IF GBAR_LEFT_SQUARE < 1
	GBAR_LEFT_SQUARE = 0
ENDIF

;GBAR_MAX_SQUARE（バーの幅・ユニコード個数）まで繰り返し
FOR LOCAL:0, 0, GBAR_MAX_SQUARE
	;GBAR_NOW_SQUARE（現在値のマス数）以下ならオンカラー（色付け）
	IF LOCAL:0 < GBAR_LEFT_SQUARE
		SETCOLOR GBAR_LEFTCOLOR
		PRINTFORM %UNICODE(0x25B6)%
	ELSE
		SETCOLOR GBAR_RIGHTCOLOR
		PRINTFORM %UNICODE(0x25C0)%
	ENDIF
NEXT
RESETCOLOR

RETURN 0

;-------------------------------------------------
;ARG:0番のキャラの性別情報を表示（右詰め）
;ARG:1が真なら一文字表示
;ARG:2は詰め方向(FALSE = 左, TRUE = 右)
;ARG:3は詰め字数
;-------------------------------------------------
@PRINT_SEX(ARG:0, ARG:1 = 0, ARG:2 = 0, ARG:3 = 0)
LOCAL:0 = GETCOLOR()

SELECTCASE TALENT:(ARG:0):性別
	CASE 1
		SETCOLOR カラー_女
		IF IS_ANIMAL(ARG:0)
			LOCALS:1 = \@(!ARG:1) ? メス # 雌\@
		ELSE
			LOCALS:1 = \@(!ARG:1) ? 女性 # 女\@
		ENDIF
	CASE 0
		SETCOLOR カラー_男
		IF IS_ANIMAL(ARG:0)
			LOCALS:1 = \@(!ARG:1) ? オス # 雄\@
		ELSE
			LOCALS:1 = \@(!ARG:1) ? 男性 # 男\@
		ENDIF
	CASE 2
		SETCOLOR カラー_女双
		LOCALS:1 = \@(!ARG:1) ? 女性(双) # 双\@
	CASE 3
		SETCOLOR カラー_男双
		LOCALS:1 = \@(!ARG:1) ? 男性(双) # 双\@
	CASE 4
		SETCOLOR カラー_男の娘
		LOCALS:1 = \@(!ARG:1) ? 男の娘 # 男\@
	CASE 5
		SETCOLOR カラー_男の娘双
		LOCALS:1 = \@(!ARG:1) ? 男娘(双) # 双\@
	CASEELSE
		SETCOLOR カラー_性別不明
		LOCALS:1 = \@(!ARG:1) ? 不明 # ？\@
ENDSELECT

CALL SETCOLORBYSEX(ARG:0)
IF !ARG:2
	PRINTFORM %LOCALS:1, ARG:3, LEFT%
ELSE
	PRINTFORM %LOCALS:1, ARG:3, RIGHT%
ENDIF

SETCOLOR LOCAL:0

;-------------------------------------------------
;ARG:0番のキャラの性別情報を返却
;------------------------------------------------
@GET_STR_SEX(ARG:0, ARG:1 = 0)
#DIM F_COL

SELECTCASE TALENT:(ARG:0):性別
	CASE 1
		F_COL = カラー_女
		IF IS_ANIMAL(ARG:0)
			LOCALS:1 = \@(!ARG:1) ? メス # 雌\@
		ELSE
			LOCALS:1 = \@(!ARG:1) ? 女性 # 女\@
		ENDIF
	CASE 0
		F_COL = カラー_男
		IF IS_ANIMAL(ARG:0)
			LOCALS:1 = \@(!ARG:1) ? オス # 雄\@
		ELSE
			LOCALS:1 = \@(!ARG:1) ? 男性 # 男\@
		ENDIF
	CASE 2
		F_COL = カラー_女双
		LOCALS:1 = \@(!ARG:1) ? 女性(双) # 双\@
	CASE 3
		F_COL = カラー_男双
		LOCALS:1 = \@(!ARG:1) ? 男性(双) # 双\@
	CASE 4
		F_COL = カラー_男の娘
		LOCALS:1 = \@(!ARG:1) ? 男の娘 # 男\@
	CASE 5
		F_COL = カラー_男の娘双
		LOCALS:1 = \@(!ARG:1) ? 男娘(双) # 双\@
	CASEELSE
		F_COL = カラー_性別不明
		LOCALS:1 = \@(!ARG:1) ? 不明 # ？\@
ENDSELECT

;非省略表示のときのみ、ＴＳ経験がある場合は元性別の表記を追加
IF TS_IS_O(ARG:0) && ARG:1 == 0
	LOCALS:1 += " / "
	IF TS_IS_O(ARG:0, 1)
		SELECTCASE TALENT:(ARG:0):元性別
			CASE 11
				IF IS_ANIMAL(ARG:0)
					LOCALS:1 += "元メス"
				ELSE
					LOCALS:1 += "元女性"
				ENDIF
			CASE 10
				IF IS_ANIMAL(ARG:0)
					LOCALS:1 += "元オス"
				ELSE
					LOCALS:1 += "元男性"
				ENDIF
			CASE 12
				LOCALS:1 += "元女性(双)"
			CASE 13
				LOCALS:1 += "元男性(双)"
			CASE 14
				LOCALS:1 += "元男の娘"
			CASE 15
				LOCALS:1 += "元男娘(双)"
			CASEELSE
				LOCALS:1 += "元性別不明"
		ENDSELECT
	ELSE
		SELECTCASE TALENT:(ARG:0):元性別
			CASE 10, 11, 14
				LOCALS:1 += "ふたなり化"
			CASE 12, 13, 15
				LOCALS:1 += "元ふたなり"
			CASEELSE
				LOCALS:1 += "元性別不明"
		ENDSELECT
	ENDIF
ENDIF

RESULTS '= @"@C:{F_COL}@%LOCALS:1%@/C@"
RESULTS:1 '= @"%LOCALS:1%"

RETURN


code:
;-------------------------------------------------
; ARG:0番のキャラの口上編集オプション
;-------------------------------------------------
@SHOW_CHARACTER_KOJO_EDIT_MENU(ARG:0)
#DIM FIRST_LINE
#DIM KOJO_NO
#DIM ITER_I
#DIM ITER_J
#DIM パーツ分類
#DIM パーツ番号
#DIM DYNAMIC KOJO_CNT
FIRST_LINE = LINECOUNT

DRAWLINE
PRINTFORML %ANAME(ARG:0)%口上編集
DRAWLINE

;口上
CALL SINGLE_DRAWLINE("―", カラー_選択不可)
RESETCOLOR
IF !IS_UNIQUE_CHARA(ARG) || ARG == MASTER
	CALLF TAG_PRINT(@"@S:1@<口上>@/C@", 1)
	PRINTL
	IF ARG != MASTER
		KOJO_CNT = 0
		FOR KOJO_NO, 1001, 2000
			TRYCCALLFORM KOJO_DEFINE_NAME_K{KOJO_NO}
				LOCALS '= @"　@C:{CFLAG:(ARG:0):汎用口上パターン == KOJO_NO ? カラー_選択中 # カラー_白}@@B:{10000 + KOJO_NO}@[%RESULTS%]@/B@@/C@"
				CALLF TAG_PRINT(TAG_PRINT_SHAPE(@"%LOCALS%", 32, 1, 0), 4)
				KOJO_CNT ++
				SIF KOJO_CNT % 4 == 0
					PRINTL
			CATCH
			ENDCATCH
		NEXT
	ELSE
		KOJO_CNT = 0
		FOR KOJO_NO, 5000, 6000
			TRYCALLFORM KOJO_DEFINE_K{KOJO_NO}_IS_MASTER_KOJO
			IF !RESULT
				CONTINUE
			ENDIF
			TRYCCALLFORM KOJO_DEFINE_NAME_K{KOJO_NO}
				LOCALS '= @"　@C:{CFLAG:(ARG:0):汎用口上パターン == KOJO_NO ? カラー_選択中 # カラー_白}@@B:{10000 + KOJO_NO}@[%RESULTS%]@/B@@/C@"
				CALLF TAG_PRINT(TAG_PRINT_SHAPE(@"%LOCALS%", 32, 1, 0), 4)
				KOJO_CNT ++
				SIF KOJO_CNT % 4 == 0
					PRINTL
			CATCH
			ENDCATCH
		NEXT
	ENDIF
	PRINTL
	PRINTL
	CALLF TAG_PRINT(@"@B:10000@[口上を使用しない]@/B@", 5)
	PRINTL
	PRINTFORML
ENDIF
CALLF TAG_PRINT(@"@S:1@<口上設定色>@/C@")
CALLF TAG_PRINT(@"　(現在の設定色:@C:{CFLAG:(ARG:0):口上カラーコード}@%UNICODE(0x2588) * 6%@/C@)", 5)
PRINTL
CALLF TAG_PRINT(@"@B:20000@[口上色を変更する]@/B@　@B:20001@[髪色から自動設定する]@/B@", 5)
PRINTL
;ポートレイト表示
CALL DRAW_PORTRAIT((ARG:0), "[サイズ:200px][POS_Y:-200px][POS_X:6500]")
CALL SINGLE_DRAWLINE("―", カラー_選択不可)
PRINTL
PRINTBUTTON "[99] 完了", 99

REDRAW 1
ONEINPUT
CLEARLINE 1
PRINTL

IF RESULT == 99
	FLAG:能力表示モード = 0
	RETURN
ELSEIF INRANGE(RESULT, 10000, 16000)
	KOJO_NO = RESULT - 10000
	IF EXISTFUNCTION(@"KOJO_DEFINE_KOJO_INFO_K{KOJO_NO}")
		PRINTL
		DRAWLINE
		TRYCALLFORM KOJO_DEFINE_KOJO_INFO_K{KOJO_NO}(ARG:0)
		DRAWLINE
	ENDIF
	CALL ASK_YN("この口上を適用する", "変更しない")
	IF !RESULT
		CFLAG:(ARG:0):汎用口上パターン = KOJO_NO
		CALL COLOR_PRINTW(@"%ANAME(ARG:0)%の口上を変更しました", カラー_注意)
	ENDIF
ELSEIF INRANGE(RESULT, 20000, 20001)
	IF RESULT == 20000
		CALL COLOR_PICKER(CFLAG:(ARG:0):口上カラーコード)
		CFLAG:(ARG:0):口上カラーコード = RESULT
	ELSE
		CALL KOJO_SET_COLOR_FROM_HAIR_COLOR(ARG:0)
	ENDIF
ENDIF

REDRAW 0
CLEARLINE LINECOUNT - FIRST_LINE
RESTART


code:
;-------------------------------------------------
; ARG:0番のキャラの口上、ポートレイト編集オプション
;-------------------------------------------------
@SHOW_CHARACTER_PORTRAIT_EDIT_MENU(ARG:0, CALL_FROM = "PORTRAIT_EDIT")
#DIMS CALL_FROM
#DIM  DYNAMIC FIRST_LINE
#DIM  DYNAMIC KOJO_NO
#DIM  DYNAMIC ITER_I
#DIM  DYNAMIC ITER_J
#DIM  DYNAMIC パーツ分類
#DIM  DYNAMIC パーツ番号
#DIM  DYNAMIC COL
#DIM  DYNAMIC ROW
#DIM  CONST THUMB_SIZE = 75
#DIM  CONST MAX_COL_THUMB = 16
#DIMS DYNAMIC INPUT_VALUES
#DIM  DYNAMIC PRESET_IDX
#DIMS DIC_FACE_EXPRESSION = "[目:通常][眉:通常][口:通常]"
#DIMS CONST EXPRESSION_PARTS = "目", "眉", "口", "OVL_表情", "OVL_表情2", "OVL_表情3", "OVL_漫符", "OVL_漫符2"
#DIM EXPRESSION_PARTS_IDX, 8
#DIM DYNAMIC EXPRESSION_PARTS_NUM, 8
#DIMS DYNAMIC TEMP_ARRAY_EXPRESSION_PARTS, 100
#DIMS DYNAMIC LIST_OFFSET

FIRST_LINE = LINECOUNT
PRESET_IDX = CLOTH_DRAWER_SELECT_PRESET

SIF PARTS_OFFSET_VALUE == 0
	PARTS_OFFSET_VALUE = 1

FOR LOCAL, 0, VARSIZE("EXPRESSION_PARTS")
	EXPRESSION_PARTS_NUM:LOCAL = VARSIZE(@"IMG_%EXPRESSION_PARTS:LOCAL%_パターン")
NEXT

CALL RESET_FACE_SPRITE(ARG:0)
CALL HO_SET_PORTRAIT_SPRITE(ARG:0)

IF CALL_FROM == "PORTRAIT_EDIT"
	CLOTH_DRAWER_SELECT_PRESET = 0
	PRESET_IDX = CLOTH_DRAWER_SELECT_PRESET

	IF CSTR:(ARG:0):キャラ顔グラ == ""
		CSTR:(ARG:0):キャラ顔グラ '= "FACE_DUMMY"
	ENDIF

	DRAWLINE
	PRINTFORML %ANAME(ARG:0)%のポートレイト編集
	DRAWLINE

	;顔グラの編集
	IF !IS_UNIQUE_CHARA(ARG) || ARG:0 == MASTER
		CALLF TAG_PRINT(@"@S:1@<ポートレイト>@/S@", 1)
		PRINTFORM 表示の有無:
		CALL PRINT_SELECT_BUTTON(@"[表示しない] ", 3000, CSTR:(ARG:0):キャラ顔グラ == "FACE_DUMMY")
		CALL PRINT_SELECT_BUTTON(@"[表示する]", 3001, CSTR:(ARG:0):キャラ顔グラ != "FACE_DUMMY")
		PRINTL
		PRINTL
		CALLF TAG_PRINT(@"@S:1@<ポートレイトの表示タイプ>@/S@", 1)
		CALL PRINT_SELECT_BUTTON(@"[パーツ生成] ", 4000, CFLAG:(ARG:0):ポートレイト画像タイプ == 0)
		;CALL PRINT_SELECT_BUTTON(@"[表情差分] ", 4001, CFLAG:(ARG:0):ポートレイト画像タイプ == 1)
		;PRINTFORM [表情差分(未実装)]
		CALL PRINT_SELECT_BUTTON(@"[固定画像] ", 4002, CFLAG:(ARG:0):ポートレイト画像タイプ == 2)
	ENDIF
	PRINTL
	CALL DRAW_LINE()
ENDIF

IF CFLAG:(ARG:0):ポートレイト画像タイプ == 0 && CSTR:(ARG:0):キャラ顔グラ != "FACE_DUMMY"
	CALLF TAG_PRINT(@"@S:1@<編集パーツカテゴリ>@/S@", 1)
	IF (!IS_UNIQUE_CHARA(ARG:0) || ARG:0 == MASTER) && CALL_FROM == "PORTRAIT_EDIT"
		{
			LOCALS '= ""
				+ @"@C:{PORTRAIT_EDIT_MODE == PORTRAIT_EDIT_MODE_顔 ? カラー_選択中 # カラー_白}@@B:[MODE:{PORTRAIT_EDIT_MODE_顔}]@[顔]　@/B@@/C@"
				+ @"@C:{PORTRAIT_EDIT_MODE == PORTRAIT_EDIT_MODE_髪 ? カラー_選択中 # カラー_白}@@B:[MODE:{PORTRAIT_EDIT_MODE_髪}]@[髪]　@/B@@/C@"
		}
	ELSE
		LOCALS '= ""
		IF PORTRAIT_EDIT_MODE == PORTRAIT_EDIT_MODE_顔 || PORTRAIT_EDIT_MODE == PORTRAIT_EDIT_MODE_髪
			PORTRAIT_EDIT_MODE = PORTRAIT_EDIT_MODE_服
		ENDIF
	ENDIF
	{
		LOCALS += ""
			+ @"@C:{PORTRAIT_EDIT_MODE == PORTRAIT_EDIT_MODE_服 ? カラー_選択中 # カラー_白}@@B:[MODE:{PORTRAIT_EDIT_MODE_服}]@[服]　@/B@@/C@"
			+ @"@C:{PORTRAIT_EDIT_MODE == PORTRAIT_EDIT_MODE_帽子 ? カラー_選択中 # カラー_白}@@B:[MODE:{PORTRAIT_EDIT_MODE_帽子}]@[帽子]　@/B@@/C@"
			+ @"@C:{PORTRAIT_EDIT_MODE == PORTRAIT_EDIT_MODE_装飾 ? カラー_選択中 # カラー_白}@@B:[MODE:{PORTRAIT_EDIT_MODE_装飾}]@[装飾・首飾]　@/B@@/C@"
			+ @"@C:{PORTRAIT_EDIT_MODE == PORTRAIT_EDIT_MODE_眼鏡 ? カラー_選択中 # カラー_白}@@B:[MODE:{PORTRAIT_EDIT_MODE_眼鏡}]@[その他]　@/B@@/C@"
			+ @"@C:{PORTRAIT_EDIT_MODE == PORTRAIT_EDIT_MODE_位置調整 ? カラー_選択中 # カラー_白}@@B:[MODE:{PORTRAIT_EDIT_MODE_位置調整}]@[位置調整・入出力]　@/B@@/C@"
	}
	CALLF TAG_PRINT(LOCALS, 1)
	PRINTL
	SELECTCASE PORTRAIT_EDIT_MODE
		CASE PORTRAIT_EDIT_MODE_顔
			PRINTFORM < 輪郭 >
			CALL PORTRAIT_EDIT_DRAW_THUMBS(ARG:0, "顔")
			PRINTFORM < 身体 >
			CALL PORTRAIT_EDIT_DRAW_THUMBS(ARG:0, "身体")
			PRINTFORM <  目  >
			CALL PORTRAIT_EDIT_DRAW_THUMBS_FACE(ARG:0, "目")
			PRINTFORM <  眉  >
			CALL PORTRAIT_EDIT_DRAW_THUMBS_FACE(ARG:0, "眉")
			PRINTFORM <  鼻  >
			CALL PORTRAIT_EDIT_DRAW_THUMBS_FACE(ARG:0, "鼻")
			PRINTFORM <  口  >
			CALL PORTRAIT_EDIT_DRAW_THUMBS_FACE(ARG:0, "口")
			PRINTFORM <頭部位>
			CALL PORTRAIT_EDIT_DRAW_THUMBS_OUTFIT(ARG:0, "頭部位")
			IF CALL_FROM == "PORTRAIT_EDIT"
				PRINTFORML 表情テスト(デバッグコンソールからコピペ可)
				FOR LOCAL, 0, VARSIZE("EXPRESSION_PARTS")
					ARRAYCOPY @"IMG_%EXPRESSION_PARTS:LOCAL%_パターン", "TEMP_ARRAY_EXPRESSION_PARTS"
					LOCALS '= ""
					LOCALS += @"@B:[PREV_PARTS:%TOSTR(LOCAL)%]@[◀]@/B@"
					LOCALS += @"@B:[NEXT_PARTS:%TOSTR(LOCAL)%]@[▶]@/B@"
					LOCALS += @"%EXPRESSION_PARTS:LOCAL%: "
					LOCALS += TEMP_ARRAY_EXPRESSION_PARTS:(EXPRESSION_PARTS_IDX:LOCAL)
					CALLF TAG_PRINT(TAG_PRINT_SHAPE(LOCALS, 30, 1))
					SIF LOCAL != 0 && (LOCAL + 1) % 4 == 0
						PRINTL
				NEXT
				PRINTL
			ENDIF
		CASE PORTRAIT_EDIT_MODE_髪
			PRINTFORM < 前髪 >
			CALL PORTRAIT_EDIT_DRAW_THUMBS(ARG:0, "前髪")
			PRINTFORM < 後髪 >
			CALL PORTRAIT_EDIT_DRAW_THUMBS(ARG:0, "後髪")
			PRINTFORM < ｴｸｽﾃ >
			CALL PORTRAIT_EDIT_DRAW_THUMBS(ARG:0, "エクステ")
			PRINTFORM < ｲﾝﾅｰ >
			CALL PORTRAIT_EDIT_DRAW_THUMBS(ARG:0, "インナーヘア")
		CASE PORTRAIT_EDIT_MODE_服
			PRINTFORM < 衣服 >
			CALL PORTRAIT_EDIT_DRAW_THUMBS_OUTFIT(ARG:0, "服", CALL_FROM)
		CASE PORTRAIT_EDIT_MODE_帽子
			PRINTFORM < 帽子 >
			CALL PORTRAIT_EDIT_DRAW_THUMBS_OUTFIT(ARG:0, "帽子", CALL_FROM)
		CASE PORTRAIT_EDIT_MODE_装飾
			PRINTFORM < 装飾 >
			CALL PORTRAIT_EDIT_DRAW_THUMBS_OUTFIT(ARG:0, "アクセサリ1", CALL_FROM)
			PRINTFORM < 首飾 >
			CALL PORTRAIT_EDIT_DRAW_THUMBS_OUTFIT(ARG:0, "首飾", CALL_FROM)
		CASE PORTRAIT_EDIT_MODE_眼鏡
			PRINTFORM < 眼鏡 >
			CALL PORTRAIT_EDIT_DRAW_THUMBS_OUTFIT(ARG:0, "眼鏡", CALL_FROM)
			PRINTFORM < ﾏｽｸ1 >
			CALL PORTRAIT_EDIT_DRAW_THUMBS_OUTFIT(ARG:0, "マスク1", CALL_FROM)
			PRINTFORM < ﾏｽｸ2 >
			CALL PORTRAIT_EDIT_DRAW_THUMBS_OUTFIT(ARG:0, "マスク2", CALL_FROM)
			PRINTFORM < 化粧 >
			CALL PORTRAIT_EDIT_DRAW_THUMBS_OUTFIT(ARG:0, "化粧", CALL_FROM)
			PRINTFORM < 背面 >
			CALL PORTRAIT_EDIT_DRAW_THUMBS_OUTFIT(ARG:0, "背面", CALL_FROM)
		CASE PORTRAIT_EDIT_MODE_位置調整
			CALL PORTRAIT_EDIT_DRAW_PARTS_OFFSET(ARG:0, CALL_FROM)
	ENDSELECT
	SIF PORTRAIT_EDIT_MODE != PORTRAIT_EDIT_MODE_位置調整
		CALLF TAG_PRINT(@"@S:1@<カラー変更>@/S@", 1)
	SELECTCASE PORTRAIT_EDIT_MODE
		CASE PORTRAIT_EDIT_MODE_顔
			PRINTBUTTON "[肌の色]  ", 2000
			PRINTBUTTON "[瞳の色]  ", 2002
			CALLF TAG_PRINT(@"  @C:{カラー_注釈}@※目のパターン0番は色変更非対応@/C@", 1)
			PRINTBUTTON "[眉の色]  ", 2003
			PRINTBUTTON "[鼻の色]  ", 2004
			PRINTBUTTON "[頭部位の色]  ", 2012
		CASE PORTRAIT_EDIT_MODE_髪
			PRINTBUTTON "[髪の色]  ", 2001
			PRINTBUTTON "[エクステの色]  ", 2020
			PRINTBUTTON "[インナーヘアの色]  ", 2021
		CASE PORTRAIT_EDIT_MODE_服
			PRINTBUTTON "[衣服の色]  ", 2010
		CASE PORTRAIT_EDIT_MODE_帽子
			PRINTBUTTON "[帽子の色]  ", 2011
		CASE PORTRAIT_EDIT_MODE_装飾
			PRINTBUTTON "[装飾の色]  ", 2013
			PRINTBUTTON "[首飾の色]  ", 2016
		CASE PORTRAIT_EDIT_MODE_眼鏡
			PRINTBUTTON "[眼鏡の色]  ", 2014
			PRINTBUTTON "[マスク1の色]  ", 2017
			PRINTBUTTON "[マスク2の色]  ", 2018
			PRINTBUTTON "[化粧の色]  ", 2015
			PRINTBUTTON "[背面の色]  ", 2019
	ENDSELECT
	PRINTL
ELSEIF CFLAG:(ARG:0):ポートレイト画像タイプ == 2 && (!IS_UNIQUE_CHARA(ARG) || (ARG == MASTER))
	PRINTL
	PRINTFORML 現在のポートレイト名:%CSTR:(ARG:0):キャラ顔グラ%
	CALLF TAG_PRINT(@"@B:{4010}@[画像からポートレイトを適用する]@/B@", 5)
	PRINTL
	PRINTL
	PRINTL
	PRINTL
	PRINTL
ENDIF
;ポートレイト表示
CALL DRAW_PORTRAIT((ARG:0), @"[サイズ:200px][POS_Y:-200px][POS_X:7200]%DIC_FACE_EXPRESSION%", "PORTRAIT_EDIT")
SIF CALL_FROM == "PORTRAIT_EDIT"
	DEBUGPRINTFORML @DRAW_PORTRAIT用文字列: %DIC_FACE_EXPRESSION%

IF CALL_FROM == "PORTRAIT_EDIT" && PORTRAIT_EDIT_MODE == PORTRAIT_EDIT_MODE_位置調整
	;その他
	CALL SINGLE_DRAWLINE("―", カラー_選択不可)
	CALLF TAG_PRINT(@"@S:1@<その他>", 1)
	IF TALENT:(ARG:0):カスタムキャラ
		PRINTL
		PRINTBUTTON "[カスタムキャラ登録情報のポートレイト・口上設定を適用]  ", 5000
		PRINTL
	ENDIF
	PRINTL
	PRINTBUTTON "[キャラクターCSV用にパーツ情報を出力]  ", 5001
	PRINTL
	PRINTBUTTON "[キャラクターCSV用にキャラ情報とパーツ情報を出力]  ", 5002
	PRINTL
ELSE
	IF CALL_FROM == "CLOTH_DRAWER" && PRESET_IDX != 0
		CALL SINGLE_DRAWLINE("―", カラー_選択不可)
		CALLF TAG_PRINT("@B:[COPY:1]@[デフォルトのポートレイト設定をコピー]@/B@", 1)
	ENDIF
ENDIF
CALL SINGLE_DRAWLINE("―", カラー_選択不可)
PRINTL
PRINTBUTTON "[99] 完了", 99

REDRAW 1
ONEINPUTS
CLEARLINE 1
PRINTL

;顔グラ 輪郭
IF ISNUMERIC(RESULTS)
	RESULT = TOINT(RESULTS)
	IF RESULT == 99
		FLAG:能力表示モード = 0
		RETURN
	ELSEIF INRANGE(RESULT, 2000, 2021)
		LOCAL = RESULT
		CLEARLINE 1
		CALL SINGLE_DRAWLINE()
		SELECTCASE LOCAL
			CASE 2000
				CALL EDIT_PORTRAIT_PARTS_COLOR(ARG:0, "SKIN", PRESET_IDX)
			CASE 2001
				CALL EDIT_PORTRAIT_PARTS_COLOR(ARG:0, "HAIR", PRESET_IDX)
			CASE 2020
				CALL EDIT_PORTRAIT_PARTS_COLOR(ARG:0, "HAIR_EX", PRESET_IDX)
			CASE 2021
				CALL EDIT_PORTRAIT_PARTS_COLOR(ARG:0, "HAIR_INNER", PRESET_IDX)
			CASE 2002
				CALL EDIT_PORTRAIT_PARTS_COLOR(ARG:0, "EYE", PRESET_IDX)
			CASE 2003
				CALL EDIT_PORTRAIT_PARTS_COLOR(ARG:0, "BROW", PRESET_IDX)
			CASE 2004
				CALL EDIT_PORTRAIT_PARTS_COLOR(ARG:0, "NOSE", PRESET_IDX)
			CASE 2010
				CALL EDIT_PORTRAIT_PARTS_COLOR(ARG:0, "CLOTH", PRESET_IDX)
			CASE 2011
				CALL EDIT_PORTRAIT_PARTS_COLOR(ARG:0, "HAT", PRESET_IDX)
			CASE 2012
				CALL EDIT_PORTRAIT_PARTS_COLOR(ARG:0, "HEADSUBPARTS", PRESET_IDX)
			CASE 2013
				CALL EDIT_PORTRAIT_PARTS_COLOR(ARG:0, "ACCESSORY1", PRESET_IDX)
			CASE 2014
				CALL EDIT_PORTRAIT_PARTS_COLOR(ARG:0, "GLASSES", PRESET_IDX)
			CASE 2015
				CALL EDIT_PORTRAIT_PARTS_COLOR(ARG:0, "MAKEUP", PRESET_IDX)
			CASE 2016
				CALL EDIT_PORTRAIT_PARTS_COLOR(ARG:0, "NECKLACE", PRESET_IDX)
			CASE 2017
				CALL EDIT_PORTRAIT_PARTS_COLOR(ARG:0, "MASK1", PRESET_IDX)
			CASE 2018
				CALL EDIT_PORTRAIT_PARTS_COLOR(ARG:0, "MASK2", PRESET_IDX)
			CASE 2019
				CALL EDIT_PORTRAIT_PARTS_COLOR(ARG:0, "BACK", PRESET_IDX)
		ENDSELECT
	ELSEIF INRANGE(RESULT, 3000, 3001)
		LOCAL = RESULT
		CLEARLINE 1
		CALL SINGLE_DRAWLINE()
		SELECTCASE LOCAL
			CASE 3000
				VARSET FACE_PARTS:(ARG:0):0
				CSTR:(ARG:0):キャラ顔グラ '= "FACE_DUMMY"
			CASE 3001
				CALL RANDOM_CHARA_CREATE_PORTRAIT(ARG:0)
		ENDSELECT
	ELSEIF INRANGE(RESULT, 4000, 4002)
		CFLAG:(ARG:0):ポートレイト画像タイプ = RESULT - 4000
	ELSEIF RESULT == 4010
		CALL EDIT_PORTRAIT_SELECT_FIXED_PORTRAIT_IMAGE(ARG:0)
	ELSEIF RESULT == 5000
		CALL COPY_PORTRAIT_BY_REGISTED_CUSTOM(ARG:0)
	ELSEIF RESULT == 5001
		CALL EDIT_PORTRAIT_EXPORT_FACE_PARTS_INFO_TO_TXT(ARG:0)
	ELSEIF RESULT == 5002
		CALL EDIT_EXPORT_CHARA_INFO_TO_TXT(ARG:0)
	ENDIF
ELSE
	INPUT_VALUES = %RESULTS%
	IF DIC_CONTAINSKEY(INPUT_VALUES, "MODE")
		PORTRAIT_EDIT_MODE = DIC_GETINT(INPUT_VALUES, "MODE")
	ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "顔")
		FACE_PARTS:(ARG:0):IMG_顔 '= @"CC1_顔_{DIC_GETINT(INPUT_VALUES, "顔")}"
	ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "身体")
		FACE_PARTS:(ARG:0):IMG_身体 '= @"CC1_身体_{DIC_GETINT(INPUT_VALUES, "身体")}"
	ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "目")
		FACE_PARTS:(ARG:0):IMG_目 '= @"CC1_目_{DIC_GETINT(INPUT_VALUES, "目")}"
		FACE_PARTS:(ARG:0):IMG_瞳 '= @"CC1_瞳_{DIC_GETINT(INPUT_VALUES, "瞳")}"
	ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "眉")
		FACE_PARTS:(ARG:0):IMG_眉 '= @"CC1_眉_{DIC_GETINT(INPUT_VALUES, "眉")}"
	ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "鼻")
		FACE_PARTS:(ARG:0):IMG_鼻 '= @"CC1_鼻_{DIC_GETINT(INPUT_VALUES, "鼻")}"
	ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "口")
		FACE_PARTS:(ARG:0):IMG_口 '= @"CC1_口_{DIC_GETINT(INPUT_VALUES, "口")}"
	ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "前髪")
		FACE_PARTS:(ARG:0):IMG_前髪 '= @"CC1_前髪_{DIC_GETINT(INPUT_VALUES, "前髪")}"
	ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "後髪")
		FACE_PARTS:(ARG:0):IMG_後髪 '= @"CC1_後髪_{DIC_GETINT(INPUT_VALUES, "後髪")}"
	ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "エクステ")
		;エクステは着脱可
		IF FACE_PARTS:(ARG:0):IMG_エクステ != @"CC1_エクステ_{DIC_GETINT(INPUT_VALUES, "エクステ")}"
			FACE_PARTS:(ARG:0):IMG_エクステ '= @"CC1_エクステ_{DIC_GETINT(INPUT_VALUES, "エクステ")}"
		ELSE
			FACE_PARTS:(ARG:0):IMG_エクステ '= ""
		ENDIF
	ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "インナーヘア")
		;インナーヘアは着脱可
		IF FACE_PARTS:(ARG:0):IMG_インナーヘア != @"CC1_インナーヘア_{DIC_GETINT(INPUT_VALUES, "インナーヘア")}"
			FACE_PARTS:(ARG:0):IMG_インナーヘア '= @"CC1_インナーヘア_{DIC_GETINT(INPUT_VALUES, "インナーヘア")}"
		ELSE
			FACE_PARTS:(ARG:0):IMG_インナーヘア '= ""
		ENDIF
	ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "服")
		CALL PORTRAIT_EDIT_SET_OUTFIT_PARTS(ARG:0, "服", DIC_GET(INPUT_VALUES, "服"), CALL_FROM)
	ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "帽子")
		CALL PORTRAIT_EDIT_SET_OUTFIT_PARTS(ARG:0, "帽子", DIC_GET(INPUT_VALUES, "帽子"), CALL_FROM)
	ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "頭部位")
		CALL PORTRAIT_EDIT_SET_OUTFIT_PARTS(ARG:0, "頭部位", DIC_GET(INPUT_VALUES, "頭部位"), CALL_FROM)
	ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "アクセサリ1")
		CALL PORTRAIT_EDIT_SET_OUTFIT_PARTS(ARG:0, "アクセサリ1", DIC_GET(INPUT_VALUES, "アクセサリ1"), CALL_FROM)
	ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "首飾")
		CALL PORTRAIT_EDIT_SET_OUTFIT_PARTS(ARG:0, "首飾", DIC_GET(INPUT_VALUES, "首飾"), CALL_FROM)
	ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "眼鏡")
		CALL PORTRAIT_EDIT_SET_OUTFIT_PARTS(ARG:0, "眼鏡", DIC_GET(INPUT_VALUES, "眼鏡"), CALL_FROM)
	ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "マスク1")
		CALL PORTRAIT_EDIT_SET_OUTFIT_PARTS(ARG:0, "マスク1", DIC_GET(INPUT_VALUES, "マスク1"), CALL_FROM)
	ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "マスク2")
		CALL PORTRAIT_EDIT_SET_OUTFIT_PARTS(ARG:0, "マスク2", DIC_GET(INPUT_VALUES, "マスク2"), CALL_FROM)
	ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "化粧")
		CALL PORTRAIT_EDIT_SET_OUTFIT_PARTS(ARG:0, "化粧", DIC_GET(INPUT_VALUES, "化粧"), CALL_FROM)
	ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "背面")
		CALL PORTRAIT_EDIT_SET_OUTFIT_PARTS(ARG:0, "背面", DIC_GET(INPUT_VALUES, "背面"), CALL_FROM)
	ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "COPY")
		PRINTFORML 現在のポートレイト設定にデフォルトのポートレイトの設定を上書きします。よろしいですか？
		CALL ASK_YN
		IF !RESULT
			CALL PORTRAIT_EDIT_COPY_PRESET(ARG:0, 0, PRESET_IDX)
		ENDIF
	ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "PREV_PARTS")
		LOCAL = DIC_GETINT(INPUT_VALUES, "PREV_PARTS")
		EXPRESSION_PARTS_IDX:LOCAL --
		SIF EXPRESSION_PARTS_IDX:LOCAL < 0
			EXPRESSION_PARTS_IDX:LOCAL = EXPRESSION_PARTS_NUM:LOCAL - 1
		ARRAYCOPY @"IMG_%EXPRESSION_PARTS:LOCAL%_パターン", "TEMP_ARRAY_EXPRESSION_PARTS"
		DIC_FACE_EXPRESSION = %DIC_SET(DIC_FACE_EXPRESSION, EXPRESSION_PARTS:LOCAL,TEMP_ARRAY_EXPRESSION_PARTS:(EXPRESSION_PARTS_IDX:LOCAL))%

	ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "NEXT_PARTS")
		LOCAL = DIC_GETINT(INPUT_VALUES, "NEXT_PARTS")
		EXPRESSION_PARTS_IDX:LOCAL ++
		SIF EXPRESSION_PARTS_IDX:LOCAL == EXPRESSION_PARTS_NUM:LOCAL
			EXPRESSION_PARTS_IDX:LOCAL = 0
		ARRAYCOPY @"IMG_%EXPRESSION_PARTS:LOCAL%_パターン", "TEMP_ARRAY_EXPRESSION_PARTS"
		DIC_FACE_EXPRESSION = %DIC_SET(DIC_FACE_EXPRESSION, EXPRESSION_PARTS:LOCAL,TEMP_ARRAY_EXPRESSION_PARTS:(EXPRESSION_PARTS_IDX:LOCAL))%

	ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "OFFSET_VALUE")
		PARTS_OFFSET_VALUE = DIC_GETINT(INPUT_VALUES, "OFFSET_VALUE")
	ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "PARTS_OFFSET_RESET")
		LOCAL = DIC_GETINT(INPUT_VALUES, "PARTS_OFFSET_RESET")
		CALL PORTRAIT_EDIT_SET_PARTS_OFFSET("FACE_PARTS_OFFSET_X", ARG:0, LOCAL, 0, CALL_FROM)
		CALL PORTRAIT_EDIT_SET_PARTS_OFFSET("FACE_PARTS_OFFSET_Y", ARG:0, LOCAL, 0, CALL_FROM)
		IF LOCAL == IMG_目
			CALL PORTRAIT_EDIT_SET_PARTS_OFFSET("FACE_PARTS_OFFSET_X", ARG:0, IMG_瞳, 0, CALL_FROM)
			CALL PORTRAIT_EDIT_SET_PARTS_OFFSET("FACE_PARTS_OFFSET_Y", ARG:0, IMG_瞳, 0, CALL_FROM)
		ENDIF
	ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "PARTS_SIZE_RESET")
		LOCAL = DIC_GETINT(INPUT_VALUES, "PARTS_SIZE_RESET")
		CALL PORTRAIT_EDIT_SET_PARTS_OFFSET("FACE_PARTS_SIZE_MOD_X", ARG:0, LOCAL, 0, CALL_FROM)
		CALL PORTRAIT_EDIT_SET_PARTS_OFFSET("FACE_PARTS_SIZE_MOD_Y", ARG:0, LOCAL, 0, CALL_FROM)
		IF LOCAL == IMG_目
			CALL PORTRAIT_EDIT_SET_PARTS_OFFSET("FACE_PARTS_SIZE_MOD_X", ARG:0, IMG_瞳, 0, CALL_FROM)
			CALL PORTRAIT_EDIT_SET_PARTS_OFFSET("FACE_PARTS_SIZE_MOD_Y", ARG:0, IMG_瞳, 0, CALL_FROM)
		ENDIF
	ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "PARTS_ROTATION_RESET")
		LOCAL = DIC_GETINT(INPUT_VALUES, "PARTS_ROTATION_RESET")
		CALL PORTRAIT_EDIT_SET_PARTS_OFFSET("FACE_PARTS_ROTATION", ARG:0, LOCAL, 0, CALL_FROM)
		IF LOCAL == IMG_目
			CALL PORTRAIT_EDIT_SET_PARTS_OFFSET("FACE_PARTS_ROTATION", ARG:0, IMG_瞳, 0, CALL_FROM)
		ENDIF
	ENDIF

	IF DIC_CONTAINSKEY(INPUT_VALUES, "PARTS_OFFSET_X")
		LIST_OFFSET = %DIC_GET(INPUT_VALUES, "PARTS_OFFSET_X")%
		LOCAL = LIST_GETINT(LIST_OFFSET, 0)
		CALL PORTRAIT_EDIT_ADD_PARTS_OFFSET("FACE_PARTS_OFFSET_X", ARG:0, LOCAL, LIST_GETINT(LIST_OFFSET, 1), CALL_FROM)
		SIF LOCAL == IMG_目
			CALL PORTRAIT_EDIT_ADD_PARTS_OFFSET("FACE_PARTS_OFFSET_X", ARG:0, IMG_瞳, LIST_GETINT(LIST_OFFSET, 1), CALL_FROM)
	ENDIF

	IF DIC_CONTAINSKEY(INPUT_VALUES, "PARTS_OFFSET_Y")
		LIST_OFFSET = %DIC_GET(INPUT_VALUES, "PARTS_OFFSET_Y")%
		LOCAL = LIST_GETINT(LIST_OFFSET, 0)
		CALL PORTRAIT_EDIT_ADD_PARTS_OFFSET("FACE_PARTS_OFFSET_Y", ARG:0, LOCAL, LIST_GETINT(LIST_OFFSET, 1), CALL_FROM)
		SIF LOCAL == IMG_目
			CALL PORTRAIT_EDIT_ADD_PARTS_OFFSET("FACE_PARTS_OFFSET_Y", ARG:0, IMG_瞳, LIST_GETINT(LIST_OFFSET, 1), CALL_FROM)
	ENDIF

	IF DIC_CONTAINSKEY(INPUT_VALUES, "PARTS_SIZE_X")
		LIST_OFFSET = %DIC_GET(INPUT_VALUES, "PARTS_SIZE_X")%
		LOCAL = LIST_GETINT(LIST_OFFSET, 0)
		CALL PORTRAIT_EDIT_ADD_PARTS_OFFSET("FACE_PARTS_SIZE_MOD_X", ARG:0, LOCAL, LIST_GETINT(LIST_OFFSET, 1), CALL_FROM)
		SIF LOCAL == IMG_目
			CALL PORTRAIT_EDIT_ADD_PARTS_OFFSET("FACE_PARTS_SIZE_MOD_X", ARG:0, IMG_瞳, LIST_GETINT(LIST_OFFSET, 1), CALL_FROM)
	ENDIF

	IF DIC_CONTAINSKEY(INPUT_VALUES, "PARTS_SIZE_Y")
		LIST_OFFSET = %DIC_GET(INPUT_VALUES, "PARTS_SIZE_Y")%
		LOCAL = LIST_GETINT(LIST_OFFSET, 0)
		CALL PORTRAIT_EDIT_ADD_PARTS_OFFSET("FACE_PARTS_SIZE_MOD_Y", ARG:0, LOCAL, LIST_GETINT(LIST_OFFSET, 1), CALL_FROM)
		SIF LOCAL == IMG_目
			CALL PORTRAIT_EDIT_ADD_PARTS_OFFSET("FACE_PARTS_SIZE_MOD_Y", ARG:0, IMG_瞳, LIST_GETINT(LIST_OFFSET, 1), CALL_FROM)
	ENDIF

	IF DIC_CONTAINSKEY(INPUT_VALUES, "PARTS_ROTATION")
		LIST_OFFSET = %DIC_GET(INPUT_VALUES, "PARTS_ROTATION")%
		LOCAL = LIST_GETINT(LIST_OFFSET, 0)
		CALL PORTRAIT_EDIT_ADD_PARTS_OFFSET("FACE_PARTS_ROTATION", ARG:0, LOCAL, LIST_GETINT(LIST_OFFSET, 1), CALL_FROM)
		IF LOCAL == IMG_目
			CALL PORTRAIT_EDIT_ADD_PARTS_OFFSET("FACE_PARTS_ROTATION", ARG:0, IMG_瞳, LIST_GETINT(LIST_OFFSET, 1), CALL_FROM)
		ENDIF
	ENDIF
ENDIF

REDRAW 0
CLEARLINE LINECOUNT - FIRST_LINE
RESTART

@EDIT_PORTRAIT_EXPORT_FACE_PARTS_INFO_TO_TXT(CHARA_ID)
#DIM CHARA_ID
#DIMS DYNAMIC OUTPUT

PRINTFORML "sav/parts_info.txt"に現在このキャラクターに設定されているパーツ情報を出力します
PRINTFORML キャラクターCSVに貼り付けることでユニークキャラのポートレイトとして使用できます
PRINTL
PRINTFORML 同名のファイルがすでに存在する場合上書きされます。よろしいですか？
PRINTL

CALL ASK_YN()
IF RESULT == 1
	RETURN 0
ENDIF

OUTPUT += @";[ポートレイトパーツ情報]CharaN_キャラ名.csvに貼り付けて使用" + "\n"

CALL EDIT_PORTRAIT_EXPORT_FACE_PARTS_INFO_TO_TXT_MAIN(CHARA_ID)
OUTPUT += RESULTS

SAVETEXT OUTPUT, "sav/parts_info.txt"
PRINTFORMW "sav/parts_info.txt"にポートレイトパーツ情報を出力しました

@EDIT_PORTRAIT_EXPORT_FACE_PARTS_INFO_TO_TXT_MAIN(CHARA_ID)
#DIM CHARA_ID
#DIM CONST CSTR_IDX_START = CSTR_PORTRAIT_IMG_IDX
#DIMS DYNAMIC OUTPUT
#DIMS DYNAMIC STRINGS
#DIM DYNAMIC MIXER, 3, 3
#DIMS CONST MIXER_NAME = "R", "G", "B"
#DIM DYNAMIC ITER_I
#DIM DYNAMIC ITER_J

VARSET RESULTS

FOR LOCAL, 0, FACE_LAYERNUM
	SIF FACE_PARTS:CHARA_ID:LOCAL == ""
		CONTINUE
	OUTPUT += @"CSTR,{CSTR_IDX_START + LOCAL},%FACE_PARTS:CHARA_ID:LOCAL%" + "\n"
NEXT
;パーツ色情報
FOR LOCAL, 0, FACE_LAYERNUM
	SIF FACE_PARTS:CHARA_ID:LOCAL == ""
		CONTINUE
	IF COLOR_MATRIX_NAME:CHARA_ID:LOCAL == "カスタム"
		OUTPUT += @"CSTR,{CSTR_IDX_START + FACE_LAYERNUM + LOCAL},{COLOR_MATRIX_RGB:CHARA_ID:LOCAL:0}:{COLOR_MATRIX_RGB:CHARA_ID:LOCAL:1}:{COLOR_MATRIX_RGB:CHARA_ID:LOCAL:2}" + "\n"
	ELSEIF COLOR_MATRIX_NAME:CHARA_ID:LOCAL == "ミキサー"
		OUTPUT += @"CSTR,{CSTR_IDX_START + FACE_LAYERNUM + LOCAL},"
		FOR ITER_I, 0, 3
			FOR ITER_J, 0, 3
				SIF ITER_J > 0
					OUTPUT += ":"
				MIXER:ITER_I:ITER_J = GETVAR(@"COLOR_MIXER_%MIXER_NAME:ITER_J%_{ITER_I}:{CHARA_ID}:{LOCAL}:0")
				OUTPUT += @"%TOSTR(MIXER:ITER_I:ITER_J)%"
			NEXT
			OUTPUT += "#"
		NEXT
		OUTPUT += "\n"
	ELSE
		OUTPUT += @"CSTR,{CSTR_IDX_START + FACE_LAYERNUM + LOCAL},%COLOR_MATRIX_NAME:CHARA_ID:LOCAL%" + "\n"
	ENDIF
NEXT
;位置情報
FOR LOCAL, 0, FACE_LAYERNUM
	LOCALS '= ""
	SIF FACE_PARTS_OFFSET_X:CHARA_ID:LOCAL != 0
		LOCALS += @"[FACE_PARTS_OFFSET_X:{FACE_PARTS_OFFSET_X:CHARA_ID:LOCAL}]"
	SIF FACE_PARTS_OFFSET_Y:CHARA_ID:LOCAL != 0
		LOCALS += @"[FACE_PARTS_OFFSET_Y:{FACE_PARTS_OFFSET_Y:CHARA_ID:LOCAL}]"
	SIF FACE_PARTS_SIZE_MOD_X:CHARA_ID:LOCAL != 0
		LOCALS += @"[FACE_PARTS_SIZE_MOD_X:{FACE_PARTS_SIZE_MOD_X:CHARA_ID:LOCAL}]"
	SIF FACE_PARTS_SIZE_MOD_Y:CHARA_ID:LOCAL != 0
		LOCALS += @"[FACE_PARTS_SIZE_MOD_Y:{FACE_PARTS_SIZE_MOD_Y:CHARA_ID:LOCAL}]"
	SIF FACE_PARTS_ROTATION:CHARA_ID:LOCAL != 0
		LOCALS += @"[FACE_PARTS_ROTATION:{FACE_PARTS_ROTATION:CHARA_ID:LOCAL}]"

	SIF LOCALS != ""
		OUTPUT += @"CSTR,{CSTR_IDX_START + FACE_LAYERNUM * 2 + LOCAL},%LOCALS%" + "\n"

NEXT
RESULTS '= OUTPUT

@EDIT_EXPORT_CHARA_INFO_TO_TXT(CHARA_ID)
#DIM CHARA_ID
#DIMS DYNAMIC OUTPUT
#DIMS _LIST_CSTR_SKIP = "NAMEカナ,CALLNAMEカナ,"
#DIMS _LIST_BASE_SKIP = "妊娠補正,"
#DIMS _MAP_BASE_OPTION
#DIMS _LIST_ABL_SKIP = "攻撃力,防御力,軽減値,行動力,敵視,隠蔽性,脅威選定,"
#DIMS _LIST_TALENT_SKIP = "カスタムキャラ,髪色,髪の長さ,特殊勢力陥落系,デイリー系,"
#DIMS _MAP_TALENT_OPTION
#DIM CONST CSTR_CHARA_CSV_END = 300
#DIM CONST CSTR_CLOTH_START = 100

#DIMS TMP_CSTR, VARSIZE("CSTR")
#DIMS TMP_CSTRNAME, VARSIZE("CSTRNAME")
#DIM  TMP_BASE, VARSIZE("BASE")
#DIMS TMP_BASENAME, VARSIZE("BASENAME")
#DIM  TMP_ABL, VARSIZE("ABL")
#DIMS TMP_ABLNAME, VARSIZE("ABLNAME")
#DIM  TMP_TALENT, VARSIZE("TALENT")
#DIMS TMP_TALENTNAME, VARSIZE("TALENTNAME")
#DIM  TMP_EXP, VARSIZE("EXP")
#DIMS TMP_EXPNAME, VARSIZE("EXPNAME")

SIF !HAS_PENIS(CHARA_ID)
	_LIST_BASE_SKIP '= LIST_ADD(_LIST_BASE_SKIP, "ペニス")

;CSV読み込みに小数点以下は読み込まれないためコメントアウト
; _MAP_BASE_OPTION '= DIC_SET(_MAP_BASE_OPTION, "身長", "DECIMAL_1")
; _MAP_BASE_OPTION '= DIC_SET(_MAP_BASE_OPTION, "体重", "DECIMAL_1")
; _MAP_BASE_OPTION '= DIC_SET(_MAP_BASE_OPTION, "バスト", "DECIMAL_1")
; _MAP_BASE_OPTION '= DIC_SET(_MAP_BASE_OPTION, "ウェスト", "DECIMAL_1")
; _MAP_BASE_OPTION '= DIC_SET(_MAP_BASE_OPTION, "ヒップ", "DECIMAL_1")
; _MAP_BASE_OPTION '= DIC_SET(_MAP_BASE_OPTION, "ペニス", "DECIMAL_1")
;これいる？
_MAP_TALENT_OPTION '= DIC_SET(_MAP_TALENT_OPTION, "淫乱系", "BINARY")
;_MAP_TALENT_OPTION '= DIC_SET(_MAP_TALENT_OPTION, "特殊勢力陥落系", "BINARY")
;_MAP_TALENT_OPTION '= DIC_SET(_MAP_TALENT_OPTION, "デイリー系", "BINARY")

PRINTFORML "sav/chara_info.txt"に現在このキャラクターに設定されているキャラ情報を出力します
PRINTFORML キャラクターCSVに貼り付けることでユニークキャラのキャラ情報として使用できます
PRINTL
PRINTFORML 同名のファイルがすでに存在する場合上書きされます。よろしいですか？
PRINTL

CALL ASK_YN()
IF RESULT == 1
	RETURN 0
ENDIF

FOR LOCAL, 0, VARSIZE("CSTR")
	TMP_CSTR:LOCAL '= CSTR:CHARA_ID:LOCAL
	TMP_CSTRNAME:LOCAL '= CSTRNAME:LOCAL
NEXT
FOR LOCAL, 0, VARSIZE("BASE")
	TMP_BASE:LOCAL = BASE:CHARA_ID:LOCAL
	TMP_BASENAME:LOCAL '= BASENAME:LOCAL
NEXT
FOR LOCAL, 0, VARSIZE("ABL")
	TMP_ABL:LOCAL = ABL:CHARA_ID:LOCAL
	TMP_ABLNAME:LOCAL '= ABLNAME:LOCAL
NEXT
FOR LOCAL, 0, VARSIZE("TALENT")
	TMP_TALENT:LOCAL = TALENT:CHARA_ID:LOCAL
	TMP_TALENTNAME:LOCAL '= TALENTNAME:LOCAL
NEXT
FOR LOCAL, 0, VARSIZE("EXP")
	TMP_EXP:LOCAL = EXP:CHARA_ID:LOCAL
	TMP_EXPNAME:LOCAL '= EXPNAME:LOCAL
NEXT

PRINTFORML ユニークキャラ識別名(CSTR:99)を指定できます
CALL ASK_MULTI("キャラ名を使用", "入力", "空欄")
SELECTCASE RESULT
	CASE 0
		TMP_CSTR:99 '= NAME:CHARA_ID
	CASE 1
		INPUTS
		TMP_CSTR:99 '= RESULTS
	CASEELSE
		TMP_CSTR:99 '= ""
ENDSELECT

OUTPUT += @";[キャラ情報]CharaN_キャラ名.csvに貼り付けて使用" + "\n"
OUTPUT += @"番号,N," + "\n"
OUTPUT += @"名前,%NAME:CHARA_ID%," + "\n"
OUTPUT += @"呼び名,%CALLNAME:CHARA_ID%," + "\n"

CALL EDIT_EXPORT_CHARA_INFO_TO_TXT_SUB_S("CSTR", TMP_CSTR, TMP_CSTRNAME, 0, CSTR_CHARA_CSV_END, _LIST_CSTR_SKIP)
OUTPUT += RESULTS + "\n"
CALL EDIT_EXPORT_CHARA_INFO_TO_TXT_SUB("基礎", TMP_BASE, TMP_BASENAME, , ,_LIST_BASE_SKIP, _MAP_BASE_OPTION)
OUTPUT += RESULTS + "\n"
CALL EDIT_EXPORT_CHARA_INFO_TO_TXT_SUB("能力", TMP_ABL, TMP_ABLNAME, , ,_LIST_ABL_SKIP)
OUTPUT += RESULTS + "\n"
CALL EDIT_EXPORT_CHARA_INFO_TO_TXT_SUB("素質", TMP_TALENT, TMP_TALENTNAME, , ,_LIST_TALENT_SKIP, _MAP_TALENT_OPTION)
OUTPUT += RESULTS + "\n"
CALL EDIT_EXPORT_CHARA_INFO_TO_TXT_SUB("経験", TMP_EXP, TMP_EXPNAME)
OUTPUT += RESULTS + "\n"

;CFLAG
SIF CFLAG:CHARA_ID:好感度 != 0
	OUTPUT += @"CFLAG,好感度,{CFLAG:CHARA_ID:好感度}," + "\n"
SIF CFLAG:CHARA_ID:依存度 != 0
	OUTPUT += @"CFLAG,依存度,{CFLAG:CHARA_ID:依存度}," + "\n"
SIF CFLAG:CHARA_ID:従属度 != 0
	OUTPUT += @"CFLAG,従属度,{CFLAG:CHARA_ID:従属度}," + "\n"
SIF CFLAG:CHARA_ID:支配度 != 0
	OUTPUT += @"CFLAG,支配度,{CFLAG:CHARA_ID:支配度}," + "\n"
OUTPUT += @"CFLAG,口上カラーコード,0x%TOSTR(CFLAG:CHARA_ID:口上カラーコード, "X6")%," + "\n\n"
;衣装
OUTPUT += @";初期設定の衣装情報。衣装部位_頭～衣装部位_アクセサリと対応" + "\n"
FOR LOCAL, 0, VARSIZE("CLOTH_PART_NAME")
	SIF LOCAL == 衣装部位_武器
		CONTINUE
	CALL GET_CLOTH_NAME(LOCAL, CLOTH:CHARA_ID:LOCAL)
	OUTPUT += @"CSTR,{CSTR_CLOTH_START + LOCAL},%RESULTS%,;%CLOTH_PART_NAME:LOCAL%" + "\n"
NEXT
OUTPUT += "\n"

;ポートレート
OUTPUT += @";[ポートレイトパーツ情報]" + "\n"
CALL EDIT_PORTRAIT_EXPORT_FACE_PARTS_INFO_TO_TXT_MAIN(CHARA_ID)
OUTPUT += RESULTS

SAVETEXT OUTPUT, @"sav/chara_info_%NAME:CHARA_ID%.txt"
PRINTFORMW "sav/chara_info_%NAME:CHARA_ID%.txt"にキャラ情報を出力しました

@EDIT_EXPORT_CHARA_INFO_TO_TXT_SUB_S(CSV_NAME, VALUE_ARRAY, NAME_ARRAY, SCAN_START = 0, SCAN_END = -1, _LIST_SKIP = "")
#DIMS DYNAMIC OUTPUT
#DIMS CSV_NAME
#DIMS REF VALUE_ARRAY, 0
#DIMS REF NAME_ARRAY, 0
#DIMS _LIST_SKIP
#DIM SCAN_START
#DIM SCAN_END

SIF SCAN_END < 0
	SCAN_END = VARSIZE("VALUE_ARRAY")

FOR LOCAL, SCAN_START, SCAN_END
	SIF NAME_ARRAY:LOCAL == "" || VALUE_ARRAY:LOCAL == ""
		CONTINUE
	SIF LIST_INDEXOF(_LIST_SKIP, NAME_ARRAY:LOCAL) != -1
		CONTINUE
	OUTPUT += @"%CSV_NAME%,%NAME_ARRAY:LOCAL%,%VALUE_ARRAY:LOCAL%," + "\n"
NEXT
RESULTS '= OUTPUT

@EDIT_EXPORT_CHARA_INFO_TO_TXT_SUB(CSV_NAME, VALUE_ARRAY, NAME_ARRAY, SCAN_START = 0, SCAN_END = -1, _LIST_SKIP = "", _MAP_OPTION = "")
#DIMS DYNAMIC OUTPUT
#DIMS CSV_NAME
#DIM REF VALUE_ARRAY, 0
#DIMS REF NAME_ARRAY, 0
#DIMS _LIST_SKIP
#DIMS _MAP_OPTION
#DIM SCAN_START
#DIM SCAN_END

SIF SCAN_END < 0
	SCAN_END = VARSIZE("VALUE_ARRAY")

FOR LOCAL, SCAN_START, SCAN_END
	SIF NAME_ARRAY:LOCAL == "" || VALUE_ARRAY:LOCAL == 0
		CONTINUE
	SIF LIST_INDEXOF(_LIST_SKIP, NAME_ARRAY:LOCAL) != -1
		CONTINUE
	IF DIC_CONTAINSKEY(_MAP_OPTION, NAME_ARRAY:LOCAL)
		TRYCALLFORM EDIT_EXPORT_CHARA_INFO_TO_TXT_OPTION_%DIC_GET(_MAP_OPTION, NAME_ARRAY:LOCAL)%(VALUE_ARRAY:LOCAL)
		OUTPUT += @"%CSV_NAME%,%NAME_ARRAY:LOCAL%,%RESULTS%," + "\n"
	ELSE
		OUTPUT += @"%CSV_NAME%,%NAME_ARRAY:LOCAL%,{VALUE_ARRAY:LOCAL}," + "\n"
	ENDIF
NEXT
RESULTS '= OUTPUT

@EDIT_EXPORT_CHARA_INFO_TO_TXT_OPTION_DECIMAL_1(VALUE)
#DIM VALUE
RESULTS '= DECIMAL_STRING(VALUE, 1)

@EDIT_EXPORT_CHARA_INFO_TO_TXT_OPTION_BINARY(VALUE)
#DIM VALUE
RESULTS '= "0b" + TOSTR(VALUE, "B64")

@COPY_PORTRAIT_BY_REGISTED_CUSTOM(CHARA_ID)
#DIM CHARA_ID
#DIM DYNAMIC DATA_NUMBER
#DIM DYNAMIC TMP_CHARA
#DIM DYNAMIC ITER_I
#DIM DYNAMIC ITER_J

PRINTFORML カスタムキャラ登録情報のポートレイト・口上を適用しますか？
PRINTFORML ※現在の設定は上書きされます
PRINTBUTTON "0[はい]　", 0
PRINTBUTTON "9[いいえ]", 9
INPUT 9

IF RESULT == 0
	; 登録情報から名前が一致するキャラを探し、該当するならポートレイト情報をコピーする
	FOR ITER_I, 0, MAX_CUSTOM_CHARA
		DATA_NUMBER = ITER_I
		IF FIND_CHARADATA(TOSTR(DATA_NUMBER))
			CALL LOAD_CUSTOM_DATA(DATA_NUMBER)
			TMP_CHARA = CHARANUM - 1
			IF CSTR:CHARA_ID:0 == CSTR:(TMP_CHARA):0 && CSTR:CHARA_ID:1 == CSTR:(TMP_CHARA):1 && CSTR:CHARA_ID:2 == CSTR:(TMP_CHARA):2
				CSTR:CHARA_ID:キャラ顔グラ = %CSTR:(TMP_CHARA):キャラ顔グラ%
				CFLAG:CHARA_ID:ポートレイト画像タイプ = CFLAG:(TMP_CHARA):ポートレイト画像タイプ
				FOR ITER_J, 0, FACE_LAYERNUM
					FACE_PARTS:CHARA_ID:ITER_J = %FACE_PARTS:TMP_CHARA:ITER_J%
				NEXT
				FOR ITER_J, 0, FACE_LAYERNUM
					COLOR_MATRIX_NAME:CHARA_ID:ITER_J = %COLOR_MATRIX_NAME:TMP_CHARA:ITER_J%
				NEXT
				CFLAG:CHARA_ID:汎用口上パターン       = CFLAG:TMP_CHARA:汎用口上パターン
				CFLAG:CHARA_ID:口上カラーコード       = CFLAG:TMP_CHARA:口上カラーコード
				LOCAL:0 = MAX_CUSTOM_CHARA
			ENDIF
			CALL DELETE_CHARA(TMP_CHARA)
		ENDIF
	NEXT
ENDIF

RETURN

;;;ボタン付きサムネイル表示
@PORTRAIT_EDIT_DRAW_THUMBS(CHARA_ID, PARTS_NAME)
#DIM  CHARA_ID
#DIMS PARTS_NAME
#DIM  DYNAMIC COL
#DIM  DYNAMIC ROW
#DIMS DYNAMIC SPRITE_NAME
#DIMS DYNAMIC BORDER
#DIM  CONST THUMB_SIZE = 80
#DIM  CONST MAX_COL_THUMB = 10

FOR LOCAL, 0, GETVAR(@"IMG_%PARTS_NAME%パーツ数")
	IF GETVARS(@"FACE_PARTS:{CHARA_ID}:IMG_%PARTS_NAME%") == @"CC1_%PARTS_NAME%_{LOCAL}"
		BORDER '= @"border ='2px' bcolor='#%CVH(カラー_選択中)%'"
	ELSE
		BORDER '= @"border ='1px' bcolor='#%CVH(カラー_白)%'"
	ENDIF
	{
		LOCALS '=
			@"<div %BORDER% rect = '{COL * THUMB_SIZE}px,{ROW * THUMB_SIZE}px,{THUMB_SIZE}px,{THUMB_SIZE}px'>"
			+ @"<button value = '[%PARTS_NAME%:{LOCAL}]' title = 'CC1_%PARTS_NAME%_{LOCAL}'>"
			+ @"<img src = 'CC1_%PARTS_NAME%_{LOCAL}' width = '{THUMB_SIZE}px' height = '{THUMB_SIZE}px'>"
			+ "</button>"
			+ "</div>"
	}
	HTML_PRINT LOCALS, 1
	IF COL == MAX_COL_THUMB - 1
		ROW ++
		COL = 0
	ELSE
		COL ++
	ENDIF
NEXT
CALL PX_NEWLINE(THUMB_SIZE * (ROW + 1))
PRINTL

@PORTRAIT_EDIT_DRAW_THUMBS_FACE(CHARA_ID, PARTS_NAME)
#DIM  CHARA_ID
#DIMS PARTS_NAME
#DIM  DYNAMIC COL
#DIM  DYNAMIC ROW
#DIMS DYNAMIC SPRITE_NAME
#DIMS DYNAMIC BORDER
#DIM  CONST THUMB_SIZE = 80
#DIM  CONST MAX_COL_THUMB = 10

FOR LOCAL, 0, GETVAR(@"IMG_%PARTS_NAME%パーツ数")
	IF GETVARS(@"FACE_PARTS:{CHARA_ID}:IMG_%PARTS_NAME%") == @"CC1_%PARTS_NAME%_{LOCAL}"
		BORDER '= @"border ='2px' bcolor='#%CVH(カラー_選択中)%'"
	ELSE
		BORDER '= @"border ='1px' bcolor='#%CVH(カラー_白)%'"
	ENDIF
	{
		LOCALS '=
			@"<div rect = '{COL * THUMB_SIZE}px,{ROW * THUMB_SIZE}px,{THUMB_SIZE}px,{THUMB_SIZE}px'>"
			+ @"<img src = 'CC1_顔_0' width = '{THUMB_SIZE}px' height = '{THUMB_SIZE}px'>"
			+ "</div>"
	}
	;瞳は例外的に番号が1から始まるので
	IF PARTS_NAME == "目" && LOCAL > 0
		{
			LOCALS +=
				@"<div rect = '{COL * THUMB_SIZE}px,{ROW * THUMB_SIZE}px,{THUMB_SIZE}px,{THUMB_SIZE}px'>"
				+ @"<img src = 'CC1_瞳_{LOCAL}_通常' width = '{THUMB_SIZE}px' height = '{THUMB_SIZE}px'>"
				+ "</div>"
		}
	ENDIF
	IF PARTS_NAME == "鼻"
		{
			LOCALS +=
				@"<div %BORDER% rect = '{COL * THUMB_SIZE}px,{ROW * THUMB_SIZE}px,{THUMB_SIZE}px,{THUMB_SIZE}px'>"
				+ @"<button value = '[%PARTS_NAME%:{LOCAL}]' title = 'CC1_%PARTS_NAME%_{LOCAL}'>"
				+ @"<img src = 'CC1_%PARTS_NAME%_{LOCAL}' width = '{THUMB_SIZE}px' height = '{THUMB_SIZE}px'>"
				+ "</button>"
				+ "</div>"
		}
	ELSE
		{
			LOCALS +=
				@"<div %BORDER% rect = '{COL * THUMB_SIZE}px,{ROW * THUMB_SIZE}px,{THUMB_SIZE}px,{THUMB_SIZE}px'>"
				+ @"<button value = '[%PARTS_NAME%:{LOCAL}]' title = 'CC1_%PARTS_NAME%_{LOCAL}'>"
				+ @"<img src = 'CC1_%PARTS_NAME%_{LOCAL}_通常' width = '{THUMB_SIZE}px' height = '{THUMB_SIZE}px'>"
				+ "</button>"
				+ "</div>"
		}
	ENDIF

	HTML_PRINT LOCALS, 1
	IF COL == MAX_COL_THUMB - 1
		ROW ++
		COL = 0
	ELSE
		COL ++
	ENDIF
NEXT
CALL PX_NEWLINE(THUMB_SIZE * (ROW + 1))
PRINTL

@PORTRAIT_EDIT_DRAW_THUMBS_OUTFIT(CHARA_ID, PARTS_NAME, CALL_FROM)
#DIM  CHARA_ID
#DIMS PARTS_NAME
#DIMS CALL_FROM
#DIMS DYNAMIC PARTS_SUBNAME
#DIM  DYNAMIC COL
#DIM  DYNAMIC ROW
#DIMS DYNAMIC SPRITE_NAME
#DIMS DYNAMIC BORDER
#DIM  DYNAMIC PRESET_IDX
#DIM  CONST THUMB_SIZE = 80
#DIM  CONST MAX_COL_THUMB = 10
#DIM  ITER_I
#DIM  ITER_J

IF CALL_FROM == "CLOTH_DRAWER"
	PRESET_IDX = CLOTH_DRAWER_SELECT_PRESET
ENDIF

FOR ITER_I, 0, VARSIZE(@"IMG_%PARTS_NAME%_パーツ名")
	PARTS_SUBNAME '= GETVARS(@"IMG_%PARTS_NAME%_パーツ名:{ITER_I}")
	FOR ITER_J, 0, GETVAR(@"IMG_%PARTS_NAME%_パターン数:{ITER_I}")
		{
			IF (PRESET_IDX == 0 && GETVARS(@"FACE_PARTS:{CHARA_ID}:IMG_%PARTS_NAME%") == @"CC1_%PARTS_NAME%_%PARTS_SUBNAME%_{ITER_J}")
				|| (PRESET_IDX != 0 && GETVARS(@"FACE_PARTS_PRESET:{CHARA_ID}:IMG_%PARTS_NAME%:{PRESET_IDX}") == @"CC1_%PARTS_NAME%_%PARTS_SUBNAME%_{ITER_J}")
		}
			BORDER '= @"border ='2px' bcolor='#%CVH(カラー_選択中)%'"
		ELSE
			BORDER '= @"border ='1px' bcolor='#%CVH(カラー_白)%'"
		ENDIF
		{
			LOCALS '=
				@"<div %BORDER% rect = '{COL * THUMB_SIZE}px,{ROW * THUMB_SIZE}px,{THUMB_SIZE}px,{THUMB_SIZE}px'>"
				+ @"<button value = '[%PARTS_NAME%:%PARTS_SUBNAME%_{ITER_J}]' title = 'CC1_%PARTS_NAME%_%PARTS_SUBNAME%_{ITER_J}'>"
				+ @"<img src = 'CC1_%PARTS_NAME%_%PARTS_SUBNAME%_{ITER_J}' width = '{THUMB_SIZE}px' height = '{THUMB_SIZE}px'>"
				+ "</button>"
				+ "</div>"
		}
		HTML_PRINT LOCALS, 1
		IF COL == MAX_COL_THUMB - 1
			ROW ++
			COL = 0
		ELSE
			COL ++
		ENDIF
	NEXT
NEXT
CALL PX_NEWLINE(THUMB_SIZE * (ROW + 1))
PRINTL

@PORTRAIT_EDIT_SET_OUTFIT_PARTS(CHARA_ID, PARTS_NAME, PARTS_SUBNAME, CALL_FROM)
#DIM  CHARA_ID
#DIMS PARTS_NAME
#DIMS PARTS_SUBNAME
#DIMS CALL_FROM
#DIM  DYNAMIC PRESET_IDX

IF CALL_FROM == "PORTRAIT_EDIT"
	IF GETVARS(@"FACE_PARTS:{CHARA_ID}:IMG_%PARTS_NAME%") != @"CC1_%PARTS_NAME%_%PARTS_SUBNAME%"
		SETVAR @"FACE_PARTS:{CHARA_ID}:IMG_%PARTS_NAME%", @"CC1_%PARTS_NAME%_%PARTS_SUBNAME%"
	ELSE
		SETVAR @"FACE_PARTS:{CHARA_ID}:IMG_%PARTS_NAME%", ""
	ENDIF
ELSEIF CALL_FROM == "CLOTH_DRAWER"
	PRESET_IDX = CLOTH_DRAWER_SELECT_PRESET
	IF GETVARS(@"FACE_PARTS_PRESET:{CHARA_ID}:IMG_%PARTS_NAME%:{PRESET_IDX}") != @"CC1_%PARTS_NAME%_%PARTS_SUBNAME%"
		SETVAR @"FACE_PARTS_PRESET:{CHARA_ID}:IMG_%PARTS_NAME%:{PRESET_IDX}", @"CC1_%PARTS_NAME%_%PARTS_SUBNAME%"
	ELSE
		SETVAR @"FACE_PARTS_PRESET:{CHARA_ID}:IMG_%PARTS_NAME%:{PRESET_IDX}", ""
	ENDIF
	IF PRESET_IDX == 0
		SETVAR @"FACE_PARTS:{CHARA_ID}:IMG_%PARTS_NAME%", @"CC1_%PARTS_NAME%_%PARTS_SUBNAME%"
	ENDIF
ENDIF

@PORTRAIT_EDIT_COPY_PRESET(CHARA_ID, FROM_ID, TO_ID)
#DIM  CHARA_ID
#DIM  FROM_ID
#DIM  TO_ID
#DIM  DYNAMIC ITER_I
#DIM  DYNAMIC ITER_J

FOR ITER_I, 0, FACE_LAYERNUM
	IF FROM_ID == 0
		;衣装情報
		FACE_PARTS_PRESET:CHARA_ID:ITER_I:TO_ID = %FACE_PARTS:CHARA_ID:ITER_I%
		;カラーマトリックスプリセット情報
		COLOR_MATRIX_NAME_PRESET:CHARA_ID:ITER_I:TO_ID = %COLOR_MATRIX_NAME:CHARA_ID:ITER_I%
		;カスタムの色設定情報
		COLOR_MATRIX_RGB_PRESET_R:CHARA_ID:ITER_I:TO_ID = COLOR_MATRIX_RGB:CHARA_ID:ITER_I:0
		COLOR_MATRIX_RGB_PRESET_G:CHARA_ID:ITER_I:TO_ID = COLOR_MATRIX_RGB:CHARA_ID:ITER_I:1
		COLOR_MATRIX_RGB_PRESET_B:CHARA_ID:ITER_I:TO_ID = COLOR_MATRIX_RGB:CHARA_ID:ITER_I:2
		;オフセット情報
		FACE_PARTS_OFFSET_X_PRESET:CHARA_ID:ITER_I:TO_ID = FACE_PARTS_OFFSET_X:CHARA_ID:ITER_I
		FACE_PARTS_OFFSET_Y_PRESET:CHARA_ID:ITER_I:TO_ID = FACE_PARTS_OFFSET_Y:CHARA_ID:ITER_I
		FACE_PARTS_SIZE_MOD_X_PRESET:CHARA_ID:ITER_I:TO_ID = FACE_PARTS_SIZE_MOD_X:CHARA_ID:ITER_I
		FACE_PARTS_SIZE_MOD_Y_PRESET:CHARA_ID:ITER_I:TO_ID = FACE_PARTS_SIZE_MOD_Y:CHARA_ID:ITER_I
		FACE_PARTS_ROTATION_PRESET:CHARA_ID:ITER_I:TO_ID = FACE_PARTS_ROTATION:CHARA_ID:ITER_I
	ELSE
		;衣装情報
		FACE_PARTS_PRESET:CHARA_ID:ITER_I:TO_ID = %FACE_PARTS_PRESET:CHARA_ID:ITER_I:FROM_ID%
		;カラーマトリックスプリセット情報
		COLOR_MATRIX_NAME_PRESET:CHARA_ID:ITER_I:TO_ID = %COLOR_MATRIX_NAME_PRESET:CHARA_ID:ITER_I:FROM_ID%
		;カスタムの色設定情報
		COLOR_MATRIX_RGB_PRESET_R:CHARA_ID:ITER_I:TO_ID = COLOR_MATRIX_RGB_PRESET_R:CHARA_ID:ITER_I:FROM_ID
		COLOR_MATRIX_RGB_PRESET_G:CHARA_ID:ITER_I:TO_ID = COLOR_MATRIX_RGB_PRESET_G:CHARA_ID:ITER_I:FROM_ID
		COLOR_MATRIX_RGB_PRESET_B:CHARA_ID:ITER_I:TO_ID = COLOR_MATRIX_RGB_PRESET_B:CHARA_ID:ITER_I:FROM_ID
		;オフセット情報
		FACE_PARTS_OFFSET_X_PRESET:CHARA_ID:ITER_I:TO_ID = FACE_PARTS_OFFSET_X_PRESET:CHARA_ID:ITER_I:FROM_ID
		FACE_PARTS_OFFSET_Y_PRESET:CHARA_ID:ITER_I:TO_ID = FACE_PARTS_OFFSET_Y_PRESET:CHARA_ID:ITER_I:FROM_ID
		FACE_PARTS_SIZE_MOD_X_PRESET:CHARA_ID:ITER_I:TO_ID = FACE_PARTS_SIZE_MOD_X_PRESET:CHARA_ID:ITER_I:FROM_ID
		FACE_PARTS_SIZE_MOD_Y_PRESET:CHARA_ID:ITER_I:TO_ID = FACE_PARTS_SIZE_MOD_Y_PRESET:CHARA_ID:ITER_I:FROM_ID
		FACE_PARTS_ROTATION_PRESET:CHARA_ID:ITER_I:TO_ID = FACE_PARTS_ROTATION_PRESET:CHARA_ID:ITER_I:FROM_ID
	ENDIF
	;チャンネルミキサー情報
	COLOR_MIXER_R_0:CHARA_ID:ITER_I:TO_ID = COLOR_MIXER_R_0:CHARA_ID:ITER_I:FROM_ID
	COLOR_MIXER_R_1:CHARA_ID:ITER_I:TO_ID = COLOR_MIXER_R_1:CHARA_ID:ITER_I:FROM_ID
	COLOR_MIXER_R_2:CHARA_ID:ITER_I:TO_ID = COLOR_MIXER_R_2:CHARA_ID:ITER_I:FROM_ID
	COLOR_MIXER_G_0:CHARA_ID:ITER_I:TO_ID = COLOR_MIXER_G_0:CHARA_ID:ITER_I:FROM_ID
	COLOR_MIXER_G_1:CHARA_ID:ITER_I:TO_ID = COLOR_MIXER_G_1:CHARA_ID:ITER_I:FROM_ID
	COLOR_MIXER_G_2:CHARA_ID:ITER_I:TO_ID = COLOR_MIXER_G_2:CHARA_ID:ITER_I:FROM_ID
	COLOR_MIXER_B_0:CHARA_ID:ITER_I:TO_ID = COLOR_MIXER_B_0:CHARA_ID:ITER_I:FROM_ID
	COLOR_MIXER_B_1:CHARA_ID:ITER_I:TO_ID = COLOR_MIXER_B_1:CHARA_ID:ITER_I:FROM_ID
	COLOR_MIXER_B_2:CHARA_ID:ITER_I:TO_ID = COLOR_MIXER_B_2:CHARA_ID:ITER_I:FROM_ID
	IF TO_ID == 0
		FACE_PARTS:CHARA_ID:ITER_I = %FACE_PARTS_PRESET:CHARA_ID:ITER_I:FROM_ID%
		COLOR_MATRIX_NAME:CHARA_ID:ITER_I = %COLOR_MATRIX_NAME_PRESET:CHARA_ID:ITER_I:FROM_ID%
		COLOR_MATRIX_RGB:CHARA_ID:ITER_I:0 = COLOR_MATRIX_RGB_PRESET_R:CHARA_ID:ITER_I:FROM_ID
		COLOR_MATRIX_RGB:CHARA_ID:ITER_I:1 = COLOR_MATRIX_RGB_PRESET_G:CHARA_ID:ITER_I:FROM_ID
		COLOR_MATRIX_RGB:CHARA_ID:ITER_I:2 = COLOR_MATRIX_RGB_PRESET_B:CHARA_ID:ITER_I:FROM_ID
	ENDIF
NEXT

@PORTRAIT_EDIT_DRAW_PARTS_OFFSET(CHARA_ID, CALL_FROM)
#DIM  CHARA_ID
#DIM  LAYER_ID
#DIMS CALL_FROM
#DIM  PRESET_IDX

SIF CALL_FROM == "CLOTH_DRAWER"
	PRESET_IDX = CLOTH_DRAWER_SELECT_PRESET

LOCALS '= ""
{
	LOCALS += "変化量 "
		+ @"@C:{PARTS_OFFSET_VALUE == 1 ? カラー_選択中 # カラー_白}@@B:[OFFSET_VALUE:1]@[1] @/B@@/C@"
		+ @"@C:{PARTS_OFFSET_VALUE == 5 ? カラー_選択中 # カラー_白}@@B:[OFFSET_VALUE:5]@[5] @/B@@/C@"
		+ @"@C:{PARTS_OFFSET_VALUE == 10 ? カラー_選択中 # カラー_白}@@B:[OFFSET_VALUE:10]@[10] @/B@@/C@"
		+ @"@C:{PARTS_OFFSET_VALUE == 100 ? カラー_選択中 # カラー_白}@@B:[OFFSET_VALUE:100]@[100] @/B@@/C@"
}
CALLF TAG_PRINT(LOCALS, 1)
PRINTL
FOR LOCAL, 0, VARSIZE("IMG_PARTS_ORDER")
	LAYER_ID = IMG_PARTS_ORDER:LOCAL
	SIF FACE_LAYER:CHARA_ID:LAYER_ID == ""
		CONTINUE
	SIF LAYER_ID == IMG_瞳
		CONTINUE
	;ユニークキャラの顔はいじれない
	SIF IS_UNIQUE_CHARA(CHARA_ID) && CHARA_ID != MASTER && GROUPMATCH(LAYER_ID, IMG_顔, IMG_身体, IMG_目, IMG_眉, IMG_鼻, IMG_口, IMG_頭部位, IMG_前髪, IMG_後髪, IMG_エクステ, IMG_インナーヘア)
		CONTINUE
	;ドロワからいじれるのは服飾のみ
	SIF CALL_FROM == "CLOTH_DRAWER" && !GROUPMATCH(LAYER_ID, IMG_服, IMG_帽子, IMG_アクセサリ1, IMG_アクセサリ2, IMG_眼鏡, IMG_マスク1, IMG_マスク2, IMG_化粧, IMG_首飾)
		CONTINUE

	PRINTFORM ◆%IMG_PARTS_DISP_NAME:LAYER_ID, 14, LEFT%
	IF CALL_FROM == "CLOTH_DRAWER"
		PRINTFORM %@"位置(X={FACE_PARTS_OFFSET_X_PRESET:CHARA_ID:LAYER_ID:PRESET_IDX, 4, RIGHT}, Y={FACE_PARTS_OFFSET_Y_PRESET:CHARA_ID:LAYER_ID:PRESET_IDX, 4, RIGHT})", 30, LEFT%
	ELSE
		PRINTFORM %@"位置(X={FACE_PARTS_OFFSET_X:CHARA_ID:LAYER_ID, 4, RIGHT}, Y={FACE_PARTS_OFFSET_Y:CHARA_ID:LAYER_ID, 4, RIGHT})", 24, LEFT%
	ENDIF
	LOCALS '= ""
	LOCALS += @"@B:[PARTS_OFFSET_X:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE * -1},]@[←]@/B@"
	LOCALS += @"@B:[PARTS_OFFSET_X:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE},]@[→]@/B@"
	LOCALS += @"@B:[PARTS_OFFSET_Y:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE},]@[↓]@/B@"
	LOCALS += @"@B:[PARTS_OFFSET_Y:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE * -1},]@[↑]@/B@"
	LOCALS += @"@B:[PARTS_OFFSET_RESET:%TOSTR(LAYER_ID)%]@[RESET]@/B@"
	CALLF TAG_PRINT(TAG_PRINT_SHAPE(LOCALS, 40, 1), 1)

	PRINTFORM %"", 16, LEFT%
	IF CALL_FROM == "CLOTH_DRAWER"
		PRINTFORM %@"拡縮(X={FACE_PARTS_SIZE_MOD_X_PRESET:CHARA_ID:LAYER_ID:PRESET_IDX, 4, RIGHT}, Y={FACE_PARTS_SIZE_MOD_Y_PRESET:CHARA_ID:LAYER_ID:PRESET_IDX, 4, RIGHT})", 30, LEFT%
	ELSE
		PRINTFORM %@"拡縮(X={FACE_PARTS_SIZE_MOD_X:CHARA_ID:LAYER_ID, 4, RIGHT}, Y={FACE_PARTS_SIZE_MOD_Y:CHARA_ID:LAYER_ID, 4, RIGHT})", 24, LEFT%
	ENDIF
	LOCALS '= ""
	LOCALS += @"@B:[PARTS_SIZE_X:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE},]@[X+]@/B@"
	LOCALS += @"@B:[PARTS_SIZE_X:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE * -1},]@[X-]@/B@"
	LOCALS += @"@B:[PARTS_SIZE_Y:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE},]@[Y+]@/B@"
	LOCALS += @"@B:[PARTS_SIZE_Y:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE * -1},]@[Y-]@/B@"
	LOCALS += @"@B:[PARTS_SIZE_X:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE},][PARTS_SIZE_Y:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE},]@[XY+]@/B@"
	LOCALS += @"@B:[PARTS_SIZE_X:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE * -1},][PARTS_SIZE_Y:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE * -1},]@[XY-]@/B@"
	LOCALS += @"@B:[PARTS_SIZE_RESET:%TOSTR(LAYER_ID)%]@[RESET]@/B@"
[SKIPSTART]
	;中心補正
	LOCALS += @"@B:[PARTS_SIZE_X:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE},][PARTS_OFFSET_X:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE/2 * -1},]@[X+]@/B@"
	LOCALS += @"@B:[PARTS_SIZE_X:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE * -1},][PARTS_OFFSET_X:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE/2},]@[X-]@/B@"
	LOCALS += @"@B:[PARTS_SIZE_Y:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE},][PARTS_OFFSET_Y:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE/2 * -1},]@[Y+]@/B@"
	LOCALS += @"@B:[PARTS_SIZE_Y:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE * -1},][PARTS_OFFSET_Y:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE/2},]@[Y-]@/B@"
	LOCALS += @"@B:[PARTS_SIZE_X:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE},][PARTS_OFFSET_X:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE/2 * -1},][PARTS_SIZE_Y:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE},][PARTS_OFFSET_Y:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE/2 * -1},]@[XY+]@/B@"
	LOCALS += @"@B:[PARTS_SIZE_X:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE * -1},][PARTS_OFFSET_X:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE/2},][PARTS_SIZE_Y:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE * -1},][PARTS_OFFSET_Y:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE/2},]@[XY-]@/B@"
[SKIPEND]
	CALLF TAG_PRINT(TAG_PRINT_SHAPE(LOCALS, 40, 1), 0)

	;実用性が低そうなので未対応
	IF GROUPMATCH(LAYER_ID, IMG_顔, IMG_身体, IMG_目, IMG_眉)
		PRINTL
		CONTINUE
	ENDIF

	IF CALL_FROM == "CLOTH_DRAWER"
		PRINTFORM %@"回転({FACE_PARTS_ROTATION_PRESET:CHARA_ID:LAYER_ID:PRESET_IDX, 4, RIGHT}°)", 14, LEFT%
	ELSE
		PRINTFORM %@"回転({FACE_PARTS_ROTATION:CHARA_ID:LAYER_ID, 4, RIGHT}°)", 14, LEFT%
	ENDIF
	LOCALS '= ""
	LOCALS += @"@B:[PARTS_ROTATION:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE},]@[+]@/B@"
	LOCALS += @"@B:[PARTS_ROTATION:%TOSTR(LAYER_ID)%,{PARTS_OFFSET_VALUE * -1},]@[-]@/B@"
	LOCALS += @"@B:[PARTS_ROTATION_RESET:%TOSTR(LAYER_ID)%]@[RESET]@/B@"
	CALLF TAG_PRINT(TAG_PRINT_SHAPE(LOCALS, 40, 1), 1)
NEXT

@PORTRAIT_EDIT_ADD_PARTS_OFFSET(TARGET_ARRAY, CHARA_ID, LAYER, VALUE, CALL_FROM)
#DIMS TARGET_ARRAY
#DIM  CHARA_ID
#DIM  LAYER
#DIM  VALUE
#DIMS CALL_FROM
#DIM  DYNAMIC PRESET_IDX
#DIMS DYNAMIC ARRAY_NAME

IF CALL_FROM == "PORTRAIT_EDIT"
	ARRAY_NAME '= @"%TARGET_ARRAY%:{CHARA_ID}:{LAYER}"
ELSEIF CALL_FROM == "CLOTH_DRAWER"
	PRESET_IDX = CLOTH_DRAWER_SELECT_PRESET
	ARRAY_NAME '= @"%TARGET_ARRAY%_PRESET:{CHARA_ID}:{LAYER}:{PRESET_IDX}"
ENDIF

IF TARGET_ARRAY == "FACE_PARTS_ROTATION"
	SETVAR ARRAY_NAME, (GETVAR(ARRAY_NAME) + VALUE + 360) % 360
ELSE
	SETVAR ARRAY_NAME, GETVAR(ARRAY_NAME) + VALUE
ENDIF

DEBUGPRINTFORML ARRAY_NAME %ARRAY_NAME%

@PORTRAIT_EDIT_SET_PARTS_OFFSET(TARGET_ARRAY, CHARA_ID, LAYER, VALUE, CALL_FROM)
#DIMS TARGET_ARRAY
#DIM  CHARA_ID
#DIM  LAYER
#DIM  VALUE
#DIMS CALL_FROM
#DIM  DYNAMIC PRESET_IDX
#DIMS DYNAMIC ARRAY_NAME

IF CALL_FROM == "PORTRAIT_EDIT"
	ARRAY_NAME '= @"%TARGET_ARRAY%:{CHARA_ID}:{LAYER}"
ELSEIF CALL_FROM == "CLOTH_DRAWER"
	PRESET_IDX = CLOTH_DRAWER_SELECT_PRESET
	ARRAY_NAME '= @"%TARGET_ARRAY%_PRESET:{CHARA_ID}:{LAYER}:{PRESET_IDX}"
ENDIF

IF TARGET_ARRAY == "FACE_PARTS_ROTATION"
	SETVAR ARRAY_NAME, (VALUE + 360) % 360
ELSE
	SETVAR ARRAY_NAME, VALUE
ENDIF

DEBUGPRINTFORML ARRAY_NAME %ARRAY_NAME%


code:
;--------------------------------------------
; CHARA_ID番のキャラの口上、ポートレイト編集オプション
;-------------------------------------------------
@PORTRAIT_PRESET_MENU(CHARA_ID)
#DIM CHARA_ID
#DIM DYNAMIC FIRST_LINE
#DIM DYNAMIC ITER_I
#DIM DYNAMIC ITER_J
#DIM DYNAMIC パーツ分類
#DIM DYNAMIC パーツ番号
#DIM DYNAMIC PRESET_IDX

;初期処理
FIRST_LINE = LINECOUNT
PRESET_IDX = CLOTH_DRAWER_SELECT_PRESET
IF !PRESET_IDX
	FACE_PARTS_PRESET_IS_VALID:CHARA_ID:衣装プリセット_通常 = 1
	FOR LOCAL, 0, FACE_LAYERNUM
		FACE_PARTS_PRESET:(CHARA_ID):LOCAL:PRESET_IDX = %FACE_PARTS:CHARA_ID:LOCAL%
	NEXT
ELSE
	;初回編集時に通常プリセットの内容をコピー
	IF FACE_PARTS_PRESET_IS_VALID:CHARA_ID:PRESET_IDX != 1
		FACE_PARTS_PRESET_IS_VALID:CHARA_ID:PRESET_IDX = 1
	ENDIF
ENDIF

PRINTL
CALL DRAW_LINE()
PRINTFORML %ANAME(CHARA_ID)%にこの衣装プリセットが適用されている際に適用される外見を編集出来ます
PRINTFORML ※無効の場合は通常プリセットの設定内容が適用されます
CALL DRAW_LINE()

CALL SHOW_CHARACTER_PORTRAIT_EDIT_MENU(CHARA_ID, "CLOTH_DRAWER")

; CALL DRAW_PORTRAIT(CHARA_ID, "[サイズ:200px][POS_X:7200]", "PORTRAIT_EDIT")
; ;ポートレイトプリセット編集
; PRINTFORML ・衣装プリセット適用時に外見を変更する
; CALL PRINT_SELECT_BUTTON(@"[有効] ", 10, FACE_PARTS_PRESET_IS_VALID:CHARA_ID:PRESET_IDX)
; IF PRESET_IDX
; 	CALL PRINT_SELECT_BUTTON(@"[無効]", 11, !FACE_PARTS_PRESET_IS_VALID:CHARA_ID:PRESET_IDX)
; ELSE
; 	CALL COLOR_PRINTL("[無効]", カラー_選択不可)
; ENDIF
; PRINTL
; PRINTFORM ・衣服
; PRINTL
; FOR ITER_I, 0, VARSIZE("IMG_服_パーツ名")
; 	SIF ITER_I > 0 && ITER_I % 6 == 0
; 		PRINTL
; 	PRINTFORM %IMG_服_パーツ名:ITER_I%:
; 	FOR ITER_J, 0, IMG_服_パターン数:ITER_I
; 		CALL PRINT_SELECT_BUTTON(@"\{{ITER_J}\}", 100000 + (ITER_I * IMG_MAX_CLOTH_PARTSNUM) + ITER_J, FACE_PARTS_PRESET:(CHARA_ID):IMG_服:PRESET_IDX == @"CC1_服_%IMG_服_パーツ名:ITER_I%_{ITER_J}", 1)
; 	NEXT
; 	PRINTFORM
; NEXT
; PRINTL
; PRINTFORM ・帽子
; PRINTL
; FOR ITER_I, 0, VARSIZE("IMG_帽子_パーツ名")
; 	PRINTFORM %IMG_帽子_パーツ名:ITER_I%:
; 	FOR ITER_J, 0, IMG_帽子_パターン数:ITER_I
; 		CALL PRINT_SELECT_BUTTON(@"\{{ITER_J}\}", 200000 + (ITER_I * IMG_MAX_CLOTH_PARTSNUM) + ITER_J, FACE_PARTS_PRESET:(CHARA_ID):IMG_帽子:PRESET_IDX == @"CC1_帽子_%IMG_帽子_パーツ名:ITER_I%_{ITER_J}", 1)
; 	NEXT
; 	PRINTFORM
; NEXT
; PRINTL
; PRINTFORM ・装飾
; PRINTL
; FOR ITER_I, 0, VARSIZE("IMG_アクセサリ1_パーツ名")
; 	PRINTFORM %IMG_アクセサリ1_パーツ名:ITER_I%:
; 	FOR ITER_J, 0, IMG_アクセサリ1_パターン数:ITER_I
; 		CALL PRINT_SELECT_BUTTON(@"\{{ITER_J}\}", 300000 + (ITER_I * IMG_MAX_CLOTH_PARTSNUM) + ITER_J, FACE_PARTS_PRESET:(CHARA_ID):IMG_アクセサリ1:PRESET_IDX == @"CC1_アクセサリ1_%IMG_アクセサリ1_パーツ名:ITER_I%_{ITER_J}", 1)
; 	NEXT
; 	PRINTFORM
; NEXT
; PRINTL
; PRINTFORM ・眼鏡
; PRINTL
; FOR ITER_I, 0, VARSIZE("IMG_眼鏡_パーツ名")
; 	PRINTFORM %IMG_眼鏡_パーツ名:ITER_I%:
; 	FOR ITER_J, 0, IMG_眼鏡_パターン数:ITER_I
; 		CALL PRINT_SELECT_BUTTON(@"\{{ITER_J}\}", 400000 + (ITER_I * IMG_MAX_CLOTH_PARTSNUM) + ITER_J, FACE_PARTS_PRESET:(CHARA_ID):IMG_眼鏡:PRESET_IDX == @"CC1_眼鏡_%IMG_眼鏡_パーツ名:ITER_I%_{ITER_J}", 1)
; 	NEXT
; 	PRINTFORM
; NEXT
; PRINTL
; PRINTFORM ・首飾
; PRINTL
; FOR ITER_I, 0, VARSIZE("IMG_首飾_パーツ名")
; 	PRINTFORM %IMG_首飾_パーツ名:ITER_I%:
; 	FOR ITER_J, 0, IMG_首飾_パターン数:ITER_I
; 		CALL PRINT_SELECT_BUTTON(@"\{{ITER_J}\}", 700000 + (ITER_I * IMG_MAX_CLOTH_PARTSNUM) + ITER_J, FACE_PARTS_PRESET:(CHARA_ID):IMG_首飾:PRESET_IDX == @"CC1_首飾_%IMG_首飾_パーツ名:ITER_I%_{ITER_J}", 1)
; 	NEXT
; 	PRINTFORM
; NEXT
; PRINTL
; PRINTL
; PRINTFORM ・色変更
; PRINTL
; PRINTBUTTON "[衣服色]  ", 2003
; PRINTBUTTON "[帽子色]  ", 2004
; PRINTBUTTON "[装飾色]  ", 2005
; PRINTBUTTON "[眼鏡色]  ", 2006
; PRINTBUTTON "[首飾色]  ", 2009
; PRINTL
; PRINTL
; PRINTL
; PRINTL
; CALL DRAW_LINE()
; PRINTBUTTON "[戻る]  ", 99

; REDRAW 1
; ONEINPUT
; REDRAW 0
; CLEARLINE 1
; PRINTL

; ;編集終了
; IF RESULT == 99
; 	RETURN
; ELSEIF  INRANGE(RESULT, 10, 11)
; 	INVERTBIT FACE_PARTS_PRESET_IS_VALID:CHARA_ID:PRESET_IDX, 0
; 	;顔グラ 服
; ELSEIF INRANGE(RESULT, 100000, 199999)
; 	LOCAL = RESULT - 100000
; 	パーツ分類 = LOCAL / IMG_MAX_CLOTH_PARTSNUM
; 	パーツ番号 = LOCAL % IMG_MAX_CLOTH_PARTSNUM
; 	IF FACE_PARTS_PRESET:(CHARA_ID):IMG_服:PRESET_IDX == @"CC1_服_%IMG_服_パーツ名:パーツ分類%_{パーツ番号}"
; 		FACE_PARTS_PRESET:(CHARA_ID):IMG_服:PRESET_IDX '= ""
; 	ELSEIF SPRITECREATED(@"CC1_服_%IMG_服_パーツ名:パーツ分類%_{パーツ番号}")
; 		FACE_PARTS_PRESET:(CHARA_ID):IMG_服:PRESET_IDX '= @"CC1_服_%IMG_服_パーツ名:パーツ分類%_{パーツ番号}"
; 	ENDIF
; 	;顔グラ 帽子
; ELSEIF INRANGE(RESULT, 200000, 299999)
; 	LOCAL = RESULT - 200000
; 	パーツ分類 = LOCAL / IMG_MAX_CLOTH_PARTSNUM
; 	パーツ番号 = LOCAL % IMG_MAX_CLOTH_PARTSNUM
; 	IF FACE_PARTS_PRESET:(CHARA_ID):IMG_帽子:PRESET_IDX == @"CC1_帽子_%IMG_帽子_パーツ名:パーツ分類%_{パーツ番号}"
; 		FACE_PARTS_PRESET:(CHARA_ID):IMG_帽子:PRESET_IDX '= ""
; 	ELSEIF SPRITECREATED(@"CC1_帽子_%IMG_帽子_パーツ名:パーツ分類%_{パーツ番号}")
; 		FACE_PARTS_PRESET:(CHARA_ID):IMG_帽子:PRESET_IDX '= @"CC1_帽子_%IMG_帽子_パーツ名:パーツ分類%_{パーツ番号}"
; 	ENDIF
; 	;顔グラ アクセサリ1
; ELSEIF INRANGE(RESULT, 300000, 399999)
; 	LOCAL = RESULT - 300000
; 	パーツ分類 = LOCAL / IMG_MAX_CLOTH_PARTSNUM
; 	パーツ番号 = LOCAL % IMG_MAX_CLOTH_PARTSNUM
; 	IF FACE_PARTS_PRESET:(CHARA_ID):IMG_アクセサリ1:PRESET_IDX == @"CC1_アクセサリ1_%IMG_アクセサリ1_パーツ名:パーツ分類%_{パーツ番号}"
; 		FACE_PARTS_PRESET:(CHARA_ID):IMG_アクセサリ1:PRESET_IDX '= ""
; 	ELSEIF SPRITECREATED(@"CC1_アクセサリ1_%IMG_アクセサリ1_パーツ名:パーツ分類%_{パーツ番号}")
; 		FACE_PARTS_PRESET:(CHARA_ID):IMG_アクセサリ1:PRESET_IDX '= @"CC1_アクセサリ1_%IMG_アクセサリ1_パーツ名:パーツ分類%_{パーツ番号}"
; 	ENDIF
; ELSEIF INRANGE(RESULT, 400000, 499999)
; 	LOCAL = RESULT - 400000
; 	パーツ分類 = LOCAL / IMG_MAX_CLOTH_PARTSNUM
; 	パーツ番号 = LOCAL % IMG_MAX_CLOTH_PARTSNUM
; 	IF FACE_PARTS_PRESET:(CHARA_ID):IMG_眼鏡:PRESET_IDX == @"CC1_眼鏡_%IMG_眼鏡_パーツ名:パーツ分類%_{パーツ番号}"
; 		FACE_PARTS_PRESET:(CHARA_ID):IMG_眼鏡:PRESET_IDX '= ""
; 	ELSEIF SPRITECREATED(@"CC1_眼鏡_%IMG_眼鏡_パーツ名:パーツ分類%_{パーツ番号}")
; 		FACE_PARTS_PRESET:(CHARA_ID):IMG_眼鏡:PRESET_IDX '= @"CC1_眼鏡_%IMG_眼鏡_パーツ名:パーツ分類%_{パーツ番号}"
; 	ENDIF
; 	;顔グラ 首飾
; ELSEIF INRANGE(RESULT, 700000, 799999)
; 	LOCAL = RESULT - 700000
; 	パーツ分類 = LOCAL / IMG_MAX_CLOTH_PARTSNUM
; 	パーツ番号 = LOCAL % IMG_MAX_CLOTH_PARTSNUM
; 	IF FACE_PARTS_PRESET:(CHARA_ID):IMG_首飾:PRESET_IDX == @"CC1_首飾_%IMG_首飾_パーツ名:パーツ分類%_{パーツ番号}"
; 		FACE_PARTS_PRESET:(CHARA_ID):IMG_首飾:PRESET_IDX '= ""
; 	ELSEIF SPRITECREATED(@"CC1_首飾_%IMG_首飾_パーツ名:パーツ分類%_{パーツ番号}")
; 		FACE_PARTS_PRESET:(CHARA_ID):IMG_首飾:PRESET_IDX '= @"CC1_首飾_%IMG_首飾_パーツ名:パーツ分類%_{パーツ番号}"
; 	ENDIF
; ELSEIF INRANGE(RESULT, 2003, 2009)
; 	LOCAL = RESULT
; 	CLEARLINE 1
; 	CALL SINGLE_DRAWLINE()
; 	SELECTCASE LOCAL
; 		CASE 2003
; 			CALL EDIT_PORTRAIT_PARTS_COLOR(CHARA_ID, "CLOTH", PRESET_IDX)
; 		CASE 2004
; 			CALL EDIT_PORTRAIT_PARTS_COLOR(CHARA_ID, "HAT", PRESET_IDX)
; 		CASE 2005
; 			CALL EDIT_PORTRAIT_PARTS_COLOR(CHARA_ID, "ACCESSORY1", PRESET_IDX)
; 		CASE 2006
; 			CALL EDIT_PORTRAIT_PARTS_COLOR(CHARA_ID, "GLASSES", PRESET_IDX)
; 		CASE 2009
; 			CALL EDIT_PORTRAIT_PARTS_COLOR(CHARA_ID, "NECKLACE", PRESET_IDX)
; 	ENDSELECT
; ENDIF


code:
;-------------------------------------------------
;ARG:0番の他キャラに対する好感度・敵対値を一覧表示
;-------------------------------------------------
@SHOW_RELATION_INFO(CHARA_ID)
#DIM CHARA_ID

;SHOW_INFOの入力結果に基づいて制御を変える
IF SHOW_INFO_RELATION_EVENT != ""
    IF DIC_CONTAINSKEY(SHOW_INFO_RELATION_EVENT, "CHANGE_CHARA_ID")
        SHOW_RELATION_CURRENT_CHARA_ID = DIC_GETINT(SHOW_INFO_RELATION_EVENT, "CHANGE_CHARA_ID")
    ENDIF
    IF DIC_CONTAINSKEY(SHOW_INFO_RELATION_EVENT, "DEBUG")
        CALL SHOW_RELATION_DEBUG(SHOW_INFO_RELATION_EVENT)
    ENDIF
    SHOW_INFO_RELATION_EVENT '= ""
ENDIF
IF SHOW_RELATION_CURRENT_CHARA_ID != -1 && SHOW_RELATION_CURRENT_CHARA_ID != CHARA_ID
    CHARA_ID = SHOW_RELATION_CURRENT_CHARA_ID
    SHOW_INFO_RELATION_CURRENT_PAGE = 0
ENDIF

CALL RELATION_INFO_SHOW_TABLE(CHARA_ID)

@RELATION_INFO_SHOW_TABLE(CHARA_ID)
#DIM CHARA_ID
VARI DID, 1000
VARI RELATION_NUM
VARI I
VARI J
VARS TEXT
VARS ROWS, 1000
VARI MAX_ROW = UI_MAXHEIGHT - 6 ;ヘッダー、フッター表示行分減らす
VARI R_CNT
VARS COLUMNS, 10

DT_SELECT "CHARA_RELATION", @"REL_FROM_ID = {CHARA_ID}", "REL_FROM_ID ASC", DID
RELATION_NUM = RESULT

;ページ数算出
SHOW_INFO_RELATION_PAGE_NUM = (RELATION_NUM - 1) / MAX_ROW
SHOW_INFO_RELATION_CURRENT_PAGE = SHOW_INFO_RELATION_CURRENT_PAGE > SHOW_INFO_RELATION_PAGE_NUM ? SHOW_INFO_RELATION_PAGE_NUM # SHOW_INFO_RELATION_CURRENT_PAGE

;UIコンテナの作成
VARI UIC_ID
VARI WIDTH  = UI_MAXWIDTH * 100
VARI HEIGHT = UI_MAXHEIGHT * 100
CALL UIC_INIT()
UIC_ID = RESULT

CALL UIC_ADD(UIC_ID, "UIC_PARENT", "", @"[BORDER:0PX][SIZE:{WIDTH},{HEIGHT}]")
CALL UIC_SET_LAYOUT(UIC_ID, "UIC_PARENT", "[TARGET:LINE_LEFT][ANCHOR:LEFT_TOP][TARGET_PIVOT:LEFT_TOP][PADDING:50,0]")
CALL UIC_ADD(UIC_ID, "UIC_TITLE", "", @"[BORDER:1PX][SIZE:{WIDTH},200][PADDING:25][COLOR:%C2H(カラー_ダークグレー)%]")
CALL UIC_SET_LAYOUT(UIC_ID, "UIC_TITLE", "[TARGET:UIC_PARENT][ANCHOR:TOP][TARGET_PIVOT:TOP]")
CALL UIC_ADD(UIC_ID, "UIC_MAIN", "", @"[BORDER:1PX][SIZE:{WIDTH},{HEIGHT - 200}][PADDING:25]")
CALL UIC_SET_LAYOUT(UIC_ID, "UIC_MAIN", "[TARGET:UIC_TITLE][ANCHOR:TOP][TARGET_PIVOT:BOTTOM]")
CALL UIC_ADD(UIC_ID, "UIC_FOOTER", "", @"[BORDER:0PX][SIZE:{WIDTH},150][PADDING:0]")
CALL UIC_SET_LAYOUT(UIC_ID, "UIC_FOOTER", "[TARGET:UIC_MAIN][ANCHOR:BOTTOM][TARGET_PIVOT:BOTTOM]")

;関係性レコードの許容状態のチェック
VARI 恋愛の許容_全てオン = 1
VARI 隷属の許容_全てオン = 1
VARI 支配の許容_全てオン = 1
VARI 肉体関係の許容_全てオン = 1
FOR J, SHOW_INFO_RELATION_CURRENT_PAGE * MAX_ROW, MIN(RELATION_NUM, (SHOW_INFO_RELATION_CURRENT_PAGE + 1) * MAX_ROW)
    TARGET_ID = DT_CELL_GET("CHARA_RELATION", DID:J, "REL_TO_ID", 1)
    SIF 恋愛の許容_全てオン && !DT_CELL_GET("CHARA_RELATION", DID:J, "ALLOW_LOVER", 1)
        恋愛の許容_全てオン = 0
    SIF 隷属の許容_全てオン && !DT_CELL_GET("CHARA_RELATION", DID:J, "ALLOW_SUBORDINATE", 1)
        隷属の許容_全てオン = 0
    SIF 支配の許容_全てオン && !DT_CELL_GET("CHARA_RELATION", DID:J, "ALLOW_DOMINANCE", 1)
        支配の許容_全てオン = 0
    SIF 肉体関係の許容_全てオン && !DT_CELL_GET("CHARA_RELATION", DID:J, "ALLOW_UFUFU", 1)
        肉体関係の許容_全てオン = 0
    ;各項目にいずれか一つでもオフがあることが判定できているなら、それ以上チェックする必要がないのでBREAK
    SIF !恋愛の許容_全てオン && !隷属の許容_全てオン && !支配の許容_全てオン && !肉体関係の許容_全てオン
        BREAK
NEXT

TOGGLE_ALLOW_LOVER_ALL_BUTTON = 恋愛の許容_全てオン
TOGGLE_ALLOW_SUBORDINATE_ALL_BUTTON = 隷属の許容_全てオン
TOGGLE_ALLOW_DOMINANCE_ALL_BUTTON = 支配の許容_全てオン
TOGGLE_ALLOW_UFUFU_ALL_BUTTON = 肉体関係の許容_全てオン

;関係性レコードの許可設定
VARS 恋愛の一括許容
VARS 隷属の一括許容
VARS 支配の一括許容
VARS 肉体関係の一括許容

恋愛の一括許容 = %TOGGLE_ALLOW_LOVER_ALL_BUTTON ? @"@C:{カラー_白}@[☑]@/C@" # @"@C:{カラー_選択不可}@[□]@/C@"%
隷属の一括許容 = %TOGGLE_ALLOW_SUBORDINATE_ALL_BUTTON ? @"@C:{カラー_白}@[☑]@/C@" # @"@C:{カラー_選択不可}@[□]@/C@"%
支配の一括許容 = %TOGGLE_ALLOW_DOMINANCE_ALL_BUTTON ? @"@C:{カラー_白}@[☑]@/C@" # @"@C:{カラー_選択不可}@[□]@/C@"%
肉体関係の一括許容 = %TOGGLE_ALLOW_UFUFU_ALL_BUTTON ? @"@C:{カラー_白}@[☑]@/C@" # @"@C:{カラー_選択不可}@[□]@/C@"%

;ヘッダー作成
I = 0
COLUMNS:(I++) = %TAG_PRINT_SHAPE("名前", 18, 1, 2)%
COLUMNS:(I++) = %TAG_PRINT_SHAPE("関係性", 8, 1, 2)%
COLUMNS:(I++) = %TAG_PRINT_SHAPE("好感度", 8, 1, 2)%
COLUMNS:(I++) = %TAG_PRINT_SHAPE("依存度", 8, 1, 2)%
COLUMNS:(I++) = %TAG_PRINT_SHAPE("従属度", 8, 1, 2)%
COLUMNS:(I++) = %TAG_PRINT_SHAPE("支配度", 8, 1, 2)%
COLUMNS:(I++) = %TAG_PRINT_SHAPE(@"恋愛の許容@B:[TOGGLE_ALLOW_LOVER_ALL:{CHARA_ID}]$このキャラの恋愛許否を一括切替@%恋愛の一括許容%@/B@", 18, 1, 2)%
COLUMNS:(I++) = %TAG_PRINT_SHAPE(@"隷属の許容@B:[TOGGLE_ALLOW_SUBORDINATE_ALL:{CHARA_ID}]$このキャラの隷属許否を一括切替@%隷属の一括許容%@/B@", 18, 1, 2)%
COLUMNS:(I++) = %TAG_PRINT_SHAPE(@"支配の許容@B:[TOGGLE_ALLOW_DOMINANCE_ALL:{CHARA_ID}]$このキャラの支配許否を一括切替@%支配の一括許容%@/B@", 18, 1, 2)%
COLUMNS:(I++) = %TAG_PRINT_SHAPE(@"肉体関係の許容@B:[TOGGLE_ALLOW_UFUFU_ALL:{CHARA_ID}]$このキャラの肉体関係許否を一括切替@%肉体関係の一括許容%@/B@", 18, 1, 2)%

FOR I, 0, VARSIZE("COLUMNS")
    ROWS:(R_CNT) += @"%CONV_TAG2H(COLUMNS:I)%" + "｜"
NEXT
R_CNT++
ROWS:(R_CNT) = %DRAW_LINEH(UI_MAXWIDTH - 1)%
R_CNT++

;レコードデータ取得
VARI TARGET_ID
VARS 名前
VARI 好感度
VARI 依存度
VARI 従属度
VARI 支配度
VARI 関係性
VARS 恋愛の許容
VARS 隷属の許容
VARS 支配の許容
VARS 肉体関係の許容
VARS TOOLTIP
FOR J, SHOW_INFO_RELATION_CURRENT_PAGE * MAX_ROW, MIN(RELATION_NUM, (SHOW_INFO_RELATION_CURRENT_PAGE + 1) * MAX_ROW)
    TARGET_ID = DT_CELL_GET("CHARA_RELATION", DID:J, "REL_TO_ID", 1)
    名前 = %ANAME(TARGET_ID)%
    好感度 = DT_CELL_GET("CHARA_RELATION", DID:J, "LIKE", 1)

    依存度 = DT_CELL_GET("CHARA_RELATION", DID:J, "DEPENDENCE", 1)
    従属度 = DT_CELL_GET("CHARA_RELATION", DID:J, "SUBORDINATE", 1)
    支配度 = DT_CELL_GET("CHARA_RELATION", DID:J, "DOMINANCE", 1)
    関係性 = DT_CELL_GET("CHARA_RELATION", DID:J, "RELATION", 1)

    恋愛の許容 = %DT_CELL_GET("CHARA_RELATION", DID:J, "ALLOW_LOVER", 1) ? @"@C:{カラー_白}@[☑]@/C@" # @"@C:{カラー_選択不可}@[□]@/C@"%
    隷属の許容 = %DT_CELL_GET("CHARA_RELATION", DID:J, "ALLOW_SUBORDINATE", 1) ? @"@C:{カラー_白}@[☑]@/C@" # @"@C:{カラー_選択不可}@[□]@/C@"%
    支配の許容 = %DT_CELL_GET("CHARA_RELATION", DID:J, "ALLOW_DOMINANCE", 1) ? @"@C:{カラー_白}@[☑]@/C@" # @"@C:{カラー_選択不可}@[□]@/C@"%
    肉体関係の許容 = %DT_CELL_GET("CHARA_RELATION", DID:J, "ALLOW_UFUFU", 1) ? @"@C:{カラー_白}@[☑]@/C@" # @"@C:{カラー_選択不可}@[□]@/C@"%
    VARI F_COL
    IF EXISTVAR(@"関係性カラー_%関係性_文字列:関係性%")
        F_COL = GETVAR(@"関係性カラー_%関係性_文字列:関係性%")
    ELSE
        F_COL = カラー_白
    ENDIF
    I = 0
    COLUMNS:(I++) = %TAG_PRINT_SHAPE(@"@B:[CHANGE_CHARA_ID:{TARGET_ID}]@%名前%@/B@", 18, 1, 0)%
    IF SHOW_RELATION_DEBUG_MODE
        COLUMNS:(I++) = %@"@B:[DEBUG:関係性][DID:{DID:J}]@" + TAG_PRINT_SHAPE(@"@C:{F_COL}@%関係性_文字列:関係性%@/C", 8, 1, 2) + "@/B@"%
        COLUMNS:(I++) = %@"@B:[DEBUG:好感度][DID:{DID:J}]@" + TAG_PRINT_SHAPE(TOSTR(好感度), 8, 1, 1) + "@/B@"%
        COLUMNS:(I++) = %@"@B:[DEBUG:依存度][DID:{DID:J}]@" + TAG_PRINT_SHAPE(TOSTR(依存度), 8, 1, 1) + "@/B@"%
        COLUMNS:(I++) = %@"@B:[DEBUG:従属度][DID:{DID:J}]@" + TAG_PRINT_SHAPE(TOSTR(従属度), 8, 1, 1) + "@/B@"%
        COLUMNS:(I++) = %@"@B:[DEBUG:支配度][DID:{DID:J}]@" + TAG_PRINT_SHAPE(TOSTR(支配度), 8, 1, 1) + "@/B@"%
    ELSE
        COLUMNS:(I++) = %TAG_PRINT_SHAPE(@"@C:{F_COL}@%関係性_文字列:関係性%@/C", 8, 1, 2)%
        COLUMNS:(I++) = %TAG_PRINT_SHAPE(TOSTR(好感度), 8, 1, 1)%
        COLUMNS:(I++) = %TAG_PRINT_SHAPE(TOSTR(依存度), 8, 1, 1)%
        COLUMNS:(I++) = %TAG_PRINT_SHAPE(TOSTR(従属度), 8, 1, 1)%
        COLUMNS:(I++) = %TAG_PRINT_SHAPE(TOSTR(支配度), 8, 1, 1)%
    ENDIF
    TOOLTIP '= @"オンの場合%ANAME(CHARA_ID)%が%ANAME(TARGET_ID)%と恋愛関係を深めることを許容します"
    COLUMNS:(I++) = %TAG_PRINT_SHAPE(@"@B:[TOGGLE_ALLOW_LOVER:{DID:J}]$%TOOLTIP%@%恋愛の許容%@/B@", 18, 1, 2)%
    TOOLTIP '= @"オンの場合%ANAME(CHARA_ID)%が%ANAME(TARGET_ID)%に対して依存・隷属する関係を深めることを許容します"
    COLUMNS:(I++) = %TAG_PRINT_SHAPE(@"@B:[TOGGLE_ALLOW_SUBORDINATE:{DID:J}]$%TOOLTIP%@%隷属の許容%@/B@", 18, 1, 2)%
    TOOLTIP '= @"オンの場合%ANAME(CHARA_ID)%が%ANAME(TARGET_ID)%を支配する関係を深めることを許容します"
    COLUMNS:(I++) = %TAG_PRINT_SHAPE(@"@B:[TOGGLE_ALLOW_DOMINANCE:{DID:J}]$%TOOLTIP%@%支配の許容%@/B@", 18, 1, 2)%
    TOOLTIP '= @"オンの場合%ANAME(CHARA_ID)%が%ANAME(TARGET_ID)%と肉体関係を結ぶイベントの発生を許容します"
    COLUMNS:(I++) = %TAG_PRINT_SHAPE(@"@B:[TOGGLE_ALLOW_UFUFU:{DID:J}]$%TOOLTIP%@%肉体関係の許容%@/B@", 18, 1, 2)%

    FOR I, 0, VARSIZE("COLUMNS")
        ROWS:(R_CNT) += @"%CONV_TAG2H(COLUMNS:I)%" + "｜"
    NEXT
    R_CNT++
NEXT

FOR I, 0, R_CNT
    TEXT += @"%ROWS:I%" + "
"
NEXT

CALL UIC_SET_TEXT(UIC_ID, "UIC_MAIN", TEXT)

;ページコントロール用の領域
TEXT '= ""
TEXT += @"%SHOW_INFO_RELATION_CURRENT_PAGE > 0 ? "@B:[PREV_PAGE:1]@＜―@/B@" # @"@C:{カラー_選択不可}@＜―@/C@"%"
TEXT += @" {SHOW_INFO_RELATION_CURRENT_PAGE + 1} "
TEXT += @"%SHOW_INFO_RELATION_CURRENT_PAGE < SHOW_INFO_RELATION_PAGE_NUM ? "@B:[NEXT_PAGE:1]@―＞@/B@" # @"@C:{カラー_選択不可}@―＞@/C@"%"
TEXT = %CONV_TAG2H(TAG_PRINT_SHAPE(TEXT, UI_MAXWIDTH * 2, 1, 2))%
CALL UIC_SET_TEXT(UIC_ID, "UIC_FOOTER", TEXT)

;表示部
CALL UIC_SET_TEXT(UIC_ID, "UIC_TITLE", CONV_TAG2H(@"@S:1@◆　%ANAME(CHARA_ID)%の関係一覧@/S@"))
CALL UIC_SHOW(UIC_ID)
;表示領域分改行
CALL NEWLINE(UI_MAXHEIGHT)

;SHOW_INFOから呼ばれる入力判定
@SHOW_RELATION_INFO_INPUT(RESULTS)
VARS INPUT_VALUES
VARI DID
VARI CHARA_ID
INPUT_VALUES = %RESULTS%
SHOW_INFO_RELATION_EVENT = %INPUT_VALUES%

IF DIC_CONTAINSKEY(INPUT_VALUES, "CHANGE_CHARA_ID")
    RETURN
ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "TOGGLE_ALLOW_LOVER")
    DID = DIC_GETINT(INPUT_VALUES, "TOGGLE_ALLOW_LOVER")
    CALL CHARA_RELATION_TOGGLE_PERMISSION(DID, "ALLOW_LOVER")
    RETURN
ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "TOGGLE_ALLOW_SUBORDINATE")
    DID = DIC_GETINT(INPUT_VALUES, "TOGGLE_ALLOW_SUBORDINATE")
    CALL CHARA_RELATION_TOGGLE_PERMISSION(DID, "ALLOW_SUBORDINATE")
    RETURN
ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "TOGGLE_ALLOW_DOMINANCE")
    DID = DIC_GETINT(INPUT_VALUES, "TOGGLE_ALLOW_DOMINANCE")
    CALL CHARA_RELATION_TOGGLE_PERMISSION(DID, "ALLOW_DOMINANCE")
    RETURN
ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "TOGGLE_ALLOW_UFUFU")
    DID = DIC_GETINT(INPUT_VALUES, "TOGGLE_ALLOW_UFUFU")
    CALL CHARA_RELATION_TOGGLE_PERMISSION(DID, "ALLOW_UFUFU")
    RETURN
ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "TOGGLE_ALLOW_LOVER_ALL")
    CALL SHOW_RELATION_CONFIRM_TOGGLE_ALL_PERMISSION()
    IF !RESULT
        RETURN
    ENDIF
    CHARA_ID = DIC_GETINT(INPUT_VALUES, "TOGGLE_ALLOW_LOVER_ALL")
    TOGGLE_ALLOW_LOVER_ALL_BUTTON = !TOGGLE_ALLOW_LOVER_ALL_BUTTON
    CALL CHARA_RELATION_SET_PERMISSION_ALL(CHARA_ID, "ALLOW_LOVER", TOGGLE_ALLOW_LOVER_ALL_BUTTON)
ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "TOGGLE_ALLOW_SUBORDINATE_ALL")
    CALL SHOW_RELATION_CONFIRM_TOGGLE_ALL_PERMISSION()
    IF !RESULT
        RETURN
    ENDIF
    CHARA_ID = DIC_GETINT(INPUT_VALUES, "TOGGLE_ALLOW_SUBORDINATE_ALL")
    TOGGLE_ALLOW_SUBORDINATE_ALL_BUTTON = !TOGGLE_ALLOW_SUBORDINATE_ALL_BUTTON
    CALL CHARA_RELATION_SET_PERMISSION_ALL(CHARA_ID, "ALLOW_SUBORDINATE", TOGGLE_ALLOW_SUBORDINATE_ALL_BUTTON)
ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "TOGGLE_ALLOW_DOMINANCE_ALL")
    CALL SHOW_RELATION_CONFIRM_TOGGLE_ALL_PERMISSION()
    IF !RESULT
        RETURN
    ENDIF
    CHARA_ID = DIC_GETINT(INPUT_VALUES, "TOGGLE_ALLOW_DOMINANCE_ALL")
    TOGGLE_ALLOW_DOMINANCE_ALL_BUTTON = !TOGGLE_ALLOW_DOMINANCE_ALL_BUTTON
    CALL CHARA_RELATION_SET_PERMISSION_ALL(CHARA_ID, "ALLOW_DOMINANCE", TOGGLE_ALLOW_DOMINANCE_ALL_BUTTON)
ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "TOGGLE_ALLOW_UFUFU_ALL")
    CALL SHOW_RELATION_CONFIRM_TOGGLE_ALL_PERMISSION()
    IF !RESULT
        RETURN
    ENDIF
    CHARA_ID = DIC_GETINT(INPUT_VALUES, "TOGGLE_ALLOW_UFUFU_ALL")
    TOGGLE_ALLOW_UFUFU_ALL_BUTTON = !TOGGLE_ALLOW_UFUFU_ALL_BUTTON
    CALL CHARA_RELATION_SET_PERMISSION_ALL(CHARA_ID, "ALLOW_UFUFU", TOGGLE_ALLOW_UFUFU_ALL_BUTTON)
ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "PREV_PAGE")
    SHOW_INFO_RELATION_CURRENT_PAGE = SHOW_INFO_RELATION_CURRENT_PAGE > 0 ? SHOW_INFO_RELATION_CURRENT_PAGE - 1 # 0
ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "NEXT_PAGE") && SHOW_INFO_RELATION_CURRENT_PAGE < SHOW_INFO_RELATION_PAGE_NUM
    SHOW_INFO_RELATION_CURRENT_PAGE++
ENDIF

@SHOW_RELATION_CONFIRM_TOGGLE_ALL_PERMISSION()
PRINTL
CALL COLOR_PRINTL("関係性の許容を一括して切り替えます。よろしいですか？", カラー_注意)
CALL ASK_YN()
RETURN !RESULT

;;;デバッグモードによる値操作
;;;
@SHOW_RELATION_DEBUG(DIC_OPTION)
#DIMS DIC_OPTION
#DIMS DYNAMIC CANDIDATES, 30

VARS TARGET_COLUMNSTR
VARI CANDIDATE_NUM
VARI TARGET_DID
VARI FROM_ID
VARI TO_ID
VARI I
VARS HTML
TARGET_COLUMNSTR = %DIC_GET(DIC_OPTION, "DEBUG")%
TARGET_DID = DIC_GETINT(DIC_OPTION, "DID")

CANDIDATE_NUM = VARSIZE("関係性_文字列")
FOR I, 0, CANDIDATE_NUM
    CANDIDATES:I = %関係性_文字列:I%
NEXT

FROM_ID = DT_CELL_GET("CHARA_RELATION", TARGET_DID, "REL_FROM_ID", 1)
TO_ID = DT_CELL_GET("CHARA_RELATION", TARGET_DID, "REL_TO_ID", 1)

PRINTFORML ;-------------------------------------------------
PRINTFORML ; DEBUG 関係性の変更
PRINTFORML ;-------------------------------------------------
SELECTCASE TARGET_COLUMNSTR
    CASE "関係性"
        PRINTFORML %ANAME(FROM_ID)%から%ANAME(TO_ID)%への関係性を変更します
        FOR I, 0, CANDIDATE_NUM
            HTML += @"<button value='{I}'>[%CANDIDATES:I%]</button>
"
        NEXT
        HTML += @"
<button value='-1'>[変更しない]</button>
"
        HTML_PRINT HTML, 1
        BINPUT
        IF INRANGE(RESULT, -1, CANDIDATE_NUM)
            IF RESULT != -1
                CALL CHARA_RELATION_SET_RELATION(FROM_ID, TO_ID, RESULT)
                RETURN 1
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE "好感度", "依存度", "従属度", "支配度"
        PRINTFORML %ANAME(FROM_ID)%から%ANAME(TO_ID)%への%TARGET_COLUMNSTR%に入力値を加算します(未入力・文字以外でキャンセル)
        INPUTS
        IF ISNUMERIC(RESULTS)
            RESULT = TOINT(RESULTS)
            SELECTCASE TARGET_COLUMNSTR
                CASE "好感度"
                    CALL REL_ADD(FROM_ID, TO_ID, RESULT)
                CASE "依存度"
                    CALL REL_ADD(FROM_ID, TO_ID,, RESULT)
                CASE "従属度"
                    CALL REL_ADD(FROM_ID, TO_ID,,, RESULT)
                CASE "支配度"
                    CALL REL_ADD(FROM_ID, TO_ID,,,, RESULT)
            ENDSELECT
            RETURN 1
        ELSE
            RETURN 0
        ENDIF
ENDSELECT

;;; デバッグモード起動用関数
;;; コンソールから投入できるよう式中関数で定義
@RELATION_DEBUG_ACTIVATE(IS_ACTIVE)
#FUNCTION
#DIM IS_ACTIVE
SHOW_RELATION_DEBUG_MODE = IS_ACTIVE

;-------------------------------------------------
;ARG:0番の他キャラに対する好感度・敵対値を一覧表示(廃止)
;-------------------------------------------------
@SHOW_RELATION_LIST(ARG:0)
; FOR LOCAL:0, 0, CHARANUM
; 	PRINTFORM %ANAME(LOCAL:0), 8, RIGHT%
; 	PRINTFORM   {REL_LIKE:(ARG:0):(LOCAL:0), 5, RIGHT}
; 	PRINTFORM   {REL_HATE:(ARG:0):(LOCAL:0), 5, RIGHT}
; 	PRINTL
; NEXT