code:
;-------------------------------------------------
; 居住区用の入力受付処理
;-------------------------------------------------
@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

repo_name: pervysquirrelz/erafl

license: unknown


code:
;-------------------------------------------------
; FLAG:調教モード =8 居住区関連処理
;-------------------------------------------------
@HOUSING_SHOW_MEMBER
#DIM DYNAMIC CHARA_ID
#DIM DYNAMIC CHARA_IDX
#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
#DIMS DYNAMIC _LIST_MEMBER_COMPANION
#DIMS DYNAMIC _LIST_MEMBER_SHARE
#DIMS DYNAMIC _LIST_MEMBER_OTHER

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

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
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

IF IS_PARTICIPATE_TRAIN(MASTER)
    CALL HO_SHOW_PORTRAIT(MASTER, (PORTRAIT_SIZEX * P_CNT) + 20, 0)
ENDIF

_LIST_MEMBER '= _LIST_MEMBER_COMPANION + _LIST_MEMBER_SHARE + _LIST_MEMBER_OTHER
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

@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

;ウフフフラグをＯＦＦ
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:設備モブ
            CFLAG:CHARA_ID:調教参加フラグ = 0
            TFLAG:参加者数 --
        ENDIF
        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
    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:{カラー_注釈}@◇　Schedule management　◇@/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}@[Morning]@/C@@/B@"
        CASE 1
            STR_TIME '= @"@B:\\[TIMETABLE:1\\]@@C:{F_COL}@[Noon]@/C@@/B@"
        CASE 2
            STR_TIME '= @"@B:\\[TIMETABLE:2\\]@@C:{F_COL}@[Evening]@/C@@/B@"
        CASE 3
            STR_TIME '= @"@B:\\[TIMETABLE:3\\]@@C:{F_COL}@[Night]@/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}@ [%TR(TOHALF(HO_TASK_NAME:LOCAL))%] @/B@@/C@")
    ELSE
        CALL WndMgr_TextAdd(WINDOW_ID, L_CNT, @"@C:{F_COL}@@B:{BTN_ID + LOCAL}@ [%TR(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}\\]@　[%TR(LOCALS), 20, LEFT%]　@/B@@/C@")
        ELSE
            CALL WndMgr_TextAdd(WINDOW_ID, L_CNT, @"@C:{F_COL}@@B:\\[MODULE_LIST_IDX:{MODULE_LIST_IDX}\\]@　[%TR(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 '= "◆ Required cost
"
            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 += @"As much as possible"
            ELSE
                LOCALS += @"Until {target_num} in stock"
            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}]@[Production setting]@/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}@　[Decide]@/B@@B:[RESET_ORDER:1]@　　　[Reset work instructions]@/B@")
ELSE
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT, @"@B:{BTN_ID + 99}@　[Decide]@/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


code:
;-------------------------------------------------
; FLAG:調教モード =8 居住区関連ステータス描画モード
; いまいち用途が定まってない画面
;-------------------------------------------------
@HO_DRAW_STATUS_WINDOW
CALL WndMgr_DestroyWindow(-1)
CALL HO_DRAW_STATUS_WINDOW_LEFT
CALL HO_DRAW_STATUS_WINDOW_RIGHT
CALL WndMgr_DisplayAll()

@HO_DRAW_STATUS_WINDOW_LEFT
#DIM CONST WINDOW_ID = 0
#DIM CONST WND_WIDTH  = 60
#DIM CONST WND_HEIGHT = 20
#DIM DYNAMIC L_CNT
#DIM DYNAMIC BTN_ID

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

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

CALL WndMgr_CreateWindow(WINDOW_ID, 0, 0, WND_WIDTH, WND_HEIGHT, 0)
L_CNT ++
CALL HO_GET_COMPANION_LIST
_LIST_MEMBER = %RESULTS%
;MASTERを追加するので+1
MEMBER_NUM = RESULT + 1
_LIST_MEMBER = %LIST_INSERTAT(_LIST_MEMBER, 0, TOSTR(MASTER))%
FOR LOCAL, 0, MEMBER_NUM
    CHARA_ID = TOINT(LIST_GET(_LIST_MEMBER, LOCAL))
    IF CHARA_ID == HO_ステータス描画対象
        F_COLOR = カラー_選択中
    ELSE
        F_COLOR = カラー_白
    ENDIF
    LOCALS:0 '= @"@C:{F_COLOR}@@B:{CHARA_ID + BTN_ID}@%ANAME(CHARA_ID)%@/B@@/C@"
    LOCALS:0 = %TAG_PRINT_SHAPE(@"%LOCALS:0%", 15, 1, 0)%
    LOCALS:1 = 体力:%FuncTagSetText_CreateColorBarText(BASE:CHARA_ID:体力, MAXBASE:CHARA_ID:体力, 8, 0xEE6600, 0xFFFF98, 0x000000, 1, "▰")%
    LOCALS:2 = %TAG_PRINT_SHAPE("", 15, 1, 0)%
    LOCALS:3 = 気力:%FuncTagSetText_CreateColorBarText(BASE:CHARA_ID:気力, MAXBASE:CHARA_ID:気力, 8, 0x00FFFF, 0xf2fcfe, 0x000000, 1, "▰")%
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT, @"%LOCALS:0%")
    CALL WndMgr_TextAdd(WINDOW_ID, L_CNT, @"%LOCALS:1%")
    L_CNT  ++
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT, @"%LOCALS:2%")
    CALL WndMgr_TextAdd(WINDOW_ID, L_CNT, @"%LOCALS:3%")
    L_CNT ++
NEXT

@HO_DRAW_STATUS_WINDOW_RIGHT
#DIM CONST WINDOW_ID = 1
#DIM CONST WND_WIDTH  = 50
#DIM CONST WND_HEIGHT = 20
#DIM DYNAMIC L_CNT
#DIM CHARA_ID
#DIMS LINES, 100
VARSET LINES, "-1"

CHARA_ID = HO_ステータス描画対象
CALL WndMgr_CreateWindow(WINDOW_ID, 60, 0, WND_WIDTH, WND_HEIGHT, 2)
CALL WndMgr_TextSet(WINDOW_ID, 0, @"@C:{カラー_注釈}@◇%ANAME(CHARA_ID)%の状態◇@/C@")
CALL HO_GET_空腹度描写(CHARA_ID)
LINES:0 = %RESULTS%
L_CNT ++
CALL WndMgr_TextSet(WINDOW_ID, L_CNT, @"%LINES:0%")
L_CNT ++
L_CNT ++
VARSET LINES, "-1"
;精液描写
CALL HO_GET_精液描写(CHARA_ID, 射精部位_髪)
LINES:0 = %RESULTS%
CALL HO_GET_精液描写(CHARA_ID, 射精部位_顔)
LINES:1 = %RESULTS%
CALL HO_GET_精液描写(CHARA_ID, 射精部位_口)
LINES:2 = %RESULTS%
CALL HO_GET_精液描写(CHARA_ID, 射精部位_胸)
LINES:3 = %RESULTS%
CALL HO_GET_精液描写(CHARA_ID, 射精部位_腋)
LINES:4 = %RESULTS%
CALL HO_GET_精液描写(CHARA_ID, 射精部位_手)
LINES:5 = %RESULTS%
CALL HO_GET_精液描写(CHARA_ID, 射精部位_尻)
LINES:6 = %RESULTS%
CALL HO_GET_精液描写(CHARA_ID, 射精部位_膣内)
LINES:7 = %RESULTS%
CALL HO_GET_精液描写(CHARA_ID, 射精部位_アナル)
LINES:8 = %RESULTS%
CALL HO_GET_精液描写(CHARA_ID, 射精部位_足)
LINES:9 = %RESULTS%
CALL HO_GET_精液描写(CHARA_ID, 射精部位_尻尾)
LINES:10 = %RESULTS%

LOCAL:0 = 0
WHILE LINES:(LOCAL:0) != "-1"
    IF LINES:(LOCAL:0) == ""
        LOCAL:0 ++
        CONTINUE
    ENDIF
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"%LINES:(LOCAL:0)%")
    LOCAL:0 ++
WEND

;衣装の状態
; CALL WndMgr_TextSet(WINDOW_ID, L_CNT, @"@C:{カラー_注釈}@◇%ANAME(CHARA_ID)%の衣服の状態◇@/C@")
; L_CNT ++
; FOR LOCAL, 0, CLOTH_PART_NUM
;     CALL GET_CLOTH_NAME(LOCAL, 調教用衣装:CHARA_ID:LOCAL)
;     SIF RESULTS == "なし"
;         CONTINUE
;     LOCALS = %RESULTS%
;     CALL WndMgr_TextSet(WINDOW_ID, L_CNT, LOCALS)
;     L_CNT ++
; NEXT


code:
;-------------------------------------------------
;ゲストモブの買い物処理
;@HO_CHARAACT_ACTION_PROGRESS から呼ばれる
;顧客による選好とか需要みたいな要素を導入したいところ。。。
;FORCE_BUYに1を立てると販売判定を実施せずに購入処理にうつる
;-------------------------------------------------
; #region
@HO_GUEST_TRADE_ITEM(CHARA_ID, SHOPPER_ID = -1, FORCE_BUY = 0)
#DIM  CHARA_ID
#DIM  SHOPPER_ID
#DIM  FORCE_BUY
#DIMS DYNAMIC _LIST_ITEM
#DIMS DYNAMIC _LIST_CHARA
#DIM  DYNAMIC BUY_ITEM_ID
#DIMS DYNAMIC BUY_ITEM_NAME
#DIM  DYNAMIC BUY_ITEM_NUM
#DIM  DYNAMIC BUY_ITEM_PRICE
#DIM  DYNAMIC PROFIT
#DIM  DYNAMIC SHOPPER_SEDUCTION_LV

BUY_ITEM_ID = -1

;店番中のキャラがいる
CALL HO_FIND_CHARA("ACTION", "店番中")
_LIST_CHARA = %RESULTS%
IF !LIST_COUNT(_LIST_CHARA)
    ;MASTERが店頭に立っていれば販売可能とみなす
    CALL HO_CHECK_USE_MODULE_USAGE(MASTER, "商店")
    SIF !RESULT
        RETURN 0
    _LIST_CHARA = %LIST_ADD(_LIST_CHARA, TOSTR(MASTER))%
ENDIF

;店番中のキャラの中からランダムで販売担当を選出
IF SHOPPER_ID == -1
    SHOPPER_ID = TOINT(LIST_RAND(_LIST_CHARA))
ENDIF
CALL SKILL_GET_LEVEL(SHOPPER_ID, スキル_大分類_性技, "SEDUCTION")
SHOPPER_SEDUCTION_LV = RESULT

;キャラクターに購入の意思がある
SIF RAND:100 >= CFLAG:CHARA_ID:キャラ購買意欲 && !FORCE_BUY
    RETURN 0
IF RAND:2
    CALL HO_GUEST_BUY_ITEM(CHARA_ID, SHOPPER_ID, FORCE_BUY)
    SIF RESULT
        RETURN RESULT
    CALL HO_GUEST_BUY_EQUIP(CHARA_ID, SHOPPER_ID, FORCE_BUY)
    RETURN RESULT
ELSE
    CALL HO_GUEST_BUY_EQUIP(CHARA_ID, SHOPPER_ID, FORCE_BUY)
    SIF RESULT
        RETURN RESULT
    CALL HO_GUEST_BUY_ITEM(CHARA_ID, SHOPPER_ID, FORCE_BUY)
    RETURN RESULT
ENDIF
; #endregion

;-------------------------------------------------
; アイテムの購入処理
;-------------------------------------------------
; #region
@HO_GUEST_BUY_ITEM(CHARA_ID, SHOPPER_ID = -1, FORCE_BUY = 0)
#DIM  CHARA_ID
#DIM  SHOPPER_ID
#DIM  FORCE_BUY
#DIMS DYNAMIC _LIST_ITEM
#DIMS DYNAMIC _LIST_CHARA
#DIM  DYNAMIC BUY_ITEM_ID
#DIMS DYNAMIC BUY_ITEM_NAME
#DIM  DYNAMIC BUY_ITEM_NUM
#DIM  DYNAMIC BUY_ITEM_PRICE
#DIM  DYNAMIC PROFIT
#DIM  DYNAMIC SHOPPER_SEDUCTION_LV
#DIMS DYNAMIC TEXTOUTPUT

;購入アイテム候補をリスト化
FOR LOCAL, 0, ITEM_LENGTH
    IF HO_ITEM_TRADE_STOCK:LOCAL > 0
        _LIST_ITEM = %LIST_ADD(_LIST_ITEM, TOSTR(LOCAL))%
    ENDIF
NEXT
SIF !LIST_COUNT(_LIST_ITEM)
    RETURN 0

;;購入アイテムを決定(今はランダムに選出)
;5回抽選を試みる
FOR LOCAL, 0, 5
    BUY_ITEM_ID = TOINT(LIST_RAND(_LIST_ITEM))
    CALL GET_ITEM_INFO(BUY_ITEM_ID, ITEM_PRICE)
    BUY_ITEM_PRICE = RESULT
    IF BUY_ITEM_PRICE < CFLAG:CHARA_ID:キャラ消費金額
        BREAK
    ELSE
        ;単価が高すぎて変えない場合は購入候補から外して再抽選
        _LIST_ITEM = %LIST_REMOVEALL(_LIST_ITEM, TOSTR(BUY_ITEM_ID))%
        SIF !LIST_COUNT(_LIST_ITEM)
            RETURN 0
    ENDIF
NEXT
SIF BUY_ITEM_ID < 0
    RETURN 0

;購入量の決定
BUY_ITEM_NUM = 1
FOR LOCAL, 0, 4
    SIF !RAND:3
        BREAK
    IF BUY_ITEM_PRICE * (BUY_ITEM_NUM + 1) < CFLAG:CHARA_ID:キャラ消費金額
        BUY_ITEM_NUM ++
    ELSE
        BREAK
    ENDIF
NEXT

SIF HO_ITEM_TRADE_STOCK:BUY_ITEM_ID < BUY_ITEM_NUM
    BUY_ITEM_NUM = HO_ITEM_TRADE_STOCK:BUY_ITEM_ID

;販売処理
CALL GET_ITEM_NAME(BUY_ITEM_ID)
BUY_ITEM_NAME = %RESULTS%
;MEMO:将来的に売上計算式は店番のステータスやスキルで補正したい
PROFIT = BUY_ITEM_PRICE * BUY_ITEM_NUM
CFLAG:CHARA_ID:キャラ消費金額 -= PROFIT
HO_ITEM_TRADE_STOCK:BUY_ITEM_ID -= BUY_ITEM_NUM
;購入に成功した場合キャラ購買意欲を減衰させる
CFLAG:CHARA_ID:キャラ購買意欲 = MAX(0, CFLAG:CHARA_ID:キャラ購買意欲 - RAND(10, 30))
;購入イベント後のスキル処理・経験値・評判処理
CALL HO_TRADE_AFTER_PURCHASE_PROCESS(SHOPPER_ID, PROFIT)
PROFIT = RESULT
;ログ出力
IF SHOPPER_ID == MASTER
    CALL FL_PLAYSE("Money_0.mp3")
    CALLF TAG_PRINT(@"%ANAME(SHOPPER_ID)%は%ANAME(CHARA_ID)%に@C:{カラー_注意}@%BUY_ITEM_NAME%@/C@を{BUY_ITEM_NUM}個売却し@C:{カラー_緑}@%TOSTR(PROFIT, "###,###")%@/C@ディナリを得た", 1)
    WAIT
ENDIF
;CALL HO_PRINT_LOG(@"%ANAME(SHOPPER_ID)%は@C:{カラー_注意}@%BUY_ITEM_NAME%@/C@を{BUY_ITEM_NUM}個売却し@C:{カラー_緑}@%TOSTR(PROFIT, "###,###")%@/C@ディナリを得た")
TEXTOUTPUT = %TOSTR(PROFIT, "###,###")%
TEXTOUTPUT = %TR(ANAME(SHOPPER_ID),"は",@"@C:{カラー_注意}@%BUY_ITEM_NAME%@/C@","を",TOSTR(BUY_ITEM_NUM),"個売却し",@"@C:{カラー_緑}@%TEXTOUTPUT%@/C@",@"ディナリを得た")%
CALL HO_PRINT_LOG(TEXTOUTPUT)

RETURN 1
; #endregion

;-------------------------------------------------
; 装備の購入処理
;-------------------------------------------------
; #region
@HO_GUEST_BUY_EQUIP(CHARA_ID, SHOPPER_ID = -1, FORCE_BUY = 0)
#DIM  CHARA_ID
#DIM  SHOPPER_ID
#DIM  FORCE_BUY
#DIMS DYNAMIC _LIST_ITEM
#DIMS DYNAMIC _LIST_CHARA
#DIM  DYNAMIC BUY_ITEM_DID
#DIMS DYNAMIC BUY_ITEM_NAME
#DIM  DYNAMIC BUY_ITEM_NUM
#DIM  DYNAMIC BUY_ITEM_PRICE
#DIM  DYNAMIC PROFIT
#DIM  DYNAMIC SHOPPER_SEDUCTION_LV
#DIM  DYNAMIC EQUIP_IDX, WPN_MAX_WEAPON_STOCK
#DIMS DYNAMIC TEXTOUTPUT

BUY_ITEM_NUM = DT_SELECT("WEAPON_STOCK","ON_SALE_FLAG = 1",, EQUIP_IDX)
SIF !BUY_ITEM_NUM
    RETURN 0
;購入アイテム候補をリスト化
FOR LOCAL, 0, BUY_ITEM_NUM
    ;購入アイテム候補がリストの上限を超える場合は追加を打ち切る
    SIF LOCAL == _LIST_MAX - 1
        BREAK
    _LIST_ITEM = %LIST_ADD(_LIST_ITEM, TOSTR(EQUIP_IDX:LOCAL))%
NEXT

;;購入アイテムを決定(今はランダムに選出)
;3回抽選を試みる
FOR LOCAL, 0, 3
    BUY_ITEM_DID = TOINT(LIST_RAND(_LIST_ITEM))
    BUY_ITEM_PRICE = DT_CELL_GET("WEAPON_STOCK", BUY_ITEM_DID, "PRICE", 1)
    IF BUY_ITEM_PRICE < CFLAG:CHARA_ID:キャラ消費金額
        BREAK
    ELSE
        ;単価が高すぎて変えない場合は購入候補から外して再抽選
        _LIST_ITEM = %LIST_REMOVEALL(_LIST_ITEM, TOSTR(BUY_ITEM_DID))%
        SIF !LIST_COUNT(_LIST_ITEM)
            RETURN 0
    ENDIF
NEXT
;全て購入候補対象外
SIF BUY_ITEM_DID < 0
    RETURN 0

;販売処理
CALL GET_WEAPON_PRINT_NAME(BUY_ITEM_DID)
BUY_ITEM_NAME = %RESULTS%
;MEMO:将来的に売上計算式は店番のステータスやスキルで補正したい
PROFIT = BUY_ITEM_PRICE
CFLAG:CHARA_ID:キャラ消費金額 -= PROFIT
DT_ROW_REMOVE "WEAPON_STOCK", BUY_ITEM_DID
;購入に成功した場合キャラ購買意欲を減衰させる
CFLAG:CHARA_ID:キャラ購買意欲 = MAX(0, CFLAG:CHARA_ID:キャラ購買意欲 - RAND(10, 30))
;購入イベント後のスキル処理・経験値・評判処理
CALL HO_TRADE_AFTER_PURCHASE_PROCESS(SHOPPER_ID, PROFIT)
PROFIT = RESULT

;ログ出力
IF SHOPPER_ID == MASTER
    CALL FL_PLAYSE("Money_0.mp3")
    CALLF TAG_PRINT(@"%ANAME(SHOPPER_ID)%は%ANAME(CHARA_ID)%に@C:{カラー_注意}@%BUY_ITEM_NAME%@/C@を売却し@C:{カラー_緑}@%TOSTR(PROFIT, "###,###")%@/C@ディナリを得た", 1)
    WAIT
ENDIF
;CALL HO_PRINT_LOG(@"%ANAME(SHOPPER_ID)%は@C:{カラー_注意}@%BUY_ITEM_NAME%@/C@を売却し@C:{カラー_緑}@%TOSTR(PROFIT, "###,###")%@/C@ディナリを得た")
TEXTOUTPUT = %TR(ANAME(SHOPPER_ID),"は",@"@C:{カラー_注意}@%BUY_ITEM_NAME%@/C@ ","を売却し",@"@C:{カラー_緑}@%TOSTR(PROFIT, "###,###")%@/C@ ","ディナリを得た")%
CALL HO_PRINT_LOG(TEXTOUTPUT)

RETURN 1
; #endregion

;-------------------------------------------------
; 購入後処理
;-------------------------------------------------
; #region
@HO_TRADE_AFTER_PURCHASE_PROCESS(SHOPPER_ID, PROFIT)
#DIM  SHOPPER_ID
#DIM  PROFIT
#DIM  DYNAMIC CHARA_ID
#DIM  DYNAMIC SKILL_LV
#DIM  DYNAMIC K4_UNIQUE_SKILL_FLAG
#DIM  DYNAMIC BASE_EXP = 3

;オリヴィアのユニークスキル所持判定
;このスキルはオリヴィアが店番に立っていれば誰が販売担当でも恩恵を受ける
CHARA_ID = NAME_TO_CHARA("UC_オリヴィア")
CALL HO_GET_CHARAACT(CHARA_ID)
IF RESULTS == "店番中" && HAS_SKILL(CHARA_ID, "K4_UNIQUE_SKILL_ADDITIONAL_BENEFIT", スキル_大分類_生活)
    K4_UNIQUE_SKILL_FLAG = 1
ELSE
    K4_UNIQUE_SKILL_FLAG = 0
ENDIF

;販売担当者のスキル処理
SKILL_LV = HAS_SKILL(SHOPPER_ID, "SKILL_ADDITIONAL_BENEFIT", スキル_大分類_生活)
IF SKILL_LV
    CALL SKILL_GET_EFFECT_RATE(スキル_ジャンル_生活, "SKILL_ADDITIONAL_BENEFIT",SKILL_LV)
    PROFIT = FTIMES(PROFIT, 100 + RESULT)
ENDIF

;オリヴィアのユニークスキル補正
IF K4_UNIQUE_SKILL_FLAG
    PROFIT = FTIMES(PROFIT, 125)
ENDIF

;資金の増加
MONEY += PROFIT

;社交経験値の獲得
BASE_EXP += INRANGE(PROFIT / 2000, 1, 5)
CALL HO_CHARAACT_ABLUP(SHOPPER_ID, "社交", BASE_EXP)

;領地評判の上昇
領地評判_商業_増減値 += INRANGE(PROFIT / 500, 1, 20)

;オリヴィアのユニークスキル補正
IF K4_UNIQUE_SKILL_FLAG
    領地評判_商業_増減値 = FTIMES(領地評判_商業_増減値, 125)
ENDIF

RETURN PROFIT

; #endregion

;-------------------------------------------------
; ゲスト生成処理
;店番中のキャラが居るなら商店のあるルームに買い物客ゲストの生成を試みる
;-------------------------------------------------
; #region
@HO_CREATE_GUEST_SHOPPER
#DIMS DYNAMIC _LIST_CHARA
#DIM  DYNAMIC ROOM_IDX
#DIM  DYNAMIC CHARA_ID
#DIM  DYNAMIC SHOPPER_ID

;買物目的のモブ生成は8:30～17:30時まで
SIF !INRANGE(HO_TIME, HO_CLOCK(830), HO_CLOCK(1730))
    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

;;ユニークキャラクターのゲスト判定
;オリヴィアのゲスト判定
CHARA_ID = NAME_TO_CHARA("UC_オリヴィア")
;オリヴィアの出現条件を満たしている
IF K4_DFLAG_行商人オリヴィア && CFLAG:CHARA_ID:所属 != 所属_プレイヤー
    ;まだオリヴィアが領内活動に参加していない
    IF HO_GET_CHARAIDXF(CHARA_ID) == -1 && !TCVAR:CHARA_ID:2500 && RAND:100 < 60
        CALL HO_CREATE_UNIQUE_GUEST(CHARA_ID, ROOM_IDX, "買物客")
        CALL HO_PRINT_LOG(@"@C:{カラー_緑}@%ANAME(CHARA_ID)%%TR("が買い物にやって来た")%@/C@")
        CFLAG:CHARA_ID:キャラ消費金額 = RAND(24, 48) * 400
        CFLAG:CHARA_ID:キャラ購買意欲 = RAND(40, 64)
        CFLAG:CHARA_ID:キャラ滞在時間 = RAND(48, 64) * HO_単位時間
        CFLAG:CHARA_ID:ゲストモブ = 1
        ;オリヴィアの来店済みフラグ(TCVARのキャラ自由枠を使用)
        TCVAR:CHARA_ID:2500 = 1
        ;オリヴィアの商店在庫を設定
        CALL CREATE_GUEST_SET_SHOP_STOCK(CHARA_ID)
        RETURN 1
    ENDIF
ENDIF

;モブ生成判定
CALL HO_CREATE_GUEST(ROOM_IDX, "買物客", "買物客", RAND:100 < FLCONFIG:買物ゲストの男性率 ? 0 # 1)
IF RESULT
    CHARA_ID = RESULT
    CALL HO_PRINT_LOG(@"@C:{カラー_緑}@%ANAME(CHARA_ID)%%TR("が買い物にやって来た")%@/C@")
    ;買い物目的のゲストは3-4時間滞在する
    CFLAG:CHARA_ID:キャラ滞在時間 = RAND(36, 42) * HO_単位時間
    IF IS_FEMALE(CHARA_ID)
        CFLAG:CHARA_ID:汎用口上パターン = 1000
    ENDIF
    RETURN 1
ENDIF

RETURN 0
; #endregion

;-------------------------------------------------
; コマンド:購入から呼び出されるゲスト商店
;-------------------------------------------------
@HO_SHOP_MANAGE_SHOP_GUEST_SHOP(DICS_SHOP_STOCK)
#DIMS REF DICS_SHOP_STOCK
FOR LOCAL, 0, MAX_SHOP_STOCKNUM
    DICS_SHOP_STOCK:LOCAL = %DICS_GUEST_SHOP_STOCK:(MTAR:0):LOCAL%
NEXT


code:
;-------------------------------------------------
; 交易画面
;-------------------------------------------------
@HO_TRADE_MENU()
#DIM DYNAMIC LINE_NUM
LINE_NUM = LINECOUNT
HO_TRADE_PAGE_RIGHT = 0
HO_TRADE_PAGE_LEFT = 0

WHILE 1
    LINE_NUM = LINECOUNT
    CALL HO_DRAW_TRADE_WINDOW
    REDRAW 1
    CALL HO_TRADE_WINDOW_INPUT()
    REDRAW 0
    IF RESULT == -1
        CLEARLINE LINECOUNT - LINE_NUM
        RETURN -1
    ENDIF
    CLEARLINE LINECOUNT - LINE_NUM
WEND

@HO_DRAW_TRADE_WINDOW
CALL WndMgr_DestroyWindow(-1)
CALL HO_DRAW_TRADE_WINDOW_PARENT
IF HO_TRADE_CATEGORY == 0
    CALL HO_DRAW_TRADE_WINDOW_LEFT
    CALL HO_DRAW_TRADE_WINDOW_RIGHT
ELSE
    CALL HO_DRAW_TRADE_EQUIP_WINDOW_LEFT
    CALL HO_DRAW_TRADE_EQUIP_WINDOW_RIGHT
ENDIF
CALL WndMgr_DisplayAll()

;-------------------------------------------------
; 親ウィンドウ
;-------------------------------------------------
@HO_DRAW_TRADE_WINDOW_PARENT
#DIM CONST WINDOW_ID = 0
#DIM CONST WND_WIDTH  = 170
#DIM CONST WND_HEIGHT = 44
#DIM DYNAMIC L_CNT
#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++, @"@C:{カラー_注釈}@◇交易品管理◇@/C@")
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))

CALL WndMgr_TextSet(WINDOW_ID, L_CNT, @"@C:{カラー_注釈}@移動量:@/C@")
CALL WndMgr_TextAdd(WINDOW_ID, L_CNT, @"@B:{BTN_ID + 0}@@C:{HO_TRADE_TRANSFER_SWITCH == 0 ? カラー_選択中 # カラー_注釈}@ [1] @/C@@/B@")
CALL WndMgr_TextAdd(WINDOW_ID, L_CNT, @"@B:{BTN_ID + 1}@@C:{HO_TRADE_TRANSFER_SWITCH == 1 ? カラー_選択中 # カラー_注釈}@ [5] @/C@@/B@")
CALL WndMgr_TextAdd(WINDOW_ID, L_CNT, @"@B:{BTN_ID + 2}@@C:{HO_TRADE_TRANSFER_SWITCH == 2 ? カラー_選択中 # カラー_注釈}@ [10] @/C@@/B@")
CALL WndMgr_TextAdd(WINDOW_ID, L_CNT, @"@B:{BTN_ID + 3}@@C:{HO_TRADE_TRANSFER_SWITCH == 3 ? カラー_選択中 # カラー_注釈}@ [100] @/C@@/B@")
CALL WndMgr_TextAdd(WINDOW_ID, L_CNT, @"@B:{BTN_ID + 4}@@C:{HO_TRADE_TRANSFER_SWITCH == 4 ? カラー_選択中 # カラー_注釈}@ [1000] @/C@@/B@")
CALL WndMgr_TextAdd(WINDOW_ID, L_CNT, @"@B:{BTN_ID + 9}@@C:{HO_TRADE_TRANSFER_SWITCH == 9 ? カラー_選択中 # カラー_注釈}@ [ALL] @/C@@/B@")

CALL WndMgr_TextAdd(WINDOW_ID, L_CNT, @"@C:{カラー_注釈}@　　　カテゴリー:@/C@")
CALL WndMgr_TextAdd(WINDOW_ID, L_CNT, @"@B:[CATEGORY:0]@@C:{HO_TRADE_CATEGORY == 0 ? カラー_選択中 # カラー_注釈}@　[アイテム]@/C@@/B@")
CALL WndMgr_TextAdd(WINDOW_ID, L_CNT, @"@B:[CATEGORY:1]@@C:{HO_TRADE_CATEGORY == 1 ? カラー_選択中 # カラー_注釈}@　[武器]@/C@@/B@")
CALL WndMgr_TextAdd(WINDOW_ID, L_CNT, @"@B:[CATEGORY:2]@@C:{HO_TRADE_CATEGORY == 2 ? カラー_選択中 # カラー_注釈}@　[レリック] @/C@@/B@")

L_CNT ++
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))

;フッター出力
;-------------------------------------------------
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:[EXIT:9999]@@C:{カラー_白}@[BACK]@/C@@/B@")

RETURN

;-------------------------------------------------
; アイテム用の在庫・販売管理メニュー
;-------------------------------------------------
; #region
@HO_DRAW_TRADE_WINDOW_LEFT
#DIM CONST WINDOW_ID = 1
#DIM CONST WND_WIDTH  = 82
#DIM CONST WND_HEIGHT = 36
#DIM CONST ヘッダー行数 = 2
#DIM CONST アイテムリスト行数 = 30
#DIMS DYNAMIC DETAIL_LIST, ITEM_LENGTH
#DIM DYNAMIC ITEM_NUM
#DIM DYNAMIC L_CNT
#DIM DYNAMIC BTN_ID
#DIM DYNAMIC PAGE_NUM
#DIMS DYNAMIC STR_FOOTER
#DIM DYNAMIC DETAIL_LINECOUNT

BTN_ID = HO_交易ボタンID + 10000

CALL HO_TRADE_COUNT_PAGE_NUM(HO_ITEM_STOCK, アイテムリスト行数)
PAGE_NUM = RESULT

;ウィンドウ作成
CALL WndMgr_CreateWindow(WINDOW_ID, 2, 6, WND_WIDTH, WND_HEIGHT, 2)
CALL WndMgr_Attribute(WINDOW_ID, "BorderColor", カラー_選択不可)

;ヘッダー
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_注釈}@◇備蓄◇@/C@")
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))

;明細リスト作成
DETAIL_LINECOUNT = 0
FOR LOCAL, 0, ITEM_LENGTH
    ITEM_NUM = HO_ITEM_STOCK:LOCAL
    CALL GET_ITEM_INFO(LOCAL, ITEM_CANNOT_SELL)
    SIF RESULT
        CONTINUE
    IF ITEM_NUM > 0
        CALL HO_TRADE_PRINT_STOCK_DETAIL(HO_ITEM_STOCK, LOCAL)
        DETAIL_LIST:DETAIL_LINECOUNT '= @"@B:{BTN_ID + LOCAL}@%RESULTS%@/B@"
        DETAIL_LINECOUNT ++
    ENDIF
NEXT

;明細リスト出力
L_CNT = 0
FOR LOCAL, アイテムリスト行数 * HO_TRADE_PAGE_LEFT, アイテムリスト行数 * (HO_TRADE_PAGE_LEFT + 1)
    IF  L_CNT / アイテムリスト行数 <= 0
        CALL WndMgr_TextSet(WINDOW_ID, L_CNT + ヘッダー行数, DETAIL_LIST:LOCAL)
        L_CNT++
    ELSE
        CALL WndMgr_TextAdd(WINDOW_ID, (L_CNT % アイテムリスト行数) + ヘッダー行数, DETAIL_LIST:LOCAL)
        L_CNT ++
    ENDIF
    L_CNT ++
NEXT

;フッター
IF PAGE_NUM > 0
    STR_FOOTER += HO_TRADE_PAGE_LEFT > 0 ? @"@B:{BTN_ID + 9000}@<<@/B@ " # "   "
    STR_FOOTER += @"%TOSTR(HO_TRADE_PAGE_LEFT + 1, "..")% "
    STR_FOOTER += HO_TRADE_PAGE_LEFT != PAGE_NUM ? @"@B:{BTN_ID + 9001}@>>@/B@" # "  "
    CALLF TAG_PRINT_SHAPE(STR_FOOTER, WND_WIDTH - 8, 1, 2)
    CALL WndMgr_TextSet(WINDOW_ID, アイテムリスト行数 + 2, @"@C:{カラー_注釈}@%RESULTS%@/C@")
ENDIF

@HO_DRAW_TRADE_WINDOW_RIGHT
#DIM CONST WINDOW_ID = 2
#DIM CONST WND_WIDTH  = 84
#DIM CONST WND_HEIGHT = 36
#DIM CONST ヘッダー行数 = 2
#DIM CONST アイテムリスト行数 = 30
#DIMS DYNAMIC DETAIL_LIST, ITEM_LENGTH
#DIM DYNAMIC ITEM_NUM
#DIM DYNAMIC L_CNT
#DIM DYNAMIC BTN_ID
#DIM DYNAMIC PAGE_NUM
#DIMS DYNAMIC STR_FOOTER
#DIM DYNAMIC DETAIL_LINECOUNT

BTN_ID = HO_交易ボタンID + 20000

CALL HO_TRADE_COUNT_PAGE_NUM(HO_ITEM_TRADE_STOCK, アイテムリスト行数)
PAGE_NUM = RESULT

;ウィンドウ作成
CALL WndMgr_CreateWindow(WINDOW_ID, 84, 6, WND_WIDTH, WND_HEIGHT, 2)
CALL WndMgr_Attribute(WINDOW_ID, "BorderColor", カラー_選択不可)
;ヘッダー
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_注釈}@◇販売品◇@/C@")
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))

;明細リスト作成
DETAIL_LINECOUNT = 0
FOR LOCAL, 0, ITEM_LENGTH
    ITEM_NUM = HO_ITEM_TRADE_STOCK:LOCAL
    IF ITEM_NUM > 0
        CALL HO_TRADE_PRINT_STOCK_DETAIL(HO_ITEM_TRADE_STOCK, LOCAL)
        DETAIL_LIST:DETAIL_LINECOUNT '= @"@B:{BTN_ID + LOCAL}@%RESULTS%@/B@"
        DETAIL_LINECOUNT ++
    ENDIF
NEXT

;明細リスト出力
L_CNT = 0
FOR LOCAL, アイテムリスト行数 * HO_TRADE_PAGE_RIGHT, アイテムリスト行数 * (HO_TRADE_PAGE_RIGHT + 1)
    IF  L_CNT / アイテムリスト行数 <= 0
        CALL WndMgr_TextSet(WINDOW_ID, L_CNT + ヘッダー行数, DETAIL_LIST:LOCAL)
        L_CNT++
    ELSE
        CALL WndMgr_TextAdd(WINDOW_ID, (L_CNT % アイテムリスト行数) + ヘッダー行数, DETAIL_LIST:LOCAL)
        L_CNT ++
    ENDIF
    L_CNT ++
NEXT

;フッター
IF PAGE_NUM > 0
    STR_FOOTER += HO_TRADE_PAGE_RIGHT > 0 ? @"@B:{BTN_ID + 9000}@<<@/B@ " # "   "
    STR_FOOTER += @"%TOSTR(HO_TRADE_PAGE_RIGHT + 1, "..")% "
    STR_FOOTER += HO_TRADE_PAGE_RIGHT != PAGE_NUM ? @"@B:{BTN_ID + 9001}@>>@/B@" # "  "
    CALLF TAG_PRINT_SHAPE(STR_FOOTER, WND_WIDTH - 8, 1, 2)
    CALL WndMgr_TextSet(WINDOW_ID, アイテムリスト行数 + 2, @"@C:{カラー_注釈}@%RESULTS%@/C@")
ENDIF

@HO_TRADE_PRINT_STOCK_DETAIL(ITEM_STOCK_ARRAY, ITEM_ID)
#DIM REF ITEM_STOCK_ARRAY
#DIM ITEM_ID
#DIMS DYNAMIC ITEM_NAME
#DIM DYNAMIC ITEM_NUM
#DIMS DYNAMIC STR_ITEM_NUM
#DIMS DYNAMIC STR_PRICE

CALL GET_ITEM_NAME(ITEM_ID)
ITEM_NAME = %RESULTS%
ITEM_NAME = %TAG_PRINT_SHAPE(ITEM_NAME, 16, 1, 0)%
STR_ITEM_NUM = %TAG_PRINT_SHAPE(@"× %TOSTR(ITEM_STOCK_ARRAY:ITEM_ID)%", 10, 1, 0)%
CALL GET_ITEM_INFO(ITEM_ID,ITEM_PRICE)
STR_PRICE = %TAG_PRINT_SHAPE(TOSTR(RESULT,"#,###,###"), 10, 1, 0)%

RESULTS '= @"%TAG_PRINT_SHAPE(@"%ITEM_NAME%%STR_ITEM_NUM%%STR_PRICE%", 38, 1, 0)%"

; #endregion

;-------------------------------------------------
; 武器・レリック用の在庫・販売管理メニュー
;-------------------------------------------------
; #region
@HO_DRAW_TRADE_EQUIP_WINDOW_LEFT
#DIM CONST WINDOW_ID = 1
#DIM CONST WND_WIDTH  = 120
#DIM CONST WND_HEIGHT = 36
#DIM CONST ヘッダー行数 = 4
#DIM CONST アイテムリスト行数 = 14
#DIMS DYNAMIC DETAIL_LIST, ITEM_LENGTH
#DIM DYNAMIC ITEM_NUM
#DIM DYNAMIC L_CNT
#DIM DYNAMIC BTN_ID
#DIM DYNAMIC PAGE_NUM
#DIMS DYNAMIC STR_FOOTER
#DIM DYNAMIC DETAIL_LINECOUNT

;装備関連の変数
#DIM  DYNAMIC EQUIP_IDX, WPN_MAX_WEAPON_STOCK
#DIM  DYNAMIC STATUS_IDX
#DIM  DYNAMIC WEAPON_ID
#DIMS DYNAMIC DIC_WPN_SKILL
#DIMS DYNAMIC SKILL_DEF_NAME
#DIMS DYNAMIC WPN_SKILL_DEF_LIST, VARSIZE("SKILL_DEF_LIST")
#DIMS DYNAMIC SKILL_NAME
#DIM  DYNAMIC SKILL_LV
#DIM  DYNAMIC PRICE
#DIMS DYNAMIC TOOLTIP

#DIM  DYNAMIC EQUIP_TYPE
#DIMS DYNAMIC DT_FILTER
#DIMS DYNAMIC SORT_ORDER = "WEAPON_ID ASC, MATERIAL ASC"

;印字カラム
#DIMS DYNAMIC COLUMN, 9
#DIM  DYNAMIC COLUMN_IDX
#DIM  DYNAMIC COLUMN_LENGTH = 26, 14, 6, 6, 6, 6, 6, 6, 8,
#DIM  DYNAMIC COLUMN_PADDING = 0, 0, 0, 0, 0, 0, 0, 0, 0
;ステータスの表示順序
{
    #DIMS CONST   COLUMN_ORDER =
        "ATTACK"
        , "DEFENCE"
        , "ARMOR"
        , "MAG"
        , "AGILITY"
        , "HATE_RATE"
        , "TARGETING"
}

SIF HO_TRADE_CATEGORY == 2
    EQUIP_TYPE = 1
DT_FILTER '= @"EQUIP_TYPE = {EQUIP_TYPE} AND EQUIP_CHARA_ID < 0 AND (ON_SALE_FLAG = 0 OR ON_SALE_FLAG IS NULL) AND (FAVORITE_FLAG = 0 OR FAVORITE_FLAG IS NULL)"

BTN_ID = HO_交易ボタンID + 10000
CALL HO_TRADE_COUNT_PAGE_NUM(HO_ITEM_STOCK, アイテムリスト行数)
PAGE_NUM = RESULT

;ウィンドウ作成
CALL WndMgr_CreateWindow(WINDOW_ID, 2, 6, WND_WIDTH, WND_HEIGHT, 2)
CALL WndMgr_Attribute(WINDOW_ID, "BorderColor", カラー_選択不可)

;ヘッダー
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_注釈}@◇備蓄◇@/C@")
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))
LOCALS = %TAG_PRINT_SHAPE(@"@B:[SORT:WEAPON_NAME]@[名称]@/B@", 28, 1)%
LOCALS += TAG_PRINT_SHAPE(@"@B:[SORT:PRICE]@　[値段]@/B@", 12, 1, 1)
LOCALS += TAG_PRINT_SHAPE(@"@B:[SORT:ATTACK]@　[攻]@/B@", 6, 1)
LOCALS += TAG_PRINT_SHAPE(@"@B:[SORT:DEFENCE]@　[防]@/B@", 6, 1)
LOCALS += TAG_PRINT_SHAPE(@"@B:[SORT:ARMOR]@　[軽]@/B@", 6, 1)
LOCALS += TAG_PRINT_SHAPE(@"@B:[SORT:MAG]@　[魔]@/B@", 6, 1)
LOCALS += TAG_PRINT_SHAPE(@"@B:[SORT:AGILITY]@　[行]@/B@", 6, 1)
LOCALS += TAG_PRINT_SHAPE(@"@B:[SORT:HATE_RATE]@　[敵]@/B@", 6, 1)
LOCALS += TAG_PRINT_SHAPE(@"@B:[SORT:HATE_RATE]@　[選]@/B@", 8, 1)
LOCALS += TAG_PRINT_SHAPE(@"　　[スキル]", 22, 1)
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, LOCALS)
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))

;明細リスト作成
;-------------------------------------------------
DETAIL_LINECOUNT = 0
;ソート
IF HO_TRADE_CURRENT_SORT_COLUMN != ""
    SELECTCASE HO_TRADE_CURRENT_SORT_ORDER
        CASE 1 ;降順
            SORT_ORDER '= @"%HO_TRADE_CURRENT_SORT_COLUMN% DESC"
        CASE 2 ;昇順
            SORT_ORDER '= @"%HO_TRADE_CURRENT_SORT_COLUMN% ASC"
    ENDSELECT
ELSE
    SORT_ORDER '= "WEAPON_ID ASC, MATERIAL ASC"
ENDIF
ITEM_NUM = DT_SELECT("WEAPON_STOCK", DT_FILTER, SORT_ORDER, EQUIP_IDX)
PAGE_NUM = ITEM_NUM / (アイテムリスト行数 + 1)
FOR LOCAL, 0, ITEM_NUM
    CALL GET_WEAPON_PRINT_NAME(EQUIP_IDX:LOCAL)
    COLUMN:0 = %TAG_PRINT_SHAPE(@"@C:{カラー_白}@@B:[STOCK_EQUIP_DID:{EQUIP_IDX:LOCAL}]@[%RESULTS%]@/B@@/C@", COLUMN_LENGTH:0, 1)%
    CALL GET_EQUIP_PRICE(EQUIP_IDX:LOCAL)
    PRICE = RESULT
    ;ここでPRICEの値を更新するの実装としてはとてもよろしくない
    DT_CELL_SET "WEAPON_STOCK", EQUIP_IDX:LOCAL, "PRICE", PRICE, 1
    COLUMN:1 = %TAG_PRINT_SHAPE(TOSTR(PRICE, "#,##0"), COLUMN_LENGTH:1, 1, 1)%
    FOR STATUS_IDX, 0, WPN_MAX_STATUSNUM
        IF COLUMN_ORDER:STATUS_IDX != "TARGETING"
            COLUMN:(STATUS_IDX + 2) = %TAG_PRINT_SHAPE(@"@C:{カラー_注釈}@{DT_CELL_GET("WEAPON_STOCK", EQUIP_IDX:LOCAL, COLUMN_ORDER:STATUS_IDX, 1)}@/C@", COLUMN_LENGTH:(STATUS_IDX + 2), 1, 1)%
        ELSEIF EQUIP_TYPE == 0
            COLUMN:(STATUS_IDX + 2) = %TAG_PRINT_SHAPE(@"@C:{カラー_注釈}@%WPN_脅威選定文字列:DT_CELL_GET("WEAPON_STOCK", EQUIP_IDX:LOCAL, COLUMN_ORDER:STATUS_IDX, 1)%@/C@", COLUMN_LENGTH:(STATUS_IDX + 2), 1, 1)%
        ENDIF
    NEXT
    DETAIL_LIST:DETAIL_LINECOUNT '= ""
    FOR COLUMN_IDX, 0, VARSIZE("COLUMN")
        DETAIL_LIST:DETAIL_LINECOUNT += COLUMN:COLUMN_IDX
    NEXT
    DETAIL_LIST:DETAIL_LINECOUNT += "    "
    ;武器スキル_パッシブ
    CALL GET_EQUIP_SKILL_LIST_STR(EQUIP_IDX:LOCAL, 武器スキル_パッシブ)
    DETAIL_LIST:DETAIL_LINECOUNT += RESULTS
    ;武器スキル_アクティブ
    CALL GET_EQUIP_SKILL_LIST_STR(EQUIP_IDX:LOCAL, 武器スキル_アクティブ)
    DETAIL_LIST:DETAIL_LINECOUNT += RESULTS
    DETAIL_LINECOUNT ++
NEXT

;明細リスト出力
L_CNT = 0
FOR LOCAL, アイテムリスト行数 * HO_TRADE_PAGE_LEFT, アイテムリスト行数 * (HO_TRADE_PAGE_LEFT + 1)
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT + ヘッダー行数, DETAIL_LIST:LOCAL)
    L_CNT ++
    L_CNT ++
NEXT

;フッター
IF PAGE_NUM > 0
    STR_FOOTER += HO_TRADE_PAGE_LEFT > 0 ? @"@B:{BTN_ID + 9000}@<<@/B@ " # "   "
    STR_FOOTER += @"%TOSTR(HO_TRADE_PAGE_LEFT + 1, "..")% "
    STR_FOOTER += HO_TRADE_PAGE_LEFT != PAGE_NUM ? @"@B:{BTN_ID + 9001}@>>@/B@" # "  "
    CALLF TAG_PRINT_SHAPE(STR_FOOTER, WND_WIDTH - 8, 1, 2)
    CALL WndMgr_TextSet(WINDOW_ID, (アイテムリスト行数 * 2) + 4, @"@C:{カラー_注釈}@%RESULTS%@/C@")
ENDIF

@HO_DRAW_TRADE_EQUIP_WINDOW_RIGHT
#DIM CONST WINDOW_ID = 2
#DIM CONST WND_WIDTH  = 46
#DIM CONST WND_HEIGHT = 36
#DIM CONST ヘッダー行数 = 4
#DIM CONST アイテムリスト行数 = 14
#DIMS DYNAMIC DETAIL_LIST, WPN_MAX_WEAPON_STOCK
#DIM DYNAMIC ITEM_NUM
#DIM DYNAMIC L_CNT
#DIM DYNAMIC BTN_ID
#DIM DYNAMIC PAGE_NUM
#DIMS DYNAMIC STR_FOOTER
#DIM DYNAMIC DETAIL_LINECOUNT

;装備関連の変数
#DIM  DYNAMIC EQUIP_IDX, WPN_MAX_WEAPON_STOCK
#DIM  DYNAMIC STATUS_IDX
#DIM  DYNAMIC WEAPON_ID
#DIMS DYNAMIC DIC_WPN_SKILL
#DIMS DYNAMIC SKILL_DEF_NAME
#DIMS DYNAMIC WPN_SKILL_DEF_LIST, VARSIZE("SKILL_DEF_LIST")
#DIMS DYNAMIC SKILL_NAME
#DIM  DYNAMIC SKILL_LV
#DIMS DYNAMIC TOOLTIP
#DIM  DYNAMIC PRICE

#DIM  DYNAMIC EQUIP_TYPE
#DIMS DYNAMIC DT_FILTER

;印字カラム
#DIMS DYNAMIC COLUMN, 2
#DIM  DYNAMIC COLUMN_IDX
#DIM  DYNAMIC COLUMN_LENGTH = 28, 12
#DIM  DYNAMIC COLUMN_PADDING = 0, 0

;ウィンドウ作成
CALL WndMgr_CreateWindow(WINDOW_ID, 122, 6, WND_WIDTH, WND_HEIGHT, 2)
CALL WndMgr_Attribute(WINDOW_ID, "BorderColor", カラー_選択不可)
;ヘッダー
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_注釈}@◇販売品◇@/C@")
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))
LOCALS = %TAG_PRINT_SHAPE(@"[名称]", 28, 1)%
LOCALS += TAG_PRINT_SHAPE(@"　[値段]", 12, 1, 1)
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, LOCALS)
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))

BTN_ID = HO_交易ボタンID + 20000

SIF HO_TRADE_CATEGORY == 2
    EQUIP_TYPE = 1
DT_FILTER '= @"EQUIP_TYPE = {EQUIP_TYPE} AND EQUIP_CHARA_ID < 0 AND ON_SALE_FLAG = 1"

;明細リスト作成
DETAIL_LINECOUNT = 0
ITEM_NUM = DT_SELECT("WEAPON_STOCK", DT_FILTER,, EQUIP_IDX)
PAGE_NUM = ITEM_NUM / (アイテムリスト行数 + 1)
FOR LOCAL, 0, ITEM_NUM
    CALL GET_WEAPON_PRINT_NAME(EQUIP_IDX:LOCAL)
    COLUMN:0 = %TAG_PRINT_SHAPE(@"@C:{カラー_白}@@B:[SALE_EQUIP_DID:{EQUIP_IDX:LOCAL}]@[%RESULTS%]@/B@@/C@", COLUMN_LENGTH:0, 1)%
    CALL GET_EQUIP_PRICE(EQUIP_IDX:LOCAL)
    PRICE = RESULT
    COLUMN:1 = %TAG_PRINT_SHAPE(TOSTR(PRICE, "#,##0"), COLUMN_LENGTH:1, 1, 1)%
    FOR COLUMN_IDX, 0, VARSIZE("COLUMN")
        DETAIL_LIST:DETAIL_LINECOUNT += COLUMN:COLUMN_IDX
    NEXT
    DETAIL_LINECOUNT ++
NEXT

;明細リスト出力
L_CNT = 0
FOR LOCAL, アイテムリスト行数 * HO_TRADE_PAGE_RIGHT, アイテムリスト行数 * (HO_TRADE_PAGE_RIGHT + 1)
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT + ヘッダー行数, DETAIL_LIST:LOCAL)
    L_CNT ++
    L_CNT ++
NEXT

;フッター
IF PAGE_NUM > 0
    STR_FOOTER += HO_TRADE_PAGE_RIGHT > 0 ? @"@B:{BTN_ID + 9000}@<<@/B@ " # "   "
    STR_FOOTER += @"%TOSTR(HO_TRADE_PAGE_RIGHT + 1, "..")% "
    STR_FOOTER += HO_TRADE_PAGE_RIGHT != PAGE_NUM ? @"@B:{BTN_ID + 9001}@>>@/B@" # "  "
    CALLF TAG_PRINT_SHAPE(STR_FOOTER, WND_WIDTH - 8, 1, 2)
    CALL WndMgr_TextSet(WINDOW_ID, (アイテムリスト行数 * 2) + 4, @"@C:{カラー_注釈}@%RESULTS%@/C@")
ENDIF

; #endregion

;-------------------------------------------------
; 交易メニュー入力受付
;-------------------------------------------------
; #region
@HO_TRADE_WINDOW_INPUT()
#DIMS DYNAMIC INPUT_VALUES
#DIM  DYNAMIC INPUT_VALUE
#DIM  DYNAMIC VALUE
#DIM  DYNAMIC INPUT_WINDOW_ID
#DIMS DYNAMIC SORT_COLUMN

ONEINPUTS
IF ISNUMERIC(RESULTS)
    INPUT_VALUE = TOINT(RESULTS)
    INPUT_WINDOW_ID = (INPUT_VALUE - HO_交易ボタンID) / 10000
    SELECTCASE INPUT_WINDOW_ID
            ;親ウィンドウからの入力処理
        CASE 0
            VALUE = INPUT_VALUE - HO_交易ボタンID
            ;移動量ボタンが押された場合
            IF INRANGE(VALUE, 0, 9)
                HO_TRADE_TRANSFER_SWITCH = VALUE
            ENDIF
            ;備蓄ウィンドウからの入力処理
        CASE 1
            VALUE = INPUT_VALUE - HO_交易ボタンID - 10000
            IF VALUE < ITEM_LENGTH
                CALL HO_TRADE_TRANSFER_STOCK_TO_SALE(VALUE)
            ELSEIF INRANGE(VALUE, 9000, 9001)
                IF VALUE == 9000
                    HO_TRADE_PAGE_LEFT --
                ELSE
                    HO_TRADE_PAGE_LEFT ++
                ENDIF
            ENDIF
            ;販売品ウィンドウからの入力処理
        CASE 2
            VALUE = INPUT_VALUE - HO_交易ボタンID - 20000
            IF  VALUE < ITEM_LENGTH
                CALL HO_TRADE_TRANSFER_SALE_TO_STOCK(VALUE)
            ELSEIF INRANGE(VALUE, 9000, 9001)
                IF VALUE == 9000
                    HO_TRADE_PAGE_RIGHT --
                ELSE
                    HO_TRADE_PAGE_RIGHT ++
                ENDIF
            ENDIF
        CASEELSE
    ENDSELECT
ELSE
    INPUT_VALUES = %RESULTS%
    IF DIC_CONTAINSKEY(INPUT_VALUES, "EXIT")
        RETURN -1
    ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "CATEGORY")
        HO_TRADE_CATEGORY = TOINT(DIC_GET(INPUT_VALUES, "CATEGORY"))
        HO_TRADE_PAGE_RIGHT = 0
        HO_TRADE_PAGE_LEFT = 0
    ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "STOCK_EQUIP_DID")
        DT_CELL_SET "WEAPON_STOCK", TOINT(DIC_GET(INPUT_VALUES, "STOCK_EQUIP_DID")), "ON_SALE_FLAG", 1, 1
    ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "SALE_EQUIP_DID")
        DT_CELL_SET "WEAPON_STOCK", TOINT(DIC_GET(INPUT_VALUES, "SALE_EQUIP_DID")), "ON_SALE_FLAG", 0, 1
    ELSEIF DIC_CONTAINSKEY(RESULTS, "SORT")
        SORT_COLUMN = %DIC_GET(RESULTS, "SORT")%
        IF SORT_COLUMN == HO_TRADE_CURRENT_SORT_COLUMN
            HO_TRADE_CURRENT_SORT_ORDER ++
            IF HO_TRADE_CURRENT_SORT_ORDER > 2
                HO_TRADE_CURRENT_SORT_COLUMN '= ""
                HO_TRADE_CURRENT_SORT_ORDER = 0
            ENDIF
        ELSE
            HO_TRADE_CURRENT_SORT_COLUMN = %SORT_COLUMN%
            HO_TRADE_CURRENT_SORT_ORDER = 1
        ENDIF
    ENDIF
ENDIF
RETURN
; #endregion

@HO_TRADE_TRANSFER_STOCK_TO_SALE(ITEM_ID)
#DIM ITEM_ID
#DIM TRANSFER_AMOUNT

CALL HO_TRADE_SET_TRANSFER_AMOUNT(HO_ITEM_STOCK, ITEM_ID)
TRANSFER_AMOUNT = RESULT
CALL CHANGE_ITEM_STOCK(ITEM_ID, TRANSFER_AMOUNT * -1)
HO_ITEM_TRADE_STOCK:ITEM_ID += TRANSFER_AMOUNT

@HO_TRADE_TRANSFER_SALE_TO_STOCK(ITEM_ID)
#DIM ITEM_ID
#DIM TRANSFER_AMOUNT

CALL HO_TRADE_SET_TRANSFER_AMOUNT(HO_ITEM_TRADE_STOCK, ITEM_ID)
TRANSFER_AMOUNT = RESULT
HO_ITEM_TRADE_STOCK:ITEM_ID -= TRANSFER_AMOUNT
CALL CHANGE_ITEM_STOCK(ITEM_ID, TRANSFER_AMOUNT)

@HO_TRADE_SET_TRANSFER_AMOUNT(ITEM_STOCK_ARRAY_FROM, ITEM_ID)
#DIM REF ITEM_STOCK_ARRAY_FROM
#DIM ITEM_ID
#DIM TRANSFER_AMOUNT

SELECTCASE HO_TRADE_TRANSFER_SWITCH
    CASE 0
        TRANSFER_AMOUNT = 1
    CASE 1
        TRANSFER_AMOUNT = MIN(5, ITEM_STOCK_ARRAY_FROM:ITEM_ID)
    CASE 2
        TRANSFER_AMOUNT = MIN(10, ITEM_STOCK_ARRAY_FROM:ITEM_ID)
    CASE 3
        TRANSFER_AMOUNT = MIN(100, ITEM_STOCK_ARRAY_FROM:ITEM_ID)
    CASE 4
        TRANSFER_AMOUNT = MIN(1000, ITEM_STOCK_ARRAY_FROM:ITEM_ID)
    CASE 9
        TRANSFER_AMOUNT = ITEM_STOCK_ARRAY_FROM:ITEM_ID
ENDSELECT

RETURN TRANSFER_AMOUNT

@HO_TRADE_COUNT_PAGE_NUM(ITEM_STOCK_ARRAY, MAX_ROW_NUM)
#DIM REF ITEM_STOCK_ARRAY
#DIM MAX_ROW_NUM
#DIM PAGE_NUM
#DIM DYNAMIC CNT

MAX_ROW_NUM = MAX(1, MAX_ROW_NUM)

FOR LOCAL, 0, ITEM_LENGTH
    IF ITEM_STOCK_ARRAY:LOCAL > 0
        CNT++
    ENDIF
NEXT
RETURN CNT / (MAX_ROW_NUM + 1)