code:
;≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
;文字列表示・アニメーション関数ファイル「ぱにめーしょん」0527版
;文字色設定や文字列のビジュアル・アニメ表示に特化した関数ファイルです。
;このファイル単独で利用できますが、旧ぱんくしょんその他との関数名被りにはご注意ください
;たぶん、たいていのバリアントにそのまま入れて動作するはずです
;≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡

;≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
;＠色操作系関数
;色の取出しや変換を行う基本関数。
;同梱の関数から呼ばれたり、呼ぶ時に使うと便利だったり。
;≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡

;-------------------------------------------------
;RGB色指定関数@RGBCOLOR
;	引数0：Ｒ輝度（0～255）
;	引数1：Ｇ輝度（0～255）
;	引数2：Ｂ輝度（0～255）
;
;式中で使用する関数です。引数0～3でRGBを指定すると、16進（0xRRGGBB）にして返します
;-------------------------------------------------
@RGBCOLOR(ARG, ARG:1, ARG:2)
#FUNCTION
RETURNF (65536*ARG)+(256*ARG:1)+ARG:2

;-------------------------------------------------
;カラー分解関数@GETRED/GETGREEN/GETBLUE
;	引数：16進カラー表記、省略すると現在の文字色
;
;0xRRGGBB形式のカラー表記から、RGBそれぞれの値を0～255で抽出します
;-------------------------------------------------
@GETRED(ARG = -1)
#FUNCTION
RETURNF (ARG >= 0 ? ARG # GETCOLOR())/65536

@GETGREEN(ARG = -1)
#FUNCTION
RETURNF ((ARG >= 0 ? ARG # GETCOLOR())/256)%256

@GETBLUE(ARG = -1)
#FUNCTION
RETURNF (ARG >= 0 ? ARG # GETCOLOR())%256

;≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
;＠拡張表示系関数
;Emuera本体の表示機能を無理やり強化する関数。
;BARをカラー表示したり、文字列をため込んだり、特殊文字を表示したり。
;≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡

;-------------------------------------------------
;カラーバー表示関数@PRINT_COLORBAR
;	引数0：バーにする変数（数値）
;	引数1：バーの最大値（数値）
;	引数2：バー全体の長さ（1あたり半角１文字）
;	文字列引数0：バーに使用する文字（省略すると*）
;	文字列引数1：バーの背景に使用する文字（省略すると.）
;	引数3：バーの色（16進。RGBCOLOR関数使用可能。省略すると現在の文字色に）
;	引数4：バーの背景色（同上）
;
;BARを指定した文字・指定した色で表示する関数です。UNICODE2588番などの、隙間のないブロックと相性がよかったり。
;隙間が出る場合はフォント関連のコンフィグを見直しましょう。
;引数0～2の仕様はBAR命令とほとんど同一（従来引数型）です。
;バーの背景とは、バーの最大値に満たない部分の表示です。格闘ゲームとかでよく見る■■■■■■□□　の□の部分。
;グラデーション機能を用意することもできそうですが、背景色もあるし、現状必要ないと思ってやってません。
;この関数は口上・開発chのCrow君から輸入して改変したものです。さんくす
;-------------------------------------------------
;!!! 触手宮側に同名の関数があるため、PRINT_COLORBAR_PA に名称変更
@PRINT_COLORBAR_PA(ARG, ARG:1, ARG:2, ARGS = "*", ARGS:1 = ".", ARG:3 = -1, ARG:4 = -1)
#LOCALSIZE 5
VARSET LOCAL
ARG:3 = ARG:3 < 0 ? GETCOLOR() # ARG:3
ARG:4 = ARG:4 < 0 ? GETCOLOR() # ARG:4
LOCAL:1 = ARG * ARG:2 / ARG:1
LOCAL:2 = GETCOLOR()
FOR LOCAL, 1, ARG:2 + 1
	IF LOCAL:1 >= LOCAL
		IF !LOCAL:3
			SETCOLOR ARG:3
			LOCAL:3 = 1
		ENDIF
		PRINTFORM %ARGS%
	ELSE
		IF !LOCAL:4
			SETCOLOR ARG:4
			LOCAL:4 = 1
		ENDIF
		PRINTFORM %ARGS:1%
	ENDIF
NEXT
SETCOLOR LOCAL:2

;-------------------------------------------------
;従来引数型・8分割カラーバー表示関数@PRINT_EIGHT_BAR_INT
;	引数0：バーにする変数（数値）
;	引数1：バーの最大値（数値）
;	引数2：バー全体の長さ（1あたり半角１文字）
;	引数3：バー始端の色（16進。RGBCOLOR関数使用可能。省略すると現在の文字色に）
;	引数4：バー終端の色（同上。省略すると単色バーに）
;	引数5：始色比率（始端の色が濃くなる。1～10で比率指定、デフォだと5、つまり5:5）
;
;引数0～2の仕様はBAR命令とほとんど同一（従来引数型）です。
;@PRINT_EIGHT_BARの引数が独自形式なので、従来のBARの形式でも呼び出せるように用意しました。
;半角の1/8刻みでバーを表示できますが、バーに使う文字を指定はできません。また、バーの背景色も使えません。
;引数3・4を指定することでグラデーションができますが、この場合色の変わる単位は半角１文字ごとになります。
;この関数は口上・開発chのkapnaluqa君から輸入したものです。さんくす
;-------------------------------------------------
@PRINT_EIGHT_BAR_INT(ARG, ARG:1, ARG:2, ARG:3 = -1, ARG:4 = -1, ARG:5 = 5)
;ARG:2を8倍して1/8単位での全体の長さを得る
ARG:2 *= 8
IF ARG >= ARG:1
	;対象変数が最大値以上だった場合、バーの長さは全体の長さに等しい
	ARG = ARG:2
ELSE
	;最大値を全体の長さで割って、1/8単位あたりの数値。
	;対象変数をそれで割ることで1/8単位での長さを得る
	ARG /= ARG:1/ARG:2
ENDIF
;数値を与えて表示関数へ
CALL PRINT_EIGHT_BAR(ARG, ARG:2, ARG:3, ARG:4, ARG:5, 10-ARG:5)

;-------------------------------------------------
;8分割カラーバー表示関数@PRINT_EIGHT_BAR
;	引数0：バーの長さ（半角1/8文字単位）
;	引数1：バー全体の長さ（半角1/8文字単位）
;		なお、バーの長さが最長の数値(ARG:1*8-1)を超えている場合、表示は0に戻る
;	引数2：バー始端の色（16進。RGBCOLOR関数使用可能。省略すると現在の文字色に）
;	引数3：バー終端の色（同上。省略すると単色バーに）
;	引数4：始色比率（始端の色が濃くなる）
;	引数5：終色比率（終端の色が濃くなる）
;
;独自形式の引数です。ご注意ください
;@PRINT_EIGHT_BARの引数が独自形式なので、従来のBARの形式でも呼び出せるように用意しました。
;半角の1/8刻みでバーを表示できますが、バーに使う文字を指定はできません。また、バーの背景色も使えません。
;引数3・4を指定することでグラデーションができますが、この場合色の変わる単位は半角１文字ごとになります。
;-------------------------------------------------
@PRINT_EIGHT_BAR(ARG, ARG:1 = 32, ARG:2 = -1, ARG:3 = -1, ARG:4 = 1, ARG:5 = 1)
#LOCALSIZE 1
#DIM COLOR
#DIM RED, 3
#DIM BLUE, 3
#DIM GREEN, 3
#DIM 始色比率
#DIM 終色比率
始色比率 = ARG:4
終色比率 = ARG:5
COLOR = GETCOLOR()
IF ARG:2  >= 0 && ARG:3 >= 0
	RED:1 = GETRED(ARG:2)
	GREEN:1 = GETGREEN(ARG:2)
	BLUE:1 = GETBLUE(ARG:2)
	RED:2 = GETRED(ARG:3)
	GREEN:2 = GETGREEN(ARG:3)
	BLUE:2 = GETBLUE(ARG:3)
ELSEIF ARG:2 >= 0
	SETCOLOR ARG:2
ENDIF
FOR LOCAL, 0, ARG:1
	IF ARG:2 >= 0 && ARG:3 >= 0
		RED = (RED:1 * (ARG:1 - LOCAL) * 始色比率 + RED:2 * LOCAL * 終色比率) / ((ARG:1 -LOCAL) * 始色比率 + LOCAL * 終色比率)
		GREEN = (GREEN:1 * (ARG:1 - LOCAL) * 始色比率 + GREEN:2 * LOCAL * 終色比率) / ((ARG:1 -LOCAL) * 始色比率 + LOCAL * 終色比率)
		BLUE = (BLUE:1 * (ARG:1 - LOCAL) * 始色比率 + BLUE:2 * LOCAL * 終色比率) / ((ARG:1 -LOCAL) * 始色比率 + LOCAL * 終色比率)
		SETCOLOR RED, GREEN, BLUE
	ENDIF
	IF LOCAL < MAX((ARG % (ARG:1 * 8) / 8),0)
		PRINTFORM %UNICODE(0x2588)%
	ELSEIF LOCAL == MAX((ARG % (ARG:1 * 8) / 8),0)
		PRINTFORM \@ARG % (ARG:1 * 8) % 8 ? %UNICODE(0x2588 + 8 - (ARG % (ARG:1 * 8) % 8))%# %" "%\@
	ELSE
		PRINTFORM
	ENDIF
NEXT
SETCOLOR COLOR

;-------------------------------------------------
;口上色指定文字列表示関数@PRINTCOLOR～系
;	引数0：文字色
;	引数1：文字列
;
;指定した文字色で文字列を表示します。カラー指定は16進ですが、RGBCOLOR関数を利用することができます
;PRINT命令同様の「PRINTCOLORL」「PRINTCOLORW」もありますが、書式は面倒です
;例えば…
;CALL PRINTCOLORW(RGBCOLOR(255, 0, 0), "この文字列は赤く表示されて改行待ちをします。")
;-------------------------------------------------
@PRINTCOLOR(ARG, ARGS, ARG:1)
#LOCALSIZE 1
LOCAL = GETCOLOR()
SETCOLOR ARG
PRINTFORM %ARGS%
IF ARG:1 == 1
	PRINTL
ELSEIF ARG:1 == 2
	PRINTW
ENDIF
SETCOLOR LOCAL
RETURN RESULT

@PRINTCOLORL(ARG, ARGS)
CALL PRINTCOLOR(ARG, ARGS, 1)
RETURN RESULT

@PRINTCOLORW(ARG, ARGS)
CALL PRINTCOLOR(ARG, ARGS, 2)
RETURN RESULT

;-------------------------------------------------
;文字列整列関数@UNITCELL
;	文字列引数：セルに入れる文字列
;	引数0：区切り文字数（PRINTCの文字数+1が望ましい）
;
;指定文字数に合わせて半角スペースを付与します。
;PRINTCとの違いは、指定文字数を超えた場合、指定文字数の２倍、３倍で区切る点です
;PRINTCと併用して横２セル結合みたいな表示ができます
;キチッと揃った表や罫線囲みを作成するのに便利です
;-------------------------------------------------
@UNITCELL(ARGS, ARG)
#FUNCTIONS
RETURNF @"%ARGS+(" "*(ARG-(STRLENS(ARGS)%ARG)))%"

;こちらは余った分はカットします。
@FIXEDCELL(ARGS, ARG)
#FUNCTIONS
RETURNF \@ STRLENS(ARGS) > ARG ? %SUBSTRING(ARGS, 0, ARG-2)%.. # %ARGS+" "*(ARG-(STRLENS(ARGS)))% \@

;-------------------------------------------------
;再描画関数@SAVELINE/@RETURNLINE
;	引数0：RETUENLINEから呼ばれたことを表す
;
;SAVELINEしてからRETURNLINEすると、SAVELINEしたところまで行削除します。
;メニューの再描画とかにご利用ください
;SAVELINE忘れてRETURNLINEするとごっそり削除してしまいます。
;-------------------------------------------------
@SAVELINE(ARG)
#LOCALSIZE 1
IF ARG
	CLEARLINE LINECOUNT-LOCAL
ELSE
	LOCAL = LINECOUNT
ENDIF
RETURN RESULT

@RETURNLINE
CALL SAVELINE, 1
RETURN RESULT

;-------------------------------------------------
;表示テキスト保管関数@STRBANK
;	文字列引数：保存する文面（空文字列可）
;	引数0：改行情報。0で改行なし、1で改行、2でクリック待ち、3でテキスト放出して廃棄、4で放出、5で廃棄（3以上のとき文字列引数は無視する）
;	引数1：文字色情報。0で指定なし、1で一行デフォカラー、2で一行カラー指定、3でカラー指定しつつ、そのカラーを維持する（表示が終わっても戻らない）
;	引数2：文字色指定。引数2が2か3だった場合に参照される。式中関数@RGBCOLORに対応
;
;繰り返し呼ぶことで文字列をLOCALSに蓄えていき、引数で指定したときにすべて表示します。
;表示方法は代入するときに指定可能。1000行まで引き受けるよ！
;カラー指定は行単位でのみ可能。同じ行で複数回指定された場合、最後の指定を優先。フォント指定は何かと問題起こすんでオミットしてます
;@STRBANKL～@STRDRAWを経由して使われるのを想定していますが、直接呼ばなきゃできない操作もあります。
;-------------------------------------------------
@STRBANK(ARGS, ARG, ARG:1, ARG:2)
#LOCALSIZE 1000
#LOCALSSIZE 1000
#DIM COLORDATA, 1000
#DIM COLORNUM, 1000
#DIM SET_LOCALS, 1
#DIM LCOUNT, 2
;初期設定
IF !SET_LOCALS
	VARSET LOCALS, "VOID"
	VARSET LOCAL
	SET_LOCALS = 1
ENDIF
;預金
IF ARG < 3
	FOR LCOUNT, 0, 1000
		IF !LOCAL:LCOUNT
			IF LOCALS:LCOUNT == "VOID"
				LOCALS:LCOUNT = %ARGS%
			ELSE
				LOCALS:LCOUNT = %LOCALS:LCOUNT + ARGS%
			ENDIF
			LOCAL:LCOUNT = ARG
			COLORDATA:LCOUNT = ARG:1
			COLORNUM:LCOUNT = ARG:2
			BREAK
		ENDIF
	NEXT
;引き出し
ELSE
	IF ARG < 5
		FOR LCOUNT, 0, 1000
			SIF LOCALS:LCOUNT == "VOID"
				BREAK
			SELECTCASE COLORDATA:LCOUNT
				CASE 0
					PRINTS LOCALS:LCOUNT
				CASE 1
					PRINTSD LOCALS:LCOUNT
				CASE 2
					LCOUNT:1 = GETCOLOR()
					SETCOLOR COLORNUM:LCOUNT
					PRINTS LOCALS:LCOUNT
					SETCOLOR LCOUNT:1
				CASE 3
					SETCOLOR COLORNUM:LCOUNT
					PRINTS LOCALS:LCOUNT
			ENDSELECT
			SELECTCASE LOCAL:LCOUNT
				CASE 1
					PRINTL
				CASE 2
					PRINTW
			ENDSELECT
		NEXT
	ENDIF
	IF ARG != 4
		VARSET LOCALS, "VOID"
		VARSET LOCAL
	ENDIF
ENDIF
RETURN RESULT

;以下、関連関数。PRINT系命令の名称に倣う
;一部使わないと判断して入ってないものも。

;STRBANKL 改行つきで文字列を保存する
@STRBANKL(ARGS)
CALL STRBANK(ARGS, 1)
RETURN RESULT

;STRBANKW 改行と入力待ちつきで文字列を保存する
@STRBANKW(ARGS)
CALL STRBANK(ARGS, 2)
RETURN RESULT

;STRBANKDL デフォルト文字色。改行つきで文字列を保存する
@STRBANKDL(ARGS)
CALL STRBANK(ARGS, 1, 1)
RETURN RESULT

;STRBANKDW デフォルト文字色。改行と入力待ちつきで文字列を保存する
@STRBANKDW(ARGS)
CALL STRBANK(ARGS, 2, 1)
RETURN RESULT

;STRBANKCL 文字色を引数で指定。改行つきで文字列を保存する
@STRBANKCL(ARGS, ARG)
CALL STRBANK(ARGS, 1, 2, ARG)
RETURN RESULT

;STRBANKCW 文字色を引数で指定。改行と入力待ちつきで文字列を保存する
@STRBANKCW(ARGS, ARG)
CALL STRBANK(ARGS, 2, 2, ARG)
RETURN RESULT

;STRDRAW 保存した文字列をすべてぶちまける。引数を1にするとデータを廃棄しない。2にすると表示せずに廃棄する。
@STRDRAW(ARG)
CALL STRBANK("", ARG + 3)
RETURN RESULT

;-------------------------------------------------
;ハートマーク関数@HEART
;	引数0：ハートの数（省略すると1つ）
;	引数1：使用するフォント名（省略するとVerdana）
;
;中抜きのハートマークを表示します
;-------------------------------------------------
@HEART(ARG = 1, ARGS = "Verdana")
#LOCALSIZE 1
#LOCALSSIZE 1
LOCAL = RESULT
LOCALS = %GETFONT()%

SETFONT CHKFONT(ARGS) ? ARGS # LOCALS

CALL SYMBOLPRINT(ARG, UNICODE(0x2661))

SETFONT LOCALS
RETURN LOCAL

;-------------------------------------------------
;入力待ちハートマーク関数@HEARTW
;	引数0：ハートの数（省略すると1つ）
;	引数1：使用するフォント名（省略するとVerdana）
;	引数2：『」』の代わりに表示する文字列
;	引数3：真にすると、『」』を表示しない
;
;中抜きハートマークを表示してから『」』を表示し、入力待ち・改行をします。口上に便利です
;引数2に文字列を入れると、代わりにそれを表示します。
;-------------------------------------------------
@HEARTW(ARG = 1, ARGS = "Verdana", ARGS:1 = "」", ARG:1 = 0)
CALL HEART(ARG, ARGS)
IF ARG:1 != 0
	PRINTFORMW
ELSE
	PRINTSW ARGS:1
ENDIF
RETURN RESULT

;-------------------------------------------------
;黒ハートマーク関数@HEARTB
;	引数0：ハートの数（省略すると1つ）
;	引数1：使用するフォント名（省略するとVerdana）
;
;塗りつぶしのハートマークを表示します
;-------------------------------------------------
@HEARTB(ARG = 1, ARGS = "Verdana")
#LOCALSIZE 1
#LOCALSSIZE 1
LOCAL = RESULT
LOCALS = %GETFONT()%

SETFONT CHKFONT(ARGS) ? ARGS # LOCALS

IF GETFONT() == "Symbol"
	CALL SYMBOLPRINT(ARG, UNICODE(0xA9))
ELSE
	CALL SYMBOLPRINT(ARG, UNICODE(0x2665))
ENDIF

SETFONT LOCALS
RETURN LOCAL

;-------------------------------------------------
;入力待ち黒ハートマーク関数@HEARTBW
;	引数0：ハートの数（省略すると1つ）
;	引数1：使用するフォント名（省略するとVeedana）
;	引数2：『」』の代わりに表示する文字列
;	引数3：真にすると、『」』を表示しない
;
;塗りつぶしハートマークを表示してから『」』を表示し、入力待ち・改行をします
;-------------------------------------------------
@HEARTBW(ARG = 1, ARGS = "Verdana", ARGS:1 = "」", ARG:1 = 0)
CALL HEARTB(ARG, ARGS)
IF ARG:1 != 0
	PRINTFORMW
ELSE
	PRINTSW ARGS:1
ENDIF
RETURN RESULT

;-------------------------------------------------
;ハートマーク系カラーバリエーション関数@HEARTC～系
;
;上記と同じバリエーションがありますが、最初の引数で指定した文字色で表示します。省略するとピンクがかった明るい赤になります
;文字色指定についてはGETRGBCOLOR関数が使えます。
;-------------------------------------------------
@HEARTC(ARG:1 = 0xC07070, ARG = 1, ARGS = "Verdana")
#LOCALSIZE 1
LOCAL = GETCOLOR()
SETCOLOR ARG:1
CALL HEART(ARG, ARGS)
SETCOLOR LOCAL
RETURN RESULT

@HEARTCW(ARG:1 = 0xC07070, ARG = 1, ARGS = "Verdana", ARGS:1 = "」", ARG:2)
#LOCALSIZE 1
LOCAL = GETCOLOR()
SETCOLOR ARG:1
CALL HEARTW(ARG, ARGS, ARGS:1, ARG:1)
SETCOLOR LOCAL
RETURN RESULT

@HEARTCB(ARG:1 = 0xC07070, ARG = 1, ARGS = "Verdana")
#LOCALSIZE 1
LOCAL = GETCOLOR()
SETCOLOR ARG:1
CALL HEARTB(ARG, ARGS)
SETCOLOR LOCAL
RETURN RESULT

@HEARTCBW(ARG:1 = 0xC07070, ARG = 1, ARGS = "Verdana", ARGS:1 = "」", ARG:2 = 0)
#LOCALSIZE 1
LOCAL = GETCOLOR()
SETCOLOR ARG:1
CALL HEARTB(ARG, ARGS)
SETCOLOR LOCAL
IF ARG:2 != 0
	PRINTFORMW
ELSE
	PRINTSW ARGS:1
ENDIF
RETURN RESULT

;-------------------------------------------------
;ハートマーク系デフォルトカラー関数@HEARTD～系
;
;上記と同じバリエーションがありますが、デフォルトの文字色で表示します
;また、こちらで呼ぶと入力待ちハート系の『」』が表示されません。つまり地の文向けの関数
;引数3を真にすれば逆に『」』を表示するようになります
;-------------------------------------------------
@HEARTD(ARG = 1, ARGS = "Verdana")
#LOCALSIZE 1
LOCAL = GETCOLOR()
RESETCOLOR
CALL HEART(ARG, ARGS)
SETCOLOR LOCAL
RETURN RESULT

@HEARTDW(ARG = 1, ARGS = "Verdana", ARGS:1 = "」", ARG:1)
#LOCALSIZE 1
LOCAL = GETCOLOR()
RESETCOLOR
CALL HEARTW(ARG, ARGS, ARGS:1, !ARG:1)
SETCOLOR LOCAL
RETURN RESULT

@HEARTDB(ARG = 1, ARGS = "Verdana")
#LOCALSIZE 1
LOCAL = GETCOLOR()
RESETCOLOR
CALL HEARTB(ARG, ARGS)
SETCOLOR LOCAL
RETURN RESULT

@HEARTDBW(ARG = 1, ARGS = "Verdana", ARGS:1 = "」", ARG:1 = 0)
#LOCALSIZE 1
LOCAL = GETCOLOR()
RESETCOLOR
CALL HEARTB(ARG, ARGS)
SETCOLOR LOCAL
IF ARG:1 != 0
	PRINTSW ARGS:1
ELSE
	PRINTFORMW
ENDIF
RETURN RESULT

;-------------------------------------------------
;記号表示関数@SYMBOLPRINT
;内部的に使う関数です。呼び出さないでください
;-------------------------------------------------
@SYMBOLPRINT(ARG, ARGS)
#LOCALSIZE 1
FOR LOCAL, 0, ARG
	PRINTS ARGS
NEXT
RETURN RESULT

;≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
;＠アニメーション系関数
;文字列を動かしたりフェードイン・アウトさせたりします。ある意味このファイルの目玉か
;だいたい表示時間があるため、多用すると鬱陶しさを与えます、注意。
;制御関数を通して、各関数毎にアニメーションのオンオフ設定ができます。
;≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡

;-------------------------------------------------
;アニメーション制御関数@ANIME_CONFIG
;	文字列引数・引数：文字列引数により機能分岐
;		"SAVE"：引数は無効。コンフィグビットの値を返します。セーブされる変数に代入する際に。
;		"SET"：コンフィグビットに引数の値を直接代入。@EVENTLORD等で設定反映する際に。引数省略するとSAVE互換
;		"FORCE"：強制表示・強制非表示・通常のモード切り替えをします。コンフィグビットは元のままです
;				（引数=0,コンフィグビットを参照して表示（通常）、1,強制表示、2,強制非表示、省略,現在の設定を返すのみ）
;		"TIMES"：この後に呼ばれるアニメを、引数の回数分、強制表示にします。関数は指定できません。FORCEに優先します
;				 引数を0にすると、回数を初期化します。引数を省略すると、残り回数を返すのみ
;		"ONCE"：この後に呼ばれるアニメを、一回だけ強制表示にします。関数は指定できません。FORCE・TIMESに優先します。引数は無効。
;		"%関数名%"：指定した関数ごとのコンフィグビットを設定します。引数1で表示に、0で非表示にします。2だと、設定を逆にします
;					引数を省略すると、戻り値が真なら表示する判定になります（強制表示状態に影響されます）
;		"USER{番号}"：ユーザー定義のコンフィグ項目を設定できます。自分でアニメ効果を作成した場合に便利です。1～13番まで持てます
;					　引数を省略すると、戻り値が真なら表示する判定になります（強制表示状態に影響されます）
;
;ぱにめーしょん内蔵のアニメ効果の総合的な制御。関数毎のコンフィグビットが立っていると、その関数のアニメ効果を表示しません
;表示しない場合は右クリックスキップ用と同じ簡略テキストを表示するようにします
;関数名はエイリアスでなく本体で指定。あと日本語名も受け付けるようになってます。
;口上側などでFORCE・TIMES機能を多用すると、きっと嫌われます。
;-------------------------------------------------
@ANIME_CONFIG(ARGS, ARG = -1)
#FUNCTION
#LOCALSIZE 6
;LOCALはコンフィグビットを格納
;LOCAL:1は強制表示・非表示状態
;LOCAL:2は回数指定強制表示の回数を格納
;LOCAL:3は編集・参照するコンフィグビットの番号
;LOCAL:4はユーザー定義の番号
;LOCAL:5はONCE状態

SELECTCASE ARGS
	CASE "SAVE"
		RETURNF LOCAL
	CASE "SET"
		SIF ARG >= 0
			LOCAL = ARG
		RETURNF LOCAL
	CASE "FORCE"
		SIF ARG >= 0
			LOCAL:1 = ARG
		RETURNF LOCAL:1
	CASE "TIMES"
		SIF ARG >= 0
			LOCAL:2 = ARG
		RETURNF LOCAL:2
	CASE "ONCE"
		LOCAL:5 = 1
		RETURNF LOCAL:5
	CASE "SCROLLTEXT", "スクロール"
		;コンフィグビット0番
		LOCAL:3 = 0
	CASE "FADE", "フェード"
		;コンフィグビット1番
		LOCAL:3 = 1
	CASE "QUAKE", "振動"
		;コンフィグビット2番
		LOCAL:3 = 2
	CASE "FLASH", "発光"
		;コンフィグビット3番
		LOCAL:3 = 3
	CASE "FULLCUTIN", "全画面カットイン"
		;コンフィグビット4番
		LOCAL:3 = 4
	CASE "BGM_CUTIN", "ＢＧＭカットイン"
		;コンフィグビット41番
		LOCAL:3 = 41
	CASE "CHARA_CUTIN", "キャラカットイン"
		;コンフィグビット42番
		LOCAL:3 = 42
	CASEELSE
		LOCAL:4 = TOINT(REPLACE(ARGS, "USER", ""))
		;ユーザー定義の処理
		IF STRCOUNT(ARGS, "USER") && LOCAL:4 > 0 && LOCAL:4 < 14
			;コンフィグビット51番以降
			LOCAL:3 = 50+LOCAL:4
		;それ以外は-1を返すのみ。デバッグ用
		ELSE
			RETURNF -1
		ENDIF
ENDSELECT
;コンフィグビットの処理
SELECTCASE ARG
	CASE 0
		SETBIT LOCAL, LOCAL:3
	CASE 1
		CLEARBIT LOCAL, LOCAL:3
	CASE 2
		INVERTBIT LOCAL, LOCAL:3
ENDSELECT
;ONCEが有効な場合
IF LOCAL:5
	LOCAL:5 = 0
	RETURNF MESSKIP() ? 0 # 1
;強制表示系が有効な場合
ELSEIF LOCAL:2 > 0
	LOCAL:2--
	RETURNF MESSKIP() ? 0 # 1
ELSEIF LOCAL:1
	RETURNF MESSKIP() ? 0 # !(LOCAL:1-1)
ENDIF
;コンフィグビットを参照して戻る
RETURNF MESSKIP() ? 0 # !GETBIT(LOCAL, LOCAL:3)

;-------------------------------------------------
;文字列スクロール関数@SCROLLTEXT
;	文字列引数：スクロールさせる文字列
;	引数0：1にするとスクロール中、文字列の下にDRAWLINEします。2だと-=ラインに
;	引数1：スクロール速度（デフォルトだと30）
;	引数2：ウィンドウの横に入る文字数（デフォルトだと117）
;			メモ　117
;	引数3：真にすると文字列が端でバウンドします。数字を上げるとバウンドが緩くなります。誰が得するんだよこの機能
;	引数4：真にするとスクロール方向が逆になります。デフォルトだと左から右。SCROLLTEXTLというエイリアスが存在
;
;引数の文字列をスクロールさせます
;-------------------------------------------------
@SCROLLTEXT(ARGS, ARG, ARG:1 = 30, ARG:2 = 117, ARG:3, ARG:4)
#LOCALSIZE 3
#LOCALSSIZE 1
LOCALS = %ARGS%
;スペースを付加
IF ARG:4
	ARGS = %(" "*ARG:2)+ARGS%
ELSE
	ARGS = %" "*(ARG:2 - 2 - STRLENS(ARGS))+ARGS%
ENDIF
;表示オン
IF ANIME_CONFIG("SCROLLTEXT")
	;スクロール速度がウィンドウ幅に対し速すぎる場合、矯正する
	ARG:1 = ARG:1 >= ARG:2 ? ARG:2-1 # ARG:1
	REDRAW 0
	LOCAL = 0
	FOR LOCAL, 0, ARG:2-2, ARG:1
		IF ARG:4
			PRINTSINGLEFORM %SUBSTRING(ARGS , LOCAL)%
		ELSE
			PRINTSINGLEFORM %SUBSTRING(ARGS , (ARG:2 - 2) - LOCAL)%
		ENDIF
		IF ARG == 1
			DRAWLINE
		ELSEIF ARG == 2
			CUSTOMDRAWLINE -=
		ENDIF
		TWAIT 2 , 0
		CLEARLINE 1+!(!ARG)
	NEXT
	;ばうんど。実に適当に跳ねます
	IF ARG:3
		FOR LOCAL, ARG:3, ARG:3*5, ARG:3*2
			IF ARG:4
				PRINTFORML %LOCALS%
			ELSE
				PRINTFORML %ARGS%
			ENDIF
			IF ARG == 1
				DRAWLINE
			ELSEIF ARG == 2
				CUSTOMDRAWLINE -=
			ENDIF
			TWAIT 2 , 0
			CLEARLINE 1+!(!ARG)
			FOR LOCAL:1, 0, ARG:2/(LOCAL+4), ARG:1/(LOCAL+1)
				IF ARG:4
					PRINTSINGLEFORM %SUBSTRING(ARGS , ARG:2 - LOCAL:1)%
				ELSE
					PRINTSINGLEFORM %SUBSTRING(ARGS , LOCAL:1)%
				ENDIF
				IF ARG == 1
					DRAWLINE
				ELSEIF ARG == 2
					CUSTOMDRAWLINE -=
				ENDIF
				TWAIT 2 , 0
				CLEARLINE 1+!(!ARG)
			NEXT
			FOR LOCAL:2, 0, ARG:2/(LOCAL+4), ARG:1/(LOCAL+1)
				IF ARG:4
					PRINTSINGLEFORM %SUBSTRING(ARGS , ARG:2 - LOCAL:1 + LOCAL:2)%
				ELSE
					PRINTSINGLEFORM %SUBSTRING(ARGS , LOCAL:1 - LOCAL:2)%
				ENDIF
				IF ARG == 1
					DRAWLINE
				ELSEIF ARG == 2
					CUSTOMDRAWLINE -=
				ENDIF
				TWAIT 2 , 0
				CLEARLINE 1+!(!ARG)
			NEXT
		NEXT
	ENDIF
ENDIF

IF ARG:4
	PRINTFORML %LOCALS%
ELSE
	PRINTFORML %ARGS%
ENDIF
IF ARG == 1
	DRAWLINE
ELSEIF ARG == 2
	CUSTOMDRAWLINE -=
ENDIF
REDRAW 1
RETURN RESULT

;-------------------------------------------------
;文字列右スクロール関数@SCROLLTEXTL
;	文字列引数：スクロールさせる文字列
;	引数0：真にするとスクロール中、文字列の下にDRAWLINEします
;	引数1：スクロール速度（デフォルトだと30）
;	引数2：ウィンドウの横に入る文字数（デフォルトだと117）
;	引数3：真にすると文字列が端でバウンドします。数字を上げるとバウンドが緩くなります
;
;引数の文字列をウィンドウの右から左へスクロールさせます
;-------------------------------------------------
@SCROLLTEXTL(ARGS, ARG, ARG:1 = 30, ARG:2 = 117, ARG:3)
CALL SCROLLTEXT(ARGS, ARG, ARG:1, ARG:2, ARG:3, 1)
RETURN RESULT

;-------------------------------------------------
;フェードアウト関数@FADEOUT
;	引数0：コマ数。多くするほどゆるやかになります。デフォルトは8
;	文字列引数0～29：表示する文字列（空行はスペースで。省略すると無視します）
;	引数3：FULLCUTIN用。正にすると開幕行削除から入ります
;
;引数で与えた文字列を表示し、背景色にフェードアウトします。
;見えなくなるだけで消えないので、必要ならCLEARLINEで消してください。
;文字列は30行まで引き受けることができます
;-------------------------------------------------
@FADEOUT(ARG = 8, ARGS = "VOID", ARGS:1 = "VOID", ARGS:2 = "VOID", ARGS:3 = "VOID", ARGS:4 = "VOID", ARGS:5 = "VOID", ARGS:6 = "VOID", ARGS:7 = "VOID", ARGS:8 = "VOID", ARGS:9 = "VOID", ARGS:10 = "VOID", ARGS:11 = "VOID", ARGS:12 = "VOID", ARGS:13 = "VOID", ARGS:14 = "VOID", ARGS:15 = "VOID", ARGS:16 = "VOID", ARGS:17 = "VOID", ARGS:18 = "VOID", ARGS:19 = "VOID", ARGS:20 = "VOID", ARGS:21 = "VOID", ARGS:22 = "VOID", ARGS:23 = "VOID", ARGS:24 = "VOID", ARGS:25 = "VOID", ARGS:26 = "VOID", ARGS:27 = "VOID", ARGS:28 = "VOID", ARGS:29 = "VOID", ARG:3)
CALL FADE(ARG, GETCOLOR(), GETBGCOLOR(), ARGS, ARGS:1, ARGS:2, ARGS:3, ARGS:4, ARGS:5, ARGS:6, ARGS:7, ARGS:8, ARGS:9, ARGS:10, ARGS:11, ARGS:12, ARGS:13, ARGS:14, ARGS:15, ARGS:16, ARGS:17, ARGS:18, ARGS:19, ARGS:20, ARGS:21, ARGS:22, ARGS:23, ARGS:24, ARGS:25, ARGS:26, ARGS:27, ARGS:28, ARGS:29, ARG:3)
RETURN RESULT

;-------------------------------------------------
;フェードイン関数@FADEIN
;	引数0：コマ数。多くするほどゆるやかになります。デフォルトは8
;	文字列引数0～29：表示する文字列（空行はスペースで。省略すると無視します）
;
;引数で与えた文字列を、背景色からフェードイン表示します。
;色を変えたい場合は事前にSETCOLORするか、@FADEを直接呼んでください
;文字列は30行まで引き受けることができます
;-------------------------------------------------
@FADEIN(ARG = 8, ARGS = "VOID", ARGS:1 = "VOID", ARGS:2 = "VOID", ARGS:3 = "VOID", ARGS:4 = "VOID", ARGS:5 = "VOID", ARGS:6 = "VOID", ARGS:7 = "VOID", ARGS:8 = "VOID", ARGS:9 = "VOID", ARGS:10 = "VOID", ARGS:11 = "VOID", ARGS:12 = "VOID", ARGS:13 = "VOID", ARGS:14 = "VOID", ARGS:15 = "VOID", ARGS:16 = "VOID", ARGS:17 = "VOID", ARGS:18 = "VOID", ARGS:19 = "VOID", ARGS:20 = "VOID", ARGS:21 = "VOID", ARGS:22 = "VOID", ARGS:23 = "VOID", ARGS:24 = "VOID", ARGS:25 = "VOID", ARGS:26 = "VOID", ARGS:27 = "VOID", ARGS:28 = "VOID", ARGS:29 = "VOID")
CALL FADE(ARG, GETBGCOLOR(), GETCOLOR(), ARGS, ARGS:1, ARGS:2, ARGS:3, ARGS:4, ARGS:5, ARGS:6, ARGS:7, ARGS:8, ARGS:9, ARGS:10, ARGS:11, ARGS:12, ARGS:13, ARGS:14, ARGS:15, ARGS:16, ARGS:17, ARGS:18, ARGS:19, ARGS:20, ARGS:21, ARGS:22, ARGS:23, ARGS:24, ARGS:25, ARGS:26, ARGS:27, ARGS:28, ARGS:29)
RETURN RESULT

;-------------------------------------------------
;フェード処理関数@FADE
;	引数0：コマ数。多くするほどゆるやかになります。デフォルトは8。大きくしすぎるとおかしくなります
;	引数1：初期文字色
;	引数2：変化する文字色
;	文字列引数0～29：表示する文字列（空行はスペースで。省略すると無視します）
;	引数3：FULLCUTIN用。正にすると開幕行削除から入ります
;
;フェードアウト・フェードインの処理をします。内部関数ですが、呼び出しも可能です
;-------------------------------------------------
@FADE(ARG = 8, ARG:1 , ARG:2, ARGS = "VOID", ARGS:1 = "VOID", ARGS:2 = "VOID", ARGS:3 = "VOID", ARGS:4 = "VOID", ARGS:5 = "VOID", ARGS:6 = "VOID", ARGS:7 = "VOID", ARGS:8 = "VOID", ARGS:9 = "VOID", ARGS:10 = "VOID", ARGS:11 = "VOID", ARGS:12 = "VOID", ARGS:13 = "VOID", ARGS:14 = "VOID", ARGS:15 = "VOID", ARGS:16 = "VOID", ARGS:17 = "VOID", ARGS:18 = "VOID", ARGS:19 = "VOID", ARGS:20 = "VOID", ARGS:21 = "VOID", ARGS:22 = "VOID", ARGS:23 = "VOID", ARGS:24 = "VOID", ARGS:25 = "VOID", ARGS:26 = "VOID", ARGS:27 = "VOID", ARGS:28 = "VOID", ARGS:29 = "VOID", ARG:3)
#LOCALSIZE 2
#DIM PRICOLOR,1
#DIM RED,2
#DIM GREEN,2
#DIM BLUE,2
VARSET RED
VARSET GREEN
VARSET BLUE

;元の文字色の取得
PRICOLOR = GETCOLOR()

;表示オン
IF ANIME_CONFIG("FADE")
	;初期色
	SETCOLOR ARG:1

	;RGBそれぞれのベース値、減少値を各色:0と1に代入
	RED = GETRED()
	IF RED > GETRED(ARG:2)
		RED:1 = MAX(1, (RED-GETRED(ARG:2))/ARG)
	ELSEIF RED < GETRED(ARG:2)
		RED:1 = MIN(-1, (RED-GETRED(ARG:2))/ARG)
	ENDIF
	GREEN = GETGREEN()
	IF GREEN > GETGREEN(ARG:2)
		GREEN:1 = MAX(1, (GREEN-GETGREEN(ARG:2))/ARG)
	ELSEIF GREEN < GETGREEN(ARG:2)
		GREEN:1 = MIN(-1, (GREEN-GETGREEN(ARG:2))/ARG)
	ENDIF
	BLUE = GETBLUE()
	IF BLUE > GETBLUE(ARG:2)
		BLUE:1 = MAX(1, (BLUE-GETBLUE(ARG:2))/ARG)
	ELSEIF BLUE < GETBLUE(ARG:2)
		BLUE:1 = MIN(-1, (BLUE-GETBLUE(ARG:2))/ARG)
	ENDIF

	IF !ARG:3
		FOR LOCAL, 0, 30
			SIF ARGS:LOCAL != "VOID"
				PRINTSL ARGS:LOCAL
		NEXT
		TWAIT 100 , 0
	ENDIF
	CLEARLINE 30-MATCH(ARGS, "VOID")

	FOR LOCAL:1, 0, ARG
		RED = MAX(0, RED-RED:1)
		GREEN = MAX(0, GREEN-GREEN:1)
		BLUE = MAX(0, BLUE-BLUE:1)
		SETCOLOR RED, GREEN, BLUE
		FOR LOCAL, 0, 30
			SIF ARGS:LOCAL != "VOID"
				PRINTSL ARGS:LOCAL
		NEXT
		TWAIT 100 , 0
		CLEARLINE 30-MATCH(ARGS, "VOID")
	NEXT
	SETCOLOR ARG:2
	FOR LOCAL, 0, 30
		SIF ARGS:LOCAL != "VOID"
			PRINTSL ARGS:LOCAL
	NEXT
;表示オフ
ELSE
	;終了色が背景色と同じ場合、初期色で表示。そうでなければ終了色で表示
	SETCOLOR GETBGCOLOR() == ARG:2 ? ARG:1 # ARG:2
	FOR LOCAL, 0, 30
		IF ARGS:LOCAL != "VOID"
			PRINTSL ARGS:LOCAL
		ENDIF
	NEXT
ENDIF
SETCOLOR PRICOLOR
RETURN RESULT

;-------------------------------------------------
;振動エフェクト関数@QUAKE
;	引数0：振動数。省略すると2
;
;画面を上下に揺らします。揺れ幅はある程度ランダムです
;-------------------------------------------------
@QUAKE(ARG = 2)
#LOCALSIZE 3
;表示オフだと戻る
SIF !ANIME_CONFIG("QUAKE")
	RETURN RESULT
REDRAW 0
FOR LOCAL, 0, ARG
	LOCAL:1 = RAND:4+1
	FOR LOCAL:2, 0, LOCAL:1
		PRINTL
	NEXT
	TWAIT 100, 0
	CLEARLINE LOCAL:1
	TWAIT 100, 0
NEXT
REDRAW 3
RETURN RESULT

;-------------------------------------------------
;発光エフェクト関数@FLASH
;	引数0：発光数。省略すると2
;	引数1：光る色。省略すると白
;
;画面を発光させます。背景色の点滅
;-------------------------------------------------
@FLASH(ARG = 2, ARG:1 = 0xFFFFFF)
#LOCALSIZE 2
;表示オフだと戻る
SIF !ANIME_CONFIG("FLASH")
	RETURN RESULT
REDRAW 0
FOR LOCAL, 0, 150
	PRINTL
NEXT
LOCAL:1 = GETBGCOLOR()
FOR LOCAL, 0, ARG
	SETBGCOLOR ARG:1
	REDRAW 2
	SETBGCOLOR LOCAL:1
	REDRAW 2
NEXT
CLEARLINE 150
REDRAW 3
RETURN RESULT

;-------------------------------------------------
;全画面カットイン関数@FULLCUTIN
;	引数0：左端からのインデント
;	引数1：床から浮かせる行数（表示文字列と合わせて30を超えないでください）
;	文字列引数0～29：表示する文字列
;
;空行で画面を掃除して、全画面分のカットインを表示します
;行揃えやフォントなどのオプションはまだほとんど設定していません。アイデアだけとりあえず。
;-------------------------------------------------
@FULLCUTIN(ARG, ARG:1, ARGS = "VOID", ARGS:1 = "VOID", ARGS:2 = "VOID", ARGS:3 = "VOID", ARGS:4 = "VOID", ARGS:5 = "VOID", ARGS:6 = "VOID", ARGS:7 = "VOID", ARGS:8 = "VOID", ARGS:9 = "VOID", ARGS:10 = "VOID", ARGS:11 = "VOID", ARGS:12 = "VOID", ARGS:13 = "VOID", ARGS:14 = "VOID", ARGS:15 = "VOID", ARGS:16 = "VOID", ARGS:17 = "VOID", ARGS:18 = "VOID", ARGS:19 = "VOID", ARGS:20 = "VOID", ARGS:21 = "VOID", ARGS:22 = "VOID", ARGS:23 = "VOID", ARGS:24 = "VOID", ARGS:25 = "VOID", ARGS:26 = "VOID", ARGS:27 = "VOID", ARGS:28 = "VOID", ARGS:29 = "VOID", ARG:2 = 8)
#LOCALSIZE 1
;表示オン
IF ANIME_CONFIG("FULLCUTIN")
	FOR LOCAL, 0, 30
		IF ARGS:LOCAL == "VOID"
			IF ARG:1 > 0
				ARGS:LOCAL =
				ARG:1--
			ENDIF
		ELSE
			ARGS:LOCAL = %" "*ARG+ARGS:LOCAL%
		ENDIF
	NEXT
	CALL SAVELINE
	FOR LOCAL, 0, 150
		PRINTL
	NEXT
	;FULLCUTINがオンならフェードは強制
	CALLF ANIME_CONFIG("ONCE")
	CALL FADEIN(ARG:2, ARGS, ARGS:1, ARGS:2, ARGS:3, ARGS:4, ARGS:5, ARGS:6, ARGS:7, ARGS:8, ARGS:9, ARGS:10, ARGS:11, ARGS:12, ARGS:13, ARGS:14, ARGS:15, ARGS:16, ARGS:17, ARGS:18, ARGS:19, ARGS:20, ARGS:21, ARGS:22, ARGS:23, ARGS:24, ARGS:25, ARGS:26, ARGS:27, ARGS:28, ARGS:29)
	TWAIT 2000, 0
	CALLF ANIME_CONFIG("ONCE")
	CALL FADEOUT(ARG:2, ARGS, ARGS:1, ARGS:2, ARGS:3, ARGS:4, ARGS:5, ARGS:6, ARGS:7, ARGS:8, ARGS:9, ARGS:10, ARGS:11, ARGS:12, ARGS:13, ARGS:14, ARGS:15, ARGS:16, ARGS:17, ARGS:18, ARGS:19, ARGS:20, ARGS:21, ARGS:22, ARGS:23, ARGS:24, ARGS:25, ARGS:26, ARGS:27, ARGS:28, ARGS:29, 1)
	TWAIT 500, 0
	CALL RETURNLINE
;表示オフ（簡略化表示）
ELSE
	PRINTL
	PRINTL
	FOR LOCAL, 0, 30
		IF ARGS:LOCAL != "VOID"
			IF STRLENSU(ARGS:LOCAL) < 2
				PRINTSL ARGS:LOCAL
			ELSE
				PRINTFORMW %" "*ARG+ARGS:LOCAL%
			ENDIF
		ENDIF
	NEXT
	PRINTL
	PRINTL
ENDIF
RETURN RESULT

;-------------------------------------------------
;全画面カットイン関数@FULLCUTIN2
;	フェードイン・アウト等が従来より速いだけです
;-------------------------------------------------
@FULLCUTIN2(ARG, ARG:1, ARGS = "VOID", ARGS:1 = "VOID", ARGS:2 = "VOID", ARGS:3 = "VOID", ARGS:4 = "VOID", ARGS:5 = "VOID", ARGS:6 = "VOID", ARGS:7 = "VOID", ARGS:8 = "VOID", ARGS:9 = "VOID", ARGS:10 = "VOID", ARGS:11 = "VOID", ARGS:12 = "VOID", ARGS:13 = "VOID", ARGS:14 = "VOID", ARGS:15 = "VOID", ARGS:16 = "VOID", ARGS:17 = "VOID", ARGS:18 = "VOID", ARGS:19 = "VOID", ARGS:20 = "VOID", ARGS:21 = "VOID", ARGS:22 = "VOID", ARGS:23 = "VOID", ARGS:24 = "VOID", ARGS:25 = "VOID", ARGS:26 = "VOID", ARGS:27 = "VOID", ARGS:28 = "VOID", ARGS:29 = "VOID", ARG:2 = 4)
#LOCALSIZE 1
CALL FULLCUTIN(ARG, ARG:1, ARGS, ARGS:1, ARGS:2, ARGS:3, ARGS:4, ARGS:5, ARGS:6, ARGS:7, ARGS:8, ARGS:9, ARGS:10, ARGS:11, ARGS:12, ARGS:13, ARGS:14, ARGS:15, ARGS:16, ARGS:17, ARGS:18, ARGS:19, ARGS:20, ARGS:21, ARGS:22, ARGS:23, ARGS:24, ARGS:25, ARGS:26, ARGS:27, ARGS:28, ARGS:29, ARG:2)
RETURN RESULT


code:
;≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
;文字列表示・アニメーション関数ファイル「ぱにめーしょん」0527版 同梱、東方Projectローカル関数ファイル
;東方系バリアントで使えそうなビジュアル・雰囲気向上系の関数群です。東方系以外では…どうだろう。あっても邪魔はしませんが。
;こちらは、ぱにめーしょん本体がないと動作しません
;≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡

;-------------------------------------------------
;東方Project風BGMカットイン関数@BGM_CUTIN
;	文字列引数0：曲名
;	文字列引数1：フォント（等幅じゃないと機能しません。省略したらHG創英ﾌﾟﾚｾﾞﾝｽEB（神霊廟風に）、存在しなかったら変更なし）
;	引数0：省略すると頭に「♪（紅・文・DS・妖戦タイプ）」、正にすると「ＢＧＭ. （永・風以降タイプ）」、負にすると何もつけない
;	引数1：スクロール速度（デフォルトだと5）
;	引数2：画面端まで入る文字数（デフォルトだと117）
;	引数3：1にすると消え方がサイドアウトに（デフォルトだとフェードアウト）
;-------------------------------------------------
@BGM_CUTIN(ARGS, ARG, ARGS:1 = "HG創英ﾌﾟﾚｾﾞﾝｽEB", ARG:1 = 5, ARG:2 = 117, ARG:3)
#LOCALSIZE 2
#LOCALSSIZE 2
IF ARG >= 0
	LOCALS = %\@ ARG ? %"ＢＧＭ. "% # ♪ \@+ARGS%
ELSE
	LOCALS = %ARGS%
ENDIF
;色保存
LOCAL:1 = GETCOLOR()
RESETCOLOR
ARGS = %" "*ARG:2+LOCALS%
LOCALS:1 = %GETFONT()%
SIF CHKFONT(ARGS:1)
	SETFONT ARGS:1
;表示オン
IF ANIME_CONFIG("BGM_CUTIN")
	;スクロール速度がウィンドウ幅に対し速すぎる場合、矯正する
	ARG:1 = ARG:1 >= ARG:2 ? ARG:2-1 # ARG:1
	REDRAW 0
	LOCAL = 0
	;サイドイン
	FOR LOCAL, 0, STRLENS(LOCALS)+4, ARG:1
		PRINTSINGLEFORM %SUBSTRING(ARGS , LOCAL)%
		TWAIT 2, 0
		CLEARLINE 1
	NEXT
	PRINTFORML %" "*(ARG:2-STRLENS(LOCALS)-4)+LOCALS%
	TWAIT 800, 0
	CLEARLINE 1

	IF ARG:3 == 1
		;サイドアウト
		FOR LOCAL, 0, STRLENS(LOCALS)+4, ARG:1*2
			PRINTSINGLEFORM %SUBSTRING(ARGS , STRLENS(LOCALS)+4-LOCAL)%
			TWAIT 2 , 0
			CLEARLINE 1
		NEXT
	ELSE
		;BGMアニメオンだとフェードを強制表示する
		CALLF ANIME_CONFIG("ONCE")
		;フェードアウト
		CALL FADEOUT(8, " "*(ARG:2-STRLENS(LOCALS)-4)+LOCALS)
		CLEARLINE 1
	ENDIF
	REDRAW 1
;表示オフ
ELSE
	PRINTFORMW %" "*(ARG:2-STRLENS(LOCALS)-4)+LOCALS%
ENDIF
SETFONT LOCALS:1
SETCOLOR LOCAL:1
RETURN RESULT

;-------------------------------------------------
;東方Project風キャラ登場カットイン関数@CHARA_CUTIN
;	文字列引数0：肩書き
;	文字列引数1：名前
;	文字列引数2：ローマ字読み
;	引数0：省略すると左、正だと右寄りに表示。表示位置の逆からクロールインする
;	引数1：スクロール速度（デフォルトだと30）
;	引数2：画面端まで入る文字数（デフォルトだと117）
;			…バウンドいらんよね？
;神霊廟風の中央揃えです。需要があれば一行目左寄せ・三行目右寄せのバージョンも作る？
;-------------------------------------------------
@CHARA_CUTIN(ARGS, ARGS:1, ARGS:2, ARG, ARG:1 = 30, ARG:2 = 117)
#LOCALSIZE 11
#LOCALSSIZE 11
;フォント保存
LOCALS:10 = %GETFONT()%
;色保存
LOCAL:10 = GETCOLOR()
RESETCOLOR

;まず、３つの文字列を偶数にする
ARGS = %\@ STRLENS(ARGS)/2 ? %ARGS+" "% # %ARGS% \@%
ARGS:1 = %\@ STRLENS(ARGS:1)/2 ? %ARGS:1+" "% # %ARGS:2% \@%
ARGS:2 = %\@ STRLENS(ARGS:2)/2 ? %ARGS:2+" "% # %ARGS:2% \@%

;一番長い文字列の字数を保存して、4を足す
LOCAL:3 = MAX(STRLENS(ARGS), STRLENS(ARGS:1), STRLENS(ARGS:2))+4

;文字列整理
FOR LOCAL, 0, 3
	LOCAL:1 = (LOCAL:3-STRLENS(ARGS:LOCAL))/2
	;インデントがてらに頭としっぽをつけます
	ARGS:LOCAL = %(" "*LOCAL:1)+ARGS:LOCAL+(" "*LOCAL:1)%
	;原本を保存
	LOCALS:LOCAL = %ARGS:LOCAL%
	;スペースを付加
	IF !ARG
		LOCALS:LOCAL = %"  "+LOCALS:LOCAL%
		ARGS:LOCAL = %(" "*ARG:2)+LOCALS:LOCAL%
	ELSE
		ARGS:LOCAL = %" "*(ARG:2 - 2 - STRLENS(ARGS:LOCAL))+ARGS:LOCAL%
	ENDIF
NEXT

;罫線も用意しないとね
LOCALS:4 = %"-="*(LOCAL:3/2)%
LOCALS:5 = %"=-"*(LOCAL:3/2)%
;スペースを付加
IF !ARG
	LOCALS:4 = %"  "+LOCALS:4%
	LOCALS:5 = %"  "+LOCALS:5%
	LOCALS:6 = %(" "*ARG:2)+LOCALS:4%
	LOCALS:7 = %(" "*ARG:2)+LOCALS:5%
ELSE
	LOCALS:6 = %" "*(ARG:2 - 3 - STRLENS(LOCALS:4))+LOCALS:4%
	LOCALS:7 = %" "*(ARG:2 - 3 - STRLENS(LOCALS:5))+LOCALS:5%
ENDIF

;表示オン
IF ANIME_CONFIG("CHARA_CUTIN")
	;スクロール速度がウィンドウ幅に対し速すぎる場合、矯正する
	ARG:1 = ARG:1 >= ARG:2 ? ARG:2-1 # ARG:1
	REDRAW 0
	LOCAL = 0
	FOR LOCAL, 0, ARG:2-2, ARG:1
		IF !ARG
			;罫線は元フォント
			SETFONT LOCALS:10
			PRINTSINGLEFORM %SUBSTRING(LOCALS:6 , LOCAL)%
			;肩書きはHG教科書体
			SIF CHKFONT("HG教科書体")
				SETFONT "HG教科書体"
			PRINTSINGLEFORM %SUBSTRING(ARGS , LOCAL)%
			;名前は元フォント
			SETFONT LOCALS:10
			PRINTSINGLEFORM %SUBSTRING(ARGS:1 , LOCAL)%
			;ローマ字読みはＭＳ 明朝（TimesNewRomanは等幅じゃなかった…）
			SIF CHKFONT("ＭＳ 明朝")
				SETFONT "ＭＳ 明朝"
			PRINTSINGLEFORM %SUBSTRING(ARGS:2 , LOCAL)%
			;罫線は元フォント
			SETFONT LOCALS:10
			PRINTSINGLEFORM %SUBSTRING(LOCALS:7 , LOCAL)%
		ELSE
			SETFONT LOCALS:10
			PRINTSINGLEFORM %SUBSTRING(LOCALS:6 , (ARG:2 - 2) - LOCAL)%
			SIF CHKFONT("HG教科書体")
				SETFONT "HG教科書体"
			PRINTSINGLEFORM %SUBSTRING(ARGS , (ARG:2 - 2) - LOCAL)%
			SETFONT LOCALS:10
			PRINTSINGLEFORM %SUBSTRING(ARGS:1 , (ARG:2 - 2) - LOCAL)%
			SIF CHKFONT("ＭＳ 明朝")
				SETFONT "ＭＳ 明朝"
			PRINTSINGLEFORM %SUBSTRING(ARGS:2 , (ARG:2 - 2) - LOCAL)%
			SETFONT LOCALS:10
			PRINTSINGLEFORM %SUBSTRING(LOCALS:7 , (ARG:2 - 2) - LOCAL)%
		ENDIF
		TWAIT 2 , 0
		SIF !ARG || LOCAL
			CLEARLINE 5
	NEXT
ENDIF

IF !ARG
	SETFONT LOCALS:10
	PRINTFORML %LOCALS:4%
	SIF CHKFONT("HG教科書体")
		SETFONT "HG教科書体"
	PRINTFORML %LOCALS%
	SETFONT LOCALS:10
	PRINTFORML %LOCALS:1%
	SIF CHKFONT("ＭＳ 明朝")
		SETFONT "ＭＳ 明朝"
	PRINTFORML %LOCALS:2%
	SETFONT LOCALS:10
	PRINTFORML %LOCALS:5%
ELSE
	SETFONT LOCALS:10
	PRINTFORML %LOCALS:6%
	SIF CHKFONT("HG教科書体")
		SETFONT "HG教科書体"
	PRINTFORML %ARGS%
	SETFONT LOCALS:10
	PRINTFORML %ARGS:1%
	SIF CHKFONT("ＭＳ 明朝")
		SETFONT "ＭＳ 明朝"
	PRINTFORML %ARGS:2%
	SETFONT LOCALS:10
	PRINTFORML %LOCALS:7%
ENDIF
REDRAW 1
SETCOLOR LOCAL:10
RETURN RESULT

;-------------------------------------------------
;幻想暦関数@GENSOU_CALENDAR
;	引数0：2000年1月1日（115季睦月一日）からの経過日数
;引数に経過日数を与えることで、幻想卿の暦を文字列で返す関数です
;-------------------------------------------------
@GENSOU_CALENDAR(ARG)
#FUNCTIONS
#LOCALSIZE 3
;LOCALに年数
LOCAL = GETYEAR(ARG)
;LOCAL:1に月数
LOCAL:1 = GETDATE(GETYEAR(ARG, 1), GETURUU(LOCAL))
;LOCAL:2に日数
LOCAL:2 = GETDATE(GETYEAR(ARG, 1), GETURUU(LOCAL), 1)

RETURNF @"第%TOKANJI(LOCAL+115)%季　%GETMONTHNAME(LOCAL:1)%の%TOKANJI(LOCAL:2)%"

;-------------------------------------------------
;古典時刻関数@CLASSICAL_TIME
;	引数0：対象の変数（デフォでは秒）
;	引数1：1なら引数0を秒で、2なら時で計算する
;	引数2：表示形式（デフォ「○の○つ」、1=「○の刻、○つ」、2=「○の○つ　-○○-」）
;式中で使用する関数です。引数に記録されている数字を秒として、現在の時刻を文字列で返します
;古典時刻表記なので、30分単位未満の端数は切り捨てます。
;-------------------------------------------------
@CLASSICAL_TIME(ARG, ARG:1, ARG:2)
#FUNCTIONS
;分に変換する
SELECTCASE ARG:1
	;時で渡す場合
	CASE 2
		ARG *= 60
	;秒で渡す場合
	CASE 1
		ARG /= 60
ENDSELECT
;0:00が子の三つなので、60分を足す
ARG += 60
;日付も管理しているケースを考え、24時間（1440分）で割ってあまりを取る（子の一つ～二つもここで対応される）
ARG %= 1440
;表示
SIF GET_CLASSICAL_HOUR(ARG, 1) == "丑" && (ARG%120)/30 == 2
	RETURNF "丑三つ時"
RETURNF @"%GET_CLASSICAL_HOUR(ARG, 1)%の\@ ARG:2 == 1 ? 刻、 # \@%TOKANJI(((ARG%120)/30)+1)%つ\@ ARG:2 == 2 ? 　-%GET_CLASSICAL_HOUR(ARG, 1, 1)%時- # \@"

;時を取得
;引数2を真にすると、大まかな時間の様子を取る
@GET_CLASSICAL_HOUR(ARG, ARG:1, ARG:2)
#FUNCTIONS
;分に変換する
SELECTCASE ARG:1
	;時で渡す場合
	CASE 2
		ARG *= 60
	;分で渡す場合（処理なし）
	CASE 1
	;秒で渡す場合（デフォルト）
	CASEELSE
		ARG /= 60
ENDSELECT

SELECTCASE ARG/120
	CASE 0
		RETURNF \@ ARG:2 ? 深更（しんこう） # 子 \@
	CASE 1
		RETURNF \@ ARG:2 ? 未明（みめい） # 丑 \@
	CASE 2
		RETURNF \@ ARG:2 ? 東雲（しののめ） # 寅 \@
	CASE 3
		RETURNF \@ ARG:2 ? 暁（あかつき） # 卯 \@
	CASE 4
		RETURNF \@ ARG:2 ? 早天（そうてん） # 辰 \@
	CASE 5
		RETURNF \@ ARG:2 ? 小昼（こひる） # 巳 \@
	CASE 6
		RETURNF \@ ARG:2 ? 昼中（ひるなか） # 午 \@
	CASE 7
		RETURNF \@ ARG:2 ? 日盛り（ひざかり） # 未 \@
	CASE 8
		RETURNF \@ ARG:2 ? 終日（ひねもす） # 申 \@
	CASE 9
		RETURNF \@ ARG:2 ? 黄昏（たそがれ） # 酉 \@
	CASE 10
		RETURNF \@ ARG:2 ? 宵（よい） # 戌 \@
	CASE 11
		RETURNF \@ ARG:2 ? 夜半（よわ） # 亥 \@
ENDSELECT

;-------------------------------------------------
;数値→漢数字変換関数@TOKANJI
;TOSTR関数チックに、引数の数値を漢数字の文字列で返します
;変数の最大値は約922京であるため、一、万、億、兆、京の5回処理します
;-------------------------------------------------
@TOKANJI(ARG)
#FUNCTIONS
#LOCALSIZE 1
#LOCALSSIZE 1
#DIM LCOUNT, 1
VARSET LOCALS
FOR LCOUNT, 0, 5
	LOCAL = ARG/POWER(10000, (4-LCOUNT))
	ARG %= POWER(10000, (4-LCOUNT))
	IF LOCAL
		LOCALS += TOKANJIT(LOCAL)
		SELECTCASE LCOUNT
			CASE 0
				LOCALS += "京"
			CASE 1
				LOCALS += "兆"
			CASE 2
				LOCALS += "億"
				;TranslatedMark "億"
			CASE 3
				LOCALS += "万"
		ENDSELECT
	ENDIF
NEXT
RETURNF \@ LOCALS != "" ? %LOCALS% # 零 \@

;内部用or簡易用
;四桁以内の漢字変換。万以上与えるとバグ
@TOKANJIT(ARG)
#FUNCTIONS
SIF ARG >= 10000
	RETURNF "ばぐ"
LOCALS = \@ ARG/1000 ? %TOKANJIS(ARG/1000, 1)%千 # \@
ARG %= 1000
LOCALS += \@ ARG/100 ? %TOKANJIS(ARG/100, 1)%百 # \@
ARG %= 100
LOCALS += \@ ARG/10 ? %TOKANJIS(ARG/10, 1)%十 # \@
ARG %= 10
RETURNF LOCALS + TOKANJIS(ARG)

;一桁の変換。引数1を真にすると一を省略する。2以上にすると零を表示する
@TOKANJIS(ARG, ARG:1)
#FUNCTIONS
SELECTCASE ARG
	CASE 0
		RETURNF \@ ARG:1 > 1 ? 零 #  \@
	CASE 1
		RETURNF \@ ARG:1 ?  # 一 \@
	CASE 2
		RETURNF "二"
	CASE 3
		RETURNF "三"
	CASE 4
		RETURNF "四"
	CASE 5
		RETURNF "五"
	CASE 6
		RETURNF "六"
	CASE 7
		RETURNF "七"
	CASE 8
		RETURNF "八"
	CASE 9
		RETURNF "九"
	CASE 10
		RETURNF "十"
	CASEELSE
		RETURNF "ばぐ"
ENDSELECT

;-------------------------------------------------
;閏年判定関数@GETURUU
;	引数0：年数
;西暦で年数を与えるとその年の日数を返します
;-------------------------------------------------
@GETURUU(ARG)
#FUNCTION
RETURNF (!(ARG % 4) && (ARG % 100)) || !(ARG % 400) ? 366 # 365

;-------------------------------------------------
;年数判定関数@GETYEAR
;	引数0：2000年1月1日からの経過日数
;	引数1：1にすると、端日数を返します
;経過日数から、経過年数を返します。
;引数1を真にすると、現在の年で何日経過しているかを返します。
;2000年を0年として返すため、西暦表記する際は2000を足してください。
;単純に経過年数を数える場合は意識しなくてもＯＫ
;-------------------------------------------------
@GETYEAR(ARG, ARG:1)
#FUNCTION
#LOCALSIZE 1
VARSET LOCAL
;2000年を0年目として扱う
;2000年から順に回して、年数LOCALを増やす
WHILE ARG > GETURUU(LOCAL)
	LOCAL++
	ARG -= GETURUU(LOCAL)
WEND
RETURNF ARG:1 ? ARG # LOCAL

;-------------------------------------------------
;日付判定関数@GETDATE
;	引数0：年内経過日数（年内総日数を超えるときはエラー…にはせず、総日数で割った余りで計算する。でもやめてね？）
;	引数1：年内総日数（GETURUU併用推奨）
;	引数2：省略すると○月、真にすると○日を返します
;-------------------------------------------------
@GETDATE(ARG, ARG:1 = 365, ARG:2)
#FUNCTION
#LOCALSIZE 2
;念のための処理
ARG %= ARG:1
;月ごとの日数計算
FOR LOCAL, 1, 13
	SELECTCASE LOCAL
		;30日の月
		CASE 4, 6, 9, 11
			LOCAL:1 = 30
		;2月
		CASE 2
			LOCAL:1 = 28 + (ARG:2 == 366)
		;31日の月
		CASEELSE
			LOCAL:1 = 31
	ENDSELECT
	IF ARG > LOCAL:1
		ARG -= LOCAL:1
	ELSE
		BREAK
	ENDIF
NEXT
RETURNF ARG:2 ? ARG # LOCAL-1

;-------------------------------------------------
;月名変換関数@GETMONTHNAME
;	引数0：ｎ月のｎ
;旧暦の月名に変換するだけ！
;12を超えていたら勝手に12で割って計算します。
;-------------------------------------------------
@GETMONTHNAME(ARG)
#FUNCTIONS
;念のための処理
ARG %= 12
SELECTCASE ARG
	CASE 1
		RETURNF "睦月"
	CASE 2
		RETURNF "如月"
	CASE 3
		RETURNF "弥生"
	CASE 4
		RETURNF "卯月"
	CASE 5
		RETURNF "皐月"
	CASE 6
		RETURNF "水無月"
	CASE 7
		RETURNF "文月"
	CASE 8
		RETURNF "葉月"
	CASE 9
		RETURNF "長月"
	CASE 10
		RETURNF "神無月"
	CASE 11
		RETURNF "霜月"
	CASEELSE
		RETURNF "師走"
ENDSELECT

repo_name: mcstone/syokushuhenth

license: unknown


code:
;-------------------------------------------------
;■PALAMSPREAD	Auther:こいしペロリストの人
;	文字列表示・アニメーション関数ファイルのぱにめーしょんいユーザ定義アニメを追加する非正規な付属品です
;	触手宮系のパラメータバーが格闘ゲームのHPバーのように *にょいーん* と伸びます
;	東方触手変の仕様に合わせて開発していますので触手宮含め他バリアントでは使用できません
;	「ぱにめーしょん」の開発者である ぱ氏 とは関係ありませんので連絡はしたらば掲示板触手宮スレにてお願いします
;-------------------------------------------------
;■対応バリアント
;	東方触手変
;-------------------------------------------------
;■継承しているため動作するのに必須なバリアント一覧
;	ぱにめーしょん
;
;■参考にしたバリアント一覧
;	eraMegaten
;
;	問題がございましたら掲示板にてご指摘ください
;	お詫びすると共にパッチの訂正、あるいはパッチを取り下げる形で対応させて頂きます
;-------------------------------------------------
;■使い方
;	1.CALL PALAMSPREAD_ENTRY(CHARA_ID) でキャラのパラを保存
;	2.CALL PALAMSPREAD_ACTION(PATTERN_ID) で保存したキャラのパラから現在値まで *にょいーん* と伸びます
;		PATTERN_ID
;			-1:	ウォッチャー君機能	SHOP画面でストーキング対象のパラ変化を確認するための機能
;			 0:	全ステータス再生	デフォルト機能、全パラメータが *にょいーん* と伸びます
;			 1:	ECSTASY再生			EPダメージで受けた開発パラメータが *にょいーん* と伸びます
;-------------------------------------------------

;-------------------------------------------------
;パラメータ成長アニメーション：@PALAMSPREAD_ENTRY
;	PALAMSPREAD_ENTRYは連続で呼び出されると前回のSNAPENTRYを上書きします
;	上記の点を留意して短い期間のパラメータ監視にご使用ください
;-------------------------------------------------
;■引数
;ARG:0	：管理するキャラID
;-------------------------------------------------
@PALAMSPREAD_ENTRY(ARG)
#DIM LCOUNT ;ループ用
#DIM CHARA_ID

IF ARG:0 >= 0 && ARG <= CHARANUM

	CHARA_ID = ARG

	SNAPENTRY_ID = CHARA_ID

	;現在のパラ値をENTRY:CHARA_IDに保存
	FOR LCOUNT, 0 , 17
		SIF LCOUNT < 6
			SNAPENTRY_BASE:LCOUNT = BASE:CHARA_ID:LCOUNT
		SNAPENTRY_EXP:LCOUNT = EXP:CHARA_ID:LCOUNT
		SNAPENTRY_ABL:LCOUNT = ABL:CHARA_ID:LCOUNT
	NEXT
	;絶頂回数のEXP:20はEPのループ判定に必要なので専用に保存
	SNAPENTRY_EXP:20 = EXP:CHARA_ID:20
ELSE
;想定外の引数の場合エラーコードを返す
	SETCOLOR 0xFF0000
	PRINTFORML 【ERROR：預期外的數據】PALAMSPREAD > {ARG}是未定義的角色ID！
	;TranslatedMark 【ERROR：予期せぬ引数】PALAMSPREAD > {ARG}は予期していないキャラID値です！
ENDIF

;-------------------------------------------------
;パラメータ成長アニメーション@PALAMSPREAD_ACTION
;
;-------------------------------------------------
;■引数
;ARGS		：出力するアニメーションパターン
;ARG		：CHARA_ID
;-------------------------------------------------
@PALAMSPREAD_ACTION(ARGS = "" , ARG)
#DIM LCOUNT,2 ;ループ用
#DIM CHARA_ID
#DIM DELAY
#DIM FAST
#DIM FLAME
#DIM FINISH

;///初期化不十分の対策///
SIF PALAMSPREAD_FLAME == 0
	PALAMSPREAD_DELAY = 300
;///異常検知///
;異常なFLAME値の修正
SIF PALAMSPREAD_FLAME == 0
	PALAMSPREAD_FLAME = 180

;表示オン
IF ANIME_CONFIG("USER2")
	;///初期化///
	;フラグの初期化
	CHARA_ID = 0
	DELAY = PALAMSPREAD_DELAY
	FAST = 10 - PALAMSPREAD_FAST
	FINISH = 0
	FLAME = PALAMSPREAD_FLAME
	ENTRY_ECSTASY = 0
	ENTRY_FLAG = 0

	;CHARA_IDをSNAPENTRY_IDから取得
	CHARA_ID = SNAPENTRY_ID

	;現在のパラ値をENTRY:CHARA_IDに保存
	FOR LCOUNT, 0 , 17
		SIF LCOUNT < 6
			ENTRY_BASE:LCOUNT = SNAPENTRY_BASE:LCOUNT
		ENTRY_EXP:LCOUNT = SNAPENTRY_EXP:LCOUNT
		ENTRY_ABL:LCOUNT = SNAPENTRY_ABL:LCOUNT
	NEXT
	ENTRY_EXP:20 = SNAPENTRY_EXP:20

	;変化量を取得
	SIF !PALAMSPREAD_DIFF(CHARA_ID)
		FAST = 0

	;///出力処理はココから///
	;名前出力
	PRINTFORML 【%CALLNAME:CHARA_ID%】

	;アニメーション用再起処理
	;本来はループ処理だが再起エラーが怖いのでFOR文で終端を作る
	FOR LCOUNT, 0 , 500

		;カラーバー出力
		;///引数に合わせて出力を呼び出す場所///
		;出力パターン関数はPALAMSPREAD_PATTERNSに記述して呼び出す
		SELECTCASE ARGS
			CASE "ECSTASY"
				; ECSTACY処理用出力
				CALL ANIMATE_ECSTASYPALAM(CHARA_ID, FLAME)
			CASEELSE
				;全パラメータ出力
				CALL ANIMATE_ALLPALAM(CHARA_ID, FLAME)
		ENDSELECT
		;//////////////////////////////////////

		;再起終了フラグの回収
		FINISH = RESULT

		;下の空間調整
		FOR LCOUNT:1, 0 , SHOP_LINAGE
			PRINTFORML
		NEXT

		;1回目と終了時はディレイをかける(初期値:300)
		SIF LCOUNT == 0 || FINISH == 1
			TWAIT MAX(1 , DELAY) , 0

		;絶頂時のフレーバ演出
		IF GETBIT(ENTRY_ECSTASY, 0)
			CALL QUAKE(2)
			TWAIT 150, 0
			CLEARBIT ENTRY_ECSTASY , 0
			SETBIT ENTRY_ECSTASY, 1
		ENDIF

		;再起要求による終了処理
		SIF FINISH == 1
			BREAK

		SIF FAST > 0
			TWAIT FAST , 0

		;カラーバーの消去
		CLEARLINE (PS_LINAGE + SHOP_LINAGE + BUFFER_LINAGE)
	NEXT

	;下の空間を詰めて後処理
	CLEARLINE SHOP_LINAGE + ENTRY_LINAGE

ELSE
;表示オフ

ENDIF


code:
;■マクロ定義
;PS_LINAGE		PALAMSPREADが全てのバーを出力したときの行数(8)
;BUFFER_LINAGE	カラーバー出力後のバッファ改行数
;SHOP_LINAGE	ゲージ出力位置を統一しないと酔うので改行調節用の行数、WATCHER_LINAGEと揃えても良い
#DEFINE	PS_LINAGE 8 ;固定
#DEFINE BUFFER_LINAGE 1
#DEFINE	SHOP_LINAGE 0

;■汎用的な変数
;WATCHER_ID	ウォッチャー君機能が監視しているCHARA_ID（現在は初期宿主）
#DIM	SNAPENTRY_ID

;■CONFIG値
;FAST系		アニメーションの早さ
;FLAME系	1フレームにおけるENTRY変化量
;DELAY系	アニメーションの最初と最後のディレイ
#DIM SAVEDATA	PALAMSPREAD_FAST
#DIM SAVEDATA	PALAMSPREAD_FLAME
#DIM SAVEDATA	PALAMSPREAD_DELAY

;■スナップショット保存変数（SNAPENTRY値）
;PALAMSPREAD_WENTRY、PALAMSPREAD_ENTRYがスナップショットしたパラメータ保存先
;ENTRYの初期値になる
;保存範囲 BASE：0~5，EXP：0~16，ABL：0~17
#DIM	SNAPENTRY_BASE, 10
#DIM	SNAPENTRY_EXP, 50
#DIM	SNAPENTRY_ABL, 20

;■処理用の揮発変数（ENTRY値）
;ENTRY値を現パラメータに合わせていく過程をバーで出力することによりアニメーションを実現
;ENTRY_DIFF		SNAPENTRY値と現パラメータとの変化量
;ENTRY_LINAGE	PALAMSPREADパターン内で改行した回数
#DIM	ENTRY_BASE, 10
#DIM	ENTRY_EXP, 50
#DIM	ENTRY_ABL, 20
#DIM	ENTRY_DIFF, 18

#DIM	ENTRY_LINAGE

;■処理用のフラグビット管理変数（ENTRY値）
;ENTRY_FLAG		変化したパラメータのID値を2進ビット値で保存 BASE:0~5 EXP:6~17
;ENTRY_ECSTASY	EP絶頂時フレーバを2進ビット値でステート管理、0:絶頂フレーバ演出要求 1:絶頂フレーバ演出発生
#DIM	ENTRY_FLAG
#DIM	ENTRY_ECSTASY

;■口上PALAMSPREAD要請フック用変数
#DIM	PALAMSPREAD , 200


code:
;-------------------------------------------------
;■BASE変化アニメーション：@ANIMATE_BASEBAR
;	バーを出力するのに必要な値をBASEの関係値を用いて適切に調節してから出力する関数
;	なお、絶頂回数が未実装でありEP変化を管理できず盛大にバグります（泣）、アプデに併せてマージ予定
;	色は本体図鑑から引き続き eraMegaten から継承させて頂いております
;-------------------------------------------------
;■関連ERAバリアント
;	eraMegaten	PRINT_COLORBAR
;
;	問題がございましたら掲示板にてご指摘ください
;	お詫びすると共にパッチの訂正、あるいはパッチを取り下げる形で対応させて頂きます
;-------------------------------------------------
;■引数
;	ARG:0	：対象のCHARA_ID
;	ARG:1	；対象のBASE_ID
;	ARG:2	；フレーム値
;	ARG:3	；スケール値
;-------------------------------------------------
@ANIMATE_BASEBAR(ARG:0, ARG:1, ARG:2, ARG:3 = 10)
#DIM COLOR
#DIM FLAME
#DIM SCALE
#DIM VALUE

;///値の初期化///
;引数を受け取る
FLAME = ARG:2
SCALE = ARG:3

;扱うBASE値によってケース分岐
SELECTCASE ARG:1
	;HP
	CASE 0
	;色代入
	COLOR = 0x70FFFF

	;MP
	CASE 1
	;色代入
	COLOR = 0x70FF70

	;EP
	CASE 2
	;色代入
	IF GETBIT(ENTRY_ECSTASY , 1)
		COLOR = 0xFFC0FF
	ELSE
		COLOR = 0xFF70FF
	ENDIF

	;PP
	CASE 3
	;色代入
	COLOR = 0xFFFF70
	FLAME = FLAME / 10

	;SP
	CASE 4
	;色代入
	COLOR = 0xC0C0C0
	FLAME = FLAME / 100

	;TP
	CASE 5
	;色代入
	IF ENTRY_BASE:5 <= 50
		COLOR = 0x2070FF
	ELSEIF ENTRY_BASE:5 <= 80
		COLOR = 0x50C0FF
	ELSEIF ENTRY_BASE:5 >= 150
		COLOR = 0xE02020
	ELSEIF ENTRY_BASE:5 >= 120
		COLOR = 0xF07090
	ELSE
		COLOR = 0xC0C0C0
	ENDIF
	FLAME = FLAME / 100

ENDSELECT

;///条件による処理の中断///
;変化してないパラ値なら描写して終了
IF BASE:(ARG:0):(ARG:1) == ENTRY_BASE:(ARG:1) || (ARG:1 == 2 && BASE:(ARG:0):(ARG:1) == ENTRY_BASE:(ARG:1) && ENTRY_EXP:20 == EXP:(ARG:0):20)
	CALL ANIMATE_COLORBAR(COLOR , BASE:(ARG:0):(ARG:1) , BASE:(ARG:0):(ARG:1) , MAXBASE:(ARG:0):(ARG:1) , SCALE)
	RETURN 1
ENDIF

;///本格的な描写処理はここから///
;FLAME値分だけENTRY値を減算して更新
IF ARG:1 != 5
	;TP以外の場合は減少処理のみ
	ENTRY_BASE:(ARG:1) -= FLAME
ELSE
	;TPの場合はFLAME値分だけ増える可能性があるため別途処理
	IF BASE:(ARG:0):(ARG:1) - ENTRY_BASE:(ARG:1) > 0
		ENTRY_BASE:(ARG:1) -= FLAME
	ELSE
		ENTRY_BASE:(ARG:1) += FLAME
	ENDIF
ENDIF

;EPの場合は絶頂判定
IF ARG:1 == 2 && ENTRY_BASE:2 < 0 && ENTRY_EXP:20 < EXP:(ARG:0):20
	;ENTRYの絶頂経験を足し込む
	ENTRY_EXP:20++
	;ENTRYの値が満タンになる
	ENTRY_BASE:(ARG:1) = MAXBASE:(ARG:0):(ARG:1)
	;絶頂フレーバ要求
	SETBIT ENTRY_ECSTASY , 0
ENDIF

;変化量の算出
;変化量 = 現在のパラ - 保存しているパラ
VALUE = BASE:(ARG:0):(ARG:1) - ENTRY_BASE:(ARG:1)

;TPが増加した場合、他のBASE値の終了判定が正負逆転するため修正
IF ARG:1 == 5 && BASE:(ARG:0):(ARG:1) - ENTRY_BASE:(ARG:1) <= 0
	VALUE = VALUE * -1
ENDIF

;描写処理
;EP
IF	ARG:1 == 2
	IF GETBIT(ENTRY_ECSTASY , 0)
		;絶頂時フレーバ演出
		COLOR = 0xFFC0FF
		CALL ANIMATE_COLORBAR(COLOR , MAXBASE:(ARG:0):(ARG:1) , MAXBASE:(ARG:0):(ARG:1) , MAXBASE:(ARG:0):(ARG:1) , SCALE)
		RETURN 0
	ELSEIF VALUE > 0 && ENTRY_EXP:20 >= EXP:(ARG:0):20
		;変化量差分が負なら描写だけして再起不要を返す
		ENTRY_BASE:(ARG:1) = BASE:(ARG:0):(ARG:1)
		CALL ANIMATE_COLORBAR(COLOR , BASE:(ARG:0):(ARG:1) , BASE:(ARG:0):(ARG:1) , MAXBASE:(ARG:0):(ARG:1) , SCALE)
		RETURN 1
	ELSEIF ENTRY_EXP:20 < EXP:(ARG:0):20
		;絶頂処理前で、ゲージ0に向かってENTRYパラが減るときの処理
		CALL ANIMATE_COLORBAR(COLOR , 0 , ENTRY_BASE:(ARG:1) , MAXBASE:(ARG:0):(ARG:1) , SCALE)
		RETURN 0
	ELSEIF VALUE < 0 && ENTRY_EXP:20 == EXP:(ARG:0):20
		CALL ANIMATE_COLORBAR(COLOR , BASE:(ARG:0):(ARG:1) , ENTRY_BASE:(ARG:1) , MAXBASE:(ARG:0):(ARG:1) , SCALE)
		RETURN 0
	ENDIF
;EP以外
ELSEIF VALUE > 0
	;変化量差分が負なら描写だけして再起不要を返す
	ENTRY_BASE:(ARG:1) = BASE:(ARG:0):(ARG:1)
	CALL ANIMATE_COLORBAR(COLOR , BASE:(ARG:0):(ARG:1) , BASE:(ARG:0):(ARG:1) , MAXBASE:(ARG:0):(ARG:1) , SCALE)
	RETURN 1
ELSE
	;FLAME分ENTRYの値を変化させ再起要求を返す
	CALL ANIMATE_COLORBAR(COLOR , BASE:(ARG:0):(ARG:1) , ENTRY_BASE:(ARG:1) , MAXBASE:(ARG:0):(ARG:1) , SCALE)
	RETURN 0
ENDIF

;-------------------------------------------------
;■EXP成長量管理処理：@ANIMATE_EXPBAR
;	バーを出力するのに必要な値をEXPの関係値を用いて適切に調節してから出力する関数
;	描写するときは現Lvに到達するまで溜めたEXP量を減算して出力する
;	したがってLvが上がるとゲージが空っぽになったように見えるが、内部数値は触っておらず没問題
;-------------------------------------------------
;■引数
;	ARG:0	：対象のCHARA_ID
;	ARG:1	；対象のEXP_ID
;	ARG:2	；フレーム値
;	ARG:3	；スケール値
;-------------------------------------------------
@ANIMATE_EXPBAR(ARG:0, ARG:1, ARG:2 , ARG:3 = 10)
#DIM COLOR
#DIM FLAME
#DIM SCALE
#DIM VALUE
#DIM MAXEXP
#DIM STOCKEXP

;///値の初期化///
;引数を受け取る
FLAME = ARG:2
SCALE = ARG:3

;色代入
COLOR = 0xC0C0C0

;ENTRY値がLv上昇に必要なEXP量を取得
CALL GET_NEED_EXP(ARG:1 , ENTRY_ABL:(ARG:1) + 1)
MAXEXP = RESULT

;ENTRY値が現Lvになるまで必要なEXP量を取得
STOCKEXP = 0
IF ENTRY_ABL:(ARG:1) > 0
	CALL GET_NEED_EXP(ARG:1 , ENTRY_ABL:(ARG:1))
	STOCKEXP = RESULT
ENDIF

;FLAME値の補正
SIF ARG:1 >= 11
	FLAME = FLAME/100

;///条件による処理の中断///
;描写の強制終了処理
IF MAXEXP == -1
	;最大Lvに到達していたら満タン描写だけして再起不要を出す
	COLOR = 0x606060
	ENTRY_EXP:(ARG:1) = EXP:(ARG:0):(ARG:1)
	CALL ANIMATE_COLORBAR(COLOR , MAXEXP , MAXEXP , MAXEXP, SCALE)
	RETURN 1
ELSEIF EXP:(ARG:0):(ARG:1) == ENTRY_EXP:(ARG:1)
	;保存値と現在値が完全に一致していたら描写だけして再起不要を出す
	CALL ANIMATE_COLORBAR(COLOR , EXP:(ARG:0):(ARG:1)-STOCKEXP , EXP:(ARG:0):(ARG:1)-STOCKEXP , MAXEXP-STOCKEXP , SCALE)
	RETURN 1
ENDIF

;///本格的な描写処理はここから///
;更新したENTRY値がLv上昇に必要なEXP量を超えていたとき
IF ENTRY_EXP:(ARG:1) > MAXEXP
	;数値をクリアして変数を次のLvに更新する
	ENTRY_ABL:(ARG:1) += 1
	CALL GET_NEED_EXP((ARG:1), ENTRY_ABL:(ARG:1))
	STOCKEXP = RESULT
	CALL GET_NEED_EXP((ARG:1), ENTRY_ABL:(ARG:1) + 1)
	MAXEXP = RESULT
ENDIF

;FLAME値分だけENTRY値を増加して更新
ENTRY_EXP:(ARG:1) += FLAME

;変化量の算出（変化量 = 現在のパラ値 - ENTRYパラ値）
VALUE = EXP:(ARG:0):(ARG:1) - ENTRY_EXP:(ARG:1)

;描写処理
IF  VALUE < 0
	;変化量差分が負なら描写だけして再起不要を返す
	ENTRY_EXP:(ARG:1) = EXP:(ARG:0):(ARG:1)
	CALL ANIMATE_COLORBAR(COLOR , EXP:(ARG:0):(ARG:1)-STOCKEXP , EXP:(ARG:0):(ARG:1)-STOCKEXP , MAXEXP-STOCKEXP, SCALE)
	RETURN 1
ELSEIF VALUE < 0 && ENTRY_ABL:(ARG:1) < ABL:(ARG:0):(ARG:1)
	;ENTRYレベルアップ前で、ゲージ最大に向かってENTRYパラ値が増えるときの処理
	CALL ANIMATE_COLORBAR(COLOR , ENTRY_EXP:(ARG:1)-STOCKEXP , MAXEXP-STOCKEXP , MAXEXP-STOCKEXP, SCALE)
	RETURN 0
ELSEIF VALUE >= 0
	;現在のパラ値に向かってENTRYパラ値が増えるときの処理
	CALL ANIMATE_COLORBAR(COLOR , ENTRY_EXP:(ARG:1)-STOCKEXP , EXP:(ARG:1)-STOCKEXP , MAXEXP-STOCKEXP, SCALE)
	RETURN 0
ENDIF

;-------------------------------------------------
;■アニメーションバー出力関数：@ANIMATE_COLORBAR
;	図鑑と出力表現を揃えるために eraMegaten から一部継承しています
;-------------------------------------------------
;■引数
;	ARG:0	：バーのカラーセット
;	ARG:1	：対象ステの現在値
;	ARG:2	：対象ステの変化前の値
;	ARG:3	：対象ステの最大値
;	ARG:4	；バーの長さ
;	LOCAL:1	；現在値のバー
;	LOCAL:2	；変化中のバー
;	LOCAL:3	；背景のバー
;-------------------------------------------------
;■継承ERAバリアント
;	eraMegaten	PRINT_COLORBAR
;
;	問題がございましたら掲示板にてご指摘ください
;	お詫びすると共にパッチを取り下げる形で対応させて頂きます
;-------------------------------------------------
@ANIMATE_COLORBAR(ARG:0, ARG:1, ARG:2, ARG:3, ARG:4 = 10)
#DIM LCOUNT ;ループ用
#LOCALSIZE 2 ;バーのサイズ保存用
#DIM SCALE

;バーのサイズのスケールを代入(何も入れないと10、図鑑BASE値は10、図鑑EXP値は20)
SCALE = ARG:4

;変化後のバーのサイズを算出
IF ARG:1 == 0
	LOCAL:0 = 0
ELSE
	LOCAL:0 = ARG:1 * SCALE / ARG:3
ENDIF

;変化中のバー（赤色のアレ）のサイズを算出
IF ARG:2 == 0
	LOCAL:1 = 0
ELSE
	LOCAL:1 = ARG:2 * SCALE / ARG:3
ENDIF

;減少するバーの描写
FOR LCOUNT, 0 , SCALE + 1
	;変化後描写
	IF LOCAL:0 >= LCOUNT && LOCAL:0 != 0
		SETCOLOR ARG:0
		PRINTFORM %UNICODE(0x2586)%
	;変化中描写（赤色のアレ）
	ELSEIF LOCAL:1 >= LCOUNT && LOCAL:1 != 0
		SETCOLOR 0xE02020
		PRINTFORM %UNICODE(0x2586)%
	;背景色描写
	ELSE
		SETCOLOR 0x202020
		PRINTFORM %UNICODE(0x2585)%
	ENDIF
NEXT

RESETCOLOR

;-------------------------------------------------
;■モジュール関数
;-------------------------------------------------

;ウォッチャー君機能のストーキング対象を選択する
;CONFIGUREやSHOP画面から呼び出す
@PALAMSPREAD_WSELECT
#DIM LCOUNT ;ループ用
#DIM ALIGN_BUTTON

	PRINTFORML 將更換待機時觀察的角色。
	;TranslatedMark 待機画面で表示するキャラを変更します。
	PRINTFORML 現在監視的角色是%CALLNAME:WATCHER_ID%。
	;TranslatedMark 現在監視されているキャラは%CALLNAME:WATCHER_ID%です。

	$INPUT_LOOP
	DRAWLINE

	ALIGN_BUTTON = 0
	VARSET LOCAL

	FOR LCOUNT , 1 , CHARANUM
		IF CFLAG:LCOUNT:6
			IF LCOUNT == WATCHER_ID
				SETCOLOR 0xA260BF
			ELSEIF CFLAG:LCOUNT:屈服済
				SETCOLOR 0x70FF70
			ELSEIF CFLAG:LCOUNT:支配済
				SETCOLOR 0x2070FF
			ELSEIF CFLAG:LCOUNT:侵食済
				SETCOLOR 0xF07090
			ENDIF
			PRINTFORM 　[{LCOUNT:LOCAL,3}] %CALLNAME:(LCOUNT),16,LEFT%
			RESETCOLOR

			LOCAL:LCOUNT = 1
			ALIGN_BUTTON += 1
			IF (ALIGN_BUTTON % 4) == 0
				PRINTL
			ENDIF
		ENDIF
	NEXT
	PRINTL
	DRAWLINE
	PRINTFORML [0] 取消
	;TranslatedMark [0] キャンセル
	INPUT

	IF RESULT == 0
		PRINTFORML 已取消
		;TranslatedMark キャンセルしました
	ELSEIF RESULT == WATCHER_ID
		CALL PALAMSPREAD_WENTRY(WATCHER_ID)
		SETCOLOR 0xA260BF
		PRINTFORML 觀察者似乎還是認為監視%CALLNAME:WATCHER_ID%更加有趣...
		;TranslatedMark ウォッチャーは%CALLNAME:WATCHER_ID%の監視にやりがいを感じているようです……
		RESETCOLOR
		PRINTFORMW %CALLNAME:WATCHER_ID%的状態將繼續顯示在待機界面。
		;TranslatedMark 引き続き%CALLNAME:WATCHER_ID%のパラメータを待機画面で表示します。
	ELSEIF RESULT > 0 && RESULT <= FLAG:キャラ人数 && LOCAL:RESULT
		WATCHER_ID = RESULT
		CALL PALAMSPREAD_WENTRY(WATCHER_ID)
		SETCOLOR 0xA260BF
		PRINTFORML 觀察者向著%CALLNAME:WATCHER_ID%出發了...
		;TranslatedMark ウォッチャーが%CALLNAME:WATCHER_ID%のもとへ向かっていった……
		RESETCOLOR
		PRINTFORMW %CALLNAME:WATCHER_ID%的状態將顯示在待機界面上。
		;TranslatedMark %CALLNAME:WATCHER_ID%のパラメータが待機画面で表示されるようになります。
	ELSE
		GOTO INPUT_LOOP
	ENDIF

;引数のCHARA_IDのENTRYパラ値と現パラ値の比較する関数
;変化のあればENTRY_FLAGの該当IDのビットを1で保存、変化量をENTRY_DIFFに保存
;何も変化がなければ0、何か変化があれば1が返る
@PALAMSPREAD_DIFF(CHARA_ID)
#FUNCTION
#DIM LCOUNT ;ループ用
#DIM CHARA_ID

FOR LCOUNT, 0 , 17
	IF LCOUNT < 6
		;BASE:EPは絶頂回数を足しこむ
		IF LCOUNT == 2 && ENTRY_BASE:LCOUNT != BASE:CHARA_ID:LCOUNT && EXP:CHARA_ID:20 > ENTRY_EXP:20
			SETBIT ENTRY_FLAG , LCOUNT
			ENTRY_DIFF:LCOUNT = ENTRY_BASE:LCOUNT - BASE:CHARA_ID:LCOUNT + (MAXBASE:CHARA_ID:LCOUNT * (EXP:CHARA_ID:20 - ENTRY_EXP:20))
		ELSEIF ENTRY_BASE:LCOUNT != BASE:CHARA_ID:LCOUNT
			SETBIT ENTRY_FLAG , LCOUNT
			ENTRY_DIFF:LCOUNT = ENTRY_BASE:LCOUNT - BASE:CHARA_ID:LCOUNT
		ELSE
			CLEARBIT ENTRY_FLAG , LCOUNT
		ENDIF
	ELSEIF LCOUNT >= 6
		IF ENTRY_EXP:LCOUNT != EXP:CHARA_ID:LCOUNT && ENTRY_ABL:LCOUNT != ABL:CHARA_ID:LCOUNT
			SETBIT ENTRY_FLAG , LCOUNT
			ENTRY_DIFF:LCOUNT = EXP:CHARA_ID:LCOUNT - ENTRY_EXP:LCOUNT
		ELSE
			CLEARBIT ENTRY_FLAG , LCOUNT
		ENDIF
	ENDIF

NEXT

RETURNF ENTRY_FLAG == 0 ? 0 # 1


code:
;----------------------------------------------
;■BASE変化アニメーション@ANIMATE_ALLPALAM
;	出力パターン（ANIMATE_BASEBARとANIMATE_EXPBARを呼び出す位置の調節）を記述する関数
;	ANIMATE_ALLPALAMは全パラメータをアニメーションで出力するパターンを記述している
;-------------------------------------------------
;■引数
;	ARG:0	：対象のCHARA_ID
;	ARG:1	；フレーム値
;
;■返り値
;	RESULT	；アニメーション完了フラグ（0:再起要求，1:再起不要）
;-------------------------------------------------
@ANIMATE_ALLPALAM(ARG:0, ARG:1)
#DIM LCOUNT	;ループ用
#DIM FLAME
#DIM FINISH
#DIM LINAGE	;この出力パターンで出力した行数を管理
#DIM BASE_SCALE
#DIM EXP_SCALE
#DIM MAXEXP

;フレーム値の受け取り
FLAME = ARG:1

;再起処理終了フラグを初期化（0:再起要求，1:再起不要）
FINISH = 1

;出力行数の初期化（改行間調節用、初期値8から改行時に減らす）
LINAGE = PS_LINAGE

;出力するバーの長さを代入（好みで、無くても図鑑の幅で出力される）
BASE_SCALE = 10
EXP_SCALE = 20

;///ここから出力パターンを記述///
;■呼び出す関数
;	CALL ANIMATE_BASEBAR(CHARA_ID, BASE_ID , FLAME値 , バーのスケール)
;	CALL ANIMATE_EXPBAR(CHARA_ID, EXP_ID , FLAME値 , バーのスケール)
;■フレーバに使える変数
;	ENTRY_DIFF:*	変化量を格納しているグローバル変数（BASE:0^5 EXP:6^17）
;■忘れがちの注意点
;	PRINTFORMLで改行したら LINAGE を1つ減らす！

;BASE値
FOR LCOUNT, 0 , 6
	PRINTFORM 　%BASENAME:LCOUNT%[
	CALL ANIMATE_BASEBAR(ARG:0 , LCOUNT , FLAME , BASE_SCALE)
	PRINTFORM ]({MIN(ENTRY_BASE:LCOUNT , 99999), 5}/{MAXBASE:(ARG:0):LCOUNT, 5})
	SIF FINISH == 1
		FINISH = RESULT
	;改行
	IF LCOUNT == 2 || LCOUNT == 5
		PRINTFORML
		LINAGE--
	ENDIF
NEXT

;EXP値
FOR LCOUNT, 6 , 12
	CALL GET_NEED_EXP((LCOUNT), ENTRY_ABL:LCOUNT + 1)
	MAXEXP = RESULT
	IF LCOUNT != 11
		PRINTFORM 　%ABLNAME:LCOUNT% Lv{ENTRY_ABL:LCOUNT}[
		CALL ANIMATE_EXPBAR(ARG:0 , LCOUNT , FLAME , EXP_SCALE)
		PRINTFORM ]({MIN(ENTRY_EXP:LCOUNT , 99999), 5}/{MAXEXP, 5})
		SIF FINISH == 1
			FINISH = RESULT
		PRINTFORM 　%ABLNAME:(LCOUNT+5)% Lv{ENTRY_ABL:(LCOUNT+5)}[
	ELSE
		PRINTFORM 　　　　　　　　　　　　　　　　　　　　　　　　　%ABLNAME:(LCOUNT+5)% Lv{ENTRY_ABL:(LCOUNT+5)}[
	ENDIF

	CALL GET_NEED_EXP((LCOUNT+5), ENTRY_ABL:(LCOUNT+5) + 1)
	MAXEXP = RESULT
	CALL ANIMATE_EXPBAR(ARG:0 , LCOUNT+5 , FLAME , EXP_SCALE)
	PRINTFORM ]({MIN(ENTRY_EXP:(LCOUNT+5) , 99999), 5}/{MAXEXP, 5})
	SIF FINISH == 1
		FINISH = RESULT

	;改行
	PRINTFORML
	LINAGE--
NEXT
;////////////////////////////////

;改行調節
ENTRY_LINAGE = LINAGE
FOR LCOUNT , 0 , LINAGE + BUFFER_LINAGE
	PRINTFORML
NEXT

RETURN FINISH

;-------------------------------------------------
;□@ANIMATE_ECSTASYPALAM
;	出力パターン（ANIMATE_BASEBARとANIMATE_EXPBARを呼び出す位置の調節）を記述する関数
;	ELOSPALAMはECSTASY結果をアニメーションで出力するパターンを記述している
;-------------------------------------------------
@ANIMATE_ECSTASYPALAM(ARG:0, ARG:1)
#DIM LCOUNT	;ループ用
#DIM FLAME
#DIM FINISH
#DIM LINAGE	;この出力パターンで出力した行数を管理
#DIM BASE_SCALE
#DIM EXP_SCALE
#DIM MAXEXP

FLAME = ARG:1
FINISH = 1
LINAGE = PS_LINAGE

BASE_SCALE = 10
EXP_SCALE = 20

;///ここから出力パターンを記述///
;■呼び出す関数
;	CALL ANIMATE_BASEBAR(CHARA_ID, BASE_ID , FLAME値 , バーのスケール)
;	CALL ANIMATE_EXPBAR(CHARA_ID, EXP_ID , FLAME値 , バーのスケール)
;■フレーバに使える変数
;	ENTRY_DIFF:*	変化量を格納しているグローバル変数（BASE:0^5 EXP:6^17）
;■忘れがちの注意点
;	PRINTFORMLで改行したら LINAGE を1つ減らす！

;BASE値
FOR LCOUNT, 2 , 6
	IF LCOUNT == 2
		BASE_SCALE = 20
	ELSE
		BASE_SCALE = 10
	ENDIF
	PRINTFORM 　%BASENAME:LCOUNT%[
	CALL ANIMATE_BASEBAR(ARG:0 , LCOUNT , FLAME , BASE_SCALE)
	PRINTFORM ]({MIN(ENTRY_BASE:LCOUNT , 99999), 5}/{MAXBASE:(ARG:0):LCOUNT, 5})
	SIF LCOUNT == 2
		PRINTFORM  (-{ENTRY_DIFF:LCOUNT})
	SIF FINISH == 1
		FINISH = RESULT
	;改行
	IF LCOUNT == 2 || LCOUNT == 5
		PRINTFORML
		LINAGE--
	ENDIF
NEXT

;EXP感覚値
FOR LCOUNT, 6 , 17
	IF GETBIT(ENTRY_FLAG , LCOUNT)
		CALL GET_NEED_EXP((LCOUNT), ENTRY_ABL:LCOUNT + 1)
		MAXEXP = RESULT

		PRINTFORM 　%ABLNAME:LCOUNT% Lv{ENTRY_ABL:LCOUNT}[
		CALL ANIMATE_EXPBAR(ARG:0 , LCOUNT , FLAME , EXP_SCALE)
		PRINTFORM ]({MIN(ENTRY_EXP:LCOUNT , 99999), 5}/{MAXEXP, 5})
		PRINTFORM  (+{ENTRY_DIFF:LCOUNT})
		SIF FINISH == 1
			FINISH = RESULT

		;改行
		PRINTFORML
		LINAGE--
	ENDIF
NEXT
;////////////////////////////////

ENTRY_LINAGE = LINAGE
FOR LCOUNT , 0 , LINAGE + BUFFER_LINAGE
	PRINTFORML
NEXT

RETURN FINISH


code:
■PALAMSPREAD取り説
Author:こいしペロリストの人　2019/07/23

●(ⅰ)演出側の取り説
□PALAMSPREADのON/OFF
 PARAMSPREAD:[キャラクター番号]	> 0:OFF 1:ON
	基本的にはコンフィグでONとOFFを切り替えます。
	こいし(84)の場合「PALAMSPREAD:84 = 1」を口上側で記述すれば勝手にONにできます
	ただし口上共有のためアップロードするときにはやらない方がいいかも？

□PARAMSPREAD君が反応する変数一覧
【フック位置】		【実行パターン】
ECSTASY実行時		PALAMSPREAD_ECSTASYPALAM

●(ⅱ)開発側の取り説
□演出を追加したい人向けの使い方
1)PALAMSPREAD_PATTERNS に演出方法を記述した関数を作ります。
2)PALAMSPREAD_ACTION で引数に基づき呼び出している箇所に先ほど記述した関数に引数を割り当てて追加します。
3)(ⅰ)に従って出力を行います。

□引数概要
PALAMSPREAD_PATTERNS > ANIMATE_ALLPALAM(CHARA_ID , FLAME値)
	ここまでする方ならプログラムのコメント側でオナシャス。

●(ⅲ)改造したいお仲間用の仕様解説
□アルゴリズム概要
PALAMSPREAD は ENTRY のパラメータが現パラメータになるまで増加(減少)する様子を動的に出力することで実装している。
アニメーションの始点は SNAPENTRY のスナップショットパラメータ、終点は現在のパラメータである。

○備考
ぱにめーしょん管理フラグは「ウォッチャー君機能」が「"USER1"」、「PALAMSPREAD」が「"USER2"」を使う。
見易さのための改行幅はデザインの一貫性を保持するためにヘッダーファイルの#DEFINEによるマクロで調節する。
アニメーションの１フレームの長さはFAST、１フレームでの ENTRY 変化量はFLAME値によって制御される。
出力したくないときはぱにめーしょん管理フラグを1にする、静止画にするときはFASTの値を0にすると処理結果のみ出力になる。

○挙動
1)PALAMSPREAD_ENTRY で現在のパラメータを SNAPENTRY にそれぞれ格納
2)PALAMSPREAD_ACTION が SNAPENTRY を ENTRY に移し変えて ANIMATE_xxxPALAM からパターンを呼び出し出力
3)ANIMATE_xxxPALAM からパターンに従ってANIMATE_BASEBAR、ANIMETE_EXPBARを呼び出す
4)ANIMATE_xxxBAR が ENTRY をFLAME値分だけ更新、他ステータスに従って適切に調整された ENTRY の値を ANIMATE_COLORBAR に渡す
5)ANIMATE_COLORBAR が現在の ENTRY を出力して関数呼び出し終了
5)(2)～(5)を ENTRY が現在値になるまで再起処理させて更新出力してアニメーション再生を実行
6)全ENTRYパラメータが再起不要になり終了要求が満場一致になると PALAMSPREAD_ACTION は再起処理を終える


code:
;■マクロ定義数値
;ANIME_CONFIGUEで使うユーザ指定のパニメーションはマクロで変換する
;""で括ったものはマクロとして認識されないので本家ぱにめーしょんと書式が異なる点は注意
#DEFINE	ウォッチャー君機能		"USER1"


code:
;=================================================
;ウォッチャー君機能のPRINT_MESSAGE
;個人的には口上側から自由にカスタマイズできるようにしたい
;ARG:0	WATCHER_ID
;=================================================
@SYSTEM_MESSAGE_ウォッチャー君機能(ARG:0, ARGS:1, ARGS:2, ARG:1, ARG:2)
;カラー配置
IF CFLAG:(ARG:0):屈服済
	SETCOLOR 0x70FF70
ELSEIF CFLAG:(ARG:0):支配済
	SETCOLOR 0x2070FF
ELSEIF CFLAG:(ARG:0):侵食済
	SETCOLOR 0xF07090
ELSE
	RESETCOLOR
ENDIF
		IF CFLAG:(ARG:0):植物同化 > 0
			PRINTFORML %ARGS:1%的身體正被寄生的植物所同化...
			;TranslatedMark %ARGS:1%は寄生された植物に体を乗っ取られ同化している……
		ELSEIF CFLAG:(ARG:0):ケモ化 > 0
			PRINTFORML %ARGS:1%化為了僅依本能行動的野獸...
			;TranslatedMark %ARGS:1%は獣になって本能のまま生きている……
		ELSEIF CFLAG:(ARG:0):石化 > 0
			PRINTFORML %ARGS:1%石化了...
			;TranslatedMark %ARGS:1%は石化している……
		ELSEIF CFLAG:(ARG:0):壁尻化 > 0
			PRINTFORML %ARGS:1%被做成了壁尻...
			;TranslatedMark %ARGS:1%は壁尻になっている……
		ELSEIF CFLAG:(ARG:0):行方不明 > 0
			PRINTFORML %ARGS:1%失踪了
			;TranslatedMark %ARGS:1%は行方不明だ
		ELSEIF CFLAG:(ARG:0):オナホ化 > 0
			PRINTFORML %ARGS:1%變成的飛機杯正在被使用中...
			;TranslatedMark %ARGS:1%はオナホとなって他人に使われている……
		ELSEIF CFLAG:(ARG:0):妊娠 > 0
			PRINTFORML %ARGS:1%懷上了%CSTR:(ARG:0):父親%的孩子...
			;TranslatedMark %ARGS:1%は%CSTR:(ARG:0):父親%の子供を妊娠している……
			SIF CFLAG:(ARG:0):妊娠 > 240
				PRINTFORML 　但本人似乎還沒有發現
				;TranslatedMark しかし本人はまだそのことに気づかないようだ
		ELSEIF CFLAG:(ARG:0):屈服済
			SELECTCASE RAND:1
				CASE 0
					PRINTFORML %ARGS:1%已經向異變徹底屈服了...
					;TranslatedMark %ARGS:1%は異変に完全に屈服している……
			ENDSELECT

		ELSEIF CFLAG:(ARG:0):支配済
		;支配状態だったら

			SELECTCASE RAND:1
				CASE 0
					PRINTFORML %ARGS:1%的身體被異變所支配...
					;TranslatedMark %ARGS:1%の身体は異変に支配されている……
			ENDSELECT

		ELSEIF CFLAG:(ARG:0):侵食済
		;侵食状態だったら

			IF CFLAG:(ARG:0):異変察知
			;異変察知済み
				SELECTCASE RAND:2
					CASE 1
						PRINTFORML %ARGS:1%意識到自己的身體正被異變所侵蝕...
						;TranslatedMark %ARGS:1%は異変に身体が侵食されてしまったことを自覚している……
					CASEELSE
						PRINTFORML %ARGS:1%正在尋找抑制侵蝕的方法...
						;TranslatedMark %ARGS:1%は身体の侵食を食い止める方法を探っている……
				ENDSELECT
			ELSE
				SELECTCASE RAND:1
					CASE 0
						PRINTFORML %ARGS:1%的身體正被異變侵蝕...
						;TranslatedMark %ARGS:1%の身体は異変に侵食されている……
				ENDSELECT
			ENDIF

		ELSE
		;平常状態だったら

			IF CFLAG:(ARG:0):異変察知
			;異変察知済み
				SELECTCASE RAND:2
					CASE 1
						PRINTFORML %ARGS:1%意識到本次異變之後尚有黑幕...
						;TranslatedMark %ARGS:1%は起きている異変に元凶となる存在がいることを察している……
					CASEELSE
						PRINTFORML %ARGS:1%正在嘗試探究本次異變的前因後果...
						;TranslatedMark %ARGS:1%は幻想郷で発生している異変の全容を追っている……
				ENDSELECT
			ELSE
			;平常
				SELECTCASE RAND:2
					CASE 1
						PRINTFORML %ARGS:1%過著與平時一般無二的生活...
						;TranslatedMark %ARGS:1%は普段と変わらない生活をしている……
					CASEELSE
						PRINTFORML %ARGS:1%沒有注意到異變，享受著幻想郷的日常...
						;TranslatedMark %ARGS:1%は異変に気づくことなく平然と暮らしている……
				ENDSELECT
			ENDIF

		ENDIF
		IF (!CFLAG:(ARG:0):妊娠 && TALENT:(ARG:0):幼稚 == 0) && ESTRUS_CYCLE_DAY(ARG:0) >= 12 && ESTRUS_CYCLE_DAY(ARG:0) <= 14
			PRINTFORML 　今天是%ARGS:1%的危險日
			;TranslatedMark 今日の%ARGS:1%は危険日だ
		ELSEIF (!CFLAG:(ARG:0):妊娠 && TALENT:(ARG:0):幼稚 == 0) && ESTRUS_CYCLE_DAY(ARG:0) >= 27 && ESTRUS_CYCLE_DAY(ARG:0) <= 29
			PRINTFORML 　今天是%ARGS:1%的安全日
			;TranslatedMark 今日の%ARGS:1%は安全日だ
		ELSEIF (!CFLAG:(ARG:0):妊娠 && TALENT:(ARG:0):幼稚 == 0) && ESTRUS_CYCLE_DAY(ARG:0) >= 0 && ESTRUS_CYCLE_DAY(ARG:0) <= 3
			PRINTFORML 　今天是%ARGS:1%的生理期
			;TranslatedMark 今日の%ARGS:1%は生理だ
		ENDIF
RESETCOLOR


code:
@NPCEVENTNAME0

RESULTS = 什么也没做
;TranslatedMark 何もしない

;EVENT可不可チェック
@NPCEVENTABLE0(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用

FLAG:28 = 1

;イベント実処理
@NPCEVENT0(CHARA_ID)
#DIM CHARA_ID

CFLAG:CHARA_ID:15 = 0

;ログがすごいことになるので基本地の文や口上に対応しない
;初期宿主に会いに来たり特別なものだけ解禁
;CALL PRINT_MESSAGE(CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:CHARA_ID, CALLNAME:(FLAG:5))


code:
@NPCEVENTNAME10

RESULTS = 战斗训练
;TranslatedMark 戦闘訓練

;EVENT可不可チェック
@NPCEVENTABLE10(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用

IF CFLAG:CHARA_ID:異変察知 && CFLAG:CHARA_ID:5 && GETBIT(FLAG:(50 + CFLAG:CHARA_ID:所属), 4)
	FLAG:28 = 1
ENDIF

;イベント実処理
@NPCEVENT10(CHARA_ID)
#DIM CHARA_ID

CFLAG:CHARA_ID:15 = 10

;ログがすごいことになるので基本地の文や口上に対応しない
;初期宿主に会いに来たり特別なものだけ解禁
;CALL PRINT_MESSAGE(CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:CHARA_ID, CALLNAME:(FLAG:5))

BASE:CHARA_ID:MP = MIN(MAXBASE:CHARA_ID:MP, BASE:CHARA_ID:MP * 11 / 10)
BASE:CHARA_ID:PP = MIN(MAXBASE:CHARA_ID:PP, BASE:CHARA_ID:PP * 11 / 10)
BASE:CHARA_ID:SP = MIN(MAXBASE:CHARA_ID:SP, BASE:CHARA_ID:SP * 11 / 10)

CALL ADD_ABL_EXP(3, CHARA_ID, RAND:200 + 200)
CALL ADD_ABL_EXP(4, CHARA_ID, RAND:200 + 200)
CALL ADD_ABL_EXP(5, CHARA_ID, RAND:200 + 200)

CALL ADD_TP(CHARA_ID, RAND:10 - RAND:5)


code:
@NPCEVENTNAME11

RESULTS = 情报分享
;TranslatedMark 情報共有

;EVENT可不可チェック
@NPCEVENTABLE11(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用

IF CFLAG:CHARA_ID:異変察知 && CFLAG:CHARA_ID:5 && GETBIT(FLAG:(50 + CFLAG:CHARA_ID:所属), 4)
	FLAG:28 = 1
ENDIF

;イベント実処理
@NPCEVENT11(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT

CFLAG:CHARA_ID:15 = 11

;ログがすごいことになるので基本地の文や口上に対応しない
;初期宿主に会いに来たり特別なものだけ解禁
;CALL PRINT_MESSAGE(CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:CHARA_ID, CALLNAME:(FLAG:5))

BASE:CHARA_ID:MP = MIN(MAXBASE:CHARA_ID:MP, BASE:CHARA_ID:MP * 11 / 10)
BASE:CHARA_ID:PP = MIN(MAXBASE:CHARA_ID:PP, BASE:CHARA_ID:PP * 11 / 10)
BASE:CHARA_ID:SP = MIN(MAXBASE:CHARA_ID:SP, BASE:CHARA_ID:SP * 11 / 10)

CALL ADD_ABL_EXP(1, CHARA_ID, RAND:200 + 50)
CALL ADD_ABL_EXP(2, CHARA_ID, RAND:200 + 50)

FOR LCOUNT, 1, CHARANUM
	IF CFLAG:CHARA_ID:5 == CFLAG:LCOUNT:5
		CALL ADD_ABL_EXP(1, LCOUNT, RAND:200 + 50)
		CALL ADD_ABL_EXP(2, LCOUNT, RAND:200 + 50)
		CFLAG:LCOUNT:異変察知 = 1
	ENDIF
NEXT


code:
@NPCEVENTNAME12

RESULTS = 情报收集
;TranslatedMark 情報収集

;EVENT可不可チェック
@NPCEVENTABLE12(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用

IF CFLAG:CHARA_ID:異変察知 && CFLAG:CHARA_ID:5 && GETBIT(FLAG:(50 + CFLAG:CHARA_ID:所属), 4)
	FLAG:28 = 1
ENDIF

;イベント実処理
@NPCEVENT12(CHARA_ID)
#DIM CHARA_ID

CFLAG:CHARA_ID:15 = 12

;ログがすごいことになるので基本地の文や口上に対応しない
;初期宿主に会いに来たり特別なものだけ解禁
;CALL PRINT_MESSAGE(CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:CHARA_ID, CALLNAME:(FLAG:5))

CALL ADD_ABL_EXP(0, CHARA_ID, RAND:200 + 50)
CALL ADD_ABL_EXP(1, CHARA_ID, RAND:200 + 50)

FLAG:探索度 += MAX(RAND:2 + ABL:CHARA_ID:0 - ITEM:46, 0)


code:
@NPCEVENTNAME13

RESULTS = 拠点警戒

;EVENT可不可チェック
@NPCEVENTABLE13(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用

IF CFLAG:CHARA_ID:異変察知 && CFLAG:CHARA_ID:5 && GETBIT(FLAG:(50 + CFLAG:CHARA_ID:所属), 4)
	FLAG:28 = 1
ENDIF

;イベント実処理
@NPCEVENT13(CHARA_ID)
#DIM CHARA_ID

CFLAG:CHARA_ID:15 = 13

;ログがすごいことになるので基本地の文や口上に対応しない
;初期宿主に会いに来たり特別なものだけ解禁
;CALL PRINT_MESSAGE(CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:CHARA_ID, CALLNAME:(FLAG:5))

CALL ADD_ABL_EXP(0, CHARA_ID, RAND:200 + 50)
CALL ADD_ABL_EXP(1, CHARA_ID, RAND:200 + 50)
CALL ADD_ABL_EXP(4, CHARA_ID, RAND:200 + 50)


code:
@NPCEVENTNAME14

RESULTS = 邀请
;TranslatedMark 招き入れる

;EVENT可不可チェック
@NPCEVENTABLE14(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用

;拠点があって恋人がいて恋人の拠点がない
IF CFLAG:CHARA_ID:所属 && GETBIT(FLAG:(50 + CFLAG:CHARA_ID:所属), 4) && CFLAG:CHARA_ID:恋人 && CFLAG:(CFLAG:CHARA_ID:恋人):所属 == 0
	FLAG:28 = 1
ENDIF

;イベント実処理
@NPCEVENT14(CHARA_ID)
#DIM CHARA_ID

CFLAG:CHARA_ID:15 = 14

;ログがすごいことになるので基本地の文や口上に対応しない
;初期宿主に会いに来たり特別なものだけ解禁

CALL PRINT_MESSAGE(CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:CHARA_ID, CALLNAME:(CFLAG:CHARA_ID:恋人))

CFLAG:(CFLAG:CHARA_ID:恋人):所属 = CFLAG:CHARA_ID:所属


code:
@NPCEVENTNAME15

RESULTS = 特快消息
;TranslatedMark スクープ

;EVENT可不可チェック
@NPCEVENTABLE15(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用

IF CFLAG:CHARA_ID:異変察知 && CALLNAME:(CHARA_ID) == "文"
	FLAG:28 = 1
ENDIF

;イベント実処理
@NPCEVENT15(CHARA_ID)
#DIM LCOUNT
#DIM CHARA_ID
#DIM RANDOM_CHARA_ID

CFLAG:CHARA_ID:15 = 15

FOR LCOUNT, 1, 8
	RANDOM_CHARA_ID = RANDOM_GET_CAUGHT_ID(CHARA_ID)
	IF CHECK_TRUST(RANDOM_CHARA_ID, CHARA_ID, 90 + RAND:40) && CFLAG:RANDOM_CHARA_ID:異変察知 == 0
		CFLAG:RANDOM_CHARA_ID:異変察知 = 1
		CALL PRINT_MESSAGE(CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:CHARA_ID, CALLNAME:RANDOM_CHARA_ID)
	ENDIF
NEXT


code:
@NPCEVENTNAME16

RESULTS = 呼朋引伴
;TranslatedMark 仲間を呼ぶ

;EVENT可不可チェック
@NPCEVENTABLE16(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用

IF CFLAG:CHARA_ID:逃走中 || ( ESCAPE_FROM_BATTLE(CHARA_ID) && GETBIT(FLAG:(50 + CFLAG:CHARA_ID:所属), 4) )
	FLAG:28 = 1
ENDIF

;イベント実処理
@NPCEVENT16(CHARA_ID)
#DIM CHARA_ID
#DIM RANDOM_CHARA_ID

CFLAG:CHARA_ID:15 = 16

;ログがすごいことになるので基本地の文や口上に対応しない
;初期宿主に会いに来たり特別なものだけ解禁
;

RANDOM_CHARA_ID = RANDOM_GET_CAUGHT_ID_NPC(CHARA_ID)

IF CFLAG:RANDOM_CHARA_ID:仲間 == 0
	CFLAG:RANDOM_CHARA_ID:仲間 = CHARA_ID
ENDIF

IF CFLAG:RANDOM_CHARA_ID:支配済 == 0
	IF ABL:CHARA_ID:0 > ABL:RANDOM_CHARA_ID:0
		ABL:RANDOM_CHARA_ID:0 = ABL:CHARA_ID:0
	ENDIF
	IF ABL:CHARA_ID:1 > ABL:RANDOM_CHARA_ID:1
		ABL:RANDOM_CHARA_ID:1 = ABL:CHARA_ID:1
	ENDIF
ELSEIF CFLAG:CHARA_ID:侵食済 == 0 && CFLAG:RANDOM_CHARA_ID:支配済
	CALL PRINT_MESSAGE(CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:CHARA_ID, CALLNAME:RANDOM_CHARA_ID)
	CALL POLLUTED(CHARA_ID)
ENDIF


code:
@NPCEVENTNAME17

RESULTS = 耐性付与

;EVENT可不可チェック
@NPCEVENTABLE17(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用

IF CFLAG:CHARA_ID:異変察知 && CFLAG:CHARA_ID:5 && GETBIT(FLAG:(50 + CFLAG:CHARA_ID:所属), 4)
	FLAG:28 = 1
ENDIF

;イベント実処理
@NPCEVENT17(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT

CFLAG:CHARA_ID:15 = 17

;ログがすごいことになるので基本地の文や口上に対応しない
;初期宿主に会いに来たり特別なものだけ解禁
;CALL PRINT_MESSAGE(CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:CHARA_ID, CALLNAME:(FLAG:5))

;対触手侵食的な補正を入れる
;消毒とか魔術結界とか何かしらの防御措置
FOR LCOUNT, 1, CHARANUM
	IF CFLAG:CHARA_ID:5 == CFLAG:LCOUNT:5
		CFLAG:LCOUNT:耐性 ++
	ENDIF
NEXT


code:
@NPCEVENTNAME18

RESULTS = 拠点戒严状态解除
;TranslatedMark 拠点厳戒態勢解除

;EVENT可不可チェック
@NPCEVENTABLE18(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用

IF CFLAG:CHARA_ID:5 && GETBIT(FLAG:(50 + CFLAG:CHARA_ID:所属), 4) && FLAG:14 > 0
	FLAG:28 = 1
ENDIF

;イベント実処理
@NPCEVENT18(CHARA_ID)
#DIM CHARA_ID

CFLAG:CHARA_ID:15 = 18

IF CHECK_TRUST(CHARA_ID, 0, 105 - FLAG:14)
	SETCOLOR 0xE02020
	CALL PRINT_MESSAGE(CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:CHARA_ID, POSITION_NAME(CFLAG:CHARA_ID:所属))
	RESETCOLOR
	CLEARBIT FLAG:(50 + CFLAG:CHARA_ID:所属), 4
ELSE

ENDIF

path: ERB/イベント/NPCの行動イベント/NPC_EVENT18拠点厳戒態勢解除.ERB


code:
@NPCEVENTNAME19

RESULTS = 异变探索取消
;TranslatedMark 異変探索取りやめ

;EVENT可不可チェック
@NPCEVENTABLE19(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用

IF CFLAG:CHARA_ID:異変察知 && FLAG:14 > 0 && CHARA_ID != FLAG:初期宿主
	FLAG:28 = 1
ENDIF

;イベント実処理
@NPCEVENT19(CHARA_ID)
#DIM LCOUNT
#DIM CHARA_ID
#DIM NOTICE_POINT
#DIM SEARCH_POINT
#DIM SEARCH_TARGET_VALUE

CFLAG:CHARA_ID:15 = 19

;数値リセット
NOTICE_POINT = ABL:CHARA_ID:異變發覺

FOR LCOUNT, 1, CHARANUM
	;侵食されたキャラが友人にいると補正
	IF CFLAG:CHARA_ID:(300+LCOUNT) > 100 && CFLAG:LCOUNT:侵食済
		NOTICE_POINT ++
		;さとり様には速攻でバレる
		IF TALENT:CHARA_ID:覚
			NOTICE_POINT += 100
		ENDIF
	ENDIF
	;支配されたキャラの友人はさらに補正
	IF CFLAG:CHARA_ID:(300+LCOUNT) > 100 && CFLAG:LCOUNT:支配済
		NOTICE_POINT ++
	ENDIF
NEXT

;霊夢は侵食に気づきやすい
IF CALLNAME:(CHARA_ID) == "霊夢" && FLAG:難易度 > 1 && CFLAG:CHARA_ID:侵食済 == 0
	NOTICE_POINT += FLAG:侵食人数 / 3
ENDIF
;ドレミーは夢の異変に気づきやすい
IF CALLNAME:(CHARA_ID) == "ドレミー" && FLAG:難易度 > 1 && CFLAG:CHARA_ID:侵食済 == 0 && ITEM:301
	NOTICE_POINT += FLAG:侵食人数 / 3
ENDIF

;素質補正
IF TALENT:CHARA_ID:好奇心
	NOTICE_POINT += 3
ENDIF
IF TALENT:CHARA_ID:羽
	NOTICE_POINT += TALENT:CHARA_ID:羽
ENDIF

IF ITEM:80
	IF GETBIT(FLAG:(CFLAG:CHARA_ID:所属 + 50), 3)
		NOTICE_POINT += FLAG:支配力 / 3
	ELSE
		NOTICE_POINT -= FLAG:支配力 / 3
	ENDIF
ENDIF

IF CFLAG:CHARA_ID:情報
	NOTICE_POINT -= CFLAG:CHARA_ID:情報 * 3
ENDIF

;拠点が警戒していると補正
IF GETBIT(FLAG:(CFLAG:CHARA_ID:所属 + 50), 4) && GETBIT(FLAG:(CFLAG:CHARA_ID:所属 + 50), 1) == 0
	NOTICE_POINT += 5 + RAND:10
ENDIF

;弱気なほど異変に気づきやすく、強気なほど探索を進めやすい
IF BASE:CHARA_ID:TP < 100
	NOTICE_POINT += RAND:5
ELSEIF BASE:CHARA_ID:TP < 60
	NOTICE_POINT += 2 + RAND:3
ELSEIF BASE:CHARA_ID:TP < 40
	NOTICE_POINT += 4
ENDIF

;難易度補正
IF FLAG:難易度 <= 0
	NOTICE_POINT = NOTICE_POINT * 9 / 10
ENDIF

;異変に気づく判定、失敗しても察知力経験入手
IF FLAG:異変隠蔽力 > NOTICE_POINT
	CFLAG:CHARA_ID:異変察知 = 0
	CALL ADD_TP(CHARA_ID, -10)
	CALL PRINT_MESSAGE(CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:CHARA_ID, POSITION_NAME(CFLAG:CHARA_ID:所属))
ENDIF

path: ERB/イベント/NPCの行動イベント/NPC_EVENT19異変探索取りやめ.ERB


code:
@NPCEVENTNAME1

RESULTS = 休憩

;EVENT可不可チェック
@NPCEVENTABLE1(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用

FLAG:28 = 1

;イベント実処理
@NPCEVENT1(CHARA_ID)
#DIM CHARA_ID

CFLAG:CHARA_ID:15 = 1

;ログがすごいことになるので基本地の文や口上に対応しない
;初期宿主に会いに来たり特別なものだけ解禁
;CALL PRINT_MESSAGE(CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:CHARA_ID, CALLNAME:(FLAG:5))

BASE:CHARA_ID:HP = MIN(MAXBASE:CHARA_ID:HP, BASE:CHARA_ID:HP * 11 / 10)
BASE:CHARA_ID:MP = MIN(MAXBASE:CHARA_ID:MP, BASE:CHARA_ID:MP * 11 / 10)
BASE:CHARA_ID:PP = MIN(MAXBASE:CHARA_ID:PP, BASE:CHARA_ID:PP * 11 / 10)
BASE:CHARA_ID:SP = MIN(MAXBASE:CHARA_ID:SP, BASE:CHARA_ID:SP * 11 / 10)
CALL ADD_TP(CHARA_ID, 0)


code:
@NPCEVENTNAME20

RESULTS = 宴会

;EVENT可不可チェック
@NPCEVENTABLE20(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用

IF CFLAG:CHARA_ID:異変察知 == 0 && FLAG:14 > 0 && RAND:100 == 0
	FLAG:28 = 1
ENDIF

;イベント実処理
@NPCEVENT20(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT

CFLAG:CHARA_ID:15 = 20

;イベント用TEMP
TFLAG:3 = 0

;ログがすごいことになるので基本地の文や口上に対応しない
;初期宿主に会いに来たり特別なものだけ解禁
;CALL PRINT_MESSAGE(CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:CHARA_ID, CALLNAME:(FLAG:5))

IF CHECK_TRUST(CHARA_ID, 0, 105)
	CALL PRINT_MESSAGE(CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:CHARA_ID, POSITION_NAME(CFLAG:CHARA_ID:所属))
	FOR LCOUNT, 1, CHARANUM
		IF CFLAG:CHARA_ID:5 == CFLAG:LCOUNT:5 || CFLAG:CHARA_ID:(300 + LCOUNT) >= 110
			CALL ADD_TP(LCOUNT, 10)
			CFLAG:LCOUNT:(300 + CHARA_ID) += RAND:20 - RAND:20
			CFLAG:CHARA_ID:(300 + LCOUNT) += RAND:20 - RAND:20

			;支配済みだと分岐
			IF CFLAG:LCOUNT:支配理由 == 1 || CFLAG:LCOUNT:支配理由 == 2
				CALL NOTICE_STRANGE(CHARA_ID)
			;他の支配は触手に肩入れして無理やり侵食
			ELSEIF CFLAG:LCOUNT:支配理由
				IF ITEM:9 || ITEM:1 || ITEM:3 || ITEM:7
					TFLAG:3 = LCOUNT
				ENDIF
			ENDIF
		ENDIF
	NEXT
ELSE

ENDIF

IF TFLAG:3
	FOR LCOUNT, 1, CHARANUM
		IF (CFLAG:CHARA_ID:5 == CFLAG:LCOUNT:5 || CFLAG:CHARA_ID:(300 + LCOUNT)) >= 110 && CFLAG:LCOUNT:侵食済 == 0
			CALL AUTO_PARASITE_TENTACLE(LCOUNT)
			IF ITEM:7 && CFLAG:LCOUNT:侵食済
				CALL PRINT_MESSAGE(CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:(TFLAG:3), CALLNAME:LCOUNT, 1)
			ELSEIF ITEM:1 && CFLAG:LCOUNT:侵食済
				CALL PRINT_MESSAGE(CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:(TFLAG:3), CALLNAME:LCOUNT, 2)
			ELSEIF ITEM:3 && CFLAG:LCOUNT:侵食済
				CALL PRINT_MESSAGE(CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:(TFLAG:3), CALLNAME:LCOUNT, 3)
			ENDIF
		ENDIF
	NEXT
ENDIF


code:
@NPCEVENTNAME21

RESULTS = 造反准备
;TranslatedMark 造反準備

;EVENT可不可チェック
@NPCEVENTABLE21(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用

IF CFLAG:CHARA_ID:異変察知 && CFLAG:CHARA_ID:5 && FLAG:全体支配済
	FLAG:28 = 1
ENDIF

;イベント実処理
@NPCEVENT21(CHARA_ID)
#DIM CHARA_ID

CFLAG:CHARA_ID:15 = 21

;ログがすごいことになるので基本地の文や口上に対応しない
;初期宿主に会いに来たり特別なものだけ解禁
;CALL PRINT_MESSAGE(CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:CHARA_ID, CALLNAME:(FLAG:5))

BASE:CHARA_ID:MP = MIN(MAXBASE:CHARA_ID:MP, BASE:CHARA_ID:MP * 11 / 10)
BASE:CHARA_ID:PP = MIN(MAXBASE:CHARA_ID:PP, BASE:CHARA_ID:PP * 11 / 10)
BASE:CHARA_ID:SP = MIN(MAXBASE:CHARA_ID:SP, BASE:CHARA_ID:SP * 11 / 10)

CALL ADD_ABL_EXP(3, CHARA_ID, RAND:200 + 200)
CALL ADD_ABL_EXP(4, CHARA_ID, RAND:200 + 200)
CALL ADD_ABL_EXP(5, CHARA_ID, RAND:200 + 200)

CALL ADD_TP(CHARA_ID, RAND:10)


code:
;わかりにくいが救護されて回復するイベント
@NPCEVENTNAME22

RESULTS = 救护
;TranslatedMark 救護

;EVENT可不可チェック
@NPCEVENTABLE22(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用

IF FLAG:全体支配済
	FLAG:28 = 1
ENDIF

;イベント実処理
@NPCEVENT22(CHARA_ID)
#DIM CHARA_ID

CFLAG:CHARA_ID:15 = 22

;ログがすごいことになるので基本地の文や口上に対応しない
;初期宿主に会いに来たり特別なものだけ解禁
;CALL PRINT_MESSAGE(CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:CHARA_ID, CALLNAME:(FLAG:5))

BASE:CHARA_ID:HP = MIN(MAXBASE:CHARA_ID:HP, BASE:CHARA_ID:HP * 12 / 10)
BASE:CHARA_ID:MP = MIN(MAXBASE:CHARA_ID:MP, BASE:CHARA_ID:MP * 12 / 10)
BASE:CHARA_ID:PP = MIN(MAXBASE:CHARA_ID:PP, BASE:CHARA_ID:PP * 12 / 10)
BASE:CHARA_ID:SP = MIN(MAXBASE:CHARA_ID:SP, BASE:CHARA_ID:SP * 12 / 10)
CALL ADD_TP(CHARA_ID, 5)


code:
@NPCEVENTNAME23

RESULTS = 叛乱分子追加
;TranslatedMark 反乱分子追加

;EVENT可不可チェック
@NPCEVENTABLE23(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用

IF CFLAG:CHARA_ID:異変察知 && CFLAG:CHARA_ID:5 && FLAG:全体支配済 && CFLAG:LCOUNT:傀儡 != 4
	FLAG:28 = 1
ENDIF

;イベント実処理
@NPCEVENT23(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT

CFLAG:CHARA_ID:15 = 23

;ログがすごいことになるので基本地の文や口上に対応しない
;初期宿主に会いに来たり特別なものだけ解禁
;CALL PRINT_MESSAGE(CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:CHARA_ID, CALLNAME:(FLAG:5))

BASE:CHARA_ID:MP = MIN(MAXBASE:CHARA_ID:MP, BASE:CHARA_ID:MP * 11 / 10)
BASE:CHARA_ID:PP = MIN(MAXBASE:CHARA_ID:PP, BASE:CHARA_ID:PP * 11 / 10)
BASE:CHARA_ID:SP = MIN(MAXBASE:CHARA_ID:SP, BASE:CHARA_ID:SP * 11 / 10)

CALL ADD_ABL_EXP(1, CHARA_ID, RAND:200 + 50)
CALL ADD_ABL_EXP(2, CHARA_ID, RAND:200 + 50)

FOR LCOUNT, 1, CHARANUM
	IF CFLAG:CHARA_ID:5 == CFLAG:LCOUNT:5
		CALL ADD_ABL_EXP(1, LCOUNT, RAND:200 + 50)
		CALL ADD_ABL_EXP(2, LCOUNT, RAND:200 + 50)
		CALL ADD_TP(CHARA_ID, 5)
		CFLAG:LCOUNT:異変察知 = 1
		FLAG:反乱度 += 1
		IF CFLAG:LCOUNT:傀儡 == 4 && FLAG:支配力 >= ABL:LCOUNT:戦闘素質
			CALL PRINT_MESSAGE(LCOUNT, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:LCOUNT, CALLNAME:CHARA_ID)
		ENDIF
	ENDIF
NEXT

path: ERB/イベント/NPCの行動イベント/NPC_EVENT23反乱分子追加.ERB


code:
@NPCEVENTNAME2

RESULTS = 外出
;TranslatedMark おでかけ

;EVENT可不可チェック
@NPCEVENTABLE2(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用

IF TALENT:CHARA_ID:138 == 0 && GETBIT(FLAG:(50 + CFLAG:CHARA_ID:所属), 4) == 0 && CFLAG:CHARA_ID:異変察知 == 0
	FLAG:28 = 1
ENDIF

;イベント実処理
@NPCEVENT2(CHARA_ID)
#DIM CHARA_ID

CFLAG:CHARA_ID:15 = 2

;ログがすごいことになるので基本地の文や口上に対応しない
;初期宿主に会いに来たり特別なものだけ解禁
;CALL PRINT_MESSAGE(CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:CHARA_ID, CALLNAME:(FLAG:5))

CALL ADD_ABL_EXP(0, CHARA_ID, RAND:200)
CALL ADD_ABL_EXP(1, CHARA_ID, RAND:200)

CALL ADD_TP(CHARA_ID, RAND:20 - RAND:20)


code:
@NPCEVENTNAME3

RESULTS = 战斗
;TranslatedMark 戦闘

;EVENT可不可チェック
@NPCEVENTABLE3(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用

IF CFLAG:CHARA_ID:異変察知 == 0
	FLAG:28 = 1
ENDIF

;イベント実処理
@NPCEVENT3(CHARA_ID)
#DIM CHARA_ID

CFLAG:CHARA_ID:15 = 3

;ログがすごいことになるので基本地の文や口上に対応しない
;初期宿主に会いに来たり特別なものだけ解禁
;CALL PRINT_MESSAGE(CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:CHARA_ID, CALLNAME:(FLAG:5))

CALL ADD_ABL_EXP(3, CHARA_ID, RAND:200)
CALL ADD_ABL_EXP(5, CHARA_ID, RAND:200)

CALL ADD_TP(CHARA_ID, 20 - RAND:10)


code:
@NPCEVENTNAME4

RESULTS = 与人见面
;TranslatedMark 会いに行く

;EVENT可不可チェック
@NPCEVENTABLE4(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用

IF GETBIT(FLAG:(50 + CFLAG:CHARA_ID:所属), 4) == 0
	FLAG:28 = 1
ENDIF

;イベント実処理
@NPCEVENT4(CHARA_ID)
#DIM CHARA_ID
#DIM RANDOM_CHARA_ID

CFLAG:CHARA_ID:15 = 4

RANDOM_CHARA_ID = RANDOM_GET_CAUGHT_ID_NPC_2(CHARA_ID)

;隠遁持ちは拠点外の相手が選ばれると戻る
IF TALENT:CHARA_ID:隠遁 && CFLAG:CHARA_ID:所属 != CFLAG:RANDOM_CHARA_ID:所属
	RETURN
ENDIF

;ログがすごいことになるので基本地の文や口上に対応しない
;初期宿主に会いに来たり特別なものだけ解禁
IF RANDOM_CHARA_ID == FLAG:初期宿主
	;初期宿主に来た場合会いに行くとほぼ同じ
	CALL PRINT_MESSAGE(CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:CHARA_ID, CALLNAME:(FLAG:5), 0)

	;自動侵食失敗で異変に気づく判定があるため覚以外個別に発見判定はしない
	IF ITEM:9
		CALL AUTO_PARASITE_TENTACLE(CHARA_ID)
	ENDIF

	IF ITEM:148
		PRINTFORML 现在的%CALLNAME:(CHARA_ID)%对%CALLNAME:(FLAG:初期宿主)%的好感度为{CFLAG:CHARA_ID:(300 + FLAG:初期宿主)}
		;TranslatedMark 現在の%CALLNAME:(CHARA_ID)%の%CALLNAME:(FLAG:初期宿主)%に対する好感度は{CFLAG:CHARA_ID:(300 + FLAG:初期宿主)}です
	ENDIF
	IF TALENT:CHARA_ID:覚
		CALL BATTLE(CHARA_ID, 1)
	ELSE
		CALL MEET_NPC(CHARA_ID)
	ENDIF
ELSEIF TALENT:RANDOM_CHARA_ID:犠牲者 == 1
	;なにもできない
ELSEIF TALENT:RANDOM_CHARA_ID:犠牲者 == 2
	IF RAND:100 <= ABL:RANDOM_CHARA_ID:戦闘素質
		CALL CURE_CHARA(RANDOM_CHARA_ID, CHARA_ID)
	ENDIF
ELSEIF CFLAG:RANDOM_CHARA_ID:支配済
	;支配済みに来た場合
	;戦闘敗北かHP0以下支配なら確率で異変に気づかれる
	IF CFLAG:RANDOM_CHARA_ID:支配理由 == 1 || CFLAG:RANDOM_CHARA_ID:支配理由 == 2
		CALL NOTICE_STRANGE(CHARA_ID)
	;他の支配は触手に肩入れして無理やり侵食
	ELSE
		IF ITEM:9
			CALL AUTO_PARASITE_TENTACLE(CHARA_ID)
		ENDIF
		IF CFLAG:CHARA_ID:侵食済 == 1
			IF ITEM:241 && ITEM:7
				PRINTFORML %CALLNAME:(CHARA_ID)%被%CALLNAME:(RANDOM_CHARA_ID)%亲吻了！
				;TranslatedMark %CALLNAME:(CHARA_ID)%は%CALLNAME:(RANDOM_CHARA_ID)%にキスをされた！
				PRINTFORML 在那时候，似乎有什么不该有的东西随着唾液从%CALLNAME:(RANDOM_CHARA_ID)%的嘴里与唾液同时流了出来...
				;TranslatedMark その際%CALLNAME:(RANDOM_CHARA_ID)%の口から唾液とともに流れてはいけないものが流れ込んだようだ……
				PRINTFORMW
			ELSE
				PRINTFORML %CALLNAME:(CHARA_ID)%似乎被%CALLNAME:(RANDOM_CHARA_ID)%侵蚀了...
				;TranslatedMark %CALLNAME:(CHARA_ID)%は%CALLNAME:(RANDOM_CHARA_ID)%から侵食されたようだ……
			ENDIF
			CALL NOTICE_STRANGE(CHARA_ID)
		ELSEIF CFLAG:CHARA_ID:侵食済 == 0

		ENDIF
	ENDIF
ELSEIF CFLAG:RANDOM_CHARA_ID:侵食済
	;侵食済キャラへの接触は女性侵食があると侵食チェック
	IF ITEM:7 && ITEM:9
		CALL AUTO_PARASITE_TENTACLE(CHARA_ID)
		IF ITEM:241 && ITEM:7 && CFLAG:CHARA_ID:侵食済 == 1
			PRINTFORML %CALLNAME:(CHARA_ID)%被%CALLNAME:(RANDOM_CHARA_ID)%亲吻了！
			;TranslatedMark %CALLNAME:(CHARA_ID)%は%CALLNAME:(RANDOM_CHARA_ID)%にキスをされた！
			PRINTFORML 在那时候，似乎有什么不该有的东西随着唾液从%CALLNAME:(RANDOM_CHARA_ID)%的嘴里与唾液同时流了出来...
			;TranslatedMark その際%CALLNAME:(RANDOM_CHARA_ID)%の口から唾液とともに流れてはいけないものが流れ込んだようだ……
			PRINTFORMW
			CALL NOTICE_STRANGE(CHARA_ID)
		ELSEIF CFLAG:CHARA_ID:侵食済 == 1
			PRINTFORML %CALLNAME:(CHARA_ID)%似乎被%CALLNAME:(RANDOM_CHARA_ID)%侵蚀了...
			;TranslatedMark %CALLNAME:(CHARA_ID)%は%CALLNAME:(RANDOM_CHARA_ID)%から侵食されたようだ……
			CALL NOTICE_STRANGE(CHARA_ID)
		ELSEIF CFLAG:CHARA_ID:侵食済 == 0

		ENDIF
	;女性侵食がないなら平和に終わる
	ELSE
		CALL NOTICE_STRANGE(CHARA_ID)
		CALL ADD_ABL_EXP(2, CHARA_ID, RAND:200)
		CALL ADD_ABL_EXP(2, RANDOM_CHARA_ID, RAND:200)

		CFLAG:RANDOM_CHARA_ID:(300 + CHARA_ID) += RAND:10 - RAND:10
		CFLAG:CHARA_ID:(300 + RANDOM_CHARA_ID) += RAND:10 - RAND:10
	ENDIF

ELSEIF CFLAG:RANDOM_CHARA_ID:異変察知 && CFLAG:CHARA_ID:異変察知 == 0
	;片方が異変察知済みだと異変を報告し信じてもらえるか判定
	IF ITEM:43 && ITEM:129
		CALL CALC_ECSTASY(RANDOM_CHARA_ID, 20)
		CALL PRINT_MESSAGE(RANDOM_CHARA_ID, "諜報", 3, CALLNAME:RANDOM_CHARA_ID, CALLNAME:CHARA_ID)
		CALL ECSTASY(CHARA_ID)
	ELSEIF CHECK_TRUST(RANDOM_CHARA_ID, CHARA_ID, 120)
		CFLAG:CHARA_ID:異変察知 = 1
		IF FLAG:支配力 > 30
			CALL PRINT_MESSAGE(CHARA_ID, "諜報", 0, CALLNAME:CHARA_ID, CALLNAME:(FLAG:初期宿主))
		ENDIF
	ELSE
		CALL ADD_ABL_EXP(2, CHARA_ID, RAND:200)
		CALL ADD_ABL_EXP(2, RANDOM_CHARA_ID, RAND:200)
		IF FLAG:支配力 > 30
			CALL PRINT_MESSAGE(CHARA_ID, "諜報", 2, CALLNAME:RANDOM_CHARA_ID, CALLNAME:CHARA_ID)
		ENDIF
	ENDIF

ELSEIF CFLAG:RANDOM_CHARA_ID:異変察知 == 0 && CFLAG:CHARA_ID:異変察知
	;片方が異変察知済みだと異変を報告し信じてもらえるか判定
	IF ITEM:43 && ITEM:129
		CALL CALC_ECSTASY(CHARA_ID, 20)
		CALL PRINT_MESSAGE(CHARA_ID, "諜報", 3, CALLNAME:CHARA_ID, CALLNAME:RANDOM_CHARA_ID)
		CALL ECSTASY(CHARA_ID)
	ELSEIF CHECK_TRUST(CHARA_ID, RANDOM_CHARA_ID, 120)
		CFLAG:RANDOM_CHARA_ID:異変察知 = 1
		IF FLAG:支配力 > 30
			CALL PRINT_MESSAGE(CHARA_ID, "諜報", 0, CALLNAME:RANDOM_CHARA_ID, CALLNAME:(FLAG:初期宿主))
		ENDIF
	ELSE
		CALL ADD_ABL_EXP(2, CHARA_ID, RAND:200)
		CALL ADD_ABL_EXP(2, RANDOM_CHARA_ID, RAND:200)
		IF FLAG:支配力 > 30
			CALL PRINT_MESSAGE(CHARA_ID, "諜報", 2, CALLNAME:CHARA_ID, CALLNAME:RANDOM_CHARA_ID)
		ENDIF
	ENDIF
ELSE
	;その他は話術と好感度が多少上下
	CALL ADD_ABL_EXP(2, CHARA_ID, RAND:200)
	CALL ADD_ABL_EXP(2, RANDOM_CHARA_ID, RAND:200)

	CFLAG:RANDOM_CHARA_ID:(300 + CHARA_ID) += RAND:10 - RAND:10
	CFLAG:CHARA_ID:(300 + RANDOM_CHARA_ID) += RAND:10 - RAND:10
ENDIF


code:
@NPCEVENTNAME5

RESULTS = 受伤
;TranslatedMark 負傷

;EVENT可不可チェック
@NPCEVENTABLE5(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用

IF TALENT:CHARA_ID:138 == 0 && GETBIT(FLAG:(50 + CFLAG:CHARA_ID:所属), 4) == 0 && CFLAG:CHARA_ID:異変察知 == 0
	FLAG:28 = 1
ENDIF

;イベント実処理
@NPCEVENT5(CHARA_ID)
#DIM CHARA_ID

CFLAG:CHARA_ID:15 = 5

;ログがすごいことになるので基本地の文や口上に対応しない
;初期宿主に会いに来たり特別なものだけ解禁
;CALL PRINT_MESSAGE(CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:CHARA_ID, CALLNAME:(FLAG:5))

BASE:CHARA_ID:HP = MIN(MAXBASE:CHARA_ID:HP, BASE:CHARA_ID:HP * 9 / 10)
BASE:CHARA_ID:MP = MIN(MAXBASE:CHARA_ID:MP, BASE:CHARA_ID:MP * 9 / 10)
BASE:CHARA_ID:PP = MIN(MAXBASE:CHARA_ID:PP, BASE:CHARA_ID:PP * 9 / 10)

CALL ADD_TP(CHARA_ID, -10)


code:
@NPCEVENTNAME6

RESULTS = 拠点戒严状态
;TranslatedMark 拠点厳戒態勢

;EVENT可不可チェック
@NPCEVENTABLE6(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用

IF CFLAG:CHARA_ID:異変察知 && CFLAG:CHARA_ID:5 && GETBIT(FLAG:(50 + CFLAG:CHARA_ID:所属), 4) == 0
	FLAG:28 = 1
ENDIF

;イベント実処理
@NPCEVENT6(CHARA_ID)
#DIM CHARA_ID

CFLAG:CHARA_ID:15 = 6

IF CHECK_TRUST(CHARA_ID, 0, 105 + FLAG:14)
	SETCOLOR 0xE02020
	CALL PRINT_MESSAGE(CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:CHARA_ID, POSITION_NAME(CFLAG:CHARA_ID:所属))
	RESETCOLOR
	SETBIT FLAG:(50 + CFLAG:CHARA_ID:所属), 4
	CALL ADD_TP(CHARA_ID, 10)
ELSE

ENDIF

path: ERB/イベント/NPCの行動イベント/NPC_EVENT6拠点厳戒態勢.ERB


code:
@NPCEVENTNAME7

RESULTS = 作战会议
;TranslatedMark 作戦会議

;EVENT可不可チェック
@NPCEVENTABLE7(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用

IF CFLAG:CHARA_ID:異変察知 && CFLAG:CHARA_ID:5 && GETBIT(FLAG:(50 + CFLAG:CHARA_ID:所属), 4)
	FLAG:28 = 1
ENDIF

;イベント実処理
@NPCEVENT7(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT

CFLAG:CHARA_ID:15 = 7

IF POSITION_POLLUTED_CHECK(CHARA_ID) > 0
	SETCOLOR 0xE02020
	CALL PRINT_MESSAGE(CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:CHARA_ID, POSITION_NAME(CFLAG:CHARA_ID:所属))
	RESETCOLOR
	CALL POLLUTED(CHARA_ID)
ELSEIF CHECK_TRUST(CHARA_ID, 0, 105)
	FOR LCOUNT, 1, CHARANUM
		IF CFLAG:CHARA_ID:所属 == CFLAG:LCOUNT:所属
			CALL ADD_ABL_EXP(0, CHARA_ID, RAND:200)
			CALL ADD_ABL_EXP(1, CHARA_ID, RAND:200)
			CALL ADD_ABL_EXP(2, CHARA_ID, RAND:200)
			CALL ADD_ABL_EXP(4, CHARA_ID, RAND:200)
			CALL ADD_ABL_EXP(5, CHARA_ID, RAND:200)
			CALL ADD_TP(CHARA_ID, RAND:15)
		ENDIF
	NEXT

ELSE

ENDIF


code:
@NPCEVENTNAME8

RESULTS = 治疗
;TranslatedMark 治療

;EVENT可不可チェック
@NPCEVENTABLE8(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用

IF (GETBIT(FLAG:(50 + CFLAG:CHARA_ID:所属), 4) || CFLAG:CHARA_ID:異変察知) && CALLNAME:(CHARA_ID) == "永琳"
	FLAG:28 = 1
ENDIF

;イベント実処理
@NPCEVENT8(CHARA_ID)
#DIM CHARA_ID
#DIM RANDOM_CHARA_ID

CFLAG:CHARA_ID:15 = 8

RANDOM_CHARA_ID = RANDOM_GET_CAUGHT_ID(CHARA_ID)

;ログがすごいことになるので基本地の文や口上に対応しない
;初期宿主に会いに来たり特別なものだけ解禁
IF RANDOM_CHARA_ID == FLAG:初期宿主
	;初期宿主に来た場合会いに行くとほぼ同じ
	CALL PRINT_MESSAGE(CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:CHARA_ID, CALLNAME:(FLAG:5), 0)

	;自動侵食失敗で異変に気づく判定があるため覚以外個別に発見判定はしない
	IF ITEM:9
		CALL AUTO_PARASITE_TENTACLE(CHARA_ID)
	ENDIF
	IF ITEM:148
		PRINTFORML 现在的%CALLNAME:(CHARA_ID)%对%CALLNAME:(FLAG:初期宿主)%的好感度为{CFLAG:CHARA_ID:(300 + FLAG:初期宿主)}
		;TranslatedMark 現在の%CALLNAME:(CHARA_ID)%の%CALLNAME:(FLAG:初期宿主)%に対する好感度は{CFLAG:CHARA_ID:(300 + FLAG:初期宿主)}です
	ENDIF

		$INPUT_LOOP
		PRINTFORML 要做些什么呢？
		;TranslatedMark どうしますか？
		PRINTFORML [ 1] 闲聊
		;TranslatedMark [ 1] 雑談を行う
		PRINTFORML [ 2] 亲密行为
		;TranslatedMark [ 2] いちゃいちゃする
		PRINTFORML [ 3] 袭击　触手战斗力　{FLAG:戦闘力}　　%CALLNAME:(CHARA_ID)%战斗力　{ABL:(CHARA_ID):戦闘素質}
		;TranslatedMark [ 3] 襲撃する　触手戦闘力　{FLAG:戦闘力}　　%CALLNAME:(CHARA_ID)%戦闘力　{ABL:(CHARA_ID):戦闘素質}
		PRINTFORML [ 4] 秘密侵蚀
		;TranslatedMark [ 4] こっそり侵食する
		PRINTFORML
		PRINTFORML [ 0] 什么也不做
		;TranslatedMark [ 0] 何もせず別れる
		PRINTFORML

		;催眠かけたり膨乳させたりエロコマンド増やしたい

		INPUT

		IF RESULT == 1
			IF CFLAG:CHARA_ID:異変察知
				PRINTFORML %CALLNAME:(CHARA_ID)%似乎注意到了身边发生的异变，并开始寻找其元凶
				;TranslatedMark %CALLNAME:(CHARA_ID)%は異変に気づき元凶を探しているらしい
			ELSEIF CFLAG:CHARA_ID:侵食済
				PRINTFORML 虽说%CALLNAME:(CHARA_ID)%感觉有些不太舒服，但她还是没有注意到身边的什么异常情况
				;TranslatedMark %CALLNAME:(CHARA_ID)%は異変に気づいておらず体調がおかしいらしい
				PRINTFORML 看样子%CALLNAME:(CHARA_ID)%已经被侵蚀了
				;TranslatedMark どうやら%CALLNAME:(CHARA_ID)%は侵食されているようだ
			ELSE

			ENDIF
			IF CHECK_TRUST(FLAG:初期宿主, CHARA_ID, 100 + CFLAG:CHARA_ID:情報 * 10)
				CFLAG:CHARA_ID:情報 ++
				CALL ADD_ABL_EXP(2, CHARA_ID, RAND:200)
				PRINTFORML %CALLNAME:(CHARA_ID)%在打听过与自己有关的情报后就和对方分手了
				;TranslatedMark %CALLNAME:(CHARA_ID)%自身の情報を色々と聞いて別れた
				PRINTFORML %CALLNAME:(CHARA_ID)%的異変察知力与侵蚀耐性下降了
				;TranslatedMark %CALLNAME:(CHARA_ID)%の異変察知力と侵食耐性が下がった
				PRINTFORMW
			ELSE
				CALL ADD_ABL_EXP(2, CHARA_ID, RAND:100 + 100)
				PRINTFORML 与%CALLNAME:(CHARA_ID)%漫无目的地聊了一段时间，然后就分手了
				;TranslatedMark %CALLNAME:(CHARA_ID)%ととりとめのない話をして別れた
				PRINTFORMW
			ENDIF
		ELSEIF RESULT == 2
			CALL LEZBIAN_PLAY(FLAG:初期宿主, CHARA_ID)
		ELSEIF RESULT == 3
			CALL BATTLE(CHARA_ID, 0)
		ELSEIF RESULT == 4
			CALL AUTO_PARASITE_TENTACLE(CHARA_ID)
			IF CFLAG:CHARA_ID:侵食済 == 1
				PRINTFORML 看来对%CALLNAME:(CHARA_ID)%的侵蚀已经成功了！
				;TranslatedMark %CALLNAME:(CHARA_ID)%への侵食に成功したようだ！
				PRINTFORMW
			ELSEIF CFLAG:CHARA_ID:侵食済 == 0
				PRINTFORML 看来对%CALLNAME:(CHARA_ID)%的侵蚀失败了...
				;TranslatedMark %CALLNAME:(CHARA_ID)%への侵食に失敗したようだ…
				PRINTFORMW
			ENDIF
		ELSEIF RESULT == 0

		ENDIF
ELSEIF CFLAG:RANDOM_CHARA_ID:侵食済
	IF CFLAG:RANDOM_CHARA_ID:傀儡
		PRINTFORML %CALLNAME:(CHARA_ID)%似乎在尝试治愈%CALLNAME:(RANDOM_CHARA_ID)%，但最后还是失败了...
		;TranslatedMark %CALLNAME:(CHARA_ID)%が%CALLNAME:(RANDOM_CHARA_ID)%を治療しようとして失敗したようだ……
		PRINTFORML 显然，对方已经受到了强烈的精神污染，需要长期治疗才行...
		;TranslatedMark どうやら精神的にも汚染されていて長期治療が必要らしい……
		PRINTFORMW
	ELSE
		CFLAG:RANDOM_CHARA_ID:侵食済 = 0
		FLAG:侵食人数 += -1
		IF CFLAG:RANDOM_CHARA_ID:支配済
			CFLAG:RANDOM_CHARA_ID:支配済 = 0
			FLAG:支配人数 += -1
		ENDIF
		CFLAG:RANDOM_CHARA_ID:20 = RAND:5 + 2
		PRINTFORML 看来%CALLNAME:(CHARA_ID)%已经成功治愈了%CALLNAME:(RANDOM_CHARA_ID)%...
		;TranslatedMark %CALLNAME:(CHARA_ID)%が%CALLNAME:(RANDOM_CHARA_ID)%を治療したようだ……
		PRINTFORMW
	ENDIF
ELSEIF CFLAG:RANDOM_CHARA_ID:異変察知 && CFLAG:CHARA_ID:異変察知 == 0
	;片方が異変察知済みだと異変を報告し信じてもらえるか判定
	IF CHECK_TRUST(RANDOM_CHARA_ID, CHARA_ID, 120)
		CFLAG:CHARA_ID:異変察知 = 1
		IF FLAG:支配力 > 30
			CALL PRINT_MESSAGE(CHARA_ID, "諜報", 0, CALLNAME:CHARA_ID, CALLNAME:(FLAG:初期宿主))
		ENDIF
	ELSE
		CALL ADD_ABL_EXP(2, CHARA_ID, RAND:200)
		CALL ADD_ABL_EXP(2, RANDOM_CHARA_ID, RAND:200)
		IF FLAG:支配力 > 30
			CALL PRINT_MESSAGE(CHARA_ID, "諜報", 2, CALLNAME:RANDOM_CHARA_ID, CALLNAME:CHARA_ID)
		ENDIF
	ENDIF

ELSEIF CFLAG:RANDOM_CHARA_ID:異変察知 == 0 && CFLAG:CHARA_ID:異変察知
	;片方が異変察知済みだと異変を報告し信じてもらえるか判定
	IF CHECK_TRUST(CHARA_ID, RANDOM_CHARA_ID, 120)
		CFLAG:RANDOM_CHARA_ID:異変察知 = 1
		IF FLAG:支配力 > 30
			CALL PRINT_MESSAGE(CHARA_ID, "諜報", 0, CALLNAME:RANDOM_CHARA_ID, CALLNAME:(FLAG:初期宿主))
		ENDIF
	ELSE
		CALL ADD_ABL_EXP(2, CHARA_ID, RAND:200)
		CALL ADD_ABL_EXP(2, RANDOM_CHARA_ID, RAND:200)
		IF FLAG:支配力 > 30
			CALL PRINT_MESSAGE(CHARA_ID, "諜報", 2, CALLNAME:CHARA_ID, CALLNAME:RANDOM_CHARA_ID)
		ENDIF
	ENDIF
ELSE
	;その他は話術と好感度が多少上下
	CALL ADD_ABL_EXP(2, CHARA_ID, RAND:200)
	CALL ADD_ABL_EXP(2, RANDOM_CHARA_ID, RAND:200)

	CFLAG:RANDOM_CHARA_ID:(300 + CHARA_ID) += RAND:10 - RAND:10
	CFLAG:CHARA_ID:(300 + RANDOM_CHARA_ID) += RAND:10 - RAND:10
ENDIF


code:
@NPCEVENTNAME9

RESULTS = 突击检查
;TranslatedMark 抜き打ち検査

;EVENT可不可チェック
@NPCEVENTABLE9(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用

;異変察知済みで所属済みで拠点にキャラが二人以上
IF CFLAG:CHARA_ID:異変察知 && CFLAG:CHARA_ID:所属 && RANDOM_GET_CAUGHT_POSITION(CHARA_ID) > 0
	FLAG:28 = 1
ENDIF

;イベント実処理
@NPCEVENT9(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT
#DIM RANDOM_CHARA_ID

CFLAG:CHARA_ID:15 = 9

IF POSITION_POLLUTED_CHECK(CHARA_ID) > 0
	SETCOLOR 0xE02020
	CALL PRINT_MESSAGE(CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:CHARA_ID, POSITION_NAME(CFLAG:CHARA_ID:所属))
	RESETCOLOR
	CALL POLLUTED(CHARA_ID)
ELSEIF CHECK_TRUST(CHARA_ID, 0, 110)
	RANDOM_CHARA_ID = RANDOM_GET_CAUGHT_POSITION(CHARA_ID)
	CALL PRINT_MESSAGE(RANDOM_CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:RANDOM_CHARA_ID, POSITION_NAME(CFLAG:CHARA_ID:所属), 1)
	IF CFLAG:RANDOM_CHARA_ID:侵食済
		CALL PRINT_MESSAGE(RANDOM_CHARA_ID, "NPCイベント", CFLAG:CHARA_ID:15, CALLNAME:RANDOM_CHARA_ID, POSITION_NAME(CFLAG:CHARA_ID:所属), 2)
		CFLAG:RANDOM_CHARA_ID:所属 = 0
		SETBIT FLAG:(50 + CFLAG:CHARA_ID:所属), 4
	ENDIF
ELSE

ENDIF

path: ERB/イベント/NPCの行動イベント/NPC_EVENT9抜き打ち検査.ERB


code:
@EVENTNAME0

RESULTS = 违和感
;TranslatedMark 違和感

;EVENT可不可チェック
@EVENTABLE0(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用

FLAG:21 = 1

;イベント実処理
@EVENT0(CHARA_ID)
#DIM CHARA_ID

TFLAG:番号 = 0
TFLAG:部位 = RAND:16 + RAND:17

CALL CALC_ECSTASY(CHARA_ID, 20)
CALL PRINT_MESSAGE(CHARA_ID, "侵食イベント", TFLAG:番号, CALLNAME:CHARA_ID, CALLNAME:(FLAG:5))
CALL ECSTASY(CHARA_ID)

CALL POLLUTED_POSITION_INDEX(CHARA_ID, 0)


code:
@EVENTNAME101

RESULTS = A敏感化

@EVENTABLE101(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用
IF ITEM:101 && TALENT:CHARA_ID:101 < 3
	FLAG:21 = 1
ENDIF

@EVENT101(CHARA_ID)
#DIM CHARA_ID

TFLAG:番号 = 101
TFLAG:部位 = 1
IF ITEM:63
	CALL CALC_ECSTASY(CHARA_ID, 100)
ELSE
	CALL CALC_ECSTASY(CHARA_ID, 20)
ENDIF
CALL PRINT_MESSAGE(CHARA_ID, "侵食イベント", TFLAG:番号, CALLNAME:CHARA_ID, CALLNAME:(FLAG:初期宿主))
CALL ECSTASY(CHARA_ID)

CALL ADD_ABL_EXP(6, CHARA_ID, 150 + RAND:600)

IF TALENT:CHARA_ID:101 < 3
	TALENT:CHARA_ID:101 ++
	IF TALENT:CHARA_ID:101 == 0
		PRINTFORML %CALLNAME:CHARA_ID%のA感度が普通になった！
	ELSEIF TALENT:CHARA_ID:101 == 1
		PRINTFORML %CALLNAME:CHARA_ID%のA感度が敏感になった！
	ELSEIF TALENT:CHARA_ID:101 == 2
		PRINTFORML %CALLNAME:CHARA_ID%のA感度が過敏になった！
	ELSEIF TALENT:CHARA_ID:101 == 3
		PRINTFORML %CALLNAME:CHARA_ID%のA感度が異常過敏になった！
	ENDIF
ENDIF

CALL POLLUTED_POSITION_INDEX(CHARA_ID, 0)


code:
@EVENTNAME102

RESULTS = B敏感化

@EVENTABLE102(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用
IF ITEM:102 && TALENT:CHARA_ID:102 < 3
	FLAG:21 = 1
ENDIF

@EVENT102(CHARA_ID)
#DIM CHARA_ID

TFLAG:番号 = 102
TFLAG:部位 = 2
CALL CALC_ECSTASY(CHARA_ID, 20)
CALL PRINT_MESSAGE(CHARA_ID, "侵食イベント", TFLAG:番号, CALLNAME:CHARA_ID, CALLNAME:(FLAG:初期宿主))
CALL ECSTASY(CHARA_ID)

CALL ADD_ABL_EXP(7, CHARA_ID, 150 + RAND:600)

IF TALENT:CHARA_ID:102 < 3
	TALENT:CHARA_ID:102 ++
	IF TALENT:CHARA_ID:102 == 0
		PRINTFORML %CALLNAME:CHARA_ID%のB感度が普通になった！
	ELSEIF TALENT:CHARA_ID:102 == 1
		PRINTFORML %CALLNAME:CHARA_ID%のB感度が敏感になった！
	ELSEIF TALENT:CHARA_ID:102 == 2
		PRINTFORML %CALLNAME:CHARA_ID%のB感度が過敏になった！
	ELSEIF TALENT:CHARA_ID:102 == 3
		PRINTFORML %CALLNAME:CHARA_ID%のB感度が異常過敏になった！
	ENDIF
ENDIF

CALL POLLUTED_POSITION_INDEX(CHARA_ID, 0)


code:
@EVENTNAME103

RESULTS = C敏感化

@EVENTABLE103(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用
IF ITEM:103 && TALENT:CHARA_ID:103 < 3
	FLAG:21 = 1
ENDIF

@EVENT103(CHARA_ID)
#DIM CHARA_ID

TFLAG:番号 = 103
TFLAG:部位 = 4

CALL CALC_ECSTASY(CHARA_ID, 20)
CALL PRINT_MESSAGE(CHARA_ID, "侵食イベント", TFLAG:番号, CALLNAME:CHARA_ID, CALLNAME:(FLAG:初期宿主))
CALL ECSTASY(CHARA_ID)

CALL ADD_ABL_EXP(8, CHARA_ID, 150 + RAND:600)

IF TALENT:CHARA_ID:103 < 3
	TALENT:CHARA_ID:103 ++
	IF TALENT:CHARA_ID:103 == 0
		PRINTFORML %CALLNAME:CHARA_ID%のC感度が普通になった！
	ELSEIF TALENT:CHARA_ID:103 == 1
		PRINTFORML %CALLNAME:CHARA_ID%のC感度が敏感になった！
	ELSEIF TALENT:CHARA_ID:103 == 2
		PRINTFORML %CALLNAME:CHARA_ID%のC感度が過敏になった！
	ELSEIF TALENT:CHARA_ID:103 == 3
		PRINTFORML %CALLNAME:CHARA_ID%のC感度が異常過敏になった！
	ENDIF
ENDIF

CALL POLLUTED_POSITION_INDEX(CHARA_ID, 0)


code:
@EVENTNAME104

RESULTS = V敏感化

@EVENTABLE104(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用
IF ITEM:104 && TALENT:CHARA_ID:104 < 3
	FLAG:21 = 1
ENDIF

@EVENT104(CHARA_ID)
#DIM CHARA_ID

TFLAG:番号 = 104
TFLAG:部位 = 8

CALL CALC_ECSTASY(CHARA_ID, 20)
CALL PRINT_MESSAGE(CHARA_ID, "侵食イベント", TFLAG:番号, CALLNAME:CHARA_ID, CALLNAME:(FLAG:初期宿主))
CALL ECSTASY(CHARA_ID)

CALL ADD_ABL_EXP(9, CHARA_ID, 150 + RAND:600)

IF TALENT:CHARA_ID:104 < 3
	TALENT:CHARA_ID:104 ++
	IF TALENT:CHARA_ID:104 == 0
		PRINTFORML %CALLNAME:CHARA_ID%のV感度が普通になった！
	ELSEIF TALENT:CHARA_ID:104 == 1
		PRINTFORML %CALLNAME:CHARA_ID%のV感度が敏感になった！
	ELSEIF TALENT:CHARA_ID:104 == 2
		PRINTFORML %CALLNAME:CHARA_ID%のV感度が過敏になった！
	ELSEIF TALENT:CHARA_ID:104 == 3
		PRINTFORML %CALLNAME:CHARA_ID%のV感度が異常過敏になった！
	ENDIF
ENDIF

CALL GET_PARASITE(CHARA_ID)

CALL POLLUTED_POSITION_INDEX(CHARA_ID, 0)


code:
@EVENTNAME105

RESULTS = M敏感化

@EVENTABLE105(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用
IF ITEM:105 && TALENT:CHARA_ID:105 < 3
	FLAG:21 = 1
ENDIF

@EVENT105(CHARA_ID)
#DIM CHARA_ID

TFLAG:番号 = 105
TFLAG:部位 = 16

CALL CALC_ECSTASY(CHARA_ID, 20)
CALL PRINT_MESSAGE(CHARA_ID, "侵食イベント", TFLAG:番号, CALLNAME:CHARA_ID, CALLNAME:(FLAG:初期宿主))
CALL ECSTASY(CHARA_ID)

CALL ADD_ABL_EXP(10, CHARA_ID, 150 + RAND:600)

IF TALENT:CHARA_ID:105 < 3
	TALENT:CHARA_ID:105 ++
	IF TALENT:CHARA_ID:105 == 0
		PRINTFORML %CALLNAME:CHARA_ID%のM感度が普通になった！
	ELSEIF TALENT:CHARA_ID:105 == 1
		PRINTFORML %CALLNAME:CHARA_ID%のM感度が敏感になった！
	ELSEIF TALENT:CHARA_ID:105 == 2
		PRINTFORML %CALLNAME:CHARA_ID%のM感度が過敏になった！
	ELSEIF TALENT:CHARA_ID:105 == 3
		PRINTFORML %CALLNAME:CHARA_ID%のM感度が異常過敏になった！
	ENDIF
ENDIF

CALL POLLUTED_POSITION_INDEX(CHARA_ID, 0)


code:
@EVENTNAME10

RESULTS = 老人集团逆奸
;TranslatedMark おっさん集団逆レイプ

@EVENTABLE10(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用

IF ITEM:81 && ITEM:130 && CFLAG:CHARA_ID:支配済
	FLAG:21 = 1
ENDIF

@EVENT10(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT
#DIM MEMBER,200
#DIM MEMBER_NUM
#DIM RAPE_POWER

TFLAG:番号 = 10
SETBIT TFLAG:21, 7

CALL PRINT_MESSAGE(CHARA_ID, "侵食イベント", TFLAG:番号, CALLNAME:CHARA_ID, CALLNAME:(FLAG:初期宿主))

;部位いくつかからランダムにしたいけどとりあえずVレイプ
TFLAG:部位 = 8

VARSET MEMBER
VARSET MEMBER_NUM

;CHARA_IDに親しいキャラから優先して
SETCOLOR 0x10EEEE
FOR LCOUNT , 1, CHARANUM
	IF CHARA_ID == LCOUNT

	ELSEIF CFLAG:CHARA_ID:所属 == CFLAG:LCOUNT:所属 && CFLAG:LCOUNT:支配済 && GET_PENIS(LCOUNT)
		PRINTFORM %CALLNAME:LCOUNT%、
		MEMBER:MEMBER_NUM = LCOUNT
		MEMBER_NUM += 1
	ELSEIF CFLAG:CHARA_ID:(300+LCOUNT) > 100 && CFLAG:LCOUNT:支配済 && GET_PENIS(LCOUNT)
		PRINTFORM %CALLNAME:LCOUNT%、
		MEMBER:MEMBER_NUM = LCOUNT
		MEMBER_NUM += 1
	ENDIF
NEXT

CALL RANDOM_OSSAN_TYPE
CALL PRINT_MESSAGE(CHARA_ID, "侵食イベント", TFLAG:番号, CALLNAME:CHARA_ID, CALLNAME:CHARA_ID, 1)

FOR LCOUNT , 1, CHARANUM
	IF CHARA_ID == LCOUNT
		TFLAG:部位 = 4
		CALL CALC_ECSTASY(LCOUNT, 20)
		CALL ECSTASY(LCOUNT)
		CALL ADD_ABL_EXP(15, CHARA_ID, RAND:10)
		CALL GET_PREGNANCY(LCOUNT, "おっさん")
	ELSEIF CFLAG:CHARA_ID:所属 == CFLAG:LCOUNT:所属 && CFLAG:LCOUNT:支配済
		TFLAG:部位 = 4
		CALL CALC_ECSTASY(LCOUNT, 20)
		CALL ECSTASY(LCOUNT)
		CALL ADD_ABL_EXP(15, CHARA_ID, RAND:10)
		CALL GET_PREGNANCY(LCOUNT, "おっさん")
	ELSEIF CFLAG:CHARA_ID:(300+LCOUNT) > 100 && CFLAG:LCOUNT:支配済
		TFLAG:部位 = 4
		CALL CALC_ECSTASY(LCOUNT, 20)
		CALL ECSTASY(LCOUNT)
		CALL ADD_ABL_EXP(15, CHARA_ID, RAND:10)
		CALL GET_PREGNANCY(LCOUNT, "おっさん")
	ENDIF
NEXT

CALL POLLUTED_POSITION_INDEX(CHARA_ID, 8)

path: ERB/イベント/個別侵食イベント/EVENT10_おっさん集団逆レイプ.ERB


code:
@EVENTNAME110

RESULTS = 来自正太的过度恶作剧
;TranslatedMark ショタへ過度ないたずら

@EVENTABLE110(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用
IF ITEM:131
	FLAG:21 = 1
ENDIF

@EVENT110(CHARA_ID)
#DIM CHARA_ID

TFLAG:番号 = 110
TFLAG:部位 = RAND:16 + RAND:17
SETBIT TFLAG:21, 7
CALL RANDOM_SHOTA_TYPE
CALL RANDOM_SHOTA_PLAY_2_TYPE

CALL CALC_ECSTASY(CHARA_ID, 30)
CALL PRINT_MESSAGE(CHARA_ID, "侵食イベント", TFLAG:番号, CALLNAME:CHARA_ID, CALLNAME:(FLAG:初期宿主))
CALL ECSTASY(CHARA_ID)

CALL MENTAL_DEVELOP(CHARA_ID, 25)

CALL ADD_ABL_EXP(15, CHARA_ID, 5 + RAND:10)

IF ITEM:18
	CALL GET_PREGNANCY(CHARA_ID)
ELSE
	CALL GET_PREGNANCY(CHARA_ID, "ショタ")
ENDIF

CALL POLLUTED_POSITION_INDEX(CHARA_ID, 7)

path: ERB/イベント/個別侵食イベント/EVENT110_ショタへ過度ないたずら.ERB


code:
@EVENTNAME111

RESULTS = 来自正太的集体恶作剧
;TranslatedMark ショタへ集団いたずら

@EVENTABLE111(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用
IF ITEM:131 && ITEM:81
	FLAG:21 = 1
ENDIF

@EVENT111(CHARA_ID)
#DIM CHARA_ID

TFLAG:番号 = 111
TFLAG:部位 = 30
SETBIT TFLAG:21, 7
CALL RANDOM_SHOTA_TYPE
CALL RANDOM_SHOTA_PLAY_2_TYPE

CALL CALC_ECSTASY(CHARA_ID, 30)
CALL PRINT_MESSAGE(CHARA_ID, "侵食イベント", TFLAG:番号, CALLNAME:CHARA_ID, CALLNAME:(FLAG:初期宿主))
CALL ECSTASY(CHARA_ID)

CALL MENTAL_DEVELOP(CHARA_ID, 25)

CALL ADD_ABL_EXP(15, CHARA_ID, 5 + RAND:10)

IF ITEM:18
	CALL GET_PREGNANCY(CHARA_ID)
ELSE
	CALL GET_PREGNANCY(CHARA_ID, "ショタ")
ENDIF

;2人巻き込む
CALL RANDOM_GET_CAUGHT(CHARA_ID, 2)

;巻き込まれたキャラへの追加イベント
@EVENT111_EX(RANDOM_CHARA_ID, CHARA_ID)
#DIM CHARA_ID
#DIM RANDOM_CHARA_ID
CALL RANDOM_SHOTA_PLAY_2_TYPE

CALL CALC_ECSTASY(RANDOM_CHARA_ID, 40)
CALL PRINT_MESSAGE(RANDOM_CHARA_ID, "侵食イベント", TFLAG:番号, CALLNAME:RANDOM_CHARA_ID, CALLNAME:CHARA_ID, 1)
CALL MENTAL_DEVELOP(RANDOM_CHARA_ID, 25)

CALL ECSTASY(RANDOM_CHARA_ID)

CALL ADD_ABL_EXP(1, RANDOM_CHARA_ID, 200 + RAND:200)
CALL ADD_ABL_EXP(4, RANDOM_CHARA_ID, 200 + RAND:200)
CALL ADD_ABL_EXP(15, CHARA_ID, 5 + RAND:10)

IF CFLAG:RANDOM_CHARA_ID:侵食済 == 0 && EX_POLLUTED(RANDOM_CHARA_ID)
	CALL POLLUTED(RANDOM_CHARA_ID)
ENDIF
IF ITEM:18
	CALL GET_PREGNANCY(CHARA_ID)
ELSE
	CALL GET_PREGNANCY(CHARA_ID, "ショタ")
ENDIF

CALL POLLUTED_POSITION_INDEX(CHARA_ID, 7)

path: ERB/イベント/個別侵食イベント/EVENT111_ショタへ集団いたずら.ERB


code:
@EVENTNAME123

RESULTS = 自慰

@EVENTABLE123(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用
IF ITEM:123
	FLAG:21 = 1
ENDIF

@EVENT123(CHARA_ID)
#DIM CHARA_ID

TFLAG:番号 = 123
TFLAG:部位 = CFLAG:CHARA_ID:9

CALL CALC_ECSTASY(CHARA_ID, 35)
CALL PRINT_MESSAGE(CHARA_ID, "侵食イベント", TFLAG:番号, CALLNAME:CHARA_ID, CALLNAME:(FLAG:初期宿主))
CALL ECSTASY(CHARA_ID)

CALL ADD_ABL_EXP(11, CHARA_ID, 15 + RAND:60)

CFLAG:CHARA_ID:強制自慰 = RAND:5 + 1


code:
@EVENTNAME125

RESULTS = 自慰节日
;TranslatedMark 自慰祭り

@EVENTABLE125(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用

IF ITEM:125
	FLAG:21 = 1
ENDIF

@EVENT125(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT

TFLAG:番号 = 125
TFLAG:部位 = CFLAG:CHARA_ID:9

CALL CALC_ECSTASY(CHARA_ID, 35)
CALL PRINT_MESSAGE(CHARA_ID, "侵食イベント", TFLAG:番号, CALLNAME:CHARA_ID, CALLNAME:(FLAG:初期宿主))
CALL ECSTASY(CHARA_ID)

CALL ADD_ABL_EXP(11, CHARA_ID, 15 + RAND:60)

CFLAG:CHARA_ID:強制自慰 = RAND:3 + 1

;三人巻き込む
CALL RANDOM_GET_CAUGHT(CHARA_ID, 4)

;巻き込まれたキャラへの追加イベント
@EVENT125_EX(RANDOM_CHARA_ID, CHARA_ID)
#DIM CHARA_ID
#DIM RANDOM_CHARA_ID

CALL CALC_ECSTASY(CHARA_ID, 35)
CALL PRINT_MESSAGE(RANDOM_CHARA_ID, "侵食イベント", TFLAG:番号, CALLNAME:RANDOM_CHARA_ID, CALLNAME:CHARA_ID, 1)
CALL ECSTASY(RANDOM_CHARA_ID)

CALL ADD_ABL_EXP(1, RANDOM_CHARA_ID, 200 + RAND:200)
CALL ADD_ABL_EXP(4, RANDOM_CHARA_ID, 200 + RAND:200)
CALL ADD_ABL_EXP(11, RANDOM_CHARA_ID, 15 + RAND:60)

CFLAG:RANDOM_CHARA_ID:強制自慰 = RAND:3 + 1
IF CFLAG:RANDOM_CHARA_ID:侵食済 == 0 && EX_POLLUTED(RANDOM_CHARA_ID)
	CALL POLLUTED(RANDOM_CHARA_ID)
ENDIF

CALL POLLUTED_POSITION_INDEX(CHARA_ID, 6)


code:
@EVENTNAME128

RESULTS = 野外自慰

@EVENTABLE128(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用
IF ITEM:123 && ITEM:128
	FLAG:21 = 1
ENDIF

@EVENT128(CHARA_ID)
#DIM CHARA_ID

TFLAG:番号 = 128
TFLAG:部位 = RAND:16 + RAND:17

CALL CALC_ECSTASY(CHARA_ID, 50)
CALL PRINT_MESSAGE(CHARA_ID, "侵食イベント", TFLAG:番号, CALLNAME:CHARA_ID, CALLNAME:(FLAG:初期宿主))
CALL ECSTASY(CHARA_ID)
CALL MENTAL_DEVELOP(CHARA_ID, 30)

CFLAG:CHARA_ID:絶頂 = RAND:2 + 1

CALL ADD_ABL_EXP(11, CHARA_ID, 5 + RAND:10)
EXP:CHARA_ID:自慰回数 ++


code:
@EVENTNAME129

RESULTS = 强制高潮
;TranslatedMark 強制絶頂

@EVENTABLE129(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用
IF ITEM:129
	FLAG:21 = 1
ENDIF

@EVENT129(CHARA_ID)
#DIM CHARA_ID

TFLAG:番号 = 129
TFLAG:部位 = RAND:16 + RAND:17
CALL CALC_ECSTASY(CHARA_ID, 100)
CALL PRINT_MESSAGE(CHARA_ID, "侵食イベント", TFLAG:番号, CALLNAME:CHARA_ID, CALLNAME:(FLAG:初期宿主))
CALL ECSTASY(CHARA_ID)
CALL MENTAL_DEVELOP(CHARA_ID, 25)

CFLAG:CHARA_ID:絶頂 = RAND:2 + 1

CALL POLLUTED_POSITION_INDEX(CHARA_ID, 0)


code:
@EVENTNAME130

RESULTS = 去到大叔家里
;TranslatedMark おじさん家へ押しかけ

@EVENTABLE130(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT,3	;ループ用
IF ITEM:130
	FLAG:21 = 1
ENDIF

@EVENT130(CHARA_ID)
#DIM CHARA_ID

TFLAG:番号 = 130
CALL RANDOM_OSSAN_TYPE
CALL RANDOM_OSSAN_PLAY_TYPE

CALL CALC_ECSTASY(CHARA_ID, 20)
CALL PRINT_MESSAGE(CHARA_ID, "侵食イベント", TFLAG:番号, CALLNAME:CHARA_ID, CALLNAME:(FLAG:初期宿主))
CALL ECSTASY(CHARA_ID)
CALL MENTAL_DEVELOP(CHARA_ID, 25)

CALL ADD_ABL_EXP(15, CHARA_ID, 5 + RAND:10)

IF ITEM:18
	CALL GET_PREGNANCY(CHARA_ID)
ELSE
	CALL GET_PREGNANCY(CHARA_ID, "おじさん")
ENDIF

CALL POLLUTED_POSITION_INDEX(CHARA_ID, 8)

path: ERB/イベント/個別侵食イベント/EVENT130_おじさん家へ押しかけ.ERB