code:
;-------------------------------------------------
;ゲストモブ生成処理
; SEX:0=男性,1=女性
;-------------------------------------------------
@HO_CREATE_GUEST(ROOM_IDX, GUEST_TYPE, PRESET_NAME, SEX)
#DIM ROOM_IDX
#DIMS GUEST_TYPE
#DIMS PRESET_NAME
#DIM SEX
#DIM DYNAMIC IDX
#DIM DYNAMIC CHARA_ID

;女性の場合コンフィグ値に応じてふたなり化
IF SEX == 1
    SEX = RAND:100 < FLCONFIG:女性ゲストのふたなり率 ? 2 # 1
ENDIF

;DUMMYの場合はキャラリストに登録せず、キャラを生成してキャラIDを返却するのみ
IF GUEST_TYPE == "DUMMY"
    CALL CREATE_GUEST_MOB_PRESET(PRESET_NAME, SEX)
    RETURN RESULT
ENDIF

;キャラを生成してキャラリストの空き番号に登録する
FOR IDX, 0, VARSIZE("_DIC_HO_CHARALIST")
    ;キャラリストの空き番号が存在する場合
    IF _DIC_HO_CHARALIST:IDX == "-1" || _DIC_HO_CHARALIST:IDX == "DELETED"
        CALL CREATE_GUEST_MOB_PRESET(PRESET_NAME, SEX)
        CHARA_ID = RESULT
        ;キャラリストの最後尾を更新
        IF _DIC_HO_CHARALIST:IDX == "-1" && IDX < MAX_CHARANUM - 1
            _DIC_HO_CHARALIST:(IDX + 1) '= "-1"
        ELSEIF IDX == MAX_CHARANUM - 1
            THROW ERROR:領内活動でのゲストモブ生成数がキャラ上限を超えました
        ENDIF
        ;生成したキャラをキャラリストに登録
        _DIC_HO_CHARALIST:IDX '= @"[CHARA_ID:{CHARA_ID}][ROOM_IDX:{ROOM_IDX}][ACTION:待機][GUEST_TYPE:%GUEST_TYPE%]"
        TFLAG:生成済ゲスト数 ++
        RETURN CHARA_ID
    ENDIF
NEXT

RETURN 0

;-------------------------------------------------
;ユニークキャラクターをゲストとして登場させる
;-------------------------------------------------
@HO_CREATE_UNIQUE_GUEST(CHARA_ID, ROOM_IDX, GUEST_TYPE)
#DIM CHARA_ID
#DIM ROOM_IDX
#DIMS GUEST_TYPE
#DIMS PRESET_NAME
#DIM DYNAMIC MEMBER_NUM
#DIM DYNAMIC IDX

FOR IDX, 0, VARSIZE("_DIC_HO_CHARALIST")
    IF _DIC_HO_CHARALIST:IDX == "-1" || _DIC_HO_CHARALIST:IDX == "DELETED"
        IF _DIC_HO_CHARALIST:IDX == "-1" && IDX < MAX_CHARANUM - 1
            _DIC_HO_CHARALIST:(IDX + 1) '= "-1"
        ELSEIF IDX == MAX_CHARANUM - 1
            THROW ERROR:領内活動でのゲストモブ生成数がキャラ上限を超えました
        ENDIF
        _DIC_HO_CHARALIST:IDX '= @"[CHARA_ID:{CHARA_ID}][ROOM_IDX:{ROOM_IDX}][ACTION:待機][GUEST_TYPE:%GUEST_TYPE%]"
        TFLAG:生成済ゲスト数 ++
        RETURN CHARA_ID
    ENDIF
NEXT

RETURN 0

;-------------------------------------------------
;クエスト用イベントポーン生成処理
;-------------------------------------------------
@QST_CREATE_EVENT_PAWN(ROOM_IDX, EVENT_LIST_IDX, ACTION = "待機")
#DIM ROOM_IDX
#DIM EVENT_LIST_IDX
#DIMS ACTION
#DIM DYNAMIC EVENT_ID
#DIM DYNAMIC MEMBER_NUM
#DIM DYNAMIC IDX
#DIM DYNAMIC CHARA_ID

CALL QST_GET_EVENT_LIST(EVENT_LIST_IDX, "EVENT_ID")
EVENT_ID = RESULT

FOR IDX, 0, VARSIZE("_DIC_HO_CHARALIST")
    IF _DIC_HO_CHARALIST:IDX == "-1" || _DIC_HO_CHARALIST:IDX == "DELETED"
        CALL CREATE_GUEST_MOB_PRESET("", 0)
        CHARA_ID = RESULT
        IF _DIC_HO_CHARALIST:IDX == "-1" && IDX < MAX_CHARANUM - 1
            _DIC_HO_CHARALIST:(IDX + 1) '= "-1"
        ELSEIF IDX == MAX_CHARANUM - 1
            THROW ERROR:領内活動でのゲストモブ生成数がキャラ上限を超えました
        ENDIF
        _DIC_HO_CHARALIST:IDX '= @"[CHARA_ID:{CHARA_ID}][ROOM_IDX:{ROOM_IDX}][ACTION:待機][GUEST_TYPE:EVENT_PAWN][ICON:@C:{カラー_赤}@E@/C@][EVENT_LIST_IDX:{EVENT_LIST_IDX}][EVENT_ID:{EVENT_ID}]"
        CFLAG:CHARA_ID:イベントポーン = 1
        CFLAG:CHARA_ID:ゲストモブ = 0
        TFLAG:生成済ゲスト数 ++
        RETURN CHARA_ID
    ENDIF
NEXT

RETURN 1

;-------------------------------------------------
; ゲストモブ離脱処理
;-------------------------------------------------
@HO_LEAVE_GUEST(CHARA_IDX, CHARA_ID)
#DIM CHARA_IDX
#DIM CHARA_ID

CALL HO_STOP_USE_MODULE(CHARA_ID)
CALL HO_PRINT_LOG(@"@C:{カラー_緑}@%ANAME(CHARA_ID)%は去っていった@/C@")
CFLAG:CHARA_ID:調教参加フラグ = 0
CALL RELEASE_ALL_EQUIP(CHARA_ID)
IF IS_UNIQUE_CHARA(CHARA_ID)
    CFLAG:CHARA_ID:ゲストモブ = 0
ENDIF
CALL HO_DELETE_GUEST(CHARA_IDX)

;キャラリストの登録を消去
@HO_DELETE_GUEST(CHARA_IDX)
#DIM CHARA_IDX
TFLAG:生成済ゲスト数 --
_DIC_HO_CHARALIST:CHARA_IDX '= @"DELETED"

;-------------------------------------------------
;ゲスト用行動決定処理
;-------------------------------------------------
@HO_CHARAACT_DECIDE_ACT_GUEST(CHARA_ID, ROOM_IDX, 行動パターン)
#DIM CHARA_ID
#DIM ROOM_IDX
#DIMS 行動パターン
#DIM DYNAMIC CHARA_IDX
#DIMS DYNAMIC GUEST_TYPE

CALL HO_GET_CHARAIDX(CHARA_ID)
CHARA_IDX = RESULT
CALL HO_GET_CHARADATA(CHARA_IDX, "GUEST_TYPE")
GUEST_TYPE = %RESULTS%

;情事の現場を目撃
IF TCVAR:CHARA_ID:ウフフ目撃フラグ == 1
    RETURN ACT_ウフフ目撃
ENDIF

SELECTCASE GUEST_TYPE
    CASE "買物客"
        RETURN ACT_買物
    CASE "買春客"
        ;疲労からの休憩
        SIF IS_TIRED(CHARA_ID)
            RETURN ACT_休憩
        RETURN ACT_買春
    CASE "宿泊客"
        ;抽選を待たず強制的に実行される行動
        ;睡眠
        IF HO_OCLOCK() > RAND(2400, 2600) && RAND:3
            RETURN ACT_宿泊
        ELSEIF HO_OCLOCK() > 2600
            RETURN ACT_宿泊
        ENDIF
        ;食事
        SIF TCVAR:CHARA_ID:空腹度 >= 300
            RETURN ACT_食事
        ;疲労からの休憩
        SIF IS_TIRED(CHARA_ID) || TCVAR:CHARA_ID:疲労度 >= 150
            RETURN ACT_休憩
        ;行動抽選
        CALL RAND_WT_INIT()
        CALL HO_FIND_MODULE_BY_USAGE("娼館")
        IF RESULTS != "" && HO_OCLOCK() < 2200 && TCVAR:CHARA_ID:買春失敗カウンタ < 3
            IF CFLAG:CHARA_ID:カップル相手キャラID <= 0 && (CFLAG:CHARA_ID:スケベモブ || IS_ESTRUS(CHARA_ID, 4))
                CALL RAND_WT_SET(ACT_買春, 60)
            ENDIF
        ENDIF
        CALL HO_FIND_MODULE_BY_USAGE("商店")
        IF RESULTS != "" && HO_OCLOCK() < 1730
            CALL RAND_WT_SET(ACT_買物, 40)
        ENDIF
        CALL HO_FIND_MODULE_BY_USAGE("飲酒")
        IF RESULTS != ""
            IF HO_OCLOCK() < 1730
                CALL RAND_WT_SET(ACT_飲酒, 40)
            ELSEIF HO_OCLOCK() < 2500
                CALL RAND_WT_SET(ACT_飲酒, 60)
            ENDIF
        ENDIF
        IF CFLAG:CHARA_ID:カップル相手キャラID > 0
            CALL RAND_WT_SET(ACT_逢瀬準備, 60)
        ENDIF
        CALL RAND_WT_SET(ACT_休憩, 40)
        RETURN RAND_WT_RESULT()
ENDSELECT

;-------------------------------------------------
; ゲストモブのキャラクターデータプリセット
; SEX:0=男性,1=女性
;-------------------------------------------------
@CREATE_GUEST_MOB_PRESET(PRESET_NAME = "", SEX)
#DIM SEX
#DIMS PRESET_NAME
#DIMS DYNAMIC MOB_CLASS
#DIM  DYNAMIC CHARA_ID
#DIM  DYNAMIC IS_MALE_VIRGIN
#DIM  DYNAMIC IS_FEMALE_VIRGIN

CALL CREATE_GUEST_MOB_BASE(SEX)
CHARA_ID = RESULT

SELECTCASE PRESET_NAME
    CASE "買物客"
        IF RAND(100) < 10
            MOB_CLASS = %S_R("貴族/資本家")%
        ELSE
            MOB_CLASS = %S_R("冒険者/商人/村人/旅行者")%
        ENDIF
    CASE "冒険者"
        MOB_CLASS = "冒険者"
    CASE "旅行者"
        MOB_CLASS = "旅行者"
    CASE "村人"
        MOB_CLASS = "村人"
    CASE "村の子供"
        MOB_CLASS = %S_R("牧童/小姓/徒弟")%
    CASE "観客_街"
        MOB_CLASS = %S_R("冒険者/商人/市民/旅行者")%
    CASE "観客_スラム"
        MOB_CLASS = %S_R("冒険者/ならず者/娼婦/浮浪者/奴隷")%
    CASEELSE
ENDSELECT

TRYCCALLFORM CREATE_MOB_%MOB_CLASS%(CHARA_ID)
CATCH
    NAME:CHARA_ID = %MOB_CLASS%
    CALLNAME:CHARA_ID = %MOB_CLASS%
ENDCATCH

;所持金とキャラ購買意欲の設定
SELECTCASE JOB_NAME:(TALENT:CHARA_ID:職業)
    CASE "資本家", "貴族"
        CFLAG:CHARA_ID:キャラ消費金額 = RAND(24, 48) * 1000
        CFLAG:CHARA_ID:キャラ購買意欲 = RAND(20, 40)
    CASE "商人", "貿易商", "魔術師"
        CFLAG:CHARA_ID:キャラ消費金額 = RAND(12, 24) * 1000
        CFLAG:CHARA_ID:キャラ購買意欲 = RAND(20, 40)
    CASE "冒険者", "騎士", "傭兵"
        CFLAG:CHARA_ID:キャラ消費金額 = RAND(6, 10) * 1000
        CFLAG:CHARA_ID:キャラ購買意欲 = RAND(12, 18)
    CASEELSE
        CFLAG:CHARA_ID:キャラ消費金額 = RAND(2, 5) * 1000
        CFLAG:CHARA_ID:キャラ購買意欲 = RAND(12, 18)
ENDSELECT

;商店在庫の設定
IF PRESET_NAME == "買物客"
    CALL CREATE_GUEST_SET_SHOP_STOCK(CHARA_ID)
ENDIF

IS_MALE_VIRGIN = 0
IS_FEMALE_VIRGIN = 0
SIF SEX == 1
    IS_MALE_VIRGIN = -2
SIF SEX == 0 || SEX == 4
    IS_FEMALE_VIRGIN = -2

CALL RANDOM_CHARA_REPRODUCTION_SETTING(CHARA_ID, PRESET_NAME, IS_MALE_VIRGIN, IS_FEMALE_VIRGIN)

RETURN CHARA_ID

; #region @CREATE_GUEST_MOB_BASE
@CREATE_GUEST_MOB_BASE(SEX)
#DIM SEX
#DIMS PRESET_NAME
#DIM 対象
#DIMS 名前
#DIM SKILL_LV

CALL CREATE_RANDOM_CHARA(0, -1, SEX)
FLAG:汎用武将カウント --
対象 = RESULT
IF LOCAL == -1
    RETURN -1
ENDIF

NO:対象 = GET_EMPTY_NO()
NAME:対象 '= "ゲスト"
CALLNAME:対象 '= "ゲスト"
TALENT:対象:処女 = 0
TALENT:対象:キス未経験 = 0
TALENT:対象:童貞 = 0
TALENT:対象:アナル処女 = 0
CSTR:対象:0 =
CSTR:対象:1 =
TALENT:対象:性別 = SEX
ABL:対象:戦闘 =  RAND(35, 50)
ABL:対象:性知識 = 3
ABL:対象:奉仕 = 1
ABL:対象:性技 = RAND(0, 4)
ABL:対象:欲望 = RAND(3, 7)
ABL:対象:性交 = RAND(3, 5)
IF HAS_PENIS(対象)
    ABL:対象:射精 = RAND(3, 5)
ENDIF
ABL:対象:サド = RAND(0, 3)
ABL:対象:主導度Ｕ = RAND(-500, 500)
ABL:対象:倒錯度 = RAND(-300, 300)
CFLAG:対象:慰安モブ = 1
CFLAG:対象:ゲストモブ = 1
IF RAND:100 < FLCONFIG:ゲストの好色率
    CALL SKILL_GET_LEVEL(MASTER, スキル_大分類_性技, "SEDUCTION")
    SIF RESULT >= 1
        SKILL_LV = RESULT
    MAXBASE:対象:体力 = MAXBASE:対象:体力 * LIMIT(SKILL_LV ,1 , 3)
    BASE:対象:体力 = MAXBASE:対象:体力
    MAXBASE:対象:気力 = MAXBASE:対象:気力 * LIMIT(SKILL_LV ,1 , 3)
    BASE:対象:気力 = MAXBASE:対象:気力
    ABL:対象:倒錯度 =  ABL:対象:倒錯度 * LIMIT(SKILL_LV ,1 , 3)
    ABL:対象:欲望 = ABL:対象:欲望 * LIMIT(SKILL_LV ,1 , 3)
    ABL:対象:性交 = ABL:対象:性交 * LIMIT(SKILL_LV ,1 , 3)
    PALAM:対象:欲情 += RAND(3000)
    CFLAG:対象:スケベモブ = 1
    CFLAG:対象:強制友好化 = 1
    ABL:対象:性知識 = 5
    IF HAS_PENIS(対象)
        ABL:対象:Ｃ感 = RAND(5,30)
        COM_TENDENCY:対象:GETNUM(TRAINNAME, "順番に挿入") = 2
        COM_TENDENCY:対象:GETNUM(TRAINNAME, "代わる代わる挿入") = 3
        ABL:対象:射精 = ABL:対象:射精 * LIMIT(SKILL_LV ,1 , 3)
    ENDIF
ENDIF
IF GROUPMATCH(TALENT:対象:性別, 2, 3)
    IF RAND:100 < 50
        TALENT:対象:両刀 = 1
    ENDIF
ENDIF

IF IS_MALE(対象, 0)
    LOCALS '= S_R("male01.webp/male02.webp/male03.webp/male04.webp")
    CSTR:対象:顔グラファイル名 = %LOCALS%
    CSTR:対象:キャラ顔グラ = %LOCALS%
    CFLAG:対象:ポートレイト画像タイプ = 2
ENDIF

;衣装の設定
CALL RANDOM_CHARA_CLOTH_SETTING(名前, 対象)
FOR LOCAL, 0, CLOTH_PART_NUM
    調教用衣装:対象:(LOCAL) = CLOTH:対象:(LOCAL)
NEXT

RETURN 対象
; #endregion

@CREATE_MOB_冒険者(対象)
#DIM 対象
NAME:対象 '= "冒険者"
CALLNAME:対象 '= "冒険者"
TALENT:対象:職業 = FINDELEMENT(JOB_NAME, "冒険者")
;固有の素質をここに記述

@CREATE_MOB_商人(対象)
#DIM 対象
NAME:対象 '= "商人"
CALLNAME:対象 '= "商人"
TALENT:対象:職業 = FINDELEMENT(JOB_NAME, "商人")
;固有の素質をここに記述

@CREATE_MOB_村人(対象)
#DIM 対象
NAME:対象 '= "村人"
CALLNAME:対象 '= "村人"
TALENT:対象:職業 = FINDELEMENT(JOB_NAME, "村人")
;固有の素質をここに記述
FACE_PARTS:対象:IMG_服 '= S_R("CC1_服_平服_0/CC1_服_平服_1/CC1_服_ドレス_0/CC1_服_ドレス_1")
IF !RAND:3
    {
        FACE_PARTS:対象:IMG_アクセサリ1 = %TEXT_RANDC(
            "CC1_アクセサリ1_リボン_2", 1
            ,"CC1_アクセサリ1_リボン_3", 1
            ,"CC1_アクセサリ1_リボン_4", 1
            )%
    }
    COLOR_MATRIX_NAME:対象:IMG_アクセサリ1 = %S_R("白/赤/桃/青/黄/緑")%
ENDIF

@CREATE_MOB_市民(対象)
#DIM 対象
NAME:対象 '= "市民"
CALLNAME:対象 '= "市民"
TALENT:対象:職業 = FINDELEMENT(JOB_NAME, "市民")
;固有の素質をここに記述

@CREATE_MOB_魔術師(対象)
#DIM 対象
NAME:対象 '= "魔術師"
CALLNAME:対象 '= "魔術師"
TALENT:対象:職業 = FINDELEMENT(JOB_NAME, "魔術師")
;固有の素質をここに記述

@CREATE_MOB_貴族(対象)
#DIM 対象
#DIMS JOB
IF IS_MALE(対象)
    NAME:対象 '= "貴族"
    CALLNAME:対象 '= "貴族"
ELSE
    NAME:対象 '= "令嬢"
    CALLNAME:対象 '= "令嬢"
ENDIF

JOB = %S_R("貴族/王族")%
TALENT:対象:職業 = FINDELEMENT(JOB_NAME, JOB)
TALENT:対象:太客 = 1

@CREATE_MOB_資本家(対象)
#DIM 対象
#DIMS JOB

NAME:対象 '= "富豪"
CALLNAME:対象 '= "富豪"

JOB = %S_R("資本家/政治家/医者")%
TALENT:対象:職業 = FINDELEMENT(JOB_NAME, JOB)
TALENT:対象:太客 = 1

@CREATE_MOB_娼婦(対象)
#DIM 対象
#DIMS 名前
IF IS_MALE(対象)
    名前 '= @"%SPLIT_RAND("男娼",1)%"
ELSE
    名前 '= @"%SPLIT_RAND("娼婦",1)%"
ENDIF
NAME:対象 = %名前%
CALLNAME:対象 = %名前%
TALENT:対象:職業 = FINDELEMENT(JOB_NAME, "娼婦")
;固有の素質をここに記述
SETBIT TALENT:対象:淫乱系, 素質_淫乱_娼婦

;-------------------------------------------------
;@CREATE_MOB_ならず者
;
;-------------------------------------------------
;region @CREATE_MOB_ならず者
@CREATE_MOB_ならず者(対象)
#DIM 対象
#DIMS 名前
名前 = %S_R("ごろつき/ならず者")%
NAME:対象 = %名前%
CALLNAME:対象 = %名前%
TALENT:対象:職業 = FINDELEMENT(JOB_NAME, "無職")
;固有の素質をここに記述
ABL:対象:欲望 = RAND(3, 7)
ABL:対象:性交 = RAND(3, 5)
ABL:対象:サド = RAND(4, 8)
ABL:対象:主導度Ｕ = RAND(300, 600)
ABL:対象:倒錯度 = RAND(300, 600)
SETBIT SEXUAL_PREFERENCE:対象:0, 性的嗜好_虐げたい
COM_TENDENCY:対象:GETNUM(TRAINNAME, "服を破る") = 3
IF HAS_PENIS(対象)
    ABL:対象:射精 = RAND(3, 5)
    COM_TENDENCY:対象:GETNUM(TRAINNAME, "代わる代わる挿入") = 3
    COM_TENDENCY:対象:GETNUM(TRAINNAME, "代わる代わるＡ挿入") = 3
    COM_TENDENCY:対象:GETNUM(TRAINNAME, "順番に挿入") = 3
    COM_TENDENCY:対象:GETNUM(TRAINNAME, "順番にＡ挿入") = 3
ENDIF
IF IS_MALE(対象)
    LOCALS = %S_R("male01/male02/male03/shota01/shota02")%
    CSTR:対象:顔グラファイル名 '= @"%LOCALS%.webp"
    CSTR:対象:キャラ顔グラ '= @"%LOCALS%.webp"
    CFLAG:対象:ポートレイト画像タイプ = 2
ENDIF
;#endregion

@CREATE_MOB_浮浪者(対象)
#DIM 対象
#DIMS 名前
名前 = %S_R("浮浪者/乞食")%
NAME:対象 = %名前%
CALLNAME:対象 = %名前%
TALENT:対象:職業 = FINDELEMENT(JOB_NAME, "無職")
;固有の素質をここに記述

@CREATE_MOB_奴隷(対象)
#DIM 対象
#DIMS 名前
名前 = %S_R("奴隷")%
NAME:対象 = %名前%
CALLNAME:対象 = %名前%
TALENT:対象:職業 = FINDELEMENT(JOB_NAME, "無職")
;固有の素質をここに記述

@CREATE_MOB_旅行者(対象)
#DIM 対象
NAME:対象 '= "旅行者"
CALLNAME:対象 '= "旅行者"
TALENT:対象:職業 = FINDELEMENT(JOB_NAME, "市民")
;固有の素質をここに記述

@CREATE_MOB_吟遊詩人(対象)
#DIM 対象
NAME:対象 '= "吟遊詩人"
CALLNAME:対象 '= "吟遊詩人"
TALENT:対象:職業 = FINDELEMENT(JOB_NAME, "吟遊詩人")
;固有の素質をここに記述
TALENT:対象:目立ちたがり = RAND:2 ? 1 # 0
TALENT:対象:舌使い = RAND:3 ? 1 # 0

@CREATE_MOB_踊り子(対象)
#DIM 対象
NAME:対象 '= "踊り子"
CALLNAME:対象 '= "踊り子"
TALENT:対象:職業 = FINDELEMENT(JOB_NAME, "踊り子")
;固有の素質をここに記述
TALENT:対象:目立ちたがり = RAND:2 ? 1 # 0
TALENT:対象:美脚 = RAND:3 ? 1 # 0
TALENT:対象:美尻 = RAND:3 ? 1 # 0

;-------------------------------------------------
;@CREATE_MOB_村の子供
;
;-------------------------------------------------
;region @CREATE_MOB_村の子供
@CREATE_MOB_村の子供(対象)
#DIM 対象
#DIMS 名前
名前 = %SPLIT_RAND("牧童の/小姓の/徒弟の/奴隷の",1)%
IF IS_MALE(対象)
    名前 += @"%SPLIT_RAND("少年",1)%"
ELSE
    名前 += @"%SPLIT_RAND("少女/娘",1)%"
ENDIF

NAME:対象 = %名前%
CALLNAME:対象 = %名前%
TALENT:対象:職業 = FINDELEMENT(JOB_NAME, "村人")
;固有の素質をここに記述
TALENT:対象:キス未経験 = 1
IF IS_MALE(対象)
    TALENT:対象:童貞 = 1
ELSE
    TALENT:対象:処女 = 1
ENDIF
TALENT:対象:幼稚 = 1
TALENT:対象:アナル処女 = 1
TALENT:対象:体格 = 体格_小柄
;体格値再設定
CALL SET_BODYSIZE(対象)

IF IS_MALE(対象, 0)
    LOCALS = %S_R("male01/shota01/shota02/shota03/shota04")%
    CSTR:対象:顔グラファイル名 '= @"%LOCALS%.webp"
    CSTR:対象:キャラ顔グラ '= @"%LOCALS%.webp"
    CFLAG:対象:ポートレイト画像タイプ = 2
ENDIF
;#endregion

;-------------------------------------------------
;@CREATE_MOB_メスガキ
;-------------------------------------------------
;region @CREATE_MOB_メスガキ
@CREATE_MOB_メスガキ(対象)
#DIM  対象
#DIMS 名前
名前 = %S_R("メスガキ")%
NAME:対象 = %名前%
CALLNAME:対象 = %名前%
TALENT:対象:職業 = FINDELEMENT(JOB_NAME, "無職")

;固有の素質をここに記述
ABL:対象:サド = RAND(4, 8)
ABL:対象:マゾ = RAND(1, 4)
ABL:対象:主導度Ｕ = RAND(300, 600)
ABL:対象:倒錯度 = RAND(0, 300)
ABL:対象:性知識 = RAND(1, 4)
SETBIT SEXUAL_PREFERENCE:対象:0, 性的嗜好_虐げたい
TALENT:対象:プライド高い = 1
TALENT:対象:生意気 = 1
TALENT:対象:小悪魔 = 1
TALENT:対象:幼稚 = 1
TALENT:対象:体格 = 体格_小柄
TALENT:対象:アナル処女 = 1

;体格値再設定
CALL SET_BODYSIZE(対象)

;ポートレイト
FACE_PARTS:対象:IMG_服 '= "CC1_服_ロリータドレス_1"
FACE_PARTS:対象:IMG_アクセサリ1 = %S_R("/CC1_アクセサリ1_リボン_0/CC1_アクセサリ1_リボン_1/CC1_アクセサリ1_リボン_2/CC1_アクセサリ1_リボン_3/CC1_アクセサリ1_コサージュ_2")%
COLOR_MATRIX_NAME:対象:IMG_服 = %S_R("白/赤/桃")%
COLOR_MATRIX_NAME:対象:IMG_アクセサリ1 = %S_R("白/赤/桃")%

;#endregion

;-------------------------------------------------
;@CREATE_MOB_淫魔
;-------------------------------------------------
;region @CREATE_MOB_淫魔
@CREATE_MOB_淫魔(対象)
#DIM  対象
#DIMS 名前
名前 = %S_R("淫魔")%
NAME:対象 = %名前%
CALLNAME:対象 = %名前%
TALENT:対象:職業 = FINDELEMENT(JOB_NAME, "無職")

;固有の素質をここに記述
ABL:対象:サド = RAND(4, 8)
ABL:対象:マゾ = RAND(1, 4)
ABL:対象:主導度Ｕ = RAND(300, 600)
ABL:対象:倒錯度 = RAND(300, 600)
ABL:対象:性知識 = RAND(3, 4)
SETBIT SEXUAL_PREFERENCE:対象:0, 性的嗜好_虐げたい
SETBIT SEXUAL_PREFERENCE:対象:0, 性的嗜好_性交したい
SETBIT SEXUAL_PREFERENCE:対象:0, 性的嗜好_性交されたい
TALENT:対象:プライド高い = 1
TALENT:対象:生意気 = 1
TALENT:対象:小悪魔 = 1
TALENT:対象:謎の魅力 = 1
TALENT:対象:絶倫 = 1
TALENT:対象:両刀 = 1

;体格値再設定
CALL SET_BODYSIZE(対象)

;ポートレイト
IF !RAND:3
    COLOR_MATRIX_NAME:対象:IMG_身体 '= "褐色"
    COLOR_MATRIX_NAME:対象:IMG_顔 '= "褐色"
ENDIF

IF IS_FEMALE(対象)
    ;顔
    VARS パターン
    ;目
    パターン = %S_R("1/2/5/6/7")%
    FACE_PARTS:対象:IMG_瞳 '= @"CC1_瞳_%パターン%"
    FACE_PARTS:対象:IMG_目 '= @"CC1_目_%パターン%"
    ;口
    パターン = %S_R("0/0/0/1/2/3/4")%
    FACE_PARTS:対象:IMG_口 '= @"CC1_口_%パターン%"
    ;眉
    パターン = %S_R("0/0/0/3/4/5")%
    FACE_PARTS:対象:IMG_眉 '= @"CC1_眉_%パターン%"
    ;外装
    FACE_PARTS:対象:IMG_服 '= @"%S_R("CC1_服_ロリータドレス_1/CC1_服_下着_3/CC1_服_下着_4")%"
    FACE_PARTS:対象:IMG_アクセサリ1 = %S_R("/CC1_アクセサリ1_リボン_0/CC1_アクセサリ1_リボン_1/CC1_アクセサリ1_リボン_2/CC1_アクセサリ1_リボン_3/CC1_アクセサリ1_コサージュ_2")%
    FACE_PARTS:対象:IMG_頭部位 = %S_R("CC1_頭部位_ケモミミ_4/CC1_頭部位_ケモミミ_6")%
    FACE_PARTS:対象:IMG_背面 = %S_R("CC1_背面_翼_2/CC1_背面_尻尾_0")%
    COLOR_MATRIX_NAME:対象:IMG_服 = %S_R("赤/桃/黒")%
    COLOR_MATRIX_NAME:対象:IMG_アクセサリ1 = %S_R("白/赤/桃")%
ELSE
    ;男性はデフォルトでポートレイトなしのため再生成
    CALL RANDOM_CHARA_CREATE_PORTRAIT(対象)
    ;前髪
    パターン = %S_R("0/1/2/3/4/7/10/11/12/13/14/15/16/17/18/21/22")%
    FACE_PARTS:対象:IMG_前髪 = %@"CC1_前髪_%パターン%"%
    ;後髪
    パターン = %S_R("0/6/8/10")%
    FACE_PARTS:対象:IMG_後髪 = %@"CC1_後髪_%パターン%"%
    ;目
    パターン = %S_R("1/2/5/6")%
    FACE_PARTS:対象:IMG_瞳 '= @"CC1_瞳_%パターン%"
    FACE_PARTS:対象:IMG_目 '= @"CC1_目_%パターン%"
    ;口
    パターン = %S_R("0/0/0/1/2/3/4")%
    FACE_PARTS:対象:IMG_口 '= @"CC1_口_%パターン%"
    ;眉
    パターン = %S_R("0/0/0/1")%
    FACE_PARTS:対象:IMG_眉 '= @"CC1_眉_%パターン%"
    IF パターン == "1"
        COLOR_MATRIX_NAME:対象:IMG_眉 = %COLOR_MATRIX_NAME:対象:IMG_前髪%
    ENDIF
    FACE_PARTS:対象:IMG_服 '= @""
    FACE_PARTS:対象:IMG_頭部位 = %S_R("CC1_頭部位_ケモミミ_4/CC1_頭部位_ケモミミ_6")%
    FACE_PARTS:対象:IMG_背面 = %S_R("CC1_背面_翼_2/CC1_背面_尻尾_0")%
ENDIF

;#endregion


code:
;-------------------------------------------------
; ゲストの商店在庫
;-------------------------------------------------
@CREATE_GUEST_SET_SHOP_STOCK(CHARA_ID)
#DIM CHARA_ID
#DIM DYNAMIC ITEM_ID
#DIM DYNAMIC SHOP_STOCK
#DIM DYNAMIC PRICE
#DIM DYNAMIC IDX

;初期化
VARSET DICS_GUEST_SHOP_STOCK:CHARA_ID:0

SELECTCASE JOB_NAME:(TALENT:CHARA_ID:職業)
    CASE "村人", "農民"
        ; #region
        ITEM_ID = ITEM_小麦
        SHOP_STOCK = RAND(3, 9)
        CALL GET_ITEM_INFO(ITEM_ID, ITEM_PRICE)
        PRICE = FTIMES(RESULT, 200)
        DICS_GUEST_SHOP_STOCK:CHARA_ID:(IDX++) '= @"[ITEM_ID:{ITEM_ID}][ITEM_PRICE:{PRICE}][SHOP_STOCK:{SHOP_STOCK}]"
        SELECTCASE RAND:3
            CASE 0
                ITEM_ID = ITEM_動物の卵
                SHOP_STOCK = RAND(3, 9)
                CALL GET_ITEM_INFO(ITEM_ID, ITEM_PRICE)
                PRICE = FTIMES(RESULT, 200)
                DICS_GUEST_SHOP_STOCK:CHARA_ID:(IDX++) '= @"[ITEM_ID:{ITEM_ID}][ITEM_PRICE:{PRICE}][SHOP_STOCK:{SHOP_STOCK}]"
            CASE 1
                ITEM_ID = ITEM_肥料
                SHOP_STOCK = RAND(2, 4)
                CALL GET_ITEM_INFO(ITEM_ID, ITEM_PRICE)
                PRICE = FTIMES(RESULT, 200)
                DICS_GUEST_SHOP_STOCK:CHARA_ID:(IDX++) '= @"[ITEM_ID:{ITEM_ID}][ITEM_PRICE:{PRICE}][SHOP_STOCK:{SHOP_STOCK}]"
            CASE 2
                ITEM_ID = ITEM_動物の革
                SHOP_STOCK = RAND(3, 9)
                CALL GET_ITEM_INFO(ITEM_ID, ITEM_PRICE)
                PRICE = FTIMES(RESULT, 200)
                DICS_GUEST_SHOP_STOCK:CHARA_ID:(IDX++) '= @"[ITEM_ID:{ITEM_ID}][ITEM_PRICE:{PRICE}][SHOP_STOCK:{SHOP_STOCK}]"
        ENDSELECT
        IF RAND:100 < 25
            ITEM_ID = ITEM_サンドウィッチ
            SHOP_STOCK = RAND(1, 3)
            CALL GET_ITEM_INFO(ITEM_ID, ITEM_PRICE)
            PRICE = FTIMES(RESULT, 200)
            DICS_GUEST_SHOP_STOCK:CHARA_ID:(IDX++) '= @"[ITEM_ID:{ITEM_ID}][ITEM_PRICE:{PRICE}][SHOP_STOCK:{SHOP_STOCK}]"
        ENDIF
        IF RAND:100 < 15
            ITEM_ID = ITEM_ディナリア銀貨
            SHOP_STOCK = RAND(1, 3)
            CALL GET_ITEM_INFO(ITEM_ID, ITEM_PRICE)
            PRICE = FTIMES(RESULT, 250)
            DICS_GUEST_SHOP_STOCK:CHARA_ID:(IDX++) '= @"[ITEM_ID:{ITEM_ID}][ITEM_PRICE:{PRICE}][SHOP_STOCK:{SHOP_STOCK}]"
        ENDIF
        IF RAND:100 < 45
            ITEM_ID = ITEM_チーズ
            SHOP_STOCK = RAND(1, 3)
            CALL GET_ITEM_INFO(ITEM_ID, ITEM_PRICE)
            PRICE = FTIMES(RESULT, 250)
            DICS_GUEST_SHOP_STOCK:CHARA_ID:(IDX++) '= @"[ITEM_ID:{ITEM_ID}][ITEM_PRICE:{PRICE}][SHOP_STOCK:{SHOP_STOCK}]"
        ENDIF
		SELECTCASE HO_SEASON()
			CASE 0
				IF RAND:100 < 50
					ITEM_ID = ITEM_キャベツ
				ELSE
					ITEM_ID = ITEM_ニンニク
				ENDIF
			CASE 1
				IF RAND:100 < 50
					ITEM_ID = ITEM_トマト
				ELSE
					ITEM_ID = ITEM_カボチャ
				ENDIF
			CASE 2
				IF RAND:100 < 50
					ITEM_ID = ITEM_ニンジン
				ELSE
					ITEM_ID = ITEM_タマネギ
				ENDIF
			CASE 3
				IF RAND:100 < 50
					ITEM_ID = ITEM_カブ
				ELSE
					ITEM_ID = ITEM_ネギ
				ENDIF
		ENDSELECT
		SHOP_STOCK = RAND(3, 9)
		CALL GET_ITEM_INFO(ITEM_ID, ITEM_PRICE)
		PRICE = FTIMES(RESULT, 200)
		DICS_GUEST_SHOP_STOCK:CHARA_ID:(IDX++) '= @"[ITEM_ID:{ITEM_ID}][ITEM_PRICE:{PRICE}][SHOP_STOCK:{SHOP_STOCK}]"
		;村人限定の品物
		IF JOB_NAME:(TALENT:CHARA_ID:職業) == "村人"
			IF RAND:100 < 25 && FLAG:領地評判_商業 >= 150
				ITEM_ID = ITEM_鮮肉の大塊
				SHOP_STOCK = RAND(1, 2)
				CALL GET_ITEM_INFO(ITEM_ID, ITEM_PRICE)
				PRICE = FTIMES(RESULT, 200)
				DICS_GUEST_SHOP_STOCK:CHARA_ID:(IDX++) '= @"[ITEM_ID:{ITEM_ID}][ITEM_PRICE:{PRICE}][SHOP_STOCK:{SHOP_STOCK}]"
			ENDIF
		ENDIF
        ; #endregion
    CASE "商人", "冒険者"
        ; #region
        ;確定枠
        SELECTCASE RAND:4
            CASE 0
                ITEM_ID = ITEM_鉄鉱石
                SHOP_STOCK = RAND(3, 9)
                CALL GET_ITEM_INFO(ITEM_ID, ITEM_PRICE)
                PRICE = FTIMES(RESULT, 200)
                DICS_GUEST_SHOP_STOCK:CHARA_ID:(IDX++) '= @"[ITEM_ID:{ITEM_ID}][ITEM_PRICE:{PRICE}][SHOP_STOCK:{SHOP_STOCK}]"
            CASE 1
                ITEM_ID = ITEM_銀鉱石
                SHOP_STOCK = RAND(3, 6)
                CALL GET_ITEM_INFO(ITEM_ID, ITEM_PRICE)
                PRICE = FTIMES(RESULT, 300)
                DICS_GUEST_SHOP_STOCK:CHARA_ID:(IDX++) '= @"[ITEM_ID:{ITEM_ID}][ITEM_PRICE:{PRICE}][SHOP_STOCK:{SHOP_STOCK}]"
            CASE 2
                ITEM_ID = ITEM_鋼インゴット
                SHOP_STOCK = RAND(3, 9)
                CALL GET_ITEM_INFO(ITEM_ID, ITEM_PRICE)
                PRICE = FTIMES(RESULT, 300)
                DICS_GUEST_SHOP_STOCK:CHARA_ID:(IDX++) '= @"[ITEM_ID:{ITEM_ID}][ITEM_PRICE:{PRICE}][SHOP_STOCK:{SHOP_STOCK}]"
            CASE 3
                ITEM_ID = ITEM_建築資材
                SHOP_STOCK = RAND(3, 9)
                CALL GET_ITEM_INFO(ITEM_ID, ITEM_PRICE)
                PRICE = FTIMES(RESULT, 300)
                DICS_GUEST_SHOP_STOCK:CHARA_ID:(IDX++) '= @"[ITEM_ID:{ITEM_ID}][ITEM_PRICE:{PRICE}][SHOP_STOCK:{SHOP_STOCK}]"
        ENDSELECT
        ;ランダム枠
        IF RAND:100 < 50
            ITEM_ID = ITEM_金属細工
            SHOP_STOCK = RAND(6, 9)
            CALL GET_ITEM_INFO(ITEM_ID, ITEM_PRICE)
            PRICE = FTIMES(RESULT, 300)
            DICS_GUEST_SHOP_STOCK:CHARA_ID:(IDX++) '= @"[ITEM_ID:{ITEM_ID}][ITEM_PRICE:{PRICE}][SHOP_STOCK:{SHOP_STOCK}]"
        ENDIF
        IF RAND:100 < 50
            ITEM_ID = ITEM_蒸留酒
            SHOP_STOCK = RAND(3, 6)
            CALL GET_ITEM_INFO(ITEM_ID, ITEM_PRICE)
            PRICE = FTIMES(RESULT, 300)
            DICS_GUEST_SHOP_STOCK:CHARA_ID:(IDX++) '= @"[ITEM_ID:{ITEM_ID}][ITEM_PRICE:{PRICE}][SHOP_STOCK:{SHOP_STOCK}]"
        ENDIF
        IF RAND:100 < 50
            ITEM_ID = ITEM_岩塩
            SHOP_STOCK = RAND(3, 6)
            CALL GET_ITEM_INFO(ITEM_ID, ITEM_PRICE)
            PRICE = FTIMES(RESULT, 300)
            DICS_GUEST_SHOP_STOCK:CHARA_ID:(IDX++) '= @"[ITEM_ID:{ITEM_ID}][ITEM_PRICE:{PRICE}][SHOP_STOCK:{SHOP_STOCK}]"
        ENDIF
        IF RAND:100 < 20
            ITEM_ID = ITEM_金鉱石
            SHOP_STOCK = RAND(3, 6)
            CALL GET_ITEM_INFO(ITEM_ID, ITEM_PRICE)
            PRICE = FTIMES(RESULT, 300)
            DICS_GUEST_SHOP_STOCK:CHARA_ID:(IDX++) '= @"[ITEM_ID:{ITEM_ID}][ITEM_PRICE:{PRICE}][SHOP_STOCK:{SHOP_STOCK}]"
        ENDIF
        IF RAND:100 < 25
            ITEM_ID = ITEM_石炭
            SHOP_STOCK = RAND(3, 6)
            CALL GET_ITEM_INFO(ITEM_ID, ITEM_PRICE)
            PRICE = FTIMES(RESULT, 300)
            DICS_GUEST_SHOP_STOCK:CHARA_ID:(IDX++) '= @"[ITEM_ID:{ITEM_ID}][ITEM_PRICE:{PRICE}][SHOP_STOCK:{SHOP_STOCK}]"
        ENDIF
        IF RAND:100 < 25
            ITEM_ID = ITEM_火薬
            SHOP_STOCK = RAND(3, 6)
            CALL GET_ITEM_INFO(ITEM_ID, ITEM_PRICE)
            PRICE = FTIMES(RESULT, 300)
            DICS_GUEST_SHOP_STOCK:CHARA_ID:(IDX++) '= @"[ITEM_ID:{ITEM_ID}][ITEM_PRICE:{PRICE}][SHOP_STOCK:{SHOP_STOCK}]"
        ENDIF
        IF RAND:100 < 35
            ITEM_ID = ITEM_バター
            SHOP_STOCK = RAND(3, 6)
            CALL GET_ITEM_INFO(ITEM_ID, ITEM_PRICE)
            PRICE = FTIMES(RESULT, 300)
            DICS_GUEST_SHOP_STOCK:CHARA_ID:(IDX++) '= @"[ITEM_ID:{ITEM_ID}][ITEM_PRICE:{PRICE}][SHOP_STOCK:{SHOP_STOCK}]"
        ENDIF
		;商人限定の品物
		IF JOB_NAME:(TALENT:CHARA_ID:職業) == "商人"
			IF RAND:100 < 75 && FLAG:領地評判_商業 >= 150
				ITEM_ID = ITEM_レッドペッパー
				SHOP_STOCK = RAND(3, 6)
				CALL GET_ITEM_INFO(ITEM_ID, ITEM_PRICE)
				PRICE = FTIMES(RESULT, 300)
				DICS_GUEST_SHOP_STOCK:CHARA_ID:(IDX++) '= @"[ITEM_ID:{ITEM_ID}][ITEM_PRICE:{PRICE}][SHOP_STOCK:{SHOP_STOCK}]"
			ENDIF
			IF RAND:100 < 45 && FLAG:領地評判_商業 >= 250
				ITEM_ID = ITEM_東方スパイス
				SHOP_STOCK = RAND(2, 4)
				CALL GET_ITEM_INFO(ITEM_ID, ITEM_PRICE)
				PRICE = FTIMES(RESULT, 150)
				DICS_GUEST_SHOP_STOCK:CHARA_ID:(IDX++) '= @"[ITEM_ID:{ITEM_ID}][ITEM_PRICE:{PRICE}][SHOP_STOCK:{SHOP_STOCK}]"
			ENDIF
		ENDIF
		;冒険者限定の品物
		IF JOB_NAME:(TALENT:CHARA_ID:職業) == "冒険者"
			IF RAND:100 < 25 && FLAG:領地評判_商業 >= 250
				ITEM_ID = ITEM_竜の肉
				SHOP_STOCK = RAND(1, 3)
				CALL GET_ITEM_INFO(ITEM_ID, ITEM_PRICE)
				PRICE = FTIMES(RESULT, 200)
				DICS_GUEST_SHOP_STOCK:CHARA_ID:(IDX++) '= @"[ITEM_ID:{ITEM_ID}][ITEM_PRICE:{PRICE}][SHOP_STOCK:{SHOP_STOCK}]"
			ENDIF
		ENDIF
        IF CFLAG:CHARA_ID:スケベモブ
            IF RAND:100 < 75
                ITEM_ID = TOINT(S_R(@"{ITEM_ローション}/{ITEM_コンドーム}"))
                SHOP_STOCK = RAND(6, 9)
                CALL GET_ITEM_INFO(ITEM_ID, ITEM_PRICE)
                PRICE = FTIMES(RESULT, 300)
                DICS_GUEST_SHOP_STOCK:CHARA_ID:(IDX++) '= @"[ITEM_ID:{ITEM_ID}][ITEM_PRICE:{PRICE}][SHOP_STOCK:{SHOP_STOCK}]"
            ENDIF
            IF RAND:100 < 40
                ITEM_ID = TOINT(S_R(@"{ITEM_オナホール}/{ITEM_ローター}/{ITEM_バイブ}/{ITEM_アナルバイブ}"))
                SHOP_STOCK = 1
                CALL GET_ITEM_INFO(ITEM_ID, ITEM_PRICE)
                PRICE = FTIMES(RESULT, 300)
                DICS_GUEST_SHOP_STOCK:CHARA_ID:(IDX++) '= @"[ITEM_ID:{ITEM_ID}][ITEM_PRICE:{PRICE}][SHOP_STOCK:{SHOP_STOCK}]"
            ENDIF
            IF RAND:100 < 25
                ITEM_ID = TOINT(S_R(@"{ITEM_ニプルキャップ}/{ITEM_クリキャップ}"))
                SHOP_STOCK = 1
                CALL GET_ITEM_INFO(ITEM_ID, ITEM_PRICE)
                PRICE = FTIMES(RESULT, 300)
                DICS_GUEST_SHOP_STOCK:CHARA_ID:(IDX++) '= @"[ITEM_ID:{ITEM_ID}][ITEM_PRICE:{PRICE}][SHOP_STOCK:{SHOP_STOCK}]"
            ENDIF
        ENDIF
        ; #endregion
ENDSELECT

repo_name: napo/erafl

license: unknown


code:
;-------------------------------------------------
; 宿場関連のNPC処理
;-------------------------------------------------
; #region
;-------------------------------------------------
; ゲスト生成処理
;店番中のキャラが居るなら宿場のあるエリアにゲストの生成を試みる
;-------------------------------------------------
; #region
@HO_CREATE_GUEST_INN
#DIM  DYNAMIC CHARA_ID
#DIM  DYNAMIC CHARA_ID_COUPLE
#DIMS DYNAMIC LIST_CHARA
#DIMS DYNAMIC PRESET_NAME
#DIM  DYNAMIC VISITOR_NUM
#DIM  DYNAMIC ROOM_IDX
#DIM  DYNAMIC SHOPPER_ID
#DIM  DYNAMIC PROFIT
#DIM  DYNAMIC LIKE
#DIM  DYNAMIC DEPENDENCE
#DIM  DYNAMIC SUBORDINATE
#DIM  DYNAMIC DOMINANCE

;宿泊目的のモブ生成は8:30～21:00時まで
SIF !INRANGE(HO_TIME, HO_CLOCK(830), HO_CLOCK(2100))
    RETURN 0

CALL HO_FIND_CHARA("ACTION", "宿番中")
IF !RESULT
    CALL HO_CHECK_USE_MODULE_USAGE(MASTER, "宿番")
    IF RESULT
        LIST_CHARA = %LIST_ADD(LIST_CHARA, TOSTR(MASTER))%
    ELSE
        RETURN 0
    ENDIF
ELSE
    LIST_CHARA = %RESULTS%
ENDIF
SHOPPER_ID = TOINT(LIST_GET(LIST_CHARA, 0))
IF SHOPPER_ID != MASTER
    CALL HO_GET_CHARAPLACE(SHOPPER_ID)
    ROOM_IDX = RESULT
ELSE
    ROOM_IDX = HO_MASTER現在地
ENDIF

;モブ生成判定
LIST_CHARA '= ""
;通常の宿泊客
IF !(RAND:100 < FLCONFIG:カップル客の生成率)
    FOR LOCAL, 0, RAND(1, 3)
        CALL HO_CREATE_GUEST(ROOM_IDX, "宿泊客", "買物客", RAND:100 < FLCONFIG:宿泊ゲストの男性率 ? 0 # 1)
        IF RESULT
            CHARA_ID = RESULT
            SIF IS_FEMALE(CHARA_ID)
                CFLAG:CHARA_ID:汎用口上パターン = 1000
            LIST_CHARA = %LIST_ADD(LIST_CHARA, TOSTR(CHARA_ID))%
        ENDIF
    NEXT
    ;カップル
ELSE
    PRESET_NAME = %S_R("冒険者/旅行者/村人")%
    ;カップルの性別決定
    VARI SEX_MAIN_CHARA = 0
    VARI SEX_COUPLE_CHARA = 1
    IF RAND:100 < FLCONFIG:同性カップル客の生成率
        ;同性カップル
        SEX_MAIN_CHARA = FLCONFIG:宿泊ゲストの男性率 ? 0 # 1
        IF (SEX_MAIN_CHARA == 0 && FLCONFIG:男性同性カップルの許可) || (SEX_MAIN_CHARA == 1 && FLCONFIG:女性同性カップルの許可)
            SEX_COUPLE_CHARA = SEX_MAIN_CHARA
        ELSE
            ;いずれの同性カップルも生成出来ないなら異性カップルとして生成
            SEX_MAIN_CHARA = 0
            SEX_COUPLE_CHARA = 1
        ENDIF
    ENDIF
    ;男性を生成
    CALL HO_CREATE_GUEST(ROOM_IDX, "宿泊客", PRESET_NAME, SEX_MAIN_CHARA)
    IF RESULT
        CHARA_ID = RESULT
        CHARA_ID_COUPLE = RESULT
        IF IS_FEMALE(CHARA_ID)
            CFLAG:CHARA_ID:汎用口上パターン = 1000
        ENDIF
        LIST_CHARA = %LIST_ADD(LIST_CHARA, TOSTR(CHARA_ID))%
        NAME:CHARA_ID '= @"%PRESET_NAME%(彼氏)"
        CALLNAME:CHARA_ID '= "%PRESET_NAME%(彼氏)"
    ENDIF
    ;女性を生成
    CALL HO_CREATE_GUEST(ROOM_IDX, "宿泊客", PRESET_NAME, SEX_COUPLE_CHARA)
    IF RESULT
        CHARA_ID = RESULT
        IF IS_FEMALE(CHARA_ID)
            CFLAG:CHARA_ID:汎用口上パターン = 1000
        ENDIF
        LIST_CHARA = %LIST_ADD(LIST_CHARA, TOSTR(CHARA_ID))%
        NAME:CHARA_ID '= @"%PRESET_NAME%(彼女)"
        CALLNAME:CHARA_ID '= @"%PRESET_NAME%(彼女)"
    ENDIF

    ;カップル関係を設定
    CFLAG:CHARA_ID:カップル相手キャラID = CHARA_ID_COUPLE
    CFLAG:CHARA_ID_COUPLE:カップル相手キャラID = CHARA_ID

    ;同性用補正
    IF IS_SAMESEX(CHARA_ID, CHARA_ID_COUPLE)
        IF IS_FEMALE(CHARA_ID)
            ABL:CHARA_ID:レズ = 6
            ABL:CHARA_ID_COUPLE:レズ = 6
        ELSE
            ABL:CHARA_ID:ＢＬ = 6
            ABL:CHARA_ID_COUPLE:ＢＬ = 6
        ENDIF
    ENDIF

    ;欲情を追加
    PALAM:(CHARA_ID):欲情 += RAND(3000)
    PALAM:(CHARA_ID_COUPLE):欲情 += RAND(3000)

    ;;kom1 memo:V0.372時点ではモブ同士は関係性を持たないが、セット処理は残しておく
    ;好感度
    LIKE = RAND(1500, 10000)
    ;依存度
    DEPENDENCE = RAND(300, 3000)
    ;従属度
    SUBORDINATE = RAND(1500, 10000)
    ;支配度
    DOMINANCE = RAND(1500, 10000)

    CALL CHARA_RELATION_CHANGE(CHARA_ID, CHARA_ID_COUPLE, LIKE, DEPENDENCE, SUBORDINATE, DOMINANCE * -1)
    CALL CHARA_RELATION_CHANGE(CHARA_ID_COUPLE, CHARA_ID, LIKE, DEPENDENCE, SUBORDINATE * -1, DOMINANCE)

ENDIF

VISITOR_NUM = LIST_COUNT(LIST_CHARA)
IF VISITOR_NUM
    ;カップルの場合
    IF CFLAG:CHARA_ID:カップル相手キャラID > 0
        CALL HO_PRINT_LOG(@"@C:{カラー_緑}@%PRESET_NAME%のカップルが宿泊しにやって来た@/C@")
    ELSE
        CALL HO_PRINT_LOG(@"@C:{カラー_緑}@%ANAME(LIST_GETINT(LIST_CHARA, 0), VISITOR_NUM)%が宿泊しにやって来た@/C@")
    ENDIF

    CALL HO_GUEST_REGIST_TO_ROOM_AS_VISITOR(LIST_CHARA)
    ;宿泊に失敗
    IF !RESULT
        FOR LOCAL, 0,VISITOR_NUM
            CHARA_ID = LIST_GETINT(LIST_CHARA, LOCAL)
            CFLAG:CHARA_ID:キャラ滞在時間 = RAND(8, 12) * HO_単位時間
        NEXT
        RETURN 0
    ENDIF
    ;宿泊に成功
    ;宿泊目的のゲストは宿泊先が確保できているなら時間が許す限り滞在する
    FOR LOCAL, 0,VISITOR_NUM
        CFLAG:CHARA_ID:キャラ滞在時間 = 9999
        PROFIT += 4000
    NEXT
    CALL HO_PRINT_LOG(@"%ANAME(CHARA_ID, VISITOR_NUM)%から宿代として@C:{カラー_緑}@%TOSTR(PROFIT, "#,##0")%@/C@ディナリを得た")
    MONEY += PROFIT
    RETURN 1
ELSE
    RETURN 0
ENDIF
; #endregion

;-------------------------------------------------
@HO_GUEST_REGIST_TO_ROOM_AS_VISITOR(LIST_CHARA)
#DIMS LIST_CHARA
#DIM  DYNAMIC MODULE_IDX
#DIM  DYNAMIC MODULE_ID
#DIM  DYNAMIC MODULE_SLOT_IDX
#DIM  DYNAMIC ROOM_IDX
#DIM  DYNAMIC MODULE_NUM
#DIM  DYNAMIC VISITOR_NUM
#DIMS DYNAMIC LIST_MODULE_IDX
#DIMS DYNAMIC LIST_VISITOR
#DIM  DYNAMIC ITER_I
#DIM  DYNAMIC ITER_J

VISITOR_NUM = LIST_COUNT(LIST_CHARA)
;宿泊する部屋の決定
CALL HO_FIND_MODULE_BY_USAGE("宿泊")
LIST_MODULE_IDX = %RESULTS%
MODULE_NUM = LIST_COUNT(LIST_MODULE_IDX)

;宿泊できる設備がもうない場合
; SIF MODULE_NUM == TFLAG:宿泊客数
;     RETURN 0
FOR ITER_I, 0, MODULE_NUM
    MODULE_IDX = LIST_GETINT(LIST_MODULE_IDX, ITER_I)
    CALL HO_GET_MODULE_LIST(MODULE_IDX, "VISITOR_ID")
    LIST_VISITOR = %RESULTS%
    ;VISITOR登録がない場合は宿泊客としての登録を試みる
    IF !LIST_COUNT(LIST_VISITOR)
        ;キャパシティは足りているか
        CALL HO_GET_MODULE_LIST(MODULE_IDX, "MODULE_ID")
        MODULE_ID = RESULT
        CALL HO_GET_MODULE_LIST(MODULE_IDX, "ROOM_IDX")
        ROOM_IDX = RESULT
        CALL HO_GET_MODULE_LIST(MODULE_IDX, "MODULE_SLOT_IDX")
        MODULE_SLOT_IDX = RESULT
        CALL HO_CHECK_MODULE_CAPACITY(ROOM_IDX, MODULE_SLOT_IDX)
        ;キャパが足りない場合はスキップ
        SIF RESULT < VISITOR_NUM
            CONTINUE
        ;宿泊が可能
        CALL HO_SET_MODULE_LIST(MODULE_IDX, "VISITOR_ID", LIST_CHARA)
        FOR ITER_J, 0, VISITOR_NUM
            TCVAR:(LIST_GETINT(LIST_CHARA, ITER_J)):宿泊先設備IDX = MODULE_IDX
        NEXT
        TFLAG:宿泊客数 ++
        RETURN 1
    ENDIF
NEXT
RETURN 0


code:
;-------------------------------------------------
;;; ハウジングモード用の入力受付処理
;;; INPUT_VALUE 入力したボタン番号(数値)
;;; INPUT_OPTION クリックの種類(1=左クリック,2=右クリック,3=中央クリック)
;;; INPUT_OPTION2 補助キーの種類(Shift, Ctrl, Alt)
;;; INPUT_VALUES 入力されたボタン番号(文字列)
;-------------------------------------------------
@HOUSING_TRAIN_INPUT(INPUT_VALUE, INPUT_OPTION, INPUT_OPTION2, INPUT_VALUES)
#DIM  INPUT_VALUE
#DIM  INPUT_OPTION
#DIM  INPUT_OPTION2
#DIMS INPUT_VALUES
#DIM CHARA_ID
#DIM DYNAMIC ROOM_IDX
#DIM DYNAMIC MODULE_IDX
#DIMS DYNAMIC _LIST_MODULE_LIST
VARI MOUSE_BTN = INPUT_OPTION

;ボタン入力時の数値情報を表示しない
CLEARLINE 1
;キャラボタンのクリック処理
IF INRANGE(INPUT_VALUE, HO_キャラボタンID, HO_キャラボタンID + 10000)
    CHARA_ID = INPUT_VALUE - HO_キャラボタンID
    IF MOUSE_BTN == 1 && FLAG:調教モード == 調教_居住区
        CALL HO_INPUT_CHANGE_COMPANION(CHARA_ID)
        IF RESULT == -1
            RETURN
        ENDIF
        ;右クリックでクイックメニュー呼び出し
    ELSEIF MOUSE_BTN == 2
        CALL HO_CHARA_QUICK_MENU(CHARA_ID)
    ENDIF
ELSEIF INPUT_VALUE == HO_マップ非表示ボタンID && FLAG:ハウジングモード
    INVERTBIT HO_マップ非表示, 0
ELSEIF INPUT_VALUE == HO_キャラ情報ボタンID_行動 && FLAG:ハウジングモード
    INVERTBIT HO_キャラ行動表示, 0
ELSEIF INPUT_VALUE == HO_キャラ情報ボタンID_衣装 && FLAG:ハウジングモード
    INVERTBIT HO_キャラ衣装表示, 0
ELSEIF INPUT_VALUE == HO_キャラ情報ボタンID_切替 && FLAG:ハウジングモード
    INVERTBIT HO_キャラ情報切替フラグ, 0
    ;ポートレート画像サイズ設定ボダン
ELSEIF INRANGE(INPUT_VALUE, HO_画像サイズ切替ボタンID, HO_画像サイズ切替ボタンID + VARSIZE("PORTRAIT_サイズ設定文字列"))
    CALL HO_PORTRAIT_SIZE_SETTING(INPUT_VALUE - HO_画像サイズ切替ボタンID)
ELSEIF INRANGE(INPUT_VALUE, HO_画像スライドボタンID, HO_画像スライドボタンID + 3)
    INPUT_VALUE = INPUT_VALUE - HO_画像スライドボタンID
    SELECTCASE INPUT_VALUE
        CASE 0
            HO_SHOW_PORTRAIT_IDX --
        CASE 1
            HO_SHOW_PORTRAIT_IDX ++
        CASE 2
            HO_SHOW_PORTRAIT_IDX = 0
        CASE 3
            HO_SHOW_PORTRAIT_IDX = HO_SHOW_MEMBERNUM - 1
    ENDSELECT
    ;キャラ衣装ボタンのクリック処理
ELSEIF INPUT_VALUE >= HO_キャラボタンID_衣装 && INPUT_VALUE < HO_キャラボタンID_衣装 + 1000000
    IF (FLAG:ハウジングモード && !FLAG:クエストモード) || (FLAG:クエストモード && FLAG:クエスト_交流コマンド許可)
        ;調教画面の衣装ボタンから呼ばれる
        ;INPUT_VALUE =2XXXXYY,XXXX = CHARA_ID, YY = 衣装部位
        VARI CHARA_ID = (INPUT_VALUE - HO_キャラボタンID_衣装) / 100
        VARI 部位 = INPUT_VALUE % 100
        CALL HO_CHANGE_CLOTH_COND(CHARA_ID, 部位)
    ENDIF
    ;マップボタンのクリック処理
ELSEIF INPUT_VALUE >= HO_マップボタンID && INPUT_VALUE <= HO_マップボタンID + HO_MAX_ROOMNUM && (FLAG:調教モード == 調教_居住区 || FLAG:調教モード == 調教_クエスト)
    ROOM_IDX = INPUT_VALUE - HO_マップボタンID
    SIF ROOM_IDX > HO_MAX_ROOMNUM
        RETURN
    SIF ROOM_IDX == HO_MASTER現在地
        RETURN
    CALL HO_MOVE_MASTER(ROOM_IDX)
    IF FLAG:調教モード == 調教_居住区 && HO_OCLOCK() > 2700
        CALL INIT_EQUIP()
        PRINTL
        PRINTFORMW (すっかり夜も更けたため、交流を終了します)
        CALL FL_TRAINEXIT
    ENDIF
    ;モジュールボタンのクリック処理
ELSEIF INPUT_VALUE >= HO_モジュールボタンID && INPUT_VALUE < HO_TOPボタンID && FLAG:調教モード == 調教_居住区
    ROOM_IDX = HO_MASTER現在地
    MODULE_IDX = INPUT_VALUE - HO_モジュールボタンID
    ;値の妥当性チェック
    CALL HO_GET_MAPDATA(HO_有効マップID, ROOM_IDX, "MODULE_SLOT")
    _LIST_MODULE_LIST = %RESULTS%
    SIF INPUT_VALUE > HO_モジュールボタンID + LIST_COUNT(_LIST_MODULE_LIST)
        RETURN
    CALL HO_MASTER_USE_MODULE(ROOM_IDX, MODULE_IDX)
ELSEIF INPUT_VALUE >= HO_モジュールボタンID && INPUT_VALUE < HO_TOPボタンID && FLAG:調教モード == 調教_クエスト
    ROOM_IDX = HO_MASTER現在地
    MODULE_IDX = INPUT_VALUE - HO_モジュールボタンID
    ;値の妥当性チェック
    CALL HO_GET_MAPDATA(HO_有効マップID, ROOM_IDX, "EVENT_SLOT")
    _LIST_MODULE_LIST = %RESULTS%
    SIF INPUT_VALUE > HO_モジュールボタンID + LIST_COUNT(_LIST_MODULE_LIST)
        RETURN
    CALL QST_EXEC_EVENT_SLOT_EVENT(TOINT(LIST_GET(_LIST_MODULE_LIST, MODULE_IDX)))
    ;ログボタンクリック処理
ELSEIF INPUT_VALUE >= HO_ログボタンID && INPUT_VALUE <= HO_ログボタンID + 2
    CALL HO_DRAW_LOG_WINDOW_INPUT(INPUT_VALUE)
    ;GUIボタンクリック処理
ELSEIF INRANGE(INPUT_VALUE, HO_TOPボタンID, HO_TOPボタンID + 7)
    SELECTCASE INPUT_VALUE - HO_TOPボタンID
        CASE 2
            CALL HO_ITEM_MENU()
        CASE 3
            CALL HO_TRADE_MENU()
        CASE 4
            CALL HO_SCH_MENU()
        CASE 5
            CALL HO_EDIT_CRAFT_MENU()
        CASE 6
            CALL HOUSING_EDIT_MODE_MAIN()
        CASE 7
            CALL SHOW_INFO_ACTION()
        CASEELSE
            HO_DRAW_GUI_MODE = INPUT_VALUE - HO_TOPボタンID
    ENDSELECT
ELSEIF INPUT_VALUE >= HO_ステータスボタンID && INPUT_VALUE <= HO_ステータスボタンID + MAX_CHARANUM
    CHARA_ID = INPUT_VALUE - HO_ステータスボタンID
    ;値の有効性チェック
    CALL HO_GET_CHARAIDX(CHARA_ID)
    SIF RESULT == -1 && CHARA_ID != MASTER
        RETURN
    HO_ステータス描画対象 = CHARA_ID
ELSEIF INPUT_VALUE == HO_BGMスイッチID
    IF HO_BGM_SWITCH
        CALL FL_PAUSEBGM()
    ELSE
        CALL FL_REPLAYBGM()
    ENDIF
    INVERTBIT HO_BGM_SWITCH, 0
ELSEIF INRANGE(INPUT_VALUE, HO_設備ウィンドウスクロールボタンID, HO_設備ウィンドウスクロールボタンID + 1)
    IF INPUT_VALUE == HO_設備ウィンドウスクロールボタンID
        HO_DRAW_MAP_MODULE_WINDOW_ROW_IDX = MAX(HO_DRAW_MAP_MODULE_WINDOW_ROW_IDX - 1, 0)
    ELSE
        HO_DRAW_MAP_MODULE_WINDOW_ROW_IDX = MIN(HO_DRAW_MAP_MODULE_WINDOW_ROW_IDX + 1, HO_DRAW_MAP_MODULE_SLOT_NUM - 8)
    ENDIF
ENDIF

;-------------------------------------------------
; クイックメニュー
;-------------------------------------------------
@HO_CHARA_QUICK_MENU(CHARA_ID)
#DIM CHARA_ID
VARS ATR
VARS TITLE
VARS TITLE_STR
VARS BODY
VARS HTML
TITLE_STR = %ANAME(CHARA_ID)%

{
    TITLE '= ""
        + @"
"
        + @"%TITLE_STR%"
        + @"
"
}

IF SELECTOR_CAN_ADD_COM_PLAYER(CHARA_ID)
    BODY += @"実行:"
    IF IS_MPLY(CHARA_ID)
        BODY += @"<button value = '[DELETE_PLAYER:1]'>[解除]</button>"
    ELSE
        BODY += @"<button value = '[ADD_PLAYER:1]'>[追加]</button>"
        IF TFLAG:参加者数 > 1&& MPLY_NUM > 0
            BODY += @"<button value = '[SET_PLAYER:1]'>　[指定]</button>"
        ENDIF
    ENDIF
    BODY += "
"
ENDIF
IF SELECTOR_CAN_ADD_COM_TARGET(CHARA_ID)
    BODY += @"対象:"
    IF IS_MTAR(CHARA_ID)
        BODY += @"<button value = '[DELETE_TARGET:1]'>[解除]</button>"
    ELSE
        BODY += @"<button value = '[ADD_TARGET:1]'>[追加]</button>"
        IF TFLAG:参加者数 > 1 && MTAR_NUM > 0
            BODY += @"<button value = '[SET_TARGET:1]'>　[指定]</button>"
        ENDIF
    ENDIF
    BODY += "
"
ENDIF
IF GROUPMATCH(FLAG:調教モード, 調教_居住区) && CHARA_ID != MASTER
    IF BODY != ""
        BODY += "
"
    ENDIF
    BODY += @"同行:"
    IF C_COND("行動:同行中",, CHARA_ID)
        BODY += @"<button value = '[CHANGE_COMPANION:1]'>[解除]</button>
"
    ELSE
        BODY += @"<button value = '[CHANGE_COMPANION:1]'>[誘う]</button>
"
    ENDIF
ENDIF
IF FLAG:ハウジングモード
    BODY += @"衣装:"
    BODY += @"<button value = '[UNDRESS:1]'>[脱衣]</button>"
    BODY += @"<button value = '[DRESS:1]'>　[着衣]</button>"
    BODY += "
"
ENDIF

BODY += @"
"
BODY += @"<button value = '[WASH:1]'>[汚れを拭う]</button>"
BODY += @"
"
BODY += @"
"
BODY += @"<button value = '[EXIT:1]'>[閉じる]</button>"
BODY += @"

"

ATR += @"
"
HTML = %TITLE + ATR + BODY + "
"%
HTML_PRINT HTML, 1

WHILE 1
    INPUTS ,1
    VARS INPUT_VALUES
    VARI MOUSE_BTN = RESULT:1
    INPUT_VALUES = %RESULTS%

    IF INPUT_VALUES != ""
        CLEARLINE 1
    ELSE
        BREAK
    ENDIF
    ;クリック時処理
    IF MOUSE_BTN == 1
        IF DIC_CONTAINSKEY(INPUT_VALUES, "CHANGE_COMPANION")
            CLEARLINE 1
            CALL HO_INPUT_CHANGE_COMPANION(CHARA_ID)
            BREAK
        ENDIF
        IF DIC_CONTAINSKEY(INPUT_VALUES, "SET_TARGET")
            CLEARLINE 1
            CALL CLEAR_MTAR()
            CALL ADD_MTAR(CHARA_ID)
            CALL RESERVE_ACTOR
            BREAK
        ENDIF
        IF DIC_CONTAINSKEY(INPUT_VALUES, "ADD_TARGET")
            CLEARLINE 1
            CALL DEL_MPLY(CHARA_ID)
            CALL ADD_MTAR(CHARA_ID)
            CALL RESERVE_ACTOR
            BREAK
        ENDIF
        IF DIC_CONTAINSKEY(INPUT_VALUES, "DELETE_TARGET")
            CLEARLINE 1
            CALL DEL_MTAR(CHARA_ID)
            CALL RESERVE_ACTOR
            BREAK
        ENDIF
        IF DIC_CONTAINSKEY(INPUT_VALUES, "SET_PLAYER")
            CLEARLINE 1
            CALL CLEAR_MPLY()
            CALL ADD_MPLY(CHARA_ID)
            CALL RESERVE_ACTOR
            BREAK
        ENDIF
        IF DIC_CONTAINSKEY(INPUT_VALUES, "ADD_PLAYER")
            CLEARLINE 1
            CALL DEL_MTAR(CHARA_ID)
            CALL ADD_MPLY(CHARA_ID)
            CALL RESERVE_ACTOR
            BREAK
        ENDIF
        IF DIC_CONTAINSKEY(INPUT_VALUES, "DELETE_PLAYER")
            CLEARLINE 1
            CALL DEL_MPLY(CHARA_ID)
            CALL RESERVE_ACTOR
            BREAK
        ENDIF
        IF DIC_CONTAINSKEY(INPUT_VALUES, "UNDRESS")
            CLEARLINE 1
            CALL HO_CHANGE_CLOTH_COND(CHARA_ID, 98)
            BREAK
        ENDIF
        IF DIC_CONTAINSKEY(INPUT_VALUES, "DRESS")
            CLEARLINE 1
            CALL HO_CHANGE_CLOTH_COND(CHARA_ID, 99)
            BREAK
        ENDIF
        IF DIC_CONTAINSKEY(INPUT_VALUES, "EXIT")
            CLEARLINE 1
            BREAK
        ENDIF
        IF DIC_CONTAINSKEY(INPUT_VALUES, "WASH")
            CLEARLINE 1
            CALL HO_WASH(CHARA_ID)
            BREAK
        ENDIF
        ;右クリック時処理
    ELSEIF MOUSE_BTN == 2
        CLEARLINE 1
        BREAK
    ENDIF
WEND

RETURN

;-------------------------------------------------
;;;同行者の変更操作
;-------------------------------------------------
@HO_INPUT_CHANGE_COMPANION(CHARA_ID)
#DIM CHARA_ID

;値の有効性チェック
CALL HO_GET_CHARAIDX(CHARA_ID)
SIF RESULT == -1
    RETURN -1
IF !FLAG:クエストモード
    CALL HO_GET_MASTER_DATA("MODULE_USAGE")
    VARI MODULE_IDX = RESULT
    IF CFLAG:CHARA_ID:調教参加フラグ != 1 && MODULE_IDX == -1
        CALL HO_ADD_COMPANION(CHARA_ID)
    ELSEIF CFLAG:CHARA_ID:調教参加フラグ == 1 && TCVAR:CHARA_ID:相席フラグ == 1
        CALL HO_ADD_COMPANION(CHARA_ID)
    ELSEIF CFLAG:CHARA_ID:調教参加フラグ != 1 && MODULE_IDX != -1
        CALL HO_MASTER_TRY_INVITE(CHARA_ID)
    ELSEIF CFLAG:CHARA_ID:調教参加フラグ == 1
        CALL HO_REMOVE_COMPANION(CHARA_ID)
    ENDIF
ELSE
ENDIF

RETURN

;-------------------------------------------------
;;;そのキャラをコマンドの対象にとれるか
;-------------------------------------------------
@SELECTOR_CAN_ADD_COM_TARGET(CHARA_ID)
#FUNCTION
#DIM CHARA_ID

IF !CFLAG:CHARA_ID:調教参加フラグ && CHARA_ID != MASTER
    RETURNF 0
ENDIF
IF !GROUPMATCH(FLAG:調教モード, 調教_居住区, 調教_クエスト, 調教_捕虜調教, 調教_閨)
    RETURNF 0
ENDIF
IF !GROUPMATCH(TCVAR:CHARA_ID:離脱フラグ, 0, 1)
    RETURNF 0
ENDIF

RETURNF 1

;-------------------------------------------------
;;;そのキャラをコマンドの実行者にとれるか
;-------------------------------------------------
@SELECTOR_CAN_ADD_COM_PLAYER(CHARA_ID)
#FUNCTION
#DIM CHARA_ID

IF !CFLAG:CHARA_ID:調教参加フラグ && CHARA_ID != MASTER
    RETURNF 0
ENDIF
IF !GROUPMATCH(FLAG:調教モード, 調教_居住区, 調教_クエスト, 調教_捕虜調教, 調教_閨)
    RETURNF 0
ENDIF
IF (FLAG:調教モード == 調教_捕虜調教 && FINDELEMENT(PRISONER_TARGET, CHARA_ID) != -1) || !IS_PLAYABLE(CHARA_ID) || TCVAR:CHARA_ID:離脱フラグ
    RETURNF 0
ENDIF

RETURNF 1


code:
;-------------------------------------------------
; FLAG:調教モード =8 居住区関連アイテム在庫一覧描画モード
;-------------------------------------------------
@HO_DRAW_STOCK_WINDOW
CALL WndMgr_DestroyWindow(-1)
CALL HO_DRAW_STOCK_WINDOW_LEFT
CALL WndMgr_DisplayAll()

@HO_DRAW_STOCK_WINDOW_LEFT
#DIM CONST WINDOW_ID = 0
#DIM CONST WND_WIDTH  = 120
#DIM CONST WND_HEIGHT = 20
#DIM CONST ヘッダー行数 = 2
#DIM CONST アイテムリスト行数 = 16
#DIM DYNAMIC L_CNT
#DIM DYNAMIC BTN_ID

#DIMS DYNAMIC _LIST_MEMBER
#DIM DYNAMIC MEMBER_NUM
#DIM DYNAMIC CHARA_ID
#DIM DYNAMIC F_COLOR

#DIMS DYNAMIC ITEM_NAME
#DIM DYNAMIC ITEM_NUM
#DIMS DYNAMIC STR_ITEM_NUM

BTN_ID = HO_ステータスボタンID

CALL WndMgr_CreateWindow(WINDOW_ID, 0, 1, WND_WIDTH, WND_HEIGHT, 2)
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_注釈}@◇アイテム在庫一覧◇@/C@")
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))
L_CNT = 0
FOR LOCAL, 0, ITEM_LENGTH
    ITEM_NUM = HO_ITEM_STOCK:LOCAL
    IF ITEM_NUM > 0
        CALL GET_ITEM_NAME(LOCAL)
        ITEM_NAME = %RESULTS%
        ITEM_NAME = %TAG_PRINT_SHAPE(ITEM_NAME, 15, 1, 0)%
        STR_ITEM_NUM = %TAG_PRINT_SHAPE(TOSTR(ITEM_NUM), 8, 1, 0)%
        IF L_CNT / アイテムリスト行数 <= 0
            CALL WndMgr_TextSet(WINDOW_ID, L_CNT + ヘッダー行数, @"@C:{カラー_白}@%ITEM_NAME% × %STR_ITEM_NUM%@/C@")
            L_CNT ++
        ELSE
            CALL WndMgr_TextAdd(WINDOW_ID, (L_CNT % アイテムリスト行数) + ヘッダー行数, @"@C:{カラー_白}@%ITEM_NAME% × %STR_ITEM_NUM%@/C@")
            L_CNT ++
        ENDIF
        L_CNT ++
    ENDIF
NEXT


code:
;-------------------------------------------------
; FLAG:調教モード =8 居住区関連処理
;-------------------------------------------------
;-------------------------------------------------
; キャラ一覧表示
;   引数: 表示するキャラIDのリスト
;-------------------------------------------------
@HOUSING_SHOW_MEMBER(_LIST_MEMBER)
#DIM DYNAMIC IS_VISIBLE
#DIM DYNAMIC P_CNT
#DIM DYNAMIC PORTRAIT_OVERFLOW_FLG
#DIM DYNAMIC SHOW_MEMBER_NUM
#DIM DYNAMIC MEMBER_NUM
#DIMS DYNAMIC _LIST_MEMBER

PORTRAIT_SIZEX = PORTRAIT_BASE_SIZEX * PORTRAIT_倍率 / 100
PORTRAIT_SIZEY = PORTRAIT_BASE_SIZEY * PORTRAIT_倍率 / 100

;主人公のポートレイト画像を表示
IF IS_PARTICIPATE_TRAIN(MASTER)
    CALL HO_SHOW_PORTRAIT(MASTER, (PORTRAIT_SIZEX * P_CNT) + 20, 0)
ENDIF

MEMBER_NUM = LIST_COUNT(_LIST_MEMBER)
HO_SHOW_MEMBERNUM = MEMBER_NUM

;画像のウィンドウ溢れ判定
FOR LOCAL, 0, MEMBER_NUM
    IF (PORTRAIT_SIZEX + 10) * (P_CNT + 2) > GETCONFIG("ウィンドウ幅") - 50
        PORTRAIT_OVERFLOW_FLG = 1
        SHOW_MEMBER_NUM = P_CNT
        BREAK
    ENDIF
    P_CNT ++
NEXT
P_CNT = 0

IF !PORTRAIT_OVERFLOW_FLG
    HO_SHOW_PORTRAIT_IDX = 0
ENDIF

;はみ出さない範囲でキャラのポートレイト画像を表示
FOR LOCAL, HO_SHOW_PORTRAIT_IDX, MEMBER_NUM
    IF (PORTRAIT_SIZEX + 10) * (P_CNT + 2) > GETCONFIG("ウィンドウ幅") - 50
        BREAK
    ENDIF
    CALL HO_SHOW_PORTRAIT(TOINT(LIST_GET(_LIST_MEMBER, LOCAL)), (PORTRAIT_SIZEX * P_CNT) + 10, 0)
    P_CNT ++
NEXT

IF PORTRAIT_倍率 >= 0
    CALL 画像一斉表示("LEFT", 0, 1)
    IF PORTRAIT_OVERFLOW_FLG
        IF HO_SHOW_PORTRAIT_IDX > 0
            LOCALS '= @"<button value='{HO_画像スライドボタンID + 2}'>[<<]</button>"
            LOCALS += @"<button value='{HO_画像スライドボタンID}'>[<]</button>"
        ELSE
            LOCALS '= @"[<<][<]"
        ENDIF
        IF HO_SHOW_PORTRAIT_IDX < MEMBER_NUM - SHOW_MEMBER_NUM
            LOCALS += @"<button value='{HO_画像スライドボタンID + 1}'>[>]</button>"
            LOCALS += @"<button value='{HO_画像スライドボタンID + 3}'>[>>]</button>"
        ELSE
            LOCALS += @"[>][>>]"
        ENDIF
        HTML_PRINT @"
%LOCALS%
"
    ENDIF
ELSE
    PRINTL
    PRINTL
ENDIF

;-------------------------------------------------
; 画面に表示するキャラリストの一覧(主人公除く)を取得する
; RETURN:
;   ハウジングモード: 主人公と同部屋のキャラIDのリスト
;   クエストモード: 主人公と同伴のキャラIDのリスト
;-------------------------------------------------
@GET_DISPLAY_MEMBER_LIST
#DIMS DYNAMIC _LIST_MEMBER
#DIMS DYNAMIC _LIST_MEMBER_COMPANION
#DIMS DYNAMIC _LIST_MEMBER_SHARE
#DIMS DYNAMIC _LIST_MEMBER_OTHER
#DIM DYNAMIC CHARA_ID
#DIM DYNAMIC CHARA_IDX

IF FLAG:ハウジングモード
    WHILE _DIC_HO_CHARALIST:CHARA_IDX != "-1"
        CALL HO_GET_CHARADATA(CHARA_IDX, "CHARA_ID")
        CHARA_ID = RESULT
        CALL HO_GET_CHARADATA(CHARA_IDX, "ROOM_IDX")
        ; 同行中 > 相席中 > その他の順でポートレイトを並べる
        IF RESULT == HO_MASTER現在地
            IF CFLAG:CHARA_ID:調教参加フラグ == 1 && TCVAR:CHARA_ID:相席フラグ != 1
                _LIST_MEMBER_COMPANION = %LIST_ADD(_LIST_MEMBER_COMPANION, TOSTR(CHARA_ID))%
            ELSEIF CFLAG:CHARA_ID:調教参加フラグ == 1 && TCVAR:CHARA_ID:相席フラグ == 1
                _LIST_MEMBER_SHARE = %LIST_ADD(_LIST_MEMBER_SHARE, TOSTR(CHARA_ID))%
            ELSE
                _LIST_MEMBER_OTHER = %LIST_ADD(_LIST_MEMBER_OTHER, TOSTR(CHARA_ID))%
            ENDIF
        ENDIF
        CHARA_IDX ++
    WEND
    ;設備モブ(家畜など)をメンバーリストに追加
    FOR CHARA_ID, 0 , CHARANUM
        IF CFLAG:CHARA_ID:設備モブ > 0 && CFLAG:CHARA_ID:調教参加フラグ > 0
            _LIST_MEMBER_OTHER = %LIST_ADD(_LIST_MEMBER_OTHER, TOSTR(CHARA_ID))%
        ENDIF
    NEXT
ELSE
    FOR LOCAL, 0 , CHARANUM
        CHARA_ID = LOCAL
        ;MASTERは後述処理で追加されるためここでは処理しない
        SIF CHARA_ID == MASTER
            CONTINUE
        IF IS_PARTICIPATE_TRAIN(CHARA_ID)
            _LIST_MEMBER_COMPANION = %LIST_ADD(_LIST_MEMBER_COMPANION, TOSTR(CHARA_ID))%
        ENDIF
    NEXT
ENDIF

;クエストで調教に一時参加するモブキャラなど
IF FLAG:クエストモード
    FOR LOCAL, 0, CHARANUM
        CHARA_ID = LOCAL
        SIF CFLAG:CHARA_ID:調教参加フラグ != 1 || CHARA_ID == MASTER
            CONTINUE
        SIF LIST_INDEXOF(_LIST_MEMBER_COMPANION, TOSTR(CHARA_ID)) != -1
            CONTINUE
        SIF LIST_INDEXOF(_LIST_MEMBER_SHARE, TOSTR(CHARA_ID)) != -1
            CONTINUE
        SIF LIST_INDEXOF(_LIST_MEMBER_OTHER, TOSTR(CHARA_ID)) != -1
            CONTINUE
        _LIST_MEMBER_OTHER = %LIST_ADD(_LIST_MEMBER_OTHER, TOSTR(CHARA_ID))%
    NEXT
ENDIF

_LIST_MEMBER '= _LIST_MEMBER_COMPANION + _LIST_MEMBER_SHARE + _LIST_MEMBER_OTHER
RESULTS = %_LIST_MEMBER%

RETURN LIST_COUNT(_LIST_MEMBER)

@HO_SHOW_PORTRAIT(CHARA_ID,POS_X, POS_Y)
#DIM CHARA_ID
#DIM POS_X
#DIM POS_Y
#DIM SIZE_X
#DIM SIZE_Y
#DIMS DYNAMIC SPRITE_NAME
#DIM DYNAMIC L_CNT
#DIM DYNAMIC IS_VISIBLE
#DIM WINDOW_ID
#DIM CONST WND_WIDTH  = 60
#DIM CONST WND_HEIGHT = 20
#DIM DYNAMIC F_COL
#DIMS DYNAMIC BTN_IDS
#DIMS DYNAMIC TOOLTIP

IF CHARA_ID != MASTER
    CALL HO_IS_TARGET_VISIBLE(MASTER, CHARA_ID)
    IS_VISIBLE = RESULT
    BTN_IDS '= @"{CHARA_ID + HO_キャラボタンID}"
    IF CFLAG:CHARA_ID:調教参加フラグ == 1 && TCVAR:CHARA_ID:相席フラグ != 1
        F_COL = カラー_シアン
    ELSEIF CFLAG:CHARA_ID:調教参加フラグ == 1 && TCVAR:CHARA_ID:相席フラグ == 1
        F_COL = カラー_黄緑
    ENDIF
    ;同行中
    IF CFLAG:CHARA_ID:調教参加フラグ
        IF !GROUPMATCH(TCVAR:CHARA_ID:離脱フラグ, 離脱フラグ_一時離脱, 離脱フラグ_観客)
            LOCALS:0 '= @"@C:{F_COL}@@B:%BTN_IDS%@👁[%SNAME(CHARA_ID)%]@/C@@/B@"
        ELSE
            BTN_IDS '= ""
            LOCALS:0 '= @"@C:{F_COL}@🛇[%SNAME(CHARA_ID)%]@/C@"
        ENDIF
    ELSEIF IS_VISIBLE
        LOCALS:0 '= @"@B:%BTN_IDS%@👁[%SNAME(CHARA_ID)%]@/B@"
    ELSE
        BTN_IDS '= ""
        LOCALS:0 '= @"@C:{カラー_選択不可}@🛇[%SNAME(CHARA_ID)%]@/C@"
    ENDIF
ELSE
    BTN_IDS '= @"{CHARA_ID + HO_キャラボタンID}"
    LOCALS:0 '= @"　[%SNAME(MASTER)%]"
ENDIF

IF IS_MPLY(CHARA_ID)
    LOCALS:0 += @"@S:1@@C:{カラー_オレンジ}@ P@/C@@/S@"
ELSEIF IS_MTAR(CHARA_ID)
    LOCALS:0 += @"@S:1@@C:{カラー_シアン}@ T@/C@@/S@"
ELSE
    LOCALS:0 += @"  "
ENDIF

TOOLTIP '= @"【%ANAME(CHARA_ID)%】"
IF FLAG:調教モード == 調教_居住区 && CHARA_ID != MASTER
    TOOLTIP += @"
"
    TOOLTIP += @"%HO_DESC_CHARAACT:CHARA_ID:0%"
ENDIF

IF PORTRAIT_倍率 >= 0
    CALL HO_SET_PORTRAIT_SPRITE(CHARA_ID, ,IS_VISIBLE)

    LOCALS:0 '= @"%TAG_PRINT_SHAPE(LOCALS:0, PX_TO_STRLENSU(PORTRAIT_SIZEX), 1, 2)%  "
    CALLF TAG_PRINT(LOCALS:0, 4)
    CALL 画像セット_P((CSTR:CHARA_ID:キャラ顔グラ), 0, 10, PORTRAIT_SIZEX, PORTRAIT_SIZEY, 1, BTN_IDS, TOOLTIP)
ELSE
    LOCALS:0 '= @"%TAG_PRINT_SHAPE(LOCALS:0, MAX_CHARANAME_LENGTH / 2, 1, 2)%  "
    CALLF TAG_PRINT(LOCALS:0, 4)
ENDIF

;-------------------------------------------------
;ハウジング部分のターン経過処理
;SELECTCOMの内容に応じて時間を経過させる
;移動などSELECTCOM以外の用途でターンを経過させる場合は
;引数に経過ターンを与え,COM以外の実行 = 1とすることで経過時間取得処理をバイパスする
;-------------------------------------------------
@HOUSING_TIME_PROGRESS(経過ターン = 1, COM以外の実行 = 0)
#DIM 経過ターン
#DIM COM以外の実行
#DIM CHARA_ID
IF COM以外の実行 == 0
    CALL HO_GET_COM_DURATION
    経過ターン = RESULT
ENDIF

;MASTERにクールタイムが設定されている場合経過ターンを加算
経過ターン += HO_MASTERクールタイム
HO_MASTERクールタイム = 0

FOR LOCAL, 0, 経過ターン
    HO_TIME += HO_単位時間
    CALL HO_TURN_START_EVENT
    CALL HO_CHARAACT_CONTROL_MAIN
    CALL HO_TURN_END_EVENT
    ;ターン経過した場合、キャラの行動描写を更新
    ;CALL HO_CHARAACT_DESC()
NEXT

;離席等により二人きりでMTAR:0が-1の場合は同行者をMTARにセット
IF TFLAG:参加者数 == 1 && MTAR:0 == -1
    CALL HO_GET_COMPANION_LIST
    CHARA_ID = TOINT(LIST_GET(RESULTS, 0))
    IF !TCVAR:CHARA_ID:離脱フラグ
        CALL ADD_MTAR(CHARA_ID)
    ENDIF
ENDIF

;-------------------------------------------------
;コマンド実行より前に呼び出されるターン毎の初期処理
;@SHOW_STATUS からCALLされる
;-------------------------------------------------
@HOUSING_INIT_PER_TURN
;居住区モードではCOMの実行を経ずにターンが経過する場合があるため、ターンの最初にSELECTCOMを初期化
SELECTCOM = 0
;調教対象がMASTERしかおらずMPLY:0が-1の場合、不正落ち回避のためMASTERをMPLYに登録
IF MPLY:0 == -1 && TFLAG:参加者数 == 0
    CALL ADD_MPLY(MASTER)
ENDIF

;-------------------------------------------------
;居住区交流開始時に一度呼び出される各種データの初期化処理
;-------------------------------------------------
@HO_INIT_DATA
#DIM DYNAMIC IDX
#DIM DYNAMIC CHARA_ID
#DIM DYNAMIC 初期位置
#DIM DYNAMIC 初期位置_牢獄
#DIMS DYNAMIC _LIST_MEMBER
#DIMS DYNAMIC _LIST_MODULE

;各種データを初期化
VARSET _DIC_HO_MASTER_DATA
VARSET _DIC_HO_MAPDATA
VARSET _DIC_HO_CHARALIST
VARSET HO_LOG_MESSAGE

MAP_RELEASE "HOUSING_MAP"
MAP_CREATE "HOUSING_MAP"

;小さいフォントが参照可能なら使用可能な状態にする
GETFONT
CHKFONT "Microsoft Himalaya"
IF RESULT
    HO_SFONT '= "Microsoft Himalaya"
ELSE
    HO_SFONT '= "ＭＳ ゴシック"
ENDIF

;;マップデータをセット
;今はマップが一つしか無いので0固定
HO_有効マップID = 0
CALL HO_LOAD_MAPDATA(HO_有効マップID)
CALL HO_LOAD_MODULE_LIST(HO_有効マップID)

;エリア有効判定用変数の初期化
HO_CHECK_ITEM_CRAFTABLE_AT_ROOM_IDX = -1

;ステータス画面の描写対象をMASTERに
HO_ステータス描画対象 = MASTER

;交流に参加するキャラの初期ステータスを設定
;MASTERの処理
CFLAG:MASTER:交流参加 = 1
;その他各キャラクターの処理
CALL HO_FIND_ROOM_BY_TAG("客室")
初期位置 = RESULT
CALL HO_FIND_ROOM_BY_TAG("牢獄")
初期位置_牢獄 = RESULT
CALL GET_MEMBER_LIST
_LIST_MEMBER = %RESULTS%
FOR LOCAL, 0, LIST_COUNT(RESULTS)
    CHARA_ID = TOINT(LIST_GET(_LIST_MEMBER, LOCAL))
    ;交流に参加可能か詳細チェック
    CALL HOUSING_MODE_CHECK_CHARA_JOINABLE(CHARA_ID)
    SIF RESULT == 0
        CONTINUE
    ;交流除外フラグが立てられている場合も参加させない
    SIF CFLAG:CHARA_ID:交流除外
        CONTINUE
    IF CFLAG:CHARA_ID:捕虜先 != 所属_プレイヤー
        _DIC_HO_CHARALIST:IDX '= @"[CHARA_ID:{CHARA_ID}][ROOM_IDX:{初期位置}][ACTION:待機]"
        CALL HO_TRY_USE_MODULE(CHARA_ID,"居房")
    ELSEIF CFLAG:CHARA_ID:捕虜先 == 所属_プレイヤー && 初期位置_牢獄 != -1
        _DIC_HO_CHARALIST:IDX '= @"[CHARA_ID:{CHARA_ID}][ROOM_IDX:{初期位置_牢獄}][ACTION:監禁]"
    ELSE
        CONTINUE
    ENDIF
    CFLAG:CHARA_ID:交流参加 = 1
    IDX ++
NEXT
;キャラリスト末尾を示す"-1"をセット
_DIC_HO_CHARALIST:IDX '= "-1"

;プレイヤーの初期位置を設定
CALL HO_FIND_ROOM_BY_TAG("プレイヤー私室")
初期位置 = RESULT
HO_MASTER現在地 = 初期位置
HO_MASTER_USE_MODULE_LIST_IDX = -1

;プレイヤーの私室にベッドがあるなら使用している状態でスタート
CALL HO_GET_USABLE_MODULE("仮眠", HO_MASTER現在地)
_LIST_MODULE = %RESULTS%
IF RESULT > 0
    CALL HO_MASTER_USE_MODULE(HO_MASTER現在地, TOINT(LIST_GET(_LIST_MODULE, 0)))
ENDIF

;参加キャラクターの私室をモジュールとして追加
CALL HO_REGIST_CREW_PRIVATE_ROOM

;設置設備の効果情報を取得
CALL HO_ROOM_EFFECT_CREATE_MAP
CALL HO_ROOM_EFFECT_SET_EFFECT_FROM_MODULE
CALL HO_MODULE_EFFECT_SET_EFFECT_FORM_MODULE

;"客室"タグを持つ部屋に登場キャラの数だけ私室モジュールをMODULE_LISTとMODULE_SLOTに登録する
@HO_REGIST_CREW_PRIVATE_ROOM
#DIM  DYNAMIC CHARA_IDX
#DIM  DYNAMIC CHARA_ID
#DIM  DYNAMIC ROOM_IDX
#DIM  DYNAMIC MODULE_LIST_IDX
#DIMS DYNAMIC _LIST_MODULE_IDX
#DIMS DYNAMIC _LIST_PERMISSION
CALL HO_FIND_ROOM_BY_TAG("客室")
ROOM_IDX = RESULT

WHILE _DIC_HO_CHARALIST:(CHARA_IDX) != "-1"
    ;モジュールリストの登録
    CALL HO_ADD_MODULE_LIST(HO_CREW_PRIVATE_ROOM_ID, ROOM_IDX)
    MODULE_LIST_IDX = RESULT
    ;モジュールリストへの権限情報の設定
    CALL HO_GET_CHARADATA(CHARA_IDX, "CHARA_ID")
    CHARA_ID = RESULT
    _LIST_PERMISSION '= ""
    _LIST_PERMISSION = %LIST_ADD(_LIST_PERMISSION, TOSTR(CHARA_ID))%
    IF TCVAR:CHARA_ID:MASTERへの私室入室許可 || 陥落度(CHARA_ID) >= 2
        _LIST_PERMISSION = %LIST_ADD(_LIST_PERMISSION, TOSTR(MASTER))%
    ENDIF
    CALL HO_SET_MODULE_LIST(MODULE_LIST_IDX, "PERMISSION_LIST", _LIST_PERMISSION)
    CALL HO_SET_MODULE_LIST(MODULE_LIST_IDX, "OWNER_ID", TOSTR(CHARA_ID))
    _LIST_MODULE_IDX = %LIST_ADD(_LIST_MODULE_IDX, TOSTR(MODULE_LIST_IDX))%
    CHARA_IDX ++
WEND
CALL HO_SET_MAPDATA(ROOM_IDX, "MODULE_SLOT", _LIST_MODULE_IDX)

;BGMスイッチを再生状態に
HO_BGM_SWITCH = 1
RETURN

;-------------------------------------------------
;;BEGINTRAIN後に@EVENTTRAINで実行される初期化処理
;TCVAR等BEGINTRAINで初期化される変数の初期値はこの関数で設定する
;-------------------------------------------------
@HO_INIT_DATA_EVENTTRAIN_START
;起床時は空腹状態でスタート
;TCVAR:701 空腹度
CVARSET TCVAR, GETNUM(TCVAR, "空腹度"), 300
;追随相手
CVARSET TCVAR, GETNUM(TCVAR, "追随相手ID"), -1
CVARSET TCVAR, GETNUM(TCVAR, "勧誘したキャラID"), -1
CVARSET TCVAR, GETNUM(TCVAR, "勧誘されたキャラID"), -1

;-------------------------------------------------
;;単位時間経過時の最初に実行される処理
;-------------------------------------------------
@HO_TURN_START_EVENT
#DIM CHARA_ID

;3O分に一度生成処理を呼び出す
IF HO_TIME % 30 == 0
    SIF TFLAG:生成済ゲスト数 < HO_ゲストモブ上限 && RAND:100 < MIN(25 + FLAG:領地評判_商業 / 10, 40)
        CALL HO_CREATE_GUEST_SHOPPER
    SIF TFLAG:生成済ゲスト数 < HO_ゲストモブ上限 && RAND:100 < MIN(25 + FLAG:領地評判_売春 / 10, 40)
        CALL HO_CREATE_GUEST_BUY_PROSTITUTE
    SIF TFLAG:生成済ゲスト数 < HO_ゲストモブ上限 && RAND:100 < MIN(25 + FLAG:領地評判_娯楽 / 10, 40)
        CALL HO_CREATE_GUEST_INN
ENDIF

;-------------------------------------------------
;;単位時間経過時の最後に実行される処理
;-------------------------------------------------
@HO_TURN_END_EVENT
CALL HO_ROOM_EFFECT_TURNEND_EVENT
;料理準備度リセット
IF HO_OCLOCK() == 1400 || HO_OCLOCK() == 1900
    TFLAG:料理準備度 = 0
    HO_LIST_調理担当者 '= ""
ENDIF

;-------------------------------------------------
;;コマンド実行後に呼ばれる処理
; @SOURCE_CHECK より呼ばれる
;-------------------------------------------------
@HO_COM_AFTER
#DIM DYNAMIC CHARA_IDX
#DIM DYNAMIC CHARA_ID
#DIM DYNAMIC ADD_VALUE
#DIM DYNAMIC AMOUNT
#DIM DYNAMIC IS_MESSAGE_PRINTED
#DIM DYNAMIC ITER_I
#DIM DYNAMIC ITER_J

FOR CHARA_ID, 0, CHARANUM
    SIF !IS_PARTICIPATE_TRAIN(CHARA_ID)
        CONTINUE
    ;搾乳処理
    IF NOWEX:(CHARA_ID):噴乳 > 0 && (SELECTCOM == 67 || IS_EQUIP(CHARA_ID, 67))
        CALL HO_CALC_LACTATION_AMOUNT(CHARA_ID, RAND(80, 120))
        ADD_VALUE += RESULT
        PRINTFORML 吸い出された%ANAME(CHARA_ID)%の母乳がミルク瓶を満たしていく…… ({TFLAG:母乳採集量} + {ADD_VALUE}/ 300)
        TFLAG:母乳採集量 += ADD_VALUE
    ENDIF
    ADD_VALUE = 0
    ;授乳
    IF NOWEX:(CHARA_ID):噴乳 > 0 && (SELECTCOM == T_N("乳首吸い") || IS_EQUIP_TARGET(CHARA_ID, T_N("乳首吸い")))
        ;単発コマンド
        IF SELECTCOM == T_N("乳首吸い")
            FOR ITER_I, 0, CHARANUM
                IF IS_MPLY(ITER_I) && IS_MTAR(CHARA_ID)
                    CALL HO_CALC_LACTATION_AMOUNT(CHARA_ID, RAND(30, 45))
                    ADD_VALUE = RESULT
                    CALL RECORD_BREAST_FEED(CHARA_ID, GET_ID(ITER_I), ADD_VALUE)
                ENDIF
            NEXT
        ELSE
            ;継続コマンド
            IF IS_EQUIP_TARGET(CHARA_ID, T_N("乳首吸い"))
                FOR ITER_I, 0, CHARANUM
                    IF SEARCH_EQUIP(T_N("乳首吸い"), ITER_I, CHARA_ID) != -1
                        CALL HO_CALC_LACTATION_AMOUNT(CHARA_ID, RAND(30, 45))
                        ADD_VALUE = RESULT
                        CALL RECORD_BREAST_FEED(CHARA_ID, GET_ID(ITER_I), ADD_VALUE)
                    ENDIF
                NEXT
            ENDIF
        ENDIF
    ENDIF
    ;オナホ搾精
    IF NOW_EJAC(CHARA_ID) == 射精部位_オナホ
        PRINTFORML オナホールに%ANAME(CHARA_ID)%の%語彙_精液()%が満たされていく……
        TFLAG:精液採集量 += MIN(30, NOWEX:CHARA_ID:射精)
    ENDIF
NEXT

;ミルク生成
WHILE TFLAG:母乳採集量 >= 300
    AMOUNT ++
    TFLAG:母乳採集量 -= 300
WEND
IF AMOUNT
    CALL CHANGE_ITEM_STOCK(ITEM_乳, AMOUNT)
    CALL GET_ITEM_NAME(ITEM_乳)
    PRINTFORML %RESULTS%を{AMOUNT}個収集した
ENDIF

;精液採集
AMOUNT = 0
WHILE TFLAG:精液採集量 >= 10
    AMOUNT ++
    TFLAG:精液採集量 -= 10
WEND
IF AMOUNT
    CALL CHANGE_ITEM_STOCK(ITEM_精液, AMOUNT)
    CALL GET_ITEM_NAME(ITEM_精液)
    PRINTFORML %RESULTS%を{AMOUNT}個収集した
ENDIF

;エリア効果の描写
CALL HOUSING_ROOM_EFFECT_MESSAGE_COM_AFTER

;演奏、演舞のアイテム入手通知
FOR LOCAL, 0, CHARANUM
    IF HO_おひねり通知:LOCAL != ""
        CALLF TAG_PRINT(HO_おひねり通知:LOCAL, 1)
        IS_MESSAGE_PRINTED = 1
    ELSE
        BREAK
    ENDIF
NEXT
IF IS_MESSAGE_PRINTED
    CALL FL_PLAYSE("Money_1.mp3")
    VARSET HO_おひねり通知
ENDIF

;-------------------------------------------------
;TRAIN_EXITで実行される調教終了処理
;居住区モード 交流終了後に呼ばれる。TRAIN自体は継続する
;-------------------------------------------------
@HOUSING_TRAIN_EXIT(終了モード)
#DIM 終了モード
#DIM DYNAMIC CHARA_ID
#DIM ITER_I
#DIMS _LIST_DELETE_CHARA

;ウフフフラグをＯＦＦ
FLAG:ウフフフラグ = 0

;キャラクターごとの共通処理
FOR CHARA_ID, 0, CHARANUM
    IF IS_SAME_FACTION(CHARA_ID)
        ;使用済みコンドーム加算処理
        IF IS_EQUIP_PLAYER(CHARA_ID, 75) && CUM_TO_AMOUNT:CHARA_ID:射精部位_ゴム > 0
            CALL QST_CHANGE_ITEM(@"{ITEM_使用済みコンドーム},1,",0 , 0)
        ENDIF
    ENDIF
    IF IS_PARTICIPATE_TRAIN(CHARA_ID)
        ;EQUIP解除
        CALL RELEASE_ALL_EQUIP(CHARA_ID, 1)
        ;調教満足度の算出
        CALL HO_TRAIN_EXIT_CALC_SATISFACTION(CHARA_ID)
        FLAG:ウフフイベント獲得淫堕点 += LIMIT(RESULT, 0, 30) / 2

        ;一時参加モブの離脱
        IF CFLAG:CHARA_ID:設備モブ > 0
            CFLAG:CHARA_ID:調教参加フラグ = 0
            TFLAG:参加者数 --
            CONTINUE
        ENDIF

        ;奉仕者フラグの初期化
        TCVAR:CHARA_ID:奉仕者フラグ = 0
        TCVAR:CHARA_ID:被奉仕者フラグ = 0

        TCVAR:CHARA_ID:当日ウフフ継続時間 += HO_TIME - TFLAG:調教開始時刻
        ;2時間半抱かれたらとりあえず満足
        IF TCVAR:CHARA_ID:当日ウフフ継続時間 > 150
            TCVAR:CHARA_ID:押し倒しフラグ = 2
        ENDIF
    ENDIF
NEXT

TFLAG:調教開始時刻 = 0
;奉仕モード終了処理
IF TFLAG:奉仕モード
    TRYCALLFORM COM_TEXT_TRAIN_EXIT860(終了モード, HO_TIME - TFLAG:調教開始時刻)
    ;奉仕モード解除
    TFLAG:奉仕モード = 0
    TFLAG:売春フラグ = 0
    TFLAG:調教経過時間 = 0
    ;実行/対象を復元
    CALL RECOVER_ACTOR_AFTER_SERVICE
    ;自動調教の制御系フラグを全てクリア
    CALL TRAIN_EXIT_CREAR_AUTO_TRAIN_CONTROL_FLAG()
ENDIF

;覗き見モード終了処理
IF TFLAG:覗き見モード
    FOR LOCAL, 0, CHARANUM
        IF TCVAR:LOCAL:覗き見対象
            IF CFLAG:LOCAL:調教参加フラグ
                CFLAG:LOCAL:調教参加フラグ = 0
                TFLAG:参加者数 --
                IF FLAG:ハウジングモード
                    CALL HO_SET_CHARADATA_BY_ID(LOCAL, "ACTION", "待機")
                    CALL HO_INIT_SEXUALACT_FLAG(LOCAL)
                    TCVAR:LOCAL:行動待機時間 = 0
                ENDIF
            ENDIF
            TCVAR:LOCAL:覗き見対象 = 0
        ENDIF
    NEXT
    TFLAG:覗き見モード = 0
    TFLAG:覗き見対象設備IDX = 0
ENDIF

IF !FLAG:クエストモード
    ;タブ設定をリセット
    TFLAG:調教タブ設定 = 9
    FLAG:調教モード = 調教_居住区
    ;キャラの行動描写文字列を更新
    ;CALL HO_CHARAACT_DESC()
    RETURN 0
ELSE
    ;タブ設定をリセット
    TFLAG:調教タブ設定 = 13
    FLAG:調教モード = 調教_クエスト
    RETURN 0
ENDIF
RETURN 1

;-------------------------------------------------
;;EVENT_AFTERで実行される終了処理
;領内活動、クエスト共通の終了処理
;-------------------------------------------------
@HOUSING_EXIT
#DIM DYNAMIC ROOM_IDX
CALL WndMgr_DestroyWindow(-1)

;各種データを初期化
VARSET _DIC_HO_MASTER_DATA
VARSET _DIC_HO_MAPDATA
VARSET _DIC_HO_CHARALIST
VARSET _DIC_HO_MODULE_LIST
VARSET _DIC_HO_CHARA_GROUP_LIST

CALL HO_ROOM_EFFECT_RELEASE_MAP

HO_DRAW_GUI_MODE = 0
;設備ウィンドウのスクロール状況を初期化
HO_DRAW_MAP_MODULE_WINDOW_ROW_IDX = 0

;キャラクター変数の初期化
FOR LOCAL:0, 0, CHARANUM
    FOR LOCAL:1, 0, CLOTH_PART_NUM
        衣装状態:(LOCAL:0):(LOCAL:1) = 0
        衣装損壊率:(LOCAL:0):(LOCAL:1) = 0
    NEXT
    CFLAG:LOCAL:交流参加 = 0
    CFLAG:LOCAL:衣装プリセット = 0
    CFLAG:LOCAL:衣装プリセット変更予約 = 0
NEXT

HO_TIME = 0
HO_同行者数 = 0
CALL QST_RESET_SKILL_COOLTIME(0)

;フラグ初期化
FLAG:ハウジングモード = 0
FLAG:クエストモード = 0
FLAG:クエスト_あなた不参加 = 0
FLAG:領内活動開始時イベント実施済み = 0

;-------------------------------------------------
;コマンド実行後処理
;ハウジングモードが有効な場合に @EVENTCOMEND から呼ばれる
;-------------------------------------------------
@HOUSING_EVENTCOMEND()
#DIM DYNAMIC CHARA_ID
#DIMS FUNCTION_NAME

FOR LOCAL, 0, CHARANUM
    TCVAR:LOCAL:HO体力増減値 = 0
    TCVAR:LOCAL:HO気力増減値 = 0
NEXT

;クエスト用連想配列にEVENTCOMEND_CALLEE_ONCEがセットされている場合、対象関数を呼び出す
IF MAP_HAS(@"HOUSING_MAP", "EVENTCOMEND_CALLEE_ONCE") == 1
    FUNCTION_NAME = %MAP_GET(@"HOUSING_MAP", "EVENTCOMEND_CALLEE_ONCE")%
    MAP_REMOVE @"HOUSING_MAP", "EVENTCOMEND_CALLEE_ONCE"
    TRYCCALLFORM %FUNCTION_NAME%
    CATCH
        DEBUGPRINTFORML 連想配列HOUSING_MAPのEVENTCOMEND_CALLEE_ONCEに指定された関数%FUNCTION_NAME%は存在しません
    ENDCATCH
ENDIF

IF FLAG:調教モード == 調教_居住区 && SELECTCOM == T_N("採集")
    CALL HO_CATTLE_PUSHDOWN_EVENT
ENDIF

;-------------------------------------------------
; 調教後の満足度算出
;-------------------------------------------------
@HO_TRAIN_EXIT_CALC_SATISFACTION(CHARA_ID)
#DIM CHARA_ID
#DIM DYNAMIC 感情補正値 = 100
#DIM DYNAMIC 調教時間補正
#DIM DYNAMIC 今回総絶頂回数
#DIM DYNAMIC 絶頂補正
#DIM DYNAMIC SCORE
#DIM DYNAMIC PRESUM_EX
#DIM ITER_I

SIF !TFLAG:調教開始時刻
    RETURN 0

調教時間補正 = LIMIT(HO_TIME - TFLAG:調教開始時刻, 25, 300)
IF CHECK_EMOTION(CHARA_ID, "HAPPY")
    感情補正値 = 150
ELSEIF CHECK_EMOTION(CHARA_ID, "GOOD")
    感情補正値 = 125
ELSEIF CHECK_EMOTION(CHARA_ID, "NEGATIVE")
    感情補正値 = 50
ENDIF
;射精は1/6でカウント
FOR ITER_I, 0, 8
    IF ITER_I == GETNUM(EX, "射精")
        PRESUM_EX += PRETRAIN_EX:CHARA_ID:ITER_I / 6
    ELSE
        PRESUM_EX += PRETRAIN_EX:CHARA_ID:ITER_I
    ENDIF
NEXT
今回総絶頂回数 = (SUM_EX(CHARA_ID, 0, 1) + EX:CHARA_ID:射精 / 6) - PRESUM_EX
絶頂補正 = 今回総絶頂回数 * 2 / 3

;酒恥肉倫の下方修正
IF SELECTCOM == T_N("酒恥肉倫")
    SCORE /= 5
ENDIF

SCORE = FTIMES(絶頂補正, 調教時間補正)
SCORE = FTIMES(SCORE, 感情補正値)
SCORE = LIMIT(SCORE / 10, 0, 100)

DEBUGPRINTFORML ;-------------------------------------------------
DEBUGPRINTFORML 調教時間補正 = {調教時間補正}
DEBUGPRINTFORML 今回の%ANAME(CHARA_ID)%の調教満足度:感情補正値 {感情補正値}, 今回総絶頂回数, {今回総絶頂回数}
DEBUGPRINTFORML SCORE = {SCORE}
DEBUGPRINTFORML ;-------------------------------------------------
RETURN SCORE

;-------------------------------------------------
; 調教開始直前の絶頂情報を保存する
; FLでは調教イベントが1回のTRAIN中に繰り返し呼ばれるので、
; その回の調教イベントでどれだけ変動があったのかを取得できるよう値を退避しておく
;-------------------------------------------------
@HO_PRESERVE_PRETRAIN_STATUS()
#DIM DYNAMIC CHARA_ID
#DIM ITER_I
FOR CHARA_ID, 0, CHARANUM
    SIF !IS_PARTICIPATE_TRAIN(CHARA_ID)
        CONTINUE
    FOR ITER_I, 0, VARSIZE("EX")
        PRETRAIN_EX:CHARA_ID:ITER_I = EX:CHARA_ID:ITER_I
    NEXT
NEXT


code:
;領地の初期設定データ
@HO_SET_MAPDATA_DEFAULT(MAP_ID)
#DIM MAP_ID

_DIC_HO_MAPDATA:MAP_ID:0  '= "[ROOM_ID:0]"
_DIC_HO_MAPDATA:MAP_ID:1  '= "[ROOM_ID:0]"
_DIC_HO_MAPDATA:MAP_ID:2  '= "[ROOM_ID:3][ROOM_PATH:7,]"
_DIC_HO_MAPDATA:MAP_ID:3  '= "[ROOM_ID:0]"
_DIC_HO_MAPDATA:MAP_ID:4  '= "[ROOM_ID:0]"
_DIC_HO_MAPDATA:MAP_ID:5  '= "[ROOM_ID:0]"
_DIC_HO_MAPDATA:MAP_ID:6  '= "[ROOM_ID:4][ROOM_PATH:7,][MODULE_LIST:7,]"
_DIC_HO_MAPDATA:MAP_ID:7  '= "[ROOM_ID:1][ROOM_PATH:2,6,8,12,][MODULE_LIST:11,2,4,]"
_DIC_HO_MAPDATA:MAP_ID:8  '= "[ROOM_ID:2][ROOM_PATH:7,][MODULE_LIST:5,8,]"
_DIC_HO_MAPDATA:MAP_ID:9  '= "[ROOM_ID:0]"
_DIC_HO_MAPDATA:MAP_ID:10 '= "[ROOM_ID:0]"
_DIC_HO_MAPDATA:MAP_ID:11 '= "[ROOM_ID:0]"
_DIC_HO_MAPDATA:MAP_ID:12 '= "[ROOM_ID:11][ROOM_PATH:7,17,][MODULE_LIST:12,21,]"
_DIC_HO_MAPDATA:MAP_ID:13 '= "[ROOM_ID:0]"
_DIC_HO_MAPDATA:MAP_ID:14 '= "[ROOM_ID:0]"
_DIC_HO_MAPDATA:MAP_ID:15 '= "[ROOM_ID:0]"
_DIC_HO_MAPDATA:MAP_ID:16 '= "[ROOM_ID:0]"
_DIC_HO_MAPDATA:MAP_ID:17 '= "[ROOM_ID:14][ROOM_PATH:12,22,][MODULE_LIST:300,301,303,]"
_DIC_HO_MAPDATA:MAP_ID:18 '= "[ROOM_ID:0]"
_DIC_HO_MAPDATA:MAP_ID:19 '= "[ROOM_ID:0]"
_DIC_HO_MAPDATA:MAP_ID:20 '= "[ROOM_ID:0]"
_DIC_HO_MAPDATA:MAP_ID:21 '= "[ROOM_ID:0]"
_DIC_HO_MAPDATA:MAP_ID:22 '= "[ROOM_ID:151][ROOM_PATH:17,23,][MODULE_LIST:156,155,163,]"
_DIC_HO_MAPDATA:MAP_ID:23 '= "[ROOM_ID:152][ROOM_PATH:22,][MODULE_LIST:157,158,162,]"
_DIC_HO_MAPDATA:MAP_ID:24 '= "[ROOM_ID:0]"


code:
;-------------------------------------------------
; エリア・設備効果処理
;-------------------------------------------------
@HO_ROOM_EFFECT_CREATE_MAP
CALL HO_ROOM_EFFECT_RELEASE_MAP
FOR LOCAL, 0, HO_MAX_ROOMNUM
    MAP_CREATE @"MAP_{LOCAL}_ROOM_EFFECT"
NEXT
FOR LOCAL, 0, HO_MAX_MODULENUM
    MAP_CREATE @"MAP_{LOCAL}_MODULE_EFFECT"
NEXT

@HO_ROOM_EFFECT_RELEASE_MAP
FOR LOCAL, 0, HO_MAX_ROOMNUM
    MAP_RELEASE @"MAP_{LOCAL}_ROOM_EFFECT"
NEXT
FOR LOCAL, 0, HO_MAX_MODULENUM
    MAP_RELEASE @"MAP_{LOCAL}_MODULE_EFFECT"
NEXT

@HO_ROOM_EFFECT_SET_EFFECT_FROM_MODULE(MAP_ID = -1)
#DIM  MAP_ID
#DIM  DYNAMIC ROOM_IDX
#DIM  DYNAMIC MODULE_IDX
#DIM  DYNAMIC MODULE_ID
#DIMS DYNAMIC LIST_MODULE
#DIMS DYNAMIC LIST_EFFECT
#DIM ITER_I
#DIM ITER_J

SIF MAP_ID == -1
    MAP_ID = HO_有効マップID

CALL HO_FIND_MODULE("属性", "エリア効果", MAP_ID)
LIST_MODULE = %RESULTS%

FOR ITER_I, 0, LIST_COUNT(LIST_MODULE)
    MODULE_IDX = TOINT(LIST_GET(LIST_MODULE, ITER_I))
    CALL HO_GET_MODULE_LIST(MODULE_IDX, "ROOM_IDX")
    ROOM_IDX = RESULT
    CALL HO_GET_MODULE_LIST(MODULE_IDX, "MODULE_ID")
    MODULE_ID = RESULT
    CALL HO_GET_MODULE_DATA(MODULE_ID, "エリア効果")
    IF RESULT != -1
        LIST_EFFECT = %RESULTS%
        ;DEBUGPRINTFORML LIST_EFFECT = %LIST_EFFECT%
        FOR ITER_J, 0, LIST_COUNT(LIST_EFFECT)
            ;設備由来のエリア効果は持続時間を無制限(0)とする
            MAP_SET @"MAP_{ROOM_IDX}_ROOM_EFFECT", LIST_GET(LIST_EFFECT, ITER_J), "0"
        NEXT
    ENDIF
NEXT

@HO_MODULE_EFFECT_SET_EFFECT_FORM_MODULE(MAP_ID = -1)
#DIM  MAP_ID
#DIM  DYNAMIC MODULE_IDX
#DIM  DYNAMIC MODULE_ID
#DIMS DYNAMIC LIST_MODULE
#DIMS DYNAMIC LIST_EFFECT
#DIM ITER_I
#DIM ITER_J

SIF MAP_ID == -1
    MAP_ID = HO_有効マップID

CALL HO_FIND_MODULE("属性", "設備効果", MAP_ID)
LIST_MODULE = %RESULTS%

FOR ITER_I, 0, LIST_COUNT(LIST_MODULE)
    MODULE_IDX = TOINT(LIST_GET(LIST_MODULE, ITER_I))
    CALL HO_GET_MODULE_LIST(MODULE_IDX, "MODULE_ID")
    MODULE_ID = RESULT
    CALL HO_GET_MODULE_DATA(MODULE_ID, "設備効果")
    IF RESULT != -1
        LIST_EFFECT = %RESULTS%
        FOR ITER_J, 0, LIST_COUNT(LIST_EFFECT)
            ;設備由来の設備効果は持続時間を無制限(0)とする
            MAP_SET @"MAP_{MODULE_IDX}_MODULE_EFFECT", LIST_GET(LIST_EFFECT, ITER_J), "0"
        NEXT
    ENDIF
NEXT

;-------------------------------------------------
;領内活動の1ターンの終わりに @HO_TURN_END_EVENT より呼ばれる
;-------------------------------------------------
@HO_ROOM_EFFECT_TURNEND_EVENT
#DIMS DYNAMIC MAP
#DIMS DYNAMIC ROOM_NAME
#DIM  DYNAMIC ROOM_IDX
#DIM  DYNAMIC EFFECTNUM
#DIMS DYNAMIC EFFECT_NAME, HO_MAX_EFFECTNUM
#DIM  DYNAMIC 持続時間

;全てのエリアのエリア効果に対する判定
FOR ROOM_IDX, 0, HO_MAX_ROOMNUM
    VARSET EFFECT_NAME
    MAP '= @"MAP_{ROOM_IDX}_ROOM_EFFECT"
    MAP_SIZE MAP
    EFFECTNUM = RESULT
    MAP_GETKEYS MAP, EFFECT_NAME, 1
    FOR LOCAL, 0, EFFECTNUM
        ;エリア効果のペアの値(持続時間)が0以上の場合、減算し0以下になった場合消滅させる
        ;もとから0の場合は無制限の効果とみなす
        持続時間 = TOINT(MAP_GET(MAP, EFFECT_NAME:LOCAL))
        IF 持続時間 > 0
            持続時間 -= HO_単位時間
            IF 持続時間 <= 0
                MAP_REMOVE MAP, EFFECT_NAME:LOCAL
            ELSE
                MAP_SET MAP, EFFECT_NAME:LOCAL, TOSTR(持続時間)
            ENDIF
        ENDIF
        ;エリア効果に対応する行動をとっているキャラクターがいない場合に解除されるエリア効果
        ;演奏系
        CALL HO_ROOM_EFFECT_REMOVE_CHECK(ROOM_IDX)
    NEXT
NEXT

@HO_ROOM_EFFECT_REMOVE_CHECK(ROOM_IDX)
#DIM  ROOM_IDX
#DIMS DYNAMIC MAP
#DIMS DYNAMIC LIST_CHARA_ID
#DIM  DYNAMIC CHARA_ID
#DIM  DYNAMIC MASTER_USE_MODULE_ID
#DIM  DYNAMIC CHARA_NUM
#DIM  DYNAMIC ピアノ使用
#DIM  DYNAMIC 楽器使用者数
#DIM  DYNAMIC 演奏者数

;リアクションや割込で声援などのコマンドが自動実行された場合は削除判定を行わない
SIF TFLAG:リアクションコマンド実行 || TFLAG:割込コマンド実行
    RETURN

MAP '= @"MAP_{ROOM_IDX}_ROOM_EFFECT"
CALL HO_GET_MEMBER_IN_ROOM_BY_ACTION(ROOM_IDX, "演奏中")
LIST_CHARA_ID = %RESULTS%

IF !RESULT
    IF ROOM_IDX != HO_MASTER現在地 || SELECTCOM != T_N("演奏する")
        MAP_REMOVE MAP, "ピアノの音色"
        MAP_REMOVE MAP, "歌唱"
        MAP_REMOVE MAP, "煽欲の小夜曲"
    ENDIF
ELSE
    MASTER_USE_MODULE_ID = C_COND_MAP_GET(MASTER, "設備")
    CHARA_NUM = LIST_COUNT(LIST_CHARA_ID)
    ;楽器使用判定:ピアノ
    FOR LOCAL, 0, CHARA_NUM
        CHARA_ID = LIST_GETINT(LIST_CHARA_ID, LOCAL)
        CALL HO_GET_USE_MODULE_INFO(CHARA_ID)
        IF GROUPMATCH(RESULT, 18)
            ピアノ使用 = 1
            楽器使用者数 ++
            演奏者数 ++
        ENDIF
    NEXT
    ;MASTERのコマンド実行に基づく判定
    IF ROOM_IDX == HO_MASTER現在地 && SELECTCOM == T_N("演奏する")
        IF MASTER_USE_MODULE_ID == 18
            ピアノ使用 = 1
            楽器使用者数 ++
            演奏者数 ++
        ELSEIF SELECTCOM == T_N("演奏する")
            演奏者数 ++
        ENDIF
    ENDIF
    SIF !ピアノ使用
        MAP_REMOVE MAP, "ピアノの音色"
    ;演奏実行者の全員が楽器を使用している
    SIF 楽器使用者数 == 演奏者数
        MAP_REMOVE MAP, "歌唱"
ENDIF
CALL HO_GET_MEMBER_IN_ROOM_BY_ACTION(ROOM_IDX, "演舞中")
IF !RESULT
    IF ROOM_IDX != HO_MASTER現在地 || SELECTCOM != T_N("踊る")
        MAP_REMOVE MAP, "演舞"
    ENDIF
ENDIF

;地の文描写の最後に呼ばれるエリア効果・設備効果の地の文描写
@HO_ROOM_EFFECT_COM_TEXT_LAST_DESC
#DIMS DYNAMIC ROOM_EFFECT_MAP
#DIMS DYNAMIC MODULE_EFFECT_MAP
#DIMS DYNAMIC ROOM_NAME
#DIM  DYNAMIC EFFECTNUM
#DIMS DYNAMIC EFFECT_NAME, HO_MAX_EFFECTNUM
#DIM  DYNAMIC 持続時間
#DIM  DYNAMIC L_CNT

ROOM_EFFECT_MAP '= @"MAP_{HO_MASTER現在地}_ROOM_EFFECT"
MODULE_EFFECT_MAP '= @"MAP_{HO_MASTER_USE_MODULE_LIST_IDX}_MODULE_EFFECT"
REDRAW 0
PRINTL
L_CNT = LINECOUNT
;エリア効果描写
MAP_GETKEYS ROOM_EFFECT_MAP, EFFECT_NAME, 1
EFFECTNUM = RESULT
IF EFFECTNUM > 0
    FOR LOCAL, 0, EFFECTNUM
        TRYCCALLFORM HO_ROOM_EFFECT_COM_TEXT_LAST_DESC_%EFFECT_NAME:LOCAL%
        CATCH
        ENDCATCH
    NEXT
ENDIF
;設備効果描写
VARSET EFFECT_NAME
MAP_GETKEYS MODULE_EFFECT_MAP, EFFECT_NAME, 1
EFFECTNUM = RESULT
IF EFFECTNUM > 0
    FOR LOCAL, 0, EFFECTNUM
        TRYCCALLFORM HO_ROOM_EFFECT_COM_TEXT_LAST_DESC_%EFFECT_NAME:LOCAL%
        CATCH
        ENDCATCH
    NEXT
ENDIF
IF L_CNT != LINECOUNT
ELSE
    CLEARLINE 1
ENDIF
REDRAW 1

@HO_ROOM_EFFECT_PRINT_DESC
#DIM DYNAMIC MESSAGE_NUM

MESSAGE_NUM = FINDELEMENT(HO_EFFECT_MESSAGE, "",,,1)
SIF MESSAGE_NUM <= 0
    RETURN
CALLF TAG_PRINT(@"@C:{カラー_シルバー}@@S:1@<<発揮中のエリア効果>>@/S@@/C@", 1)
FOR LOCAL, 0, HO_MAX_EFFECT_MESSAGENUM
    SIF HO_EFFECT_MESSAGE:LOCAL == ""
        BREAK
    CALLF TAG_PRINT(@"%HO_EFFECT_MESSAGE:LOCAL%　")
NEXT
VARSET HO_EFFECT_MESSAGE
PRINTL
PRINTL

@HO_ROOM_EFFECT_SET_DESC(MESSAGE)
#DIMS MESSAGE
#DIM  DYNAMIC IDX
IDX = FINDELEMENT(HO_EFFECT_MESSAGE, "",,,1)
IF IDX == -1
    ARRAYSHIFT HO_EFFECT_MESSAGE, -1, ""
    IDX = HO_MAX_LOGNUM - 1
ENDIF
HO_EFFECT_MESSAGE:IDX '= @"%MESSAGE%"

@ROOM_EFFECT_TOOLTIP(EFFECT_NAME)
#FUNCTIONS
#DIMS EFFECT_NAME
SIF EXISTVAR(@"TOOLTIP_ROOM_EFFECT_%EFFECT_NAME%")
    RETURNF GETVARS(@"TOOLTIP_ROOM_EFFECT_%EFFECT_NAME%")


code:
#DIMS CONST TOOLTIP_ROOM_EFFECT_観葉植物 = "【コマンド効果補正】
瑞々しい緑の葉が気分を落ち着かる
不安や恐怖、怒りを和らげる"
#DIMS CONST TOOLTIP_ROOM_EFFECT_茶器 = "【コマンド効果補正】
芳醇な茶の香りが漂っている
休憩の質が向上する"
#DIMS CONST TOOLTIP_ROOM_EFFECT_ピアノの音色 = "【コマンド効果補正】
心地よいピアノの音色が聞こえてくる
心が安らぐようだ"
#DIMS CONST TOOLTIP_ROOM_EFFECT_演舞 = "【コマンド効果補正】
小気味良いステップの音が聞こえてくる"
#DIMS CONST TOOLTIP_ROOM_EFFECT_歌声 = "【コマンド効果補正】
楽しげな歌声が聞こえてくる"
#DIMS CONST TOOLTIP_ROOM_EFFECT_煽欲の小夜曲 = "【コマンド効果補正】
淫靡で扇情的なメロディが響いている…
気持ちが昂り、鼓動が早くなる…"
#DIMS CONST TOOLTIP_ROOM_EFFECT_昼食準備済 = "【コマンド効果補正】
昼食の準備ができたよ！"
#DIMS CONST TOOLTIP_ROOM_EFFECT_夕食準備済 = "【コマンド効果補正】
夕食の準備ができたよ！"
#DIMS CONST TOOLTIP_ROOM_EFFECT_軽食準備済 = "【コマンド効果補正】
おやつの準備ができたよ！"
#DIMS CONST TOOLTIP_ROOM_EFFECT_淫らな絵画 = "【コマンド効果補正】
淫らな絵画が大きく飾られている
性的な情動を感じずにはいられない"
#DIMS CONST TOOLTIP_ROOM_EFFECT_卑猥な書籍 = "【コマンド効果補正】
男女の性の営みが赤裸々に綴られている
学べば性への知見が深まる……かもしれない"
#DIMS CONST TOOLTIP_ROOM_EFFECT_散乱した使用済ゴム = "【コマンド効果補正】
精液で満たされた避妊具が散らばっている
むわりとした精臭が漂う"
#DIMS CONST TOOLTIP_ROOM_EFFECT_むせ返るような精臭 = "【コマンド効果補正】
青臭いザーメンの香りが充満している
否が応にも鼻につく…"
#DIMS CONST TOOLTIP_ROOM_EFFECT_精液まみれ = "【コマンド効果補正】
おびただしい量の精液が辺りに四散している
むわりとした濃密な精臭が空間を満たしている
常人には耐え難い…"
#DIMS CONST TOOLTIP_ROOM_EFFECT_淫魔の錬成陣 = "【コマンド効果補正】
怪しく明滅する錬成陣
淫堕点を用いてより高度なクラフトが可能になるらしい…
…"
#DIMS CONST TOOLTIP_ROOM_EFFECT_カニかご = "【コマンド効果補正】
網を張った、水中に沈めるかご
エビより大きな生き物がかかる"
#DIMS CONST TOOLTIP_ROOM_EFFECT_色絵の磁器 = "【コマンド効果補正】
東方伝来の、鮮やかな絵付けを施された磁器
食事の質が向上する"
#DIMS CONST TOOLTIP_ROOM_EFFECT_ぬくもり = "【コマンド効果補正】
とろけるような暖かさに身体が包まれている……
休憩の質が大きく向上する"
#DIMS CONST TOOLTIP_ROOM_EFFECT_薫る薬湯 = "【コマンド効果補正】
芳しい香気が肺を満たし、
薬効成分が疲れた体に染み渡る……
入浴の質が大きく向上する"
#DIMS CONST TOOLTIP_ROOM_EFFECT_熱気浴 = "【コマンド効果補正】
蒸気の温もりが体の奥まで浸透し
心身をゆっくりとほぐしていく……
心が安らぐようだ"

;エリア効果色定義
#DIM CONST EFFECT_COL_観葉植物 = カラー_夏
#DIM CONST EFFECT_COL_茶器 = カラー_パ赤
#DIM CONST EFFECT_COL_ピアノの音色 = カラー_パ青
#DIM CONST EFFECT_COL_演舞 = カラー_春
#DIM CONST EFFECT_COL_歌唱 = カラー_春
#DIM CONST EFFECT_COL_煽欲の小夜曲 = カラー_パ紫
#DIM CONST EFFECT_COL_昼食準備済 = カラー_クリーム
#DIM CONST EFFECT_COL_夕食準備済 = カラー_クリーム
#DIM CONST EFFECT_COL_軽食準備済 = カラー_クリーム
#DIM CONST EFFECT_COL_淫らな絵画 = カラー_パ紫
#DIM CONST EFFECT_COL_卑猥な書籍 = カラー_パ紫
#DIM CONST EFFECT_COL_散乱した使用済ゴム = カラー_パ紫
#DIM CONST EFFECT_COL_むせ返るような精臭 = カラー_パ紫
#DIM CONST EFFECT_COL_精液まみれ = カラー_パ紫
#DIM CONST EFFECT_COL_淫魔の錬成陣 = カラー_ピンク
#DIM CONST EFFECT_COL_カニかご = カラー_夏
#DIM CONST EFFECT_COL_色絵の磁器 = カラー_ライトブルー
#DIM CONST EFFECT_COL_ぬくもり = カラー_パ赤
#DIM CONST EFFECT_COL_薫る薬湯 = カラー_黄緑
#DIM CONST EFFECT_COL_熱気浴 = カラー_オレンジ


code:
;-------------------------------------------------
; スケジュール管理画面
;-------------------------------------------------
@HO_SCH_MENU()
#DIM CONST WINDOW_ID = 0
#DIM DYNAMIC LINE_NUM
HO_SCH_COPIED_FROM = -1
HO_SCH_HEADER_MESSAGE '= ""
LINE_NUM = LINECOUNT

WHILE 1
    LINE_NUM = LINECOUNT
    REDRAW 0
    CALL WndMgr_DestroyWindow(-1)
    CALL HO_DRAW_SCH_MENU_WINDOW_PARENT
    IF HO_SCH_IS_DRAW_SUBWND
        CALL WndMgr_Attribute(0, "Disabled", 1)
        CALL HO_SCH_MENU_DRAW_SUB_WINDOW()
    ENDIF
    CALL WndMgr_DisplayAll()
    REDRAW 1
    CALL HO_SCH_MENU_WINDOW_INPUT()
    IF RESULT == -1
        CLEARLINE LINECOUNT - LINE_NUM
        RETURN -1
    ELSEIF RESULT == 1
        CLEARLINE LINECOUNT - LINE_NUM
        RETURN 1
    ENDIF
    CLEARLINE LINECOUNT - LINE_NUM
WEND

@HO_DRAW_SCH_MENU_WINDOW_PARENT
#DIM CONST WINDOW_ID = 0
#DIM CONST WND_WIDTH  = 170
#DIM CONST WND_HEIGHT = 44
#DIM DYNAMIC L_CNT
#DIM DYNAMIC FIRST_LINE
#DIM DYNAMIC COLUMN
#DIM DYNAMIC CHARA_ID
#DIMS DYNAMIC ARRAYS_STR_CHARA_INFO, 3

#DIMS DYNAMIC DETAIL, MAX_CHARANUM, 4
#DIM DYNAMIC  DETAIL_LINECOUNT
#DIM DYNAMIC  PAGE_NUM
#DIM CONST    MAX_ROW  = 18

#DIM BTN_ID

BTN_ID = HO_スケジュールボタンID

CALL WndMgr_CreateWindow(WINDOW_ID, 0, 1, WND_WIDTH, WND_HEIGHT, 2)
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@S:1@@C:{カラー_注釈}@◇　スケジュール管理　◇@/C@@/S@  %HO_SCH_HEADER_MESSAGE%")
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))

;明細リスト作成
;-------------------------------------------------
FOR LOCAL, 0, CHARANUM
    CALL HO_GET_CHARADATA(LOCAL, "CHARA_ID")
    CHARA_ID = RESULT
    SIF CHARA_ID == -1
        BREAK
    SIF CFLAG:CHARA_ID:所属 != 所属_プレイヤー
        CONTINUE
    VARSET ARRAYS_STR_CHARA_INFO
    CALL HO_SCH_MENU_SET_CHARA_INFO(ARRAYS_STR_CHARA_INFO, CHARA_ID)
    DETAIL:LOCAL:0 = %TAG_PRINT_SHAPE(ARRAYS_STR_CHARA_INFO:0, ((WND_WIDTH / 2) - 5), 1, 0)%
    DETAIL:LOCAL:1 = %TAG_PRINT_SHAPE(ARRAYS_STR_CHARA_INFO:1, ((WND_WIDTH / 2) - 5), 1, 0)%
    DETAIL:LOCAL:2 = %TAG_PRINT_SHAPE(ARRAYS_STR_CHARA_INFO:2, ((WND_WIDTH / 2) - 5), 1, 0)%
    DETAIL:LOCAL:3 '= @"@C:{カラー_選択不可}@ %"-"* ((WND_WIDTH / 2) - 5)%@/C@"
    DETAIL_LINECOUNT ++
NEXT
PAGE_NUM = DETAIL_LINECOUNT / MAX_ROW

;明細リスト出力
;-------------------------------------------------
FIRST_LINE = L_CNT
FOR LOCAL, MAX_ROW * HO_SCH_PAGE, MAX_ROW * (HO_SCH_PAGE + 1)
    IF LOCAL > 0 && LOCAL % (MAX_ROW / 2) == 0
        L_CNT = FIRST_LINE
        COLUMN ++
    ENDIF
    IF COLUMN == 0
        CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, (DETAIL:LOCAL:0))
        CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, (DETAIL:LOCAL:1))
        CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, (DETAIL:LOCAL:2))
        CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, (DETAIL:LOCAL:3))
    ELSE
        CALL WndMgr_TextAdd(WINDOW_ID, L_CNT++, (DETAIL:LOCAL:0))
        CALL WndMgr_TextAdd(WINDOW_ID, L_CNT++, (DETAIL:LOCAL:1))
        CALL WndMgr_TextAdd(WINDOW_ID, L_CNT++, (DETAIL:LOCAL:2))
        CALL WndMgr_TextAdd(WINDOW_ID, L_CNT++, (DETAIL:LOCAL:3))
    ENDIF
NEXT

;フッター出力
;-------------------------------------------------
L_CNT = WND_HEIGHT - 5
IF PAGE_NUM > 0
    LOCALS '= HO_SCH_PAGE > 0 ? @"@B:9000@<<@/B@ " # "   "
    LOCALS += @"%TOSTR(HO_SCH_PAGE + 1, "..")% "
    LOCALS += HO_SCH_PAGE != PAGE_NUM ? @"@B:9001@>>@/B@" # "  "
    CALLF TAG_PRINT_SHAPE(LOCALS, WND_WIDTH - 8, 1, 2)
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT, @"@C:{カラー_注釈}@%RESULTS%@/C@")
ENDIF
L_CNT = WND_HEIGHT - 4
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@B:9999999@@C:{カラー_白}@[決定]@/C@@/B@")

@HO_SCH_MENU_WINDOW_INPUT()
#DIM DYNAMIC INPUT_VALUE
#DIMS DYNAMIC INPUT_VALUES
#DIM DYNAMIC TIMETABLE
#DIM DYNAMIC CHARA_ID
#DIM DYNAMIC INPUT_WINDOW_ID
#DIM DYNAMIC TASK
#DIM DYNAMIC MODULE_LIST_IDX
#DIMS DYNAMIC LIST_WORKER_CHARA_ID

;入力受付
ONEINPUTS
CLEARLINE 1
PRINTL

IF ISNUMERIC(RESULTS)
    INPUT_VALUE = TOINT(RESULTS)
    ;キャンセルボタン
    IF INPUT_VALUE == 9999999
        RETURN -1
        ;ページ処理
    ELSEIF INPUT_VALUE < 10000
        IF INPUT_VALUE == 9000
            HO_SCH_PAGE --
        ELSEIF INPUT_VALUE == 9001
            HO_SCH_PAGE ++
        ENDIF
    ELSE
        INPUT_WINDOW_ID = (INPUT_VALUE - HO_スケジュールボタンID) / 10000
        SELECTCASE INPUT_WINDOW_ID
                ;親ウィンドウからの入力処理
            CASE 0
                TIMETABLE = INPUT_VALUE % 10
                CHARA_ID = (INPUT_VALUE % 10000) / 100
                ;タスクボタンが押された場合
                IF INRANGE(TIMETABLE, 0, 3)
                    HO_SCH_TIMETABLE = TIMETABLE
                    HO_SCH_TARGET_CHARA_ID = CHARA_ID
                    HO_SCH_IS_DRAW_SUBWND = 1
                ENDIF
                ;サブウィンドウからの入力処理
            CASE 1
                TASK = INPUT_VALUE % 100
                IF INRANGE(TASK, 0, VARSIZE("HO_TASK_NAME"))
                    HO_TASK_SCH:HO_SCH_TARGET_CHARA_ID:HO_SCH_TIMETABLE = TASK
                    _LIST_HO_WORKPLACE:HO_SCH_TARGET_CHARA_ID:HO_SCH_TIMETABLE '= ""
                ELSE
                    CALL WndMgr_DestroyWindow(1)
                    HO_SCH_IS_DRAW_SUBWND = 0
                ENDIF
            CASEELSE
        ENDSELECT
    ENDIF
ELSE
    INPUT_VALUES = %RESULTS%
    IF DIC_CONTAINSKEY(INPUT_VALUES, "MODULE_LIST_IDX")
        MODULE_LIST_IDX = TOINT(DIC_GET(INPUT_VALUES ,"MODULE_LIST_IDX"))
        IF LIST_INDEXOF(_LIST_HO_WORKPLACE:HO_SCH_TARGET_CHARA_ID:HO_SCH_TIMETABLE, TOSTR(MODULE_LIST_IDX)) == -1
            _LIST_HO_WORKPLACE:HO_SCH_TARGET_CHARA_ID:HO_SCH_TIMETABLE = %LIST_ADD(_LIST_HO_WORKPLACE:HO_SCH_TARGET_CHARA_ID:HO_SCH_TIMETABLE, TOSTR(MODULE_LIST_IDX))%
        ELSE
            _LIST_HO_WORKPLACE:HO_SCH_TARGET_CHARA_ID:HO_SCH_TIMETABLE = %LIST_REMOVEALL(_LIST_HO_WORKPLACE:HO_SCH_TARGET_CHARA_ID:HO_SCH_TIMETABLE, TOSTR(MODULE_LIST_IDX))%
        ENDIF
    ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "TIMETABLE")
        HO_SCH_TIMETABLE = TOINT(DIC_GET(INPUT_VALUES, "TIMETABLE"))
    ELSEIF DIC_CONTAINSKEY(RESULTS, "SET_TARGET_NUM")
        CALL HO_CRAFT_ORDER_SET_TARGET_NUM(TOINT(DIC_GET(RESULTS, "SET_TARGET_NUM")))
    ELSEIF DIC_CONTAINSKEY(RESULTS, "ASSIGN_ORDER")
        CALL HO_SCH_ASSIGN_CRAFT_ORDER(TOINT(DIC_GET(RESULTS, "ASSIGN_ORDER")))
    ELSEIF DIC_CONTAINSKEY(RESULTS, "RESET_ORDER")
        CALL HO_SCH_RESET_CRAFT_ORDER()
    ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "COPY_SCHEDULE_FROM_CHARA")
        HO_SCH_COPIED_FROM = TOINT(DIC_GET(INPUT_VALUES, "COPY_SCHEDULE_FROM_CHARA"))
        HO_SCH_HEADER_MESSAGE '= @"@C:{カラー_注意}@%SNAME(HO_SCH_COPIED_FROM)%からコピー中(実行不可タスクはコピーされません)@/C@"
    ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "PASTE_SCHEDULE_TO_CHARA")
        CALL HO_SCH_PASTE_SCHEDULE_TO_CHARA(TOINT(DIC_GET(INPUT_VALUES, "PASTE_SCHEDULE_TO_CHARA")))
    ENDIF

ENDIF

@HO_SCH_MENU_DRAW_SUB_WINDOW
#DIM CONST WINDOW_ID = 1
#DIM CONST WND_WIDTH  = 140
#DIM CONST WND_HEIGHT = 44
#DIM CONST WND_POS_X = 10
#DIM CONST WND_POS_Y = 2
#DIM DYNAMIC BTN_ID
#DIM DYNAMIC CHARA_ID
#DIM DYNAMIC TIMETABLE
#DIMS DYNAMIC STR_TIME
#DIM DYNAMIC TASK
#DIM DYNAMIC L_CNT
#DIM DYNAMIC F_COL

#DIMS DYNAMIC _LIST_MODULE
#DIMS DYNAMIC MODULE_NAME
#DIMS DYNAMIC MODULE_USAGE
#DIM  DYNAMIC MODULE_LIST_IDX
#DIM  DYNAMIC MODULE_ID
#DIM  DYNAMIC ROOM_IDX
#DIMS DYNAMIC ROOM_NAME

;CRAFT_ORDER関連
#DIM  DYNAMIC ITEM_ID
#DIMS DYNAMIC ITEM_NAME
#DIM  DYNAMIC RECIPE_NO
#DIM  DYNAMIC TARGET_NUM
#DIM  DYNAMIC IS_ACTIVE
#DIM  DYNAMIC LIST_IDX
#DIM  DYNAMIC DETAIL_IDX
#DIM  DYNAMIC MATERIAL_NEEDS, ITEM_LENGTH
#DIMS DYNAMIC TOOLTIP
#DIM  DYNAMIC REGISTED_CRAFT_ORDER, MAX_CRAFT_ORDER

#DIM  DYNAMIC ITER_I
#DIM  DYNAMIC ITER_J

BTN_ID = HO_スケジュールボタンID + (WINDOW_ID * 10000)
CHARA_ID = HO_SCH_TARGET_CHARA_ID
TIMETABLE = HO_SCH_TIMETABLE
TASK = HO_TASK_SCH:CHARA_ID:TIMETABLE

CALL WndMgr_CreateWindow(WINDOW_ID, WND_POS_X, WND_POS_Y, WND_WIDTH, WND_HEIGHT, 2)

;ヘッダー
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"%ANAME(CHARA_ID)%に割り当てる作業を選択してください")
IF CFLAG:CHARA_ID:捕虜先 == 所属_プレイヤー
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"※%ANAME(CHARA_ID)%は囚われの身のため割当可能な作業が制限されます")
ELSE
    L_CNT++
ENDIF
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))
FOR LOCAL, 0, 4
    F_COL = TIMETABLE == LOCAL ? カラー_選択中 # カラー_白
    SELECTCASE LOCAL
        CASE 0
            STR_TIME '= @"@B:\\[TIMETABLE:0\\]@@C:{F_COL}@[朝]@/C@@/B@"
        CASE 1
            STR_TIME '= @"@B:\\[TIMETABLE:1\\]@@C:{F_COL}@[昼]@/C@@/B@"
        CASE 2
            STR_TIME '= @"@B:\\[TIMETABLE:2\\]@@C:{F_COL}@[夕]@/C@@/B@"
        CASE 3
            STR_TIME '= @"@B:\\[TIMETABLE:3\\]@@C:{F_COL}@[晩]@/C@@/B@"
    ENDSELECT
    IF LOCAL == 0
        CALL WndMgr_TextSet(WINDOW_ID, L_CNT, @"　%STR_TIME%")
    ELSE
        CALL WndMgr_TextAdd(WINDOW_ID, L_CNT, @"　%STR_TIME%")
    ENDIF
NEXT
L_CNT++

;タスク候補
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))
FOR LOCAL, 0, VARSIZE("HO_TASK_NAME")
    ;晩に選択可能な作業は限定される
    IF TIMETABLE == 3
        IF !GROUPMATCH(HO_TASK_NAME:LOCAL, "自由", "炊事", "宿番", "売春", "芸能")
            CONTINUE
        ENDIF
    ENDIF
    ;虜囚が担当可能なタスクは限定
    IF CFLAG:CHARA_ID:捕虜先 == 所属_プレイヤー
        IF !GROUPMATCH(HO_TASK_NAME:LOCAL, "自由", "採集", "採掘", "売春", "搾乳")
            CONTINUE
        ENDIF
    ENDIF
    IF HO_TASK_NAME:LOCAL == "売春"
        CALL HO_FIND_MODULE_BY_USAGE("娼館",, 1)
        SIF RESULTS == ""
            CONTINUE
        IF !CAN_PROSTITUTE(CHARA_ID)
            CONTINUE
        ENDIF
    ELSEIF HO_TASK_NAME:LOCAL == "搾乳"
        CALL HO_FIND_MODULE_BY_USAGE("搾乳",, 1)
        SIF RESULTS == ""
            CONTINUE
        SIF !HAS_TALENT(CHARA_ID, "母乳体質")
            CONTINUE
        IF CFLAG:CHARA_ID:捕虜先 != 所属_プレイヤー
            SIF !IS_NASTY(CHARA_ID, 素質_淫乱_雌牛)
                CONTINUE
        ENDIF
    ELSEIF HO_TASK_NAME:LOCAL == "店番"
        CALL HO_FIND_MODULE_BY_USAGE("商店",, 1)
        SIF RESULTS == ""
            CONTINUE
    ELSEIF HO_TASK_NAME:LOCAL == "宿番"
        CALL HO_FIND_MODULE_BY_USAGE("宿番",, 1)
        SIF RESULTS == ""
            CONTINUE
    ENDIF
    F_COL = TASK == LOCAL ? カラー_選択中 # カラー_白
    IF LOCAL == 0
        CALL WndMgr_TextSet(WINDOW_ID, L_CNT, @"@C:{F_COL}@@B:{BTN_ID + LOCAL}@ [%TOHALF(HO_TASK_NAME:LOCAL)%] @/B@@/C@")
    ELSE
        CALL WndMgr_TextAdd(WINDOW_ID, L_CNT, @"@C:{F_COL}@@B:{BTN_ID + LOCAL}@ [%TOHALF(HO_TASK_NAME:LOCAL)%] @/B@@/C@")
    ENDIF
    SIF LOCAL > 0 && LOCAL % 8 == 0
        L_CNT += 2
NEXT

IF GROUPMATCH(HO_TASK_NAME:TASK, "採集", "採掘", "芸能", "訓練", "搾乳")
    L_CNT += 2
    ;対象モジュール
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"優先的に作業を行う設備")
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))
    CALL HO_FIND_MODULE_BY_USAGE(HO_TASK_NAME:TASK)
    _LIST_MODULE = %RESULTS%
    FOR LOCAL, 0, LIST_COUNT(_LIST_MODULE)
        MODULE_LIST_IDX = TOINT(LIST_GET(_LIST_MODULE, LOCAL))
        CALL HO_GET_MODULE_LIST(MODULE_LIST_IDX, "MODULE_ID")
        MODULE_ID = RESULT
        CALL HO_GET_MODULE_DATA(MODULE_ID, "MODULE_NAME")
        MODULE_NAME = %RESULTS%
        CALL HO_GET_MODULE_LIST(MODULE_LIST_IDX, "ROOM_IDX")
        ROOM_IDX = RESULT
        CALL HO_GET_ROOM_NAME(ROOM_IDX)
        ROOM_NAME = %RESULTS%
        IF LIST_INDEXOF(_LIST_HO_WORKPLACE:CHARA_ID:TIMETABLE, TOSTR(MODULE_LIST_IDX)) != -1
            F_COL = カラー_白
        ELSE
            F_COL = カラー_選択不可
        ENDIF
        LOCALS '= @"%MODULE_NAME%(%ROOM_NAME%)"
        IF LOCAL % 2 == 0
            CALL WndMgr_TextSet(WINDOW_ID, L_CNT, @"@C:{F_COL}@@B:\\[MODULE_LIST_IDX:{MODULE_LIST_IDX}\\]@　[%LOCALS, 20, LEFT%]　@/B@@/C@")
        ELSE
            CALL WndMgr_TextAdd(WINDOW_ID, L_CNT, @"@C:{F_COL}@@B:\\[MODULE_LIST_IDX:{MODULE_LIST_IDX}\\]@　[%LOCALS, 20, LEFT%]　@/B@@/C@")
            L_CNT += 2
        ENDIF
    NEXT
ELSEIF HO_TASK_NAME:TASK == "クラフト"
    L_CNT += 2
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"割り当てる作業指示")
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"優先度順に3つまで選択可能です。実行可能かつ優先度の高い作業が遂行されます")
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))

    ;明細行
    DT_SELECT "CRAFT_ORDER",,, REGISTED_CRAFT_ORDER
    IF !RESULT
        CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"※作業指示が作成されていません")
        CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"作業指示は錬金台などの設備のアイテムクラフト画面から作成可能です")
    ELSE
        FOR LOCAL, 0, RESULT
            ;情報取得
            MODULE_LIST_IDX = DT_CELL_GET("CRAFT_ORDER", REGISTED_CRAFT_ORDER:LOCAL, "MODULE_LIST_IDX", 1)
            ITEM_ID = DT_CELL_GET("CRAFT_ORDER", REGISTED_CRAFT_ORDER:LOCAL, "ITEM_ID", 1)
            RECIPE_NO = DT_CELL_GET("CRAFT_ORDER", REGISTED_CRAFT_ORDER:LOCAL, "RECIPE_NO", 1)
            TARGET_NUM = DT_CELL_GET("CRAFT_ORDER", REGISTED_CRAFT_ORDER:LOCAL, "TARGET_NUM", 1)
            IS_ACTIVE = DT_CELL_GET("CRAFT_ORDER", REGISTED_CRAFT_ORDER:LOCAL, "IS_ACTIVE", 1)
            CALL HO_GET_MODULE_LIST(MODULE_LIST_IDX, "MODULE_ID")
            MODULE_ID = RESULT
            CALL HO_GET_MODULE_DATA(MODULE_ID, "MODULE_NAME")
            MODULE_NAME = %RESULTS%
            CALL GET_ITEM_NAME(ITEM_ID)
            ITEM_NAME = %RESULTS%
            ;ツールチップ生成
            CALL GET_ITEM_MATERIAL_NEEDS(ITEM_ID, MATERIAL_NEEDS, RECIPE_NO)
            CALL HO_GET_MATERIAL_NEEDS_STR(MATERIAL_NEEDS)
            TOOLTIP '= "◆必要コスト
"
            TOOLTIP += RESULTS
            ;文字列出力
            LIST_IDX = LIST_INDEXOF(_LIST_HO_CRAFT_ORDER_DID:CHARA_ID:TIMETABLE, TOSTR(REGISTED_CRAFT_ORDER:LOCAL))
            IF LIST_IDX != -1
                LOCALS '= @"@C:{カラー_オレンジ}@★{LIST_IDX + 1}　"
            ELSE
                LOCALS '= @"@C:{カラー_白}@　 　"
            ENDIF
            LOCALS += @"[%TOSTR(DETAIL_IDX + 1, "00")%] %MODULE_NAME%で%ITEM_NAME%を生産"
            LOCALS '= @"@B:[ASSIGN_ORDER:{REGISTED_CRAFT_ORDER:LOCAL}]@%LOCALS%@/B@"
            LOCALS += @"@B:DUMMY$%TOOLTIP%@(レシピ{RECIPE_NO + 1})@/B@"
            LOCALS += @"@/C@"
            LOCALS '= TAG_PRINT_SHAPE(LOCALS, 50, 1, 0)
            IF TARGET_NUM == 0
                LOCALS += @"　可能な限り"
            ELSE
                LOCALS += @"　在庫が{TARGET_NUM}個になるまで"
            ENDIF
            LOCALS += @"@C:{カラー_選択不可}@(現在:{HO_ITEM_STOCK:ITEM_ID}個)@/C@"
            LOCALS '= TAG_PRINT_SHAPE(LOCALS, 100, 1, 0)
            LOCALS += @"　@B:[SET_TARGET_NUM:{REGISTED_CRAFT_ORDER:LOCAL}]@[生産量設定]@/B@"
            CALL WndMgr_TextAdd(WINDOW_ID, L_CNT++, LOCALS)
            L_CNT++
            DETAIL_IDX++
        NEXT
    ENDIF
ENDIF

;フッター
L_CNT = WND_HEIGHT - 4
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))
IF HO_TASK_NAME:TASK == "クラフト"
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT, @"@B:{BTN_ID + 99}@　[決定]@/B@@B:[RESET_ORDER:1]@　　　[作業指示をリセット]@/B@")
ELSE
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT, @"@B:{BTN_ID + 99}@　[決定]@/B@")
ENDIF

@HO_SCH_MENU_SET_CHARA_INFO(ARRAYS_STR_CHARA_INFO, CHARA_ID)
#DIMS REF ARRAYS_STR_CHARA_INFO
#DIM CHARA_ID
#DIM HEAD_SIX = GETNUM(ABL, "身体"),  GETNUM(ABL, "器用"), GETNUM(ABL, "知識"),  GETNUM(ABL, "社交"),GETNUM(ABL, "歌唱"), GETNUM(ABL, "料理"),
#DIM HEAD_LEWD = GETNUM(ABL, "欲望"), GETNUM(ABL, "性技"), GETNUM(ABL, "奉仕"), GETNUM(ABL, "性交")
#DIMS DYNAMIC STR_RANK
#DIM DYNAMIC L_CNT
#DIM DYNAMIC F_COL
#DIM BTN_ID

BTN_ID = HO_スケジュールボタンID + (CHARA_ID * 100)

ARRAYS_STR_CHARA_INFO:0 += @"%SNAME(CHARA_ID), MAX_CHARANAME_LENGTH / 2, LEFT%"
ARRAYS_STR_CHARA_INFO:0 += @"%TAG_PRINT_SHAPE(@"朝：@B:{BTN_ID + 0}@[%TOHALF(HO_TASK_NAME:(HO_TASK_SCH:(CHARA_ID):0))%]@/B@", 12, 1, 0)%"
ARRAYS_STR_CHARA_INFO:0 += @"%TAG_PRINT_SHAPE(@"昼：@B:{BTN_ID + 1}@[%TOHALF(HO_TASK_NAME:(HO_TASK_SCH:(CHARA_ID):1))%]@/B@", 12, 1, 0)%"
ARRAYS_STR_CHARA_INFO:0 += @"%TAG_PRINT_SHAPE(@"夕：@B:{BTN_ID + 2}@[%TOHALF(HO_TASK_NAME:(HO_TASK_SCH:(CHARA_ID):2))%]@/B@", 12, 1, 0)%"
ARRAYS_STR_CHARA_INFO:0 += @"%TAG_PRINT_SHAPE(@"晩：@B:{BTN_ID + 3}@[%TOHALF(HO_TASK_NAME:(HO_TASK_SCH:(CHARA_ID):3))%]@/B@", 14, 1, 0)%"
ARRAYS_STR_CHARA_INFO:0 += @"%TAG_PRINT_SHAPE(@"@B:[COPY_SCHEDULE_FROM_CHARA:{CHARA_ID}]@[ｺﾋﾟｰ]@/B@", 7, 1, 0)%"
SIF HO_SCH_COPIED_FROM != -1
    ARRAYS_STR_CHARA_INFO:0 += @"%TAG_PRINT_SHAPE(@"@B:[PASTE_SCHEDULE_TO_CHARA:{CHARA_ID}]@[ﾍﾟｰｽﾄ]@/B@", 7, 1, 0)%"

CALL GET_STR_SEX(CHARA_ID, 1)
ARRAYS_STR_CHARA_INFO:1 += @"%TAG_PRINT_SHAPE(@"%RESULTS%", 4, 1, 0)%"
FOR LOCAL, 0, VARSIZE("HEAD_SIX")
    ARRAYS_STR_CHARA_INFO:1 += @"@C:{カラー_注釈}@%ABLNAME:(HEAD_SIX:LOCAL)%:@/C@"
    STR_RANK = %ALPHABET_RANK(ランク_ＳＬＧ, ABL:CHARA_ID:(HEAD_SIX:LOCAL))%
    F_COL = GET_RANK_COLOR(STR_RANK)
    ARRAYS_STR_CHARA_INFO:1 += @"@C:{F_COL}@%STR_RANK%@/C@ "
    ARRAYS_STR_CHARA_INFO:1 += @"%TOSTR_R(ABL:CHARA_ID:(HEAD_SIX:LOCAL), 3)%  "
NEXT

ARRAYS_STR_CHARA_INFO:2 += "    "
FOR LOCAL, 0, VARSIZE("HEAD_LEWD")
    ARRAYS_STR_CHARA_INFO:2 += @"@C:{カラー_注釈}@%ABLNAME:(HEAD_LEWD:LOCAL)%:@/C@"
    STR_RANK = %ALPHABET_RANK(ランク_その他, ABL:CHARA_ID:(HEAD_LEWD:LOCAL))%
    F_COL = GET_RANK_COLOR(STR_RANK)
    ARRAYS_STR_CHARA_INFO:2 += @"@C:{F_COL}@%STR_RANK%@/C@ "
    ARRAYS_STR_CHARA_INFO:2 += @"%TOSTR_R(ABL:CHARA_ID:(HEAD_LEWD:LOCAL), 3)%  "
NEXT

@HO_SCH_ASSIGN_CRAFT_ORDER(DID)
#DIM DID
#DIM DYNAMIC CHARA_ID
#DIM DYNAMIC TIMETABLE
#DIM ITER_I
#DIM ITER_J
#DIM DYNAMIC LIST_IDX

CHARA_ID = HO_SCH_TARGET_CHARA_ID
TIMETABLE = HO_SCH_TIMETABLE

LIST_IDX = LIST_INDEXOF(_LIST_HO_CRAFT_ORDER_DID:CHARA_ID:TIMETABLE, TOSTR(DID))
;既に割当があるなら削除
IF LIST_IDX != -1
    _LIST_HO_CRAFT_ORDER_DID:CHARA_ID:TIMETABLE = %LIST_REMOVEAT(_LIST_HO_CRAFT_ORDER_DID:CHARA_ID:TIMETABLE, LIST_IDX)%
    RETURN 1
ENDIF

IF LIST_COUNT(_LIST_HO_CRAFT_ORDER_DID:CHARA_ID:TIMETABLE) == 3
    ;既に上限まで割り当てられているなら末尾を置き換え
    _LIST_HO_CRAFT_ORDER_DID:CHARA_ID:TIMETABLE = %LIST_SET(_LIST_HO_CRAFT_ORDER_DID:CHARA_ID:TIMETABLE, 2, TOSTR(DID))%
ELSE
    ;空きがあるなら単純に追加
    _LIST_HO_CRAFT_ORDER_DID:CHARA_ID:TIMETABLE = %LIST_ADD(_LIST_HO_CRAFT_ORDER_DID:CHARA_ID:TIMETABLE, TOSTR(DID))%
ENDIF

;;;作業指示初期化
@HO_SCH_RESET_CRAFT_ORDER()
#DIM DYNAMIC CHARA_ID
#DIM DYNAMIC TIMETABLE
CHARA_ID = HO_SCH_TARGET_CHARA_ID
TIMETABLE = HO_SCH_TIMETABLE
_LIST_HO_CRAFT_ORDER_DID:CHARA_ID:TIMETABLE '= ""

@HO_GET_MATERIAL_NEEDS_STR(MATERIAL_NEEDS, CRAFT_COUNT = 1)
#DIM  REF MATERIAL_NEEDS
#DIM  CRAFT_COUNT
#DIMS DYNAMIC MATERIAL_NAME
#DIM  DYNAMIC STOCKNUM
#DIM  DYNAMIC ITER_I
#DIMS DYNAMIC STRS

STRS '= ""
FOR ITER_I, 0, ITEM_LENGTH
    IF MATERIAL_NEEDS:(ITER_I) > 0
        IF ITER_I == ITEM_ディナリ
            STOCKNUM = MONEY
        ELSEIF ITER_I == ITEM_淫堕点
            STOCKNUM = QST_LEWD_POINT
        ELSE
            STOCKNUM = HO_ITEM_STOCK:(ITER_I)
        ENDIF
        CALL GET_ITEM_NAME(ITER_I)
        MATERIAL_NAME = %RESULTS%
        STRS += TAG_PRINT_SHAPE(@"%MATERIAL_NAME%", 24, 1, 0)
        STRS += @"× {(MATERIAL_NEEDS:(ITER_I)* CRAFT_COUNT)}"
        STRS += @"　(所持:{STOCKNUM})"
        STRS += @"
"
    ENDIF
NEXT

RESULTS = %STRS%
RETURN

@HO_SCH_PASTE_SCHEDULE_TO_CHARA(CHARA_ID)
#DIM CHARA_ID
#DIM TIMETABLE
#DIMS DYNAMIC TASK_NAME
HO_SCH_HEADER_MESSAGE '= @"@C:{カラー_注意}@%ANAME(HO_SCH_COPIED_FROM)%から%ANAME(CHARA_ID)%にコピー@/C@"

FOR TIMETABLE, 0, HO_TIMETABLENUM
    ;虜囚が担当可能なタスクは限定
    TASK_NAME '= HO_TASK_NAME:(HO_TASK_SCH:HO_SCH_COPIED_FROM:TIMETABLE)

    SIF CFLAG:CHARA_ID:捕虜先 == 所属_プレイヤー && !GROUPMATCH(TASK_NAME, "自由", "採集", "採掘", "売春", "搾乳")
        CONTINUE

    IF TASK_NAME == "売春"
        SIF !CAN_PROSTITUTE(CHARA_ID)
            CONTINUE
    ELSEIF TASK_NAME == "搾乳"
        SIF !HAS_TALENT(CHARA_ID, "母乳体質")
            CONTINUE
        SIF CFLAG:CHARA_ID:捕虜先 != 所属_プレイヤー && !IS_NASTY(CHARA_ID, 素質_淫乱_雌牛)
            CONTINUE
    ENDIF

    HO_TASK_SCH:CHARA_ID:TIMETABLE = HO_TASK_SCH:HO_SCH_COPIED_FROM:TIMETABLE
    _LIST_HO_WORKPLACE:CHARA_ID:TIMETABLE '= _LIST_HO_WORKPLACE:HO_SCH_COPIED_FROM:TIMETABLE
    _LIST_HO_CRAFT_ORDER_DID:CHARA_ID:TIMETABLE '= _LIST_HO_CRAFT_ORDER_DID:HO_SCH_COPIED_FROM:TIMETABLE

NEXT