code:
;********************************************************************************************
;2019/8/14 作成 ロウ@TW夢子口上の人
;
;Licence  :ライセンスフリー(CC0)。
;
;グラフィック表示簡易化ライブラリ
;なんかややこしいグラフィック表示関連を簡単に表示できるようにまとめたもの。
;HTMLもどきだし、可読性悪いし、冗長なので「もう画像指定したら縦幅とか勝手に揃えろよ」っていうことで作りました。
;********************************************************************************************

;********************************************************************************************
;画像合成関数
;指定したグラフィックIDにリソース画像を重ねて合成する関数
;グラフィックIDが0の変数を渡すと勝手に使用可能なグラフィックIDを走査してその変数に渡す
;その場合は初めに合成されたリソースのサイズに合わせてグラフィックを作成する
;横幅か縦幅に0が入っている場合には自動でリソース画像のサイズを取得してサイズを合わせる
;ブレンド名はリソースを合成する際に適用するカラーブレンドの名称を入れる　例="赤"
;********************************************************************************************
@画像合成(グラフィックID, スプライト名, POS_X = 0, POS_Y = 0, 横幅 = 0, 縦幅 = 0, カラーブレンド名 = "", アルファ値 = 256, 回転角 = 0)
#DIM REF グラフィックID		;合成先のグラフィックID 参照渡し
#DIMS スプライト名			;合成元のスプライト名
#DIM POS_X					;リソースを配置するX座標
#DIM POS_Y					;リソースを配置するY座標
#DIM 横幅					;合成するリソースの横幅
#DIM 縦幅					;合成するリソースの縦幅
#DIMS カラーブレンド名		;カラーブレンドの名称
#DIM カラーマトリクス, 5, 5	;カラーブレンドに使用するマトリクス
#DIM アルファ値				;カラーブレンドの不透明度
#DIM DYNAMIC 回転角
VARSET カラーマトリクス
SIF !SPRITECREATED(スプライト名)
	;スプライトが存在しない場合0を返す
	RETURN 0
IF 横幅 == 0 || 縦幅 == 0
	横幅 = SPRITEWIDTH(スプライト名)
	縦幅 = SPRITEHEIGHT(スプライト名)
ENDIF
IF グラフィックID == 0
	;前回呼び出されていれば続きから始める
	グラフィックID = NEXT_GID
	WHILE GCREATED(グラフィックID)
		;空いているグラフィックIDを走査する
		グラフィックID ++
	WEND
	;次回は続きから走査するように設定
	;NEXT_GID = グラフィックID + 1

	GCREATE グラフィックID, 横幅, 縦幅
	GPLグラフィックID:GPL保有GID数 = グラフィックID
	GPLリソース名:GPL保有GID数 = 合成
	GPL保有GID数++
ENDIF

IF 回転角 != 0
	VARI TEMP_グラフィックID
	WHILE GCREATED(TEMP_グラフィックID)
		;空いているグラフィックIDを走査する
		TEMP_グラフィックID ++
	WEND
	GCREATE TEMP_グラフィックID, 横幅, 縦幅

	IF カラーブレンド名 == ""
		GDRAWSPRITE TEMP_グラフィックID, スプライト名, POS_X, POS_Y,  横幅, 縦幅
		;DEBUGPRINTFORML 画像合成：%スプライト名%:{TEMP_グラフィックID},{POS_X},{POS_Y},{横幅},{縦幅}
	ELSE
		;カラーブレンドが設定されている場合、適用して合成
		CALL カラーブレンド取得(カラーマトリクス, カラーブレンド名, アルファ値)
		GDRAWSPRITE TEMP_グラフィックID, スプライト名, POS_X, POS_Y,  横幅, 縦幅, カラーマトリクス:0:0
		;DEBUGPRINTFORML 画像合成：%スプライト名%:{TEMP_グラフィックID},{POS_X},{POS_Y},{横幅},{縦幅},%カラーブレンド名%
	ENDIF
	GDRAWGWITHROTATE グラフィックID, TEMP_グラフィックID, 回転角
	;DEBUGPRINTFORML TEMP_グラフィックID, グラフィックID, 回転角 {TEMP_グラフィックID}, {グラフィックID}, {回転角}
	LOCAL = RESULT

	;次レイヤー以降の角度の基準値が変わるっぽいので、逆回転させた空画像で打ち消す
	GCLEAR TEMP_グラフィックID, 0x00000000
	GDRAWGWITHROTATE グラフィックID, TEMP_グラフィックID, 回転角 * -1
	GDISPOSE TEMP_グラフィックID

	SIF LOCAL == 0
		RETURN 0
	RETURN 1
ENDIF

IF カラーブレンド名 == ""
	GDRAWSPRITE グラフィックID, スプライト名, POS_X, POS_Y,  横幅, 縦幅
	;DEBUGPRINTFORML 画像合成：%スプライト名%:{グラフィックID},{POS_X},{POS_Y},{横幅},{縦幅}
ELSE
	;カラーブレンドが設定されている場合、適用して合成
	CALL カラーブレンド取得(カラーマトリクス, カラーブレンド名, アルファ値)
	GDRAWSPRITE グラフィックID, スプライト名, POS_X, POS_Y,  横幅, 縦幅, カラーマトリクス:0:0
	;DEBUGPRINTFORML 画像合成：%スプライト名%:{グラフィックID},{POS_X},{POS_Y},{横幅},{縦幅},%カラーブレンド名%
ENDIF
SIF RESULT == 0
	RETURN 0
RETURN 1

;********************************************************************************************
;画像カラーブレンド複製関数
;指定したスプライトを用いてカラーブレンドを施したものを複製する。
;この関数が呼ばれた場合、自動で参照するスプライト画像のサイズを取得して合わせる
;ブレンド名はリソースを合成する際に適用するカラーブレンドの名称を入れる　例="赤"　"無し"
;このスプライトを作成した際に生成されたGIDを削除する場合、複製先のスプライト名を画像廃棄関数に渡す
;********************************************************************************************
@画像複製(複製先スプライト名, 元スプライト名, カラーブレンド名 = "", アルファ値 = 256)
#DIM グラフィックID		;複製先のグラフィックID
#DIMS 元スプライト名		;複製元のスプライト名
#DIMS 複製先スプライト名	;複製先のスプライト名
#DIM 横幅					;複製するリソースの横幅
#DIM 縦幅					;複製するリソースの縦幅
#DIMS カラーブレンド名		;カラーブレンドの名称
#DIM カラーマトリクス, 5, 5	;カラーブレンドに使用するマトリクス
#DIM アルファ値				;カラーブレンドの不透明度
グラフィックID = 0
VARSET カラーマトリクス
SIF !SPRITECREATED(元スプライト名)
	;スプライトが存在しない場合0を返す
	RETURN 0
横幅 = SPRITEWIDTH(元スプライト名)
縦幅 = SPRITEHEIGHT(元スプライト名)

グラフィックID = グラフィックID確認(複製先スプライト名)
;複製先に同名スプライトのグラフィックが存在しない場合、グラフィックIDを新規取得する
IF !グラフィックID
	;前回呼び出されていれば続きから始める
	グラフィックID = NEXT_GID
	WHILE GCREATED(グラフィックID)
		;空いているグラフィックIDを走査する
		グラフィックID ++
	WEND
	;次回は続きから走査するように設定
	;NEXT_GID = グラフィックID + 1
ENDIF

GCREATE グラフィックID, 横幅, 縦幅
GPLグラフィックID:GPL保有GID数 = グラフィックID
GPLリソース名:GPL保有GID数 '= 複製先スプライト名
GPL保有GID数++
IF カラーブレンド名 == ""
	GDRAWSPRITE グラフィックID, 元スプライト名, 0, 0,  横幅, 縦幅
	;DEBUGPRINTFORML 画像合成：%元スプライト名%:{グラフィックID},0,0,{横幅},{縦幅}
ELSE
	;カラーブレンドを適用して複製
	CALL カラーブレンド取得(カラーマトリクス, カラーブレンド名, アルファ値)
	GDRAWSPRITE グラフィックID, 元スプライト名, 0, 0,  横幅, 縦幅, カラーマトリクス:0:0
	;DEBUGPRINTFORML 画像カラーブレンド複製：%元スプライト名%:%複製先スプライト名%:{グラフィックID},0,0,{横幅},{縦幅},%カラーブレンド名%,{アルファ値}
ENDIF
SPRITECREATE @"%複製先スプライト名%", グラフィックID, 0, 0, 横幅, 縦幅
SIF RESULT == 0
	RETURN 0
RETURN 1

;********************************************************************************************
;リソース新規作成関数
;引数に渡した名称のスプライトリソースを、第二引数に渡したグラフィックIDで作成する
;********************************************************************************************
@リソース登録(スプライト名, グラフィックID)
#DIMS スプライト名
#DIM グラフィックID
SIF SPRITECREATED(スプライト名)
	;すでにその名前のリソースが存在すると失敗する。
	RETURN 0
SIF !GCREATED(グラフィックID)
	;元となるグラフィックIDが未作成、または廃棄済みであった場合失敗する。
	RETURN 0
SPRITECREATE スプライト名, グラフィックID
;DEBUGPRINTFORML グラフィック番号「{グラフィックID}」に「%スプライト名%」を登録しました。
RETURN 1

;********************************************************************************************
;カラーブレンド取得関数
;カラーブレンド名を取得する関数
;カラーマトリクスの初期化関数はこの下にあります
;********************************************************************************************
@カラーブレンド取得(カラーマトリクス, カラーブレンド名, アルファ値 = 256)
#DIM REF カラーマトリクス, 0, 0	;使用するカラーマトリクスを格納する変数 参照渡し
#DIMS カラーブレンド名			;カラーブレンドの名称
#DIM アルファ値				;カラーブレンドの不透明度
SIF !カラーマトリクス初期化フラグ
	;今回起動時にカラーマトリクスが初期化されていない場合は初期化を行う
	CALL カラーマトリクス初期化
;カラーマトリクス参照変数にベースから取得したマトリクスを代入する
SELECTCASE カラーブレンド名
	CASE "白", "無し", "無", "0", "普通"
		CALL カラーマトリクス取得(カラーマトリクス, 0, アルファ値)
	CASE "黄"
		CALL カラーマトリクス取得(カラーマトリクス, 1, アルファ値)
	CASE "赤"
		CALL カラーマトリクス取得(カラーマトリクス, 2, アルファ値)
	CASE "緑"
		CALL カラーマトリクス取得(カラーマトリクス, 3, アルファ値)
	CASE "青"
		CALL カラーマトリクス取得(カラーマトリクス, 4, アルファ値)
	CASE "水"
		CALL カラーマトリクス取得(カラーマトリクス, 5, アルファ値)
		; CASE "白"
		; 	CALL カラーマトリクス取得(カラーマトリクス, 6, アルファ値)
	CASE "灰"
		CALL カラーマトリクス取得(カラーマトリクス, 7, アルファ値)
	CASE "黒"
		CALL カラーマトリクス取得(カラーマトリクス, 8, アルファ値)
	CASE "栗"
		CALL カラーマトリクス取得(カラーマトリクス, 9, アルファ値)
	CASE "桃"
		CALL カラーマトリクス取得(カラーマトリクス, 10, アルファ値)
	CASE "橙"
		CALL カラーマトリクス取得(カラーマトリクス, 11, アルファ値)
	CASE "褐色"
		CALL カラーマトリクス取得(カラーマトリクス, 13, アルファ値)
	CASE "黄色"
		CALL カラーマトリクス取得(カラーマトリクス, 14, アルファ値)
	CASE "日焼け"
		CALL カラーマトリクス取得(カラーマトリクス, 15, アルファ値)
	CASE "不健康"
		CALL カラーマトリクス取得(カラーマトリクス, 16, アルファ値)
	CASE "悪魔","青肌"
		CALL カラーマトリクス取得(カラーマトリクス, 17, アルファ値)
	CASE "影"
		CALL カラーマトリクス取得(カラーマトリクス, 18, アルファ値)
	CASE "カスタム"
		CALL カラーマトリクス取得(カラーマトリクス, 90, アルファ値)
	CASE "ミキサー"
		CALL カラーマトリクス取得(カラーマトリクス, 91, アルファ値)
	CASEELSE
		CALL カラーマトリクス取得(カラーマトリクス, 0, アルファ値)
ENDSELECT
RETURN 1

;********************************************************************************************
;カラーマトリクス取得関数
;ディクショナリーライブラリから引用
;********************************************************************************************
@カラーマトリクス取得(カラーマトリクス, MID, アルファ値 = 256)
#DIM REF カラーマトリクス, 0, 0
#DIM MID ;マトリクスID
#DIM アルファ値				;カラーブレンドの不透明度
FOR LOCAL, 0, 5
	FOR LOCAL:1, 0, 5
		カラーマトリクス:LOCAL:(LOCAL:1) = カラーマトリクスベース:MID:LOCAL:(LOCAL:1)
	NEXT
NEXT
;不透明度を上書き設定
カラーマトリクス:3:3 = アルファ値
RETURN 1

;********************************************************************************************
;カラーマトリクスプリセット
;********************************************************************************************
@カラーマトリクス初期化
#DIM _CNT
_CNT = 0;"白"
カラーマトリクスベース:_CNT:0:0 = 256,  0,  0,  0,  0;R
カラーマトリクスベース:_CNT:1:0 =   0,256,  0,  0,  0;G
カラーマトリクスベース:_CNT:2:0 =   0,  0,256,  0,  0;B
カラーマトリクスベース:_CNT:3:0 =   0,  0,  0,256,  0;A
カラーマトリクスベース:_CNT:4:0 =   0,  0,  0,  0,256;平行
_CNT = 1;"黄"
カラーマトリクスベース:_CNT:0:0 = 307,  0,  0,  0,  0;R
カラーマトリクスベース:_CNT:1:0 =   0,230,  0,  0,  0;G
カラーマトリクスベース:_CNT:2:0 =   0,  0,153,  0,  0;B
カラーマトリクスベース:_CNT:3:0 =   0,  0,  0,256,  0;A
カラーマトリクスベース:_CNT:4:0 =   0,  0,  0,  0,256;平行
_CNT = 2;"赤"
カラーマトリクスベース:_CNT:0:0 = 256,  0,  0,  0,  0;R
カラーマトリクスベース:_CNT:1:0 =   0, 80,  0,  0,  0;G
カラーマトリクスベース:_CNT:2:0 =   0,  0,110,  0,  0;B
カラーマトリクスベース:_CNT:3:0 =   0,  0,  0,256,  0;A
カラーマトリクスベース:_CNT:4:0 =   0,  0,  0,  0,256;平行
_CNT = 3;"緑"
カラーマトリクスベース:_CNT:0:0 = 100,  0,  0,  0,  0;R
カラーマトリクスベース:_CNT:1:0 =   0, 256,  0,  0,  0;G
カラーマトリクスベース:_CNT:2:0 =   0,  0,120,  0,  0;B
カラーマトリクスベース:_CNT:3:0 =   0,  0,  0,256,  0;A
カラーマトリクスベース:_CNT:4:0 =   0,  0,  0,  0,256;平行
_CNT = 4;"青"
カラーマトリクスベース:_CNT:0:0 = 100,  0,  0,  0,  0;R
カラーマトリクスベース:_CNT:1:0 =   0, 120,  0,  0,  0;G
カラーマトリクスベース:_CNT:2:0 =   0,  0,256,  0,  0;B
カラーマトリクスベース:_CNT:3:0 =   0,  0,  0,256,  0;A
カラーマトリクスベース:_CNT:4:0 =   0,  0,  0,  0,256;平行
_CNT = 5;"水"
カラーマトリクスベース:_CNT:0:0 = 080,  0,  0,  0,  0;
カラーマトリクスベース:_CNT:1:0 =   0,114,  0,  0,  0;
カラーマトリクスベース:_CNT:2:0 =   0,  0,178,  0,  0;
カラーマトリクスベース:_CNT:3:0 =   0,  0,  0,256,  0;
カラーマトリクスベース:_CNT:4:0 =   0,  0,  0,  0,256;
_CNT = 6;"白"//元絵が青一色だから
カラーマトリクスベース:_CNT:0:0 = 128,128,128,  0,  0;
カラーマトリクスベース:_CNT:1:0 = 128,128,128,  0,  0;
カラーマトリクスベース:_CNT:2:0 = 128,128,128,  0,  0;
カラーマトリクスベース:_CNT:3:0 =   0,  0,  0,256,  0;
カラーマトリクスベース:_CNT:4:0 =   0,  0,  0,  0,256;
_CNT = 7;"灰"
カラーマトリクスベース:_CNT:0:0 = 128,128,128,  0,  0;
カラーマトリクスベース:_CNT:1:0 = 128,128,128,  0,  0;
カラーマトリクスベース:_CNT:2:0 = 128,128,128,  0,  0;
カラーマトリクスベース:_CNT:3:0 =   0,  0,  0,256,  0;
カラーマトリクスベース:_CNT:4:0 = -64,-64,-64,  0,256;
_CNT = 8;"黒"
カラーマトリクスベース:_CNT:0:0 = 100,  0,  0,  0,  0;R
カラーマトリクスベース:_CNT:1:0 =   0,100,  0,  0,  0;G
カラーマトリクスベース:_CNT:2:0 =   0,  0,120,  0,  0;B
カラーマトリクスベース:_CNT:3:0 =   0,  0,  0,256,  0;A
カラーマトリクスベース:_CNT:4:0 =   0,  0,  0,  0,256;平行
_CNT = 9;"栗"
カラーマトリクスベース:_CNT:0:0 = 192, 0,  0,  0,  0;
カラーマトリクスベース:_CNT:1:0 =   0,116, 0,  0,  0;
カラーマトリクスベース:_CNT:2:0 =   0,  0,88,  0,  0;
カラーマトリクスベース:_CNT:3:0 =   0,  0,  0,256,  0;
カラーマトリクスベース:_CNT:4:0 =   0,  0,  0,  0,256;
_CNT = 10;"桃"
カラーマトリクスベース:_CNT:0:0 = 308,  0,  0,  0,  0;
カラーマトリクスベース:_CNT:1:0 =   0,220,  0,  0,  0;
カラーマトリクスベース:_CNT:2:0 =   0,  0,268,  0,  0;
カラーマトリクスベース:_CNT:3:0 =   0,  0,  0,256,  0;
カラーマトリクスベース:_CNT:4:0 =   0,  0,  0,  0,256;
_CNT = 11;"橙"
カラーマトリクスベース:_CNT:0:0 = 416,  0,  0,  0,  0;
カラーマトリクスベース:_CNT:1:0 =   0,236,  0,  0,  0;
カラーマトリクスベース:_CNT:2:0 =   0,  0,144,  0,  0;
カラーマトリクスベース:_CNT:3:0 =   0,  0,  0,256,  0;
カラーマトリクスベース:_CNT:4:0 =   0,  0,  0,  0,256;
_CNT = 12;"普通"
カラーマトリクスベース:_CNT:0:0 = 256,  0,  0,  0,  0;R
カラーマトリクスベース:_CNT:1:0 =   0,256,  0,  0,  0;G
カラーマトリクスベース:_CNT:2:0 =   0,  0,256,  0,  0;B
カラーマトリクスベース:_CNT:3:0 =   0,  0,  0,256,  0;A
カラーマトリクスベース:_CNT:4:0 =   0,  0,  0,  0,256;平行
_CNT = 13;"褐色" (1.0, 0.8, 0.7)
カラーマトリクスベース:_CNT:0:0 = 256,  0,  0,  0,  0;R
カラーマトリクスベース:_CNT:1:0 =   0,204,  0,  0,  0;G
カラーマトリクスベース:_CNT:2:0 =   0,  0,190,  0,  0;B
カラーマトリクスベース:_CNT:3:0 =   0,  0,  0,256,  0;A
カラーマトリクスベース:_CNT:4:0 =   0,  0,  0,  0,256;平行
_CNT = 14;"黄色" (1.05, 1.05, 1)
カラーマトリクスベース:_CNT:0:0 = 269,  0,  0,  0,  0;R
カラーマトリクスベース:_CNT:1:0 =   0,269,  0,  0,  0;G
カラーマトリクスベース:_CNT:2:0 =   0,  0,256,  0,  0;B
カラーマトリクスベース:_CNT:3:0 =   0,  0,  0,256,  0;A
カラーマトリクスベース:_CNT:4:0 =   0,  0,  0,  0,256;平行
_CNT = 15;"日焼" (1.2, 0.95, 0.95)
カラーマトリクスベース:_CNT:0:0 = 308,  0,  0,  0,  0;R
カラーマトリクスベース:_CNT:1:0 =   0,244,  0,  0,  0;G
カラーマトリクスベース:_CNT:2:0 =   0,  0,244,  0,  0;B
カラーマトリクスベース:_CNT:3:0 =   0,  0,  0,256,  0;A
カラーマトリクスベース:_CNT:4:0 =   0,  0,  0,  0,256;平行
_CNT = 16;"不健康" (1.2, 1.05, 1.2)
カラーマトリクスベース:_CNT:0:0 = 308,  0,  0,  0,  0;R
カラーマトリクスベース:_CNT:1:0 =   0,269,  0,  0,  0;G
カラーマトリクスベース:_CNT:2:0 =   0,  0,308,  0,  0;B
カラーマトリクスベース:_CNT:3:0 =   0,  0,  0,256,  0;A
カラーマトリクスベース:_CNT:4:0 =   0,  0,  0,  0,256;平行
_CNT = 17;"悪魔" (0.75, 0.75, 1.5)
カラーマトリクスベース:_CNT:0:0 = 192,  0,  0,  0,  0;R
カラーマトリクスベース:_CNT:1:0 =   0,192,  0,  0,  0;G
カラーマトリクスベース:_CNT:2:0 =   0,  0,384,  0,  0;B
カラーマトリクスベース:_CNT:3:0 =   0,  0,  0,256,  0;A
カラーマトリクスベース:_CNT:4:0 =   0,  0,  0,  0,256;平行
_CNT = 18;"影"
カラーマトリクスベース:_CNT:0:0 =   0,  0,  0,  0,  0;R
カラーマトリクスベース:_CNT:1:0 =   0,  0,  0,  0,  0;G
カラーマトリクスベース:_CNT:2:0 =   0,  0,  0,  0,  0;B
カラーマトリクスベース:_CNT:3:0 =   0,  0,  0,256,  0;A
カラーマトリクスベース:_CNT:4:0 =  40, 40, 40,  0,256;平行

カラーマトリクス初期化フラグ = 1
RETURN 1

@カスタムカラーマトリクス設定(COL_R, COL_G, COL_B)
#DIM COL_R
#DIM COL_G
#DIM COL_B
#DIM CONST C_MID = 90
カラーマトリクスベース:C_MID:0:0 = COL_R,  0,  0,  0,  0;R
カラーマトリクスベース:C_MID:1:0 =   0,COL_G,  0,  0,  0;G
カラーマトリクスベース:C_MID:2:0 =   0,  0,COL_B,  0,  0;B
カラーマトリクスベース:C_MID:3:0 =   0,  0,  0,256,  0;A
カラーマトリクスベース:C_MID:4:0 =   0,  0,  0,  0,256;平行

@カラーマトリクスミキサー設定(CHARA_ID, PARTS_IDX, PRESET_IDX)
#DIM CHARA_ID
#DIM PARTS_IDX
#DIM PRESET_IDX
#DIM DYNAMIC MIXER, 3, 3
#DIM DYNAMIC ITER_I
#DIM DYNAMIC ITER_J
#DIM  CONST C_MID = 91
#DIMS CONST MIXER_NAME = "R", "G", "B"

FOR ITER_I, 0, 3
	FOR ITER_J, 0, 3
		MIXER:ITER_I:ITER_J = FTIMES(256, GETVAR(@"COLOR_MIXER_%MIXER_NAME:ITER_J%_{ITER_I}:{CHARA_ID}:{PARTS_IDX}:{PRESET_IDX}"))
	NEXT
NEXT

カラーマトリクスベース:C_MID:0:0 = (MIXER:0:0),  (MIXER:0:1),  (MIXER:0:2),  0,  0;R
カラーマトリクスベース:C_MID:1:0 = (MIXER:1:0),  (MIXER:1:1),  (MIXER:1:2),  0,  0;G
カラーマトリクスベース:C_MID:2:0 = (MIXER:2:0),  (MIXER:2:1),  (MIXER:2:2),  0,  0;B
カラーマトリクスベース:C_MID:3:0 =   0,  0,  0,256,  0;A
カラーマトリクスベース:C_MID:4:0 =   0,  0,  0,  0,256;平行

path: ERB/SYSTEM/LIBRARY/グラフィック表示ライブラリ/グラフィック合成.ERB


code:
;********************************************************************************************
;2020/4/18 作成 ロウ@TW夢子口上の人
;
;Licence  :ライセンスフリー(CC0)。
;
;グラフィック表示簡易化ライブラリ
;なんかややこしいグラフィック表示関連を簡単に表示できるようにまとめたもの。
;HTMLもどきだし、可読性悪いし、冗長なので「もう画像指定したら縦幅とか勝手に揃えろよ」っていうことで作りました。
;このERBは画像分割、およびアニメーションを作成するためのものです。
;********************************************************************************************

;********************************************************************************************
;グラフィックID登録関数
;これを呼ぶとグラフィックを一つ作成でき、戻り値でそのIDを取得できる。
;作るだけなので中身は空っぽ。
;自動走査でグラフィックIDを作成したい場合に使用する。
;********************************************************************************************
@グラフィックID登録(WIDTH, HEIGHT)
#FUNCTION
#DIM グラフィックID
#DIM WIDTH
#DIM HEIGHT
;前回呼び出されていれば続きから始める
グラフィックID = NEXT_GID
WHILE GCREATED(グラフィックID)
	;空いているグラフィックIDを走査する
	グラフィックID ++
WEND
;次回は続きから走査するように設定
;NEXT_GID = グラフィックID + 1
;グラフィックの取り込み
IF !GCREATE(グラフィックID, WIDTH, HEIGHT)
	DEBUGPRINTFORML グラフィックの作成に失敗しました。
	RETURNF 0
ENDIF
;DEBUGPRINTFORML グラフィック番号「{グラフィックID}」を登録しました。
RETURNF グラフィックID

;********************************************************************************************
;グラフィックID確認関数
;これを呼ぶと指定した、戻り値でそのIDを取得できる。
;********************************************************************************************
@グラフィックID確認(リソース名)
#FUNCTION
#DIM グラフィックID
#DIMS リソース名
グラフィックID = 0
;リソースが登録されている場合、そのグラフィックIDを取得する
FOR LOCAL, 0, GPL保有GID数
	SIF GPLリソース名:LOCAL == ""
		BREAK
	IF GPLリソース名:LOCAL == リソース名
		グラフィックID = GPLグラフィックID:LOCAL
		LOCAL-- ;BREAK時に何故か再び加算されてしまうのでデクリメント
		BREAK
	ENDIF
NEXT
RETURNF グラフィックID

;********************************************************************************************
;ファイルグラフィック生成用関数
;一枚の画像からグラフィックを生成して保存する。
;********************************************************************************************
@ファイルグラフィック生成(グラフィックID, リソースファイル名)
#DIM REF グラフィックID		;リソースを登録するグラフィックID
#DIMS リソースファイル名		;参照するリソースファイル名称

;グラフィックIDがまだ作成されていないなら新規登録する
IF グラフィックID == 0 || !GCREATED(グラフィックID)
	;前回呼び出されていれば続きから始める
	グラフィックID = NEXT_GID
	WHILE GCREATED(グラフィックID)
		;空いているグラフィックIDを走査する
		グラフィックID ++
	WEND
	;次回は続きから走査するように設定
	;NEXT_GID = グラフィックID + 1
ENDIF

;グラフィックの取り込み
IF !GCREATEFROMFILE(グラフィックID, リソースファイル名)
	DEBUGPRINTFORML グラフィックの作成に失敗しました。
	DEBUGPRINTFORML リソースが見つからなかった可能性があります。
	RETURN 0
ENDIF
GPLグラフィックID:GPL保有GID数 = グラフィックID
GPLリソース名:GPL保有GID数 '= リソースファイル名
GPL保有GID数++
DEBUGPRINTFORML グラフィック番号「{グラフィックID}」に「%リソースファイル名%」を登録しました。

RETURN 1

;********************************************************************************************
;スプライト生成用関数
;一枚の画像からグラフィックを生成し、同時にリソースとして保存する。
;つまりリソースの画像のCSV表記をせずとも、動的にスプライトを登録する。
;既に読んだことのあるリソースファイル名を記述した場合はグラフィックIDを発行せずに既存のGIDを使用する。
;登録したスプライト名は以後通常の画像と同じように使用することができる。
;********************************************************************************************
@スプライト生成(リソースファイル名, 出力スプライト名, 始点X = 0, 始点Y = 0, 横幅 = 0, 縦幅 = 0)
#DIM DYNAMIC グラフィックID = 1		;リソースを登録するグラフィックID
#DIMS リソースファイル名		;参照するリソースファイル名称
#DIMS 出力スプライト名	;出力するスプライト（内部用画像）の名称
#DIM 始点X				;スプライト作成時の始点X座標
#DIM 始点Y				;スプライト作成時の始点Y座標
#DIM 横幅				;スプライト作成時の終点X座標
#DIM 縦幅				;スプライト作成時の終点Y座標

;指定したスプライト名で既に生成されている場合は関数を終了する -> 既成スプライトを廃棄する
IF SPRITECREATED(@"%出力スプライト名%")
	SPRITEDISPOSE 出力スプライト名
ENDIF
;既に読み込まれているリソースファイル名である場合、そのグラフィックIDを使用する
FOR LOCAL, 0, GPL保有GID数
	SIF GPLリソース名:LOCAL == ""
		BREAK
	IF GPLリソース名:LOCAL == リソースファイル名
		グラフィックID = GPLグラフィックID:LOCAL
		LOCAL-- ;BREAK時に何故か再び加算されてしまうのでデクリメント
		BREAK
	ENDIF
NEXT
;グラフィックIDがまだ作成されていないなら新規登録する
IF LOCAL == GPL保有GID数
	;前回呼び出されていれば続きから始める
	;グラフィックID = NEXT_GID
	WHILE GCREATED(グラフィックID)
		;空いているグラフィックIDを走査する
		グラフィックID ++
	WEND
	;;次回は続きから走査するように設定
	;NEXT_GID = グラフィックID + 1
	;グラフィックの取り込み
	IF !GCREATEFROMFILE(グラフィックID, リソースファイル名)
		DEBUGPRINTFORML %リソースファイル名%のグラフィックの作成に失敗しました。
		DEBUGPRINTFORML リソースが見つからなかった可能性があります。
		RETURN 0
	ENDIF
	;DEBUGPRINTFORML グラフィックID = {グラフィックID}
	GPLグラフィックID:GPL保有GID数 = グラフィックID
	GPLリソース名:GPL保有GID数 '= 出力スプライト名
	GPL保有GID数++
	;DEBUGPRINTFORML グラフィック番号「{グラフィックID}」に「%出力スプライト名%」を登録しました。
ENDIF

;スプライト作成 サイズ指定されていない場合はグラフィック全体をスプライトにする
IF 横幅 == 0 || 縦幅 == 0
	GWIDTH グラフィックID
	横幅 = RESULT
	GHEIGHT グラフィックID
	縦幅 = RESULT
ENDIF
SPRITECREATE @"%出力スプライト名%", グラフィックID, 始点X, 始点Y, 横幅, 縦幅
;DEBUGPRINTFORML スプライト「%出力スプライト名%」を生成しました。({横幅},{縦幅})
RETURN 1

;********************************************************************************************
;四角形スプライト生成用関数
;四角形のスプライトを生成し、リソースとして保存する。
;既に読んだことのあるスプライト名を記述した場合は何もせずに終了する。
;登録したスプライト名は以後通常の画像と同じように使用することができる。
;********************************************************************************************
@四角形スプライト生成(出力スプライト名, 横幅, 縦幅, 指定色)
#DIM グラフィックID		;リソースを登録するグラフィックID
#DIMS リソースファイル名		;参照するリソースファイル名称
#DIMS 出力スプライト名	;出力するスプライト（内部用画像）の名称
#DIM 横幅				;スプライト作成時の終点X座標
#DIM 縦幅				;スプライト作成時の終点Y座標
#DIM 指定色				;四角形描画時のARGB
グラフィックID = 0
IF !SPRITECREATED(出力スプライト名)
	;スプライトがまだ作成されていないなら新規登録する
	グラフィックID = グラフィックID登録(横幅, 縦幅)
	GSETBRUSH グラフィックID, 指定色
	GFILLRECTANGLE グラフィックID, 0, 0, 横幅, 縦幅
	SPRITECREATE 出力スプライト名, グラフィックID
	GPLグラフィックID:GPL保有GID数 = グラフィックID
	GPLリソース名:GPL保有GID数 '= 出力スプライト名
	GPL保有GID数++
	;CNO++
	DEBUGPRINTFORML 四角形スプライト「%出力スプライト名%」を登録しました。
ENDIF

;********************************************************************************************
;画像廃棄用関数
;保存されたグラフィックをメモリから解放する。
;指定する方法は対象のリソースファイル名を格納した変数、もしくは配列を引数に渡すこと。
;また、複製を行った場合は複製した先のスプライト名を格納した変数、もしくは配列を引数に渡すこと。
;本ライブラリは大文字小文字のあいまい判定を行わないため、その点を注意してください。
;なお、この関数では本ライブラリで作成したグラフィック以外は廃棄することができない。
;本ライブラリ外で作成されたグラフィックの廃棄は自前でGDISPOSEを行うこと。
;********************************************************************************************
@画像廃棄(リソースファイル名)
#DIM グラフィックID		;リソースを登録するグラフィックID
#DIMS REF リソースファイル名		;参照するリソースファイル名称
;既に読み込まれているリソースファイル名を探し、そのグラフィックIDを使用する
LOCAL:1 = 0
WHILE リソースファイル名:(LOCAL:1) != ""
	;DEBUGPRINTFORML %リソースファイル名:(LOCAL:1)%
	;ライブラリによって登録されたGIDに対象の名称があるかチェック
	FOR LOCAL, 0, GPL保有GID数
		SIF GPLリソース名:LOCAL == ""
			BREAK
		IF GPLリソース名:LOCAL == リソースファイル名:(LOCAL:1)
			グラフィックID = GPLグラフィックID:LOCAL
			;グラフィック廃棄
			SPRITEDISPOSE GPLリソース名:LOCAL
			;DEBUGPRINTFORML スプライト名「%GPLリソース名:LOCAL%」を廃棄しました。

			ARRAYREMOVE GPLリソース名, LOCAL, 1
			ARRAYREMOVE GPLグラフィックID, LOCAL, 1
			GPL保有GID数--
			GDISPOSE グラフィックID
			;DEBUGPRINTFORML グラフィックID「{グラフィックID}」を廃棄しました。
			LOCAL--
			;BREAK
		ENDIF
	NEXT
	SIF VARSIZE("リソースファイル名") == 1
		BREAK
	;グラフィックIDが見つからなかったら次のループへ
	;IF LOCAL >= GPL保有GID数
	;	LOCAL:1++
	;	CONTINUE
	;ENDIF
	LOCAL:1++
WEND
RETURN 1

;********************************************************************************************
;全画像廃棄用関数
;本ライブラリで作成したグラフィックを全てメモリから解放する。
;なお、この関数では本ライブラリで作成したグラフィック以外は廃棄することができない。
;本ライブラリ外で作成されたグラフィックの廃棄は自前でGDISPOSEを行うこと。
;********************************************************************************************
@全画像廃棄
#DIM グラフィックID		;リソースを登録するグラフィックID
WHILE GPL保有GID数 > 0
	;グラフィック廃棄
	SPRITEDISPOSE GPLリソース名:LOCAL
	DEBUGPRINTFORML スプライト名「%GPLリソース名:0%」を廃棄しました。

	グラフィックID = GPLグラフィックID:0
	ARRAYREMOVE GPLリソース名, 0, 1
	ARRAYREMOVE GPLグラフィックID, 0, 1
	GPL保有GID数--
	GDISPOSE グラフィックID
	DEBUGPRINTFORML グラフィックID「{グラフィックID}」を廃棄しました。
WEND
VARSET GPLグラフィックID
VARSET GPLリソース名

RETURN 1

;********************************************************************************************
;バッファ画像廃棄用関数
;本ライブラリで作成した、スプライトを元に派生作成されたグラフィックを全てメモリから解放する。
;これは拡大、縮小されたグラフィックを指す
;この関数はライブラリを用いてグラフィック描画をしている場合に、定期的に呼ばれるべきである。
;なお、この関数では本ライブラリで作成したグラフィック以外は廃棄することができない。
;本ライブラリ外で作成されたグラフィックの廃棄は自前でGDISPOSEを行うこと。
;********************************************************************************************
@バッファ画像廃棄
#DIM グラフィックID		;リソースを登録するグラフィックID
;ライブラリによって登録されたGIDがバッファであるかチェックして廃棄
FOR LOCAL, 0, GPL保有GID数
	IF SUBSTRING(GPLリソース名:LOCAL, 0, 7) == "[[BUF]]"
		;グラフィック廃棄
		SPRITEDISPOSE GPLリソース名:LOCAL
		;DEBUGPRINTFORML スプライト名「%GPLリソース名:LOCAL%」を廃棄しました。

		グラフィックID = GPLグラフィックID:LOCAL
		ARRAYREMOVE GPLリソース名, LOCAL, 1
		ARRAYREMOVE GPLグラフィックID, LOCAL, 1
		GPL保有GID数--
		GDISPOSE グラフィックID
		;DEBUGPRINTFORML グラフィックID「{グラフィックID}」を廃棄しました。
		LOCAL--
	ENDIF
NEXT
RETURN 1

;********************************************************************************************
;連番画像生成用関数
;一枚の画像から複数のスプライトを等間隔で分割し、リソースとして保存する。
;つまり、リソースの画像のCSV表記をせずとも、自動で指定した数に分割してスプライトに登録する。
;登録されたスプライトは、『[スプライト名]_[連番]』としてスプライト登録される。(連番は1始まり)
;登録したスプライト名は以後通常の画像と同じように使用することができる。
;********************************************************************************************
@連番画像生成(リソースファイル名, 出力スプライト名, 縦分割数, 横分割数)
#DIM DYNAMIC グラフィックID		;リソースを登録するグラフィックID
#DIMS リソースファイル名		;参照するリソースファイル名称
#DIMS 出力スプライト名	;出力するスプライト（内部用画像）の名称
#DIM 縦分割数			;リソース画像を縦に分割する数 1～
#DIM 横分割数			;リソース画像を横に分割する数 1～
#DIM 分割縦幅			;リソースの縦幅から割り出した分割後のスプライトの縦幅
#DIM 分割横幅			;リソースの横幅から割り出した分割後のスプライトの横幅

;指定したスプライト名で既に連番生成されている場合は関数を終了する
SIF SPRITECREATED(@"%出力スプライト名%_1")
	RETURN 0

;分割数に1以外が設定された場合の対処
SIF 縦分割数 < 1
	縦分割数 = 1
SIF 横分割数 < 1
	横分割数 = 1

;前回呼び出されていれば続きから始める
グラフィックID = NEXT_GID
WHILE GCREATED(グラフィックID)
	;空いているグラフィックIDを走査する
	グラフィックID ++
WEND
;次回は続きから走査するように設定
;NEXT_GID = グラフィックID + 1
;グラフィックの取り込み
IF !GCREATEFROMFILE(グラフィックID, リソースファイル名)
	DEBUGPRINTFORML グラフィックの作成に失敗しました。
	DEBUGPRINTFORML リソースファイルが見つからなかった可能性があります。
	RETURN 0
ENDIF
GPLグラフィックID:GPL保有GID数 = グラフィックID
GPLリソース名:GPL保有GID数 '= リソースファイル名
GPL保有GID数++
DEBUGPRINTFORML グラフィック番号「{グラフィックID}」に「%リソースファイル名%」を登録しました。

;作成するスプライトの縦幅を取得
分割縦幅 = GHEIGHT(グラフィックID) / 縦分割数
;作成するスプライトの横幅を取得
分割横幅 = GWIDTH(グラフィックID) / 横分割数

;スプライトを生成
LOCAL:3 = 0
FOR LOCAL, 0, 縦分割数
	FOR LOCAL:1, 0, 横分割数
		LOCAL:3 ++
		IF !SPRITECREATED(@"%出力スプライト名%_{LOCAL:3}")
			SPRITECREATE @"%出力スプライト名%_{LOCAL:3}", グラフィックID, LOCAL:1 * 分割横幅, LOCAL * 分割縦幅, 分割横幅, 分割縦幅
			DEBUGPRINTFORML スプライト「%出力スプライト名%_{LOCAL:3}」を生成しました。
		ENDIF
	NEXT
NEXT

RETURN 1

;********************************************************************************************
;アニメーションフレームレート設定用関数
;秒間に何回アニメーションの再描画を行うかを設定する関数。
;要はSETANIMETIMERをFRSに変換したもの。
;********************************************************************************************
@アニメフレームレート設定(フレームレート = 50)
#DIM フレームレート
SETANIMETIMER 1000 / フレームレート
アニメーションフレームレート = 1000 / フレームレート
return 1

;********************************************************************************************
;アニメーション画像生成用関数
;一枚の画像から複数のスプライトを等間隔で分割し、アニメーションとして保存する。
;つまり、リソースの画像のCSV表記をせずとも、自動で指定した数に分割してアニメーション登録する。
;登録したスプライト名は以後通常の画像と同じように使用することができる。
;（※アニメフレームレート設定、もしくはSETANIMETIMERを呼ばないとアニメーションは再生しません）
;********************************************************************************************
@アニメーション画像生成(リソースファイル名, 出力スプライト名, 縦分割数, 横分割数, 描画間隔, 折り返し = 0)
#DIM グラフィックID			;リソースを登録するグラフィックID
#DIMS リソースファイル名	;参照するリソースファイル名称
#DIMS 出力スプライト名		;出力するスプライト（内部用画像）の名称
#DIM 縦分割数				;リソース画像を縦に分割する数 1～
#DIM 横分割数				;リソース画像を横に分割する数 1～
#DIM 分割縦幅				;リソースの縦幅から割り出した分割後のスプライトの縦幅
#DIM 分割横幅				;リソースの横幅から割り出した分割後のスプライトの横幅
#DIM 描画間隔				;アニメーションフレーム描画の間隔（ミリ秒）
#DIM 折り返し				;リソース画像内でアニメーションが折り返すか否か

;指定したスプライト名で既に連番生成されている場合は関数を終了する
SIF SPRITECREATED(出力スプライト名)
	RETURN 0

;分割数に1以外が設定された場合の対処
SIF 縦分割数 < 1
	縦分割数 = 1
SIF 横分割数 < 1
	横分割数 = 1

;前回呼び出されていれば続きから始める
グラフィックID = NEXT_GID
WHILE GCREATED(グラフィックID)
	;空いているグラフィックIDを走査する
	グラフィックID ++
WEND
;次回は続きから走査するように設定
;NEXT_GID = グラフィックID + 1
;グラフィックの取り込み
IF !GCREATEFROMFILE(グラフィックID, リソースファイル名)
	DEBUGPRINTFORML グラフィックの作成に失敗しました。
	DEBUGPRINTFORML リソースファイルが見つからなかった可能性があります。
	RETURN 0
ENDIF
GPLグラフィックID:GPL保有GID数 = グラフィックID
GPLリソース名:GPL保有GID数 '= リソースファイル名
GPL保有GID数++
DEBUGPRINTFORML グラフィック番号「{グラフィックID}」に「%リソースファイル名%」を登録しました。

;作成するスプライトの縦幅を取得
分割縦幅 = GHEIGHT(グラフィックID) / 縦分割数
;作成するスプライトの横幅を取得
分割横幅 = GWIDTH(グラフィックID) / 横分割数

;スプライトを生成
IF SPRITEANIMECREATE(出力スプライト名, 分割横幅, 分割縦幅)
	DEBUGPRINTFORML アニメーションスプライト「%出力スプライト名%」を生成しました。
ENDIF

LOCAL:3 = 0
FOR LOCAL, 0, 縦分割数
	FOR LOCAL:1, 0, 横分割数
		LOCAL:3 ++
		SPRITEANIMEADDFRAME 出力スプライト名, グラフィックID, LOCAL:1 * 分割横幅, LOCAL * 分割縦幅, 分割横幅, 分割縦幅, 0, 0, 描画間隔
		DEBUGPRINTFORML アニメーションスプライトにフレーム{LOCAL:3}を追加しました。
	NEXT
NEXT

IF 折り返し
	FOR LOCAL, 縦分割数 - 1, -1, -1
		FOR LOCAL:1, 横分割数 - 1, 0, -1
			LOCAL:3 ++
			SPRITEANIMEADDFRAME 出力スプライト名, グラフィックID, LOCAL:1 * 分割横幅, LOCAL * 分割縦幅, 分割横幅, 分割縦幅, 0, 0, 描画間隔
			DEBUGPRINTFORML アニメーションスプライトにフレーム{LOCAL:3}を追加しました。
		NEXT
	NEXT
ENDIF

RETURN 1

repo_name: pervysquirrelz/erafl

path: ERB/SYSTEM/LIBRARY/グラフィック表示ライブラリ/グラフィック生成.ERB

license: unknown


code:
;※GPL=Graphic Printing Library
#DIM CONST GPL最大保有GID数 = 5000			;このライブラリで保有できるグラフィックIDの数。必要に応じて増やして下さい。

#DIM GPL保有GID数							;現在保有しているグラフィックIDの数
#DIM GPLグラフィックID,GPL最大保有GID数		;このライブラリで作成したグラフィックID配列
#DIMS GPLリソース名,GPL最大保有GID数		;このライブラリで作成したグラフィックIDに紐づくファイル名配列
#DIM PPF									;PIXEL PER FONTSIZE 10倍の値なので使用時は計算後に10で割ること
#DIMS TEMP_HTML								;一時HTML保存用変数
#DIM TEMP_HTML_MAX_HEIGHT 					;一時最大縦幅取得用変数
#DIM カラーマトリクスベース, 99, 5, 5		;カラーマトリクス保管用変数
#DIM カラーマトリクス初期化フラグ			;カラーマトリクス初期化フラグ
#DIM NEXT_GID = 1							;グラフィックID走査用変数
#DIM 行ずれ回数								;連続描画で何故か行ずれが起きるので、その対策
#DIM アニメーションフレームレート			;読んで字の如く

path: ERB/SYSTEM/LIBRARY/グラフィック表示ライブラリ/グラフィック表示.ERH


code:
;********************************************************************************************
;2021/3/19 作成 ロウ@TW夢子口上の人
;
;Licence  :ライセンスフリー(CC0)。
;
;グラフィック表示簡易化ライブラリ G,CBG関連関数対応版
;なんかややこしいグラフィック表示関連を簡単に表示できるようにまとめたもの。
;GIDの管理とかいちいちめんどくさいし、解放忘れそうだし重複しそうだからっていうことで作りました。
;********************************************************************************************

;********************************************************************************************
;グラフィック背景表示関数
;これを呼ぶとリソースファイルをそのまま一枚表示できる
;このまま使用するとサイズが指定できないため、あまり便利ではないのでCBG画像表示Sの使用を推奨する。
;ぶっちゃけこの関数はリソースファイルを直接描画できるようにCBGSETGを呼んでいるだけです。
;********************************************************************************************
@CBG画像表示G(リソースファイル名, x座標, y座標, z座標 = -1)
#DIMS リソースファイル名	;参照するリソースファイル名称
#DIM x座標					;描画する際のx座標 左下基準
#DIM y座標					;描画する際のy座標 左下基準
#DIM z座標					;描画する際のz座標 0がテキスト描画領域 負数は手前を表す
#DIM グラフィックID			;使用するグラフィックID
;y座標を反転させる
y座標 = -y座標
;既に読み込まれているリソースファイル名である場合、そのグラフィックIDを使用する
FOR LOCAL, 0, GPL保有GID数
	SIF GPLリソース名:LOCAL == ""
		BREAK
	IF GPLリソース名:LOCAL == リソースファイル名
		グラフィックID = GPLグラフィックID:LOCAL
		LOCAL-- ;BREAK時に何故か再び加算されてしまうのでデクリメント
		BREAK
	ENDIF
NEXT
;グラフィックIDがまだ作成されていないなら新規登録する
IF LOCAL == GPL保有GID数
	;前回呼び出されていれば続きから始める
	グラフィックID = NEXT_GID
	WHILE GCREATED(グラフィックID)
		;空いているグラフィックIDを走査する
		グラフィックID ++
	WEND
	;次回は続きから走査するように設定
	NEXT_GID = グラフィックID + 1
	;グラフィックの取り込み
	IF !GCREATEFROMFILE(グラフィックID, リソースファイル名)
		DEBUGPRINTFORML グラフィックの作成に失敗しました。
		DEBUGPRINTFORML リソースが見つからなかった可能性があります。
		RETURN 0
	ENDIF
	GPLグラフィックID:GPL保有GID数 = グラフィックID
	GPLリソース名:GPL保有GID数 '= リソースファイル名
	GPL保有GID数++
	DEBUGPRINTFORML グラフィック番号「{グラフィックID}」に「%リソースファイル名%」を登録しました。
ENDIF
;グラフィックをクライアント領域に描画する
CBGSETG グラフィックID, x座標, y座標, z座標
RETURN 1

;********************************************************************************************
;スプライト背景表示関数
;これを呼ぶとサイズを指定した上でスプライトをクライアント領域に表示できる
;サイズを指定した場合は、新たなグラフィックIDの作成が必要になるため、廃棄対象となる
;z座標を使用して縦幅横幅を使用しない場合は0を入れます
;CBGSETSPRITE関数を便利に使いたいがための関数です
;********************************************************************************************
@CBG画像表示S(スプライト名, x座標, y座標, 横幅 = 0, 縦幅 = 0, z座標 = 1)
#DIMS スプライト名	;参照するリソースファイル名称
#DIM x座標					;描画する際のx座標 左下基準
#DIM y座標					;描画する際のy座標 左下基準
#DIM z座標					;描画する際のz座標 0がテキスト描画領域 負数は手前を表す
#DIM 横幅					;描画する際の横幅
#DIM 縦幅					;描画する際の縦幅
#DIM グラフィックID			;使用するグラフィックID
;指定したスプライト名が存在しない場合は関数を終了する
SIF !SPRITECREATED(@"%スプライト名%")
	RETURN 0
;y座標を反転させる
y座標 = -y座標
;縦幅横幅が指定されていた場合は新たにスプライトを作成する
IF !(縦幅 == 0 || 縦幅 == SPRITEHEIGHT(スプライト名)) && !(横幅 == 0 || 横幅 == SPRITEWIDTH(スプライト名))
	;同じ大きさのスプライトが登録されていない場合、グラフィックIDを新規登録する
	IF !SPRITECREATED(@"%スプライト名%_{横幅}_{縦幅}")
		;グラフィックIDを新規登録する
		;前回呼び出されていれば続きから始める
		グラフィックID = NEXT_GID
		WHILE GCREATED(グラフィックID)
			;空いているグラフィックIDを走査する
			グラフィックID ++
		WEND
		;次回は続きから走査するように設定
		NEXT_GID = グラフィックID + 1
		;グラフィックの取り込み
		GCREATE グラフィックID, 横幅, 縦幅
		IF RESULT == 0
			DEBUGPRINTFORML グラフィックの作成に失敗しました。
			RETURN 0
		ENDIF
		GDRAWSPRITE グラフィックID, スプライト名, 0, 0, 横幅, 縦幅
		GPLグラフィックID:GPL保有GID数 = グラフィックID
		GPLリソース名:GPL保有GID数 '= "[[BUF]]" + スプライト名 + "_" + TOSTR(縦幅) + "_" + TOSTR(横幅)
		GPL保有GID数++
		DEBUGPRINTFORML グラフィック番号「{グラフィックID}」に「%スプライト名%_{横幅}_{縦幅}」を登録しました。
		SPRITECREATE @"%スプライト名%_{横幅}_{縦幅}", グラフィックID
	ENDIF
	;グラフィックをクライアント領域に描画する
	CBGSETSPRITE @"%スプライト名%_{横幅}_{縦幅}", x座標, y座標, z座標
ELSE
	;縦幅横幅の設定が無いならそのまま描画する
	CBGSETSPRITE スプライト名, x座標, y座標, z座標
ENDIF
RETURN 1

;********************************************************************************************
;スプライト背景ボタン表示関数
;これを呼ぶとサイズを指定した上でスプライトを使用したボタンをクライアント領域に表示できる
;サイズを指定した場合は、新たなグラフィックIDの作成が必要になるため、廃棄対象となる
;z座標を使用して縦幅横幅を使用しない場合は0を入れます
;CBGSETBUTTONSPRITE関数を便利に使いたいがための関数です
;********************************************************************************************
@CBGボタン表示S(ボタン番号, スプライト名, スプライト名B, x座標, y座標, 横幅 = 0, 縦幅 = 0, z座標 = -1)
#DIM ボタン番号				;押下した際のボタン番号
#DIMS スプライト名			;参照するリソースファイル名称
#DIMS スプライト名B			;参照するリソースファイル名称
#DIMS 表示スプライト名		;参照するリソースファイル名称
#DIMS 表示スプライト名B		;参照するリソースファイル名称
#DIM x座標					;描画する際のx座標 左下基準
#DIM y座標					;描画する際のy座標 左下基準
#DIM z座標					;描画する際のz座標 0がテキスト描画領域 負数は手前を表す
#DIM 縦幅					;描画する際の縦幅
#DIM 横幅					;描画する際の横幅
#DIM グラフィックID			;使用するグラフィックID
;指定したスプライト名が存在しない場合は関数を終了する
SIF !SPRITECREATED(@"%スプライト名%") ||  !SPRITECREATED(@"%スプライト名B%")
	RETURN 0
;y座標を反転させる
y座標 = -y座標
;ボタンマップ用グラフィックが既にある場合、そのグラフィックIDを使用する
FOR LOCAL, 0, GPL保有GID数
	SIF GPLリソース名:LOCAL == ""
		BREAK
	IF GPLリソース名:LOCAL == "[[ボタンマップ]]"
		グラフィックID = GPLグラフィックID:LOCAL
		LOCAL-- ;BREAK時に何故か再び加算されてしまうのでデクリメント
		BREAK
	ENDIF
NEXT
;ボタンマップのグラフィックIDがまだ作成されていないなら新規登録する
IF LOCAL == GPL保有GID数
	;前回呼び出されていれば続きから始める
	グラフィックID = NEXT_GID
	WHILE GCREATED(グラフィックID)
		;空いているグラフィックIDを走査する
		グラフィックID ++
	WEND
	;次回は続きから走査するように設定
	NEXT_GID = グラフィックID + 1
	;グラフィックの作成
	GCREATE グラフィックID, CLIENTWIDTH(), CLIENTHEIGHT()
	GPLグラフィックID:GPL保有GID数 = グラフィックID
	GPLリソース名:GPL保有GID数 '= "[[ボタンマップ]]"
	GPL保有GID数++
	DEBUGPRINTFORML グラフィック番号「{グラフィックID}」に「[[ボタンマップ]]」を登録しました。
ENDIF

;ボタンマップに指定されたサイズとカラーの四角系を描画し、マップをセットする
GSETBRUSH グラフィックID, 0xFF000000 + ボタン番号
GFILLRECTANGLE グラフィックID, x座標, CLIENTHEIGHT() + y座標 - 縦幅, 横幅, 縦幅
CBGSETBMAPG グラフィックID

;縦幅横幅が指定されていた場合は新たにスプライトを作成する
IF !(縦幅 == 0 || 縦幅 == SPRITEHEIGHT(スプライト名)) && !(横幅 == 0 || 横幅 == SPRITEWIDTH(スプライト名))
	;同じ大きさのスプライトが登録されていない場合、グラフィックIDを新規登録する
	IF !SPRITECREATED(@"%スプライト名%_{横幅}_{縦幅}")
		;グラフィックIDを新規登録する
		;前回呼び出されていれば続きから始める
		グラフィックID = NEXT_GID
		WHILE GCREATED(グラフィックID)
			;空いているグラフィックIDを走査する
			グラフィックID ++
		WEND
		;次回は続きから走査するように設定
		NEXT_GID = グラフィックID + 1
		;グラフィックの取り込み
		GCREATE グラフィックID, 横幅, 縦幅
		IF RESULT == 0
			DEBUGPRINTFORML グラフィックの作成に失敗しました。
			RETURN 0
		ENDIF
		GDRAWSPRITE グラフィックID, スプライト名, 0, 0, 横幅, 縦幅
		GPLグラフィックID:GPL保有GID数 = グラフィックID
		GPLリソース名:GPL保有GID数 '= "[[BUF]]" + スプライト名 + "_" + TOSTR(縦幅) + "_" + TOSTR(横幅)
		GPL保有GID数++
		DEBUGPRINTFORML グラフィック番号「{グラフィックID}」に「%スプライト名%_{横幅}_{縦幅}」を登録しました。
		SPRITECREATE @"%スプライト名%_{横幅}_{縦幅}", グラフィックID
	ENDIF
	表示スプライト名 '= スプライト名 + "_" + TOSTR(縦幅) + "_" + TOSTR(横幅)
ELSE
	;縦幅横幅の設定が無いならそのまま描画する
	表示スプライト名 '= スプライト名
ENDIF

IF !(縦幅 == 0 || 縦幅 == SPRITEHEIGHT(スプライト名B)) && !(横幅 == 0 || 横幅 == SPRITEWIDTH(スプライト名B))
	;同じ大きさのスプライトが登録されていない場合、グラフィックIDを新規登録する
	IF !SPRITECREATED(@"%スプライト名B%_{横幅}_{縦幅}")
		;グラフィックIDを新規登録する
		;前回呼び出されていれば続きから始める
		グラフィックID = NEXT_GID
		WHILE GCREATED(グラフィックID)
			;空いているグラフィックIDを走査する
			グラフィックID ++
		WEND
		;次回は続きから走査するように設定
		NEXT_GID = グラフィックID + 1
		;グラフィックの取り込み
		GCREATE グラフィックID, 横幅, 縦幅
		IF RESULT == 0
			DEBUGPRINTFORML グラフィックの作成に失敗しました。
			RETURN 0
		ENDIF
		GDRAWSPRITE グラフィックID, スプライト名B, 0, 0, 横幅, 縦幅
		GPLグラフィックID:GPL保有GID数 = グラフィックID
		GPLリソース名:GPL保有GID数 '= "[[BUF]]" + スプライト名B + "_" + TOSTR(縦幅) + "_" + TOSTR(横幅)
		GPL保有GID数++
		DEBUGPRINTFORML グラフィック番号「{グラフィックID}」に「%スプライト名B%_{横幅}_{縦幅}」を登録しました。
		SPRITECREATE @"%スプライト名B%_{横幅}_{縦幅}", グラフィックID
	ENDIF
	表示スプライト名B '= スプライト名B + "_" + TOSTR(縦幅) + "_" + TOSTR(横幅)
ELSE
	;縦幅横幅の設定が無いならそのまま描画する
	表示スプライト名B '= スプライト名B
ENDIF

;グラフィックをクライアント領域に描画する
CBGSETBUTTONSPRITE ボタン番号, 表示スプライト名, 表示スプライト名B, x座標, y座標, z座標
RETURN 1

;********************************************************************************************
;スプライト背景ボタン押下チェック関数
;これを呼ぶとCBGボタン表示Sで作成したボタンを押下した値を返す
;GETKEY(0x01)を使用してマウスの左クリックを感知しているため、使用箇所に注意すること
;********************************************************************************************
@CBGボタン判定(判定消去フラグ = 0)
#FUNCTION
#DIM 判定消去フラグ			;このフラグが立っている場合、ボタンマップIDとの紐づけを消去してもう一度探す
#DIM ボタンマップID = -1	;一度判定を行うと、判定を行ったボタンマップのIDを保存する
#DIM 判定数値
判定数値 = -1
SIF 判定消去フラグ
	ボタンマップID = -1
IF ボタンマップID == -1
	;ボタンマップ用グラフィックを探し、そのグラフィックIDを使用する
	FOR LOCAL, 0, GPL保有GID数
		SIF GPLリソース名:LOCAL == ""
			BREAK
		IF GPLリソース名:LOCAL == "[[ボタンマップ]]"
			ボタンマップID = GPLグラフィックID:LOCAL
			LOCAL-- ;BREAK時に何故か再び加算されてしまうのでデクリメント
			BREAK
		ENDIF
	NEXT
	;ボタンマップのグラフィックIDがまだ作成されていない場合は終了する
	SIF LOCAL == GPL保有GID数
		RETURNF 0
ENDIF
;左クリックされた時にボタンマップの、現在マウスポインタがある部分の色を取る
IF GETKEY(0x01)
	判定数値 =  GGETCOLOR(ボタンマップID, MOUSEX(), LIMIT(CLIENTHEIGHT() + MOUSEY(), 0, CLIENTHEIGHT())) - 0xFF000000
	;DEBUGPRINTFORML 色取得：{GGETCOLOR(ボタンマップID, MOUSEX(), LIMIT(CLIENTHEIGHT() + MOUSEY(), 0, CLIENTHEIGHT())) - 0xFF000000}
ENDIF
RETURNF 判定数値

;********************************************************************************************
;背景画像表示終了関数
;これを呼ぶと背景表示した画像を全て、もしくは指定した2つのZ座標の範囲全ての画像表示を終了する
;これが呼ばれないとグラフィック破棄まで背景画像は常に表示されっぱなしになる
;********************************************************************************************
@CBG表示終了(z座標1 = 9999, z座標2 = 9999)
#DIM z座標1					;描画する際のz座標 0がテキスト描画領域 負数は手前を表す
#DIM z座標2					;同上
IF z座標1 == 9999 && z座標2 == 9999
	CBGCLEAR
ELSEIF z座標1 < 9999 && z座標2 == 9999
	CBGREMOVERANGE z座標1, z座標1
ELSE
	CBGREMOVERANGE z座標1, z座標2
ENDIF

path: ERB/SYSTEM/LIBRARY/グラフィック表示ライブラリ/グラフィック表示G.ERB


code:
;********************************************************************************************
;2019/8/14 作成 ロウ@TW夢子口上の人
;
;Licence  :ライセンスフリー(CC0)。
;
;グラフィック表示簡易化ライブラリ
;なんかややこしいグラフィック表示関連を簡単に表示できるようにまとめたもの。
;HTMLもどきだし、可読性悪いし、冗長なので「もう画像指定したら縦幅とか勝手に揃えろよ」っていうことで作りました。
;********************************************************************************************

;********************************************************************************************
;画像表示用関数
;これを呼べば画像の縦横計算とかややこしいことしないで画像を一枚表示できる
;横位置は左揃えの場合は左端から、右揃えの場合は右端から指定したピクセル数分間隔を空ける
;画像反転フラグは 1:横反転 2：縦反転 3:縦横反転
;********************************************************************************************
@画像表示(画像名, 表示位置, 縦位置, 横位置, 拡大比率 = 100, 自動改行 = 0, ボタン生成 = 0, VALUE = "", TITLE = "", マウスオーバー画像名 = "", 画像反転フラグ = 0)
#DIMS 画像名				;リソース名
#DIMS マウスオーバー画像名	;マウスオーバー時に表示する画像名 省略可
#DIMS 表示位置				;表示位置指定文字列
#DIM  縦位置				;ピクセル指定 内部でフォントサイズ基準のパーセンテージに変換する
#DIM  横位置				;上に同じ
#DIM  自動改行				;自動改行有無フラグ デフォルトはしない
#DIM  拡大比率				;パーセンテージ指定 指定しなければ100
#DIM  ボタン生成			;ボタンとして使用するか デフォルトはしない
#DIMS  VALUE				;ボタンのバリュー
#DIMS  TITLE				;マウスオーバー時に表示する文字列
#DIM  画像反転フラグ		;画像反転を行うかのフラグ
#DIMS  表示HTML
IF SPRITECREATED(画像名)
	表示HTML =
	表示HTML += @"%画像表示位置HTML(表示位置)%"
	SIF GROUPMATCH(表示位置, "LEFT", "left", "左")
		表示HTML += @"%横位置HTML(横位置)%"
	SIF ボタン生成
		表示HTML += @"%ボタン生成HTML(VALUE, TITLE)%"
	表示HTML += @"%画像表示単独HTML(画像名, 縦位置, マウスオーバー画像名, 拡大比率, 画像反転フラグ)%"
	SIF ボタン生成
		表示HTML += @"</button>"
	SIF GROUPMATCH(表示位置, "RIGHT", "right", "右")
		表示HTML += @"%横位置HTML(横位置)%"
	;DEBUGPRINTFORML %表示HTML%
	HTML_PRINT 表示HTML

	IF 自動改行
		CALL PX_NEWLINE(縦位置 + SPRITEHEIGHT(画像名) * 拡大比率 / 100)
		行ずれ回数 = 0
	ELSE
		行ずれ回数++
	ENDIF
ELSE
	RETURN 0
ENDIF
RETURN 1

;********************************************************************************************
;画像表示用関数 ピクセル指定バージョン
;画像反転フラグは 1:横反転 2：縦反転 3:縦横反転
;********************************************************************************************
@画像表示_P(画像名, 表示位置, 縦位置, 横位置, 横幅, 縦幅, 自動改行 = 0, ボタン生成 = 0, VALUE = "", TITLE = "", マウスオーバー画像名 = "", 画像反転フラグ = 0)
#DIMS 画像名				;リソース名
#DIMS マウスオーバー画像名	;マウスオーバー時に表示する画像名 省略可
#DIMS 表示位置				;表示位置指定文字列
#DIM  縦位置				;ピクセル指定 内部でフォントサイズ基準のパーセンテージに変換する
#DIM  横位置				;上に同じ
#DIM  横幅					;表示画像のピクセル
#DIM  縦幅					;上に同じ
#DIM  自動改行				;自動改行有無フラグ デフォルトはしない
#DIM  ボタン生成			;ボタンとして使用するか デフォルトはしない
#DIMS  VALUE				;ボタンのバリュー
#DIMS  TITLE				;マウスオーバー時に表示する文字列
#DIM  画像反転フラグ		;画像反転を行うかのフラグ
#DIMS  表示HTML
IF SPRITECREATED(画像名)
	表示HTML =
	表示HTML += @"%画像表示位置HTML(表示位置)%"
	SIF GROUPMATCH(表示位置, "LEFT", "left", "左")
		表示HTML += @"%横位置HTML(横位置)%"
	SIF ボタン生成
		表示HTML += @"%ボタン生成HTML(VALUE, TITLE)%"
	表示HTML += @"%画像表示単独HTML_P(画像名, 縦位置, マウスオーバー画像名, 横幅, 縦幅, 画像反転フラグ)%"
	SIF ボタン生成
		表示HTML += @"</button>"
	SIF GROUPMATCH(表示位置, "RIGHT", "right", "右")
		表示HTML += @"%横位置HTML(横位置)%"
	;DEBUGPRINTFORML %表示HTML%
	HTML_PRINT 表示HTML

	IF 自動改行
		CALL PX_NEWLINE(縦位置 + 縦幅)
		行ずれ回数 = 0
	ELSE
		行ずれ回数++
	ENDIF
ELSE
	RETURN 0
ENDIF
RETURN 1

;********************************************************************************************
;画像表示用関数 フォントサイズ指定バージョン
;縦決めたら横は自動で決めたいので暫定バージョン
;画像反転フラグは 1:横反転 2：縦反転 3:縦横反転
;********************************************************************************************
@画像表示_F(画像名, 表示位置, 縦位置, 横位置, 横幅, 縦幅, 自動改行 = 0, ボタン生成 = 0, VALUE = "", TITLE = "", マウスオーバー画像名 = "", 画像反転フラグ = 0)
#DIMS 画像名				;リソース名
#DIMS マウスオーバー画像名	;マウスオーバー時に表示する画像名 省略可
#DIMS 表示位置				;表示位置指定文字列
#DIM  縦位置				;ピクセル指定 内部でフォントサイズ基準のパーセンテージに変換する
#DIM  横位置				;上に同じ
#DIM  横幅					;表示画像のピクセル
#DIM  縦幅					;上に同じ
#DIM  自動改行				;自動改行有無フラグ デフォルトはしない
#DIM  ボタン生成			;ボタンとして使用するか デフォルトはしない
#DIMS  VALUE				;ボタンのバリュー
#DIMS  TITLE				;マウスオーバー時に表示する文字列
#DIM  画像反転フラグ		;画像反転を行うかのフラグ
CALL 画像表示_P(画像名, 表示位置, 縦位置, 横位置, 横幅 * GETCONFIG("一行の高さ"), 縦幅 * GETCONFIG("一行の高さ"), 自動改行, ボタン生成, VALUE, TITLE, マウスオーバー画像名, 画像反転フラグ)
RETURN RESULT

;********************************************************************************************
;画像セット関数
;並べて表示したい場合に、画像一斉表示関数と合わせて使用する
;横位置は指定したピクセル数分画像間の間隔を空ける
;********************************************************************************************
@画像セット(画像名, 縦位置, 画像間隔, 拡大比率 = 100, ボタン生成 = 0, VALUE = "", TITLE = "", マウスオーバー画像名 = "", 画像反転フラグ = 0)
#DIMS 画像名				;リソース名
#DIMS マウスオーバー画像名	;マウスオーバー時に表示する画像名 省略可
#DIMS 表示位置				;表示位置指定文字列
#DIM  縦位置				;ピクセル指定 内部でフォントサイズ基準のパーセンテージに変換する
#DIM  画像間隔				;ピクセル指定 内部でフォントサイズ基準のパーセンテージに変換する
#DIM  拡大比率				;パーセンテージ指定 指定しなければ100
#DIM  ボタン生成			;ボタンとして使用するか デフォルトはしない
#DIMS  VALUE				;ボタンのバリュー
#DIMS  TITLE				;マウスオーバー時に表示する文字列
#DIM  画像反転フラグ		;画像反転を行うかのフラグ
#DIMS  表示HTML
IF SPRITECREATED(画像名)
	SIF TEMP_HTML != ""
		TEMP_HTML += @"%横位置HTML(画像間隔)%"
	SIF ボタン生成
		TEMP_HTML += @"%ボタン生成HTML(VALUE, TITLE)%"
	TEMP_HTML += @"%画像表示単独HTML(画像名, 縦位置, マウスオーバー画像名, 拡大比率, 画像反転フラグ)%"
	SIF ボタン生成
		TEMP_HTML += @"</button>"
	LOCAL = 縦位置 + SPRITEHEIGHT(画像名) * 拡大比率 / 100
	SIF LOCAL > TEMP_HTML_MAX_HEIGHT
		TEMP_HTML_MAX_HEIGHT = LOCAL
ELSE
	RETURN 0
ENDIF
RETURN 1

;********************************************************************************************
;画像セット関数 ピクセル指定バージョン
;********************************************************************************************
@画像セット_P(画像名, 縦位置, 画像間隔, 横幅, 縦幅, ボタン生成 = 0, VALUE = "", TITLE = "", マウスオーバー画像名 = "", 画像反転フラグ = 0)
#DIMS 画像名				;リソース名
#DIMS マウスオーバー画像名	;マウスオーバー時に表示する画像名 省略可
#DIMS 表示位置				;表示位置指定文字列
#DIM  縦位置				;ピクセル指定 内部でフォントサイズ基準のパーセンテージに変換する
#DIM  画像間隔				;ピクセル指定 内部でフォントサイズ基準のパーセンテージに変換する
#DIM  横幅					;表示画像のピクセル
#DIM  縦幅					;上に同じ
#DIM  ボタン生成			;ボタンとして使用するか デフォルトはしない
#DIMS  VALUE				;ボタンのバリュー
#DIMS  TITLE				;マウスオーバー時に表示する文字列
#DIM  画像反転フラグ		;画像反転を行うかのフラグ
#DIMS  表示HTML
IF SPRITECREATED(画像名)
	SIF TEMP_HTML != ""
		TEMP_HTML += @"%横位置HTML(画像間隔)%"
	SIF ボタン生成
		TEMP_HTML += @"%ボタン生成HTML(VALUE, TITLE)%"
	TEMP_HTML += @"%画像表示単独HTML_P(画像名, 縦位置, マウスオーバー画像名, 横幅, 縦幅, 画像反転フラグ)%"
	SIF ボタン生成
		TEMP_HTML += @"</button>"
	LOCAL = 縦位置 + 縦幅
	SIF LOCAL > TEMP_HTML_MAX_HEIGHT
		TEMP_HTML_MAX_HEIGHT = LOCAL
ELSE
	RETURN 0
ENDIF
RETURN 1

;********************************************************************************************
;画像セット関数 フォントサイズ指定バージョン
;縦決めたら横は自動で決めたいので暫定バージョン
;********************************************************************************************
@画像セット_F(画像名, 縦位置, 画像間隔, 横幅, 縦幅, ボタン生成 = 0, VALUE = "", TITLE = "", マウスオーバー画像名 = "", 画像反転フラグ = 0)
#DIMS 画像名				;リソース名
#DIMS マウスオーバー画像名	;マウスオーバー時に表示する画像名 省略可
#DIMS 表示位置				;表示位置指定文字列
#DIM  縦位置				;ピクセル指定 内部でフォントサイズ基準のパーセンテージに変換する
#DIM  画像間隔				;ピクセル指定 内部でフォントサイズ基準のパーセンテージに変換する
#DIM  横幅					;表示画像のピクセル
#DIM  縦幅					;上に同じ
#DIM  ボタン生成			;ボタンとして使用するか デフォルトはしない
#DIMS  VALUE				;ボタンのバリュー
#DIMS  TITLE				;マウスオーバー時に表示する文字列
#DIM  画像反転フラグ		;画像反転を行うかのフラグ
#DIMS  表示HTML
CALL 画像セット_P(画像名, 縦位置, 画像間隔, 横幅, 縦幅, ボタン生成, VALUE, TITLE, マウスオーバー画像名, 画像反転フラグ)
RETURN RESULT

;********************************************************************************************
;画像一斉表示関数
;並べて表示したい場合に、画像セット関数と合わせて使用する
;横位置は左揃えの場合は左端から、右揃えの場合は右端から指定したピクセル数分間隔を空ける
;********************************************************************************************
@画像一斉表示(表示位置, 横位置, 自動改行 = 0)
#DIMS 表示位置				;表示位置指定文字列

#DIM  横位置				;上に同じ
#DIM  自動改行				;自動改行有無フラグ デフォルトはしない
IF TEMP_HTML != ""
	TEMP_HTML = %画像表示位置HTML(表示位置)%%TEMP_HTML%
	SIF GROUPMATCH(表示位置, "LEFT", "left", "左")
		TEMP_HTML = %横位置HTML(横位置)%%TEMP_HTML%
	SIF GROUPMATCH(表示位置, "RIGHT", "right", "右")
		TEMP_HTML += @"%横位置HTML(横位置)%"
	;DEBUGPRINTFORML %TEMP_HTML%
	HTML_PRINT TEMP_HTML

	IF 自動改行
		CALL PX_NEWLINE(TEMP_HTML_MAX_HEIGHT)
		行ずれ回数 = 0
	ELSE
		行ずれ回数++
	ENDIF

	TEMP_HTML =
	TEMP_HTML_MAX_HEIGHT = 0
ELSE
	RETURN 0
ENDIF
RETURN 1

;********************************************************************************************
;画像表示単独のHTML取得関数
;諸々の計算は内部でするので指定するのは画像だけにしたい
;拡大縮小したい場合を考えて一応拡大比率指定出来るように
;********************************************************************************************
@画像表示単独HTML(画像名, 縦位置, マウスオーバー画像名 = "", 拡大比率 = 100, 画像反転フラグ = 0)
#FUNCTIONS
#DIMS 画像名				;リソース名
#DIMS マウスオーバー画像名	;マウスオーバー時に表示する画像名 省略可
#DIM  拡大比率				;パーセンテージ指定 指定しなければ100
#DIM  画像縦幅				;ややこしいがフォントサイズ基準のパーセンテージ
#DIM  画像横幅				;上に同じ
#DIM  縦位置				;ピクセル指定 内部でフォントサイズ基準のパーセンテージに変換する
#DIM  画像反転フラグ		;画像反転を行うかのフラグ
SIF PPF == 0
	;１ピクセルがフォントサイズの何%であるかを10倍の値で取得する（精度向上のため）
	PPF = PIXEL_PERCENT_OF_FONTSIZE() ;どうせコンフィグ変えたら再起動なのだから、一度だけ計算する
IF SPRITECREATED(画像名)
	画像縦幅 = (SPRITEHEIGHT(画像名) * 拡大比率 / 100) * PPF / 10 * (GETBIT(画像反転フラグ, 1) ? -1 # 1 )
	画像横幅 = (SPRITEWIDTH(画像名) * 拡大比率 / 100) * PPF / 10 * (GETBIT(画像反転フラグ, 0) ? -1 # 1 )
	縦位置   = (縦位置 * PPF / 10)- (行ずれ回数 * 100);
	LOCALS =
	RETURNF LOCALS
ELSE
	PRINTFORML 画像リソースが見つかりません
	RETURNF @""
ENDIF

;********************************************************************************************
;画像表示単独のHTML取得関数 ピクセル指定バージョン
;********************************************************************************************
@画像表示単独HTML_P(画像名, 縦位置, マウスオーバー画像名 = "", 横幅, 縦幅, 画像反転フラグ = 0)
#FUNCTIONS
#DIMS 画像名				;リソース名
#DIMS マウスオーバー画像名	;マウスオーバー時に表示する画像名 省略可
#DIM  拡大比率				;パーセンテージ指定 指定しなければ100
#DIM  横幅					;表示画像のピクセル
#DIM  縦幅					;上に同じ
#DIM  画像縦幅				;ややこしいがフォントサイズ基準のパーセンテージ
#DIM  画像横幅				;上に同じ
#DIM  縦位置				;ピクセル指定 内部でフォントサイズ基準のパーセンテージに変換する
#DIM  画像反転フラグ		;画像反転を行うかのフラグ
SIF PPF == 0
	;１ピクセルがフォントサイズの何%であるかを10倍の値で取得する（精度向上のため）
	PPF = PIXEL_PERCENT_OF_FONTSIZE() ;どうせコンフィグ変えたら再起動なのだから、一度だけ計算する
IF SPRITECREATED(画像名)
	画像横幅 = 横幅 * PPF / 10 * (GETBIT(画像反転フラグ, 0) ? -1 # 1 )
	画像縦幅 = 縦幅 * PPF / 10 * (GETBIT(画像反転フラグ, 1) ? -1 # 1 )
	縦位置   = (縦位置 * PPF / 10)- (行ずれ回数 * 100);
	LOCALS =
	RETURNF LOCALS
ELSE
	PRINTFORML 画像リソースが見つかりません
	RETURNF @""
ENDIF

;********************************************************************************************
;1ピクセルで現在のフォントサイズの何%かを10倍の近似値で出力する関数
;ピクセル単位で考えたいので作成 いちいち計算したくないし小数無いのだから細かなズレは気にしない
;********************************************************************************************
@PIXEL_PERCENT_OF_FONTSIZE
#FUNCTION
RETURNF (1000 / GETCONFIG("一行の高さ")) + (1000 % GETCONFIG("一行の高さ") >= 5?1#0)

;********************************************************************************************
;位置揃え指定関数
;PタグがただのALIGNMENT指定用タグと化してるので分離
;戻り値としてＰタグの文字列を返す
;ARGS = 画像表示位置指定文字列
;********************************************************************************************
@画像表示位置HTML(表示位置)
#FUNCTIONS
#DIMS 表示位置
SELECTCASE 表示位置
	CASE "LEFT", "left", "左"
		LOCALS =

		RETURNF LOCALS
	CASE "CENTER", "center", "中央"
		LOCALS =

		RETURNF LOCALS
	CASE "RIGHT", "right", "右"
		LOCALS =

		RETURNF LOCALS
	CASEELSE
		;認識できなかったら左揃え
		LOCALS =

		RETURNF LOCALS
ENDSELECT

;********************************************************************************************
;ボタン生成関数
;戻り値としてbuttonタグの文字列を返す
;POSはややこしいので使用しない
;********************************************************************************************
@ボタン生成HTML(VALUE, TITLE)
#FUNCTIONS
#DIMS  VALUE		;ボタンのバリュー
#DIMS  TITLE		;マウスオーバー時に表示する文字列
LOCALS = <button
SIF VALUE != ""
	LOCALS += @" value='%VALUE%'"
SIF TITLE != ""
	LOCALS += @" title='%TITLE%'"
LOCALS += @" >"
RETURNF LOCALS

;********************************************************************************************
;横位置指定関数
;いちいち場合分けするのが嫌なので全てshapeで調節する
;戻り値としてshapeタグの文字列を返す
;横位置はピクセル単位での指定
;********************************************************************************************
@横位置HTML(横位置)
#FUNCTIONS
#DIM 横位置		;ピクセル指定 内部でフォントサイズ基準のパーセンテージに変換する
SIF PPF == 0
	;１ピクセルがフォントサイズの何%であるかを10倍の値で取得する（精度向上のため）
	PPF = PIXEL_PERCENT_OF_FONTSIZE() ;どうせコンフィグ変えたら再起動なのだから、一度だけ計算する

横位置 = 横位置 * PPF / 10
LOCALS = <shape type='space' param='{横位置}'>
RETURNF LOCALS

;********************************************************************************************
;画像合わせ改行関数
;画像に合わせて改行したい場合に使用する
;縦幅をピクセル単位で指定すると、それをぎりぎり内包する行数だけ改行する
;********************************************************************************************
@PX_NEWLINE(縦幅)
#DIM 縦幅
SIF PPF == 0
	;１ピクセルがフォントサイズの何%であるかを10倍の値で取得する（精度向上のため）
	PPF = PIXEL_PERCENT_OF_FONTSIZE() ;どうせコンフィグ変えたら再起動なのだから、一度だけ計算する
;DEBUGPRINTFORML {縦幅},{縦幅 * PPF / 10}
縦幅 = 縦幅 * PPF / 1000 + (縦幅 * PPF % 1000 > 0 ? 1#0) - 1 - 行ずれ回数;何行分の幅かを計算
;DEBUGPRINTFORML {GETCONFIG("一行の高さ")},{PPF},{縦幅}
FOR LOCAL, 0, 縦幅
	PRINTL
NEXT
RETURN 1

;********************************************************************************************
;行ずれを防ぐための措置
;連続でHTML_PRINTを使用すると発生する行ずれのための措置
;********************************************************************************************
@画像描画終了
行ずれ回数 = 0

path: ERB/SYSTEM/LIBRARY/グラフィック表示ライブラリ/グラフィック表示H.ERB


path: ERB/SYSTEM/LIBRARY/グラフィック表示ライブラリ/テキストグラフィック表示.ERB


code:
#DIM  GLフォントサイズ = 16					;このライブラリで現在設定されているフォントサイズ
#DIM  GLフォントカラー = 0xFFFFFFFF			;このライブラリで現在設定されているフォントカラー(ARGB)
#DIMS GLフォント = "ＭＳ ゴシック"			;このライブラリで現在設定されているフォントの名称

#DIM GLTG保持情報, GPL最大保有GID数, 3		;テキストグラフィックの保持情報 0:GID, 1:横文字数, 2:縦文字数
#DIM GLTG保持数								;テキストグラフィックの情報保持数

path: ERB/SYSTEM/LIBRARY/グラフィック表示ライブラリ/テキストグラフィック表示.ERH


code:
### Function_Color.ERB　ライセンス記載 ###

・改変			可
・再配布		可
・商用利用		可
・使用報告		不要

利用者の利便性を保証するために作者は著作権を放棄しCC0を宣言します。

2019/10/05
作成者：ばふぉ


code:
### WindowDrawer.ERB, WindowDrawer.ERH　ライセンス記載 ###

・改変			可
・再配布		可
・商用利用		可
・使用報告		不要

利用者の利便性を保証するために作者は著作権を放棄しCC0を宣言します。

2019/10/05
作成者：ばふぉ


code:
### Function_TagSetText.ERB　ライセンス記載 ###

・改変			可
・再配布		可
・商用利用		可
・使用報告		不要

利用者の利便性を保証するために作者は著作権を放棄しCC0を宣言します。

2019/10/05
作成者：ばふぉ


code:
### Function_String.ERB　ライセンス記載 ###

・改変			可
・再配布		可
・商用利用		可
・使用報告		不要

利用者の利便性を保証するために作者は著作権を放棄しCC0を宣言します。

2019/10/05
作成者：ばふぉ


code:
;-------------------------
;主人公　というか「あなた」をエディットする
;方針　MASTER_EDITは一度仮想的にキャラを生成し、そのキャラのステータスをいじる
;最終的に出来上がったキャラを「あなた」としてすげかえる
;-------------------------
@MASTER_EDIT(対象)
#DIM 対象
#DIM FIRST_LINE
FIRST_LINE = LINECOUNT
REDRAW 0

CALL INIT_FACE_SPRITE(対象)
$SHOW_LOOP
CALL MASTER_EDIT_UI(対象)
REDRAW 1
INPUT
SELECTCASE RESULT
		;名前
	CASE 0 TO 10
		CALL MASTER_EDIT_PROCESS_NAME(対象, RESULT)
		;職業 関数が存在しないのでコメントアウト
		;CASE 5000 TO 5999
		;	CALL MASTER_EDIT_PROCESS_JOB(対象, RESULT - 5000)
		;種族
	CASE 4000 TO 4999
		CALL MASTER_EDIT_PROCESS_TAG(対象, RESULT - 4000)
		;性別
	CASE 100 TO 110
		CALL MASTER_EDIT_PROCESS_SEX(対象, RESULT - 100)
		;ＴＳ
	CASE 150 TO 170
		CALL MASTER_EDIT_PROCESS_TS(対象, RESULT - 150)
		;性経験
	CASE 200 TO 210
		CALL MASTER_EDIT_PROCESS_SEX_EXP(対象, RESULT - 200)
		;能力
	CASE 300 TO 310
		CALL MASTER_EDIT_PROCESS_SLG_ABL(対象, RESULT - 300)
		;性的能力
	CASE 1000 TO 1999
		CALL MASTER_EDIT_PROCESS_SEX_ABL(対象, RESULT - 1000)
		;素質
	CASE 2000 TO 2999
		CALL MASTER_EDIT_PROCESS_TALENT(対象, RESULT - 2000)
		;その他
	CASE 3000 TO 3999
		CALL MASTER_EDIT_PROCESS_MISC(対象, RESULT - 3000)
		;ポートレイト編集
	CASE 40000 TO 59999
		CALL MASTER_EDIT_PROCESS_PORTRAIT(対象, RESULT - 40000)
		;手動能力設定
	CASE 100001
		CALL MASTER_EDIT_SLG_ABL_EDIT(対象)
	CASE 100002
		SIF MASTER == NAME_TO_CHARA("あなた")
			CALL MASTER_EDIT_RELATION_SETTING(対象)
	CASE 100000
		REDRAW 1
		; PRINTFORML この主人公を保存しますか？
		; CALL ASK_YN()
		; IF RESULT == 0
		; 	CALL SAVE_CUSTOM_DATA(-2, 対象)
		; ENDIF
		CALL MASTER_EDIT_RELATION_CONFIRM(対象)
		;既に衣装を変更済みでないなら性別別の初期設定衣装を適用
		IF !MASTER_EDIT_衣装変更済
			CALL RANDOM_CHARA_CLOTH_SETTING("冒険者", 対象)
		ENDIF
		RETURN 対象
ENDSELECT
REDRAW 0
CLEARLINE LINECOUNT - FIRST_LINE
GOTO SHOW_LOOP

;-------------------------
;名前処理
;-------------------------
@MASTER_EDIT_PROCESS_NAME(対象, 番号)
#DIM 対象
#DIM 番号
SELECTCASE 番号
	CASE 0
		PRINTFORML 姓を入力
		INPUTS
		CSTR:対象:0 = %RESULTS%
	CASE 1
		PRINTFORML 名を入力
		INPUTS
		CSTR:対象:1 = %RESULTS%
		NAME:対象 = %RESULTS%
		CALLNAME:対象 = %RESULTS%
	CASE 2
		PRINTFORML 愛称を入力
		INPUTS
		CSTR:対象:98 = %RESULTS%
ENDSELECT

;-------------------------
;タグ処理
;-------------------------
@MASTER_EDIT_PROCESS_TAG(対象, 番号)
#DIM 対象
#DIM 番号
SIF !INRANGE(番号, 0, VARSIZE("TAG_NAME"))
	RETURN 0
CALL INVERT_TAG(対象, 番号)

;-------------------------
;性別処理
;-------------------------
@MASTER_EDIT_PROCESS_SEX(対象, 番号)
#DIM 対象
#DIM 番号
TALENT:対象:性別 = 番号

;-------------------------
;ＴＳ処理
;-------------------------
@MASTER_EDIT_PROCESS_TS(対象, 番号)
#DIM 対象
#DIM 番号
TALENT:対象:元性別 = 番号

;-------------------------
;性経験処理
;-------------------------
@MASTER_EDIT_PROCESS_SEX_EXP(対象, 番号)
#DIM 対象
#DIM 番号
SELECTCASE 番号
	CASE 0
		TALENT:対象:童貞 = !TALENT:対象:童貞
		IF TALENT:対象:童貞
			SEXUAL_EXPERIENCE:対象:初体験_童貞 = ----
			SEXUAL_LAST_EXPERIENCE:対象:初体験_童貞 = ----
		ELSE
			SEXUAL_EXPERIENCE:対象:初体験_童貞 = 不明
			SEXUAL_LAST_EXPERIENCE:対象:初体験_童貞 = 不明
		ENDIF
	CASE 1
		TALENT:対象:キス未経験 = !TALENT:対象:キス未経験
		IF TALENT:対象:キス未経験
			SEXUAL_EXPERIENCE:対象:初体験_キス = ----
			SEXUAL_LAST_EXPERIENCE:対象:初体験_キス = ----
		ELSE
			SEXUAL_EXPERIENCE:対象:初体験_キス = 不明
			SEXUAL_LAST_EXPERIENCE:対象:初体験_キス = 不明
		ENDIF
	CASE 2
		TALENT:対象:処女 = !TALENT:対象:処女
		IF TALENT:対象:処女
			SEXUAL_EXPERIENCE:対象:初体験_処女 = ----
			SEXUAL_LAST_EXPERIENCE:対象:初体験_処女 = ----
		ELSE
			SEXUAL_EXPERIENCE:対象:初体験_処女 = 不明
			SEXUAL_LAST_EXPERIENCE:対象:初体験_処女 = 不明
		ENDIF
	CASE 3
		TALENT:対象:アナル処女 = !TALENT:対象:アナル処女
		IF TALENT:対象:アナル処女
			SEXUAL_EXPERIENCE:対象:初体験_アナル処女 = ----
			SEXUAL_LAST_EXPERIENCE:対象:初体験_アナル処女 = ----
		ELSE
			SEXUAL_EXPERIENCE:対象:初体験_アナル処女 = 不明
			SEXUAL_LAST_EXPERIENCE:対象:初体験_アナル処女 = 不明
		ENDIF
ENDSELECT

;-------------------------
;SLG処理
;-------------------------
@MASTER_EDIT_PROCESS_SLG_ABL(対象, 番号)
#DIM 対象
#DIM 番号
#DIM 補正, 6
VARSET 補正

IF 番号 == 1
	TALENT:対象:成長型 = ROUND_INCREMENT(TALENT:対象:成長型, 0, 11)
ELSEIF 番号 == 0
	CALL CHARACTER_EDIT_SET_ABL_BY_GROWTH(対象)
ENDIF

;-------------------------
;性的能力処理
;-------------------------
@MASTER_EDIT_PROCESS_SEX_ABL(対象, 番号)
#DIM 対象
#DIM 番号
{
	#DIM 編集可能能力 =
		GETNUM(ABL, "Ｃ感"), GETNUM(ABL, "Ｂ感"), GETNUM(ABL, "Ｖ感"), GETNUM(ABL, "Ａ感"), GETNUM(ABL, "Ｍ感"), GETNUM(ABL, "Ｕ感"),
		GETNUM(ABL, "性知識"), GETNUM(ABL, "欲望"), GETNUM(ABL, "性技"), GETNUM(ABL, "奉仕"), GETNUM(ABL, "肝臓")
}

SIF FINDELEMENT(編集可能能力, 番号) == -1
	RETURN

IF 番号 == GETNUM(ABL, "性知識")
	PRINTL 値を入力(0~5)
	INPUT
	ABL:対象:性知識 = LIMIT(RESULT, 0, 5)
ELSE
	PRINTL 値を入力(0~3)
	INPUT
	ABL:対象:番号 = LIMIT(RESULT, 0, 3)
ENDIF

;-------------------------
;素質処理
;-------------------------
@MASTER_EDIT_PROCESS_TALENT(対象, 番号)
#DIM 対象
#DIM 番号
{
	SIF !PASS_CHARA_CHECK_SHOW_TALENT(番号) || TALENTNAME:番号 == "" ||
		GROUPMATCH(番号, GETNUM(TALENT, "謎の魅力"), GETNUM(TALENT, "絶倫"), GETNUM(TALENT, "魔術知識"), GETNUM(TALENT, "天の御遣い"), GETNUM(TALENT,"技師"),
		GETNUM(TALENT, "酒豪"), GETNUM(TALENT, "君主の器"), GETNUM(TALENT, "求心力"))
}
	RETURN

TALENT:対象:番号 = !TALENT:対象:番号

;-------------------------
;そのほか処理
;-------------------------
@MASTER_EDIT_PROCESS_MISC(対象, 番号)
#DIM 対象
#DIM 番号

SELECTCASE 番号
	CASE 200
		TALENT:対象:陰毛現在値 = ROUND_INCREMENT(TALENT:対象:陰毛現在値, -1, 10)
		TALENT:対象:陰毛目標値 = TALENT:対象:陰毛現在値
	CASE 202
		TALENT:対象:腋毛現在値 = ROUND_INCREMENT(TALENT:対象:腋毛現在値, -1, 9)
		TALENT:対象:腋毛目標値 = TALENT:対象:腋毛現在値
	CASE 201
		CALL BEAUTIFY(対象)
ENDSELECT

;-------------------------------------------------
;ポートレイト編集
;-------------------------------------------------
@MASTER_EDIT_PROCESS_PORTRAIT(対象, 番号)
#DIM 対象
#DIM 番号
CALL SHOW_CHARACTER_PORTRAIT_EDIT_MENU(対象)

;-------------------------
;UI部分
;-------------------------
@MASTER_EDIT_UI(対象)
#DIM 対象
CALL SINGLE_DRAWLINE
PRINTFORML 主人公の素質や能力を設定します

CALL SINGLE_DRAWLINE
PRINTFORML 名前
CALL MASTER_EDIT_NAME(対象)

CALL SINGLE_DRAWLINE
PRINTFORML 種族
CALL MASTER_EDIT_TAG(対象)

CALL SINGLE_DRAWLINE
PRINTFORML 性別
CALL MASTER_EDIT_SEX(対象)
CALL MASTER_EDIT_TS(対象)

CALL SINGLE_DRAWLINE
PRINTFORML 性経験
CALL MASTER_EDIT_SEX_EXP(対象)

CALL SINGLE_DRAWLINE
PRINTFORML SLG能力
CALL MASTER_EDIT_SLG_ABL(対象)

CALL SINGLE_DRAWLINE
PRINTFORML 性的能力
CALL MASTER_EDIT_SEX_ABL(対象)

CALL SINGLE_DRAWLINE
PRINTFORML 素質
CALL MASTER_EDIT_TALENT(対象)

CALL SINGLE_DRAWLINE
PRINTFORML その他
CALL MASTER_EDIT_MISC(対象)

CALL SINGLE_DRAWLINE
IF MASTER == NAME_TO_CHARA("あなた")
	PRINTBUTTON "[血縁設定]", 100002
	PRINTL
ENDIF
PRINTBUTTON "[完了]", 100000

;-------------------------
;名前UI
;-------------------------
@MASTER_EDIT_NAME(対象)
#DIM 対象
PRINTFORM   姓 - %CSTR:対象:0, 20, LEFT%
PRINTBUTTON "[入力]", 0
PRINTL
PRINTFORM   名 - %CSTR:対象:1, 20, LEFT%
PRINTBUTTON "[入力]", 1
PRINTL
PRINTFORM 愛称 - %CSTR:対象:98, 20, LEFT%
PRINTBUTTON "[入力]", 2
PRINTL
PRINTFORML ※あまり長いと表示崩れします

;-------------------------
;タグUI
;-------------------------
@MASTER_EDIT_TAG(対象)
#DIM 対象
FOR LOCAL, 0, VARSIZE("TAG_NAME")
	CALL PRINT_TOGGLE_BUTTON(@"[%TAG_NAME:LOCAL%]", 4000 + LOCAL, HAS_TAG(対象, LOCAL))
NEXT
PRINTL
PRINTFORML ※最大{MAX_TAG}個まで

;-------------------------
;性別UI
;-------------------------
@MASTER_EDIT_SEX(対象)
#DIM 対象
CALL PRINT_SELECT_BUTTON("[男]", 100, TALENT:対象:性別 == 0)
CALL PRINT_SELECT_BUTTON("[女]", 101, TALENT:対象:性別 == 1)
CALL PRINT_SELECT_BUTTON("[女双]", 102, TALENT:対象:性別 == 2)
CALL PRINT_SELECT_BUTTON("[男双]", 103, TALENT:対象:性別 == 3)
CALL PRINT_SELECT_BUTTON("[男娘]", 104, TALENT:対象:性別 == 4)
CALL PRINT_SELECT_BUTTON("[男娘双]", 105, TALENT:対象:性別 == 5)
PRINT  /

;-------------------------
;性転換UI
;-------------------------
@MASTER_EDIT_TS(対象)
#DIM 対象
CALL PRINT_SELECT_BUTTON("[ＴＳ経験なし]", 150, TALENT:対象:元性別 == 0)
CALL PRINT_SELECT_BUTTON("[元男]", 160, TALENT:対象:元性別 == 10)
CALL PRINT_SELECT_BUTTON("[元女]", 161, TALENT:対象:元性別 == 11)
CALL PRINT_SELECT_BUTTON("[元女双]", 162, TALENT:対象:元性別 == 12)
CALL PRINT_SELECT_BUTTON("[元男双]", 163, TALENT:対象:元性別 == 13)
CALL PRINT_SELECT_BUTTON("[元男娘]", 164, TALENT:対象:元性別 == 14)
CALL PRINT_SELECT_BUTTON("[元男娘双]", 165, TALENT:対象:元性別 == 15)
PRINTL

;-------------------------
;性経験UI
;-------------------------
@MASTER_EDIT_SEX_EXP(対象)
#DIM 対象
PRINTBUTTON TALENT:対象:童貞 ? "[ 童貞 ]" # "[非童貞]", 200
PRINTBUTTON TALENT:対象:キス未経験 ? "[ キス未経験 ]" # "[キス経験済み]", 201
PRINTBUTTON TALENT:対象:処女 ? "[ 処女 ]" # "[非処女]", 202
PRINTBUTTON TALENT:対象:アナル処女 ? "[ Ａ処女 ]" # "[Ａ非処女]", 203
PRINTL

;-------------------------
;SLG能力UI
;-------------------------
@MASTER_EDIT_SLG_ABL(対象)
#DIM 対象
#DIM 表示能力 = GETNUM(ABL, "身体"), GETNUM(ABL, "器用"), GETNUM(ABL, "知識"), GETNUM(ABL, "観察"), GETNUM(ABL, "社交"), GETNUM(ABL, "歌唱"), GETNUM(ABL, "料理"), GETNUM(ABL, "話術"), GETNUM(ABL, "戦闘")

PRINTBUTTON "[変更]", 301
PRINTFORM 成長型:%TOSTR_GROWTYPE(TALENT:対象:成長型)%(%TOSTR_GROWTYPE_B(TALENT:対象:成長型)%に適性)
PRINTL
PRINTBUTTON "[手動設定]", 100001
PRINT
PRINTBUTTON "[リロール]", 300
PRINT
FOR LOCAL, 0, VARSIZE("表示能力")
	PRINTFORM %ABLNAME:(表示能力:LOCAL)%:
	CALL PRINT_ALPHABET_RANK(ランク_ＳＬＧ, ABL:対象:(表示能力:LOCAL))
	PRINTFORM {ABL:対象:(表示能力:LOCAL), 3, RIGHT}
NEXT
PRINTL

;-------------------------
;性的能力UI
;-------------------------
@MASTER_EDIT_SEX_ABL(対象)
#DIM 対象
{
	#DIM 表示能力 =
		GETNUM(ABL, "Ｃ感"), GETNUM(ABL, "Ｂ感"), GETNUM(ABL, "Ｖ感"), GETNUM(ABL, "Ａ感"), GETNUM(ABL, "Ｍ感"), GETNUM(ABL, "Ｕ感"),
		GETNUM(ABL, "性知識"), GETNUM(ABL, "欲望"), GETNUM(ABL, "性技"), GETNUM(ABL, "奉仕"), GETNUM(ABL, "肝臓")
}

FOR LOCAL, 0, VARSIZE("表示能力")
	PRINTFORM %ABLNAME:(表示能力:LOCAL)%:
	IF 表示能力:LOCAL == GETNUM(ABL, "性知識")
		CALL PRINT_ALPHABET_RANK(ランク_性知識, ABL:対象:(表示能力:LOCAL))
	ELSE
		CALL PRINT_ALPHABET_RANK(ランク_その他, ABL:対象:(表示能力:LOCAL))
	ENDIF
	PRINTFORM {ABL:対象:(表示能力:LOCAL), 2, RIGHT}
	PRINTBUTTON "[設定]", 1000 + 表示能力:LOCAL
	PRINT
	SIF LOCAL % 5 == 0 && LOCAL > 0
		PRINTFORML
NEXT
PRINTL
CALL KILL_EMPTY_LINE
;-------------------------
;素質UI
;-------------------------
@MASTER_EDIT_TALENT(対象)
#DIM 対象
LOCAL:1 = 0
FOR LOCAL, 0, 300
	SIF !PASS_CHARA_CHECK_SHOW_TALENT(LOCAL) || TALENTNAME:LOCAL == "" || GROUPMATCH(LOCAL, GETNUM(TALENT, "謎の魅力"), GETNUM(TALENT, "絶倫"), GETNUM(TALENT, "魔術知識"), GETNUM(TALENT, "天の御遣い"), GETNUM(TALENT,"技師"), GETNUM(TALENT, "酒豪"), GETNUM(TALENT, "合意"), GETNUM(TALENT, "君主の器"), GETNUM(TALENT, "求心力"))
		CONTINUE
	CALL PRINT_TOGGLE_BUTTON(@"%"[" + TALENTNAME:LOCAL + "]", 14, LEFT%", 2000 + LOCAL, TALENT:対象:LOCAL)
	PRINT
	LOCAL:1 ++
	SIF LOCAL:1 % 6 == 0 && LOCAL:1 > 0
		PRINTFORML
NEXT
PRINTL

;-------------------------
;その他UI
;-------------------------
@MASTER_EDIT_MISC(対象)
#DIM 対象

PRINTFORM 体格:%TOSTR_BODYSIZE(TALENT:(対象):体格), 10, LEFT%
PRINTFORM 体型:%TOSTR_BODYTYPE(TALENT:(対象):体型), 10, LEFT%
PRINTL

SIF IS_FEMALE(対象)
	PRINTFORM 乳房:%TOSTR_BUSTSIZE(GET_BUSTSIZE(対象)), 10, LEFT%
SIF HAS_PENIS(対象)
	PRINTFORM 陰茎:%TOSTR_PENISSIZE(GET_PENISSIZE(対象)), 10, LEFT%
PRINTFORM   尻:%TOSTR_HIPSIZE(GET_HIPSIZE(対象)), 10, LEFT%

IF HAS_VAGINA(対象)
	PRINTFORM 膣締:%TOSTR_TIGHTNESS(TALENT:(対象):Ｖ締まり), 10, LEFT%
ENDIF
PRINTFORM 尻締:%TOSTR_TIGHTNESS(TALENT:(対象):Ａ締まり), 10, LEFT%
PRINTL

PRINTFORM 髪色:
CALL PRINT_HAIR_COLOR(TALENT:(対象):髪色)
PRINTFORM 髪長:%TOSTR_HAIR_LENGTH(TALENT:(対象):髪の長さ), 10, LEFT%
PRINTL
CALL SHOW_BODYSIZE(対象)
PRINTBUTTON "[ボディサイズ設定]", 3201
PRINTL
PRINTFORM 陰毛:
PRINTBUTTON @"[%GET_INMOU_NAME(TALENT:対象:陰毛現在値)%]", 3200
PRINTFORM 腋毛:
PRINTBUTTON @"[%GET_ARMPIT_NAME(TALENT:対象:腋毛現在値)%]", 3202

CALL RESET_FACE_SPRITE(対象)
CALL HO_SET_PORTRAIT_SPRITE(対象, "ステータス画面")
CALL 画像表示_P(CSTR:対象:キャラ顔グラ, "RIGHT", -100, 100, 200, 200)
CALL 画像描画終了

;顔グラの編集
;IF !IS_MALE(対象, 0)
PRINTFORML <ポートレイト>
PRINTL
CALLF TAG_PRINT(@"@B:40000@[ポートレイトを編集する]@/B@", 5)
PRINTL
PRINTL
PRINTL
;ENDIF
PRINTL

;-------------------------
;能力の手動設定
;-------------------------
@MASTER_EDIT_SLG_ABL_EDIT(対象)
#DIM 対象
#DIM 表示能力 = GETNUM(ABL, "身体"), GETNUM(ABL, "器用"), GETNUM(ABL, "知識"), GETNUM(ABL, "観察"), GETNUM(ABL, "社交"), GETNUM(ABL, "歌唱"), GETNUM(ABL, "料理"), GETNUM(ABL, "話術"), GETNUM(ABL, "戦闘")
#DIM ポイント
#DIM FIRST_LINE

FIRST_LINE = LINECOUNT

IF TOSTR_GROWTYPE(TALENT:対象:成長型) == "天才"
	ポイント = 280
ELSEIF TOSTR_GROWTYPE(TALENT:対象:成長型) == "無能"
	ポイント = 160
ELSE
	ポイント = 240
ENDIF

FOR LOCAL, 0, VARSIZE("表示能力")
	ポイント -= ABL:対象:(表示能力:LOCAL)
NEXT

CALL SINGLE_DRAWLINE
PRINTFORML 能力を手動で設定します
PRINTFORML ポイントが許す限り、0～100で指定できます
PRINTFORML ただしリロールの期待値のほうが、ポイント合計より上です
PRINTFORML 残りポイント:{ポイント}
CALL SINGLE_DRAWLINE
FOR LOCAL, 0, VARSIZE("表示能力")
	PRINTBUTTON @"[%ABLNAME:(表示能力:LOCAL)%]", LOCAL
	PRINTFORM
	CALL PRINT_ALPHABET_RANK(ランク_ＳＬＧ, ABL:対象:(表示能力:LOCAL))
	PRINTFORM {ABL:対象:(表示能力:LOCAL), 2, RIGHT}
	PRINTL
NEXT
CALL SINGLE_DRAWLINE
PRINTFORML [99] 戻る

INPUT

IF RESULT == 99
	IF ポイント < 0
		PRINTFORMW ポイント不足です
		CLEARLINE LINECOUNT - FIRST_LINE
		RESTART
	ENDIF
	RETURN 0
ELSEIF !INRANGE(RESULT, 0, VARSIZE("表示能力") - 1)
	CLEARLINE LINECOUNT - FIRST_LINE
	RESTART
ENDIF

LOCAL = RESULT
PRINTFORML %ABLNAME:(表示能力:LOCAL)%の能力値を入力(0~{MAX(ABL:対象:(表示能力:LOCAL) + ポイント, 0)})

$INPUT_LOOP

INPUT

SIF RESULT < 0 || RESULT > 100
	GOTO INPUT_LOOP

ABL:対象:(表示能力:LOCAL) = RESULT

CLEARLINE LINECOUNT - FIRST_LINE

RESTART

;-------------------------
;血縁設定
;-------------------------
@MASTER_EDIT_RELATION_SETTING(対象)
#DIM 対象
#DIM FIRST_LINE

FIRST_LINE = LINECOUNT

CALL SINGLE_DRAWLINE
PRINTBUTTON "[父親の設定]", 0
IF ID_TO_CHARA(MASTER_EDIT_FATHER_CANDIDATE) > 0
	PRINTFORML  現在:%ANAME(ID_TO_CHARA(MASTER_EDIT_FATHER_CANDIDATE))%
ELSE
	PRINTFORML  現在:なし
ENDIF
PRINTBUTTON "[母親の設定]", 1
IF ID_TO_CHARA(MASTER_EDIT_MOTHER_CANDIDATE) > 0
	PRINTFORML  現在:%ANAME(ID_TO_CHARA(MASTER_EDIT_MOTHER_CANDIDATE))%
ELSE
	PRINTFORML  現在:なし
ENDIF

PRINTBUTTON "[きょうだいの設定]", 2
IF MASTER_EDIT_BROTHER_CANDIDATE_NUM > 0
	PRINTFORM 現在:
	FOR LOCAL, 0, MASTER_EDIT_BROTHER_CANDIDATE_NUM
		SIF ID_TO_CHARA(MASTER_EDIT_BROTHER_CANDIDATE:LOCAL) > 0
			PRINTFORM %ANAME(ID_TO_CHARA(MASTER_EDIT_BROTHER_CANDIDATE:LOCAL))%
	NEXT
	PRINTFORML
ELSE
	PRINTFORML 現在:なし
ENDIF

PRINTBUTTON "[息子・娘の設定]", 3
IF MASTER_EDIT_CHILD_CANDIDATE_NUM > 0
	PRINTFORM 現在:
	FOR LOCAL, 0, MASTER_EDIT_CHILD_CANDIDATE_NUM
		SIF ID_TO_CHARA(MASTER_EDIT_CHILD_CANDIDATE:LOCAL) > 0
			PRINTFORM %ANAME(ID_TO_CHARA(MASTER_EDIT_CHILD_CANDIDATE:LOCAL))%
	NEXT
	PRINTFORML
ELSE
	PRINTFORML 現在:なし
ENDIF

PRINTBUTTON "[BACK]", 999

INPUT

IF RESULT == 0
	CALL SELECT_CHARA_LIST_ONLY_LOGIC_SLG("MASTER_EDIT_FATHER", "NONE")
	MASTER_EDIT_FATHER_CANDIDATE = GET_ID(RESULT)

	;排他処理
	SIF MASTER_EDIT_MOTHER_CANDIDATE == MASTER_EDIT_FATHER_CANDIDATE
		MASTER_EDIT_MOTHER_CANDIDATE = 0

	LOCAL = FINDELEMENT(MASTER_EDIT_BROTHER_CANDIDATE, MASTER_EDIT_FATHER_CANDIDATE, 0, MASTER_EDIT_BROTHER_CANDIDATE_NUM)
	IF LOCAL != -1
		ARRAYSHIFT MASTER_EDIT_BROTHER_CANDIDATE, -1, 0, LOCAL
		MASTER_EDIT_BROTHER_CANDIDATE_NUM --
	ENDIF

	LOCAL = FINDELEMENT(MASTER_EDIT_CHILD_CANDIDATE, MASTER_EDIT_FATHER_CANDIDATE, 0, MASTER_EDIT_CHILD_CANDIDATE_NUM)
	IF LOCAL != -1
		ARRAYSHIFT MASTER_EDIT_CHILD_CANDIDATE, -1, 0, LOCAL
		MASTER_EDIT_CHILD_CANDIDATE_NUM --
	ENDIF

ELSEIF RESULT == 1
	CALL SELECT_CHARA_LIST_ONLY_LOGIC_SLG("MASTER_EDIT_MOTHER", "NONE")
	MASTER_EDIT_MOTHER_CANDIDATE = GET_ID(RESULT)

	;排他処理
	SIF MASTER_EDIT_MOTHER_CANDIDATE == MASTER_EDIT_FATHER_CANDIDATE
		MASTER_EDIT_FATHER_CANDIDATE = 0

	LOCAL = FINDELEMENT(MASTER_EDIT_BROTHER_CANDIDATE, MASTER_EDIT_MOTHER_CANDIDATE, 0, MASTER_EDIT_BROTHER_CANDIDATE_NUM)
	IF LOCAL != -1
		ARRAYSHIFT MASTER_EDIT_BROTHER_CANDIDATE, -1, 0, LOCAL
		MASTER_EDIT_BROTHER_CANDIDATE_NUM --
	ENDIF

	LOCAL = FINDELEMENT(MASTER_EDIT_CHILD_CANDIDATE, MASTER_EDIT_MOTHER_CANDIDATE, 0, MASTER_EDIT_CHILD_CANDIDATE_NUM)
	IF LOCAL != -1
		ARRAYSHIFT MASTER_EDIT_CHILD_CANDIDATE, -1, 0, LOCAL
		MASTER_EDIT_CHILD_CANDIDATE_NUM --
	ENDIF

ELSEIF RESULT == 2
	CALL SELECT_CHARA_LIST_MULTI_ONLY_LOGIC_SLG(MASTER_EDIT_CANDIDATE_MAX, "MASTER_EDIT_BROTHER", "NONE")
	FOR LOCAL, 0, SELECTED_CHARA_NUM
		MASTER_EDIT_BROTHER_CANDIDATE:LOCAL = GET_ID(SELECTED_CHARA:LOCAL)
	NEXT
	MASTER_EDIT_BROTHER_CANDIDATE_NUM = SELECTED_CHARA_NUM

	;排他処理
	SIF FINDELEMENT(MASTER_EDIT_BROTHER_CANDIDATE, MASTER_EDIT_FATHER_CANDIDATE, 0, MASTER_EDIT_BROTHER_CANDIDATE_NUM) != -1
		MASTER_EDIT_FATHER_CANDIDATE = 0

	SIF FINDELEMENT(MASTER_EDIT_BROTHER_CANDIDATE, MASTER_EDIT_MOTHER_CANDIDATE, 0, MASTER_EDIT_BROTHER_CANDIDATE_NUM) != -1
		MASTER_EDIT_MOTHER_CANDIDATE = 0

	FOR LOCAL, 0, MASTER_EDIT_BROTHER_CANDIDATE_NUM
		LOCAL:1 = MASTER_EDIT_BROTHER_CANDIDATE:LOCAL
		LOCAL:2 = FINDELEMENT(MASTER_EDIT_CHILD_CANDIDATE, LOCAL:1, 0, MASTER_EDIT_CHILD_CANDIDATE_NUM)

		IF LOCAL:2 != -1
			ARRAYSHIFT MASTER_EDIT_CHILD_CANDIDATE, -1, 0, LOCAL:2
			MASTER_EDIT_CHILD_CANDIDATE_NUM --
		ENDIF
	NEXT

ELSEIF RESULT == 3
	CALL SELECT_CHARA_LIST_MULTI_ONLY_LOGIC_SLG(MASTER_EDIT_CANDIDATE_MAX, "MASTER_EDIT_CHILD", "NONE")
	FOR LOCAL, 0, SELECTED_CHARA_NUM
		LOCAL:1 = SELECTED_CHARA:LOCAL
		MASTER_EDIT_CHILD_CANDIDATE:LOCAL = GET_ID(LOCAL:1)
	NEXT
	MASTER_EDIT_CHILD_CANDIDATE_NUM = SELECTED_CHARA_NUM

	;排他処理
	SIF FINDELEMENT(MASTER_EDIT_CHILD_CANDIDATE, MASTER_EDIT_FATHER_CANDIDATE, 0, MASTER_EDIT_CHILD_CANDIDATE_NUM) != -1
		MASTER_EDIT_FATHER_CANDIDATE = 0

	SIF FINDELEMENT(MASTER_EDIT_CHILD_CANDIDATE, MASTER_EDIT_MOTHER_CANDIDATE, 0, MASTER_EDIT_CHILD_CANDIDATE_NUM) != -1
		MASTER_EDIT_MOTHER_CANDIDATE = 0

	FOR LOCAL, 0, MASTER_EDIT_CHILD_CANDIDATE_NUM
		LOCAL:1 = MASTER_EDIT_CHILD_CANDIDATE:LOCAL
		LOCAL:2 = FINDELEMENT(MASTER_EDIT_BROTHER_CANDIDATE, LOCAL:1, 0, MASTER_EDIT_BROTHER_CANDIDATE_NUM)

		IF LOCAL:2 != -1
			ARRAYSHIFT MASTER_EDIT_BROTHER_CANDIDATE, -1, 0, LOCAL:2
			MASTER_EDIT_BROTHER_CANDIDATE_NUM --
		ENDIF
	NEXT

ELSEIF RESULT == 999
	RETURN 0
ENDIF

CLEARLINE LINECOUNT - FIRST_LINE
RESTART

@SELECT_CHARA_LIST_SHOW_LOGIC_MASTER_EDIT_FATHER(対象)
#DIM 対象
RETURN HAS_PENIS(対象) && IS_UNIQUE_CHARA(対象) && 対象 != MASTER

@SELECT_CHARA_LIST_SHOW_LOGIC_MASTER_EDIT_MOTHER(対象)
#DIM 対象
RETURN HAS_VAGINA(対象) && IS_UNIQUE_CHARA(対象) && 対象 != MASTER

@SELECT_CHARA_LIST_SHOW_LOGIC_MASTER_EDIT_BROTHER(対象)
#DIM 対象
RETURN IS_UNIQUE_CHARA(対象) && 対象 != MASTER

@SELECT_CHARA_LIST_SHOW_LOGIC_MASTER_EDIT_CHILD(対象)
#DIM 対象
RETURN IS_UNIQUE_CHARA(対象) && 対象 != MASTER

@MASTER_EDIT_RELATION_CONFIRM(対象)
#DIM 対象
#DIM 候補, MAX_CHARA_NUM
#DIM 候補数
#DIM 父候補
#DIM 母候補
VARSET 候補, -1
VARSET 候補数, 0

父候補 = ID_TO_CHARA(MASTER_EDIT_FATHER_CANDIDATE)
母候補 = ID_TO_CHARA(MASTER_EDIT_MOTHER_CANDIDATE)

IF 父候補 >= 0
	CFLAG:対象:父親 = GET_ID(父候補)
	CALL VIRGINIZE_LOST(父候補, 初体験_童貞, 母候補 >= 0 ? ANAME(母候補) + "の膣" # "不明")
	EXP:父候補:Ｖ挿入経験 += 5
ENDIF

IF 母候補 >= 0
	CFLAG:対象:母親 = GET_ID(母候補)
	CALL VIRGINIZE_LOST(母候補, 初体験_処女, 父候補 >= 0 ? ANAME(父候補) # "不明")
	EXP:母候補:Ｖ性交経験 += 5
	EXP:母候補:膣内射精経験 += 5
	EXP:母候補:出産経験 += 1
ENDIF

IF MASTER_EDIT_BROTHER_CANDIDATE_NUM > 0
	;きょうだい候補のきょうだいも、きょうだいとして追加する
	FOR LOCAL, 0, MASTER_EDIT_BROTHER_CANDIDATE_NUM
		LOCAL:1 = ID_TO_CHARA(MASTER_EDIT_BROTHER_CANDIDATE:LOCAL)
		IF LOCAL:1 >= 0
			候補:候補数 = LOCAL:1
			候補数 ++
			FOR LOCAL:2, 0, CHARANUM
				IF IS_PURE_BROTHER(LOCAL:1, LOCAL:2) && FINDELEMENT(候補, LOCAL:2, 0, 候補数) == -1
					候補:候補数 = LOCAL:2
					候補数 ++
				ENDIF
			NEXT
		ENDIF
	NEXT

	IF 父候補 < 0 && 母候補 < 0
		FOR LOCAL, 0, SPERM_MAX_ADDRESS
			IF SPERM_NAME_ARRAY:LOCAL == ""
				LOCAL:2 = LOCAL
				LOCAL --
				BREAK
			ENDIF
		NEXT
		SIF LOCAL == SPERM_MAX_ADDRESS
			THROW SPERM_NAME_ARRAYがいっぱいです

		SPERM_NAME_ARRAY:(LOCAL:2) = 不明
		BROTHER_SPERM_FLAG:(LOCAL:2) = 1
	ENDIF

	FOR LOCAL, 0, 候補数
		CFLAG:(候補:LOCAL):父親 = 父候補 >= 0 ? GET_ID(父候補) # LOCAL:2 * -1
		CFLAG:(候補:LOCAL):母親 = 母候補 >= 0 ? GET_ID(母候補) # LOCAL:2 * -1
	NEXT
	CFLAG:対象:父親 = 父候補 >= 0 ? GET_ID(父候補) # LOCAL:2 * -1
	CFLAG:対象:母親 = 母候補 >= 0 ? GET_ID(母候補) # LOCAL:2 * -1
	VARSET 候補
	VARSET 候補数
ENDIF

IF MASTER_EDIT_CHILD_CANDIDATE_NUM > 0
	;子供候補の子供も、子供候補として追加する
	FOR LOCAL, 0, MASTER_EDIT_CHILD_CANDIDATE_NUM
		LOCAL:1 = ID_TO_CHARA(MASTER_EDIT_CHILD_CANDIDATE:LOCAL)
		IF LOCAL:1 >= 0
			候補:候補数 = LOCAL:1
			候補数 ++
			FOR LOCAL:2, 0, CHARANUM
				IF IS_PURE_BROTHER(LOCAL:1, LOCAL:2) && FINDELEMENT(候補, LOCAL:2, 0, 候補数)
					候補:候補数 = LOCAL:2
					候補数 ++
				ENDIF
			NEXT
		ENDIF
	NEXT

	FOR LOCAL, 0, SPERM_MAX_ADDRESS
		IF SPERM_NAME_ARRAY:LOCAL == ""
			LOCAL:2 = LOCAL
			LOCAL --
			BREAK
		ENDIF
	NEXT
	SIF LOCAL == SPERM_MAX_ADDRESS
		THROW SPERM_NAME_ARRAYがいっぱいです

	SPERM_NAME_ARRAY:(LOCAL:2) = 不明
	BROTHER_SPERM_FLAG:(LOCAL:2) = 1

	FOR LOCAL, 0, 候補数
		IF IS_MALE(対象)
			CFLAG:(候補:LOCAL):父親 = GET_ID(対象)
			CFLAG:(候補:LOCAL):母親 = LOCAL:2 * -1
			CALL VIRGINIZE_LOST(対象, 初体験_童貞, "不明")
			EXP:対象:Ｖ挿入経験 += 5

		ELSE
			CFLAG:(候補:LOCAL):父親 = LOCAL:2 * -1
			CFLAG:(候補:LOCAL):母親 = GET_ID(対象)
			CALL VIRGINIZE_LOST(対象, 初体験_処女, "不明")
			EXP:対象:Ｖ性交経験 += 5
			EXP:対象:膣内射精経験 += 5
			EXP:対象:出産経験 += 1
		ENDIF
	NEXT
	VARSET 候補
	VARSET 候補数
ENDIF

;-------------------------------------------------
;衣装設定メニュー
;-------------------------------------------------
@MASTER_EDIT_CLOTH_SETTING(対象)
#DIM 対象
#DIM FIRST_LINE
#DIMS PRESET_NAME = "冒険者", "一般人", "貴族", "奴隷"
#DIM INPUT_VALUE

FIRST_LINE = LINECOUNT

PRINTL
CALL SINGLE_DRAWLINE()
PRINTFORML %ANAME(MASTER)%の衣装を以下の4種類から選択できます
PRINTL
CALLF TAG_PRINT(@"@B:0@[冒険者]　@/B@", 4)
CALLF TAG_PRINT(@"@B:1@[一般人]　@/B@", 4)
CALLF TAG_PRINT(@"@B:2@[貴人]　@/B@", 4)
CALLF TAG_PRINT(@"@B:3@[奴隷]@/B@", 4)
PRINTL
PRINTL
CALL SHOW_CLOTH(対象)
PRINTBUTTON "[BACK]", 999

$INPUT_LOOP
REDRAW 1
INPUT
INPUT_VALUE = RESULT
IF RESULT == 999
	RETURN
ELSEIF INRANGE(INPUT_VALUE, 0, 3)
	TARGET = MASTER
	CALL CLOTH_RESET(TARGET)
	CALL RANDOM_CHARA_CLOTH_SETTING(PRESET_NAME:INPUT_VALUE)
	MASTER_EDIT_衣装変更済 = 1
ELSE
	REDRAW 0
	CLEARLINE 1
	GOTO INPUT_LOOP
ENDIF
REDRAW 0
CLEARLINE LINECOUNT - FIRST_LINE

RESTART

;-------------------------------------------------
;主人公編集処理終了処理
;エディットの編集決定、戻るから呼び出される
;-------------------------------------------------
@MASTER_EDIT_EXIT(CHARA_ID)
#DIM CHARA_ID

MASTER_EDIT_衣装変更済 = 0


code:
#DIM CONST MASTER_EDIT_CANDIDATE_MAX = 10

#DIM MASTER_EDIT_FATHER_CANDIDATE
#DIM MASTER_EDIT_MOTHER_CANDIDATE

#DIM MASTER_EDIT_BROTHER_CANDIDATE_NUM
#DIM MASTER_EDIT_BROTHER_CANDIDATE, MASTER_EDIT_CANDIDATE_MAX

#DIM MASTER_EDIT_CHILD_CANDIDATE_NUM
#DIM MASTER_EDIT_CHILD_CANDIDATE, MASTER_EDIT_CANDIDATE_MAX

#DIM MASTER_EDIT_衣装変更済


code:
;ゲーム開始時やロード時の処理

;-------------------------
;タイトル画面
;-------------------------
@SYSTEM_TITLE
CALLSHARP InitTranslateNative("ERB\\TRANSLATE\\")
RESETDATA
STOPBGM
;FLOWINPUTS 0
CALL SYSTEM_TITLE_SCREEN

@SYSTEM_TITLE_SCREEN
$INPUT_TITLE_SCREEN
CLEARLINE 30
CALL SINGLE_DRAWLINE
ALIGNMENT CENTER
PRINTL eraFL
PRINTFORML %GAMEBASE_AUTHOR%
PRINTL
PRINTFORML Ver%GET_VERSION_STRING(GAMEBASE_VERSION)%
PRINTFORML %GAMEBASE_INFO%
CALL SINGLE_DRAWLINE
PRINTL
PRINTBUTTON @" 0 - [%TR("最初から")%]", 0
PRINTL
PRINTBUTTON @" 1 - [%TR("続きから")%]", 1
PRINTL
;クイックロードはロード可能な場合のみボタン化(CHKDATAは0だとロード可能。不思議。)
CALL PRINTBUTTON_EX(@" 2 - [%TR("クイックロード")%]", 2, CHKDATA(9999) == 0)
PRINTL
PRINTBUTTON @" 3 - [%TR("カスタムキャラ")%]", 3
PRINTL
PRINTBUTTON @" 4 - [%TR("ヘルプ")%]", 4
PRINTL
PRINTL
PRINTL
PRINTBUTTON @" 9 - [%TR("LANGUAGE")%]",9
PRINTL
PRINTL
PRINTBUTTON " 5[Discord]", 5
; PRINTL
; PRINTBUTTON " 6[口上エディタ]", 6
; PRINTL

[IF_DEBUG]
PRINTL
PRINTL
PRINTBUTTON "99[   DEBUG]", 99
PRINTL
[ENDIF]
ALIGNMENT LEFT
$INPUT_LOOP
INPUT
CLEARLINE 1

IF RESULT == 0
	BEGIN FIRST
ELSEIF RESULT == 1
	CALL LOAD_GAME
	GOTO INPUT_TITLE_SCREEN
ELSEIF RESULT == 2
	CALL QUICK_LOAD
ELSEIF RESULT == 3
	CALL CUSTOM_CHARA_MENU
	GOTO INPUT_TITLE_SCREEN
ELSEIF RESULT == 4
	CALL CREATE_HELP_MAP
	CALL CONFIG_HELPMENU
	GOTO INPUT_TITLE_SCREEN
ELSEIF RESULT == 5
	CALLSHARP LAUNCH_BROWSER("https://discord.gg/Hyr5hRsxd9")
	; ELSEIF RESULT == 6 //タイトルメニューでなくてもよい気がする。一旦コメントアウト
	; 	CALLSHARP LAUNCH_BROWSER(".\\tools\\eraFL口上エディタ\\editor.html")
ELSEIF RESULT == 99
	[IF_DEBUG]
	CALL DEBUGMENU()
	GOTO INPUT_TITLE_SCREEN
	[ENDIF]
ELSEIF RESULT == 9
	IF CONFIG:666 == 1
		CONFIG:666 = 0
	ELSE
		CONFIG:666 = 1
	ENDIF
	GOTO INPUT_TITLE_SCREEN
ENDIF
GOTO INPUT_LOOP

;-------------------------------------------------
;ニューゲーム
;-------------------------------------------------
@EVENTFIRST
;初期化処理
CALL INIT_NEWGAME

CALL NEWLOOP
CALL GAME_INIT

IF RESULT != -1
	BEGIN SHOP
ELSE
	CLEARLINE LINECOUNT
ENDIF
BEGIN TITLE

;-------------------------------------------------
;ロード時とニューゲーム時の共通初期化処理
;-------------------------------------------------
@INIT_COMMON
;グローバル変数の読み込み
LOADGLOBAL

;乱数初期化
INITRAND

;ターゲットの初期化
CALL CLEAR_MTAR

;PALAMLVの設定
; PALAMLV:0 = 0
; PALAMLV:1 = 100
; PALAMLV:2 = 300
; PALAMLV:3 = 500
; PALAMLV:4 = 1500
; PALAMLV:5 = 3000
; PALAMLV:6 = 6000
; PALAMLV:7 = 10000
; PALAMLV:8 = 30000
; PALAMLV:9 = 50000
; PALAMLV:10 = 100000
; PALAMLV:11 = 250000
; PALAMLV:12 = 500000
; PALAMLV:13 = 1000000
; PALAMLV:14 = 2500000
; PALAMLV:15 = 5000000
; PALAMLV:16 = 10000000
; PALAMLV:17 = 25000000
; PALAMLV:18 = 50000000
; PALAMLV:19 = 100000000
; PALAMLV:20 = 250000000
; PALAMLV:21 = 500000000
; PALAMLV:22 = 1000000000
; PALAMLV:23 = 2500000000
; PALAMLV:24 = 5000000000
; PALAMLV:25 = 9999999999

PALAMLV:0  = 0
PALAMLV:1  = 150
PALAMLV:2  = 450
PALAMLV:3  = 1835
PALAMLV:4  = 4930
PALAMLV:5  = 10439
PALAMLV:6  = 19225
PALAMLV:7  = 34147
PALAMLV:8  = 57547
PALAMLV:9  = 93400
PALAMLV:10 = 147410
PALAMLV:11 = 227723
PALAMLV:12 = 345943
PALAMLV:13 = 518550
PALAMLV:14 = 1101030
PALAMLV:15 = 2365833
PALAMLV:16 = 5141176
PALAMLV:17 = 11292314
PALAMLV:18 = 25056450
PALAMLV:19 = 56139293
PALAMLV:20 = 126951434
PALAMLV:21 = 289640614
PALAMLV:22 = 666459813
PALAMLV:23 = 1546089750
PALAMLV:24 = 3614981008
PALAMLV:25 = 8516516019

;COSの値を事前に計算してリストに記録する
FOR LOCAL:0, 0, 360
	COS_LIST:(LOCAL:0) = CALC_COS(LOCAL:0)
NEXT

CALL UPDATE

VARSET TRAIN_FORCED_COM_MPLY, -1
VARSET TRAIN_FORCED_COM_MTAR, -1

;アイテムの開発期間を設定
CALL SET_ITEMTERM

;ランダムキャラの名前候補リストを作成
CALL CREATE_NAME_LIST

;タトゥーのランダム入力内容リストを作成
CALL CREATE_TATTOO_LIST

;精液マップを作成
CALL CREATE_SPERM_MAP

;デイリーマップを作製
CALL CREATE_DAILY_MAP

;キャラクター関係性テーブル
;セーブされるテーブルのため、未作成時のみ作成
IF !DT_EXIST("CHARA_RELATION")
	CALL CREATE_CHARA_RELATION_TABLE
ENDIF

;汎用口上デイリー管理用テーブル
IF DT_EXIST("KOJO_DAILY")
	DT_RELEASE "KOJO_DAILY"
ENDIF
CALL CREATE_KOJO_DAILY_TABLE
;汎用口上デイリー非活性管理用テーブル
;セーブされるテーブルのため、未作成時のみ作成
IF !DT_EXIST("KOJO_DAILY_DISABLE")
	CALL CREATE_KOJO_DAILY_DISABLE_TABLE
ENDIF

;口上デイリーマップを作製
CALL CREATE_KOJO_DAILY_MAP

;ヘルプマップを作製
CALL CREATE_HELP_MAP

;用語集テーブルを作成
CALL CREATE_FLPEDIA_TABLE
CALL FLPEDIA_ARTICLE_REGISTER

;ランク閾値の生成
CALL INIT_RANK
CALL SET_ABL_MIN_MAX

;ツールチップパラメータ設定
CALL FL_INIT_TOOLCHIP()

;XMLドキュメント読み込み
CALL FL_INIT_LOADER

;トークン情報テーブルを作成
CALL CREATE_CC_SP_TOKEN_TABLE

;グラフィックス情報初期化
CALL 全画像廃棄()
FOR LOCAL, 0, CHARANUM
	CALL INIT_FACE_SPRITE(LOCAL)
NEXT
FOR LOCAL, 0, 15000
	GDISPOSE LOCAL
NEXT
;念の為スプライトも全て破棄
SPRITEDISPOSEALL 0
;ダミー画像スプライトのみ生成
CALL スプライト生成("dummy.webp", "FACE_DUMMY")

;-------------------------------------------------
;ランク閾値の初期化
;-------------------------------------------------
@INIT_RANK
ランク閾値:ランク_ＳＬＧ:ランク_S = 100
ランク閾値:ランク_ＳＬＧ:ランク_A = 80
ランク閾値:ランク_ＳＬＧ:ランク_B = 70
ランク閾値:ランク_ＳＬＧ:ランク_C = 60
ランク閾値:ランク_ＳＬＧ:ランク_D = 50
ランク閾値:ランク_ＳＬＧ:ランク_E = 40
ランク閾値:ランク_ＳＬＧ:ランク_F = 30
ランク閾値:ランク_ＳＬＧ:ランク_G = 0
ランク閾値:ランク_ＳＬＧ:ランク_無 = 0

ランク閾値:ランク_その他:ランク_S = 10
ランク閾値:ランク_その他:ランク_A = 8
ランク閾値:ランク_その他:ランク_B = 6
ランク閾値:ランク_その他:ランク_C = 4
ランク閾値:ランク_その他:ランク_D = 3
ランク閾値:ランク_その他:ランク_E = 2
ランク閾値:ランク_その他:ランク_F = 1
ランク閾値:ランク_その他:ランク_G = 0
ランク閾値:ランク_その他:ランク_無 = 0

ランク閾値:ランク_部隊:ランク_S = 80000
ランク閾値:ランク_部隊:ランク_A = 60000
ランク閾値:ランク_部隊:ランク_B = 40000
ランク閾値:ランク_部隊:ランク_C = 27000
ランク閾値:ランク_部隊:ランク_D = 20000
ランク閾値:ランク_部隊:ランク_E = 8000
ランク閾値:ランク_部隊:ランク_F = 5000
ランク閾値:ランク_部隊:ランク_G = 0
ランク閾値:ランク_部隊:ランク_無 = 0

ランク閾値:ランク_性知識:ランク_S = 5
ランク閾値:ランク_性知識:ランク_A = 4
ランク閾値:ランク_性知識:ランク_B = 3
ランク閾値:ランク_性知識:ランク_C = 2
ランク閾値:ランク_性知識:ランク_D = 1
ランク閾値:ランク_性知識:ランク_E = 0
ランク閾値:ランク_性知識:ランク_F = -1
ランク閾値:ランク_性知識:ランク_G = -1
ランク閾値:ランク_性知識:ランク_無 = -1

ランク閾値:ランク_戦闘力:ランク_S = 200
ランク閾値:ランク_戦闘力:ランク_A = 150
ランク閾値:ランク_戦闘力:ランク_B = 100
ランク閾値:ランク_戦闘力:ランク_C = 60
ランク閾値:ランク_戦闘力:ランク_D = 40
ランク閾値:ランク_戦闘力:ランク_E = 0
ランク閾値:ランク_戦闘力:ランク_F = -1
ランク閾値:ランク_戦闘力:ランク_G = -1
ランク閾値:ランク_戦闘力:ランク_無 = -1

ランク閾値:ランク_防御力:ランク_S = 20
ランク閾値:ランク_防御力:ランク_A = 15
ランク閾値:ランク_防御力:ランク_B = 10
ランク閾値:ランク_防御力:ランク_C = 7
ランク閾値:ランク_防御力:ランク_D = 5
ランク閾値:ランク_防御力:ランク_E = 0
ランク閾値:ランク_防御力:ランク_F = -1
ランク閾値:ランク_防御力:ランク_G = -1
ランク閾値:ランク_防御力:ランク_無 = -1

;能力値の最小・最大を設定
@SET_ABL_MIN_MAX()
FOR LOCAL:0, 0, 50
	ABL_MIN:(LOCAL:0) = 0
	ABL_MAX:(LOCAL:0) = 9999
NEXT
FOR LOCAL:0, 50, 70
	ABL_MIN:(LOCAL:0) = 0
	ABL_MAX:(LOCAL:0) = 300
NEXT
ABL_MAX:14 = 5
ABL_MIN:60 = -99
ABL_MIN:61 = -99
ABL_MIN:90 = -1000
ABL_MAX:90 = 1000
ABL_MIN:91 = -1000
ABL_MAX:91 = 1000
ABL_MIN:92 = 0
ABL_MAX:92 = 1000

ABL_MIN:99 = 0
ABL_MAX:99 = 100

;-------------------------------------------------
;ニューゲーム時の初期化処理
;-------------------------------------------------
@INIT_NEWGAME
;念のため全データ初期化
RESETDATA
;乱数ダンプ
DUMPRAND
;コンフィグの初期設定
CALL INIT_CONFIG

FOR LOCAL:0, 0, MAX_FIXED_CHARA
	;CSVファイルの存在判定
	SIF EXISTCSV(LOCAL:0) && GETCHARA(LOCAL:0) == -1
		CALL ADD_CHARA_FROM_CSV(LOCAL:0)
NEXT

;CSVでは設定できないキャラデータの初期設定
CALL ADDITIONAL_CHARA_SETTING

;ロード時とニューゲーム時の共通初期化処理
CALL INIT_COMMON

;INIT_COMMONのあとに呼ばないとCREATE_SPERM_MAPが呼ばれてないのでこまる
CALL INIT_CHARA_SIBLING_RELATION()

;0～199番のアイテムを売りに出す
VARSET ITEMSALES, 1, 0, 200

CALL DAILY_SET_DISABLE("DRUG_SEX", 1)
CALL DAILY_SET_DISABLE("YOU_SEXHARA", 1)
CALL DAILY_SET_DISABLE("YOU_WANDERING", 1)

;周回を0に設定
FLAG:周回数 = 0

;-------------------------------------------------
;CSVでは設定できないキャラデータの初期設定
;-------------------------------------------------
@ADDITIONAL_CHARA_SETTING


code:
;-------------------------------------------------
;ARG:0 = 1 で周回モード
;-------------------------------------------------
@NEWLOOP(ARG:0=0)
;変数の初期化
CALL NEWLOOP_RESET_VARS
;テーブル作成処理
CALL CREATE_WEAPON_STOCK_TABLE
CALL CREATE_CLOTH_DRAWER_TABLE
CALL CREATE_CRAFT_ORDER_TABLE
CALL CREATE_RUNE_STOCK_TABLE

COUNTRY_BOSS:1                   = GET_ID(NAME_TO_CHARA("あなた"))
CFLAG:NAME_TO_CHARA("あなた"):所属 = GET_COUNTRY_FROM_BOSS_NAME("あなた")
MONEY += 10000
;もろもろ終わってからのリセット処理
CALL NEWLOOP_ADDITIONAL_RESET_VARS

RETURN 1

;-------------------------------------
;シナリオ側で特殊キャラを生成しており、かつ一週目、「戻る」したときのため、特殊キャラを全て削除する
;-------------------------------------
@NEWLOOP_DELETE_ALL_SP_CHARA(ARG:0)
LOCAL:2 = CHARANUM
FOR LOCAL:0, 0, LOCAL:2
	LOCAL:1 = LOCAL:2 - LOCAL:0 - 1
	IF (IS_SP_CHARA(LOCAL:1) && MASTER != LOCAL:1) || TALENT:(LOCAL:1):カスタムキャラ == 2
		CALL DELETE_CHARA(LOCAL:1)
	ENDIF
NEXT

;-------------------------------------
;新しく周回する時用、変数のリセット処理
;-------------------------------------
@NEWLOOP_RESET_VARS
;日付を1日目に戻す
DAY = 1

;触手部屋の管理者を初期化
FLAG:触手部屋管理者 = 0

;フェイズを拠点フェイズにする
TIME = 0

;シナリオ専用変数をリセット
VARSET SCVAR, 0

;デイリーイベント変数をリセット
VARSET DVAR, 0
VARSET DSTR,
;口上用デイリーイベント変数をリセット
FOR LOCAL, 0, VARSIZE("KDVAR")
	CVARSET KDVAR, LOCAL, 0
	CVARSET KDSTR, LOCAL,
NEXT

;特殊勢力関係の変数をリセット
VARSET SP_COUNTRY_START
VARSET SP_COUNTRY_RANK
VARSET SP_COUNTRY_APPEARED
VARSET SP_COUNTRY_BOSSNAME
VARSET SP_COUNTRY_BOSSNAME_LAST_NAME
VARSET SP_COUNTRY_BOSSNAME_FIRST_NAME
VARSET SP_COUNTRY_INITIAL_RISE
VARSET SP_COUNTRY_GENDER, -1
VARSET BANDIT_HAS_INITIAL_CITIES

FOR LOCAL, 0, VARSIZE("SP_TRAIN_COUNT")
	CVARSET SP_TRAIN_COUNT, LOCAL, 0
NEXT

;捕虜について削除
VARSET PRISONER_TARGET, -1

;スカウト回数をリセット
VARSET SCOUT_COUNT, 0

;特別訓練回数をリセット
VARSET SPECIAL_TRAIN_COUNT, 0

;変数の初期化
TARGET = -1
ASSI = -1

;クリアフラグを解除
FLAG:クリアフラグ = 0
FLAG:クリア直後フラグ = 0
FLAG:強制エンドフラグ = 0
SHOP_TIME = 0

;観戦モードフラグを0
FLAG:観戦モード = 0

;SHOW_INFOの初期画面を基本情報にする
FLAG:能力表示モード = 0

;SLG関連の変数をクリア
STATS_TIME = 0
VARSET STATS_BOSS_ID_LIST, 0
VARSET STATS_GDP, 0
VARSET STATS_ARMY, 0
VARSET CITY_ROUTE, 0
VARSET CITY_TYPE, 0
VARSET CITY_ECONOMY, 0
VARSET CITY_SOLDIER, 0
VARSET CITY_GUARD, 0
VARSET CITY_OWNER, 0
VARSET CITY_COMMANDER, 0
VARSET CITY_DEVELOPMENT, 0
VARSET COUNTRY_BOSS, 0
VARSET COUNTRY_COLOR, 0
VARSET COUNTRY_SOLDIER, 0
VARSET COUNTRY_AI_TYPE, 0
VARSET COUNTRY_NOTARGET_TERM, 0
VARSET COUNTRY_IS_CLOSED, 0
VARSET COUNTRY_EVENT_ID, 0
VARSET AUTO_INVEST_PRICE, 0
VARSET UNIT_SOLDIER,0
VARSET UNIT_POSITION,0
VARSET UNIT_TARGET,0
VARSET UNIT_COMMANDER,0
VARSET TECHNOLOGY_STATUS, 0
VARSET TECHNOLOGY_RESEARCH_TARGET, -1
VARSET TECHNOLOGY_RESEARCH_PROGRESS, 0
VARSET TREATY_A_TERM, 0
VARSET TREATY_U_TERM, 0
VARSET TREATY_U_TARGET, 0
VARSET TREATY_C_TERM, 0
VARSET DIPLOMACY_HATE, 0
VARSET COUNTRY_NOTDIPLOMACY_TERM, 0
VARSET TREATY_A_COUNTRY
VARSET TREATY_U_COUNTRY
VARSET TREATY_C_COUNTRY

VARSET TMP_COUNTRY_RELATION
VARSET TMP_COUNTRY_RELATION_TERM
VARSET TMP_COUNTRY_IS_NEIBORING
VARSET TMP_COUNTRY_BOSS_NUMBER
VARSET TMP_COUNTRY_BOSS_NAME_SHORT
VARSET TMP_COUNTRY_UNION_TARGET
VARSET TMP_UNIT_ONCITY_CNT
VARSET TMP_UNIT_ONCITY_NUM
VARSET TMP_SUM_POLITICS_POWER
VARSET TMP_SUM_COOKING_POWER
VARSET TMP_COUNTRY_STARS
VARSET TMP_CHARA_STARS
VARSET TMP_CONNECTED_TO_US
VARSET TMP_CONNECTED_TO_US_ONLY
VARSET TMP_CONNECTED_TO_ENEMY
VARSET TMP_ENCLAVE_NUM
VARSET TMP_ENCLAVE_SIZE
VARSET TMP_MAX_ENCLAVE_SIZE
VARSET TMP_OFFENSIVE_IMPORTANCE
VARSET TMP_DEFFENSIVE_IMPORTANCE
VARSET TMP_CITY_RISK
VARSET TMP_IS_INVADABLE
VARSET TMP_IS_BYPASS
VARSET TMP_OWN_CITY
VARSET TMP_SUM_ECONOMY
VARSET TMP_SUM_ECONOMY_LIMIT
VARSET TMP_SUM_SOLDIER

;ランダム系シナリオ等でPLACEMENT呼び出し後に「戻る」したときのため、キャラの所属を消去
FOR LOCAL, 0, CHARANUM
	CFLAG:LOCAL:所属 = 0
	CFLAG:LOCAL:特殊状態 = 0
	CFLAG:LOCAL:捕虜先 = 0
NEXT

;シナリオ12「悪の栄えたためしなし」でPLACEMENT呼び出し後に「戻る」したときのため、出現フラグをリセット
VARSET SP_COUNTRY_APPEARED, 0

;マップIDをリセット
MAPID '= "DEFAULT"

;各勢力の国庫を空に（プレイヤーの懐はそのまま）
VARSET MONEY, 0, 1

;-------------------------------------------------
;もろもろの処理後に行う変数リセット処理
;-------------------------------------------------
@NEWLOOP_ADDITIONAL_RESET_VARS

FOR LOCAL, 0, CHARANUM
	SIF TALENT:LOCAL:カスタムキャラ == 2
		TALENT:LOCAL:カスタムキャラ = 1
NEXT
;-------------------------------------------------
;シナリオに関連するスタートアップ処理; 4Xにシナリオなんてねえ！
;-------------------------------------------------
@STARTUP_SCENARIO
RETURN

;-------------------------------------------------
;シナリオ選択
;-------------------------------------------------
@SELECT_SCENARIO

;-------------------------------------------------
;勢力選択
;-------------------------------------------------
@SELECT_COUNTRY

;-------------------------------------------------
;特殊勢力の選択
;-------------------------------------------------
@SP_COUNTRY_START_SELECT()

;-------------------------------------------------
;主人公選択
;-------------------------------------------------
@SELECT_MASTER

@SELECT_CHARA_LIST_SHOW_LOGIC_SELECT_MASTER(対象)
#DIM 対象
;どこかの勢力を選択した場合は、そこ所属のキャラ以外は弾く。
SIF FLAG:OP選択勢力 > 0 && CFLAG:対象:所属 != FLAG:OP選択勢力
	RETURN 0
;特殊なスタートを選択した場合、君主は弾く。
SIF FLAG:OP選択勢力 <= 0 && GET_COUNTRY_BOSS(CFLAG:対象:所属) == 対象
	RETURN 0
;「あなた」をまだ作ってないならダメ
SIF !FLAG:あなた作成済み && 対象 == NAME_TO_CHARA("あなた")
	RETURN 0
RETURN 1

;-------------------------------------------------
;旗揚げスタート時用、SELECT_CHARA_LIST_MULTIの表示ロジック
;君主と「あなた」と主人公以外の東方キャラ
;-------------------------------------------------
@SELECT_CHARA_LIST_SHOW_LOGIC_START_WITH_NEW_COUNTRY(対象)
#DIM 対象
RETURN GET_COUNTRY_BOSS(CFLAG:対象:所属) != 対象 && !TALENT:対象:特殊勢力素質 && 対象 != NAME_TO_CHARA("あなた") && 対象 != MASTER
;-------------------------------------------------
;「あなた」を新規に作成した場合のボーナス
;-------------------------------------------------
@NEWLOOP_ANATA_BONUS
#DIM FIRST_LINE
#DIM 選択ボーナス
FIRST_LINE = LINECOUNT
CALL SINGLE_DRAWLINE
CALL COLOR_PRINTL("あなた新規作成ボーナス！", カラー_注意)
PRINTFORML 「あなた」を新規に作成して主人公にしたので、ボーナスがもらえます
PRINTFORML どれにしますか？(どれも後から手に入ります)
{
	CALL ASK_MULTI(
		"素質【酒豪】",                 "素質【天の御遣い】",           "素質【君主の器】", "素質【求心力】", "素質【魔術知識】と魔術ステータス10",
		"素質【技師】",                 "素質【絶倫】",     "金5万",       "アイテム【催眠術】","【チョロイン】【合意】3人分",
		"お手軽調教セット",             "いらない")
}
選択ボーナス = RESULT
SELECTCASE 選択ボーナス
	CASE 0
		PRINTFORML 酒に非常に強くなる素質「酒豪」にしますか？
		PRINTFORML (通常取得には大量の飲酒が必要なため、かかる金と手間はボーナス中でも随一です)
	CASE 1
		PRINTFORML 好感度を得やすくなる素質「天の御遣い」にしますか？
		PRINTFORML (恋慕させるルートに入りやすくなります)
	CASE 2
		PRINTFORML 従属度を得やすくなる素質「君主の器」にしますか？
		PRINTFORML (屈服させるルートに入りやすくなります)
	CASE 3
		PRINTFORML 依存度を得やすくなる素質「求心力」にしますか？
		PRINTFORML (恋慕・従属どちらのルートでも必要な値なので便利です)
	CASE 4
		PRINTFORML 触手が扱えるようになる素質「魔術知識」と、ＳＬＧステータス「魔術」10のセットにしますか？
		PRINTFORML (魔術はとても鍛えにくいので10でも貴重です）
	CASE 5
		PRINTFORML アイテム開発が早くなり、効果が高まる素質「技師」にしますか？
		PRINTFORML (多くのアイテムは開発→購入というプロセスを経るので、持っておくと地味に便利です)
	CASE 6
		PRINTFORML 調教による体力・気力の減少が非常に少なくなる素質「絶倫」にしますか？
		PRINTFORML （調教中に主人公の体力が尽きると調教が終了してしまいます）
		PRINTFORML （結構激しめに消費するので、あるとかなり便利です）
	CASE 7
		PRINTFORML 金は力。金5万にしますか？
		PRINTFORML （士官の雇用、兵の雇用、アイテム購入に訓練……金はいくらあっても足りません)
		PRINTFORML （これだけあれば、開幕から強力な士官を雇うこともできるでしょう）
	CASE 8
		PRINTFORML 発動することでコマンド実行判定にボーナスのかかる「催眠術」を習得しますか？
		PRINTFORML （購入までの前提条件が多く、最も取得の面倒なアイテムの一つです）
		PRINTFORML （練習が必要ですが、十分に鍛わるとたいていのキャラに容易に好き放題できるようになります）
	CASE 9
		PRINTFORML もってるとチョロくなる隠し素質「チョロイン」と、エロいことをする許し「合意」を3人まで付与しますか？
		PRINTFORML (おまけで、攻略に必要なパラメタである好感度・依存度・服従度・支配度を+1000しておきます)
		PRINTFORML (開幕えろいことしたい人向け)
	CASE 10
		PRINTFORML 調教アイテムの詰め合わせ、お手軽調教セットにしますか？
		PRINTFORML （ローター、バイブ、アナルバイブ、クリ/ニプルキャップ、ペニスバンド、オナホール、縄、鞭、目隠し、ローション * 10、メイガスの夜 * 5、ビデオとビデオテープ * 5）
		PRINTFORML （アイテム開発にかかる時間を飛ばせます。使う相手がいないと意味ないけどネ！）
	CASE 11
		PRINTFORML マジで……？
		PRINTFORML (実はあとから別のボーナス！　とかマジでないです)
		PRINTFORML (縛りプレイ用。きみはもの好きなのか？)
ENDSELECT

CALL ASK_YN

IF RESULT == 1
	CLEARLINE LINECOUNT - FIRST_LINE
	RESTART
ENDIF

SELECTCASE 選択ボーナス
	CASE 0
		TALENT:MASTER:酒豪 = 1
	CASE 1
		TALENT:MASTER:天の御遣い = 1
	CASE 2
		TALENT:MASTER:君主の器 = 1
	CASE 3
		TALENT:MASTER:求心力 = 1
	CASE 4
		TALENT:MASTER:魔術師 = 1
		ABL:MASTER:魔術 = 10
	CASE 5
		TALENT:MASTER:技師 = 1
	CASE 6
		TALENT:MASTER:絶倫 = 1
	CASE 7
		MONEY += 50000
	CASE 8
		ITEM:GETNUM(ITEM, "催眠術") = 1
	CASE 9
		PRINTFORML ちゃんと3人指定してなくても決定できちゃうので気を付けてね！
		CALL SINGLE_DRAWLINE
		CALL SELECT_CHARA_LIST_MULTI_ONLY_LOGIC_SLG(3, "NONE", "NONE")
		FOR LOCAL, 0, SELECTED_CHARA_NUM
			LOCAL:1 = SELECTED_CHARA:LOCAL
			TALENT:(LOCAL:1):チョロイン = 1
			TALENT:(LOCAL:1):合意 = 1
			CFLAG:(LOCAL:1):好感度 += 1000
			CFLAG:(LOCAL:1):従属度 += 1000
			CFLAG:(LOCAL:1):依存度 += 1000
			CFLAG:(LOCAL:1):支配度 += 1000
		NEXT
	CASE 10
		ITEM:ローター            = 1
		ITEM:バイブ              = 1
		ITEM:アナルバイブ        = 1
		ITEM:クリキャップ        = 1
		ITEM:ニプルキャップ      = 1
		ITEM:ペニスバンド        = 1
		ITEM:オナホール          = 1
		ITEM:縄                  = 1
		ITEM:鞭                  = 1
		ITEM:目隠し              = 1
		ITEM:ローション         += 10
		ITEM:メイガスの夜             += 5
		ITEM:ビデオカメラ        = 1
		ITEM:ビデオテープ       += 5
		ITEMSALES:ローター       = 0
		ITEMSALES:バイブ         = 0
		ITEMSALES:アナルバイブ   = 0
		ITEMSALES:クリキャップ   = 0
		ITEMSALES:ニプルキャップ = 0
		ITEMSALES:ペニスバンド   = 0
		ITEMSALES:オナホール     = 0
		ITEMSALES:縄             = 0
		ITEMSALES:鞭             = 0
		ITEMSALES:目隠し         = 0
		ITEMSALES:ビデオカメラ   = 0
	CASE 11
		PRINTFORML 物好きだなぁ
ENDSELECT

;-------------------------------------------------
;ランダムキャラと性知識の設定
;-------------------------------------------------
@EXTRA_SETTING
#DIM FIRST_LINE
#DIM ランダムキャラ
#DIM 性知識最大
#DIM 君主
FIRST_LINE = LINECOUNT
CALL SINGLE_DRAWLINE

IF FLAG:OPランダムキャラ使用 == 0
	PRINTFORM ランダムキャラ:
	CALL PRINT_SELECT_BUTTON("[使う]", 0, ランダムキャラ)
	CALL PRINT_SELECT_BUTTON("[使わない]", 1, !ランダムキャラ)
	PRINTL
	PRINTL （非使用を推奨しています）
ENDIF

IF !FLAG:観戦モード
	PRINTFORM         性知識:
	CALL PRINT_SELECT_BUTTON("[5にする]", 10, 性知識最大)
	CALL PRINT_SELECT_BUTTON("[そのまま]", 11, !性知識最大)
	PRINTL
ENDIF

IF FLAG:OP選択勢力 > 0 && COUNTRY_BOSS:(CFLAG:MASTER:所属) != GET_ID(MASTER) && !IS_SP_COUNTRY(CFLAG:MASTER:所属)
	PRINTFORM           君主:
	CALL PRINT_SELECT_BUTTON("[君主としてスタート]", 20, 君主)
	CALL PRINT_SELECT_BUTTON("[そのまま]", 21, !君主)
	PRINTL
ENDIF

CALL SINGLE_DRAWLINE
PRINTBUTTON "[完了]", 100

INPUT

IF RESULT == 100
	IF FLAG:OPランダムキャラ使用 == -1
		FLAG:ランダムキャラ使用 = 0
	ELSEIF FLAG:OPランダムキャラ使用 == 1
		FLAG:ランダムキャラ使用 = 1
	ELSEIF ランダムキャラ
		FLAG:ランダムキャラ使用 = 1
	ELSEIF !ランダムキャラ
		FLAG:ランダムキャラ使用 = 0
	ENDIF
	IF 性知識最大
		ABL:MASTER:性知識 = 5
	ENDIF
	IF 君主
		COUNTRY_BOSS:(CFLAG:MASTER:所属) = GET_ID(MASTER)
	ENDIF
	RETURN
ELSEIF RESULT == 0 && FLAG:OPランダムキャラ使用 == 0
	ランダムキャラ = 1
ELSEIF RESULT == 1
	ランダムキャラ = 0
ELSEIF RESULT == 10
	性知識最大 = 1
ELSEIF RESULT == 11
	性知識最大 = 0
ELSEIF RESULT == 20 && FLAG:OP選択勢力 > 0 && COUNTRY_BOSS:(CFLAG:MASTER:所属) != GET_ID(MASTER) && !IS_SP_COUNTRY(CFLAG:MASTER:所属)
	君主 = 1
ELSEIF RESULT == 21
	君主 = 0
ENDIF

CLEARLINE LINECOUNT - FIRST_LINE
RESTART

;-------------------------------------------------
;ランダムキャラを使用するかどうか選択
;-------------------------------------------------
@SELECT_RCHARA
IF FLAG:OPランダムキャラ使用 == -1
	FLAG:ランダムキャラ使用 = 0
ELSEIF FLAG:OPランダムキャラ使用 == 1
	FLAG:ランダムキャラ使用 = 1
ELSE
	CALL SINGLE_DRAWLINE
	PRINTFORML このシナリオではランダムキャラ（ランダムな名前をもつモブ的なキャラ）ありの設定にできます
	PRINTFORML ランダムキャラを使用しますか？
	CALL ASK_YN
	IF RESULT == 0
		FLAG:ランダムキャラ使用 = 1
	ELSE
		FLAG:ランダムキャラ使用 = 0
	ENDIF
ENDIF

;-------------------------------------------------
;カスタムキャラ等の設定
;-------------------------------------------------
@SETUP_SPECIAL_CHARACTERS()
#DIM 候補, MAX_CHARA_NUM
#DIM 候補数
#DIM 配置先, MAX_CHARA_NUM
#DIM FIRST_LINE
#DIM ページ

VARSET 候補,   -1
VARSET 候補数, 0
VARSET 配置先, -1
VARSET ページ

FOR LOCAL, 1, CHARANUM
	SIF IS_UNIQUE_CHARA(LOCAL) || IS_SP_COUNTRY_CHARA(LOCAL) || NAME_TO_CHARA("あなた") == LOCAL || LOCAL == MASTER
		CONTINUE
	候補:候補数 = LOCAL
	候補数 ++
NEXT

FOR LOCAL, 0, MAX_CUSTOM_CHARA
	SIF !FIND_CHARADATA(TOSTR(LOCAL))
		CONTINUE
	CALL LOAD_CUSTOM_DATA(LOCAL)
	TALENT:RESULT:カスタムキャラ = 2
	候補:候補数 = RESULT
	候補数 ++
NEXT

SIF 候補数 == 0
	RETURN 0

FIRST_LINE = LINECOUNT

$SHOW_LOOP

CALL SINGLE_DRAWLINE
PRINTFORML 引き継いだキャラ・カスタムキャラの出現設定を行います
CALL SINGLE_DRAWLINE

FOR LOCAL, ページ * 20, MIN(ページ * 20 + 20, 候補数)
	PRINTFORM [{LOCAL}]%ANAME(候補:LOCAL)% -
	IF 配置先:LOCAL == -1
		PRINTFORML 登場しない
	ELSEIF 配置先:LOCAL == 0
		PRINTFORML 放浪
	ELSE
		PRINTFORML %ANAME(GET_COUNTRY_BOSS(配置先:LOCAL))%
	ENDIF
NEXT
CALL SINGLE_DRAWLINE
PRINTBUTTON "[NEXT]", 10000
PRINTFORM {ページ+1}/{候補数 / 20 + 1}
PRINTBUTTON "[PREV]", 10001
PRINTL
CALL SINGLE_DRAWLINE
PRINTBUTTON "[一括]", 10003
PRINTL
CALL SINGLE_DRAWLINE
PRINTBUTTON "[完了]", 10002

INPUT

IF RESULT == 10000
	ページ = ROUND_DECREMENT(ページ, 0, 候補数 / 20)
ELSEIF RESULT == 10001
	ページ = ROUND_INCREMENT(ページ, 0, 候補数 / 20)
ELSEIF RESULT == 10003
	FOR LOCAL, 0, MAX_COUNTRY
		SIF !IS_COUNTRY(LOCAL)
			CONTINUE
		PRINTFORML [{LOCAL}] %ANAME(GET_COUNTRY_BOSS(LOCAL))%
	NEXT
	PRINTBUTTON "[放浪]", 0
	PRINTL
	PRINTBUTTON "[登場しない]", -1
	PRINTL
	PRINTBUTTON "[中止]", 99
	INPUT
	IF RESULT == 99
		CLEARLINE LINECOUNT - FIRST_LINE
		GOTO SHOW_LOOP
	ELSEIF (INRANGE(RESULT, 1, MAX_COUNTRY - 1) && IS_COUNTRY(RESULT)) || GROUPMATCH(RESULT, 0, -1)
		LOCAL:1 = RESULT
		FOR LOCAL, 0, 候補数
			配置先:LOCAL = LOCAL:1
		NEXT
	ENDIF
	CLEARLINE LINECOUNT - FIRST_LINE
	GOTO SHOW_LOOP
ELSEIF RESULT == 10002
	FOR LOCAL, 候補数 - 1, -1,  -1
		IF 配置先:LOCAL == -1
			CALL DELETE_CHARA(候補:LOCAL)
		ELSEIF 配置先:LOCAL == 0
			CFLAG:(候補:LOCAL):所属 = 0
			CFLAG:(候補:LOCAL):特殊状態 = 特殊状態_放浪
		ELSE
			CFLAG:(候補:LOCAL):所属 = 配置先:LOCAL
			CFLAG:(候補:LOCAL):特殊状態 = 0
		ENDIF
	NEXT
	RETURN
ENDIF

IF INRANGE(RESULT, 0, 候補数)
	LOCAL:1 = RESULT
	FOR LOCAL, 0, MAX_COUNTRY
		SIF !IS_COUNTRY(LOCAL)
			CONTINUE
		PRINTFORML [{LOCAL}] %ANAME(GET_COUNTRY_BOSS(LOCAL))%
	NEXT
	PRINTBUTTON "[放浪]", 0
	PRINTL
	PRINTBUTTON "[登場しない]", -1
	PRINTL
	INPUT
	IF GROUPMATCH(RESULT, 0, -1)
		配置先:(LOCAL:1) = RESULT
	ELSEIF IS_COUNTRY(RESULT)
		配置先:(LOCAL:1) = RESULT
	ENDIF
ENDIF

CLEARLINE LINECOUNT - FIRST_LINE
GOTO SHOW_LOOP

;-------------------------------------------------
;ユーザー選択による最初のゲーム設定
;-------------------------------------------------
@GAME_INIT

;初期処理
CALL CLOTH_INIT_MASTER

NEWGAME_SELECT_GAME_MODE = 0
CALL SELECT_GAMEMODE
SIF RESULT == -1
	RETURN -1

[SKIPSTART]
PRINTL チュートリアルを見ますか?
CALL ASK_YN
SIF RESULT == 0
	CALL TUTORIAL
[SKIPEND]

SELECTCASE NEWGAME_SELECT_GAME_MODE
	CASE 0, 2
		HO_ITEM_STOCK:ITEM_求人書類 += 1
	CASE 1
ENDSELECT

;-------------------------------------------------
;ゲームモード選択
;-------------------------------------------------
@SELECT_GAMEMODE

$SELECT_CHARA_TYPE
CALL SINGLE_DRAWLINE
PRINTL Select a companion to start the game with
PRINTL
PRINTBUTTON "[Unique characters (recommended for beginners)]", 0
PRINTL
PRINTBUTTON "[Custom characters]", 1
PRINTL
PRINTBUTTON "[Solo (for experienced players)]", 2
PRINTL
PRINTL
PRINTBUTTON "[BACK]", 9

INPUT
CLEARLINE 1
LOCAL = RESULT
SELECTCASE RESULT
	CASE 0
		CALL SELECT_UNIQEU_CHARA
		NEWGAME_SELECT_GAME_MODE = 0
	CASE 1
		CALL SELECT_CUSTOM_CHARAS
		NEWGAME_SELECT_GAME_MODE = 1
	CASE 2
		NEWGAME_SELECT_GAME_MODE = 2
	CASEELSE
		RETURN -1
ENDSELECT

IF !RESULT
	GOTO SELECT_CHARA_TYPE
ENDIF

;キャラ編集確定
;-------------------------------------------------
;服装所持数初期化
VARSET HAVE_CLOTH, 0

;あなた編集
CALL ASK_EDIT_MASTER
IF !RESULT
	GOTO SELECT_CHARA_TYPE
ENDIF
;ユニークキャラの初期装備
IF CFLAG:NAME_TO_CHARA("リュミエール"):所属 == 所属_プレイヤー
	CALL QST_GET_WEAPON(3, "リュミエールの鉄の戦鎚", WPN_材質_鉄,,,,,0)
	CALL EQUIP_WEAPON(NAME_TO_CHARA("リュミエール"), RESULT)
ENDIF

CALL PRINT_OPENING_MESSAGE
RETURN 0

@SELECT_CUSTOM_CHARA
#DIM 入力値
#DIM ページ
#DIM CHARA_BUFFER

$INPUT_LOOP
CALL LISTUP_CUSTOM_CHARACTER(0, ページ, 20)
PRINTL
PRINTBUTTON "[BACK]", 9999

INPUT
CLEARLINE 1
入力値 = RESULT
IF RESULT == 1000 && ページ > 0
	ページ --
	GOTO INPUT_LOOP
ELSEIF RESULT == 1001 && ページ < 50
	ページ ++
	GOTO INPUT_LOOP
ELSEIF !FIND_CHARADATA(TOSTR(入力値))
	LOCAL = RESULT
	IF INRANGE(RESULT, 0, MAX_CUSTOM_CHARA - 1)
		CALL INIT_CUSTOM_DATA
		CHARA_BUFFER = RESULT
		CALL EDIT_CUSTOM_DATA(LOCAL, CHARA_BUFFER)
		SIF CHARA_BUFFER < CHARANUM
			CALL DELETE_CHARA(CHARA_BUFFER)
	ENDIF
	GOTO INPUT_LOOP
ELSEIF RESULT == 9999
	RETURN -1
ENDIF

;カスタムキャラを自所属に
;-------------------------------------------------
CALL LOAD_CUSTOM_DATA(入力値)
TALENT:RESULT:カスタムキャラ = 2
CFLAG:RESULT:所属 = 所属_プレイヤー

RETURN RESULT

;-------------------------------------------------
;ユニークキャラ登録処理
;-------------------------------------------------
@SELECT_UNIQEU_CHARA
CALL SINGLE_DRAWLINE
PRINTFORML 対象キャラクターを選択してください
PRINTL
$INPUT_LOOP
CALL DRAW_PORTRAIT(NAME_TO_CHARA("エル"), "[サイズ:150px][POS_X:4800]")
PRINTBUTTON "[1] Eru", 1
PRINTFORML
PRINTFORML GENDER：F AGE：16
PRINTFORML JOB: Magical Engineer
PRINTFORML
PRINTFORML * Young Magical Engineer
PRINTFORML 飄々とした性格で掴みどころが無い。若年ながらアカデミーの在籍歴を持ち、腕は確かなようだ
PRINTL
PRINTL
PRINTL
PRINTL
CALL DRAW_PORTRAIT(NAME_TO_CHARA("リュミエール"), "[サイズ:150px][POS_X:4800]")
PRINTBUTTON "[2] Lumieru", 2
PRINTFORML
PRINTFORML GENDER: F AGE: 17
PRINTFORML JOB: Maid
PRINTFORML
PRINTFORML * The silent maid
PRINTFORML 寡黙で自身の感情をあまり表に出さない。給仕や作法に通じ武芸にも一定の心得がある
PRINTFORML 出で立ちにはなにやら複雑な事情があるようだが…
PRINTL
PRINTL
PRINTBUTTON "[BACK]", 9999

INPUT
SELECTCASE RESULT
	CASE 1
		CFLAG:NAME_TO_CHARA("エル"):所属 = 所属_プレイヤー
	CASE 2
		CFLAG:NAME_TO_CHARA("リュミエール"):所属 = 所属_プレイヤー
	CASE 9999
		RETURN 0
	CASEELSE
		GOTO INPUT_LOOP
ENDSELECT

RETURN RESULT

@SELECT_CUSTOM_CHARAS(選択人数 = 1)
#DIM 選択人数
#DIM DYNAMIC 入力値
#DIM DYNAMIC ページ
#DIM DYNAMIC CHARA_BUFFER
#DIM DYNAMIC SELECTED_LIST, MAX_CUSTOM_CHARA
#DIM DYNAMIC FIRST_LINE
VARSET LOCAL

CALL SINGLE_DRAWLINE
PRINTFORML 対象キャラクターを{選択人数}人選択してください
PRINTL

FIRST_LINE = LINECOUNT
$INPUT_LOOP
REDRAW 0
CLEARLINE LINECOUNT - FIRST_LINE
CALL LISTUP_SELECTED_CUSTOM_CHARACTER(0, ページ, 20, SELECTED_LIST, 1)

DRAWLINE
PRINTBUTTON "[DONE]", 9999
PRINTL
PRINTL
PRINTBUTTON "[BACK]", 10000

;入力受付
REDRAW 1
INPUT
CLEARLINE 1
入力値 = RESULT
IF 入力値 == 9999
	LOCAL:1 = 0
	FOR LOCAL, 0, MAX_CUSTOM_CHARA
		SIF SELECTED_LIST:LOCAL
			LOCAL:1 ++
	NEXT
	IF LOCAL:1 != 選択人数
		DRAWLINE
		SETCOLOR カラー_注意
		PRINTFORMW {選択人数}人選択してください
		RESETCOLOR
		DRAWLINE
		GOTO INPUT_LOOP
	ENDIF
ELSEIF 入力値 == 10000
	RETURN 0
ELSEIF RESULT == 1000 && ページ >= 1
	ページ --
	GOTO INPUT_LOOP
ELSEIF RESULT == 1001 && ページ < 50
	ページ ++
	GOTO INPUT_LOOP
ELSEIF !FIND_CHARADATA(TOSTR(入力値)) && 入力値 < 100000
	;◆新規作成
	LOCAL = RESULT
	IF INRANGE(RESULT, 0, MAX_CUSTOM_CHARA - 1)
		CALL INIT_CUSTOM_DATA
		CHARA_BUFFER = RESULT
		;編集できるよう一時的にプレイヤー所属にする
		CFLAG:CHARA_BUFFER:所属 = 所属_プレイヤー
		CALL EDIT_CUSTOM_DATA(LOCAL, CHARA_BUFFER)
		IF RESULT
			;編集後所属を無所属に
			CFLAG:CHARA_BUFFER:所属 = 0
			;一時作成したキャラデータの消去
			CALL DELETE_CHARA(CHARA_BUFFER)
		ENDIF
		; SIF CHARA_BUFFER < CHARANUM
	ENDIF
	GOTO INPUT_LOOP
ELSEIF 入力値 >= 0 && 入力値 < MAX_CUSTOM_CHARA
	INVERTBIT SELECTED_LIST:入力値, 0
	GOTO INPUT_LOOP
ELSEIF 入力値 >= 100000
	;◆既存キャラデータの編集
	LOCAL = 入力値 - 100000
	IF FIND_CHARADATA(TOSTR(LOCAL))
		CALL LOAD_CUSTOM_DATA(LOCAL)
		CHARA_BUFFER = RESULT
		;編集できるよう一時的にプレイヤー所属にする
		CFLAG:CHARA_BUFFER:所属 = 所属_プレイヤー
		CALL EDIT_CUSTOM_DATA(LOCAL, CHARA_BUFFER)
		IF RESULT
			;編集後所属を無所属に
			CFLAG:CHARA_BUFFER:所属 = 0
			;一時作成したキャラデータの消去
			CALL DELETE_CHARA(CHARA_BUFFER)
		ENDIF
	ENDIF
	GOTO INPUT_LOOP
ELSE
	GOTO INPUT_LOOP
ENDIF

FOR LOCAL, 0, MAX_CUSTOM_CHARA
	SIF !SELECTED_LIST:LOCAL
		CONTINUE
	CALL LOAD_CUSTOM_DATA(LOCAL)
	TALENT:RESULT:カスタムキャラ = 2
	CFLAG:RESULT:初期キャラ = 1
	CFLAG:RESULT:所属 = 所属_プレイヤー
NEXT

RETURN 1

@ASK_EDIT_MASTER
$EDIT_MASTER_START
CALL ASK_EDIT_MASTER_STATUS
SIF !RESULT
	RETURN 0
RETURN 1

@ASK_EDIT_MASTER_STATUS
#DIM FIRST_LINE
CALL SINGLE_DRAWLINE
PRINTL Edit your Character: change outfit and/or abilities?
PRINTL
FIRST_LINE = LINECOUNT
WHILE 1
	CLEARLINE LINECOUNT - FIRST_LINE
	CALL ASK_MULTI("Edit status", "Edit cloths", "Check character", "CONTINUE", "BACK")
	SELECTCASE RESULT
		CASE 0
			;CALL MASTER_EDIT
			VARSET HAVE_CLOTH, 1
			CALL CHARACTER_EDIT(MASTER)
			VARSET HAVE_CLOTH, 0
		CASE 1
			CALL MASTER_EDIT_CLOTH_SETTING(MASTER)
			MASTER_EDIT_衣装変更済 = 1
		CASE 2
			CALL SHOW_INFO_WITH_UI(MASTER, 0)
		CASE 3
			CALL MASTER_EDIT_EXIT(MASTER)
			RETURN 1
		CASE 4
			CALL MASTER_EDIT_EXIT(MASTER)
			FOR LOCAL, 0, CHARANUM
				SIF LOCAL == MASTER
					CONTINUE
				TALENT:LOCAL:カスタムキャラ = 0
				CFLAG:LOCAL:初期キャラ = 0
				CFLAG:LOCAL:所属 = 0
			NEXT
			RETURN 0
	ENDSELECT
WEND


code:
@PRINT_OPENING_MESSAGE
PRINTL
PRINTFORMW %ANAME(MASTER)% opens his eyes to overlook a massive landscape
PRINTFORMW Forests, mountains, open fields, all owned by %ANAME(MASTER)%
PRINTFORMW However, despite all the space, the living space is quite modest, equipped with the bare minimum to live.
PRINTFORML
PRINTFORMW So, what to do now?
PRINTFORML If you have nothing particular planned, you can choose [領内活動] from [一日を始める] to look around
PRINTFORMW and interact with your housemates and guests.
PRINTFORML
PRINTFORMW Nothing is holding %ANAME(MASTER)% here. Feel free to explore and discover new things.
PRINTFORML