code:
;-------------------------------------------------
;地の文で表示するオノマトペ関連
;-------------------------------------------------
@COM_TEXT_ONOMATOPE_BEFORE
SELECTCASE SELECTCOM
        ;ちゅぱ系
    CASE 9, 24
        CALL FL_PLAYSE(S_R("Lick_1.mp3"),, "SEX")
        IF RAND:3
            CALLF TAG_PRINT(@"@C:{カラー_ピンク}@%ONOMATOPE_PRESET("ちゅぱ音短", 0, 0)%@/C@", 1)
        ENDIF
        PRINTL
        ;指入れ系
    CASE 2 TO 4, 333
        CALL FL_PLAYSE(S_R("Lick_1.mp3"),, "SEX")
        IF RAND:3
            CALLF TAG_PRINT(@"@C:{カラー_ピンク}@%ONOMATOPE_PRESET("くちゅ音短", (RAND:2), 0)%@/C@", 1)
        ENDIF
        PRINTL
        ;挿入系
    CASE 30 TO 49,52 TO 58, 160, 161
        CALL FL_PLAYSE(S_R("Piston_0.mp3/Piston_1.mp3/Piston_fast_0.mp3/Piston_fast_1.mp3"),, "SEX")
        IF RAND:3
            CALLF TAG_PRINT(@"@C:{カラー_ピンク}@%ONOMATOPE_PRESET("挿入音短", (RAND:2), 0)%@/C@", 1)
        ELSE
            CALLF TAG_PRINT(@"@C:{カラー_ピンク}@%ONOMATOPE_PRESET("くちゅ音長", (RAND:2), 0)%@/C@", 1)
        ENDIF
        PRINTL
        ;挿入系(触手)
    CASE 201, 202
        CALL FL_PLAYSE(S_R("Liquid_0.mp3/Liquid_fast_0.mp3"),, "SEX")
        IF RAND:3
            CALLF TAG_PRINT(@"@C:{カラー_ピンク}@%ONOMATOPE_PRESET("フェラ音長", 1, 0)%@/C@", 1)
        ELSE
            CALLF TAG_PRINT(@"@C:{カラー_ピンク}@%ONOMATOPE_PRESET("くちゅ音長", 1, 0)%@/C@", 1)
        ENDIF
        PRINTL
        ;フェラ系
    CASE 11 , 16, 90, 107, 330
        CALL FL_PLAYSE(S_R("Liquid_0.mp3/Liquid_fast_0.mp3"),, "SEX")
        IF RAND:3
            CALLF TAG_PRINT(@"@C:{カラー_ピンク}@%ONOMATOPE_PRESET("フェラ音長", (RAND:2), 0)%@/C@", 1)
        ELSE
            CALLF TAG_PRINT(@"@C:{カラー_ピンク}@%ONOMATOPE_PRESET("くちゅ音長", (RAND:2), 0)%@/C@", 1)
        ENDIF
        PRINTL
    CASEELSE

ENDSELECT

;───────────────────────────────────────
;オノマトペ生成用のプリセット
; 第1引数は呼出す際のシチュエーション
; 第2引数 平仮名 = 0, カナ = 1
; 第3引数 ハート無し = 1　ハートマークをつけたくない時に
; @GEN_ONOMATOPE()のメモ
; 第2 ~ 6引数は0~10で指定
; 濁音、促音、付帯音、端音、テンポ
;───────────────────────────────────────
@ONOMATOPE_PRESET(種類,カナ,ハート無し)
#FUNCTIONS
#DIMS 種類
#DIM カナ
#DIM ハート無し

#DIMS 表示テキスト
表示テキスト '= ""

SELECTCASE 種類
    CASE "ちゅぱ音短"
        表示テキスト '= GEN_ONOMATOPE(@"%SPLIT_RAND("ちゅ/ちゅっ/ちゅる",1)%/%SPLIT_RAND("ちゅぷ/ちゅ/ちゅぷ",1)%/%SPLIT_RAND("ちゅ/ちゅる/ちゅぷ",1)%",2,5,1,1,0,カナ,ハート無し)
    CASE "くちゅ音短"
        表示テキスト '= GEN_ONOMATOPE(@"%SPLIT_RAND("くちゅ/ちゅっ/ぬちゅ",1)%/%SPLIT_RAND("くちゅ/ぬちゃ/ちゅぷ",1)%/%SPLIT_RAND("ちゅっ/じゅっ/ぬちゅ",1)%",5,8,1,1,0,カナ,ハート無し)
    CASE "挿入音短"
        表示テキスト '= GEN_ONOMATOPE(@"%SPLIT_RAND("ぱんっ/ぱん/ぱちゅ",1)%/%SPLIT_RAND("くちゅ/ぬちゃ/ちゅぷ/ぱん/ぱちゅ/じゅぶ！",1)%/%SPLIT_RAND("ぱちゅ/ぱんっ/ぱん",1)%",5,5,0,0,0,カナ, ハート無し)
        IF RAND:2
            表示テキスト '= ARRANGE_ONOMATOPE(表示テキスト,"文中") ;音節の末尾を整形
            表示テキスト += GEN_ONOMATOPE(@"%SPLIT_RAND("ぱんっ/ぱん/ぱちゅ",1)%/%SPLIT_RAND("くちゅ/ぬちゃ/ちゅぷ/ぱん/ぱちゅ/じゅぶ！",1)%/%SPLIT_RAND("ぱちゅ/ぱんっ/ぱん",1)%",5,5,0,0,0,カナ, ハート無し)
        ENDIF
    CASE "くちゅ音長"
        表示テキスト '= GEN_ONOMATOPE(@"%SPLIT_RAND("くちゅ/ちゅっ/ぬちゅ",1)%/%SPLIT_RAND("くちゅ/ぬちゃ/ちゅぷ",1)%/%SPLIT_RAND("ちゅっ/じゅっ/ぬちゅ",1)%",5,8,1,1,0,カナ,ハート無し)
        表示テキスト '= ARRANGE_ONOMATOPE(表示テキスト,"文中") ;音節の末尾を整形
        表示テキスト += GEN_ONOMATOPE(@"%SPLIT_RAND("くちゅ/ちゅっ/ぬちゅ",1)%/%SPLIT_RAND("くちゅ/ぬちゃ/ちゅぷ",1)%/%SPLIT_RAND("ちゅく/くちゅ/ぬちゅ",1)%",5,3,1,5,0,カナ,ハート無し)
    CASE "フェラ音長"
        表示テキスト '= GEN_ONOMATOPE(@"%SPLIT_RAND("くちゅ/ちゅっ/ぬちゅ",1)%/%SPLIT_RAND("じゅる/じゅぽ/ちゅる",1)%/%SPLIT_RAND("じゅぷ/ぢゅる/ぐちゅ",1)%",5,8,1,1,0,カナ,ハート無し)
        表示テキスト '= ARRANGE_ONOMATOPE(表示テキスト,"文中") ;音節の末尾を整形
        表示テキスト += GEN_ONOMATOPE(@"%SPLIT_RAND("ぢゅ/ぢゅっ/ぬちゅ",1)%/%SPLIT_RAND("ぢゅる/ぬちゃ/ちゅぷ",1)%/%SPLIT_RAND("ちゅく/じゅる/じゅる",1)%",5,3,1,5,0,カナ,ハート無し)
    CASE "足コキ_潤"
        表示テキスト '= GEN_ONOMATOPE(@"%SPLIT_RAND("ぐじゅ/じゅっ/ぬちゅ",1)%/%SPLIT_RAND("しゅる/じゅる！/ぬちゅ",1)%/%SPLIT_RAND("ちゅる/じゅっ/ぬちゅ",1)%",5,8,5,1,1,カナ,ハート無し)
        表示テキスト '= ARRANGE_ONOMATOPE(表示テキスト,"文中") ;音節の末尾を整形
        表示テキスト += GEN_ONOMATOPE(@"%SPLIT_RAND("ぐじゅ/じゅっ❤/ぬちゅ",1)%/%SPLIT_RAND("ぐじゅ！/じゅる❤/ぬちゅ",1)%/%SPLIT_RAND("ちゅる❤/じゅっ/ぬちゅ❤",1)%",5,3,5,5,0,カナ,ハート無し)
    CASE "髪コキ_潤"
        表示テキスト '= GEN_ONOMATOPE(@"%SPLIT_RAND("しゅる/しゅっ/しゅる",1)%/%SPLIT_RAND("しゅる！/じゅる❤/ぬちゅ/",1)%/%SPLIT_RAND("しゅっ/じゅっ/しゅる❤/",1)%",2,5,7,1,1,カナ,ハート無し)
        表示テキスト '= ARRANGE_ONOMATOPE(表示テキスト,"文中") ;音節の末尾を整形
        表示テキスト += GEN_ONOMATOPE(@"%SPLIT_RAND("しゅる/じゅっ❤/ぬちゅ",1)%/%SPLIT_RAND("じゅる❤/しゅる/ぬちゅ",1)%/%SPLIT_RAND("しゅる❤/じゅっ/ぬちゅ❤",1)%",2,5,7,1,1,カナ,ハート無し)
    CASEELSE
ENDSELECT

RETURNF 表示テキスト

;───────────────────────────────────────
;機械的に生成した文字列を接続する際、文として自然になるように整形して返す
; 第二引数は"文中"か"文末"を指定(未実装)
;───────────────────────────────────────
@ARRANGE_ONOMATOPE(文字列,位置)
#FUNCTIONS
#DIMS 文字列
#DIMS 位置
;末尾が以下の文字に該当する場合は処理しない
#DIMS CONST 区切り文字 = "…、。！❤♥♪"

STRLENFORMU %文字列%
LOCAL:0 = RESULT
IF STRFINDU(区切り文字, SUBSTRINGU(文字列, LOCAL:0 - 1, LOCAL:0) ) == -1
    文字列 '= 文字列 + "、"
ENDIF

RETURNF 文字列
;───────────────────────────────────────
;与えられた4文字までの文字列をもとにオノマトペを生成し文字列を返す
; ・文字列は平仮名で指定
; ・文字列は"/"で区切り3候補まで指定可
; ・４文字目は記号指定にのみ使用(！❤♥♪)
; ・第2 ~ 6引数は0~10で指定
; ・濁音頻度	1文字目が清音の場合どの程度濁音に置換するか
; ・促音頻度	"っ"をどの程度付加するか
; ・付帯音頻度	3文字が"る"の時に音を足す。びゅるるっ
; ・端音頻度	3文字目をどの程度の頻度で出力するか
; ・テンポ　通常 = 0,2個以上の3点リーダを付加しない = 1
; ・カナ 平仮名 = 0 カタカナ = 1
; ・ハート無し = 1 でハートマークを追加しない
;───────────────────────────────────────
@GEN_ONOMATOPE(文字列, 濁音頻度, 促音頻度, 付帯音頻度, 端音頻度, テンポ, カナ, ハート無し = 0)
#FUNCTIONS
#DIMS 文字列
#DIM テンポ
#DIM カナ
#DIM ハート無し

#DIMS 表示テキスト, 2
#DIM 表示テキスト文字数
#DIMS 基本音, 3
#DIM 候補数
#DIMS 選択基本音
#DIM 濁音頻度
#DIM 促音頻度
#DIM 付帯音頻度
#DIM 端音頻度

#DIM 子音
#DIM 促音フラグ
#DIM 濁音フラグ
#DIM 端音フラグ

#DIMS CHAR, 4
#DIM  CNT_A
#DIM  CNT_B

#DIMS CONST 濁音変換候補 = "くしちぴ"
#DIMS CONST 濁音変換対応文字列 = "ぐじぢび"
#DIMS CONST 拗音表 = "ゃゅょ"
#DIMS CONST 半濁音表, 3 = "ぱ","ぷ","ぽ"
#DIMS CONST 付帯音表, 3 = "る","るっ","るぅ"
#DIMS CONST 記号表 = "！❤♥♪"

候補数 = 0
VARSET 表示テキスト, ""

;生成のベースとする基本音を配列に格納
SPLIT 文字列, "/", 基本音
FOR CNT_A, 0, 3
    IF 基本音:CNT_A == ""
        ARRAYREMOVE 基本音, CNT_A, 1
    ENDIF
NEXT
FOR CNT_A, 0, 3
    SIF 基本音:CNT_A != ""
        候補数 += 1
NEXT

FOR CNT_A, 0, 候補数
    VARSET CHAR, ""
    選択基本音 '= 基本音:CNT_A
    促音フラグ = 0
    濁音フラグ = 0
    端音フラグ = 0

    FOR CNT_B, 0, STRLENSU(選択基本音)
        CHAR:(CNT_B) '= SUBSTRINGU(選択基本音, CNT_B, 1)
    NEXT

    ;1文字目の処理
    ;特定の文字のみ確率で濁音に変換する
    LOCAL = STRFINDU(濁音変換候補, CHAR:0)
    IF RAND:10 <　濁音頻度 && LOCAL != -1
        CHAR:0 '= CHARATU(濁音変換対応文字列,LOCAL)
        SIF STRFINDU(濁音変換対応文字列, CHAR:0) != -1
            濁音フラグ = 1
    ENDIF
    表示テキスト '= 表示テキスト + CHAR:0

    表示テキスト '= 表示テキスト + CHAR:1
    ;基本音の2音目が拗音（ゃ、ゅ、ょ）以外の場合;確率で2音目の後に促音（っ）を付加
    IF STRFINDU(拗音表, CHAR:1) != -1 && FINDELEMENT(付帯音表, CHAR:1) != -1
        IF RAND:10 < 促音頻度
            表示テキスト '= 表示テキスト + "っ"
            促音フラグ = 1
        ENDIF
    ELSE
        ;例えば「ちゅぱ」と「くちゅ」では3文字目の処理を変えないと不自然になるのでこのフラグで制御する
        端音フラグ = 1
    ENDIF

    ;３音目の処理
    ;確率で３文字目を消去
    ;子音をランダムでずらす。ex.ちゅぷ -> ちゅぱ or ちゅぽ
    {
        SELECTCASE IFRAND(
            "99",1,
            "D99,1", 端音フラグ == 1,
            "D99,1",RAND:10 < 端音頻度 && 濁音フラグ != 1 && 端音フラグ != 1
            )
    }
        CASE 1
            IF FINDELEMENT(半濁音表, CHAR:2) != -1 && CHAR:2 != ""
                子音 = FINDELEMENT(半濁音表, CHAR:2)
                IF 子音 != -1 && RAND:3
                    IF 子音　== 1
                        IF RAND:3
                            子音 += 1
                        ELSEIF RAND:2
                            子音 -= 1
                        ENDIF
                    ELSEIF 子音 == 0
                        SIF RAND:3
                            子音 += 1
                    ELSEIF 子音 != 0
                        SIF RAND:3
                            子音 -= 1
                    ENDIF
                ENDIF
                CHAR:2 '= 半濁音表:子音
            ENDIF
            表示テキスト '= 表示テキスト + CHAR:2
        CASEELSE
    ENDSELECT

    ;3文字目以降に付帯する音の処理(る、るる)
    IF FINDELEMENT(付帯音表, CHAR:2) != -1 && 促音フラグ == 0  ;ちゅっるるのような音は不自然なので出現しないように
        IF RAND:10 < 付帯音頻度
            表示テキスト '= 表示テキスト + SPLIT_RAND(@"%付帯音表:0%/%付帯音表:1%/%付帯音表:2%",1)
        ENDIF
    ENDIF
    ;確率で末尾に促音を負荷
    IF RAND:10 < 促音頻度 && 促音フラグ == 0
        表示テキスト '= 表示テキスト + SPLIT_RAND("っ/っ/っ/っ/っ！/っっ/っっ/っっ――！",1)
        促音フラグ = 1
    ENDIF

    ;4文字目が存在しない場合、句点か三点リーダを付加
    IF CHAR:3 == ""
        ;テンポに応じて三点リーダの量を調整する
        IF テンポ == 0;通常
            表示テキスト '= 表示テキスト + SPLIT_RAND("、/、/、/…/…/……/……/……/……………",1)
        ELSE ;早い(二個以上の三点リーダを打たない)
            表示テキスト '= 表示テキスト + SPLIT_RAND("/、/、/…/…/…/……/……",1)
        ENDIF
    ENDIF
    ;4文字目の処理
    ;特定の記号が指定さている場合は0～3個つける
    IF  CHAR:3 != ""
        IF (CHAR:3 == "❤" || CHAR:3 == "♥") && ハート無し != 1
            表示テキスト '= 表示テキスト + SPLIT_RAND("、/、/❤/❤/❤/…❤/……❤/……❤/❤❤/…❤❤/……❤❤/❤❤❤",1)
        ELSEIF FINDELEMENT(記号表, CHAR:3) != -1
            表示テキスト '= 表示テキスト + SPLIT_RAND(@"、/、/%CHAR:3%/%CHAR:3%/%CHAR:3%%CHAR:3%",1)
        ENDIF
        IF CNT_A:0 < 候補数 - 1
            IF テンポ == 0;通常
                表示テキスト '= 表示テキスト + SPLIT_RAND("/…/……/……/…………",1)
            ELSE
                表示テキスト '= 表示テキスト + SPLIT_RAND("//…/…/…/……/……",1)
            ENDIF
        ENDIF
    ENDIF
    ;音節の末尾に応じた処理
    STRLENFORMU %表示テキスト%
    表示テキスト文字数 = RESULT
    IF SUBSTRINGU(表示テキスト, 表示テキスト文字数 - 1, 表示テキスト文字数) == "っ"
        表示テキスト '= 表示テキスト + "、"
    ENDIF
    ;ハートありならハートマーク付加
    STRLENFORMU %表示テキスト%
    表示テキスト文字数 = RESULT
    IF STRFINDU("、…", SUBSTRINGU(表示テキスト, 表示テキスト文字数 - 1, 表示テキスト文字数) ) == 1
        表示テキスト '= SUBSTRINGU(表示テキスト, 0, 表示テキスト文字数 - 1)  + SPLIT_RAND("❤/❤/❤❤/❤❤/❤❤❤",1)
    ENDIF
NEXT

;生成文字列の末尾が句点なら除去
STRLENFORMU %表示テキスト%
表示テキスト文字数 = RESULT
IF SUBSTRINGU(表示テキスト,  表示テキスト文字数 - 1, 表示テキスト文字数) == "、"
    表示テキスト '= SUBSTRINGU(表示テキスト,0 , 表示テキスト文字数 - 1)
ENDIF

IF カナ == 1
    表示テキスト = %TO_KANA(表示テキスト)%
ENDIF

RETURNF 表示テキスト

;●平仮名カナ変換
@TO_KANA(ARGS:0)
#FUNCTIONS
#DIMS CONST 平仮名対応表 	= "ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん"
#DIMS CONST カナ対応表	= "ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲン"

#DIM CNT_A
#DIM IDX
#DIMS 対象文字
#DIMS 変換後文字列

対象文字 '= ""
変換後文字列 '= ""

FOR CNT_A, 0, STRLENSU(ARGS:0)
    対象文字 '= SUBSTRINGU(ARGS:0, CNT_A, 1)
    IDX = STRFINDU(平仮名対応表, 対象文字)
    IF IDX != -1
        対象文字 '= CHARATU(カナ対応表, IDX)
    ENDIF
    変換後文字列 '= 変換後文字列 + 対象文字
NEXT
変換後文字列 '= 変換後文字列

RETURNF 変換後文字列


code:
;-------------------------------------------------
; COM_REACTION関連の広域変数
;-------------------------------------------------
;通常の実行(0-999), 命令としての実行(1000 - 1999), 未実装:第三者実行(2000 -)
#DIM CONST MAX_COM = 1000 * 3
#DIM COM_REACTION_PRIORITY, MAX_COM
#DIM COM_REACTION_COM_OPTION, MAX_COM
#DIM COM_REACTION_実行前MPLY, 100
#DIM COM_REACTION_実行前MTAR, 100
#DIM COM_REACTION_実行前主導権
#DIM COM_REACTION_MAIN_PLAYER
#DIM COM_INTERRUPTION_MAIN_PLAYER
#DIM COM_REACTION_TARGET

#DIM CONST COM_REACTION_命令 = 1000

repo_name: napo/erafl

license: unknown


code:
;-------------------------------------------------
; リアクション実行者の抽選
;-------------------------------------------------
@COM_REACTION_SELECT_MAIN_PLAYER
#DIMS DYNAMIC _LIST_PLAYER

;MASTERが主導権をもってコマンドを実行している/させている場合、相手をリアクション候補に指定する
;->主導権の条件を一旦不要に。問題なければ削除
;IF (IS_INITIATIVE(MASTER) && MPLY:0 == MASTER)
IF MPLY:0 == MASTER
    LOCAL = 0
    WHILE MTAR:LOCAL != -1
        _LIST_PLAYER = %LIST_ADD(_LIST_PLAYER, TOSTR(MTAR:LOCAL))%
        LOCAL ++
    WEND
    ;ELSEIF (IS_INITIATIVE(MASTER) && MTAR:0 == MASTER)
ELSEIF MTAR:0 == MASTER
    LOCAL = 0
    WHILE MPLY:LOCAL != -1
        _LIST_PLAYER = %LIST_ADD(_LIST_PLAYER, TOSTR(MPLY:LOCAL))%
        LOCAL ++
    WEND
ELSE
    ;固有のコマンドリアクション
    IF GROUPMATCH(SELECTCOM, T_N("見つめあう")) && MTAR:0 != MASTER
        _LIST_PLAYER = %LIST_ADD(_LIST_PLAYER, TOSTR(MTAR:0))%
    ENDIF
ENDIF

;リアクション実行者の抽選
CALL LIST_SHUFFLE(_LIST_PLAYER)
FOR LOCAL, 0, LIST_COUNT(_LIST_PLAYER)
    COM_REACTION_MAIN_PLAYER = TOINT(LIST_GET(_LIST_PLAYER, LOCAL))
    ;条件を満たしたら抽選終了
    CALL COM_REACTION_SET_REACTION_RATE(COM_REACTION_MAIN_PLAYER)
    IF RESULT < RAND:100
        COM_REACTION_MAIN_PLAYER = -1
        CONTINUE
    ELSE
        BREAK
    ENDIF
NEXT
RETURN COM_REACTION_MAIN_PLAYER

;-------------------------------------------------
;リアクション対象抽選
;-------------------------------------------------
; #region @COM_CHEERING_SELECT_TARGET
@COM_REACTION_SELECT_TARGET()
#DIM CHARA_ID
#DIMS DYNAMIC _LIST_TARGET

;対象のリスト化
FOR LOCAL, 0, CHARANUM
    IF IS_PARTICIPATE_TRAIN(LOCAL) && LOCAL != COM_REACTION_MAIN_PLAYER && (IS_MPLY(LOCAL) || IS_MTAR(LOCAL))
        ;固有のコマンドリアクション
        IF GROUPMATCH(SELECTCOM, T_N("見つめあう"))
            _LIST_TARGET = %LIST_ADD(_LIST_TARGET, TOSTR(MPLY:0))%
        ENDIF
    ENDIF
NEXT

;ターゲットの選択
IF LIST_COUNT(_LIST_TARGET)
    CALL LIST_SHUFFLE(_LIST_TARGET)
    COM_REACTION_TARGET = TOINT(LIST_GET(_LIST_TARGET, 0))
    RETURN 1
ENDIF
RETURN 0
; #endregion

;-------------------------------------------------
; 割り込み実行者の抽選
;-------------------------------------------------
@COM_INTERRUPTION_SELECT_MAIN_PLAYER
#DIMS DYNAMIC _LIST_PLAYER

FOR LOCAL, 0, CHARANUM
    IF IS_PARTICIPATE_TRAIN(LOCAL)
        IF !IS_MPLY(LOCAL) && !IS_MTAR(LOCAL) && LOCAL != MASTER
            IF TCVAR:LOCAL:離脱フラグ == 離脱フラグ_観客
                _LIST_PLAYER = %LIST_ADD(_LIST_PLAYER, TOSTR(LOCAL))%
            ELSEIF TCVAR:LOCAL:焦らされ度 >= 70 && RAND:100 < TCVAR:LOCAL:焦らされ度
                _LIST_PLAYER = %LIST_ADD(_LIST_PLAYER, TOSTR(LOCAL))%
            ENDIF
        ENDIF
    ENDIF
NEXT
;実行者の抽選
CALL LIST_SHUFFLE(_LIST_PLAYER)
FOR LOCAL, 0, LIST_COUNT(_LIST_PLAYER)
    COM_INTERRUPTION_MAIN_PLAYER = TOINT(LIST_GET(_LIST_PLAYER, LOCAL))
    ;条件を満たしたら抽選終了
    CALL COM_REACTION_SET_INTERRUPTION_RATE(COM_INTERRUPTION_MAIN_PLAYER)
    IF RESULT < RAND:100
        COM_INTERRUPTION_MAIN_PLAYER = -1
        CONTINUE
    ELSE
        BREAK
    ENDIF
NEXT

RETURN COM_INTERRUPTION_MAIN_PLAYER

;-------------------------------------------------
; コマンド実行判定
;-------------------------------------------------
@COM_REACTION_COM_ORDER_CHECK(COM, CHARA_ID, IS_TARGET = 0)
#DIM COM
#DIM CHARA_ID
#DIM IS_TARGET
#DIM FIRST_LINE

SIF CHARA_ID == MASTER
    RETURN 1

;COM_ORDERの判定結果出力メッセージをリアクションで表示すると煩わしいので出力後に無理やり消去してしまう
FIRST_LINE = LINECOUNT
REDRAW 0
IF EXISTFUNCTION(@"COM_ORDER_\@IS_TARGET ? TARGET # PLAYER\@{COM}")
    CVARSET TCVAR, 24, -10000
    CVARSET TCVAR, 25, 10000
    TRYCALLFORM COM_ORDER_\@IS_TARGET ? TARGET # PLAYER\@{COM}(CHARA_ID)
    PRINTL
    CLEARLINE LINECOUNT - FIRST_LINE
    REDRAW 1
    IF TCVAR:(CHARA_ID):24 > TCVAR:(CHARA_ID):25
        RETURN 1
    ENDIF
ELSE
    RETURN 1
ENDIF
RETURN 0

;-------------------------------------------------
; 第三者追加判定
;-------------------------------------------------
@COM_REACTION_ADD_THIRD_PERSON(REACTION_SELECTCOM, ADD_TO_MTAR = 0)
#DIM REACTION_SELECTCOM
#DIM ADD_TO_MTAR
#DIM DYNAMIC CHARA_ID
#DIMS DYNAMIC _LIST_PLAYER

;割込実行候補のリスト化
IF TFLAG:割込コマンド実行
    FOR LOCAL, 0, CHARANUM
        IF IS_PARTICIPATE_TRAIN(LOCAL) && LOCAL != COM_REACTION_MAIN_PLAYER
            IF (!IS_MPLY(LOCAL) && !IS_MTAR(LOCAL) && LOCAL != MASTER && TCVAR:LOCAL:焦らされ度 >= 70) || (IS_EQUIP_PLAYER(LOCAL, REACTION_SELECTCOM))
                IF TFLAG:割込コマンド実行 != 1
                    CALL COM_REACTION_SET_REACTION_RATE(LOCAL)
                ELSE
                    CALL COM_REACTION_SET_INTERRUPTION_RATE(LOCAL)
                ENDIF
                SIF !(RESULT > RAND:100)
                    CONTINUE
                IF ACCEPT_EACH()
                    _LIST_PLAYER = %LIST_ADD(_LIST_PLAYER, TOSTR(LOCAL))%
                ELSE
                    ;非合意の場合
                    ;MAIN_PLAYERがスケベモブの場合はスケベモブしか同調しない
                    IF CFLAG:COM_REACTION_MAIN_PLAYER:スケベモブ && CFLAG:LOCAL:スケベモブ
                        _LIST_PLAYER = %LIST_ADD(_LIST_PLAYER, TOSTR(LOCAL))%
                    ELSEIF  !CFLAG:COM_REACTION_MAIN_PLAYER:スケベモブ && !CFLAG:LOCAL:スケベモブ
                        _LIST_PLAYER = %LIST_ADD(_LIST_PLAYER, TOSTR(LOCAL))%
                    ENDIF
                ENDIF
            ENDIF
        ENDIF
    NEXT
ENDIF

COM_ENABLE = 1
;割込実行者の追加
CALL LIST_SHUFFLE(_LIST_PLAYER)
FOR LOCAL, 0, LIST_COUNT(_LIST_PLAYER)
    CHARA_ID = TOINT(LIST_GET(_LIST_PLAYER, LOCAL))
    IF !ADD_TO_MTAR
        CALL ADD_MPLY(CHARA_ID)
    ELSE
        CALL ADD_MTAR(CHARA_ID)
    ENDIF
    CALL CHECK_COMABLE(REACTION_SELECTCOM)
    IF !RESULT
        IF !ADD_TO_MTAR
            CALL DEL_MPLY(CHARA_ID)
        ELSE
            CALL DEL_MTAR(CHARA_ID)
        ENDIF
        CONTINUE
    ENDIF
    ;実行条件を満たしていない場合も不可
    IF !ADD_TO_MTAR
        CALL COM_REACTION_COM_ORDER_CHECK(REACTION_SELECTCOM, CHARA_ID)
        IF !RESULT
            CALL DEL_MPLY(CHARA_ID)
            CONTINUE
        ENDIF
        SIF !IS_EQUIP_PLAYER(CHARA_ID, REACTION_SELECTCOM)
            TFLAG:割込人数 ++
    ELSE
        CALL COM_REACTION_COM_ORDER_CHECK(REACTION_SELECTCOM, CHARA_ID, 1)
        IF !RESULT
            CALL DEL_MTAR(CHARA_ID)
            CONTINUE
        ENDIF
        SIF !IS_EQUIP_TARGET(CHARA_ID, REACTION_SELECTCOM)
            TFLAG:割込人数 ++
    ENDIF
NEXT

COM_ENABLE = 0
RETURN

;-------------------------------------------------
; リアクション実行者の抽選(鑑賞判定)
;-------------------------------------------------
@COM_REACTION_CHEERING_SELECT_MAIN_PLAYER
#DIMS DYNAMIC _LIST_PLAYER

FOR LOCAL, 0, MTAR_NUM
    IF C_COND("行動:鑑賞中",, MTAR:LOCAL)
        _LIST_PLAYER = %LIST_ADD(_LIST_PLAYER, TOSTR(MTAR:LOCAL))%
        LOCAL ++
    ENDIF
NEXT

;リアクション実行者の抽選
CALL LIST_SHUFFLE(_LIST_PLAYER)
FOR LOCAL, 0, LIST_COUNT(_LIST_PLAYER)
    COM_REACTION_MAIN_PLAYER = TOINT(LIST_GET(_LIST_PLAYER, LOCAL))
    ;条件を満たしたら抽選終了
    CALL COM_REACTION_SET_REACTION_RATE(COM_REACTION_MAIN_PLAYER)
    IF RESULT < RAND:100
        COM_REACTION_MAIN_PLAYER = -1
        CONTINUE
    ELSE
        BREAK
    ENDIF
NEXT
RETURN COM_REACTION_MAIN_PLAYER

;-------------------------------------------------
; 割込まれたキャラクターを取得
;-------------------------------------------------
@COM_REACTION_GET_INTERRUPTED_CHARA()
;奉仕系コマンドはMPLY,それ以外はMTARの最初のキャラを返す
SELECTCASE PREVCOM
    CASE 10 TO 19, 106, 107
        RETURN COM_REACTION_実行前MPLY:0
    CASEELSE
        IF IS_PREV_MPLY(COM_REACTION_TARGET)
            RETURN COM_REACTION_実行前MTAR:0
        ELSE
            RETURN COM_REACTION_実行前MPLY:0
        ENDIF
ENDSELECT

@COM_MOLESTATION_SELECT_TARGET(CHARA_ID)
#DIM CHARA_ID
#DIMS DYNAMIC _LIST_TARGET

;いたずら対象のリスト化
FOR LOCAL, 0, CHARANUM
    IF IS_PARTICIPATE_TRAIN(LOCAL) && LOCAL != COM_REACTION_MAIN_PLAYER
        ;一時参加扱いの場合コマンド実行後調教参加フラグが消えるので、いたずらのターゲットにとれない
        ;(ここで弾かないとコマンドが空振りしてエラーになる)
        SIF TCVAR:LOCAL:調教一時参加扱い
            CONTINUE
        CALL SKILL_GET_LEVEL(LOCAL, スキル_大分類_性技, "SEDUCTION")
        IF RESULT
            _LIST_TARGET = %LIST_ADD(_LIST_TARGET, TOSTR(LOCAL))%

        ENDIF
    ENDIF
NEXT

;ターゲットの選択
IF LIST_COUNT(_LIST_TARGET)
    CALL LIST_SHUFFLE(_LIST_TARGET)
    COM_REACTION_TARGET = TOINT(LIST_GET(_LIST_TARGET, 0))
    RETURN 1
ENDIF
RETURN 0

;観客の声援、罵倒系の割込コマンド
; #region @COM_CHEERING_SELECT_TARGET
@COM_CHEERING_SELECT_TARGET()
#DIMS DYNAMIC _LIST_TARGET

;対象のリスト化
FOR LOCAL, 0, CHARANUM
    ;公演の実行者であること
    IF FLAG:クエストモード
        IF IS_PARTICIPATE_TRAIN(LOCAL) && LOCAL != COM_INTERRUPTION_MAIN_PLAYER && (IS_MPLY(LOCAL) || IS_MTAR(LOCAL))
            SIF TCVAR:LOCAL:離脱フラグ == 離脱フラグ_観客
                CONTINUE
            IF TFLAG:公演_趣向 == 1
                SIF !IS_SEXUAL(COM_INTERRUPTION_MAIN_PLAYER, LOCAL)
                    CONTINUE
            ENDIF
            _LIST_TARGET = %LIST_ADD(_LIST_TARGET, TOSTR(LOCAL))%
        ENDIF
    ENDIF
NEXT

;ターゲットの選択
IF LIST_COUNT(_LIST_TARGET)
    CALL LIST_SHUFFLE(_LIST_TARGET)
    COM_REACTION_TARGET = TOINT(LIST_GET(_LIST_TARGET, 0))
    RETURN 1
ENDIF
RETURN 0
; #endregion

;継続状態の設定
@COM_REACTION_SET_EQUIP(COM, CHARA_ID)
#DIM COM
#DIM CHARA_ID

CALL COM_AUTO_GET_EQUIP_MODE
TFLAG:非継続フラグ = RESULT

@COM_REACTION_SET_WEIGHT
#DIM DYNAMIC WEIGHT_ADD_COUNT
WEIGHT_ADD_COUNT = 0
FOR LOCAL, 0, MAX_COM
    IF COM_REACTION_PRIORITY:LOCAL > 0
        CALL COM_AUTO_RANDOMIZED_WEIGHTED_VALUE(LOCAL, COM_REACTION_PRIORITY:LOCAL)
        WEIGHT_ADD_COUNT ++
    ENDIF
NEXT
SIF !WEIGHT_ADD_COUNT
    RETURN -1

@COM_REACTION_SET_REACTION_RATE(CHARA_ID)
#DIM CHARA_ID
;調教から不在になっている
SIF !CFLAG:CHARA_ID:調教参加フラグ
    RETURN 0
SIF CFLAG:CHARA_ID:主導除外
    RETURN 0
;意識がないなど主体的にコマンドを実行できる状態でない
SIF !IS_PLAYABLE(CHARA_ID)
    RETURN 0

IF CFLAG:CHARA_ID:スケベモブ
    IF CHECK_EMOTION(CHARA_ID, "GOOD")
        RETURN 80
    ENDIF
ENDIF
SELECTCASE TOSTR_EMOTION(CHARA_ID)
    CASE "幸"
        RETURN 80
    CASE "悦"
        RETURN 60
    CASE "良"
        RETURN 40
    CASEELSE
        RETURN 0
ENDSELECT

@COM_REACTION_SET_INTERRUPTION_RATE(CHARA_ID)
#DIM CHARA_ID
SIF CFLAG:CHARA_ID:主導除外
    RETURN 0

IF CFLAG:CHARA_ID:スケベモブ
    IF !CHECK_EMOTION(CHARA_ID, "NEGATIVE")
        RETURN 90
    ENDIF
ENDIF
IF TCVAR:CHARA_ID:離脱フラグ == 離脱フラグ_観客
    IF !CHECK_EMOTION(CHARA_ID, "NEGATIVE")
        RETURN 90
    ENDIF
ENDIF
IF CHECK_EMOTION(CHARA_ID, "悦,幸")
    RETURN 80
ENDIF


code:
;-------------------------------------------------
;コマンド実行時のキャラクタの自発的反応
;COM_REACTION
;-------------------------------------------------
@COM_REACTION_MAIN()
VARSET COM_REACTION_PRIORITY, 0
COM_REACTION_TARGET = -1
COM_REACTION_MAIN_PLAYER = -1
COM_INTERRUPTION_MAIN_PLAYER = -1

TFLAG:リアクションコマンド実行 = 0
TFLAG:割込コマンド実行 = 0

;コンフィグで不許可なら判定しない
SIF !FLCONFIG:リアクション許可
    RETURN -1

SIF TFLAG:参加者数 == 0 && MTAR_NUM == 0
    RETURN -1

CALL COM_REACTION_SELECT_PLAYER()
SIF RESULT == -1
    RETURN -1
CALL COM_REACTION_SELECTCOM()
SIF RESULT == -1
    RETURN -1
CALL COM_REACTION_COMABLE()
SIF RESULT == -1
    RETURN -1

RETURN RESULT

@COM_REACTION_SELECT_PLAYER
;リアクション実行前に実行者が不在になっていないか確認
IF (MTAR:0 != COM_REACTION_実行前MTAR:0 || MPLY:0 != COM_REACTION_実行前MPLY:0) && FLAG:ハウジングモード
    COM_REACTION_MAIN_PLAYER = -1
ELSE
    CALL COM_REACTION_SELECT_MAIN_PLAYER()
    COM_REACTION_MAIN_PLAYER = RESULT
ENDIF

;コマンド「眺める」のリアクション判定
IF C_COND("視線:鑑賞",,MPLY) && C_COND("設備属性:鑑賞",,MTAR)
    COM_REACTION_MAIN_PLAYER = MTAR
ENDIF

;領内活動の演奏、演舞のリアクション判定
IF FLAG:調教モード == 調教_居住区 && GROUPMATCH(SELECTCOM, T_N("演奏する"), T_N("踊る"))
    CALL COM_REACTION_CHEERING_SELECT_MAIN_PLAYER()
ENDIF

;割り込み実行者の判定
CALL COM_INTERRUPTION_SELECT_MAIN_PLAYER
COM_INTERRUPTION_MAIN_PLAYER = RESULT

IF COM_REACTION_MAIN_PLAYER == -1 && COM_INTERRUPTION_MAIN_PLAYER == -1
    VARSET COM_REACTION_実行前MTAR
    VARSET COM_REACTION_実行前MPLY
    RETURN -1
ELSEIF COM_REACTION_MAIN_PLAYER != -1  && COM_INTERRUPTION_MAIN_PLAYER != -1
    IF RAND:2
        COM_REACTION_MAIN_PLAYER = -1
    ELSE
        COM_INTERRUPTION_MAIN_PLAYER = -1
    ENDIF
ENDIF
RETURN 1

@COM_REACTION_SELECTCOM

;暫定でREACTIONのTARGETにMASTERをセット
COM_REACTION_TARGET = MASTER
CALL COM_REACTION_SELECT_TARGET()
IF COM_REACTION_MAIN_PLAYER != -1
    ;リアクションが生じ得ない値になっている場合は実行しない
    SIF COM_REACTION_MAIN_PLAYER == COM_REACTION_TARGET || (COM_REACTION_MAIN_PLAYER == -1 || COM_REACTION_TARGET == -1)
        RETURN -1
    ;コマンドの実行優先度を取得
    CALL COM_REACTION_SET_PRIORITY(COM_REACTION_MAIN_PLAYER, COM_REACTION_TARGET)
    TFLAG:リアクションコマンド実行 = 1
ELSEIF COM_INTERRUPTION_MAIN_PLAYER != -1
    ;公演の声援
    IF TCVAR:COM_INTERRUPTION_MAIN_PLAYER:離脱フラグ == 離脱フラグ_観客 || C_COND("行動:鑑賞中",,COM_INTERRUPTION_MAIN_PLAYER)
        CALL COM_CHEERING_SELECT_TARGET()
        SIF !RESULT
            RETURN -1
        CALL COM_CHEERING_SET_PRIORITY(COM_INTERRUPTION_MAIN_PLAYER, COM_REACTION_TARGET)
        ;スケベモブのセクハラ
    ELSEIF CFLAG:COM_INTERRUPTION_MAIN_PLAYER:スケベモブ
        CALL COM_MOLESTATION_SELECT_TARGET(COM_INTERRUPTION_MAIN_PLAYER)
        SIF !RESULT
            RETURN -1
        CALL COM_MOLESTATION_SET_PRIORITY(COM_INTERRUPTION_MAIN_PLAYER, COM_REACTION_TARGET)
    ELSE
        ;介入コマンド実行
        CALL COM_INTERRUPTION_SET_PRIORITY(COM_INTERRUPTION_MAIN_PLAYER, COM_REACTION_TARGET)
    ENDIF
    SIF COM_REACTION_TARGET == MASTER && !IS_PARTICIPATE_TRAIN(MASTER)
        RETURN -1
    TFLAG:割込コマンド実行 = 1
    COM_REACTION_MAIN_PLAYER = COM_INTERRUPTION_MAIN_PLAYER
ENDIF

@COM_REACTION_COMABLE()
#DIM CONST MAX_TRY_COUNT = 3
#DIM DYNAMIC REACTION_SELECTCOM
#DIM DYNAMIC TRY_COUNT
#DIMS DYNAMIC _LIST_PLAYER
#DIM DYNAMIC ORDER_FLAG

REACTION_SELECTCOM = -1

;;以下リアクションまたは割込コマンドのが実行可能な場合の処理
;COMABLE判定用にフラグを立てる
WHILE TRY_COUNT < MAX_TRY_COUNT
    ORDER_FLAG = 0
    ;COM_AUTOSELECTの重みつき乱択を使用
    CALL COM_AUTO_RANDOMIZED_WEIGHTED_START
    CALL COM_REACTION_SET_WEIGHT
    SIF RESULT == -1
        BREAK
    REACTION_SELECTCOM = COM_AUTO_RANDOMIZED_WEIGHTED_RESULT()
    ;DEBUGPRINTFORML REACTION_SELECTCOM候補:{REACTION_SELECTCOM}
    IF REACTION_SELECTCOM >= COM_REACTION_命令
        REACTION_SELECTCOM -= COM_REACTION_命令
        ORDER_FLAG = 1
    ENDIF
    IF REACTION_SELECTCOM != -1
        CALL CLEAR_MTAR()
        CALL CLEAR_MPLY()
        IF !ORDER_FLAG
            CALL ADD_MPLY(COM_REACTION_MAIN_PLAYER)
            CALL ADD_MTAR(COM_REACTION_TARGET)
        ELSE
            CALL ADD_MTAR(COM_REACTION_MAIN_PLAYER)
            CALL ADD_MPLY(COM_REACTION_TARGET)
        ENDIF
        FLAG:主導権所有者 = COM_REACTION_MAIN_PLAYER
        COM_ENABLE = 1
        ;複数のターゲットを要求するコマンドではあらかじめMTARを追加
        IF ORDER_FLAG && GROUPMATCH(REACTION_SELECTCOM, T_N("順番に挿入"), T_N("Ａ順番に挿入"))
            CALL COM_REACTION_ADD_THIRD_PERSON(REACTION_SELECTCOM, 1)
        ENDIF
        CALL CHECK_COMABLE(REACTION_SELECTCOM)
        ; DEBUGPRINTFORML @COM_REACTION_MAIN_PLAYER:{COM_REACTION_MAIN_PLAYER}
        ; DEBUGPRINTFORML @COM_REACTION_TARGET:{COM_REACTION_TARGET}
        ; DEBUGPRINTFORML @COM:{REACTION_SELECTCOM} REACTION CHECK_COMABLE:{RESULT}
        IF RESULT != 0
            ;コマンド固有の実行判定:PLAYER
            CALL COM_REACTION_COM_ORDER_CHECK(REACTION_SELECTCOM, COM_REACTION_MAIN_PLAYER, ORDER_FLAG ? 1 # 0)
            IF !RESULT
                COM_REACTION_PRIORITY:(REACTION_SELECTCOM + (1000 * ORDER_FLAG)) = 0
            ENDIF
            ;コマンド固有の実行判定:TARGET
            CALL COM_REACTION_COM_ORDER_CHECK(REACTION_SELECTCOM, COM_REACTION_TARGET, ORDER_FLAG ? 0 # 1)
            IF !RESULT
                COM_REACTION_PRIORITY:(REACTION_SELECTCOM + (1000 * ORDER_FLAG)) = 0
            ENDIF
            ;PLAYER,TARGETともに実行可能条件を満たしている場合は、実行可能と判断し判定ループを抜ける
            SIF COM_REACTION_PRIORITY:(REACTION_SELECTCOM + (1000 * ORDER_FLAG))
                BREAK
        ELSE
            ;COMABLEを満たさないコマンドの優先度を0に
            COM_REACTION_PRIORITY:(REACTION_SELECTCOM + (1000 * ORDER_FLAG)) = 0
        ENDIF
        ;実行可能なコマンドがない
    ELSE
        CALL CLEAR_MTAR()
        CALL CLEAR_MPLY()
        BREAK
    ENDIF
    DEBUGPRINTFORML @COM_REACTION_MAIN REACTION_SELECTCOM{REACTION_SELECTCOM}の実行に失敗
    REACTION_SELECTCOM = -1
    TRY_COUNT ++
WEND
;COMABLE判定用に立てたフラグを初期化
COM_ENABLE = 0
TFLAG:リアクションコマンド実行 = 0
TFLAG:割込コマンド実行 = 0

;実行可能なコマンドが一つもない、または"なにもしない"が抽選された
IF REACTION_SELECTCOM == -1 || REACTION_SELECTCOM == T_N("なにもしない")
    DEBUGPRINTFORML @COM_REACTION_MAIN 実行可能なコマンドなし
    ;判定用に書き換えたMTAR,MPLY,主導権所有者情報を元に戻す
    CALL CLEAR_MTAR()
    CALL CLEAR_MPLY()
    FOR LOCAL, 0, 100
        IF COM_REACTION_実行前MPLY:LOCAL != -1 && (CFLAG:(COM_REACTION_実行前MPLY:LOCAL):調教参加フラグ == 1 || COM_REACTION_実行前MPLY:LOCAL == MASTER)
            CALL ADD_MPLY(COM_REACTION_実行前MPLY:LOCAL)
        ENDIF
        IF COM_REACTION_実行前MTAR:LOCAL != -1 && (CFLAG:(COM_REACTION_実行前MTAR:LOCAL):調教参加フラグ == 1 || COM_REACTION_実行前MTAR:LOCAL == MASTER)
            CALL ADD_MTAR(COM_REACTION_実行前MTAR:LOCAL)
        ENDIF
    NEXT
    FLAG:主導権所有者 = COM_REACTION_実行前主導権
    RETURN -1
ENDIF

;継続判定
CALL COM_REACTION_SET_EQUIP(REACTION_SELECTCOM, COM_REACTION_MAIN_PLAYER)

IF COM_INTERRUPTION_MAIN_PLAYER != -1
    TFLAG:割込コマンド実行 = 1
    TFLAG:割込キャラ = COM_INTERRUPTION_MAIN_PLAYER
    TFLAG:割込ターゲット = COM_REACTION_TARGET
    TFLAG:割込人数 = 1
    CALL COM_REACTION_GET_INTERRUPTED_CHARA()
    TFLAG:割込まれたキャラ = RESULT
ELSE
    TFLAG:リアクションコマンド実行 = 1
ENDIF
;第三者追加判定
CALL COM_REACTION_ADD_THIRD_PERSON(REACTION_SELECTCOM)
IF ORDER_FLAG
    CALL COM_REACTION_ADD_THIRD_PERSON(REACTION_SELECTCOM, 1)
ENDIF

; DEBUGPRINTFORML @COM_REACTION_MAIN_PLAYER:{COM_REACTION_MAIN_PLAYER}
; DEBUGPRINTFORML @COM_REACTION_TARGET:{COM_REACTION_TARGET}
; DEBUGPRINTFORML @COM:{REACTION_SELECTCOM} REACTION
;リアクションコマンドを確定
RETURN REACTION_SELECTCOM


code:
;-------------------------------------------------
;介入コマンド優先度定義
;-------------------------------------------------
; #region @COM_INTERRUPTION_SET_PRIORITY
@COM_INTERRUPTION_SET_PRIORITY(CHARA_ID, TARGET_ID)
#DIM CHARA_ID
#DIM TARGET_ID
#DIM DYNAMIC PLY_欲情レベル
#DIM DYNAMIC TGT_誘惑レート

VARSET COM_REACTION_PRIORITY
PLY_欲情レベル = GET_PALAMLV(PALAM:(CHARA_ID):欲情)
CALL SKILL_GET_LEVEL(TARGET_ID, スキル_大分類_性技, "SEDUCTION")
TGT_誘惑レート = RESULT

SELECTCASE SELECTCOM
    CASE T_N("スキンシップ")
        COM_REACTION_PRIORITY:T_N("スキンシップ") = 1000
    CASE T_N("キス")
        COM_REACTION_PRIORITY:T_N("キス")        = 1500
        COM_REACTION_PRIORITY:T_N("愛撫")        = 1000
    CASE T_N("フェラチオ"),T_N("玉舐め"),T_N("亀頭責めフェラ")
        COM_REACTION_PRIORITY:T_N("玉舐め") = 1000
        COM_REACTION_PRIORITY:T_N("亀頭責めフェラ") = 1000
        COM_REACTION_PRIORITY:T_N("フェラチオ") = 1500
        SIF IS_ESTRUS(CHARA_ID)
            COM_REACTION_PRIORITY:T_N("アナル舐め") = 1000 + (500 * (RAND:PLY_欲情レベル))
        IF ABL:CHARA_ID:自慰 > 3
            IF HAS_PENIS(CHARA_ID)
                COM_REACTION_PRIORITY:T_N("Ｐ自慰") = 750 + ABL:CHARA_ID:自慰 * 100
            ELSE
                COM_REACTION_PRIORITY:T_N("Ｃ自慰") = 750 + ABL:CHARA_ID:自慰 * 100
            ENDIF
        ENDIF
    CASE  T_N("パイズリ")
        COM_REACTION_PRIORITY:T_N("パイズリ") = 3000
        COM_REACTION_PRIORITY:T_N("亀頭責めフェラ") = 1000
    CASE  T_N("手コキ"),T_N("玉揉み"),T_N("亀頭責め手コキ")
        COM_REACTION_PRIORITY:T_N("手コキ") = 1500
        COM_REACTION_PRIORITY:T_N("フェラチオ") = 750
        COM_REACTION_PRIORITY:T_N("亀頭責めフェラ") = 750
        COM_REACTION_PRIORITY:T_N("亀頭責め手コキ") = 1500
    CASE  T_N("足コキ")
        IF IS_MTAR(TARGET_ID)
            COM_REACTION_PRIORITY:T_N("足コキ") = 1000
            COM_REACTION_PRIORITY:T_N("なにもしない") = 1000 - ABL:CHARA_ID:サド * 200
        ENDIF
    CASE T_N("正常位"),T_N("後背位"),T_N("立ちバック"),T_N("順番に挿入")
        IF GROUPMATCH(SELECTCOM, T_N("後背位"), T_N("立ちバック"))
            COM_REACTION_PRIORITY:(T_N("順番に挿入") + COM_REACTION_命令) = 150000 + (1000 * (RAND:PLY_欲情レベル))
        ENDIF
        SIF IS_ESTRUS(CHARA_ID)
            COM_REACTION_PRIORITY:T_N("アナル舐め") = 1000 + (500 * (RAND:PLY_欲情レベル))
    CASE T_N("騎乗位"),T_N("背面騎乗位"),T_N("Ａ騎乗位"),T_N("Ａ背面騎乗位")
        COM_REACTION_PRIORITY:T_N("乳首責め") = 1500
        COM_REACTION_PRIORITY:T_N("乳首吸い") = 1500
        COM_REACTION_PRIORITY:T_N("顔面騎乗") = 1200 + ABL:CHARA_ID:サド * 200
        COM_REACTION_PRIORITY:T_N("Ａ顔面騎乗") = 1200 + ABL:CHARA_ID:サド * 200
        COM_REACTION_PRIORITY:T_N("Ｗ顔面騎乗") = 1200 + ABL:CHARA_ID:サド * 200
        COM_REACTION_PRIORITY:T_N("足を舐める") = 1000 + ABL:CHARA_ID:マゾ * 200
    CASEELSE
ENDSELECT

;誰かに挿入コマンドを実行している場合の共通処理
IF GET_INSERT_TARGET(TARGET_ID) != -1 && IS_LOVER(CHARA_ID)
    COM_REACTION_PRIORITY:T_N("愛撫")        = 1000
    COM_REACTION_PRIORITY:T_N("胸愛撫")        = 1000
    COM_REACTION_PRIORITY:T_N("キス")        = 1000
    IF ABL:CHARA_ID:自慰 > 3 && IS_ESTRUS(CHARA_ID)
        IF HAS_PENIS(CHARA_ID)
            COM_REACTION_PRIORITY:T_N("Ｐ自慰") = 750 + ABL:CHARA_ID:自慰 * 100
        ELSE
            COM_REACTION_PRIORITY:T_N("Ｃ自慰") = 750 + ABL:CHARA_ID:自慰 * 100
        ENDIF
    ENDIF
ENDIF

IF FLAG:ウフフフラグ && IS_LOVER(CHARA_ID) && C_COND("人目:0",,CHARA_ID) && !(C_COND("露出:胸",,CHARA_ID) && C_COND("露出:秘部",,CHARA_ID) )
    COM_REACTION_PRIORITY:T_N("服を脱ぐ")        =  1000 + (PLY_欲情レベル * 200)
    COM_REACTION_PRIORITY:T_N("服を脱がす")        =  1000 + (PLY_欲情レベル * 200)
ENDIF

; #endregion

;スケベモブ用のINTERRUPTION判定
; #region @COM_MOLESTATION_SET_PRIORITY
@COM_MOLESTATION_SET_PRIORITY(CHARA_ID, TARGET_ID)
#DIM CHARA_ID
#DIM TARGET_ID
#DIM DYNAMIC PLY_欲情レベル
#DIM DYNAMIC TGT_誘惑レート

VARSET COM_REACTION_PRIORITY
PLY_欲情レベル = GET_PALAMLV(PALAM:(CHARA_ID):欲情)
CALL SKILL_GET_LEVEL(TARGET_ID, スキル_大分類_性技, "SEDUCTION")
TGT_誘惑レート = RESULT
SIF !TGT_誘惑レート
    RETURN
IF CFLAG:CHARA_ID:スケベモブ && IS_SEXUAL(CHARA_ID, TARGET_ID)
    COM_REACTION_PRIORITY:T_N("スキンシップ") = 1000
    IF IS_ESTRUS(CHARA_ID, 3)
        COM_REACTION_PRIORITY:T_N("愛撫")       = 750 + (PLY_欲情レベル * 200)
        COM_REACTION_PRIORITY:T_N("胸愛撫")     = 750 + (PLY_欲情レベル * 200)
    ENDIF
ENDIF
; #endregion

;観客用のINTERRUPTION判定
; #region @COM_CHEERING_SET_PRIORITY
@COM_CHEERING_SET_PRIORITY(CHARA_ID, TARGET_ID)
#DIM CHARA_ID
#DIM TARGET_ID
#DIM DYNAMIC PLY_欲情レベル
#DIM DYNAMIC TGT_露出度
#DIM DYNAMIC TGT_誘蛾の色香
DEBUGPRINTFORML CHARA_ID = {CHARA_ID}, TARGET_ID = {TARGET_ID}

VARSET COM_REACTION_PRIORITY
PLY_欲情レベル = GET_PALAMLV(PALAM:(CHARA_ID):欲情)
CALL SKILL_GET_LEVEL(TARGET_ID, スキル_大分類_性技, "SEDUCTION")
TGT_誘蛾の色香 = RESULT
SELECTCASE SELECTCOM
    CASE T_N("演奏する"), T_N("踊る")
        IF FLAG:クエストモード
            COM_REACTION_PRIORITY:T_N("声援")        = 1000
            COM_REACTION_PRIORITY:T_N("なにもしない") = MAX(500, 1000 - 100 * TFLAG:公演_連続成功数)
            CALL HO_CHECK_NAKED(TARGET_ID)
            TGT_露出度 = RESULT
            IF TFLAG:公演_趣向 == 1
                IF IS_SEXUAL(CHARA_ID, TARGET_ID)
                    COM_REACTION_PRIORITY:T_N("見つめあう")        = (300 * TGT_露出度) + (100 * PLY_欲情レベル)
                    COM_REACTION_PRIORITY:T_N("Ｃ自慰")        = (200 * TGT_露出度) + (150 * PLY_欲情レベル)
                    COM_REACTION_PRIORITY:T_N("Ｐ自慰")        = (200 * TGT_露出度) + (150 * PLY_欲情レベル)
                ENDIF
            ELSE
                IF IS_SEXUAL(CHARA_ID, TARGET_ID)
                    COM_REACTION_PRIORITY:T_N("見つめあう")        = 200 + (400 * TGT_誘蛾の色香)
                ENDIF
            ENDIF
        ENDIF
ENDSELECT
; #endregion


code:
;-------------------------------------------------
;抽選対象のコマンドを条件別に定義
;COM_REACTION_命令をコマンド値に加算したものは、CHARA_IDの命令でTARGET_IDにＸＸさせるの形(MPLYはTARGET_ID)でリアクションとして処理される
;-------------------------------------------------
@COM_REACTION_SET_PRIORITY(CHARA_ID, TARGET_ID)
#DIM CHARA_ID
#DIM TARGET_ID
#DIM DYNAMIC PLY_欲情レベル
#DIM DYNAMIC TGT_誘惑レート

VARSET COM_REACTION_PRIORITY
PLY_欲情レベル = GET_PALAMLV(PALAM:(CHARA_ID):欲情)
CALL SKILL_GET_LEVEL(TARGET_ID, スキル_大分類_性技, "SEDUCTION")
TGT_誘惑レート = RESULT

SELECTCASE SELECTCOM
    CASE T_N("会話")
        ;スケベモブの商談リアクション
        IF CFLAG:CHARA_ID:スケベモブ && TGT_誘惑レート> 0 && IS_SEXUAL(CHARA_ID, TARGET_ID)
            COM_REACTION_PRIORITY:T_N("スキンシップ") = 750
            IF IS_ESTRUS(CHARA_ID, 3 - TGT_誘惑レート)
                COM_REACTION_PRIORITY:T_N("愛撫")       = 1000 + (PLY_欲情レベル * 100)
                COM_REACTION_PRIORITY:T_N("胸愛撫")     = 1000 + (PLY_欲情レベル * 100)
            ENDIF
            IF IS_ESTRUS(CHARA_ID, 5 - TGT_誘惑レート)
                COM_REACTION_PRIORITY:T_N("ソフトキス")     = 1000 + (PLY_欲情レベル * 100)
                COM_REACTION_PRIORITY:T_N("抱きしめる")  = 750 + (PLY_欲情レベル * 300)
            ENDIF
            IF IS_ESTRUS(CHARA_ID, 6 - TGT_誘惑レート)
                COM_REACTION_PRIORITY:T_N("キス")       = 750 + (PLY_欲情レベル * 300)
            ENDIF
        ENDIF
    CASE T_N("スキンシップ")
        COM_REACTION_PRIORITY:T_N("スキンシップ") = 1500
        IF IS_LOVER(CHARA_ID)
            COM_REACTION_PRIORITY:T_N("ソフトキス") = 1000
            CALL HO_CHECK_PUBLIC_EYE(MASTER)
            IF !RESULT && GROUPMATCH(TOSTR_EMOTION(CHARA_ID), "幸", "悦")
                COM_REACTION_PRIORITY:T_N("キス") = 750 + (PLY_欲情レベル * 100)
                COM_REACTION_PRIORITY:T_N("抱きしめる")       = 750 + (PLY_欲情レベル * 100)
                IF GET_PALAMLV(PALAM:(CHARA_ID):欲情) > 7
                    COM_REACTION_PRIORITY:T_N("愛撫")       = 750 + (PLY_欲情レベル * 100)
                    COM_REACTION_PRIORITY:T_N("胸愛撫")     = 750 + (PLY_欲情レベル * 100)
                    COM_REACTION_PRIORITY:T_N("キス")      += 500 + (PLY_欲情レベル * 100)
                    COM_REACTION_PRIORITY:T_N("指フェラ")   = 500 + (PLY_欲情レベル * 150)
                    COM_REACTION_PRIORITY:T_N("手コキ")     = 500 + (PLY_欲情レベル * 150)
                ENDIF
            ENDIF
        ENDIF
    CASE T_N("見つめあう")
        IF TARGET_ID == MASTER
            SELECTCASE C_COND_MAP_GETS(TARGET_ID, "視線")
                CASE "顔"
                    IF IS_LOVER(CHARA_ID)
                        COM_REACTION_PRIORITY:T_N("ソフトキス") = 1000
                        COM_REACTION_PRIORITY:T_N("抱きしめる") = 500 + (PLY_欲情レベル * 150)
                        COM_REACTION_PRIORITY:T_N("キス") = 200 + (PLY_欲情レベル * 150)
                        COM_REACTION_PRIORITY:T_N("なにもしない") = 1000
                    ENDIF
                CASE "股"
                    IF IS_LOVER(CHARA_ID) && C_COND("快感ＬＶ:欲情:> 5",, CHARA_ID)
                        IF C_COND("人目:0",, CHARA_ID)
                            COM_REACTION_PRIORITY:T_N("服を脱ぐ") = 1000
                            IF HAS_PENIS(CHARA_ID)
                                COM_REACTION_PRIORITY:T_N("Ｐ自慰") = 100 + (ABL:CHARA_ID:自慰 * 200)
                            ELSE
                                COM_REACTION_PRIORITY:T_N("Ｃ自慰") = 100 + (ABL:CHARA_ID:自慰 * 200)
                            ENDIF
                        ENDIF
                        COM_REACTION_PRIORITY:T_N("なにもしない") = 2000 - (PLY_欲情レベル * 100)
                    ENDIF
                    COM_REACTION_PRIORITY:T_N("なにもしない") = 2000 - (PLY_欲情レベル * 50)
                CASE "尻", "胸", "鑑賞"
                    IF IS_LOVER(CHARA_ID) && C_COND("快感ＬＶ:欲情:> 5",, CHARA_ID)
                        IF C_COND("人目:0",, CHARA_ID)
                            COM_REACTION_PRIORITY:T_N("服を脱ぐ") = 1000
                        ENDIF
                        IF C_COND("素質:自慰狂い",, CHARA_ID)
                            IF HAS_PENIS(CHARA_ID)
                                COM_REACTION_PRIORITY:T_N("Ｐ自慰") = 100 + (ABL:CHARA_ID:自慰 * 200)
                            ELSE
                                COM_REACTION_PRIORITY:T_N("Ｃ自慰") = 100 + (ABL:CHARA_ID:自慰 * 200)
                            ENDIF
                        ENDIF
                    ENDIF
                    COM_REACTION_PRIORITY:T_N("なにもしない") = 2000 - (PLY_欲情レベル * 100)
                CASEELSE
            ENDSELECT
        ELSE
            SELECTCASE C_COND_MAP_GETS(TARGET_ID, "視線")
                CASE "股", "尻", "胸", "鑑賞"
                    IF TFLAG:奉仕モード && CHECK_EMOTION(CHARA_ID, "GOOD")
                        IF C_COND("能力:露出:>= 4",, CHARA_ID)
                            COM_REACTION_PRIORITY:T_N("服を脱ぐ") = 1000
                            COM_REACTION_PRIORITY:T_N("なにもしない") = 2000 - (PLY_欲情レベル * 100)
                        ENDIF
                    ENDIF
            ENDSELECT
        ENDIF
    CASE T_N("膝枕する")
        IF IS_MPLY(CHARA_ID)
            COM_REACTION_PRIORITY:T_N("スキンシップ") = 1000
            COM_REACTION_PRIORITY:T_N("頭を撫でる") = 1500
            IF IS_LOVER(CHARA_ID)
                COM_REACTION_PRIORITY:T_N("ソフトキス") = 1000 + (PLY_欲情レベル * 100)
                COM_REACTION_PRIORITY:T_N("キス") = 750 + (PLY_欲情レベル * 100)
                IF IS_ESTRUS(CHARA_ID) && IS_ESTRUS(TARGET_ID)
                    COM_REACTION_PRIORITY:T_N("愛撫")       = 750 + (PLY_欲情レベル * 100)
                    COM_REACTION_PRIORITY:T_N("胸愛撫")       = 750 + (PLY_欲情レベル * 100)
                    COM_REACTION_PRIORITY:T_N("手コキ") = 1000 + (PLY_欲情レベル * 100)
                    COM_REACTION_PRIORITY:T_N("亀頭責め手コキ") = 1000 + (PLY_欲情レベル * 100)
                    COM_REACTION_PRIORITY:T_N("玉揉み") = 1000 + (PLY_欲情レベル * 100)
                ENDIF
            ENDIF
        ENDIF
    CASE T_N("抱きしめる")
        COM_REACTION_PRIORITY:T_N("抱きしめる") = 2250
        COM_REACTION_PRIORITY:T_N("スキンシップ") = 1500
        COM_REACTION_PRIORITY:T_N("頭を撫でる") = 1500
        IF IS_LOVER(CHARA_ID)
            COM_REACTION_PRIORITY:T_N("ソフトキス") = 1000
            CALL HO_CHECK_PUBLIC_EYE(MASTER)
            IF !RESULT && GROUPMATCH(TOSTR_EMOTION(CHARA_ID), "幸", "悦")
                COM_REACTION_PRIORITY:T_N("キス") = 750 + (PLY_欲情レベル * 100)
                IF GET_PALAMLV(PALAM:(CHARA_ID):欲情) > 7
                    COM_REACTION_PRIORITY:T_N("愛撫")       = 750 + (PLY_欲情レベル * 100)
                    COM_REACTION_PRIORITY:T_N("胸愛撫")       = 750 + (PLY_欲情レベル * 100)
                ENDIF
            ENDIF
        ENDIF
    CASE T_N("頭を撫でる")
        IF IS_MTAR(CHARA_ID)
            IF CHECK_EMOTION(CHARA_ID, "GOOD") && (IS_SERVEAT(CHARA_ID, "口", "フェラ") || IS_SERVEAT(CHARA_ID, "手", "手コキ"))
                COM_REACTION_PRIORITY:T_N("手コキ")         = 1000
                COM_REACTION_PRIORITY:T_N("フェラチオ")     = 2000
                COM_REACTION_PRIORITY:T_N("玉舐め")         = 1500
                COM_REACTION_PRIORITY:T_N("亀頭責め手コキ")  = 1000
                COM_REACTION_PRIORITY:T_N("亀頭責めフェラ")  = 1500
            ELSEIF IS_ESTRUS(CHARA_ID, 7) && IS_FALL(CHARA_ID) && !IS_M_HOLD(CHARA_ID)
                COM_REACTION_PRIORITY:T_N("指フェラ") = 1000 +  (PLY_欲情レベル * 100)
            ENDIF
            COM_REACTION_PRIORITY:(T_N("頭を撫でる") + COM_REACTION_命令) =  1500
        ENDIF
        COM_REACTION_PRIORITY:T_N("なにもしない") = 2000 - (PLY_欲情レベル * 150)
    CASE T_N("舌を這わす")
        IF IS_MPLY(CHARA_ID)
            DEBUGPRINTFORML {COM_OPTION:28}
            IF COM_OPTION:28 == 5 ;耳舐め
                COM_REACTION_PRIORITY:T_N("囁きかける") = 1000
            ENDIF
        ENDIF
    CASE T_N("酒を飲む")
        IF IS_MTAR(CHARA_ID)
            COM_REACTION_PRIORITY:(T_N("会話") + COM_REACTION_命令) =  1500
            COM_REACTION_PRIORITY:(T_N("スキンシップ")) =  1000
            COM_REACTION_PRIORITY:(T_N("酒を飲む")) =  1000
            IF TALENT:CHARA_ID:酒豪 && IS_DRUNK(CHARA_ID) < 3
                COM_REACTION_PRIORITY:(T_N("酒を飲む") + COM_REACTION_命令) =  1250
            ENDIF
        ENDIF
    CASE T_N("愛撫"), T_N("胸愛撫"), T_N("キス")
        COM_REACTION_PRIORITY:T_N("キス")        = 1500
        COM_REACTION_PRIORITY:T_N("愛撫")        = 1000
        COM_REACTION_PRIORITY:T_N("胸愛撫")      = 1000
        IF IS_MTAR(CHARA_ID)
            IF SELECTCOM == T_N("愛撫")
                COM_REACTION_PRIORITY:T_N("指フェラ") = 750
            ENDIF
        ENDIF
    CASE T_N("貝合わせ")
        COM_REACTION_PRIORITY:(SELECTCOM) = 1000
        COM_REACTION_PRIORITY:(SELECTCOM + COM_REACTION_命令) = 1000
    CASE T_N("Ｐ自慰"), T_N("Ｃ自慰")
        IF IS_MTAR(CHARA_ID)
            ;精飲おねだり
            SIF SELECTCOM == T_N("Ｐ自慰") && IS_FALL(CHARA_ID) && ABL:CHARA_ID:精愛 >= 4 && !IS_PREV_MPLY(CHARA_ID)
                COM_REACTION_PRIORITY:T_N("おねだり") = 1000 * ABL:CHARA_ID:精愛
            IF ABL:CHARA_ID:自慰 >= 4 && IS_FALL(CHARA_ID) && IS_ESTRUS(CHARA_ID)
                COM_REACTION_PRIORITY:T_N("Ｃ自慰") = 1000 + (ABL:CHARA_ID:自慰 * 200)
                COM_REACTION_PRIORITY:T_N("亀頭責め手コキ") = 1000
                COM_REACTION_PRIORITY:T_N("なにもしない") = 2000 - (PLY_欲情レベル * 150)
            ENDIF
        ENDIF
    CASE T_N("パイズリ")
        IF IS_MPLY(CHARA_ID)
            COM_REACTION_PRIORITY:(SELECTCOM) = 2000
            COM_REACTION_PRIORITY:T_N("亀頭責めフェラ") = MIN(2500, 800 + (250 * ABL:CHARA_ID:精愛))
        ENDIF
    CASE T_N("手コキ"), T_N("玉揉み"), T_N("亀頭責め手コキ")
        IF IS_MPLY(CHARA_ID)
            COM_REACTION_PRIORITY:T_N("フェラチオ") = 2000 + (250 * ABL:CHARA_ID:精愛)
            COM_REACTION_PRIORITY:T_N("玉舐め") = 1500
            COM_REACTION_PRIORITY:T_N("亀頭責め手コキ") = 3000
            COM_REACTION_PRIORITY:T_N("亀頭責めフェラ") = 2000 + (250 * ABL:CHARA_ID:精愛)
            ;精飲おねだり
            SIF ABL:CHARA_ID:精愛 >= 4
                COM_REACTION_PRIORITY:T_N("おねだり") = 2000 + (250 * ABL:CHARA_ID:精愛) + (C_COND("素質:精飲中毒",,CHARA_ID) * 1000)
        ELSE
            COM_REACTION_PRIORITY:(T_N("亀頭責め手コキ") + COM_REACTION_命令)= 1000
            COM_REACTION_PRIORITY:(T_N("手コキ") + COM_REACTION_命令) = 1500
            COM_REACTION_PRIORITY:(T_N("玉揉み") + COM_REACTION_命令) = 1000
        ENDIF
    CASE T_N("フェラチオ"),T_N("玉舐め"),T_N("亀頭責めフェラ")
        IF IS_MPLY(CHARA_ID)
            COM_REACTION_PRIORITY:T_N("玉舐め") = 1500
            COM_REACTION_PRIORITY:T_N("亀頭責めフェラ") = 2000
            COM_REACTION_PRIORITY:T_N("フェラチオ") = 1000
            IF ABL:CHARA_ID:自慰 > 2
                IF HAS_PENIS(CHARA_ID)
                    COM_REACTION_PRIORITY:T_N("Ｐ自慰") = 750
                ELSE
                    COM_REACTION_PRIORITY:T_N("Ｃ自慰") = 750
                ENDIF
            ENDIF
            SIF ABL:CHARA_ID:精愛 > 3 && !IS_EQUIP_PLAYER(T_N("抱きしめる"))
                COM_REACTION_PRIORITY:T_N("抱きしめる") = 1500
            COM_REACTION_PRIORITY:T_N("フェラチオ") = 1000
        ELSE
            COM_REACTION_PRIORITY:(T_N("フェラチオ") + COM_REACTION_命令)= 1200
            COM_REACTION_PRIORITY:(T_N("亀頭責めフェラ") + COM_REACTION_命令) = 1200
            COM_REACTION_PRIORITY:(T_N("玉舐め") + COM_REACTION_命令) = 1000
            SIF ABL:CHARA_ID:サド > 2
                COM_REACTION_PRIORITY:(T_N("イラマチオ")) = 3000
        ENDIF
    CASE T_N("正常位"), T_N("対面座位"), T_N("騎乗位")
        IF IS_MPLY(CHARA_ID)
            COM_REACTION_PRIORITY:SELECTCOM =  1200
            COM_REACTION_PRIORITY:T_N("愛撫") = 1000
            COM_REACTION_PRIORITY:T_N("胸愛撫") = 1000
            COM_REACTION_PRIORITY:T_N("乳首責め") = 800
            COM_REACTION_PRIORITY:T_N("乳首吸い") = 800
            COM_REACTION_PRIORITY:T_N("囁きかける") = 1000
            IF GROUPMATCH(SELECTCOM, T_N("正常位"), T_N("対面座位"))
                COM_REACTION_PRIORITY:T_N("キス") = 1200
                COM_REACTION_PRIORITY:T_N("抱きしめる") = 800
                COM_REACTION_PRIORITY:(T_N("抱きしめる") + COM_REACTION_命令) = 800
            ENDIF
        ELSE
            COM_REACTION_PRIORITY:T_N("愛撫") = 1000
            COM_REACTION_PRIORITY:T_N("胸愛撫") = 1000
            IF IS_FALL(CHARA_ID) && TARGET_ID == MASTER
                COM_REACTION_PRIORITY:T_N("囁きかける") = 1500
                COM_REACTION_PRIORITY:T_N("キス") = 3000
                IF GROUPMATCH(SELECTCOM, T_N("正常位"), T_N("対面座位"))
                    COM_REACTION_PRIORITY:T_N("抱きしめる") = 1000
                    COM_REACTION_PRIORITY:(T_N("抱きしめる") + COM_REACTION_命令) = 1000
                ENDIF
                IF SELECTCOM == T_N("騎乗位") && !IS_TIRED(CHARA_ID, 20)
                    COM_REACTION_PRIORITY:(T_N("騎乗位") + COM_REACTION_命令) =  5000
                    COM_REACTION_PRIORITY:(T_N("背面騎乗位") + COM_REACTION_命令) =  1500
                    COM_REACTION_PRIORITY:(T_N("なにもしない")) =  2000 - (PLY_欲情レベル * 100)
                ENDIF
            ENDIF
        ENDIF
    CASE T_N("後背位"), T_N("立ちバック"),T_N("Ａ後背位"),T_N("Ａ立ちバック")
        IF IS_MPLY(CHARA_ID)
            COM_REACTION_PRIORITY:(SELECTCOM) =  1000
            COM_REACTION_PRIORITY:T_N("抱きしめる") = 800
            SIF ABL:CHARA_ID:サド > 2 && ABL:TARGET_ID:マゾ > 2
                COM_REACTION_PRIORITY:(T_N("スパンキング")) =  800
        ELSE
            COM_REACTION_PRIORITY:(SELECTCOM + COM_REACTION_命令) =  1000
            COM_REACTION_PRIORITY:(T_N("抱きしめる") + COM_REACTION_命令) = 800
            SIF ABL:CHARA_ID:マゾ > 2 && ABL:TARGET_ID:サド > 2
                COM_REACTION_PRIORITY:(T_N("スパンキング")+ COM_REACTION_命令) =  800
        ENDIF
    CASE T_N("背面騎乗位")
        IF !IS_TIRED(CHARA_ID, 20)
            IF ABL:CHARA_ID:自慰 > 4
                COM_REACTION_PRIORITY:T_N("Ｃ自慰") = 1000
            ENDIF
            COM_REACTION_PRIORITY:(T_N("騎乗位") + COM_REACTION_命令) =  1500
            COM_REACTION_PRIORITY:(T_N("背面騎乗位") + COM_REACTION_命令) =  5000
            COM_REACTION_PRIORITY:(T_N("なにもしない")) =  2000 - (PLY_欲情レベル * 100)
        ENDIF
    CASE  T_N("乳首吸い")
        IF IS_MPLY(CHARA_ID)
            COM_REACTION_PRIORITY:(SELECTCOM) = 1200
            COM_REACTION_PRIORITY:T_N("愛撫") = 1000
            COM_REACTION_PRIORITY:T_N("胸愛撫") = 1200
        ELSE
            COM_REACTION_PRIORITY:T_N("頭を撫でる") =  750
            COM_REACTION_PRIORITY:T_N("亀頭責め手コキ")         = 1400 + (PLY_欲情レベル * 200)
            COM_REACTION_PRIORITY:T_N("愛撫")         = 1000
            COM_REACTION_PRIORITY:T_N("手コキ")         = 1400 + (PLY_欲情レベル * 200)
        ENDIF
    CASE T_N("演奏する"), T_N("踊る")
        IF C_COND("行動:鑑賞中",,CHARA_ID)
            COM_REACTION_PRIORITY:T_N("声援") = 9999
        ENDIF
    CASEELSE
ENDSELECT

;おねだり充足
IF TCVAR:CHARA_ID:精飲おねだりフラグ == 2
    COM_REACTION_PRIORITY:T_N("おねだり") += 99999
ENDIF

IF FLAG:ウフフフラグ && IS_LOVER(CHARA_ID) && C_COND("人目:0",,CHARA_ID) && RAND:10 < 4
    IF CAN_REACH_BODY(CHARA_ID, TARGET_ID)
        COM_REACTION_PRIORITY:T_N("服を脱ぐ")        =  1000 + (PLY_欲情レベル * 200)
        COM_REACTION_PRIORITY:T_N("服を脱がす")        =  1000 + (PLY_欲情レベル * 200)
    ENDIF
    COM_REACTION_PRIORITY:T_N("なにもしない") = MAX(COM_REACTION_PRIORITY:T_N("なにもしない"), 1000)
ENDIF

IF TFLAG:リアクションコマンド予約 != -1
    DEBUGPRINTFORML TFLAG:リアクションコマンド予約 = {TFLAG:リアクションコマンド予約}
    COM_REACTION_PRIORITY:(TFLAG:リアクションコマンド予約) = TFLAG:リアクションコマンド予約重み
    TFLAG:リアクションコマンド予約 = -1
    TFLAG:リアクションコマンド予約重み = 0
ENDIF


code:
;交流終了時の処理／イベント

;-------------------------------------------------
;交流終了
;-------------------------------------------------
@FL_EVENTEND
#DIM DYNAMIC CHARA_ID
#DIM DYNAMIC SKILL_LV
#DIM DYNAMIC AMOUNT

[IF_DEBUG]
DEBUGPRINTFORML @EVENTEND CALLED
[ENDIF]
CALL FL_EVENTEND_KOJO

;体力気力を0～最大値の範囲に収める
CALL LIFE_LIMIT

TRAIN_PLACE =

FLAG:夜這い = 0

IF FLAG:調教モード == 調教_慰安
	SELECTCASE FLAG:慰安モード
		CASE 1
			CALL EVENTEND_IAN
		CASE 2
			CALL EVENTEND_ATEGAU
	ENDSELECT
	FLAG:慰安モード = 0
ENDIF

SIF FLAG:調教モード == 調教_逆調教特殊 && IS_SP_COUNTRY(CFLAG:MASTER:捕虜先)
	CALL EVENTEND_SP_COUNTRY()

SIF FLAG:クエストモード
	CALL QUEST_EVENTEND()

CUSTOMDRAWLINE ─
CALL TITLE_CATEGORY_GENERAL("今回の調教")
PRINTL
CALL COLOR_LINE
FOR CHARA_ID, 0, CHARANUM
	IF FLAG:ハウジングモード && !FLAG:クエストモード
		IF !CFLAG:CHARA_ID:交流参加 || !IS_SAME_FACTION(CHARA_ID)
			CONTINUE
		ENDIF
		IF CFLAG:CHARA_ID:慰安モブ
			CONTINUE
		ENDIF
	ELSEIF !IS_PARTICIPATE_TRAIN(CHARA_ID)
		CONTINUE
	ENDIF
	PRINTFORML ■%ANAME(CHARA_ID)%:
	CALL NEW_PRINT_ORGASM(CHARA_ID)
	CALL COLOR_LINE
NEXT
WAIT

;慰安用のモブはここで削除する
LOCAL:2 = CHARANUM
FOR LOCAL:0, 0, LOCAL:2
	LOCAL:1 = LOCAL:2 - LOCAL:0 - 1
	IF CFLAG:(LOCAL:1):慰安モブ
		CALL MOB_PREGNANT(LOCAL:1)
		CALL DELETE_CHARA(LOCAL:1)
	ENDIF
NEXT

;体力気力の成長
FOR CHARA_ID, 0, CHARANUM
	IF FLAG:ハウジングモード && !FLAG:クエストモード
		IF !CFLAG:CHARA_ID:交流参加 || !IS_SAME_FACTION(CHARA_ID)
			CONTINUE
		ENDIF
	ELSEIF !IS_PARTICIPATE_TRAIN(CHARA_ID)
		CONTINUE
	ENDIF

	LOCAL:1 = MIN(SUM_EX(CHARA_ID) / 5, 20)
	LOCAL:1 += RAND:MAX(TCVAR:CHARA_ID:体力上昇最大値, 1)
	SELECTCASE MAXBASE:CHARA_ID:体力
		CASE IS > 5000
			LOCAL:1 /= 10
		CASE IS > 3000
			LOCAL:1 /= 4
	ENDSELECT

	SIF LOCAL:1 <= 0
		GOTO STR_GROW_END

	PRINTFORML %ANAME(CHARA_ID)%の体力 + {LOCAL:1}
	MAXBASE:CHARA_ID:体力 += LOCAL:1

	$STR_GROW_END

	LOCAL:1 = MIN(SUM_EX(CHARA_ID) / 5, 10)
	LOCAL:1 += RAND:MAX(TCVAR:CHARA_ID:気絶回数, 1)

	SELECTCASE MAXBASE:CHARA_ID:気力
		CASE IS > 5000
			LOCAL:1 /= 10
		CASE IS > 3000
			LOCAL:1 /= 4
	ENDSELECT

	SIF LOCAL:1 <= 0
		GOTO WILL_GROW_END

	MAXBASE:CHARA_ID:気力 += LOCAL:1
	PRINTFORML %ANAME(CHARA_ID)%の気力 + {LOCAL:1}

	$WILL_GROW_END
	;現在の酔いを酔い合計値に加算
	SIF IS_PARTICIPATE_TRAIN(CHARA_ID) && !IS_SP_CHARA(CHARA_ID)
		CFLAG:(CHARA_ID):酔い累積値 += PALAM:(CHARA_ID):酔い
NEXT

FOR LOCAL:0, 0, CHARANUM
	SIF CFLAG:LOCAL:強制友好化
		CFLAG:LOCAL:強制友好化 = 0
	SIF CFLAG:LOCAL:調教中BASE減らない
		CFLAG:LOCAL:調教中BASE減らない = 0
NEXT

IF FLAG:ハウジングモード && !FLAG:クエストモード
ELSE
	FOR CHARA_ID, 0, CHARANUM
		SIF !IS_PARTICIPATE_TRAIN(CHARA_ID)
			CONTINUE
		;初対面のキャラの対面済みフラグをＯＮ
		SIF CHARA_ID != MASTER && !CFLAG:(CHARA_ID):面識
			CFLAG:(CHARA_ID):面識 = 1
		;調教参加者同士の印象値が改善される
		FOR LOCAL:1, 0, CHARANUM
			SIF LOCAL:1 == CHARA_ID || !IS_PARTICIPATE_TRAIN(LOCAL:1)
				CONTINUE
			CALL TRAIN_CHANGE_RELATION(CHARA_ID, LOCAL:1)
		NEXT
	NEXT
ENDIF

;非ウフフ限定
IF !FLAG:ウフフフラグ
	FOR CHARA_ID, 0, CHARANUM
		IF CHARA_ID == MASTER
			CONTINUE
		ENDIF
		IF FLAG:ハウジングモード && !FLAG:クエストモード
			IF !CFLAG:CHARA_ID:交流参加 || !IS_SAME_FACTION(CHARA_ID)
				CONTINUE
			ENDIF
		ELSEIF !IS_PARTICIPATE_TRAIN(CHARA_ID)
			CONTINUE
		ENDIF
		;調教後自慰のチェック
		CALL AFTER_SELF_CHECK(CHARA_ID)
	NEXT
ENDIF

;性知識アップ
FOR CHARA_ID, 0, CHARANUM
	IF FLAG:ハウジングモード && !FLAG:クエストモード
		IF !CFLAG:CHARA_ID:交流参加 || !IS_SAME_FACTION(CHARA_ID)
			CONTINUE
		ENDIF
	ELSEIF !IS_PARTICIPATE_TRAIN(CHARA_ID)
		CONTINUE
	ENDIF
	IF ABL:(CHARA_ID):性知識 < 4
		LOCAL:1 = MIN(SUM_EX(CHARA_ID) / MAX(ABL:(CHARA_ID):性知識 * 2, 1), 100)
		CALL PRINT_ADD_EXP(CHARA_ID, "性知識経験値", LOCAL:1, 1)
		CALL TRAIN_AUTO_ABLUP(CHARA_ID)
	ENDIF
NEXT

;素質・嗜好の処理
FOR CHARA_ID, 0, CHARANUM
	IF FLAG:ハウジングモード && !FLAG:クエストモード
		IF !CFLAG:CHARA_ID:交流参加 || !IS_SAME_FACTION(CHARA_ID)
			CONTINUE
		ENDIF
	ELSEIF !IS_PARTICIPATE_TRAIN(CHARA_ID)
		CONTINUE
	ENDIF
	;素質変化に関する処理(恋慕の取得など)
	CALL TALENT_CHECK(CHARA_ID)
	;性的嗜好の変化
	;あてがった場合はロックフラグを立てる
	CALL CHECK_SEXUAL_PREFERENCE(CHARA_ID)
NEXT

FOR LOCAL:0, 0, CUM_SLOT_NUM
	CVARSET CUM_TO_COUNT, LOCAL
	CVARSET CUM_TO_AMOUNT, LOCAL
	CVARSET CUM_GET_AMOUNT, LOCAL
	CVARSET CUM_GET_COUNT, LOCAL
	;mod array
	CVARSET CUM_CUR_AMOUNT, LOCAL
NEXT

;調教関連で調教後初期化する必要がある変数を初期化
CVARSET PREV_EX
CVARSET WOMB_INFLATION_RATE

FOR LOCAL:0, 0, CHARANUM
	IF TALENT:(LOCAL:0):触手妊娠 || TALENT:(LOCAL:0):Ａ触手妊娠 || TALENT:(LOCAL:0):Ｕ触手妊娠

		IF RESULT && IS_PREGNANT_MSG(LOCAL:0)
			SETCOLOR カラー_注意
			PRINTFORMW 触手の子を宿した%ANAME(LOCAL:0)%は部隊から外れました
			RESETCOLOR
		ENDIF
	ENDIF
NEXT
IF CONFIG:42
	FOR LOCAL:0, 0, CHARANUM
		CALL 性癖一括変更(LOCAL,10000)
		CALL 性癖一括変更(LOCAL,12000)
		CALL 性癖一括変更(LOCAL,14000)
	NEXT
ENDIF
;追加アイテムの削除
FOR LOCAL:0, 500, 999
	ITEM:(LOCAL:0) = 0
NEXT

;自動調教の制御系フラグを全てクリア
CALL TRAIN_EXIT_CREAR_AUTO_TRAIN_CONTROL_FLAG()

;ターン終了時にクリアするフラグ
FOR LOCAL:0, 0, CHARANUM
	TCVAR:LOCAL:催眠中 = 0
	CFLAG:LOCAL:調教中帰らない = 0
NEXT
FLAG:COM_FORBIDDEN無視 = 0

;全予約コマンドをクリア
FL_TRAIN_RESERVED_COM_NAME_LIST '= ""
FL_TRAIN_RESERVED_COM_OPTION_LIST '= ""
;調教連続実行回数をクリア
FL_TRAIN_RESERVED_COM_COUNT = 0
FL_TRAIN_RESERVED_COM_COUNT_MAX = 0

;閨逆調教フラグを折る
FLAG:閨逆調教 = 0

;プレイヤーとターゲットをクリア
CALL CLEAR_MPLY
CALL CLEAR_MTAR

;捕虜調教のターゲットをクリア
VARSET PRISONER_TARGET, -1

SIF EVENTEND_CALLEE_NUM > 0
	CALL TRAIN_CALL(1)

;ハウジングモードの終了処理
IF FLAG:ハウジングモード || FLAG:クエストモード
	CALL HOUSING_EXIT
ENDIF

;画像破棄
;グラフィックス情報初期化
CALL 全画像廃棄()
FOR LOCAL, 0, CHARANUM
	CALL INIT_FACE_SPRITE(LOCAL)
NEXT
FOR LOCAL, 0, 15000
	GDISPOSE LOCAL
NEXT
;念の為スプライトも全て破棄
SPRITEDISPOSEALL 0

;-------------------------------------------------
;連続で調教を行う場合の処理
; -------------------------------------------------
IF FLAG:連続調教フラグ == 1
	CALL START_TRAIN_COMMON()
ENDIF

JUMP FL_TURNEND

;-------------------------------------------------
;慰安の処理
;-------------------------------------------------
@EVENTEND_IAN()
#DIM 絶頂回数合計
#DIM 減少量
#DIM 報酬
#DIM 対象
#DIM 経済追加
#DIM 兵数追加
#DIM 最低保証
#DIM 参加者

参加者 = 0
絶頂回数合計 = 0

;慰安参加者を削除
FOR 対象, 0, CHARANUM
	;参加者の場合、減少
	IF IS_PARTICIPATE_TRAIN(対象) && 対象 != MASTER && !CFLAG:対象:慰安参加者
		IF SUM_EX(対象) > 50
			絶頂回数合計 += 50 + (SUM_EX(対象) - 50) / 5
		ELSE
			絶頂回数合計 += SUM_EX(対象)
		ENDIF

		最低保証 = -1000
		減少量 = LIMIT(300 + SUM_EX(対象) * 20, 0, MAX(CFLAG:対象:好感度, 0) / 10) + GETBIT(TALENT:対象:淫乱系, 素質_淫乱_浮気癖) * 500
		SIF CFLAG:対象:好感度 - 減少量 < 最低保証
			減少量 = MAX(CFLAG:対象:好感度 - 最低保証, 0)
		CFLAG:対象:好感度 = MAX(CFLAG:対象:好感度 - 減少量, 最低保証)
		PRINTFORML %ANAME(対象)%の好感度 -{減少量} (現在:{CFLAG:対象:好感度})

		最低保証 = -1000
		減少量 = LIMIT(300 + SUM_EX(対象) * 20, 0, MAX(CFLAG:対象:依存度, 0) / 10) + GETBIT(TALENT:対象:淫乱系, 素質_淫乱_浮気癖) * 500
		SIF CFLAG:対象:依存度 - 減少量 < 最低保証
			減少量 = MAX(CFLAG:対象:依存度 - 最低保証, 0)
		CFLAG:対象:依存度 = MAX(CFLAG:対象:依存度 - 減少量, 最低保証)
		PRINTFORML %ANAME(対象)%の依存度 -{減少量} (現在:{CFLAG:対象:依存度})

		最低保証 = -1000
		減少量 = LIMIT(300 + SUM_EX(対象) * 20, 0, MAX(CFLAG:対象:従属度, 0) / 10) + GETBIT(TALENT:対象:淫乱系, 素質_淫乱_浮気癖) * 500
		SIF CFLAG:対象:従属度 - 減少量 < 最低保証
			減少量 = MAX(CFLAG:対象:従属度 - 最低保証, 0)
		CFLAG:対象:従属度 = MAX(CFLAG:対象:従属度 - 減少量, 最低保証)
		PRINTFORML %ANAME(対象)%の従属度 -{減少量} (現在:{CFLAG:対象:従属度})

		最低保証 = -1000
		減少量 = LIMIT(300 + SUM_EX(対象) * 20, 0, MAX(CFLAG:対象:支配度, 0) / 10) + GETBIT(TALENT:対象:淫乱系, 素質_淫乱_浮気癖) * 500
		SIF CFLAG:対象:支配度 - 減少量 < 最低保証
			減少量 = MAX(CFLAG:対象:支配度 - 最低保証, 0)
		CFLAG:対象:支配度 = MAX(CFLAG:対象:支配度 - 減少量, 最低保証)
		PRINTFORML %ANAME(対象)%の支配度 -{減少量} (現在:{CFLAG:対象:支配度})

		CALL CHECK_LOSE_RELATION_TALENT(対象)

		参加者 ++
	ELSEIF IS_PARTICIPATE_TRAIN(対象) && CFLAG:対象:慰安参加者
		絶頂回数合計 += SUM_EX(対象)
		CFLAG:対象:慰安参加者 = 0
	ENDIF
NEXT
SIF FLAG:慰安避妊薬
	TIMES 絶頂回数合計, 0.7

報酬 = RAND(1000, 2000) * 参加者 + 絶頂回数合計 * RAND(40, 60) * MAX(参加者, 1)

MONEY += 報酬
CALL ICPRINT(@"慰安により、金<{報酬}>を得ました", "W", カラー_注意)

;-------------------------------------------------
;あてがうの処理
;-------------------------------------------------
@EVENTEND_ATEGAU()
#DIM 絶頂回数合計
#DIM 減少量
#DIM 増加量
#DIM 対象

絶頂回数合計 = 0
;好感度関連の処理
FOR 対象, 0, CHARANUM
	;参加者の場合、減少
	IF IS_PARTICIPATE_TRAIN(対象) && 対象 != MASTER && !CFLAG:対象:慰安参加者
		IF SUM_EX(対象) > 50
			絶頂回数合計 += 50 + (SUM_EX(対象) - 50) / 5
		ELSE
			絶頂回数合計 += SUM_EX(対象)
		ENDIF
		減少量 = MIN(300 + SUM_EX(対象) * 20, CFLAG:対象:好感度 / 3)
		CFLAG:対象:好感度 = MAX(CFLAG:対象:好感度 - 減少量, -1000)

		減少量 = MIN(300 + SUM_EX(対象) * 20, CFLAG:対象:従属度 / 3)
		CFLAG:対象:従属度 = MAX(CFLAG:対象:従属度 - 減少量, -1000)

		減少量 = MIN(300 + SUM_EX(対象) * 20, CFLAG:対象:依存度 / 3)
		CFLAG:対象:依存度 = MAX(CFLAG:対象:依存度 - 減少量, -1000)
	ENDIF
NEXT

FOR 対象, 0, CHARANUM
	IF CFLAG:対象:調教参加フラグ && CFLAG:対象:慰安参加者
		IF SUM_EX(対象) > 50
			絶頂回数合計 += 50 + (SUM_EX(対象) - 50) / 5
		ELSE
			絶頂回数合計 += SUM_EX(対象)
		ENDIF
	ENDIF
NEXT

FOR 対象, 0, CHARANUM
	SIF !CFLAG:対象:調教参加フラグ || !CFLAG:対象:慰安参加者
		CONTINUE
	増加量 = LIMIT(100 + 絶頂回数合計, 0, 1000)
	CFLAG:対象:好感度 += 増加量
	CFLAG:対象:従属度 += 増加量
	CFLAG:対象:依存度 += 増加量
	CFLAG:対象:慰安参加者 = 0
	CALL ICPRINT(@"閨の楽しみを提供したことで、%ANAME(対象)%の好感を得ました", "W", カラー_注意)
NEXT

;-------------------------------------------------
;調教後自慰のチェック
;-------------------------------------------------
@AFTER_SELF_CHECK(ARG:0)
;カットフラグが立っていたらリターン
;SIF CFLAG:98 & 2
;	RETURN 0

;特殊状態が立っていれば戻る
SIF CFLAG:(ARG:0):行動不能状態
	RETURN 0

;虚ろ・崩壊なら戻る
SIF TALENT:(ARG:0):虚ろ || TALENT:(ARG:0):崩壊
	RETURN 0

;自慰または触手オナニーの知識が必要
LOCAL:0 = 0
CALL CHECK_COM_KNOWLEDGE(ARG:0, 100)
LOCAL:0 += RESULT
CALL CHECK_COM_KNOWLEDGE(ARG:0, 211)
LOCAL:0 += RESULT
SIF !LOCAL:0
	RETURN 0

;おねだりフラグが立っていれば100%(条件判定をスルー)
IF !TCVAR:(ARG:0):おねだりフラグ
	;最低でも欲情が3以上必要
	SIF PALAM:(ARG:0):欲情 < PALAMLV:3
		RETURN 0

	;機嫌がある程度良いとき限定
	LOCALS:0 = %TOSTR_EMOTION(ARG:0)%
	SIF !GROUPMATCH(LOCALS:0, "幸", "悦", "良", "平")
		RETURN 0

	;体力・気力がゼロ、もしくは少ないなら行わない
	SIF BASE:(ARG:0):体力 <= 500 || BASE:(ARG:0):気力 <= 500
		RETURN 0
ENDIF

;●自慰するかどうかの判定＆回数の計算
CALL CALC_SELF_PARAMETER(ARG:0, 1)
LOCAL:2 = RESULT:0
LOCAL:3 = RESULT:1
LOCAL:4 = RESULT:2

;自慰の実行判定を満たさなければ戻る
SIF !LOCAL:2
	RETURN 0

;メッセージの共通部分
CALL COLOR_LINE
PRINTFORM %ANAME(MASTER)%と別れた後、

SIF TCVAR:(ARG:0):おねだりフラグ
	PRINTFORM おあずけを食らった

PRINTFORM %ANAME(ARG:0)%は劣情を抑えきれず、

;ＣＢオナニー
IF LOCAL:3 == 0
	IF HAS_PENIS(ARG:0)
		PRINTFORML 自らの指で反り立った肉棒を慰めた…
	ELSE
		PRINTFORML 自らの指で火照った体を慰めた…
	ENDIF

	;口上の表示
	CALL KOJO_EVENT(ARG:0, 100)
	SETCOLOR カラー_シルバー
	;経験の加算と表示
	IF IS_MALE(ARG:0)
		CALL FUCK(ARG:0, "Ｃ, 自慰, 欲望, 射精")
	ELSE
		CALL FUCK(ARG:0, "Ｃ, Ｂ, 自慰, 欲望, 射精")
	ENDIF
	RESETCOLOR
	;アナニー
ELSE
	PRINTFORML 自らの尻穴に指を挿れて快感を貪った…

	;口上の表示
	CALL KOJO_EVENT(ARG:0, 101)
	SETCOLOR カラー_シルバー
	;経験の加算と表示
	CALL FUCK(ARG:0, "Ａ, 自慰, 欲望, 射精")
ENDIF
RESETCOLOR

;能力上昇判定
CALL TRAIN_AUTO_ABLUP(ARG:0)
WAIT

;-------------------------------------------------
;自慰の判定(RESULT:0)、種類(RESULT:1)、回数(RESULT:2)を返す関数
;自慰の種類は  0:ＣＢオナニー  1:アナニー
;ARG:1が1だとPALAMなどの調教時の一時変数を考慮する
;-------------------------------------------------
@CALC_SELF_PARAMETER(ARG:0, ARG:1)
#DIM 自慰実行度 ;(LOCAL:2)
#DIM ＣＢ傾向 ;(LOCAL:3)
#DIM Ａ傾向 ;(LOCAL:4)

自慰実行度 = ABL:(ARG:0):自慰 * 7 + ABL:(ARG:0):欲望 * 4
IF ARG:1
	;ムード(TFLAG:ムード)を影響させる　※暫定的にムード20以下～70以上で0％～100％倍率
	自慰実行度 = 自慰実行度 * LIMIT(TFLAG:ムード - 20 ,0 ,50) / 50
	;でもムラっとしたら関係ないよね　てことで欲情ゲージには倍率されない
	自慰実行度 += GET_PALAMLV(PALAM:(ARG:0):欲情) * 4
ELSE
	自慰実行度 += 20
ENDIF

ＣＢ傾向 = ABL:(ARG:0):Ｃ感 * 2 + ABL:(ARG:0):Ｂ感
Ａ傾向 = ABL:(ARG:0):Ａ感 * 3

SIF TALENT:(ARG:0):自慰しやすい
	自慰実行度 += 11

SIF TALENT:(ARG:0):快感に素直
	自慰実行度 += 5

SIF TALENT:(ARG:0):快感の否定
	自慰実行度 -= 14

;服従じゃ増えない　隷属で恋慕と同じレベル
SIF TALENT:(ARG:0):恋慕 || TALENT:(ARG:0):隷属
	自慰実行度 += 5

;満たされてるので自慰の傾向が減るイメージ
SIF TALENT:(ARG:0):親愛
	自慰実行度 -= 7

SIF GETBIT(TALENT:(ARG:0):淫乱系, 素質_淫乱_淫乱)
	自慰実行度 += 7

SIF  GETBIT(TALENT:(ARG:0):淫乱系, 素質_淫乱_淫核)
	ＣＢ傾向 += 6

SIF  GETBIT(TALENT:(ARG:0):淫乱系, 素質_淫乱_淫乳)
	ＣＢ傾向 += 4

SIF  GETBIT(TALENT:(ARG:0):淫乱系, 素質_淫乱_尻穴狂い)
	Ａ傾向 += 8

LOCAL:5 = (自慰実行度 + MAX(ＣＢ傾向, Ａ傾向)) * 10

IF LOCAL:5 > 0
	IF ARG:1
		;これどうせ自慰発生する非ウフフだと体力気力減ることほぼ無いんだし意味なくない？
		LOCAL:5 = LOCAL:5 * BASE:(ARG:0):体力 * BASE:(ARG:0):気力 / (MAXBASE:(ARG:0):体力 * MAXBASE:(ARG:0):気力)
	ELSE
		TIMES LOCAL:5, 0.75
	ENDIF
ENDIF

;おねだりフラグが立っていれば強制的に判定値をクリアするように補正
IF TCVAR:(ARG:0):おねだりフラグ
	;ここでMAXする理由がいまいちわからない（一応ハードルの底上げと合わせて最低値を+50の250とする）
	LOCAL:5 = MAX(LOCAL:5 + 100, 250)
ENDIF

;実行値不足なら判定OFF
;恋慕・隷属の加算を増やした分、ハードルも底上げしました（250 + 5 * 10 → 300）
IF LOCAL:5 < 300
	RESULT:0 = 0
ELSE
	RESULT:0 = 1
ENDIF

;種類の判定
RESULT:1 = (ＣＢ傾向 < Ａ傾向)

;回数の計算(上限は30回)
LOCAL:6 = MIN(SQRT(MAX(LOCAL:5 - 240, 0) / 10), 30)
RESULT:2 = MAX(LOCAL:6 - RAND:(LOCAL:6 / 5 + 2), 1)

RETURN RESULT:0

;-------------------------------------------------
;調教後のキャラ間印象値改善処理
;-------------------------------------------------
;(ARG:0)の(ARG:1)に対する印象を調教内容次第で改善する
;※MASTERに対する好感度・従属度や第三者への親密度とは違う
;機嫌が良いほど好印象値が上昇、欲情・酔いが高いほど悪印象値が減少
;主に閨の乱交が効果的
;誰が誰にどうしたなどはめんどくさすぎて考慮してない
;なお今のとこ悪化するようなことはない（やってもいいけどバランスが難しいと思われ）
@TRAIN_CHANGE_RELATION(ARG:0, ARG:1)
#DIM 好印象増加値
#DIM 悪印象減少値

;好印象増加値：機嫌からざっくり代入します
SELECTCASE TOSTR_EMOTION(ARG:0)
	CASE "幸"
		好印象増加値 = 16
	CASE "悦"
		好印象増加値 = 8
	CASE "良"
		好印象増加値 = 4
	CASE "平"
		好印象増加値 = 2
ENDSELECT

;悪印象減少値：そのまま欲情Lvと酔いLvを足す（計0～19ぐらい？）
悪印象減少値 = GET_PALAMLV(PALAM:(ARG:0):欲情) + GET_PALAMLV(PALAM:(ARG:0):酔い)

;主人公自身の変動はとりあえずどっちも10
IF ARG:0 == MASTER
	好印象増加値 = 10
	悪印象減少値 = 10
ENDIF

;相手の素質で変動
;※操作キャラによってはめっちゃ楽になるので無くてもいいかも
IF TALENT:(ARG:1):天の御遣い
	好印象増加値 += 2
	悪印象減少値 += 2
ENDIF
IF TALENT:(ARG:1):君主の器
	好印象増加値 += 2
	悪印象減少値 += 2
ENDIF
IF TALENT:(ARG:1):求心力
	好印象増加値 += 2
	悪印象減少値 += 2
ENDIF
IF TALENT:(ARG:1):魅惑
	好印象増加値 += 1
ENDIF
IF TALENT:(ARG:1):謎の魅力
	好印象増加値 += 1
	悪印象減少値 += 1
ENDIF
IF TALENT:(ARG:1):人気
	好印象増加値 += 1
	悪印象減少値 += 1
ENDIF
IF TALENT:(ARG:1):小悪魔
	好印象増加値 += 1
ENDIF

;閨・子育てなら効果は（とりあえず）4倍
IF FLAG:調教モード == 1 || FLAG:調教モード == 3
	好印象増加値 = 好印象増加値 * 4
	悪印象減少値 = 悪印象減少値 * 4
ENDIF

CALL CHANGE_RELATION_O_TO_O(ARG:0, ARG:1, 好印象増加値, -(悪印象減少値))

;-------------------------------------------------
;DESC  :特殊勢力
;ARG   ::
;-------------------------------------------------
@EVENTEND_SP_COUNTRY()
#DIMS 勢力名,2
#DIM 勢力定数

勢力定数 = SP_COUNTRY_TO_CONST(CFLAG:MASTER:捕虜先)
勢力名 = %SP_COUNTRY_NAME:勢力定数%
勢力名:1 = %SP_COUNTRY_NAME_ENG:勢力定数%

SELECTCASE SP_TRAIN_COUNT:MASTER:勢力定数
	CASE IS < TRAIN_FALLEN_TERM:1
		PRINTFORML %勢力名%たちは%ANAME(MASTER)%を置いて、牢獄を後にした
		PRINTFORMW まだまだ%ANAME(MASTER)%の意思はくじけていない……
	CASE IS < TRAIN_FALLEN_TERM:2
		PRINTFORML %勢力名%たちは%ANAME(MASTER)%を置いて、牢獄を後にした
		CALL COLOR_PRINTW(@"%ANAME(MASTER)%の意思は綻びはじめている……", カラー_注意)
	CASE IS < TRAIN_FALLEN_TERM:3 - 1
		PRINTFORML %勢力名%たちは%ANAME(MASTER)%を置いて、牢獄を後にした
		CALL COLOR_PRINTW(@"%ANAME(MASTER)%はほとんど快楽に屈しかけている……", カラー_警告)
	CASEELSE
		PRINTFORML ・
		PRINTFORML ・
		PRINTFORML ・
		CALLFORM %勢力名:1%_FALLEN_MSG(MASTER)
		CALL CHANGE_COUNTRY(MASTER, CFLAG:MASTER:捕虜先, 1)

		CALL PLAYER_FALLEN_TO_SP_COUNTRY(CFLAG:MASTER:所属)
		CALLFORM %勢力名:1%_FALLEN_LEAVE_MARK(MASTER)
		SETBIT TALENT:MASTER:特殊勢力陥落系, 勢力定数
		CALL PLAYER_FALLEN_TO_SP_COUNTRY(CFLAG:MASTER:所属)
ENDSELECT


code:
;多人数調教で放置されているキャラの行動を管理

;--------------------------------------------------------
;多人数調教で放置されているキャラの行動を管理 基本部分
;--------------------------------------------------------
@EVENT_OTHERS
;レズプレイ
;オナニー
;興奮しながら見つめる
;好奇の目で見つめる
;目をそらす

;-------------------------------------------------
; コマンドの実行状況に応じて発生するイベントの制御
;-------------------------------------------------
@TRAIN_COM_FLAG_EVENT
#DIM CHARA_ID

;各キャラごとの処理
FOR CHARA_ID, 0, CHARANUM
    ;おねだりが満たされた場合初期化
    IF TCVAR:CHARA_ID:精飲おねだりフラグ == 2 && SELECTCOM == T_N("おねだり")
        TCVAR:CHARA_ID:精飲おねだりフラグ = 0
    ENDIF
NEXT

IF !GROUPMATCH(SELECTCOM, T_N("おねだり"), T_N("Ｐ自慰"), T_N("手コキ"))
    CVARSET TCVAR, GETNUM(TCVAR, "精飲おねだりフラグ"), 0
ENDIF

;-------------------------------------------------
; 搾精コマンド完了判定・実行処理
; RETURN 0:搾精継続, 1:搾精完了
;-------------------------------------------------
@TRAIN_SPERM_SQUEEZED
#DIM DYNAMIC MEQUIP_INDEX ;装着物(MEQUIP)の配列番号
#DIM DYNAMIC MEQUIP_NUM_TEMP
#DIM DYNAMIC CONDOM_RELEASED
#DIM DYNAMIC TARGET_INDEX

;装着物の総数を退避
MEQUIP_NUM_TEMP = MEQUIP_NUM

;搾精対象の全ターゲットについて確認
FOR TARGET_INDEX, 0, MTAR_NUM
    ;全装着物について確認
    FOR MEQUIP_INDEX, 0, MEQUIP_NUM_TEMP
        ;コンドーム以外の装着物はスキップ
        IF MEQUIP:MEQUIP_INDEX != T_N("コンドーム")
            CONTINUE
        ENDIF
        ;コンドーム装着者が搾精対象キャラの場合
        IF MEQUIP_PLAYER:MEQUIP_INDEX:0 == MTAR:TARGET_INDEX
            ;コンドームに射精済の場合
            IF CUM_TO_AMOUNT:(MTAR:TARGET_INDEX):射精部位_ゴム > 0
                ;コンドームを外す
                CALL RELEASE_EQUIP(MEQUIP_INDEX)
                CONDOM_RELEASED ++
            ENDIF
            ;次の搾精対象ターゲットついて判定する
            BREAK
        ENDIF
	NEXT
NEXT

;射精済コンドームなし
SIF CONDOM_RELEASED == 0
	RETURN 0

;射精済コンドーム回収時
;対Ｐ奉仕系コマンドの継続を解除
CALL RELEASE_SERVE_P
;予約コマンドを初期化
FL_TRAIN_RESERVED_COM_NAME_LIST '= ""
FL_TRAIN_RESERVED_COM_OPTION_LIST '= ""
FL_TRAIN_RESERVED_COM_COUNT = 0
;オプション=0: 初回実行時 に初期化
COM_OPTION:293 = 0

RETURN 1


code:
@FL_COMMAND_PANEL()
#DIM  DYNAMIC ITER_I
#DIM  DYNAMIC ITER_J
#DIMS DYNAMIC STR_COMPANEL
#DIMS DYNAMIC STR_COMLIST
#DIM  CONST WND_WIDTH  = 20
#DIM  CONST WND_HEIGHT = 28
#DIMS DYNAMIC STR_SELECTOR

CALL FL_COMMAND_PANEL_CREATE_COMLIST
STR_COMLIST = %RESULTS%
{
    STR_COMPANEL '= @""
        + @"◇　コマンドパネル　◇
"
        + @"%DRAW_LINEH(18)%
"
        + @"%STR_COMLIST%"
        + @"
"
}
;コマンドパネル
HTML_PRINT @"
%STR_COMPANEL%
", 1
CALL FL_COMMAND_PANEL_CREATE_SELECTOR()
;実行対象セレクタ
{
    STR_SELECTOR += @"
"
        + @"%RESULTS:0%"
        + "
"
}
{
    STR_SELECTOR += @"
"
        + @"%RESULTS:1%"
        + "
"
}
{
    STR_SELECTOR += @"
"
        + @"%RESULTS:2%"
        + "
"
}
HTML_PRINT STR_SELECTOR, 1
RETURN

@FL_COMMAND_PANEL_CREATE_COMLIST
#DIM  COMMAND
#DIM  DYNAMIC COM_NUM
#DIMS DYNAMIC STR_COMLIST
#DIMS DYNAMIC COM_NAME
#DIM  DYNAMIC IS_COM_EQUIP
#DIM  DYNAMIC L_CNT
#DIM  ITER_I
#DIM  ITER_J

;実行可能なコマンドの記録
CALL CREATE_COMABLE_LIST

VARSET LOCAL
;愛撫が0から始まるが、それより優先して出力したいコマンド群があるので負数から開始している
FOR ITER_I, -1, 1000
    ;;待機だけは優先して出力
    IF ITER_I == -1
        COM_NUM = 700
    ELSE
        SIF ITER_I == 700
            CONTINUE
        COM_NUM = ITER_I
    ENDIF
    ;COM_FILTERが立ってる場合、対応するCOM_ABLE_FLAGは折れてるので、
    ;INPUT側でチェックする必要はなし
    SIF TRAINNAME:COM_NUM == "" || COM_FILTER:COM_NUM
        CONTINUE

    ;コマンドオプションを設定
    COM_OPTION:COM_NUM = COM_OPTION_UI:COM_NUM

    ;コマンドがどのタブに含まれるかを取得
    ;現在選択されているタブに対応するコマンドのみを表示
    TRYCALLFORM COM_CATEGORY{COM_NUM}
    SIF RESULT != TFLAG:調教タブ設定
        CONTINUE

    TRYCALLFORM COM_NAME{COM_NUM}

    COM_NAME '= @"%TRAINNAME:COM_NUM%"

    IF COM_ABLE_FLAG:COM_NUM
        L_CNT ++
        ;コマンドの継続タイプを取得
        RESULT = 0
        TRYCALLFORM COM_IS_EQUIP{COM_NUM}
        IS_COM_EQUIP = RESULT
        IF COM_NAME != ""
            SIF STRLENS(COM_NAME) >= 18
                COM_NAME = %TOHALF(COM_NAME)%
            STR_COMLIST += @"%COM_NAME, 18, LEFT%"
            IF IS_COM_EQUIP == 2
                STR_COMLIST += @"[----]"
            ELSEIF FLAG:調教モード == 調教_子育て || TFLAG:調教タブ設定 == 6
                STR_COMLIST +=  @"<button value = '{COM_NUM}'>[実行]</button>"
            ELSE
                STR_COMLIST +=  @"<button value = '{COM_NUM}'>[単発]</button>"
            ENDIF
            IF !(FLAG:調教モード == 調教_子育て || TFLAG:調教タブ設定 == 6)
                IF IS_COM_EQUIP == 0
                    STR_COMLIST +=  @"[----]"
                ELSE
                    STR_COMLIST +=  @"<button value = '{COM_NUM + 1000}'>[継続]</button>"
                ENDIF
            ELSE
                STR_COMLIST +=  @"[----]"
            ENDIF
        ELSE
            STR_COMLIST += @"%TOSTR_REPEAT("-", 10), 24, RIGHT%  [----] [----]"
        ENDIF
        IF COM_CONFLICT_FLAG:(COM_NUM) == 1
            STR_COMLIST +=  @"<button value = '{COM_NUM + 10000}'>[干渉]</button>"
            STR_COMLIST += @"%TOSTR_SPACE(1)%"
        ELSE
            STR_COMLIST += @"%TOSTR_SPACE(8)%"
        ENDIF
        ;改行処理
        IF L_CNT >= 1 && L_CNT % 1 == 0
            STR_COMLIST += "
"
        ENDIF
    ENDIF
NEXT
RESULTS = %STR_COMLIST%
RETURN

@FL_COMMAND_PANEL_CREATE_SELECTOR
#DIMS DYNAMIC STRINGS, 3
#DIMS DYNAMIC PLAYER_NAMES
#DIMS DYNAMIC TARGET_NAMES
#DIMS DYNAMIC OTHER_NAMES
#DIM  DYNAMIC ITER_I
#DIM  DYNAMIC ITER_J
#DIM  DYNAMIC CHARA_ID

;バグ対策:不正なMTARを削除
FOR LOCAL, 0, MPLY_NUM
    IF IS_MTAR(MPLY:LOCAL)
        CALL DEL_MTAR(MPLY:LOCAL)
    ENDIF
NEXT

FOR CHARA_ID, 0, CHARANUM
    IF !CFLAG:CHARA_ID:調教参加フラグ && CHARA_ID != MASTER
        CONTINUE
    ENDIF
    IF IS_MPLY(CHARA_ID)
        PLAYER_NAMES += @"%SNAME(CHARA_ID)%" + "
"
    ELSEIF IS_MTAR(CHARA_ID)
        TARGET_NAMES += @"%SNAME(CHARA_ID)%" + "
"
    ELSE
        OTHER_NAMES += @"%SNAME(CHARA_ID)%" + "
"
    ENDIF
NEXT
;PLAYER
{
    STRINGS:0 '= @"PLAYER" + "
"
        + @"%PLAYER_NAMES%" + "
"
}
;TARGET
{
    STRINGS:1 '= @"TARGET" + "
"
        + @"%TARGET_NAMES%" + "
"
}
;OTHER
{
    STRINGS:2 '= @"OTHER" + "
"
        + @"%OTHER_NAMES%" + "
"
}
RESULTS:0 = %STRINGS:0%
RESULTS:1 = %STRINGS:1%
RESULTS:2 = %STRINGS:2%
RETURN


code:
;---------------------------------------------------------
;中出し履歴を更新する関数
;古くなった履歴を削除する
;---------------------------------------------------------
@UPDATE_CREAMPIE_HISTORY(ARG)
#DIM LCOUNT
FOR LCOUNT, 0, WOMB_RECORD_MAX
	SIF WOMB_SPERM_ID:ARG:LCOUNT == 0
		CONTINUE
	;最終中出し日からの期間を加算
	WOMB_SPERM_TIME:ARG:LCOUNT ++

	;減算処理
	IF WOMB_SPERM_AMOUNT:ARG:LCOUNT > CALC_WOMB_SIZE(ARG) / 5 || WOMB_SPERM_COUNT:ARG:LCOUNT >= 5
		LOCAL:1 = RAND:MAX(WOMB_SPERM_COUNT:ARG:LCOUNT / 3, 1)
		WOMB_SPERM_AMOUNT:ARG:LCOUNT = MIN_DECREASE(WOMB_SPERM_AMOUNT:ARG:LCOUNT, WOMB_SPERM_AMOUNT:ARG:LCOUNT * LOCAL:1 / WOMB_SPERM_COUNT:ARG:LCOUNT, 0)
		WOMB_SPERM_COUNT:ARG:LCOUNT -= LOCAL:1
	ENDIF

	;履歴が古い、量と発数が0を割ったらリストから削除
	IF WOMB_SPERM_TIME:ARG:LCOUNT >= 3 || WOMB_SPERM_AMOUNT:ARG:LCOUNT <= 0 || WOMB_SPERM_COUNT:ARG:LCOUNT <= 0
		WOMB_SPERM_ID:ARG:LCOUNT = 0
		WOMB_SPERM_AMOUNT:ARG:LCOUNT = 0
		WOMB_SPERM_TIME:ARG:LCOUNT = 0
		WOMB_SPERM_COUNT:ARG:LCOUNT = 0
	ENDIF
NEXT

; FOR LCOUNT, 0, WOMB_RECORD_MAX
; 	SIF STOMACH_SPERM_ID:ARG:LCOUNT == 0
; 		CONTINUE
; 	;最終中出し日からの期間を加算
; 	STOMACH_SPERM_TIME:ARG:LCOUNT ++

; 	;減算処理
; 	IF STOMACH_SPERM_AMOUNT:ARG:LCOUNT > CALC_STOMACH_SIZE(ARG) / 5 || STOMACH_SPERM_COUNT:ARG:LCOUNT >= 5
; 		LOCAL:1 = RAND:MAX(STOMACH_SPERM_COUNT:ARG:LCOUNT / 3, 1)
; 		STOMACH_SPERM_AMOUNT:ARG:LCOUNT = MIN_DECREASE(STOMACH_SPERM_AMOUNT:ARG:LCOUNT, STOMACH_SPERM_AMOUNT:ARG:LCOUNT * LOCAL:1 / STOMACH_SPERM_COUNT:ARG:LCOUNT, 0)
; 		STOMACH_SPERM_COUNT:ARG:LCOUNT -= LOCAL:1
; 	ENDIF

; 	;履歴が古い、量と発数が0を割ったらリストから削除
; 	IF STOMACH_SPERM_TIME:ARG:LCOUNT >= 3 || STOMACH_SPERM_AMOUNT:ARG:LCOUNT <= 0 || STOMACH_SPERM_COUNT:ARG:LCOUNT <= 0
; 		STOMACH_SPERM_ID:ARG:LCOUNT = 0
; 		STOMACH_SPERM_AMOUNT:ARG:LCOUNT = 0
; 		STOMACH_SPERM_TIME:ARG:LCOUNT = 0
; 		STOMACH_SPERM_COUNT:ARG:LCOUNT = 0
; 	ENDIF
; NEXT
; FOR LCOUNT, 0, WOMB_RECORD_MAX
; 	SIF ANUS_SPERM_ID:ARG:LCOUNT == 0
; 		CONTINUE
; 	;最終中出し日からの期間を加算
; 	ANUS_SPERM_TIME:ARG:LCOUNT ++

; 	;減算処理
; 	IF ANUS_SPERM_AMOUNT:ARG:LCOUNT > CALC_ANUS_SIZE(ARG) / 5 || ANUS_SPERM_COUNT:ARG:LCOUNT >= 5
; 		LOCAL:1 = RAND:MAX(ANUS_SPERM_COUNT:ARG:LCOUNT / 3, 1)
; 		ANUS_SPERM_AMOUNT:ARG:LCOUNT = MIN_DECREASE(ANUS_SPERM_AMOUNT:ARG:LCOUNT, ANUS_SPERM_AMOUNT:ARG:LCOUNT * LOCAL:1 / ANUS_SPERM_COUNT:ARG:LCOUNT, 0)
; 		ANUS_SPERM_COUNT:ARG:LCOUNT -= LOCAL:1
; 	ENDIF

; 	;履歴が古い、量と発数が0を割ったらリストから削除
; 	IF ANUS_SPERM_TIME:ARG:LCOUNT >= 3 || ANUS_SPERM_AMOUNT:ARG:LCOUNT <= 0 || ANUS_SPERM_COUNT:ARG:LCOUNT <= 0
; 		ANUS_SPERM_ID:ARG:LCOUNT = 0
; 		ANUS_SPERM_AMOUNT:ARG:LCOUNT = 0
; 		ANUS_SPERM_TIME:ARG:LCOUNT = 0
; 		ANUS_SPERM_COUNT:ARG:LCOUNT = 0
; 	ENDIF
; NEXT
CALL STOMACH_SPERM_UPDATE(ARG)
CALL ANUS_SPERM_UPDATE(ARG)

;-------------------------------------------------
;@STOMACH_SPERM_UPDATE
;-------------------------------------------------
;region @STOMACH_SPERM_UPDATE
@STOMACH_SPERM_UPDATE(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT
#DIM DYNAMIC AMOUNT
#DIM DYNAMIC CNT

FOR LCOUNT, 0, WOMB_RECORD_MAX
	SIF STOMACH_SPERM_ID:CHARA_ID:LCOUNT == 0
		CONTINUE
	;最終中出し日からの期間を加算
	STOMACH_SPERM_TIME:CHARA_ID:LCOUNT ++

	;減算処理
	IF STOMACH_SPERM_AMOUNT:CHARA_ID:LCOUNT > CALC_STOMACH_SIZE(CHARA_ID) / 5 || STOMACH_SPERM_COUNT:CHARA_ID:LCOUNT >= 5
		CNT = RAND:MAX(STOMACH_SPERM_COUNT:CHARA_ID:LCOUNT / 3, 1)
		STOMACH_SPERM_AMOUNT:CHARA_ID:LCOUNT = MIN_DECREASE(STOMACH_SPERM_AMOUNT:CHARA_ID:LCOUNT, STOMACH_SPERM_AMOUNT:CHARA_ID:LCOUNT * CNT / STOMACH_SPERM_COUNT:CHARA_ID:LCOUNT, 0)
		STOMACH_SPERM_COUNT:CHARA_ID:LCOUNT -= CNT
	ENDIF

	;履歴が古い、量と発数が0を割ったらリストから削除
	IF STOMACH_SPERM_TIME:CHARA_ID:LCOUNT >= 3 || STOMACH_SPERM_AMOUNT:CHARA_ID:LCOUNT <= 0 || STOMACH_SPERM_COUNT:CHARA_ID:LCOUNT <= 0
		STOMACH_SPERM_ID:CHARA_ID:LCOUNT = 0
		STOMACH_SPERM_AMOUNT:CHARA_ID:LCOUNT = 0
		STOMACH_SPERM_TIME:CHARA_ID:LCOUNT = 0
		STOMACH_SPERM_COUNT:CHARA_ID:LCOUNT = 0
	ENDIF
NEXT
;#endregion

;-------------------------------------------------
;@STOMACH_SPERM_DECREASE
;対象キャラの胃内の精液を割合で減少させる
;ARG:1は百分率指定
;-------------------------------------------------
;region @STOMACH_SPERM_DECREASE
@STOMACH_SPERM_DECREASE(CHARA_ID, PERCENTILE)
#DIM CHARA_ID
#DIM PERCENTILE
#DIM LCOUNT
#DIM DYNAMIC AMOUNT
#DIM DYNAMIC SUM_AMOUNT

FOR LCOUNT, 0, WOMB_RECORD_MAX
	AMOUNT = FTIMES(STOMACH_SPERM_AMOUNT:CHARA_ID:LCOUNT, PERCENTILE)
	STOMACH_SPERM_AMOUNT:CHARA_ID:LCOUNT = MIN_DECREASE(STOMACH_SPERM_AMOUNT:CHARA_ID:LCOUNT, AMOUNT, 0)
	SUM_AMOUNT += AMOUNT

	;量が0を割ったらリストから削除
	IF STOMACH_SPERM_AMOUNT:CHARA_ID:LCOUNT <= 0
		STOMACH_SPERM_ID:CHARA_ID:LCOUNT = 0
		STOMACH_SPERM_AMOUNT:CHARA_ID:LCOUNT = 0
		STOMACH_SPERM_TIME:CHARA_ID:LCOUNT = 0
		STOMACH_SPERM_COUNT:CHARA_ID:LCOUNT = 0
	ENDIF
NEXT

RETURN SUM_AMOUNT
;#endregion

;-------------------------------------------------
;@ANUS_SPERM_UPDATE
;-------------------------------------------------
;region @ANUS_SPERM_UPDATE
@ANUS_SPERM_UPDATE(CHARA_ID)
#DIM CHARA_ID
#DIM LCOUNT
#DIM DYNAMIC AMOUNT
#DIM DYNAMIC CNT

FOR LCOUNT, 0, WOMB_RECORD_MAX
	SIF ANUS_SPERM_ID:CHARA_ID:LCOUNT == 0
		CONTINUE
	;最終中出し日からの期間を加算
	ANUS_SPERM_TIME:CHARA_ID:LCOUNT ++

	;減算処理
	IF ANUS_SPERM_AMOUNT:CHARA_ID:LCOUNT > CALC_ANUS_SIZE(CHARA_ID) / 5 || ANUS_SPERM_COUNT:CHARA_ID:LCOUNT >= 5
		CNT = RAND:MAX(ANUS_SPERM_COUNT:CHARA_ID:LCOUNT / 3, 1)
		ANUS_SPERM_AMOUNT:CHARA_ID:LCOUNT = MIN_DECREASE(ANUS_SPERM_AMOUNT:CHARA_ID:LCOUNT, ANUS_SPERM_AMOUNT:CHARA_ID:LCOUNT * CNT / ANUS_SPERM_COUNT:CHARA_ID:LCOUNT, 0)
		ANUS_SPERM_COUNT:CHARA_ID:LCOUNT -= CNT
	ENDIF

	;履歴が古い、量と発数が0を割ったらリストから削除
	IF ANUS_SPERM_TIME:CHARA_ID:LCOUNT >= 3 || ANUS_SPERM_AMOUNT:CHARA_ID:LCOUNT <= 0 || ANUS_SPERM_COUNT:CHARA_ID:LCOUNT <= 0
		ANUS_SPERM_ID:CHARA_ID:LCOUNT = 0
		ANUS_SPERM_AMOUNT:CHARA_ID:LCOUNT = 0
		ANUS_SPERM_TIME:CHARA_ID:LCOUNT = 0
		ANUS_SPERM_COUNT:CHARA_ID:LCOUNT = 0
	ENDIF
NEXT
;#endregion

;---------------------------------------------------------
;父親候補を履歴から探す関数
;妊娠している時点で父親はいるはずなので候補が0人である場合は一応エラーを投げて父親が不明ということにする
;RETURNF CASE
;0:候補が複数など候補が1人でない場合
;else:父親候補の番号
;---------------------------------------------------------
@GET_FATHER_CANDIDATE_FROM_CREAMPIE_HISTORY(ARG)
#FUNCTION
#DIM FATHER_CANDIDATE, WOMB_RECORD_MAX
#DIM SPERM_AMOUNT_SUM
#DIM CANDIDATE_COUNT
#DIM CANDIDATE_CNO
#DIM CANDIDATE_VALUE
#DIM LCOUNT
VARSET CANDIDATE_COUNT
VARSET FATHER_CANDIDATE
VARSET SPERM_AMOUNT_SUM

FOR LCOUNT, 0, WOMB_RECORD_MAX
	SIF WOMB_SPERM_ID:ARG:LCOUNT == 0
		CONTINUE
	CANDIDATE_CNO = ID_TO_CHARA(WOMB_SPERM_ID:ARG:LCOUNT)
	FATHER_CANDIDATE:CANDIDATE_COUNT = WOMB_SPERM_ID:ARG:LCOUNT
	IF CANDIDATE_CNO >= 0
		SPERM_AMOUNT_SUM += WOMB_SPERM_AMOUNT:ARG:LCOUNT * (GETBIT(TALENT:CANDIDATE_CNO:淫乱系, 素質_淫乱_濃厚精液) + 1)
	ELSE
		;動物の精液は大量なため、1mlあたりの効果量を引き下げる
		IF IS_ANIMAL_SPERM(WOMB_SPERM_ID:ARG:LCOUNT)
			SPERM_AMOUNT_SUM += WOMB_SPERM_AMOUNT:ARG:LCOUNT / 5
		ELSE
			SPERM_AMOUNT_SUM += WOMB_SPERM_AMOUNT:ARG:LCOUNT
		ENDIF
	ENDIF
	CANDIDATE_COUNT ++
NEXT

SIF CANDIDATE_COUNT == 0
	CALLF ERROR

;父親が複数いる場合はランダムにする
;SIF CANDIDATE_COUNT != 1
;	RETURNF 0

IF CANDIDATE_COUNT == 1 || RAND:CANDIDATE_COUNT > 0
	CANDIDATE_VALUE = RAND:SPERM_AMOUNT_SUM
	FOR LCOUNT, 0, WOMB_RECORD_MAX
		CANDIDATE_CNO = ID_TO_CHARA(WOMB_SPERM_ID:ARG:LCOUNT)
		IF CANDIDATE_CNO >= 0
			CANDIDATE_VALUE -= WOMB_SPERM_AMOUNT:ARG:LCOUNT * (GETBIT(TALENT:CANDIDATE_CNO:淫乱系, 素質_淫乱_濃厚精液) + 1)
		ELSE
			;動物の精液は大量なため、1mlあたりの効果量を引き下げる
			IF IS_ANIMAL_SPERM(WOMB_SPERM_ID:ARG:LCOUNT)
				CANDIDATE_VALUE -= WOMB_SPERM_AMOUNT:ARG:LCOUNT / 200
			ELSE
				CANDIDATE_VALUE -= WOMB_SPERM_AMOUNT:ARG:LCOUNT
			ENDIF
			CANDIDATE_VALUE -= WOMB_SPERM_AMOUNT:ARG:LCOUNT
		ENDIF
		SIF CANDIDATE_VALUE <= 0
			RETURNF WOMB_SPERM_ID:ARG:LCOUNT
	NEXT
	;父親候補が複数いる場合、(候補の数 - 1/候補の数)の確率で不明になる
ELSE
	RETURNF GET_SPERM_ID("不明")
ENDIF

;死に分岐
RETURNF GET_SPERM_ID("不明")

;---------------------------------------------------------
;中だし履歴を削除する関数
;---------------------------------------------------------
@CLEAR_CREAMPIE_HISTORY(ARG:0, ARG:1 = 0)
;中出し履歴をクリア
FOR LOCAL, 0, WOMB_RECORD_MAX
	WOMB_SPERM_ID:(ARG:0):LOCAL = 0
	WOMB_SPERM_AMOUNT:(ARG:0):LOCAL = 0
	WOMB_SPERM_COUNT:(ARG:0):LOCAL = 0
	WOMB_SPERM_TIME:(ARG:0):LOCAL = 0
	IF ARG:1 == 1
		ANUS_SPERM_TIME:(ARG:0):LOCAL = 0
		ANUS_SPERM_COUNT:(ARG:0):LOCAL = 0
		ANUS_SPERM_AMOUNT:(ARG:0):LOCAL = 0
		STOMACH_SPERM_ID:(ARG:0):LOCAL = 0
		STOMACH_SPERM_TIME:(ARG:0):LOCAL = 0
		STOMACH_SPERM_COUNT:(ARG:0):LOCAL = 0
		STOMACH_SPERM_AMOUNT:(ARG:0):LOCAL = 0
		ANUS_TOTAL_CREAMPIED_AMOUNT:(ARG:0):0 = 0
		STOMACH_TOTAL_CREAMPIED_AMOUNT:(ARG:0):0 = 0
	ENDIF
NEXT


code:
;---------------------------------------------------------
;モブキャラクターの妊娠判定
;---------------------------------------------------------
@MOB_PREGNANT(ARG:0)
#DIM 充填率

;コンフィグによる妊娠抑制があれば戻る
IF CONFIG:1 == 1
	RETURN
ENDIF
;性別的に膣がない場合は特殊な薬を使わないと妊娠しない
SIF !HAS_VAGINA(ARG:0)
	RETURN
;念の為ユニークキャラは除外
SIF IS_UNIQUE_CHARA(ARG:0)
	RETURN
;すでに妊娠している
SIF TALENT:(ARG:0):妊娠 == 1
	RETURN

;中出し量の計算
LOCAL:2 = 0
FOR LOCAL:0, 0, WOMB_RECORD_MAX
	SIF WOMB_SPERM_ID:(ARG:0):LOCAL == 0
		CONTINUE
	IF IS_ANIMAL_SPERM(WOMB_SPERM_ID:(ARG:0):LOCAL)
		LOCAL:2 += WOMB_SPERM_AMOUNT:(ARG:0):LOCAL / 5
	ELSE
		LOCAL:2 += WOMB_SPERM_AMOUNT:(ARG:0):LOCAL
	ENDIF
NEXT

;膣内射精量が0以下なら妊娠判定に入らない
SIF LOCAL:2 <= 0
	RETURN
充填率 = 100 * SUM_WOMB_SPERM_AMOUNT(ARG:0) / CALC_WOMB_SIZE(ARG:0)
PRINTFORM %ANAME(ARG:0)%の
SIF IS_OVULATION(ARG:0)
	PRINT 危険日の
IF 充填率 >= 100
	PRINTFORML 膣内は精液で完全に満たされている
ELSEIF 充填率 >= 50
	PRINTFORML 膣内で夥しい数の精子が蠢いている
ELSEIF 充填率 >= 0
	PRINTFORML 膣内で精子が元気に泳ぎ回っている
ENDIF

CALL UPDATE_CREAMPIE_HISTORY(ARG:0)
CALL CHECK_PREGNANT(ARG:0)

IF TALENT:(ARG:0):妊娠
	;感情に応じてなにか反応させたかったがいい文章が思い浮かばない
	;SELECTCASE TOSTR_EMOTION(ARG:0)
	;CASE "幸"
	;PRINTFORMW %ANAME(ARG:0)%は%ANAME(CFLAG:(ARG:0):子の父親)%の子なら産んでもいいかなと思った
	;CASE "悦"
	;CASE "良"
	;CASE "平"
	;CASE "怒"
	;CASE "憤"
	;CASE "恨"
	;CASE "狂"
	;CASE "虚"
	;ENDSELECT
	CALL QST_CHANGE_ITEM("淫堕点,30,")
	CALL MOB_PREGNANT_COUNT(ARG:0)
ELSEIF TALENT:(ARG:0):妊娠 == 0
	PRINTFORML 妊娠はしなかったようだ
ENDIF

;---------------------------------------------------------
;モブキャラの種付カウント
;---------------------------------------------------------
@MOB_PREGNANT_COUNT(ARG:0)
#DIM SPERM_PROVIDER
#DIM DYNAMIC CHARA_IDX
#DIMS DYNAMIC GUEST_TYPE
#DIMS DYNAMIC OVUM_PROVIDER

; 念のためでユニークキャラをスルー
SIF CSTR:(ARG:0):99 != ""
	RETURN

; 子の父親確認
SPERM_PROVIDER = ID_TO_CHARA(CFLAG:(ARG:0):23)

SIF SPERM_PROVIDER == -1
	RETURN

; 客の場合
CALL HO_GET_CHARAIDX(ARG:0)
CHARA_IDX = RESULT
CALL HO_GET_CHARADATA(CHARA_IDX, "GUEST_TYPE")
IF RESULT != -1
	GUEST_TYPE = %RESULTS%
	SELECTCASE GUEST_TYPE
		CASE "買物客"
			OVUM_PROVIDER '= "商売客"
		CASE "買春客"
			OVUM_PROVIDER '= "買春客"
		CASE "宿泊客"
			OVUM_PROVIDER '= "宿泊客"
		CASEELSE
			OVUM_PROVIDER '= "訪問者"
	ENDSELECT
ELSE
	; モブ識別子があれば識別子を使用
	IF CSTR:(ARG:0):モブ識別子 !=""
		OVUM_PROVIDER = %CSTR:(ARG:0):モブ識別子%
	ELSEIF CALLNAME:(ARG:0) !=""
		; 識別子ないならCALLNAMEで
		OVUM_PROVIDER = %CALLNAME:(ARG:0)%
	ELSE
		OVUM_PROVIDER = 名前のない相手
	ENDIF
ENDIF

; 現在のクエスト中の特殊キャラ処理
SELECTCASE CALLNAME:(ARG:0)
		; ならず者
	CASE "野盗","傭兵くずれ","盗賊","冒険者くずれ", "ならず者"
		OVUM_PROVIDER '= "負け犬のならず者"
		; 汎用冒険者
	CASE "冒険者","剣闘士","アマゾネス","剣士"
		OVUM_PROVIDER '= "無名の冒険者"
		; メスガキ
	CASE "メスガキアマゾネス"
		OVUM_PROVIDER '= "メスガキ"
		;準ネームドモブ
	CASE "スキュラの女王"
		OVUM_PROVIDER '= "入り江の女王"
		; 種付たい子（未実装）
		; QUEST 11
	CASE "カーラ"
		OVUM_PROVIDER '= "双子のサキュバス"
		; QUEST 40
	CASE "ドライアド"
		OVUM_PROVIDER '= "妖艶な樹精女王"
	CASE "陽気な姫花"
		OVUM_PROVIDER '= "樹精の姫花"
ENDSELECT

DEBUGPRINTFORML OVUM_PROVIDER = %OVUM_PROVIDER%

CALL ADD_IMPREGNANT_RECORD(SPERM_PROVIDER, OVUM_PROVIDER)

;---------------------------------------------------------
;モブキャラ種付のカウント表示
;---------------------------------------------------------
@PRINT_MOB_PREGNANTION(ARG:0, COLUMN)
#DIM COLUMN
#DIM DYNAMIC PREG_COUNT

FOR LOCAL:0, 0, PREGNANT_RECORD_MAX
	; 現存データ判定
	STRLENFORMU %PREGNANT_RECORD_MOB_NAME:(ARG:0):(LOCAL:0)%
	; あり
	IF RESULT != 0
		SPLIT PREGNANT_RECORD_MOB_NAME:(ARG:0):(LOCAL:0), ",", LOCALS
		TOINT LOCALS:1
		PREG_COUNT += RESULT:0
		IF COLUMN >= 1
			IF COLUMN % 4 == 0
				PRINTL
			ELSE
				PRINT
			ENDIF
		ENDIF
		COLUMN ++
		PRINTFORM %LOCALS:0, 18, LEFT%{RESULT:0, 4, RIGHT}
	ELSE
		BREAK
	ENDIF
NEXT

RETURN PREG_COUNT

;---------------------------------------------------------
;種付記録生成の同じ部分
;---------------------------------------------------------
@ADD_IMPREGNANT_RECORD(ARG:0, OVUM_PROVIDER)
#DIMS OVUM_PROVIDER

FOR LOCAL, 0, PREGNANT_RECORD_MAX
	; 現存データ判定
	STRLENFORMU %PREGNANT_RECORD_MOB_NAME:(ARG:0):LOCAL%
	; あり
	IF RESULT != 0
		;OVUM_PROVIDERと同一かを文字列一致で判定
		STRFIND PREGNANT_RECORD_MOB_NAME:(ARG:0):LOCAL, OVUM_PROVIDER
		; 同じ記録あるなら
		IF RESULT == 0
			SPLIT PREGNANT_RECORD_MOB_NAME:(ARG:0):LOCAL, ",", LOCALS
			TOINT LOCALS:1
			RESULT:0 += 1
			PREGNANT_RECORD_MOB_NAME:(ARG:0):LOCAL = %OVUM_PROVIDER%,{RESULT:0}
			BREAK
			; 別記録あったらスキップ
		ENDIF
		; なし
	ELSEIF RESULT == 0
		; 上書
		PREGNANT_RECORD_MOB_NAME:(ARG:0):LOCAL = %OVUM_PROVIDER%
		PREGNANT_RECORD_MOB_NAME:(ARG:0):LOCAL += ",1"
		BREAK
	ENDIF
NEXT

RETURN

; 検討中
; ;---------------------------------------------------------
; ;竿役モブの専用身長など生成
; ;---------------------------------------------------------
; @SET_STATUS_MOB(ARG:0)

; @SET_BODYSIZE(対象, セット位置 = 0)
; #DIM 対象
; #DIM セット位置

; CASE "触手"
; 長さ60~300CM、太さ(直径)不定2~15CM
; CASE 円柱形
; 骨付けない触手にとって多分ρ=1
; 体重=(1/4)ρ*h*πd^2
;     =身長*平均直径*平均直径*3/4

; CASE 円錐形(末端細い)
; =身長*平均直径*平均直径*3/8
; CASE 円錐形(末端太い)
; =身長*平均直径*平均直径*3/8

; 	CALL SET_BODYSIZE_HEIGHT(ARG:0)
; 	BASE:(ARG:0):身長 /= (1+RAND:5)
; 	BASE:(ARG:0):身長 *= (1+RAND:10)
; 	CALL SET_BODYSIZE_WEIGHT(ARG:0)
; 	BASE:(ARG:0):体重 /= (1+RAND:8)

; CASE "スキュラ"
; 下半身はタコの様で、腰に頭付いていないの女の子の感じ
; H++、体重は多分同身長女性の三倍ほど？

; CASE "ゴブリン"
; 身長140CMほど、全身はガリガリで腹の方は膨らんでいる亜人
; W+、同身長のガキ+10kgほどかな
; 小太りの/痩せた/子　名前より対応したい

; CASE "スライム"
; 不定形系は具体的に設定次第の方がいいかも

; 虫系や動物系は一旦放置します