code:
;-------------------------------------------------
;キャラクターの行動定義
; 逢瀬は買春など別の行動定義で設定されるため、ここでは終了判定のみ実施
;-------------------------------------------------
@HO_行動定義_逢瀬(CHARA_ID)
#DIM CHARA_ID

IF TCVAR:CHARA_ID:買春参加者
    IF IS_TIRED(CHARA_ID, 20) || TCVAR:CHARA_ID:行動待機時間 <= 0
        TCVAR:CHARA_ID:逢瀬終了フラグ = 1
    ENDIF
ENDIF

;-------------------------------------------------
;キャラクターの行動定義
;RESULT 1:行動成功, 0:行動のために移動が必要, -1:決定した行動が実行不可
;ROOM_IDX_DEST 移動先部屋IDX
;-------------------------------------------------
@HO_行動定義_逢瀬準備(CHARA_ID, ROOM_IDX_DEST = -1)
#DIM  DYNAMIC CHARA_ID
#DIM  DYNAMIC ROOM_IDX_DEST
#DIM  DYNAMIC CHARA_IDX
#DIM  DYNAMIC CHARA_ID_COUPLE
#DIM  DYNAMIC CHARA_IDX_COUPLE
#DIM  DYNAMIC ROOM_IDX
#DIMS DYNAMIC _LIST_ROUTE

;キャラのIDXを取得
CALL HO_GET_CHARAIDX(CHARA_ID)
CHARA_IDX = RESULT
;キャラの現在地を取得
CALL HO_GET_CHARADATA(CHARA_IDX, "ROOM_IDX")
ROOM_IDX = RESULT
;データが存在しない場合
SIF ROOM_IDX == -1
    RETURN -1

;恋人のキャラIDを取得
CHARA_ID_COUPLE = CFLAG:CHARA_ID:カップル相手キャラID

;疲れていたら実行しない
SIF IS_TIRED(CHARA_ID) || IS_TIRED(CHARA_IDX_COUPLE)
    RETURN -1

;恋人のキャラIDXを取得
CALL HO_GET_CHARAIDX(CHARA_ID_COUPLE)
CHARA_IDX_COUPLE = RESULT

;逢瀬先の場所が未定の場合
IF ROOM_IDX_DEST == -1
    ;恋人が特定行動中の場合は失敗
    CALL HO_GET_CHARADATA(CHARA_IDX_COUPLE, "ACTION")
    SIF GROUPMATCH(RESULTS, "睡眠中", "同行中", "逢瀬中", "逢瀬待機", "移動中", "移動完了", "入浴中")
        RETURN -1
    ;逢瀬場所を決定
    IF TCVAR:CHARA_ID:宿泊先設備IDX > 0 && (RAND:2 == 0 || !FLCONFIG:カップル客の個室以外での逢瀬を許可)
        CALL HO_GET_MODULE_LIST(TCVAR:CHARA_ID:宿泊先設備IDX, "ROOM_IDX")
        ROOM_IDX_DEST = RESULT
    ELSEIF FLCONFIG:カップル客の個室以外での逢瀬を許可
        CALL HO_FIND_ROOM_BY_MODULE_ELEMENT("遮蔽/自然", ROOM_IDX, "RANDOM")
        ROOM_IDX_DEST = RESULT
    ELSE
        RETURN -1
    ENDIF
    SIF ROOM_IDX_DEST == -1
        RETURN -1
    ;恋人を逢瀬先に誘う
    CALL HO_行動定義_逢瀬準備(CHARA_ID_COUPLE, ROOM_IDX_DEST)
    SIF RESULT == -1
        RETURN -1
ENDIF

;移動ルートを決定
CALL HO_GET_ROUTE(ROOM_IDX, ROOM_IDX_DEST)
SIF RESULT == -1
    RETURN -1
_LIST_ROUTE = %RESULTS%

;目的地に到達していない場合(現在地との距離が正の値)
IF RESULT > 0
    CALL HO_STOP_USE_MODULE(CHARA_ID)
    CALL HO_SET_MOVELIST(CHARA_ID, _LIST_ROUTE)
    CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "移動中")
    TCVAR:CHARA_ID:予約済行動 = ACT_逢瀬待機
    ;目的地に到達している場合(現在地と目的地の距離が0)
ELSE
    CALL HO_行動定義_逢瀬待機(CHARA_ID)
ENDIF

RETURN 1

;-------------------------------------------------
;キャラクターの行動定義
;RESULT 1:行動成功, 0:行動のために移動が必要, -1:決定した行動が実行不可
;-------------------------------------------------
@HO_行動定義_逢瀬待機(CHARA_ID)
#DIM DYNAMIC CHARA_ID
#DIM DYNAMIC CHARA_IDX
#DIM DYNAMIC CHARA_ID_COUPLE
#DIM DYNAMIC CHARA_IDX_COUPLE
#DIM DYNAMIC ROOM_IDX
#DIM  DYNAMIC MODULE_ID
#DIM  DYNAMIC MODULE_IDX
#DIM  DYNAMIC MODULE_SLOT_IDX
#DIMS DYNAMIC MODULE_NAME
#DIMS DYNAMIC _LIST_MODULE_IDX
#DIMS DYNAMIC ACTION_COUPLE
#DIM DYNAMIC SERVICE_CATEGORY

;キャラのIDXを取得
CALL HO_GET_CHARAIDX(CHARA_ID)
CHARA_IDX = RESULT
;キャラの現在地を取得
CALL HO_GET_CHARADATA(CHARA_IDX, "ROOM_IDX")
ROOM_IDX = RESULT
;データが存在しない場合
SIF ROOM_IDX == -1
    RETURN -1

;恋人のキャラIDを取得
CHARA_ID_COUPLE = CFLAG:CHARA_ID:カップル相手キャラID
;恋人のキャラIDXを取得
CALL HO_GET_CHARAIDX(CHARA_ID_COUPLE)
CHARA_IDX_COUPLE = RESULT

; 逢瀬相手の状態を確認
CALL HO_GET_CHARADATA(CHARA_IDX_COUPLE, "ACTION")
ACTION_COUPLE = %RESULTS%

; 逢瀬待機中の相手が存在
IF ACTION_COUPLE == "逢瀬待機"
    ;恋人の現在地と同じかを確認
    CALL HO_GET_CHARAPLACE(CHARA_ID_COUPLE)
    SIF RESULT != ROOM_IDX
        RETURN -1

    CALL HO_GET_MAPDATA(HO_有効マップID, ROOM_IDX, "MODULE_SLOT")
    _LIST_MODULE_IDX = %RESULTS%
    ;宿泊先設備が存在する場合はそれを利用
    IF LIST_INDEXOF(_LIST_MODULE_IDX, TOSTR(TCVAR:CHARA_ID:宿泊先設備IDX)) > 0
        CALL HO_TRY_USE_MODULE(CHARA_ID,,,TCVAR:CHARA_ID:宿泊先設備IDX)
        SIF RESULT == -1
            RETURN -1
        CALL HO_TRY_USE_MODULE(CHARA_ID_COUPLE,,,TCVAR:CHARA_ID:宿泊先設備IDX)
        SIF RESULT == -1
            RETURN -1
    ELSE
        ;遮蔽属性かつ空き容量2以上の設備をランダムに使用
        CALL HO_TRY_USE_MODULE(CHARA_ID,,"遮蔽",,1,"[CAPACITY:2]")
        SIF RESULT == -1
            RETURN -1
        ;恋人にも同じ設備を使わせる
        MODULE_IDX = C_COND_MAP_GET(CHARA_ID, "設備IDX")
        CALL HO_TRY_USE_MODULE(CHARA_ID_COUPLE,,,MODULE_IDX,1)
        SIF RESULT == -1
            RETURN -1
    ENDIF

    CALL HO_GET_CHARADATA(CHARA_IDX, "USE_MODULE_IDX")
    MODULE_IDX = RESULT
    SIF MODULE_IDX == -1
        RETURN -1

    ;既に誰かいる場合は諦める
    CALL HO_CHECK_PUBLIC_EYE(CHARA_ID)
    IF RESULT == 1
        CALL HO_PRINT_LOG(@"@C:{カラー_シルバー}@%ANAME(CHARA_ID)%は周囲の目を気にして恋人との逢瀬を諦めた@/C@", 0)
        TCVAR:CHARA_ID_COUPLE:行動待機時間 = 0
        RETURN -1
    ENDIF

    SELECTCASE RAND:100
        CASE IS < 40
            SERVICE_CATEGORY = 奉仕_通常
        CASE IS < 80
            SERVICE_CATEGORY = 奉仕_愛撫
        CASEELSE
            SERVICE_CATEGORY = 奉仕_口淫
    ENDSELECT
    TFLAG:奉仕カテゴリ = SERVICE_CATEGORY

    ; 逢瀬状態の設定(本人)
    CALL HO_SET_CHARADATA_BY_ID(CHARA_ID, "ACTION", "逢瀬中")
    TCVAR:CHARA_ID:奉仕者フラグ = 1
    TCVAR:CHARA_ID:HO作業進捗量 = 0
    TCVAR:CHARA_ID:行動待機時間 = 120
    ; 逢瀬状態の設定(恋人)
    CALL HO_SET_CHARADATA_BY_ID(CHARA_ID_COUPLE, "ACTION", "逢瀬中")
    TCVAR:CHARA_ID_COUPLE:被奉仕者フラグ = 1
    TCVAR:CHARA_ID_COUPLE:HO作業進捗量 = 0
    TCVAR:CHARA_ID_COUPLE:行動待機時間 = 120

    CALL HO_GET_MODULE_LIST(MODULE_IDX, "MODULE_SLOT_IDX")
    MODULE_SLOT_IDX = RESULT
    CALL HO_GET_MODULE_ID2(ROOM_IDX, MODULE_SLOT_IDX)
    MODULE_ID = RESULT
    CALL HO_GET_MODULE_DATA(MODULE_ID, "MODULE_NAME")
    MODULE_NAME = %RESULTS%
    CALL HO_PRINT_LOG(@"@C:{カラー_シルバー}@%ANAME(CHARA_ID)%は%MODULE_NAME%で恋人とイチャイチャし始めた@/C@", 0)
    ; 逢瀬相手がまだいない
ELSE
    ;恋人の到着を45分~1時間待つ
    CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "逢瀬待機")
    TCVAR:CHARA_ID:疲労度 = 0
    TCVAR:CHARA_ID:行動待機時間 = RAND(9, 12) * HO_単位時間
ENDIF

RETURN 1

;-------------------------------------------------
;擬似性行為_経験処理
;-------------------------------------------------
@HO_SEXUALACT_EXP(CHARA_ID)
#DIM  CHARA_ID
#DIM  DYNAMIC TARGET_ID
#DIMS DYNAMIC ITEM_NAME
#DIM  DYNAMIC ITEM_NUM

TCVAR:CHARA_ID:HO作業進捗量 += 10
TCVAR:CHARA_ID:疲労度 += 5
BASE:CHARA_ID:体力 -= 75
BASE:CHARA_ID:気力 -= 50

IF TCVAR:CHARA_ID:HO作業進捗量 > 100
    TARGET_ID = TCVAR:CHARA_ID:売春相手ID
    ;売春経験は開始時に加算しているため、ここでは加算しない
    IF C_COND("設備属性:グローリーホール",,CHARA_ID) && HAS_PENIS(TARGET_ID)
        IF TCVAR:CHARA_ID:売春参加者
            CALL HO_PRINT_LOG(@"@C:{カラー_ピンク}@%ANAME(CHARA_ID)%は%ANAME(TARGET_ID)%に口で奉仕した@/C@", 0)
            CALL FUCK(CHARA_ID, "欲望, 性技, 奉仕, 口淫", "キス喪失, CFLAG減少", TARGET_ID, @"%ANAME(TARGET_ID)%のペニス", "", "", "売春")
            CALL GET_ITEM_NAME(ITEM_精液)
            ITEM_NAME = %RESULTS%
            ITEM_NUM = RAND(1, 3)
            CALL HO_PRINT_LOG(@"%ANAME(CHARA_ID)%は@C:{カラー_黄}@%ITEM_NAME%@/C@を@C:{カラー_緑}@{ITEM_NUM}@/C@個搾り取った")
            CALL CHANGE_ITEM_STOCK(ITEM_精液, ITEM_NUM)
        ELSEIF TCVAR:CHARA_ID:買春参加者
            TARGET_ID = TCVAR:CHARA_ID:買春相手ID
            CALL FUCK(CHARA_ID, "欲望, 性技, 奉仕, 口淫")
        ELSE
            TARGET_ID = CFLAG:CHARA_ID:カップル相手キャラID
            CALL FUCK(CHARA_ID, "欲望, 性技, 奉仕, 口淫")
        ENDIF
    ELSE
        IF TCVAR:CHARA_ID:売春参加者
            TARGET_ID = TCVAR:CHARA_ID:売春相手ID
            CALL HO_PRINT_LOG(@"@C:{カラー_ピンク}@%ANAME(CHARA_ID)%は%ANAME(TARGET_ID)%と深く交わった@/C@", 0)
            CALL FUCK(CHARA_ID, "欲望, 性技, 精愛, 性交, 射精, Ｃ, Ｖ, Ｂ, Ｍ, Ａ, 口淫, Ｖ性交, Ａ性交", "処女喪失, Ａ処女喪失, 膣内射精, キス喪失, 腸内射精, 口内射精", GET_ID(TARGET_ID), @"%ANAME(TARGET_ID)%", @"%ANAME(TARGET_ID)%", "", "", 2)
        ELSEIF TCVAR:CHARA_ID:買春参加者
            TARGET_ID = TCVAR:CHARA_ID:買春相手ID
            CALL FUCK(CHARA_ID, "欲望, 性技, 精愛, 性交, 射精, Ｃ, Ｖ, Ｂ, Ｍ, Ａ, 口淫, Ｖ性交, Ａ性交", "処女喪失, Ａ処女喪失, 膣内射精, キス喪失, 腸内射精, 口内射精", GET_ID(TARGET_ID), @"%ANAME(TARGET_ID)%", @"%ANAME(TARGET_ID)%", "", "", 1)
        ELSE
            TARGET_ID = CFLAG:CHARA_ID:カップル相手キャラID
            CALL FUCK(CHARA_ID, "欲望, 性技, 精愛, 性交, 射精, Ｃ, Ｖ, Ｂ, Ｍ, Ａ, 口淫, Ｖ性交, Ａ性交", "処女喪失, Ａ処女喪失, 膣内射精, キス喪失, 腸内射精, 口内射精", GET_ID(TARGET_ID), @"%ANAME(TARGET_ID)%", @"%ANAME(TARGET_ID)%", "", "", 1)
        ENDIF
    ENDIF
    TCVAR:CHARA_ID:HO作業進捗量 = 0
    TCVAR:CHARA_ID:買春失敗カウンタ = 0
ENDIF

;-------------------------------------------------
; 逢瀬終了処理
;-------------------------------------------------
@HO_SEXUALACT_RELEASE_ACTOR(CHARA_ID)
#DIM CHARA_ID
#DIM TARGET_ID

;覗き見られている場合は行動定義側での処理は行わない
SIF TCVAR:CHARA_ID:覗き見対象
    RETURN 0

;買春解除処理
IF TCVAR:CHARA_ID:売春参加者 || TCVAR:CHARA_ID:買春参加者
    ;買い手側に終了フラグが立っている場合、双方の逢瀬を終了
    IF (TCVAR:CHARA_ID:買春参加者 || TCVAR:CHARA_ID:売春参加者) && TCVAR:CHARA_ID:逢瀬終了フラグ
        TARGET_ID = TCVAR:CHARA_ID:買春相手ID
        CALL HO_STOP_USE_MODULE(CHARA_ID)
        CALL HO_SET_CHARAACT(CHARA_ID, "待機")
        CALL HO_INIT_SEXUALACT_FLAG(CHARA_ID)
        TCVAR:CHARA_ID:行動待機時間 = 0
        CALL HO_STOP_USE_MODULE(TARGET_ID)
        CALL HO_SET_CHARAACT(TARGET_ID, "待機")
        CALL HO_INIT_SEXUALACT_FLAG(TARGET_ID)
        TCVAR:TARGET_ID:行動待機時間 = 0
        RETURN 0
    ENDIF
    ;互いに逢瀬中でない場合解放
    IF TCVAR:CHARA_ID:買春参加者
        CALL HO_GET_CHARAACT(TCVAR:CHARA_ID:買春相手ID)
        IF RESULTS != "逢瀬中"
            CALL HO_STOP_USE_MODULE(CHARA_ID)
            CALL HO_SET_CHARAACT(CHARA_ID, "待機")
            CALL HO_INIT_SEXUALACT_FLAG
            TCVAR:CHARA_ID:行動待機時間 = 0
        ENDIF
    ENDIF
    IF TCVAR:CHARA_ID:売春参加者
        CALL HO_GET_CHARAACT(TCVAR:CHARA_ID:売春相手ID)
        IF RESULTS != "逢瀬中"
            CALL HO_STOP_USE_MODULE(CHARA_ID)
            CALL HO_SET_CHARAACT(CHARA_ID, "待機")
            CALL HO_INIT_SEXUALACT_FLAG
            TCVAR:CHARA_ID:行動待機時間 = 0
        ENDIF
    ENDIF
ELSE
    ;互いに逢瀬中でない場合解放
    TARGET_ID = CFLAG:CHARA_ID:カップル相手キャラID
    CALL HO_GET_CHARAACT(TARGET_ID)
    IF RESULTS != "逢瀬中"
        CALL HO_STOP_USE_MODULE(CHARA_ID)
        CALL HO_SET_CHARAACT(CHARA_ID, "待機")
        TCVAR:CHARA_ID:行動待機時間 = 0
    ENDIF
ENDIF
RETURN

@HO_INIT_SEXUALACT_FLAG(CHARA_ID)
#DIM CHARA_ID
TCVAR:CHARA_ID:買春参加者 = 0
TCVAR:CHARA_ID:売春参加者 = 0
TCVAR:CHARA_ID:売春相手ID = 0
TCVAR:CHARA_ID:買春相手ID = 0
TCVAR:CHARA_ID:逢瀬終了フラグ = 0


code:
;-------------------------------------------------
;キャラクターの行動定義
;水場が存在し条件を満たす場合の自由行動からの派生コマンド
;-------------------------------------------------
@HO_行動定義_遊戯(CHARA_ID)
#DIM CHARA_ID
#DIM  DYNAMIC CHARA_IDX
#DIM  DYNAMIC ROOM_IDX
#DIM  DYNAMIC 移動先ROOM_IDX
#DIMS DYNAMIC _LIST_移動先候補
#DIMS DYNAMIC 現在の行動
#DIM  DYNAMIC 衣装プリセット

;IDXを取得
CALL HO_GET_CHARAIDX(CHARA_ID)
CHARA_IDX = RESULT
;キャラが現在いる部屋を取得
CALL HO_GET_CHARADATA(CHARA_IDX, "ROOM_IDX")
ROOM_IDX = RESULT
CALL HO_GET_CHARADATA(CHARA_IDX, "ACTION")
現在の行動 = %RESULTS%

CALL HO_FIND_NEAREST_ROOM_BY_MODULE_USAGE("遊戯", ROOM_IDX)
IF RESULT != -1
    移動先ROOM_IDX = RESULT
ELSE
    TFLAG:経路_水場なし = 1
    RETURN -1
ENDIF
CALL HO_GET_ROUTE(ROOM_IDX, 移動先ROOM_IDX)
SIF RESULT == -1
    RETURN -1
_LIST_移動先候補 = %RESULTS%
IF RESULT != 0
    CALL HO_STOP_USE_MODULE(CHARA_ID)
    CALL HO_SET_MOVELIST(CHARA_ID, _LIST_移動先候補)
ELSE
    CALL HO_STOP_USE_MODULE(CHARA_ID)
    CALL HO_TRY_USE_MODULE(CHARA_ID, "遊戯")
    IF RESULT == 1
        CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "遊戯中")
        TCVAR:CHARA_ID:行動待機時間 = RAND(9, 16) * HO_単位時間
        TCVAR:CHARA_ID:疲労度 += 100
        RETURN 1
    ELSE
        CALL HO_FIND_NEAREST_ROOM_BY_MODULE_USAGE("遊戯", ROOM_IDX, 1)
        IF RESULT != -1
            移動先ROOM_IDX = RESULT
            CALL HO_GET_ROUTE(ROOM_IDX, 移動先ROOM_IDX)
            _LIST_移動先候補 = %RESULTS%
            CALL HO_SET_MOVELIST(CHARA_ID, _LIST_移動先候補)
        ELSE
            RETURN -1
        ENDIF
    ENDIF
ENDIF

repo_name: pervysquirrelz/erafl

license: unknown


code:
;-------------------------------------------------
;キャラクターの行動定義
;-------------------------------------------------
@HO_行動定義_運動(CHARA_ID)
#DIM CHARA_ID
#DIM  DYNAMIC CHARA_IDX
#DIM  DYNAMIC ROOM_IDX
#DIM  DYNAMIC 移動先ROOM_IDX
#DIMS DYNAMIC _LIST_移動先候補
#DIMS DYNAMIC 現在の行動

;IDXを取得
CALL HO_GET_CHARAIDX(CHARA_ID)
CHARA_IDX = RESULT
;キャラが現在いる部屋を取得
CALL HO_GET_CHARADATA(CHARA_IDX, "ROOM_IDX")
ROOM_IDX = RESULT
CALL HO_GET_CHARADATA(CHARA_IDX, "ACTION")
現在の行動 = %RESULTS%

CALL HO_FIND_NEAREST_ROOM_BY_MODULE_USAGE("体力訓練", ROOM_IDX)
IF RESULT != -1
    移動先ROOM_IDX = RESULT
ELSE
    RETURN -1
ENDIF
CALL HO_GET_ROUTE(ROOM_IDX, 移動先ROOM_IDX)
_LIST_移動先候補 = %RESULTS%
IF RESULT != 0
    CALL HO_STOP_USE_MODULE(CHARA_ID)
    CALL HO_SET_MOVELIST(CHARA_ID, _LIST_移動先候補)
ELSEIF RESULT == -1
    RETURN -1
ELSE
    CALL HO_STOP_USE_MODULE(CHARA_ID)
    CALL HO_TRY_USE_MODULE(CHARA_ID, "体力訓練")
    IF RESULT == 1
        CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "運動中")
        TCVAR:CHARA_ID:行動待機時間 = RAND(9, 16) * HO_単位時間
        TCVAR:CHARA_ID:疲労度 += 300
        RETURN 1
    ELSE
        ;他の部屋に候補が無いか探してみる
        CALL HO_FIND_NEAREST_ROOM_BY_MODULE_USAGE("体力訓練", ROOM_IDX, 1)
        IF RESULT != -1
            移動先ROOM_IDX = RESULT
            CALL HO_GET_ROUTE(ROOM_IDX, 移動先ROOM_IDX)
            _LIST_移動先候補 = %RESULTS%
            CALL HO_SET_MOVELIST(CHARA_ID, _LIST_移動先候補)
        ELSE
            RETURN -1
        ENDIF
    ENDIF
ENDIF


code:
;-------------------------------------------------
;キャラクターの行動定義
;水場が存在し条件を満たす場合の自由行動からの派生コマンド
;-------------------------------------------------
@HO_行動定義_釣り(CHARA_ID)
#DIM CHARA_ID
#DIM  DYNAMIC CHARA_IDX
#DIM  DYNAMIC ROOM_IDX
#DIM  DYNAMIC 移動先ROOM_IDX
#DIMS DYNAMIC _LIST_移動先候補
#DIMS DYNAMIC 現在の行動
#DIM  DYNAMIC 衣装プリセット

SIF TFLAG:経路_水場なし
    RETURN -1

;IDXを取得
CALL HO_GET_CHARAIDX(CHARA_ID)
CHARA_IDX = RESULT
;キャラが現在いる部屋を取得
CALL HO_GET_CHARADATA(CHARA_IDX, "ROOM_IDX")
ROOM_IDX = RESULT
CALL HO_GET_CHARADATA(CHARA_IDX, "ACTION")
現在の行動 = %RESULTS%

CALL HO_FIND_NEAREST_ROOM_BY_MODULE_USAGE("水場", ROOM_IDX)
IF RESULT != -1
    移動先ROOM_IDX = RESULT
ELSE
    TFLAG:経路_水場なし = 1
    RETURN -1
ENDIF
CALL HO_GET_ROUTE(ROOM_IDX, 移動先ROOM_IDX)
SIF RESULT == -1
    RETURN -1
_LIST_移動先候補 = %RESULTS%
IF RESULT != 0
    CALL HO_STOP_USE_MODULE(CHARA_ID)
    CALL HO_SET_MOVELIST(CHARA_ID, _LIST_移動先候補)
ELSE
    CALL HO_STOP_USE_MODULE(CHARA_ID)
    CALL HO_TRY_USE_MODULE(CHARA_ID, "水場")
    IF RESULT == 1
        CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "釣り中")
        TCVAR:CHARA_ID:行動待機時間 = RAND(9, 16) * HO_単位時間
        TCVAR:CHARA_ID:疲労度 += 100
        RETURN 1
    ELSE
        CALL HO_FIND_NEAREST_ROOM_BY_MODULE_USAGE("水場", ROOM_IDX, 1)
        IF RESULT != -1
            移動先ROOM_IDX = RESULT
            CALL HO_GET_ROUTE(ROOM_IDX, 移動先ROOM_IDX)
            _LIST_移動先候補 = %RESULTS%
            CALL HO_SET_MOVELIST(CHARA_ID, _LIST_移動先候補)
        ELSE
            RETURN -1
        ENDIF
    ENDIF
ENDIF


code:
;-------------------------------------------------
;キャラクターの行動定義
;-------------------------------------------------
@HO_行動定義_鑑賞(CHARA_ID)
#DIM CHARA_ID
#DIM  DYNAMIC CHARA_IDX
#DIM  DYNAMIC ROOM_IDX
#DIM  DYNAMIC 移動先ROOM_IDX
#DIMS DYNAMIC _LIST_移動先候補
#DIMS DYNAMIC 現在の行動

;IDXを取得
CALL HO_GET_CHARAIDX(CHARA_ID)
CHARA_IDX = RESULT
;キャラが現在いる部屋を取得
CALL HO_GET_CHARADATA(CHARA_IDX, "ROOM_IDX")
ROOM_IDX = RESULT
CALL HO_GET_CHARADATA(CHARA_IDX, "ACTION")
現在の行動 = %RESULTS%

CALL HO_STOP_USE_MODULE(CHARA_ID)
CALL HO_TRY_USE_MODULE(CHARA_ID,,"鑑賞可")
IF RESULT == 1
    CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "鑑賞中")
    TCVAR:CHARA_ID:行動待機時間 = RAND(6, 12) * HO_単位時間
    RETURN 1
ELSE
    ;鑑賞は設備を利用していなくても実行できる
    CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "鑑賞中")
    TCVAR:CHARA_ID:行動待機時間 = RAND(6, 12) * HO_単位時間
    RETURN 1
ENDIF

@HO_行動定義_鑑賞_生産物(CHARA_ID)
#DIM  CHARA_ID
#DIM  DYNAMIC CHARA_IDX
#DIM  DYNAMIC ROOM_IDX
#DIM  DYNAMIC PLAYER_CHARA_ID
#DIMS DYNAMIC LIST_CHARA_ID
#DIMS DYNAMIC MAP
#DIMS DYNAMIC MESSAGE
#DIM  DYNAMIC SUM_PARAM
#DIM  DYNAMIC SCORE
#DIM  DYNAMIC MASTERが公演に参加
#DIM  DYNAMIC 公演代表者ID
#DIM  DYNAMIC 公演人数

CALL HO_GET_CHARAIDX(CHARA_ID)
CHARA_IDX = RESULT
CALL HO_GET_CHARADATA(CHARA_IDX, "ROOM_IDX")
ROOM_IDX = RESULT
MAP '= @"MAP_{ROOM_IDX}_ROOM_EFFECT"

CALL HO_GET_MEMBER_IN_ROOM_BY_ACTION(ROOM_IDX, "演奏中")
IF RESULT
    LIST_CHARA_ID = %RESULTS%
    公演人数 += LIST_COUNT(LIST_CHARA_ID)
    FOR LOCAL, 0, 公演人数
        PLAYER_CHARA_ID = LIST_GETINT(LIST_CHARA_ID, LOCAL)
        SIF LOCAL == 0
            公演代表者ID = PLAYER_CHARA_ID
        SUM_PARAM += ABL:CHARA_ID:歌唱
        SUM_PARAM += FTIMES(ABL:CHARA_ID:器用, 75)
    NEXT
ENDIF
CALL HO_GET_MEMBER_IN_ROOM_BY_ACTION(ROOM_IDX, "演舞中")
IF RESULT
    LIST_CHARA_ID = %RESULTS%
    公演人数 += LIST_COUNT(LIST_CHARA_ID)
    FOR LOCAL, 0, 公演人数
        PLAYER_CHARA_ID = LIST_GETINT(LIST_CHARA_ID, LOCAL)
        SIF LOCAL == 0
            公演代表者ID = PLAYER_CHARA_ID
        SUM_PARAM += ABL:CHARA_ID:歌唱
        SUM_PARAM += FTIMES(ABL:CHARA_ID:身体, 75)
    NEXT
ENDIF

IF HO_MASTER現在地 == ROOM_IDX && GROUPMATCH(SELECTCOM, T_N("演奏する"), T_N("踊る"))
    IF SELECTCOM == T_N("演奏する")
        FOR LOCAL, 0, MPLY_NUM
            SUM_PARAM += ABL:(MPLY:LOCAL):歌唱
            SUM_PARAM += FTIMES(ABL:CHARA_ID:器用, 75)
        NEXT
        FOR LOCAL, 0, MTAR_NUM
            SUM_PARAM += ABL:(MTAR:LOCAL):歌唱
            SUM_PARAM += FTIMES(ABL:CHARA_ID:器用, 75)
        NEXT
    ELSE
        FOR LOCAL, 0, MPLY_NUM
            SUM_PARAM += ABL:(MPLY:LOCAL):歌唱
            SUM_PARAM += FTIMES(ABL:CHARA_ID:身体, 75)
        NEXT
        FOR LOCAL, 0, MTAR_NUM
            SUM_PARAM += ABL:(MTAR:LOCAL):歌唱
            SUM_PARAM += FTIMES(ABL:CHARA_ID:身体, 75)
        NEXT
    ENDIF
    MASTERが公演に参加 = 1
ENDIF

TCVAR:CHARA_ID:おひねりスコア += RAND(SQRT(SUM_PARAM * 5), MAX(SQRT(SUM_PARAM * 20), 1)) / 2

IF TCVAR:CHARA_ID:おひねりスコア > 100
    TCVAR:CHARA_ID:おひねりスコア = 0
    SIF RAND:100 < 40
        RETURN 0
    CALL PERFORMANCE_GACHA_GIFT()
    CALL QST_CHANGE_ITEM(RESULTS, 0, 0)
    MESSAGE = %RESULTS%
    IF MASTERが公演に参加
        FOR LOCAL, 0, CHARANUM
            ;アイテム入手メッセージはCOM_AFTERでまとめて出力
            IF HO_おひねり通知:LOCAL == ""
                HO_おひねり通知:LOCAL '= @"%ANAME(MASTER)%は演奏のおひねりとして%ANAME(CHARA_ID)%から@C:{カラー_注意}@%MESSAGE%@/C@"
                BREAK
            ENDIF
        NEXT
    ELSE
        CALL HO_PRINT_LOG(@"%ANAME(公演代表者ID, 公演人数)%は演奏のおひねりとして%ANAME(CHARA_ID)%から@C:{カラー_注意}@%MESSAGE%@/C@")
    ENDIF
ENDIF


code:
;-------------------------------------------------
;キャラクターの行動定義
;-------------------------------------------------
@HO_行動定義_食事(CHARA_ID)
#DIM CHARA_ID
#DIM  DYNAMIC CHARA_IDX
#DIM  DYNAMIC ROOM_IDX
#DIM  DYNAMIC 移動先ROOM_IDX
#DIMS DYNAMIC _LIST_移動先候補
#DIMS DYNAMIC 現在の行動
;IDXを取得
CALL HO_GET_CHARAIDX(CHARA_ID)
CHARA_IDX = RESULT
;キャラが現在いる部屋を取得
CALL HO_GET_CHARADATA(CHARA_IDX, "ROOM_IDX")
ROOM_IDX = RESULT
CALL HO_GET_CHARADATA(CHARA_IDX, "ACTION")
現在の行動 = %RESULTS%

;食事可能なエリアを探す
IF CFLAG:CHARA_ID:ゲストモブ
    CALL HO_FIND_ROOM_BY_TAG("宿場")
ELSE
    CALL HO_FIND_ROOM_BY_TAG("食堂")
ENDIF

IF RESULT != -1
    移動先ROOM_IDX = RESULT
ELSE
    RETURN -1
ENDIF
CALL HO_GET_ROUTE(ROOM_IDX, 移動先ROOM_IDX)
_LIST_移動先候補 = %RESULTS%
IF RESULT != 0
    CALL HO_STOP_USE_MODULE(CHARA_ID)
    CALL HO_SET_MOVELIST(CHARA_ID, _LIST_移動先候補)
ELSEIF RESULT == -1
    RETURN -1
ELSE
    CALL HO_STOP_USE_MODULE(CHARA_ID)
    CALL HO_TRY_USE_MODULE(CHARA_ID, "食事")
    IF RESULT == 1
        CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "食事中")
        TCVAR:CHARA_ID:空腹度 = 0
        TCVAR:CHARA_ID:疲労度 += 300 ;食休みさせる
        BASE:(CHARA_ID):体力 = LIMIT(BASE:(CHARA_ID):体力 + 400, BASE:(CHARA_ID):体力, MAXBASE:(CHARA_ID):体力)
        BASE:(CHARA_ID):気力 = LIMIT(BASE:(CHARA_ID):気力 + 300, BASE:(CHARA_ID):気力, MAXBASE:(CHARA_ID):気力)
        TCVAR:CHARA_ID:行動待機時間 = RAND(9, 12) * HO_単位時間
        ;口の中を綺麗に
        CUM_CUR_AMOUNT:CHARA_ID:射精部位_口 = 0
        RETURN 1
    ENDIF
    ;食事可能な設備がない場合
    IF CFLAG:CHARA_ID:ゲストモブ && TCVAR:CHARA_ID:宿泊先設備IDX
        CALL HO_TRY_USE_MODULE(CHARA_ID,,,TCVAR:CHARA_ID:宿泊先設備IDX)
    ELSE
        CALL HO_TRY_USE_MODULE(CHARA_ID, "休憩")
    ENDIF
    IF RESULT == 1
        CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "食事中")
        TCVAR:CHARA_ID:空腹度 = 0
        TCVAR:CHARA_ID:疲労度 += 300 ;食休みさせる
        BASE:(CHARA_ID):体力 = LIMIT(BASE:(CHARA_ID):体力 + 200, BASE:(CHARA_ID):体力, MAXBASE:(CHARA_ID):体力)
        BASE:(CHARA_ID):気力 = LIMIT(BASE:(CHARA_ID):気力 + 150, BASE:(CHARA_ID):気力, MAXBASE:(CHARA_ID):気力)
        TCVAR:CHARA_ID:行動待機時間 = RAND(9, 12) * HO_単位時間
        ;口の中を綺麗に
        CUM_CUR_AMOUNT:CHARA_ID:射精部位_口 = 0
        RETURN 1
    ENDIF
    RETURN -1
ENDIF


code:
;-------------------------------------------------
;キャラクターの行動定義
;-------------------------------------------------
@HO_行動定義_飲酒(CHARA_ID)
#DIM CHARA_ID
#DIM  DYNAMIC CHARA_IDX
#DIM  DYNAMIC ROOM_IDX
#DIM  DYNAMIC 移動先ROOM_IDX
#DIMS DYNAMIC _LIST_移動先候補
#DIMS DYNAMIC 現在の行動

;IDXを取得
CALL HO_GET_CHARAIDX(CHARA_ID)
CHARA_IDX = RESULT
;キャラが現在いる部屋を取得
CALL HO_GET_CHARADATA(CHARA_IDX, "ROOM_IDX")
ROOM_IDX = RESULT
CALL HO_GET_CHARADATA(CHARA_IDX, "ACTION")
現在の行動 = %RESULTS%

IF !CFLAG:CHARA_ID:ゲストモブ
    CALL HO_FIND_ROOM_BY_TAG("食堂")
ELSE
    CALL HO_FIND_ROOM_BY_MODULE_USAGE("飲酒", ROOM_IDX, "NEAREST")
ENDIF
IF RESULT != -1
    移動先ROOM_IDX = RESULT
ELSE
    RETURN -1
ENDIF
CALL HO_GET_ROUTE(ROOM_IDX, 移動先ROOM_IDX)
_LIST_移動先候補 = %RESULTS%
IF RESULT != 0
    CALL HO_STOP_USE_MODULE(CHARA_ID)
    CALL HO_SET_MOVELIST(CHARA_ID, _LIST_移動先候補)
ELSEIF RESULT == -1
    RETURN -1
ELSE
    CALL HO_STOP_USE_MODULE(CHARA_ID)
    CALL HO_TRY_USE_MODULE(CHARA_ID, "飲酒")
    IF RESULT == 1
        CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "飲酒中")
        TCVAR:CHARA_ID:疲労度 += 100
        TCVAR:CHARA_ID:行動待機時間 = RAND(9, 16) * HO_単位時間
        ;口の中を綺麗に
        CUM_CUR_AMOUNT:CHARA_ID:射精部位_口 = 0
        ;モブからは代金を徴収
        IF CFLAG:CHARA_ID:ゲストモブ
            MONEY += 2000
            CALL HO_PRINT_LOG(@"%ANAME(CHARA_ID)%から酒代として@C:{カラー_緑}@2,000@/C@ディナリを得た")
        ENDIF
        RETURN 1
    ELSE
        RETURN -1
    ENDIF
ENDIF


code:
;-------------------------------------------------
; エリア・設備クラフトメニュー画面
;-------------------------------------------------
@HO_EDIT_CRAFT_MENU()
#DIM CATEGORY
#DIM CONST WINDOW_ID = 0
#DIM DYNAMIC LINE_NUM

;初期処理
HO_EDIT_CRAFT_PAGE_LEFT = 0
HO_EDIT_CRAFT_SELECT_ITEM_ID = -1
HO_EDIT_CRAFT_CATEGORY = 0
HO_EDIT_CRAFT_FILTER = 0

LINE_NUM = LINECOUNT

CALL HO_EDIT_CRAFT_CREATE_TABLE
WHILE 1
    LINE_NUM = LINECOUNT
    REDRAW 0
    ;CALL HO_EDIT_CRAFT_UPDATE_TABLE
    CALL WndMgr_DestroyWindow(-1)
    CALL HO_EDIT_CRAFT_MENU_WINDOW_PARENT()
    CALL WndMgr_DisplayAll()
    REDRAW 1
    CALL HO_EDIT_CRAFT_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_EDIT_CRAFT_MENU_WINDOW_PARENT()
; #region
#DIM CONST WINDOW_ID = 0
#DIM CONST WND_WIDTH  = 170
#DIM CONST WND_HEIGHT = 44
#DIM DYNAMIC L_CNT
#DIM DYNAMIC BTN_ID

#DIMS DYNAMIC _LIST_MEMBER
#DIM DYNAMIC MEMBER_NUM
#DIM DYNAMIC CHARA_ID
#DIM DYNAMIC F_COL, 10

#DIMS DYNAMIC ITEM_NAME
#DIM DYNAMIC ITEM_NUM
#DIM DYNAMIC MATERIAL_NEEDS, ITEM_LENGTH
#DIM DYNAMIC WPN_MATERIAL_NEEDS, WPN_材質種類数, ITEM_LENGTH
#DIMS DYNAMIC WEAPON_NAME
#DIM DYNAMIC 材質種類
#DIM DYNAMIC アイテム種類
#DIM DYNAMIC IS_CRAFTABLE

BTN_ID = HO_アイテムクラフトボタンID

CALL WndMgr_CheckExistWindow()
FINDELEMENT RESULT, WINDOW_ID, 1
IF RESULT == -1
    CALL WndMgr_CreateWindow(WINDOW_ID, 0, 1, WND_WIDTH, WND_HEIGHT, 2)
ELSE
    CALL WndMgr_ResetWindow(WINDOW_ID)
ENDIF

;CATEGORYタブの文字色
VARSET F_COL, カラー_白
F_COL:HO_ITEM_MENU_CATEGORY = カラー_選択中
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@S:1@@C:{カラー_注釈}@◇ Creation of area and equipment ◇@/C@@/S@")
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))

CALL HO_DRAW_EDIT_CRAFT_WINDOW_LEFT()
CALL HO_DRAW_EDIT_CRAFT_WINDOW_RIGHT()

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

RETURN
; #endregion

;-------------------------------------------------
; 子ウィンドウ 左
;-------------------------------------------------
@HO_DRAW_EDIT_CRAFT_WINDOW_LEFT(MODULE_ID)
; #region
#DIM MODULE_ID
#DIM CONST WINDOW_ID = 1
#DIM WND_WIDTH  = 72
#DIM WND_HEIGHT = 37
#DIM DYNAMIC L_CNT
#DIM DYNAMIC F_COL, 10

;CATEGORYタブの文字色
VARSET F_COL, カラー_白
F_COL:HO_EDIT_CRAFT_CATEGORY = カラー_選択中

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

;カテゴリー選択
;-------------------------------------------------
LOCALS '= @"@C:{F_COL:0}@@B:0@[Area]@/B@@/C@"
LOCALS += @"@C:{F_COL:1}@@B:1@　[Equipment]@/B@@/C@"
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, LOCALS)
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))
;-------------------------------------------------

;フィルター
;-------------------------------------------------
IF HO_EDIT_CRAFT_CATEGORY
    ;設備用フィルタ
    LOCALS '= @"@C:{HO_EDIT_CRAFT_FILTER == HO_EDIT_CRAFT_FILTER_ALL ? カラー_選択中 # カラー_選択不可}@@B:[FILTER:{HO_EDIT_CRAFT_FILTER_ALL}]@[ALL]@/B@@/C@"
    LOCALS += @"@C:{HO_EDIT_CRAFT_FILTER == HO_EDIT_CRAFT_FILTER_家具 ? カラー_選択中 # カラー_選択不可}@@B:[FILTER:{HO_EDIT_CRAFT_FILTER_家具}]@ [Furniture]@/B@@/C@"
    LOCALS += @"@C:{HO_EDIT_CRAFT_FILTER == HO_EDIT_CRAFT_FILTER_自然 ? カラー_選択中 # カラー_選択不可}@@B:[FILTER:{HO_EDIT_CRAFT_FILTER_自然}]@ [Nature]@/B@@/C@"
    LOCALS += @"@C:{HO_EDIT_CRAFT_FILTER == HO_EDIT_CRAFT_FILTER_採集 ? カラー_選択中 # カラー_選択不可}@@B:[FILTER:{HO_EDIT_CRAFT_FILTER_採集}]@ [Collection]@/B@@/C@"
    LOCALS += @"@C:{HO_EDIT_CRAFT_FILTER == HO_EDIT_CRAFT_FILTER_採掘 ? カラー_選択中 # カラー_選択不可}@@B:[FILTER:{HO_EDIT_CRAFT_FILTER_採掘}]@ [Mining]@/B@@/C@"
    LOCALS += @"@C:{HO_EDIT_CRAFT_FILTER == HO_EDIT_CRAFT_FILTER_エロ ? カラー_選択中 # カラー_選択不可}@@B:[FILTER:{HO_EDIT_CRAFT_FILTER_エロ}]@ [Perv]@/B@@/C@"
    LOCALS += @"@C:{HO_EDIT_CRAFT_FILTER == HO_EDIT_CRAFT_FILTER_インテリア ? カラー_選択中 # カラー_選択不可}@@B:[FILTER:{HO_EDIT_CRAFT_FILTER_インテリア}]@ [Interior]@/B@@/C@"
    LOCALS += @"@C:{GETBIT(HO_EDIT_CRAFT_FILTER_BIT, HO_EDIT_CRAFT_FILTER_所持) == 1 ? カラー_選択中 # カラー_選択不可}@@B:[FILTER:{HO_EDIT_CRAFT_FILTER_所持}]@ [Own]@/B@@/C@"
    LOCALS += @"@C:{GETBIT(HO_EDIT_CRAFT_FILTER_BIT, HO_EDIT_CRAFT_FILTER_未所持) == 1 ? カラー_選択中 # カラー_選択不可}@@B:[FILTER:{HO_EDIT_CRAFT_FILTER_未所持}]@ [Unowned]@/B@@/C@"
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, LOCALS)
ELSE
    ;エリア用フィルタ
    LOCALS '= @"@C:{GETBIT(HO_EDIT_CRAFT_FILTER_BIT, HO_EDIT_CRAFT_FILTER_所持) == 1 ? カラー_選択中 # カラー_選択不可}@@B:[FILTER:{HO_EDIT_CRAFT_FILTER_所持}]@[Own]@/B@@/C@"
    LOCALS += @"@C:{GETBIT(HO_EDIT_CRAFT_FILTER_BIT, HO_EDIT_CRAFT_FILTER_未所持) == 1 ? カラー_選択中 # カラー_選択不可}@@B:[FILTER:{HO_EDIT_CRAFT_FILTER_未所持}]@ [Unowned]@/B@@/C@"
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, LOCALS)
ENDIF
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))
;-------------------------------------------------

CALL HO_DRAW_EDIT_CRAFT_WINDOW_PRINT_DETAIL(WINDOW_ID)

;-------------------------------------------------
;アイテム明細リスト
;-------------------------------------------------
; #region
@HO_DRAW_EDIT_CRAFT_WINDOW_PRINT_DETAIL(WINDOW_ID)
#DIM WINDOW_ID
#DIM CONST HEADER_NUM = 4 ;ヘッダー行数
#DIM CONST MAX_ROW = 30
#DIM CONST BTN_ID = 1000000

#DIM  DYNAMIC WND_WIDTH
#DIMS DYNAMIC FILTER_STR
#DIMS DYNAMIC DETAIL_LIST, ITEM_LENGTH
#DIM  DYNAMIC L_CNT
#DIM  DYNAMIC PAGE_NUM
#DIMS DYNAMIC STR_FOOTER
#DIM  DYNAMIC DETAIL_LINECOUNT
;アイテム関連
#DIM  DYNAMIC ITEM_ID
#DIMS DYNAMIC ITEM_NAME
#DIM  DYNAMIC ITEM_NUM
#DIMS DYNAMIC STR_ITEM_NUM
#DIM  DYNAMIC MATERIAL_NEEDS, ITEM_LENGTH
#DIM  DYNAMIC ITEM_DID, HO_MAX_MODULETYPE
#DIM  DYNAMIC ITEM_TYPE
#DIMS DYNAMIC ELEMENT_TAG
#DIM  DYNAMIC IS_MATCHED

;フィルター文字列の作成
IF !HO_EDIT_CRAFT_CATEGORY
    FILTER_STR '= "ITEM_TYPE = 0"
ELSE
    FILTER_STR '= "ITEM_TYPE = 1"
ENDIF
IF GETBIT(HO_EDIT_CRAFT_FILTER_BIT, HO_EDIT_CRAFT_FILTER_所持)
    FILTER_STR += "AND ITEMNUM > 0"
ELSEIF GETBIT(HO_EDIT_CRAFT_FILTER_BIT, HO_EDIT_CRAFT_FILTER_未所持)
    FILTER_STR += "AND ITEMNUM = 0"
ENDIF

;明細リスト作成
;-------------------------------------------------
DETAIL_LINECOUNT = 0
L_CNT = 0
DT_SELECT "EDIT_CRAFT_ITEM",FILTER_STR,, ITEM_DID
FOR LOCAL, 0, RESULT
    IF RESULT
        ITEM_ID = DT_CELL_GET("EDIT_CRAFT_ITEM", ITEM_DID:LOCAL, "ITEM_ID", 1)
        ITEM_TYPE = DT_CELL_GET("EDIT_CRAFT_ITEM", ITEM_DID:LOCAL, "ITEM_TYPE", 1)
        IF ITEM_TYPE == 1
            ELEMENT_TAG = %DT_CELL_GETS("EDIT_CRAFT_ITEM", ITEM_DID:LOCAL, "ELEMENT_TAG", 1)%
            IS_MATCHED = 0
            SELECTCASE HO_EDIT_CRAFT_FILTER
                CASE HO_EDIT_CRAFT_FILTER_ALL
                    IS_MATCHED ++
                CASE HO_EDIT_CRAFT_FILTER_家具
                    SIF LIST_INDEXOF(ELEMENT_TAG, "家具") != -1
                        IS_MATCHED ++
                CASE HO_EDIT_CRAFT_FILTER_自然
                    SIF LIST_INDEXOF(ELEMENT_TAG, "自然") != -1
                        IS_MATCHED ++
                CASE HO_EDIT_CRAFT_FILTER_採集
                    SIF LIST_INDEXOF(ELEMENT_TAG, "採集") != -1
                        IS_MATCHED ++
                CASE HO_EDIT_CRAFT_FILTER_採掘
                    SIF LIST_INDEXOF(ELEMENT_TAG, "採掘") != -1
                        IS_MATCHED ++
                CASE HO_EDIT_CRAFT_FILTER_エロ
                    SIF LIST_INDEXOF(ELEMENT_TAG, "エロ") != -1
                        IS_MATCHED ++
                CASE HO_EDIT_CRAFT_FILTER_インテリア
                    SIF LIST_INDEXOF(ELEMENT_TAG, "インテリア") != -1
                        IS_MATCHED ++
            ENDSELECT
        ELSE
            ;エリアはフィルタするほどアイテムが無いので無条件でマッチ
            IS_MATCHED ++
        ENDIF
        SIF !IS_MATCHED
            CONTINUE
        IF ITEM_TYPE == 1
            CALL HO_GET_MODULE_DATA(ITEM_ID, "MODULE_NAME")
            ITEM_NAME = %STRLENSU(RESULTS) > 6 ? TOHALF(RESULTS) # RESULTS%
            ITEM_NAME = %TAG_PRINT_SHAPE(ITEM_NAME, 15, 1, 0)%
            ITEM_NUM = HO_MODULE_STOCK:ITEM_ID
            STR_ITEM_NUM = %TAG_PRINT_SHAPE(TOSTR(ITEM_NUM), 8, 1, 0)%
        ELSE
            CALL HO_GET_ROOM_DATA(ITEM_ID, "ROOM_NAME")
            ITEM_NAME = %STRLENSU(RESULTS) > 6 ? TOHALF(RESULTS) # RESULTS%
            ITEM_NAME = %TAG_PRINT_SHAPE(ITEM_NAME, 15, 1, 0)%
            ITEM_NUM = HO_ROOM_STOCK:ITEM_ID
            STR_ITEM_NUM = %TAG_PRINT_SHAPE(TOSTR(ITEM_NUM), 8, 1, 0)%
        ENDIF
        CALL HO_EDIT_CRAFT_IS_CRAFTABLE(ITEM_ID, ITEM_TYPE)
        IF RESULT
            DETAIL_LIST:DETAIL_LINECOUNT '= @"@B:[ITEM_ID:{ITEM_ID}]@@C:{ITEM_ID == HO_EDIT_CRAFT_SELECT_ITEM_ID ? カラー_選択中 # カラー_白}@[%ITEM_NAME%] × %STR_ITEM_NUM%@/C@@/B@"
        ELSE
            DETAIL_LIST:DETAIL_LINECOUNT '= @"@B:[ITEM_ID:{ITEM_ID}]@@C:{ITEM_ID == HO_EDIT_CRAFT_SELECT_ITEM_ID ? カラー_選択中 # カラー_選択不可}@[%ITEM_NAME%] × %STR_ITEM_NUM%@/C@@/B@"
        ENDIF
        DETAIL_LIST:DETAIL_LINECOUNT = %TAG_PRINT_SHAPE(DETAIL_LIST:DETAIL_LINECOUNT, 28, 1, 0)%
        DETAIL_LINECOUNT ++
    ENDIF
NEXT
PAGE_NUM = DETAIL_LINECOUNT / MAX_ROW

;明細リスト出力
;-------------------------------------------------
L_CNT = 0
FOR LOCAL, MAX_ROW * HO_EDIT_CRAFT_PAGE_LEFT, MAX_ROW * (HO_EDIT_CRAFT_PAGE_LEFT + 1)
    IF  L_CNT / MAX_ROW <= 0
        CALL WndMgr_TextSet(WINDOW_ID, L_CNT + HEADER_NUM, DETAIL_LIST:LOCAL)
        L_CNT++
    ELSE
        CALL WndMgr_TextAdd(WINDOW_ID, (L_CNT % MAX_ROW) + HEADER_NUM, DETAIL_LIST:LOCAL)
        L_CNT ++
    ENDIF
    L_CNT ++
NEXT

;フッター
;-------------------------------------------------
CALL WndMgr_GetRectangle(WINDOW_ID)
WND_WIDTH = RESULT:2

IF PAGE_NUM > 0
    STR_FOOTER += HO_EDIT_CRAFT_PAGE_LEFT > 0 ? @"@B:9000@<<@/B@ " # "   "
    STR_FOOTER += @"%TOSTR(HO_EDIT_CRAFT_PAGE_LEFT + 1, "..")% "
    STR_FOOTER += HO_EDIT_CRAFT_PAGE_LEFT != PAGE_NUM ? @"@B:9001@>>@/B@" # "  "
    CALLF TAG_PRINT_SHAPE(STR_FOOTER, WND_WIDTH - 8, 1, 2)
    CALL WndMgr_TextSet(WINDOW_ID, MAX_ROW + HEADER_NUM, @"@C:{カラー_注釈}@%RESULTS%@/C@")
ENDIF
; #endregion

;-------------------------------------------------
; 子ウィンドウ 右
;-------------------------------------------------
; #region
@HO_DRAW_EDIT_CRAFT_WINDOW_RIGHT()
#DIM CONST WINDOW_ID = 4
#DIM CONST WND_WIDTH  = 94
#DIM CONST WND_HEIGHT = 37
#DIM CONST ヘッダー行数 = 2
#DIM CONST BTN_ID = 2000
#DIM DYNAMIC L_CNT

#DIMS DYNAMIC ITEM_NAME
#DIM  DYNAMIC ITEM_ID
#DIM  DYNAMIC ITEM_TYPE
#DIM  DYNAMIC PRICE
#DIMS DYNAMIC MATERIAL_NAME
#DIM  DYNAMIC MATERIAL_NEEDS, ITEM_LENGTH
#DIM  DYNAMIC STOCKNUM
#DIM  DYNAMIC F_COL
#DIM  DYNAMIC ITEM_CAN_USE = 0
#DIM  DYNAMIC IS_CRAFTABLE
#DIMS DYNAMIC LIST_ROOMTAG
#DIM  DYNAMIC CAPACITY

;ウィンドウ作成
CALL WndMgr_CreateWindow(WINDOW_ID, 74, 5, WND_WIDTH, WND_HEIGHT, 2)
CALL WndMgr_Attribute(WINDOW_ID, "BorderColor", カラー_選択不可)
SIF HO_EDIT_CRAFT_SELECT_ITEM_ID == -1
    RETURN

ITEM_ID = HO_EDIT_CRAFT_SELECT_ITEM_ID
ITEM_TYPE = HO_EDIT_CRAFT_CATEGORY

;ヘッダー
IF ITEM_TYPE
    CALL HO_GET_MODULE_DATA(ITEM_ID, "MODULE_NAME")
ELSE
    CALL HO_GET_ROOM_DATA(ITEM_ID, "ROOM_NAME")
ENDIF
ITEM_NAME = %RESULTS%
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@S:1@@C:{カラー_注釈}@◇　%ITEM_NAME%　◇@/C@@/S@")
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))

;概要欄
VARSET RESULTS
TRYCALLFORM HO_%ITEM_TYPE == 0 ? "ROOM" # "MODULE"%_DESC_{ITEM_ID}
FOR LOCAL, 0, 10
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"　%RESULTS:LOCAL%")
NEXT

IF ITEM_TYPE
    ;設備の場合配置可能なエリア情報を表示
    L_CNT++
    ;設置可能なエリアタグを取得
    CALL HO_GET_MODULE_DATA(ITEM_ID, "制限")
    LIST_ROOMTAG = %RESULTS%
    CALL HO_GET_MODULE_DATA(ITEM_ID, "人数")
    CAPACITY = RESULT
    LOCALS '= ""
    FOR LOCAL, 0, LIST_COUNT(LIST_ROOMTAG)
        LOCALS += @"<%LIST_GET(LIST_ROOMTAG, LOCAL)%> "
    NEXT
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@S:1@@C:{カラー_注釈}@◇　情報　◇@/S@@/C@")
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT, @"@S:1@@C:{カラー_注釈}@・設置可能なエリアタグ:　@/S@@/C@")
    CALL WndMgr_TextAdd(WINDOW_ID, L_CNT++, @"@C:{カラー_白}@%LOCALS%@/C@")
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT, @"@S:1@@C:{カラー_注釈}@・定員:　@/S@@/C@")
    CALL WndMgr_TextAdd(WINDOW_ID, L_CNT++, @"@C:{カラー_白}@{CAPACITY}名@/C@")
    L_CNT++
ELSE
    ;設備の場合配置可能なエリア情報を表示
    L_CNT++
    ;設置可能なエリアタグを取得
    CALL HO_GET_ROOM_DATA(ITEM_ID, "ROOM_TAG")
    LIST_ROOMTAG = %RESULTS%
    LOCALS '= ""
    FOR LOCAL, 0, LIST_COUNT(LIST_ROOMTAG)
        LOCALS += @"<%LIST_GET(LIST_ROOMTAG, LOCAL)%> "
    NEXT
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@S:1@@C:{カラー_注釈}@◇　エリアタグ　◇@/S@@/C@")
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_白}@%LOCALS%@/C@")
    L_CNT++
ENDIF

;生産情報
L_CNT++
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@S:1@@C:{カラー_注釈}@◇　生産情報　◇@/S@@/C@")
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@S:1@@C:{カラー_注釈}@・要求リソース@/S@@/C@")
L_CNT ++

TRYCCALLFORM HO_%ITEM_TYPE == 0 ? "ROOM" # "MODULE"%_CRAFT_RESOURCE_{ITEM_ID}(MATERIAL_NEEDS)
    PRICE = RESULT
    LOCALS = %TAG_PRINT_SHAPE(@"　　@C:{PRICE <= MONEY ? カラー_白 # カラー_オレンジ}@%TOSTR(PRICE, "#,##0")% ディナリ@/C@", 24, 1, 0)%
    LOCALS += @"@C:{カラー_選択不可}@　(所持:%TOSTR(MONEY, "#,##0")% ディナリ)@/C@"
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, LOCALS)
    L_CNT ++
    FOR LOCAL, 0, ITEM_LENGTH
        IF MATERIAL_NEEDS:LOCAL > 0
            IF LOCAL == ITEM_ディナリ
                STOCKNUM = MONEY
            ELSEIF LOCAL == ITEM_淫堕点
                STOCKNUM = QST_LEWD_POINT
            ELSE
                STOCKNUM = HO_ITEM_STOCK:(LOCAL:0)
            ENDIF
            CALL GET_ITEM_NAME(LOCAL)
            MATERIAL_NAME = %RESULTS%
            LOCALS = %TAG_PRINT_SHAPE(@"　　@C:{MATERIAL_NEEDS:LOCAL <= STOCKNUM ? カラー_白 # カラー_オレンジ}@%MATERIAL_NAME%@/C@", 24, 1, 0)%
            LOCALS += @"×{MATERIAL_NEEDS:LOCAL, 4, RIGHT}"
            LOCALS += @"@C:{カラー_選択不可}@　(所持:{STOCKNUM})@/C@"
            CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, LOCALS)
            L_CNT ++
        ENDIF
    NEXT
CATCH
    RETURN
ENDCATCH

CALL HO_EDIT_CRAFT_IS_CRAFTABLE(ITEM_ID, ITEM_TYPE)
IS_CRAFTABLE = RESULT

;フッター
L_CNT = WND_HEIGHT - 4
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))
IF IS_CRAFTABLE
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@B:[CRAFT:{ITEM_ID}]@@C:{カラー_白}@[クラフトする]@/C@@/B@")
ELSE
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@[リソースが不足しています]@/C@")
ENDIF

;-------------------------------------------------
; リソースチェック
;-------------------------------------------------
@HO_EDIT_CRAFT_IS_CRAFTABLE(ITEM_ID, ITEM_TYPE)
; #region
#DIM ITEM_ID
#DIM ITEM_TYPE
#DIM  DYNAMIC MATERIAL_NEEDS, ITEM_LENGTH
#DIM DYNAMIC ERR_FLG
#DIM DYNAMIC PRICE
#DIM DYNAMIC STOCKNUM

;エリアの場合
IF ITEM_TYPE == 0
    TRYCCALLFORM HO_ROOM_IS_CRAFTABLE_{ITEM_ID}
        IF RESULT
            TRYCCALLFORM HO_ROOM_CRAFT_RESOURCE_{ITEM_ID}(MATERIAL_NEEDS)
                PRICE = RESULT
                SIF PRICE > MONEY
                    ERR_FLG ++
                FOR LOCAL, 0, ITEM_LENGTH
                    IF LOCAL == ITEM_ディナリ
                        STOCKNUM = MONEY
                    ELSEIF LOCAL == ITEM_淫堕点
                        STOCKNUM = QST_LEWD_POINT
                    ELSE
                        STOCKNUM = HO_ITEM_STOCK:(LOCAL:0)
                    ENDIF
                    IF MATERIAL_NEEDS:LOCAL > 0 && MATERIAL_NEEDS:LOCAL > STOCKNUM
                        ERR_FLG ++
                        BREAK
                    ENDIF
                NEXT
            CATCH
                RETURN 0
            ENDCATCH
        ELSE
            RETURN 0
        ENDIF
    CATCH
        RETURN 0
    ENDCATCH
    ;設備の場合
ELSE
    TRYCCALLFORM HO_MODULE_IS_CRAFTABLE_{ITEM_ID}
        IF RESULT
            TRYCCALLFORM HO_MODULE_CRAFT_RESOURCE_{ITEM_ID}(MATERIAL_NEEDS)
                PRICE = RESULT
                SIF PRICE > MONEY
                    ERR_FLG ++
                FOR LOCAL, 0, ITEM_LENGTH
                    IF LOCAL == ITEM_ディナリ
                        STOCKNUM = MONEY
                    ELSEIF LOCAL == ITEM_淫堕点
                        STOCKNUM = QST_LEWD_POINT
                    ELSE
                        STOCKNUM = HO_ITEM_STOCK:(LOCAL:0)
                    ENDIF
                    IF MATERIAL_NEEDS:LOCAL > 0 && MATERIAL_NEEDS:LOCAL > STOCKNUM
                        ERR_FLG ++
                        BREAK
                    ENDIF
                NEXT
            CATCH
                RETURN 0
            ENDCATCH
        ELSE
            RETURN 0
        ENDIF
    CATCH
        RETURN 0
    ENDCATCH
ENDIF

SIF ERR_FLG
    RETURN 0

RETURN 1

; #endregion

;-------------------------------------------------
; 入力受付
;-------------------------------------------------
@HO_EDIT_CRAFT_WINDOW_INPUT()
; #region
#DIM  DYNAMIC ITEM_ID
#DIM  DYNAMIC ITEM_TYPE
#DIM  DYNAMIC MATERIAL_NEEDS, ITEM_LENGTH
#DIM  DYNAMIC FILTER
#DIMS DYNAMIC ITEM_NAME
#DIM  DYNAMIC PRICE

;入力受付
REDRAW 1
ONEINPUTS
REDRAW 0
CLEARLINE 1
PRINTL
IF ISNUMERIC(RESULTS)
    RESULT = TOINT(RESULTS)
    ;キャンセルボタン
    IF RESULT == 9999999
        RETURN -1
    ELSEIF INRANGE(RESULT, 0, 6)
        HO_EDIT_CRAFT_PAGE_LEFT = 0
        HO_EDIT_CRAFT_SELECT_ITEM_ID = -1
        HO_EDIT_CRAFT_CATEGORY = RESULT
        ;アイテム使用
    ELSEIF INRANGE(RESULT, 2000, 2999)
        ITEM_ID = RESULT - 2000
        VARSET RESULTS
        TRYCCALLFORM GET_ITEM_INFO_AT_USING_{ITEM_ID}
            CALL ITEM_USING_COMMON(RESULTS)
            IF HO_ITEM_STOCK:ITEM_ID == 0
                HO_EDIT_CRAFT_SELECT_ITEM_ID = -1
            ENDIF
        CATCH
            DEBUGPRINTFORML (警告@ITEM_MENU)ITEM_ID:{ITEM_ID}のアイテム使用時情報が未定義です
        ENDCATCH
        ;衣装部位タブ切り替え
    ELSEIF  HO_EDIT_CRAFT_CATEGORY == 2 && INRANGE(RESULT, 1000, 1999)
        ; HO_ITEM_CRAFT_SELECT_CLOTH_PARTS = RESULT - 1000
        ; HO_EDIT_CRAFT_PAGE_LEFT = 0
        RETURN
        ;ページ処理
    ELSEIF INRANGE(RESULT, 9000, 9001)
        IF RESULT == 9000
            HO_EDIT_CRAFT_PAGE_LEFT --
        ELSE
            HO_EDIT_CRAFT_PAGE_LEFT ++
        ENDIF
    ELSEIF INRANGE(RESULT, 1000000, 2999999)
        ;クラフト可能なアイテム ITEM_ID + 1000000, クラフト不可能なアイテム ITEM_ID + 2000000
        ; HO_ITEM_CRAFT_NUM_PRODUCTION = 1
        ; HO_CRAFT_RECIPE_ID = 0
        ; HO_EDIT_CRAFT_SELECT_ITEM_ID = (RESULT - 1000000)
        RETURN
    ENDIF
ELSE
    IF DIC_CONTAINSKEY(RESULTS, "ITEM_ID")
        HO_EDIT_CRAFT_SELECT_ITEM_ID = TOINT(DIC_GET(RESULTS, "ITEM_ID"))
    ELSEIF DIC_CONTAINSKEY(RESULTS, "FILTER")
        FILTER = TOINT(DIC_GET(RESULTS, "FILTER"))
        IF FILTER == HO_EDIT_CRAFT_FILTER_所持
            INVERTBIT HO_EDIT_CRAFT_FILTER_BIT, FILTER
            IF GETBIT(HO_EDIT_CRAFT_FILTER_BIT, HO_EDIT_CRAFT_FILTER_所持) && GETBIT(HO_EDIT_CRAFT_FILTER_BIT, HO_EDIT_CRAFT_FILTER_未所持)
                CLEARBIT HO_EDIT_CRAFT_FILTER_BIT, HO_EDIT_CRAFT_FILTER_未所持
            ENDIF
        ELSEIF FILTER == HO_EDIT_CRAFT_FILTER_未所持
            INVERTBIT HO_EDIT_CRAFT_FILTER_BIT, FILTER
            IF GETBIT(HO_EDIT_CRAFT_FILTER_BIT, HO_EDIT_CRAFT_FILTER_未所持) && GETBIT(HO_EDIT_CRAFT_FILTER_BIT, HO_EDIT_CRAFT_FILTER_所持)
                CLEARBIT HO_EDIT_CRAFT_FILTER_BIT, HO_EDIT_CRAFT_FILTER_所持
            ENDIF
        ELSE
            HO_EDIT_CRAFT_FILTER = FILTER
        ENDIF
        HO_EDIT_CRAFT_PAGE_LEFT = 0
    ELSEIF DIC_CONTAINSKEY(RESULTS, "CRAFT")
        ITEM_ID = HO_EDIT_CRAFT_SELECT_ITEM_ID
        ITEM_TYPE = HO_EDIT_CRAFT_CATEGORY
        TRYCCALLFORM HO_%ITEM_TYPE == 0 ? "ROOM" # "MODULE"%_CRAFT_RESOURCE_{ITEM_ID}(MATERIAL_NEEDS)
            PRICE = RESULT
            FOR LOCAL, 0, ITEM_LENGTH
                IF MATERIAL_NEEDS:LOCAL > 0
                    IF MATERIAL_NEEDS:LOCAL > 0
                        CALL CHANGE_ITEM_STOCK(LOCAL, (MATERIAL_NEEDS:LOCAL) * -1)
                    ENDIF
                ENDIF
            NEXT
            MONEY -= PRICE
            IF ITEM_TYPE
                HO_MODULE_STOCK:ITEM_ID ++
                CALL HO_GET_MODULE_DATA(ITEM_ID, "MODULE_NAME")
                ITEM_NAME = %RESULTS%
            ELSE
                HO_ROOM_STOCK:ITEM_ID ++
                CALL HO_GET_ROOM_DATA(ITEM_ID, "ROOM_NAME")
                ITEM_NAME = %RESULTS%
            ENDIF
            CALL FL_PLAYSE("Craft_5.mp3")
            CALL HO_EDIT_CRAFT_UPDATE_TABLE(ITEM_ID, ITEM_TYPE)
            CALL COLOR_PRINTW(@"%ITEM_NAME%を作成しました", カラー_注意)
        CATCH
            RETURN
        ENDCATCH
    ENDIF
ENDIF
; #endregion

;-------------------------------------------------
; エリア・設備メニューのソート用テーブル
;-------------------------------------------------
; #region
@HO_EDIT_CRAFT_CREATE_TABLE
#DIM  DYNAMIC ITEM_ID
#DIM  DYNAMIC ITEM_TYPE
#DIM  DYNAMIC ITEMNUM
#DIMS DYNAMIC ROOM_TAG
#DIMS DYNAMIC USAGE_TAG
#DIMS DYNAMIC LIMITATION_TAG
#DIMS DYNAMIC ELEMENT_TAG

IF DT_EXIST("EDIT_CRAFT_ITEM")
    DT_RELEASE "EDIT_CRAFT_ITEM"
ENDIF
CALL CREATE_HO_EDIT_CRAFT_ITEM_TABLE()
;エリア情報の取得
FOR ITEM_ID, 1, HO_MAX_ROOMTYPE
    TRYCCALLFORM HO_ROOM_IS_CRAFTABLE_{ITEM_ID}
        IF RESULT
            ITEM_TYPE = 0
            ITEMNUM = HO_ROOM_STOCK:ITEM_ID
            CALL HO_GET_ROOM_DATA(ITEM_ID, "ROOM_TAG")
            ROOM_TAG = %RESULTS%
            {
                DT_ROW_ADD "EDIT_CRAFT_ITEM"
                    , "ITEM_ID", ITEM_ID
                    , "ITEM_TYPE", ITEM_TYPE
                    , "ITEMNUM", ITEMNUM
                    , "ROOM_TAG", ROOM_TAG
            }
        ENDIF
    CATCH
        CONTINUE
    ENDCATCH
NEXT
;設備情報の取得
FOR ITEM_ID, 1, HO_MAX_MODULETYPE
    TRYCCALLFORM HO_MODULE_IS_CRAFTABLE_{ITEM_ID}
        IF RESULT
            ITEM_TYPE = 1
            ITEMNUM = HO_MODULE_STOCK:ITEM_ID
            CALL HO_GET_MODULE_DATA(ITEM_ID, "用途")
            USAGE_TAG = %RESULTS%
            CALL HO_GET_MODULE_DATA(ITEM_ID, "制限")
            LIMITATION_TAG = %RESULTS%
            CALL HO_GET_MODULE_DATA(ITEM_ID, "属性")
            ELEMENT_TAG = %RESULTS%
            {
                DT_ROW_ADD "EDIT_CRAFT_ITEM"
                    , "ITEM_ID", ITEM_ID
                    , "ITEM_TYPE", ITEM_TYPE
                    , "ITEMNUM", ITEMNUM
                    , "ROOM_TAG", ROOM_TAG
                    , "USAGE_TAG", USAGE_TAG
                    , "LIMITATION_TAG", LIMITATION_TAG
                    , "ELEMENT_TAG", ELEMENT_TAG
            }
        ENDIF
    CATCH
        CONTINUE
    ENDCATCH
NEXT

@HO_EDIT_CRAFT_UPDATE_TABLE(ITEM_ID, ITEM_TYPE)
#DIM  ITEM_ID
#DIM  ITEM_TYPE
#DIM  DYNAMIC ITEMNUM
#DIM  DYNAMIC ITEM_DID, HO_MAX_MODULETYPE

IF ITEM_TYPE
    ITEMNUM = HO_MODULE_STOCK:ITEM_ID
ELSE
    ITEMNUM = HO_ROOM_STOCK:ITEM_ID
ENDIF

DT_SELECT "EDIT_CRAFT_ITEM", @"ITEM_ID = {ITEM_ID} AND ITEM_TYPE = {ITEM_TYPE}",, ITEM_DID
IF RESULT
    DT_CELL_SET "EDIT_CRAFT_ITEM", ITEM_DID:0, "ITEMNUM", ITEMNUM, 1
ENDIF

; #endregion


code:
;-------------------------------------------------
; 居住区編集モード
;-------------------------------------------------
@HOUSING_EDIT_MODE_MAIN
#DIMS DYNAMIC ROOM_NAME
#DIM PRINTED_LINE

;キャンセル時に復元できるよう編集前の在庫を退避する
ARRAYCOPY "HO_ROOM_STOCK", "HO_ROOM_STOCK_BUFFER"
ARRAYCOPY "HO_MODULE_STOCK", "HO_MODULE_STOCK_BUFFER"

IF !FLAG:ハウジングモード
    HO_有効マップID = 0
    CALL HO_LOAD_MAPDATA(HO_有効マップID)
    CALL HO_LOAD_MODULE_LIST(HO_有効マップID)
ELSE
    ;交流パートで編集モードが呼び出された場合、読み込み済みのマップと設備情報を動的に編集することになるため、
    ;編集前の読み込み情報を退避する
    ARRAYCOPY "_DIC_HO_MAPDATA", "_DIC_HO_MAPDATA_BUFFER"
    ARRAYCOPY "_DIC_HO_MODULE_LIST", "_DIC_HO_MODULE_LIST_BUFFER"
ENDIF
PRINTED_LINE = LINECOUNT
HO_EDIT_選択中アイテム = HO_MAXVAL
WHILE 1

    CALL HO_EDIT_DRAW_HEADER
    CALL HO_EDIT_DRAW_MAP_WINDOW
    CALL HO_EDIT_DRAW_MODULE_WINDOW
    CALL WndMgr_DisplayAll()
    CALL HO_EDIT_DRAW_BOTTOM_MENU
    REDRAW 1
    CALL HO_EDIT_INPUT
    ;編集完了またはキャンセルボタンが押下された
    IF RESULT == -1
        CALL WndMgr_DestroyWindow(-1)
        RETURN
    ENDIF
    CALL HO_EDIT_FORMAT_PATH
    REDRAW 0
    CLEARLINE LINECOUNT - PRINTED_LINE
WEND

@HO_EDIT_DRAW_HEADER
#DIM  DYNAMIC BTN_ID
#DIMS DYNAMIC ROOM_NAME
#DIM  DYNAMIC F_COL, 2

CUSTOMDRAWLINE ─
CALL TITLE_CATEGORY_GENERAL(@"%ANAME(MASTER)%の領地")
PRINTL
PRINTFORM ★エディットモード
PRINTL
PRINTL
BTN_ID = HO_TOPボタンID
IF HO_EDIT_MODE == 0
    F_COL:0 = カラー_選択中
    F_COL:1 = カラー_白
ELSE
    F_COL:0 = カラー_白
    F_COL:1 = カラー_選択中
ENDIF
CALLF TAG_PRINT(@"@C:{F_COL:0}@@B:{BTN_ID}@[Areas]@/B@@/C@  @C:{F_COL:1}@@B:{BTN_ID + 1}@[Equipments]@/B@@/C@", 5)

@HO_EDIT_DRAW_BOTTOM_MENU
#DIM BTN_ID
#DIM FCOL
#DIMS DYNAMIC ROOM_NAME
#DIMS DYNAMIC _LIST_ROOM_TAG
#DIM DYNAMIC MODULE_ID
BTN_ID = HO_編集アイテムID

PRINTL
IF HO_EDIT_MODE == 0
    CALLF TAG_PRINT(@"@C:{カラー_注釈}@* By clicking between the areas, the presence or absence of the passage can be switched.@/C@", 1)
ELSE
    PRINTL
ENDIF
CUSTOMDRAWLINE ─

IF HO_EDIT_MODE == 0
    CALL TITLE_CATEGORY_GENERAL(@"設置可能なエリア")
    PRINTL
    PRINTL
    LOCAL:0 = 0
    IF HO_EDIT_選択中アイテム == 0
        FCOL = カラー_選択中
    ELSE
        FCOL= カラー_白
    ENDIF
    CALLF TAG_PRINT(@"@C:{FCOL}@@B:{BTN_ID}@[撤去]@/B@@/C@  ", 4)
    WHILE LOCAL:0 < HO_MAX_ROOMTYPE
        IF LOCAL == HO_EDIT_選択中アイテム
            FCOL = カラー_選択中
        ELSE
            FCOL= カラー_白
        ENDIF
        TRYCCALLFORM HO_ROOM_DATA_{LOCAL:0}
            IF HO_ROOM_STOCK:(LOCAL:0) > 0
                CALL HO_GET_ROOM_DATA(LOCAL:0, "ROOM_NAME")
                CALLF TAG_PRINT(@"@C:{FCOL}@@B:{BTN_ID + LOCAL:0}@[%RESULTS%  × {HO_ROOM_STOCK:(LOCAL:0)}]@/B@@/C@  ", 4)
            ENDIF
        CATCH
            ;BREAK
        ENDCATCH
        LOCAL:0 ++
    WEND
ELSE
    CALL HO_GET_ROOM_NAME(HO_EDIT_選択中ルームIDX)
    ROOM_NAME = %RESULTS%
    CALL HO_GET_ROOM_TAG(HO_EDIT_選択中ルームIDX)
    _LIST_ROOM_TAG = %RESULTS%
    PRINTFORM %ROOM_NAME%のルームタグ:
    FOR LOCAL, 0, LIST_COUNT(_LIST_ROOM_TAG)
        LOCALS = %LIST_GET(_LIST_ROOM_TAG, LOCAL)%
        PRINTFORM <%LOCALS%>
    NEXT
    PRINTL
    CUSTOMDRAWLINE ─
    CALL TITLE_CATEGORY_GENERAL(@"設備一覧")
    PRINTL
    PRINTL
    LOCAL:0 = 0
    IF HO_EDIT_選択中アイテム == 0
        FCOL = カラー_選択中
    ELSE
        FCOL= カラー_白
    ENDIF
    CALLF TAG_PRINT(@"@C:{FCOL}@@B:{BTN_ID}@[撤去]@/B@@/C@  ", 4)
    WHILE LOCAL:0 < HO_MAX_MODULETYPE
        IF LOCAL == HO_EDIT_選択中アイテム
            FCOL = カラー_選択中
        ELSE
            FCOL= カラー_白
        ENDIF
        TRYCCALLFORM HO_MODULE_DATA_{LOCAL:0}
            IF HO_MODULE_STOCK:(LOCAL:0) > 0
                CALL HO_GET_MODULE_DATA(LOCAL:0, "MODULE_NAME")
                CALLF TAG_PRINT(@"@C:{FCOL}@@B:{BTN_ID + LOCAL:0}@[%RESULTS%  × {HO_MODULE_STOCK:(LOCAL:0)}]@/B@@/C@  ", 4)
            ENDIF
        CATCH
            ;BREAK
        ENDCATCH
        LOCAL:0 ++
    WEND
    PRINTL
    IF HO_EDIT_選択中アイテム != 0 && HO_EDIT_選択中アイテム != HO_MAXVAL
        MODULE_ID = HO_EDIT_選択中アイテム
        PRINTL
        CALL TITLE_CATEGORY_GENERAL(@"概要")
        PRINTL
        CALL HO_GET_MODULE_DATA(MODULE_ID, "MODULE_NAME")
        LOCALS:0 = %RESULTS%
        CALL HO_GET_MODULE_DATA(MODULE_ID, "人数")
        LOCALS:1 = %TOSTR(RESULT)%
        CALL HO_GET_MODULE_DATA(MODULE_ID, "制限")
        LOCALS:2 = %RESULTS%
        TRYCALLFORM HO_MODULE_DESC_{MODULE_ID}
        LOCALS:4 = %RESULTS%
        PRINTFORML ◆%LOCALS:0%
        SIF LIST_COUNT(LOCALS:2) > 0
            PRINTFORM 設置可能タグ:
        FOR LOCAL, 0, LIST_COUNT(LOCALS:2)
            LOCALS:3 = %LIST_GET(LOCALS:2, LOCAL)%
            PRINTFORM <%LOCALS:3%>
        NEXT
        PRINTL
        PRINTFORML 定員：%LOCALS:1%名
        PRINTFORML %LOCALS:4%
    ENDIF
ENDIF
;
;-------------------------------------------------
PRINTL
PRINTL
SETCOLOR カラー_選択不可
CUSTOMDRAWLINE ─
RESETCOLOR
BTN_ID = HO_BTMボタンID
CALLF TAG_PRINT(@"@B:{BTN_ID}@[Save changes]@/B@@/C@      ", 4)
CALLF TAG_PRINT(@"@B:{BTN_ID + 1}@[Cancel]@/B@@/C@      ", 4)
[IF_DEBUG]
CALLF TAG_PRINT(@"@B:{BTN_ID + 2}@[エクスポート]@/B@@/C@", 4)
[ENDIF]

;エディット画面の入力処理
@HO_EDIT_INPUT
#DIM DYNAMIC ROOM_IDX
#DIM DYNAMIC ROOM_ID
#DIM DYNAMIC ROOM_CAP
#DIM DYNAMIC MODULE_IDX
#DIM DYNAMIC MODULE_LIST_IDX
#DIM DYNAMIC MODULE_ID
#DIMS DYNAMIC _LIST_MODULE_SLOT

ONEINPUTS
CLEARLINE 1
SIF ISNUMERIC(RESULTS)
    RESULT = TOINT(RESULTS)
;編集モード切り替え
IF RESULT >= HO_TOPボタンID && RESULT <= HO_TOPボタンID + 1
    INVERTBIT HO_EDIT_MODE, 0
    HO_EDIT_選択中アイテム = HO_MAXVAL
    ;;エリア編集モード
    ;-------------------------------------------------
    ;通路の編集
    ;5*5サイズのマップの通路数は0-49
ELSEIF RESULT >= HO_通路ボタンID && RESULT <= HO_通路ボタンID + 49 && HO_EDIT_MODE == 0
    CALL HO_EDIT_CHANGE_ROOM_PATH(RESULT - HO_通路ボタンID)
ELSEIF RESULT >= HO_編集アイテムID && HO_EDIT_MODE == 0
    ROOM_ID = RESULT - HO_編集アイテムID
    ;値の妥当性チェック
    CALL HO_GET_ROOM_DATA(ROOM_ID, "ROOM_NAME")
    IF RESULT == -1 || ROOM_ID == HO_EDIT_選択中アイテム
        HO_EDIT_選択中アイテム = HO_MAXVAL
        RETURN
    ENDIF
    HO_EDIT_選択中アイテム = ROOM_ID
    ;ルームの置き換え
ELSEIF RESULT >= HO_マップボタンID && RESULT <= HO_マップボタンID + HO_MAX_ROOMNUM &&  HO_EDIT_MODE == 0
    ROOM_IDX = RESULT - HO_マップボタンID
    HO_EDIT_選択中ルームIDX = ROOM_IDX
    ;値の妥当性チェック
    SIF HO_EDIT_選択中アイテム == HO_MAXVAL
        RETURN
    CALL HO_GET_ROOM_ID(ROOM_IDX)
    ROOM_ID = RESULT
    CALL HO_GET_MAPDATA(HO_有効マップID, ROOM_IDX, "MODULE_SLOT")
    _LIST_MODULE_SLOT = %RESULTS%
    ;エリアの置換可否確認
    CALL HO_EDIT_CHECK_ROOM_REPLACEABLE(ROOM_IDX)
    SIF !RESULT
        RETURN
    ;設備の置換可否確認
    CALL HO_EDIT_CHECK_MODULE_REPLACEABLE(HO_EDIT_選択中ルームIDX)
    SIF !RESULT
        RETURN
    ;ルームが既に配置済みで一つ以上モジュールが配置されているならば、置き換え前に警告メッセージを出す
    IF ROOM_ID != 0 && LIST_COUNT(_LIST_MODULE_SLOT) > 0
        CALLF TAG_PRINT(@"@C:{カラー_注意}@Replacing the area. The arranged equipment will also be removed and returns to the inventory. Are you sure?@/C@", 1)
        CALL ASK_YN()
        SIF RESULT
            RETURN
    ENDIF
    ;配置済みのルームを在庫に戻す
    SIF ROOM_ID != 0
        HO_ROOM_STOCK:ROOM_ID ++
    CALL HO_EDIT_UNDEPLOY_ALL_MODULE(ROOM_IDX)
    CALL HO_SET_MAPDATA(ROOM_IDX, "ROOM_ID", TOSTR(HO_EDIT_選択中アイテム))
    HO_ROOM_STOCK:HO_EDIT_選択中アイテム --
    IF HO_ROOM_STOCK:HO_EDIT_選択中アイテム == 0
        HO_EDIT_選択中アイテム = HO_MAXVAL
    ENDIF
    ;;モジュール編集モード
    ;-------------------------------------------------
    ;編集対象の部屋を選択
ELSEIF RESULT >= HO_マップボタンID && RESULT <= HO_マップボタンID + HO_MAX_ROOMNUM - 1&&  HO_EDIT_MODE == 1
    HO_EDIT_選択中ルームIDX = RESULT - HO_マップボタンID
    ;押下されたモジュールを選択済みに
ELSEIF  RESULT >= HO_編集アイテムID && RESULT <= HO_編集アイテムID + HO_MAX_MODULETYPE && HO_EDIT_MODE == 1
    HO_EDIT_選択中アイテム = RESULT - HO_編集アイテムID
    ;値の妥当性チェック
    IF HO_MODULE_STOCK:HO_EDIT_選択中アイテム < 1 && HO_EDIT_選択中アイテム != 0
        HO_EDIT_選択中アイテム = HO_MAXVAL
        RETURN
    ENDIF
    ;モジュールウィンドウクリック時の処理
ELSEIF RESULT >= HO_モジュールボタンID && RESULT <= HO_モジュールボタンID + HO_MAX_MODULESLOT -1 &  HO_EDIT_MODE == 1
    SIF HO_EDIT_選択中アイテム == HO_MAXVAL
        RETURN
    MODULE_IDX = RESULT - HO_モジュールボタンID
    CALL HO_GET_MAPDATA(HO_有効マップID, HO_EDIT_選択中ルームIDX, "ROOM_ID")
    ROOM_ID = RESULT
    CALL HO_GET_ROOM_DATA(ROOM_ID, "ROOM_CAPACITY")
    ROOM_CAP = RESULT
    ;ROOMのCAPACITYを超えるMODULE_IDXが投入された場合はRETURN
    SIF MODULE_IDX > ROOM_CAP
        RETURN
    CALL HO_GET_MODULE_ID2(HO_EDIT_選択中ルームIDX, MODULE_IDX)
    MODULE_ID = RESULT
    ;モジュール撤去モード
    ;-------------------------------------------------
    IF MODULE_ID != -1 && HO_EDIT_選択中アイテム == 0
        CALL HO_GET_MAPDATA(HO_有効マップID, HO_EDIT_選択中ルームIDX, "MODULE_SLOT")
        _LIST_MODULE_SLOT = %RESULTS%
        MODULE_LIST_IDX = TOINT(LIST_GET(_LIST_MODULE_SLOT, MODULE_IDX))
        ;編集可能な状況か確認
        CALL HO_EDIT_CHECK_MODULE_REPLACEABLE(HO_EDIT_選択中ルームIDX)
        SIF !RESULT
            RETURN
        ;モジュールリストの登録情報消去
        CALL HO_DELETE_MODULE_LIST(MODULE_LIST_IDX)
        ;マップデータのモジュールスロット登録消去
        _LIST_MODULE_SLOT = %LIST_REMOVEAT(_LIST_MODULE_SLOT, MODULE_IDX)%
        CALL HO_SET_MAPDATA(HO_EDIT_選択中ルームIDX, "MODULE_SLOT", _LIST_MODULE_SLOT)
        ;同一ルームに内に配置済みの他の設備についてモジュールリスト側のスロット情報を更新
        FOR LOCAL, 0, LIST_COUNT(_LIST_MODULE_SLOT)
            CALL HO_SET_MODULE_LIST(TOINT(LIST_GET(_LIST_MODULE_SLOT, LOCAL)), "MODULE_SLOT_IDX", TOSTR(LOCAL))
        NEXT
        ;モジュール在庫を追加
        HO_MODULE_STOCK:MODULE_ID ++
        ;モジュール設置モード
        ;-------------------------------------------------
    ELSEIF HO_EDIT_選択中アイテム != 0
        ;編集可能な状況か確認
        CALL HO_EDIT_CHECK_MODULE_REPLACEABLE(HO_EDIT_選択中ルームIDX)
        SIF !RESULT
            RETURN
        ;配置可能かを確認
        CALL HO_EDIT_CHECK_MODULE_PLACEABLE(HO_EDIT_選択中ルームIDX, HO_EDIT_選択中アイテム)
        SIF RESULT == 0
            RETURN
        CALL HO_GET_MAPDATA(HO_有効マップID, HO_EDIT_選択中ルームIDX, "MODULE_SLOT")
        _LIST_MODULE_SLOT = %RESULTS%
        IF MODULE_IDX > LIST_COUNT(_LIST_MODULE_SLOT) && LIST_COUNT(_LIST_MODULE_SLOT) != -1
            MODULE_IDX = LIST_COUNT(_LIST_MODULE_SLOT)
        ENDIF
        ;モジュールリストに設置モジュールの情報を登録
        CALL HO_ADD_MODULE_LIST(HO_EDIT_選択中アイテム, HO_EDIT_選択中ルームIDX, MODULE_IDX)
        MODULE_LIST_IDX = RESULT
        ;マップデータのモジュールスロット登録
        IF LIST_GET(_LIST_MODULE_SLOT, MODULE_IDX) != ""
            _LIST_MODULE_SLOT = %LIST_INSERTAT(_LIST_MODULE_SLOT, MODULE_IDX, TOSTR(MODULE_LIST_IDX))%
        ELSE
            _LIST_MODULE_SLOT = %LIST_ADD(_LIST_MODULE_SLOT, TOSTR(MODULE_LIST_IDX))%
        ENDIF
        CALL HO_SET_MAPDATA(HO_EDIT_選択中ルームIDX, "MODULE_SLOT", _LIST_MODULE_SLOT)
        ;同一ルームに内に配置済みの他の設備についてモジュールリスト側のスロット情報を更新
        FOR LOCAL, 0, LIST_COUNT(_LIST_MODULE_SLOT)
            CALL HO_SET_MODULE_LIST(TOINT(LIST_GET(_LIST_MODULE_SLOT, LOCAL)), "MODULE_SLOT_IDX", TOSTR(LOCAL))
        NEXT
        ;モジュール在庫を減少
        HO_MODULE_STOCK:HO_EDIT_選択中アイテム --
        IF HO_MODULE_STOCK:HO_EDIT_選択中アイテム == 0
            HO_EDIT_選択中アイテム = HO_MAXVAL
        ENDIF
    ENDIF
    ;;底部ボタンの処理
    ;-------------------------------------------------
ELSEIF RESULT >= HO_BTMボタンID && RESULT <= HO_BTMボタンID + 2
    IF RESULT == HO_BTMボタンID
        CALL COLOR_PRINTL("Save the edit and return to the exchange screen. Are you sure?", カラー_注意)
        CALL ASK_YN()
        IF !RESULT
            CALL HO_EDIT_CHECK_ERROR
            IF RESULT
                ;編集終了処理
                ;-------------------------------------------------
                ;編集済みデータを退避
                ARRAYCOPY "_DIC_HO_MAPDATA", "_DIC_HO_MAPDATA_BUFFER"
                ARRAYCOPY "_DIC_HO_MODULE_LIST", "_DIC_HO_MODULE_LIST_BUFFER"
                ;セーブデータへの書き込み前にセーブ不要な情報を削除した上でセーブする
                ;客室に配置されるキャラクターの私室は都度自動生成されるためセーブ不要
                CALL HO_FIND_ROOM_BY_TAG("客室")
                ROOM_IDX = RESULT
                CALL HO_EDIT_UNDEPLOY_ALL_MODULE(ROOM_IDX, 1)
                ;セーブデータ書き込み
                CALL HO_SAVE_MAPDATA
                CALL HO_SAVE_MODULE_LIST
                ;セーブ後退避した編集済みデータに戻す
                ARRAYCOPY "_DIC_HO_MAPDATA_BUFFER", "_DIC_HO_MAPDATA"
                ARRAYCOPY "_DIC_HO_MODULE_LIST_BUFFER", "_DIC_HO_MODULE_LIST"
                ;マップ情報に関するキャッシュをクリア
                HO_CACHE_ENDIDXOF_MODULE_LIST = 0
                ;交流パートの場合
                IF FLAG:ハウジングモード
                    ;エリア効果連想配列を作り直す
                    CALL HO_ROOM_EFFECT_CREATE_MAP
                    CALL HO_ROOM_EFFECT_SET_EFFECT_FROM_MODULE
                    CALL HO_MODULE_EFFECT_SET_EFFECT_FORM_MODULE
                ENDIF
                RETURN -1
            ELSE
                RETURN
            ENDIF
        ELSE
            RETURN
        ENDIF
        ;[キャンセル]
    ELSEIF RESULT == HO_BTMボタンID + 1
        CALL COLOR_PRINTL("Revert all edits and return to the previous screen. Continue?", カラー_注意)
        CALL ASK_YN()
        IF !RESULT
            ;在庫を変更前の情報に
            ARRAYCOPY "HO_ROOM_STOCK_BUFFER", "HO_ROOM_STOCK"
            ARRAYCOPY "HO_MODULE_STOCK_BUFFER", "HO_MODULE_STOCK"
            ;交流パートの場合、マップ情報と設備情報も復元
            IF FLAG:ハウジングモード
                ARRAYCOPY "_DIC_HO_MAPDATA_BUFFER", "_DIC_HO_MAPDATA"
                ARRAYCOPY "_DIC_HO_MODULE_LIST_BUFFER", "_DIC_HO_MODULE_LIST"
                ;エリア効果連想配列を作り直す
                CALL HO_ROOM_EFFECT_CREATE_MAP
                CALL HO_ROOM_EFFECT_SET_EFFECT_FROM_MODULE
                CALL HO_MODULE_EFFECT_SET_EFFECT_FORM_MODULE
            ENDIF
            RETURN -1
        ELSE
            RETURN
        ENDIF
        ;[エクスポート](DEBUG時のみ)
    ELSEIF RESULT == HO_BTMボタンID + 2
        CALL HO_EDIT_SAVE_MAPDATA_TO_FILE()
    ENDIF
ENDIF

;対象のルームに設置済みのモジュールリスト登録情報をすべて削除し、モジュールをすべて在庫に戻す。
;引数DELETEに1が指定されている場合在庫に戻さない(一時生成される私室の消去などに使う)
@HO_EDIT_UNDEPLOY_ALL_MODULE(ROOM_IDX, DELETE = 0)
#DIM ROOM_IDX
#DIM DELETE
#DIM DYNAMIC MODULE_ID
#DIM DYNAMIC MODULE_SLOT_IDX
#DIM DYNAMIC MODULE_LIST_IDX
#DIMS DYNAMIC _LIST_MODULE_SLOT

CALL HO_GET_MAPDATA(HO_有効マップID, ROOM_IDX, "MODULE_SLOT")
_LIST_MODULE_SLOT = %RESULTS%
FOR MODULE_SLOT_IDX, 0, LIST_COUNT(_LIST_MODULE_SLOT)
    IF !DELETE
        ;モジュールIDに合致するモジュールを在庫に戻す
        CALL HO_GET_MODULE_ID2(ROOM_IDX, MODULE_SLOT_IDX)
        MODULE_ID = RESULT
        HO_MODULE_STOCK:MODULE_ID ++
    ENDIF
    ;モジュールリストのレコードを削除
    MODULE_LIST_IDX = TOINT(LIST_GET(_LIST_MODULE_SLOT, 0))
    CALL HO_DELETE_MODULE_LIST(MODULE_LIST_IDX)
    ;モジュールスロットから削除
    _LIST_MODULE_SLOT = %LIST_REMOVEAT(_LIST_MODULE_SLOT, 0)%
NEXT
CALL HO_SET_MAPDATA(ROOM_IDX, "MODULE_SLOT", _LIST_MODULE_SLOT)

RETURN

;対象のエリアが置き換え可能か調べる
@HO_EDIT_CHECK_ROOM_REPLACEABLE(ROOM_IDX)
#DIM ROOM_IDX
#DIM DYNAMIC ERR_FLG
;交流パートの場合、キャラがエリア内にいる場合はエリアの置き換えを不可に
IF FLAG:ハウジングモード
    CALL HO_GET_MEMBER_IN_ROOM(ROOM_IDX)
    IF RESULT > 0
        CALLF TAG_PRINT(@"@C:{カラー_注意}@It cannot be replaced because there is a character in the area@/C@", 1)
        CALLF TAG_PRINT(@"@C:{カラー_注意}@* During the exchange, only areas without characters can be replaced.@/C@", 1)
        ERR_FLG ++
    ENDIF
    CALL HO_CHECK_ROOM_TAG(ROOM_IDX, "客室")
    IF RESULT
        CALLF TAG_PRINT(@"@C:{カラー_注意}@The room area cannot be removed during the exchange@/C@", 1)
        ERR_FLG ++
    ENDIF
ENDIF

;エリアタグ<地形>を持つエリアは特定条件を満たさない場合撤去できない
[IF_NDEBUG]
CALL HO_CHECK_ROOM_TAG(ROOM_IDX, "地形")
IF RESULT
    CALLF TAG_PRINT(@"@C:{カラー_注意}@It is necessary to acquire 'Great Alchemy (un-implemented)' to remove areas with <terrain (地形)> attributes.@/C@", 1)
    ERR_FLG ++
ENDIF
[ENDIF]

IF ERR_FLG > 0
    WAIT
    RETURN 0
ELSE
    RETURN 1
ENDIF

;対象の設備が置き換え置き換え可能か調べる
@HO_EDIT_CHECK_MODULE_REPLACEABLE(ROOM_IDX)
#DIM ROOM_IDX
#DIM  DYNAMIC MODULE_LIST_IDX
#DIM  DYNAMIC ERR_FLG
#DIMS DYNAMIC _LIST_MODULE_SLOT
#DIM  DYNAMIC 使用者がいる

;交流パートの場合、キャラがエリア内にいる場合はエリアの置き換えを不可に
IF FLAG:ハウジングモード
    CALL HO_GET_MAPDATA(HO_有効マップID, HO_EDIT_選択中ルームIDX, "MODULE_SLOT")
    _LIST_MODULE_SLOT = %RESULTS%

    CALL HO_GET_MEMBER_IN_ROOM(ROOM_IDX)
    IF RESULT > 0
        CALLF TAG_PRINT(@"@C:{カラー_注意}@It cannot be replaced because there is a character in the area@/C@", 1)
        CALLF TAG_PRINT(@"@C:{カラー_注意}@* Edit only in the area without characters during the exchange.@/C@", 1)
        ERR_FLG ++
    ENDIF
    ;設備の検証
    IF _LIST_MODULE_SLOT != ""
        ;宿場に使用者IDが振られている場合は置き換え不可
        FOR LOCAL, 0, LIST_COUNT(_LIST_MODULE_SLOT)
            CALL HO_GET_MODULE_LIST_IDX(ROOM_IDX, LOCAL)
            MODULE_LIST_IDX = RESULT
            CALL HO_GET_MODULE_LIST(MODULE_LIST_IDX, "VISITOR_ID")
            IF RESULTS != ""
                使用者がいる ++
                BREAK
            ENDIF
        NEXT
        IF 使用者がいる
            CALLF TAG_PRINT(@"@C:{カラー_注意}@It cannot be replaced because there are facilities assigned by users in the area.@/C@", 1)
            ERR_FLG ++
        ENDIF
    ENDIF
ENDIF

IF ERR_FLG > 0
    WAIT
    RETURN 0
ELSE
    RETURN 1
ENDIF

;対象のルームにモジュールが配置可能か調べる
@HO_EDIT_CHECK_MODULE_PLACEABLE(ROOM_IDX, MODULE_ID)
#DIM ROOM_IDX
#DIM MODULE_ID
#DIM DYNAMIC ROOM_ID
#DIM DYNAMIC ROOM_CAP
#DIMS DYNAMIC _LIST_MODULE_SLOT
#DIMS DYNAMIC _LIST_制限リスト
#DIMS DYNAMIC _LIST_ROOM_TAG

CALL HO_GET_MAPDATA(HO_有効マップID, HO_EDIT_選択中ルームIDX, "ROOM_ID")
ROOM_ID = RESULT
CALL HO_GET_ROOM_DATA(ROOM_ID, "ROOM_CAPACITY")
ROOM_CAP = RESULT
CALL HO_GET_MAPDATA(HO_有効マップID, HO_EDIT_選択中ルームIDX, "MODULE_SLOT")
_LIST_MODULE_SLOT = %RESULTS%
;既にルームの設置上限までモジュールを配置してる場合不可
IF LIST_COUNT(_LIST_MODULE_SLOT) == ROOM_CAP
    CALL COLOR_PRINTW("There is no space to install equipment in this area", カラー_注意)
    CLEARLINE 1
    RETURN 0
ENDIF
CALL HO_GET_MODULE_DATA(MODULE_ID, "制限")
_LIST_制限リスト = %RESULTS%
;制限リストに登録がない場合は設置可
SIF LIST_COUNT(_LIST_制限リスト) == 0
    RETURN 1
CALL HO_GET_ROOM_TAG(ROOM_IDX)
_LIST_ROOM_TAG = %RESULTS%

FOR LOCAL, 0, LIST_COUNT(_LIST_制限リスト)
    LOCALS = %LIST_GET(_LIST_制限リスト, LOCAL)%
    ;制限リストとルームタグが合致する場合は設置可
    SIF LIST_INDEXOF(_LIST_ROOM_TAG, LOCALS) != -1
        RETURN 1
NEXT

;制限リストと合致するルームタグがない
CALL COLOR_PRINTW("It is a facility that cannot be installed in this area", カラー_注意)
CLEARLINE 1
RETURN 0

@HO_EDIT_CHANGE_ROOM_PATH(PATH_ID)
#DIM PATH_ID
#DIM DYNAMIC ROOM_IDX
#DIMS DYNAMIC _LIST_PATH
ROOM_IDX = PATH_ID / 2
SIF ROOM_IDX > HO_MAX_ROOMNUM
    RETURN

;横列の通路の処理
IF PATH_ID % 2 == 0
    ;"なし"の部屋との通路は編集できないように
    CALL HO_GET_ROOM_ID(ROOM_IDX)
    SIF RESULT == 0
        RETURN
    CALL HO_GET_ROOM_ID(ROOM_IDX + 1)
    SIF RESULT == 0
        RETURN
    CALL HO_GET_PATH(ROOM_IDX)
    _LIST_PATH = %RESULTS%
    ;右隣の部屋へのパスが存在するか？
    IF LIST_INDEXOF(_LIST_PATH, TOSTR(ROOM_IDX + 1)) != -1
        ;右隣の部屋へのパスを削除
        _LIST_PATH = %LIST_REMOVEAT(_LIST_PATH, LIST_INDEXOF(_LIST_PATH, TOSTR(ROOM_IDX + 1)))%
        CALL HO_SET_MAPDATA(ROOM_IDX, "ROOM_PATH", _LIST_PATH)
        ;右隣の部屋から左隣の部屋へのパスも削除
        CALL HO_GET_PATH(ROOM_IDX + 1)
        _LIST_PATH = %RESULTS%
        _LIST_PATH = %LIST_REMOVEAT(_LIST_PATH, LIST_INDEXOF(_LIST_PATH, TOSTR(ROOM_IDX)))%
        CALL HO_SET_MAPDATA(ROOM_IDX + 1, "ROOM_PATH", _LIST_PATH)
        ;存在しないならばパスを追加
    ELSE
        ;右隣の部屋へのパスを追加
        _LIST_PATH = %LIST_ADD(_LIST_PATH, TOSTR(ROOM_IDX + 1))%
        CALL HO_SET_MAPDATA(ROOM_IDX, "ROOM_PATH", _LIST_PATH)
        ;右隣の部屋から左隣の部屋へのパスも追加
        CALL HO_GET_PATH(ROOM_IDX + 1)
        _LIST_PATH = %RESULTS%
        _LIST_PATH = %LIST_ADD(_LIST_PATH, TOSTR(ROOM_IDX))%
        CALL HO_SET_MAPDATA(ROOM_IDX + 1, "ROOM_PATH", _LIST_PATH)
    ENDIF
    ;縦列の通路の処理
ELSE
    ;"なし"の部屋との通路は編集できないように
    CALL HO_GET_ROOM_ID(ROOM_IDX)
    SIF RESULT == 0
        RETURN
    CALL HO_GET_ROOM_ID(ROOM_IDX + 5)
    SIF RESULT == 0
        RETURN
    CALL HO_GET_PATH(ROOM_IDX)
    _LIST_PATH = %RESULTS%
    ;下隣の部屋へのパスが存在するか？
    IF LIST_INDEXOF(_LIST_PATH, TOSTR(ROOM_IDX + 5)) != -1
        ;下隣の部屋へのパスを削除
        _LIST_PATH = %LIST_REMOVEAT(_LIST_PATH, LIST_INDEXOF(_LIST_PATH, TOSTR(ROOM_IDX + 5)))%
        CALL HO_SET_MAPDATA(ROOM_IDX, "ROOM_PATH", _LIST_PATH)
        ;下隣の部屋から上隣の部屋へのパスも削除
        CALL HO_GET_PATH(ROOM_IDX + 5)
        _LIST_PATH = %RESULTS%
        _LIST_PATH = %LIST_REMOVEAT(_LIST_PATH, LIST_INDEXOF(_LIST_PATH, TOSTR(ROOM_IDX)))%
        CALL HO_SET_MAPDATA(ROOM_IDX + 5, "ROOM_PATH", _LIST_PATH)
        ;存在しないならばパスを追加
    ELSE
        ;右隣の部屋へのパスを追加
        _LIST_PATH = %LIST_ADD(_LIST_PATH, TOSTR(ROOM_IDX + 5))%
        CALL HO_SET_MAPDATA(ROOM_IDX, "ROOM_PATH", _LIST_PATH)
        ;右隣の部屋から左隣の部屋へのパスも追加
        CALL HO_GET_PATH(ROOM_IDX + 5)
        _LIST_PATH = %RESULTS%
        _LIST_PATH = %LIST_ADD(_LIST_PATH, TOSTR(ROOM_IDX))%
        CALL HO_SET_MAPDATA(ROOM_IDX + 5, "ROOM_PATH", _LIST_PATH)
    ENDIF
ENDIF

;EMPTYと接続している不正なパスを纏めて消去する
@HO_EDIT_FORMAT_PATH
#DIM PATH_ID
#DIM DYNAMIC ROOM_IDX
#DIMS DYNAMIC _LIST_PATH
FOR LOCAL, 0, HO_MAX_ROOMNUM
    CALL HO_GET_ROOM_ID(LOCAL:0)
    IF RESULT == 0
        CALL HO_SET_MAPDATA(LOCAL:0, "ROOM_PATH", "")
    ELSE
        CALL HO_GET_PATH(LOCAL)
        _LIST_PATH = %RESULTS%
        FOR LOCAL:1, 0, LIST_COUNT(_LIST_PATH)
            ROOM_IDX = TOINT(LIST_GET(_LIST_PATH, LOCAL:1))
            CALL HO_GET_ROOM_ID(ROOM_IDX)
            SIF RESULT == 0
                _LIST_PATH = %LIST_REMOVEAT(_LIST_PATH, LOCAL:1)%
        NEXT
        CALL HO_SET_MAPDATA(LOCAL:0, "ROOM_PATH", _LIST_PATH)
    ENDIF
NEXT

;編集結果が妥当か調べる
@HO_EDIT_CHECK_ERROR
CALL HO_EDIT_CHECK_ROOM_ERROR
SIF !RESULT
    RETURN 0
CALL HO_EDIT_CHECK_MODULE_ERROR
SIF !RESULT
    RETURN 0
RETURN 1

@HO_EDIT_CHECK_ROOM_ERROR
#DIM DYNAMIC ROOM_IDX
#DIM DYNAMIC 私室がある
#DIM DYNAMIC 客室がある
#DIM DYNAMIC 食堂がある
#DIM DYNAMIC ERR_CNT
#DIMS DYNAMIC _LIST_ROOM
FOR ROOM_IDX, 0, HO_MAX_ROOMNUM
    CALL HO_CHECK_ROOM_TAG(ROOM_IDX, "プレイヤー私室")
    SIF RESULT
        私室がある ++
    CALL HO_CHECK_ROOM_TAG(ROOM_IDX, "客室")
    SIF RESULT
        客室がある ++
    CALL HO_CHECK_ROOM_TAG(ROOM_IDX, "食堂")
    SIF RESULT
        食堂がある ++
NEXT
IF 私室がある == 0
    CALL COLOR_PRINTL("At least one area with an area tag <player private room (プレイヤー私室)> is required (private room, etc.)", カラー_注意)
    ERR_CNT ++
ENDIF
IF 客室がある == 0
    CALL COLOR_PRINTL("At least one area with an area tag <guest room (客室)> is required (Guest room,...)", カラー_注意)
    ERR_CNT ++
ENDIF
IF 食堂がある == 0
    CALL COLOR_PRINTL("At least one area with an area tag <living room (食堂)> is required (Living room,...)", カラー_注意)
    ERR_CNT ++
ENDIF
;用途<牢獄>の設備はマップ内に一つのみ設置可能
CALL HO_FIND_ROOM_BY_TAG("牢獄")
_LIST_ROOM = %RESULTS%
IF LIST_COUNT(_LIST_ROOM) > 1
    CALL COLOR_PRINTL("Only one area (such as with '牢獄' tags) can be installed.", カラー_注意)
    ERR_CNT ++
ENDIF
IF ERR_CNT != 0
    WAIT
    RETURN 0
ELSE
    RETURN 1
ENDIF

@HO_EDIT_CHECK_MODULE_ERROR
#DIMS DYNAMIC _LIST_MODULE
#DIM DYNAMIC ERR_CNT

;用途<商店>の設備はマップ内に一つのみ設置可能
CALL HO_FIND_MODULE_BY_USAGE("商店")
_LIST_MODULE = %RESULTS%
IF LIST_COUNT(_LIST_MODULE) > 1
    CALL COLOR_PRINTL("Only one equipment (such as stalls) with tag <Shop (商店)> can be installed", カラー_注意)
    ERR_CNT ++
ENDIF
;用途<娼館>の設備はマップ内に一つのみ設置可能
CALL HO_FIND_MODULE_BY_USAGE("娼館")
_LIST_MODULE = %RESULTS%
IF LIST_COUNT(_LIST_MODULE) > 1
    CALL COLOR_PRINTL("Only one equipment (such as a prostitute reception) with tag <prostitute (娼館)> can be installed.", カラー_注意)
    ERR_CNT ++
ENDIF
CALL HO_FIND_MODULE_BY_USAGE("宿番")
_LIST_MODULE = %RESULTS%
IF LIST_COUNT(_LIST_MODULE) > 1
    CALL COLOR_PRINTL("Only one equipment (such as a posting reception) with tag <inn (宿番)> can be installed.", カラー_注意)
    ERR_CNT ++
ENDIF

IF ERR_CNT != 0
    WAIT
    RETURN 0
ELSE
    RETURN 1
ENDIF

@HO_EDIT_DRAW_MAP_WINDOW
#DIM DYNAMIC WINDOW_ID
#DIM CONST WND_WIDTH  = 16
#DIM CONST WND_HEIGHT = 5
#DIM BTN_ID
CALL WndMgr_DestroyWindow(-1)

FOR LOCAL, 0, HO_MAX_ROOMNUM
    CALL WndMgr_CreateWindow(WINDOW_ID, (LOCAL % 5 * WND_WIDTH), (LOCAL / 5 * WND_HEIGHT), WND_WIDTH, WND_HEIGHT, 2)
    CALL HO_EDIT_SET_MAP_WINDOW_TEXT(WINDOW_ID, LOCAL)
    CALL HO_GET_ROOM_NAME(LOCAL)
    ; IF RESULTS == "EMPTY"
    ;     CALL WndMgr_Attribute(WINDOW_ID, "Disabled", 1)
    ; ENDIF
    WINDOW_ID ++
NEXT
BTN_ID =  HO_通路ボタンID
FOR LOCAL, 0, HO_MAX_ROOMNUM
    CALL HO_GET_PATH(LOCAL)
    IF LIST_INDEXOF(RESULTS, TOSTR(LOCAL + 1)) != -1 && LOCAL % 5 != 4
        ;横列の通路
        WINDOW_ID ++
        CALL WndMgr_CreateWindow(WINDOW_ID,(WND_WIDTH - 1) + (WND_WIDTH * (LOCAL % 5)), 1 + (LOCAL / 5 * WND_HEIGHT), 3, 3, 0)
        CALL WndMgr_TextSet(WINDOW_ID, 0, @"@B:{BTN_ID}@￣@/B@")
        CALL WndMgr_TextSet(WINDOW_ID, 1, @"@B:{BTN_ID}@　@/B@")
        CALL WndMgr_TextSet(WINDOW_ID, 2, @"@B:{BTN_ID}@＿@/B@")
    ELSEIF LOCAL % 5 != 4
        WINDOW_ID ++
        CALL WndMgr_CreateWindow(WINDOW_ID,(WND_WIDTH - 2) + (WND_WIDTH * (LOCAL % 5)), 1 + (LOCAL / 5 * WND_HEIGHT), 3, 3, 0)
        CALL WndMgr_TextSet(WINDOW_ID, 0, @"@B:{BTN_ID}@｜｜@/B@")
        CALL WndMgr_TextSet(WINDOW_ID, 1, @"@B:{BTN_ID}@｜｜@/B@")
        CALL WndMgr_TextSet(WINDOW_ID, 2, @"@B:{BTN_ID}@｜｜@/B@")
    ENDIF
    BTN_ID ++
    CALL HO_GET_PATH(LOCAL)
    IF LIST_INDEXOF(RESULTS, TOSTR(LOCAL + 5)) != -1 && LOCAL / 5 != 4
        ;縦列の通路
        WINDOW_ID ++
        CALL WndMgr_CreateWindow(WINDOW_ID,(WND_WIDTH / 2 - 2) + (WND_WIDTH * (LOCAL % 5)), WND_HEIGHT - 1 + (LOCAL / 5 * WND_HEIGHT), 3, 2, 0)
        CALL WndMgr_TextSet(WINDOW_ID, 0, @"@B:{BTN_ID}@┐┌@/B@")
        CALL WndMgr_TextSet(WINDOW_ID, 1, @"@B:{BTN_ID}@┘└@/B@")
    ELSEIF LOCAL / 5 != 4
        WINDOW_ID ++
        CALL WndMgr_CreateWindow(WINDOW_ID,(WND_WIDTH / 2 - 2) + (WND_WIDTH * (LOCAL % 5)), WND_HEIGHT - 1 + (LOCAL / 5 * WND_HEIGHT), 3, 2, 0)
        CALL WndMgr_TextSet(WINDOW_ID, 0, @"@B:{BTN_ID}@――@/B@")
        CALL WndMgr_TextSet(WINDOW_ID, 1, @"@B:{BTN_ID}@――@/B@")
    ENDIF
    BTN_ID ++
NEXT

@HO_EDIT_DRAW_MODULE_WINDOW
#DIM CONST WND_WIDTH  = 90
#DIM CONST WND_HEIGHT = 25
#DIM DYNAMIC WINDOW_ID
#DIM DYNAMIC L_CNT

#DIMS DYNAMIC ROOM_NAME
#DIM DYNAMIC MODULE_SLOT_IDX
#DIM DYNAMIC MODULE_ID
#DIM DYNAMIC ROOM_ID
#DIM DYNAMIC ROOM_CAP
#DIM DYNAMIC _ID
#DIM DYNAMIC CAPACITY
#DIM DYNAMIC USER_COUNT
#DIM DYNAMIC BTN_ID

CALL WndMgr_VacantId()
WINDOW_ID = RESULT

CALL HO_GET_ROOM_NAME(HO_EDIT_選択中ルームIDX)
ROOM_NAME = %RESULTS%
CALL WndMgr_CreateWindow(WINDOW_ID, 80, 0, WND_WIDTH, WND_HEIGHT, 2)
CALL WndMgr_WindowTitle( WINDOW_ID, ROOM_NAME)
CALL HO_GET_MAPDATA(HO_有効マップID, HO_EDIT_選択中ルームIDX, "ROOM_ID")
ROOM_ID = RESULT
CALL HO_GET_ROOM_DATA(ROOM_ID, "ROOM_CAPACITY")
ROOM_CAP = RESULT
FOR MODULE_SLOT_IDX, 0, ROOM_CAP
    BTN_ID = MODULE_SLOT_IDX + HO_モジュールボタンID
    CALL HO_GET_MODULE_ID2(HO_EDIT_選択中ルームIDX, MODULE_SLOT_IDX)
    IF RESULT != -1
        MODULE_ID = RESULT
        CALL HO_GET_MODULE_DATA(MODULE_ID, "MODULE_NAME")
        CALL WndMgr_TextSet(WINDOW_ID, L_CNT, @"@B:{BTN_ID}@◇ [%RESULTS%]@/B@")
    ELSE
        CALL WndMgr_TextSet(WINDOW_ID, L_CNT, @"@C:{カラー_選択不可}@@B:{BTN_ID}@◇ [------]@/B@@/C@")
    ENDIF
    L_CNT ++
    ;CALL HO_STR_MODULE_CAPACITY_INDICATOR(MODULE_IDX)
    ;CALL WndMgr_TextSet(WINDOW_ID, L_CNT, @"%RESULTS%")
    L_CNT ++
NEXT
RETURN

@HO_EDIT_SET_MAP_WINDOW_TEXT(WINDOW_ID, ROOM_IDX)
#DIM WINDOW_ID
#DIM ROOM_IDX
#DIM  DYNAMIC BTN_ID
#DIMS DYNAMIC ROOM_NAME
#DIM  DYNAMIC ROOM_ID
#DIM  DYNAMIC FCOL
CALL HO_GET_ROOM_NAME(ROOM_IDX)
ROOM_NAME = %RESULTS%
CALL HO_GET_ROOM_ID(ROOM_IDX)
ROOM_ID = RESULT
IF ROOM_IDX == HO_EDIT_選択中ルームIDX
    FCOL = カラー_選択中
ELSEIF ROOM_ID == 0
    FCOL = カラー_選択不可
ELSE
    FCOL = カラー_白
ENDIF
BTN_ID = ROOM_IDX + HO_マップボタンID
LOCALS = %TAG_PRINT_SHAPE(@"@C:{FCOL}@@B:{BTN_ID}@[%ROOM_NAME%]@/B@@/C@", 12, 1, 2)%
CALL WndMgr_TextSet(WINDOW_ID, 0, LOCALS)

@HO_EDIT_SAVE_MAPDATA_TO_FILE
#DIMS DYNAMIC SAVESTRING

FOR LOCAL, 0, HO_MAX_ROOMNUM
    SAVESTRING += @"_DIC_HO_MAPDATA:MAP_ID:{LOCAL}"
    SAVESTRING += "  '= "
    SAVESTRING += @"\"%_DIC_HO_MAPDATA:HO_有効マップID:LOCAL%\""
    SAVESTRING += "\n"
NEXT
SAVETEXT SAVESTRING, 0
PRINTFORMW "sav/txt00.txtにマップデータを出力しました"


code:
;-------------------------------------------------
;売春処理
;@HO_TURN_END_EVENT から呼ばれる
;-------------------------------------------------
; #region @HO_GUEST_BUY_PROSTITUTE
@HO_GUEST_BUY_PROSTITUTE(BUYER_ID, SELLER_ID = -1, FORCE_BUY = 0)
#DIM  BUYER_ID
#DIM  SELLER_ID
#DIM  FORCE_BUY
#DIMS DYNAMIC _LIST_ITEM
#DIMS DYNAMIC _LIST_PROSTITUTE_SELLERS
#DIMS DYNAMIC _LIST_PROSTITUTE_BUYERS
#DIMS DYNAMIC _LIST_SELLERS
#DIMS DYNAMIC _LIST_BUYERS

#DIM  DYNAMIC MODULE_ID
#DIMS DYNAMIC MODULE_NAME
#DIM  DYNAMIC CHARA_IDX
#DIM  DYNAMIC CAPACITY
#DIM  DYNAMIC USER_COUNT
#DIMS DYNAMIC _LIST_MODULE
#DIMS DYNAMIC _LIST_MODULE_OPTIONS
#DIMS DYNAMIC _LIST_FOLLOWERS
#DIM DYNAMIC NEGOTIATION_POINT
#DIM DYNAMIC NEGOTIATION_RATE
#DIMS DYNAMIC _LIST_NEGOTIATION_RATE
#DIM  DYNAMIC SERVICE_CATEGORY
#DIMS DYNAMIC OFFERING
#DIM  DYNAMIC TARGET_ID
#DIMS DYNAMIC MODULE_INFO
#DIM  DYNAMIC MODULE_SLOT_IDX
#DIM  DYNAMIC ROOM_IDX
#DIM  DYNAMIC PROFIT
#DIM  DYNAMIC PROFIT_SUM
#DIMS  DYNAMIC _LIST_PROFIT

;欲情によって実施確率上昇
IF IS_ESTRUS(BUYER_ID, 3)
    SIF RAND:100 > 60
        RETURN 0
ELSE
    SIF RAND:100 > 30
        RETURN 0
ENDIF

;売春中のキャラ一覧を取得
CALL HO_FIND_CHARA("ACTION", "売春中")
_LIST_PROSTITUTE_SELLERS = %RESULTS%
;MASTERは娼館にいれば売春可能
CALL HO_CHECK_USE_MODULE_USAGE(MASTER, "娼館")
SIF RESULT
    _LIST_PROSTITUTE_SELLERS = %LIST_ADD(_LIST_PROSTITUTE_SELLERS, TOSTR(MASTER))%

;売春中のキャラが存在しない場合
SIF !LIST_COUNT(_LIST_PROSTITUTE_SELLERS)
    RETURN 0

;売春中のキャラからランダムで対象を2人まで選出
FOR LOCAL, 0, MIN(LIST_COUNT(_LIST_PROSTITUTE_SELLERS), 2)
    SELLER_ID = TOINT(LIST_RAND(_LIST_PROSTITUTE_SELLERS))
    ; キャラが重複した場合は対象に選出しない
    SIF  LIST_INDEXOF(_LIST_SELLERS, TOSTR(SELLER_ID)) >= 0
        CONTINUE
    ;売買春キャラ同士に性的関係が成立する必要がある
    SIF !IS_SEXUAL(BUYER_ID, SELLER_ID)
        CONTINUE
    _LIST_SELLERS = %LIST_ADD(_LIST_SELLERS, TOSTR(SELLER_ID))%
NEXT

;選出キャラが存在しない場合
SIF !LIST_COUNT(_LIST_SELLERS)
    RETURN 0
;MASTERがリストの0番目に来るように並び替える
_LIST_SELLERS = %LIST_SORT(_LIST_SELLERS)%

;同行中キャラを売春対象に選出
IF LIST_GETINT(_LIST_SELLERS, 0) == MASTER && HO_同行者数 > 0
    CALL HO_GET_FOLLOWER_LIST
    _LIST_FOLLOWERS = %RESULTS%
    _LIST_SELLERS = %LIST_ADDLIST(_LIST_SELLERS, _LIST_FOLLOWERS)%
ENDIF

;買春中のキャラからランダムで対象を3人まで選出
_LIST_BUYERS= %LIST_ADD(_LIST_BUYERS, TOSTR(BUYER_ID))%
;買春中のキャラ一覧を取得
CALL HO_FIND_CHARA("ACTION", "買春中")
_LIST_PROSTITUTE_BUYERS = %RESULTS%
FOR LOCAL, 0, MIN(LIST_COUNT(_LIST_PROSTITUTE_BUYERS), 2)
    LOCALS = %LIST_RAND(_LIST_PROSTITUTE_BUYERS)%
    ;選出済のキャラと重複しなかった場合
    IF LIST_INDEXOF(_LIST_BUYERS, LOCALS) == -1
        ;売買春キャラ同士に性的関係が成立する必要がある
        FOR LOCAL:1, 0, LIST_COUNT(_LIST_SELLERS)
            TARGET_ID = TOINT(LIST_GET(_LIST_SELLERS, LOCAL))
            SIF !IS_SEXUAL(TOINT(LOCALS), TARGET_ID)
                BREAK
            ;最終ループに到達
            SIF LOCAL:1 == LIST_COUNT(_LIST_SELLERS) -1
                _LIST_BUYERS= %LIST_ADD(_LIST_BUYERS, LOCALS)%
        NEXT
    ENDIF
NEXT

;売春中のキャラの提供サービス(春をひさぐコマンドで選択)
SELECTCASE COM_OPTION:300
    CASE 0
        OFFERING '= ""
    CASE 1
        OFFERING '= "売春_自慰"
    CASE 2
        OFFERING '= "売春_愛撫"
    CASE 3
        OFFERING '= "売春_手淫"
    CASE 4
        OFFERING '= "売春_口淫"
    CASE 5
        OFFERING '= "売春_本番"
    CASE 6
        OFFERING '= "売春_ＳＭ"
    CASE 7
        OFFERING '= "売春_乱交"
    CASEELSE
        OFFERING '= ""
ENDSELECT

; 乱交条件を満たさない場合
SIF OFFERING == "売春_乱交" && (LIST_COUNT(_LIST_SELLERS) + LIST_COUNT(_LIST_BUYERS) <= 2)
    RETURN 0

;買春で使用する設備を決定する
;-------------------------------------------------
CALL HO_GET_CHARAIDX(BUYER_ID)
CHARA_IDX = RESULT
CALL HO_GET_CHARADATA(CHARA_IDX, "ROOM_IDX")
ROOM_IDX = RESULT
CALL HO_GET_MAPDATA(HO_有効マップID, ROOM_IDX, "MODULE_SLOT")
_LIST_MODULE = %RESULTS%

;利用可能な設備をチェックし候補リストに登録
FOR MODULE_SLOT_IDX, 0, LIST_COUNT(_LIST_MODULE)
    CALL HO_GET_MODULE_ID2(ROOM_IDX, MODULE_SLOT_IDX)
    MODULE_ID = RESULT
    CALL HO_GET_MODULE_DATA(MODULE_ID, "用途")
    MODULE_INFO = %RESULTS%
    IF LIST_INDEXOF(MODULE_INFO, "売春") >= 0
        CALL HO_GET_MODULE_DATA(MODULE_ID, "属性")
        MODULE_INFO = %RESULTS%
        IF LIST_INDEXOF(MODULE_INFO, "グローリーホール") >= 0
            ;買春者がペニスを持たない場合はグローリーホールを利用不可
            SIF !HAS_PENIS(BUYER_ID)
                CONTINUE
            ;手淫または口淫以外ではグローリーホールを利用不可
            SIF OFFERING == "売春_自慰" || OFFERING == "売春_愛撫" || OFFERING == "売春_本番" || OFFERING == "売春_ＳＭ" || OFFERING == "売春_自慰"
                CONTINUE
        ENDIF
        ; 設備のキャパシティと利用者数を確認
        CALL HO_CHECK_MODULE_CAPACITY(ROOM_IDX, MODULE_SLOT_IDX)
        CAPACITY = RESULT
        USER_COUNT = RESULT:1
        CALL HO_GET_MODULE_DATA(MODULE_ID, "MODULE_NAME")
        MODULE_NAME = %RESULTS%

        ;属性 個室を含み、キャラが存在する場合は利用不可
        IF LIST_INDEXOF(MODULE_INFO, "個室") >= 0 &&  USER_COUNT > 0
            CALL HO_CHECK_USE_MODULE_USAGE(MASTER, "娼館")
            SIF RESULT
                CALLF TAG_PRINT(@"@C:{カラー_シルバー}@%MODULE_NAME%は利用中だ@/C@", 1)
            PRINTL
            CONTINUE
        ENDIF
        ;定員オーバーの場合は利用不可
        USER_COUNT = LIST_COUNT(_LIST_SELLERS) + LIST_COUNT(_LIST_BUYERS)
        IF CAPACITY < USER_COUNT
            CALL HO_CHECK_USE_MODULE_USAGE(MASTER, "娼館")
            SIF RESULT
                CALLF TAG_PRINT(@"@C:{カラー_シルバー}@%ANAME(BUYER_ID)%は{USER_COUNT}名で交わろうとしたが、%MODULE_NAME%の広さが足りない@/C@", 1)
            PRINTL
            CONTINUE
        ENDIF
        _LIST_MODULE_OPTIONS = %LIST_ADD(_LIST_MODULE_OPTIONS, TOSTR(MODULE_SLOT_IDX))%
    ENDIF
NEXT

IF LIST_COUNT(_LIST_MODULE_OPTIONS) > 0
    CALL LIST_SHUFFLE(_LIST_MODULE_OPTIONS)
ELSE
    RETURN 0
ENDIF

;売春で使用する設備を選択
MODULE_SLOT_IDX = TOINT(LIST_GET(_LIST_MODULE_OPTIONS, 0))
CALL HO_GET_MODULE_ID2(ROOM_IDX, MODULE_SLOT_IDX)
MODULE_ID = RESULT
CALL HO_GET_MODULE_DATA(MODULE_ID, "属性")
MODULE_INFO = %RESULTS%

;奉仕カテゴリ決定
;-------------------------------------------------
IF OFFERING == "売春_自慰"
    SELECTCASE RAND(2)
    CASE 0
        SERVICE_CATEGORY = 奉仕_自慰
    CASEELSE
        SERVICE_CATEGORY = 奉仕_見抜き
    ENDSELECT
ELSEIF OFFERING == "売春_愛撫"
    SERVICE_CATEGORY =  奉仕_愛撫
ELSEIF OFFERING == "売春_手淫" && HAS_PENIS(BUYER_ID)
    SELECTCASE RAND(2)
    CASE 0
        SERVICE_CATEGORY =  奉仕_手淫
    CASEELSE
        SERVICE_CATEGORY =  奉仕_手コキのみ
    ENDSELECT
ELSEIF OFFERING == "売春_口淫" && HAS_PENIS(BUYER_ID)
    SELECTCASE RAND(3)
    CASE 0
        SERVICE_CATEGORY = 奉仕_口淫
    CASE 1
        SERVICE_CATEGORY = 奉仕_手コキフェラ
    CASEELSE
        SERVICE_CATEGORY =  奉仕_パイズリ
    ENDSELECT
ELSEIF OFFERING == "売春_本番" && (HAS_VAGINA(SELLER_ID) || HAS_PENIS(SELLER_ID))
    SELECTCASE RAND(6)
    CASE 0
        SERVICE_CATEGORY = 奉仕_Ｖ性交
    CASE 1
        SERVICE_CATEGORY = 奉仕_騎乗位のみ
    CASEELSE
        SERVICE_CATEGORY = 奉仕_通常
    ENDSELECT
ELSEIF OFFERING == "売春_ＳＭ"
    SERVICE_CATEGORY =  奉仕_ＳＭ
ELSE
    SELECTCASE RAND(100)
        CASE IS <15
            SELECTCASE RAND(2)
                CASE 0
                    SERVICE_CATEGORY = 奉仕_自慰
                CASEELSE
                    SERVICE_CATEGORY = 奉仕_見抜き
            ENDSELECT
        CASE IS <30
            SERVICE_CATEGORY =  奉仕_愛撫
        CASE IS <45 && HAS_PENIS(BUYER_ID)
            SELECTCASE RAND(5)
                CASE 0
                    SERVICE_CATEGORY = 奉仕_口淫
                CASE 1
                    SERVICE_CATEGORY = 奉仕_手コキフェラ
                CASE 2
                    SERVICE_CATEGORY =  奉仕_手淫
                CASE 3
                    SERVICE_CATEGORY =  奉仕_手コキのみ
                CASEELSE
                    SERVICE_CATEGORY =  奉仕_パイズリ
            ENDSELECT
        CASE IS <60 && HAS_VAGINA(SELLER_ID, 1)
            SELECTCASE RAND(2)
                CASE 0
                    SERVICE_CATEGORY = 奉仕_Ｖ性交
                CASEELSE
                    SERVICE_CATEGORY = 奉仕_騎乗位のみ
            ENDSELECT
        CASE IS <75
            IF HAS_VAGINA(SELLER_ID) || HAS_PENIS(SELLER_ID)
                SERVICE_CATEGORY = 奉仕_通常
            ELSE
                SERVICE_CATEGORY = 奉仕_愛撫
            ENDIF
        CASE IS <95
            SERVICE_CATEGORY =  奉仕_ＳＭ
        CASEELSE
            SERVICE_CATEGORY =  奉仕_Ａ性交
    ENDSELECT
ENDIF

SIF LIST_INDEXOF(MODULE_INFO, "グローリーホール") >= 0
    SERVICE_CATEGORY = 奉仕_手コキフェラ

;利益算出処理
;-------------------------------------------------
FOR LOCAL, 0, LIST_COUNT(_LIST_SELLERS)
    SELLER_ID = TOINT(LIST_GET(_LIST_SELLERS, LOCAL))
    PROFIT = CALC_SERVICE_CATEGORY_PRICE(SERVICE_CATEGORY)
    CALL SKILL_GET_LEVEL(SELLER_ID, スキル_大分類_性技, "SEDUCTION")
    PROFIT = FTIMES(PROFIT, 100 + RESULT * 10)

    PROFIT = FTIMES(PROFIT, 100 + ABL:SELLER_ID:性技 * 5)
    PROFIT = FTIMES(PROFIT, 100 + ABL:SELLER_ID:奉仕 * 5)
    SIF GROUPMATCH(SERVICE_CATEGORY, 奉仕_Ｖ性交, 奉仕_騎乗位のみ, 奉仕_通常, 奉仕_Ａ性交)
        PROFIT = FTIMES(PROFIT, 100 + ABL:SELLER_ID:性交 * 5)
    SIF GROUPMATCH(SERVICE_CATEGORY, 奉仕_自慰)
        PROFIT = FTIMES(PROFIT, 100 + ABL:SELLER_ID:自慰 * 5)
    SIF GROUPMATCH(SERVICE_CATEGORY, 奉仕_ＳＭ)
        PROFIT = FTIMES(PROFIT, 100 + ABL:SELLER_ID:マゾ * 5)

    SIF TALENT:SELLER_ID:処女 == 1
        PROFIT += 5000

    ;買春者の数だけ増額する。
    PROFIT *= LIST_COUNT(_LIST_BUYERS)

    SIF LIST_INDEXOF(MODULE_INFO, "個室") >= 0
        PROFIT += 1000

    NEGOTIATION_POINT = ABL:SELLER_ID:社交 - ABL:BUYER_ID:社交
    IF NEGOTIATION_POINT > 0
        NEGOTIATION_RATE = 100+RAND(NEGOTIATION_POINT)
    ELSEIF NEGOTIATION_POINT < 0
        NEGOTIATION_RATE = 100-RAND(ABS(NEGOTIATION_POINT))/2
    ELSE
        NEGOTIATION_RATE = 100
    ENDIF
    PROFIT =  FTIMES(PROFIT, NEGOTIATION_RATE)
    ;500単位で切り捨て
    PROFIT = PROFIT / 500 * 500
    _LIST_NEGOTIATION_RATE = %LIST_ADD(_LIST_NEGOTIATION_RATE, TOSTR(NEGOTIATION_RATE))%
    _LIST_PROFIT = %LIST_ADD(_LIST_PROFIT, TOSTR(PROFIT))%

    PROFIT_SUM += PROFIT
NEXT

;MASTERなら意思確認
IF TOINT(LIST_GET(_LIST_SELLERS, 0)) == MASTER
    PRINTFORM %ANAME(BUYER_ID)%は
    SIF LIST_COUNT(_LIST_BUYERS) == 2
        PRINTFORM 傍にいる%ANAME(TOINT(LIST_GET(_LIST_BUYERS, 1)))%と一緒に、
    PRINTFORM %ANAME(MASTER)%
    SIF LIST_COUNT(_LIST_SELLERS) == 2
        PRINTFORM と%ANAME(TOINT(LIST_GET(_LIST_SELLERS, 1)))%
    PRINTL の身体を買いたいと持ちかけてきた
    PRINTL 条件はこうだ
    PRINTFORM 　参加:
    FOR LOCAL, 0, LIST_COUNT(_LIST_SELLERS)
        LOCALS = %LIST_GET(_LIST_SELLERS, LOCAL)%
        SIF LOCAL >0
            PRINT ,
        PRINTFORM %ANAME(TOINT(LOCALS))%
    NEXT
    PRINT  <-
    FOR LOCAL, 0, LIST_COUNT(_LIST_BUYERS)
        LOCALS = %LIST_GET(_LIST_BUYERS, LOCAL)%
        SIF LOCAL >0
            PRINT ,
        PRINTFORM %ANAME(TOINT(LOCALS))%
    NEXT
    PRINTFORML  (売{LIST_COUNT(_LIST_SELLERS)}人:買{LIST_COUNT(_LIST_BUYERS)}人)

    CALL HO_GET_MODULE_DATA(MODULE_ID, "MODULE_NAME")
    PRINTFORM 　場所: %RESULTS%
    SIF LIST_INDEXOF(MODULE_INFO, "個室") >= 0
        PRINT  (個室)
    PRINTL
    PRINTFORML 　内容: %GET_SERVICE_CATEGORY_NAME(SERVICE_CATEGORY, 1)%
    PRINTFORML 　金額: 合計%TOSTR(PROFIT_SUM, "#,##0")%ディナリ
    SETCOLOR カラー_シルバー
    FOR LOCAL, 0, LIST_COUNT(_LIST_SELLERS)
        SELLER_ID = TOINT(LIST_GET(_LIST_SELLERS, LOCAL))
        IF LOCAL == 0
            PRINT 　内訳:
        ELSE
            PRINT
        ENDIF
        PRINTFORM  %GET_SERVICE_CATEGORY_NAME(SERVICE_CATEGORY, 0)%({CALC_SERVICE_CATEGORY_PRICE(SERVICE_CATEGORY)})
        CALL SKILL_GET_LEVEL(SELLER_ID, スキル_大分類_性技, "SEDUCTION")
        PRINTFORM  * 誘蛾の色香LV{RESULT}(1.%TOSTR(RESULT*10,"00")%)
        PRINTFORM  * 性技Lv{ABL:SELLER_ID:性技}(1.%TOSTR(ABL:SELLER_ID:性技*5,"00")%)
        PRINTFORM  * 奉仕Lv{ABL:SELLER_ID:奉仕}(1.%TOSTR(ABL:SELLER_ID:奉仕*5,"00")%)
        SIF GROUPMATCH(SERVICE_CATEGORY, 奉仕_Ｖ性交, 奉仕_騎乗位のみ, 奉仕_通常, 奉仕_Ａ性交)
            PRINTFORM  * 性交Lv{ABL:SELLER_ID:性交}(1.%TOSTR(ABL:SELLER_ID:性交*5,"00")%)
        SIF GROUPMATCH(SERVICE_CATEGORY, 奉仕_自慰)
            PRINTFORM  * 自慰Lv{ABL:SELLER_ID:自慰}(1.%TOSTR(ABL:SELLER_ID:自慰*5,"00")%)
        SIF GROUPMATCH(SERVICE_CATEGORY, 奉仕_ＳＭ)
            PRINTFORM  * マゾLv{ABL:SELLER_ID:マゾ}(1.%TOSTR(ABL:SELLER_ID:マゾ*5,"00")%)
        SIF TALENT:SELLER_ID:処女 == 1
            PRINT  + 処女(5000)
        SIF LIST_INDEXOF(MODULE_INFO, "個室") >= 0
            PRINT  + 個室(1000)
        NEGOTIATION_RATE = TOINT(LIST_GET(_LIST_NEGOTIATION_RATE,LOCAL))
        SIF LIST_COUNT(_LIST_BUYERS) >= 2
            PRINTFORM  * 買春者{LIST_COUNT(_LIST_BUYERS)}名({LIST_COUNT(_LIST_BUYERS)})
        PRINTFORM  * 交渉結果_社交Lv{ABL:SELLER_ID:社交}({NEGOTIATION_RATE/100}.%TOSTR(NEGOTIATION_RATE%100,"00")%)
        PRINTFORML  -> %TOSTR(TOINT(LIST_GET(_LIST_PROFIT, LOCAL)), "#,##0")% (%ANAME(SELLER_ID)%)
    NEXT
    RESETCOLOR
    PRINTFORML さて、どうしたものだろうか……
    PRINTL

    CALL ASK_YN("身体を売る","断る")
    IF RESULT
        RETURN 0
        PRINTL
    ELSE
        ;同行者がいる場合、同行者も合意ありかつ娼婦の条件を満たしている必要がある
        IF HO_同行者数 > 0
            FOR LOCAL, 0, HO_同行者数
                TARGET_ID = LIST_GETINT(_LIST_FOLLOWERS, LOCAL)
                IF !TALENT:TARGET_ID:合意 || !CAN_PROSTITUTE(TARGET_ID)
                    PRINTFORMW %ANAME(MASTER)%は同意したもの、同行している%ANAME(TARGET_ID)%に激しく拒絶されてしまった……
                    RETURN 0
                ENDIF
            NEXT
        ENDIF
    ENDIF
ENDIF

TFLAG:奉仕カテゴリ = SERVICE_CATEGORY
IF TOINT(LIST_GET(_LIST_SELLERS, 0)) == MASTER
    FLAG:ウフフフラグ = 1
    FLAG:調教モード = 調教_逆調教通常
    TFLAG:売春フラグ = 1
    TFLAG:奉仕モード = 1
    TFLAG:調教継続時間 = 120
    TFLAG:調教開始時刻 = HO_TIME
    ;買う側
    FOR LOCAL, 0, LIST_COUNT(_LIST_BUYERS)
        TARGET_ID = TOINT(LIST_GET(_LIST_BUYERS, LOCAL))
        TCVAR:TARGET_ID:買春参加者 = 1
        TCVAR:TARGET_ID:買春相手ID = MASTER
        TCVAR:TARGET_ID:被奉仕者フラグ = 1
        CALL HO_ADD_COMPANION(TARGET_ID,,1)
    NEXT
    ;売る側
    FOR LOCAL, 0, LIST_COUNT(_LIST_SELLERS)
        TARGET_ID = TOINT(LIST_GET(_LIST_SELLERS, LOCAL))
        TCVAR:TARGET_ID:売春参加者 = 1
        TCVAR:TARGET_ID:売春相手ID = BUYER_ID
        TCVAR:TARGET_ID:奉仕者フラグ = 1
        SEXUAL_PREFERENCE_EXP:TARGET_ID:性的嗜好_春を売りたい += 3
        EXP:TARGET_ID:売春経験 += 3
        SIF TARGET_ID != MASTER && LIST_INDEXOF(_LIST_FOLLOWERS, TOSTR(TARGET_ID)) < 0
            CALL HO_ADD_COMPANION(TARGET_ID,,1)
    NEXT
    CALL HO_MASTER_STOP_USE_MODULE()
    CALL HO_MASTER_USE_MODULE(ROOM_IDX, MODULE_SLOT_IDX)
    CALL HO_PRESERVE_PRETRAIN_STATUS()
ELSE
    ;買う側
    FOR LOCAL, 0, LIST_COUNT(_LIST_BUYERS)
        TARGET_ID = TOINT(LIST_GET(_LIST_BUYERS, LOCAL))
        TCVAR:TARGET_ID:買春参加者 = 1
        TCVAR:TARGET_ID:買春相手ID = TOINT(LIST_GET(_LIST_SELLERS, 0))
        TCVAR:TARGET_ID:被奉仕者フラグ = 1
        TCVAR:TARGET_ID:HO作業進捗量 = 0
        TCVAR:TARGET_ID:行動待機時間 = 120
        CALL HO_SET_CHARADATA_BY_ID(TARGET_ID, "ACTION", "逢瀬中")
        CALL HO_STOP_USE_MODULE(TARGET_ID)
        CALL HO_USE_MODULE(TARGET_ID, ROOM_IDX, MODULE_SLOT_IDX)
    NEXT
    ;売る側
    FOR LOCAL, 0, LIST_COUNT(_LIST_SELLERS)
        TARGET_ID = TOINT(LIST_GET(_LIST_SELLERS, LOCAL))
        TCVAR:TARGET_ID:売春参加者 = 1
        TCVAR:TARGET_ID:売春相手ID = BUYER_ID
        TCVAR:TARGET_ID:奉仕者フラグ = 1
        TCVAR:TARGET_ID:HO作業進捗量 = 0
        TCVAR:TARGET_ID:行動待機時間 = 120
        EXP:TARGET_ID:売春経験 += 3
        SEXUAL_PREFERENCE_EXP:TARGET_ID:性的嗜好_春を売りたい += 3
        CALL HO_SET_CHARADATA_BY_ID(TARGET_ID, "ACTION", "逢瀬中")
        CALL HO_STOP_USE_MODULE(TARGET_ID)
        CALL HO_USE_MODULE(TARGET_ID, ROOM_IDX, MODULE_SLOT_IDX)
    NEXT
ENDIF

MONEY += PROFIT_SUM

;ログ出力
IF TOINT(LIST_GET(_LIST_SELLERS, 0)) == MASTER
    CALL FL_PLAYSE("Bell_0.mp3")
    IF LIST_COUNT(_LIST_BUYERS) > 1
        CALLF TAG_PRINT(@"@C:{カラー_ピンク}@♡%ANAME(MASTER)% has sodl to %ANAME(BUYER_ID)% for %TOSTR(PROFIT_SUM, "###,##0")% Denari@/C@", 1)
    ELSE
        CALLF TAG_PRINT(@"@C:{カラー_ピンク}@♡%ANAME(MASTER)% has sold to %ANAME(BUYER_ID)% for %TOSTR(PROFIT_SUM, "###,##0")% Denari@/C@", 1)
    ENDIF
    WAIT
ENDIF
IF LIST_COUNT(_LIST_BUYERS) > 1
    CALL HO_PRINT_LOG(@"@C:{カラー_ピンク}@♡%ANAME(TOINT(LIST_GET(_LIST_SELLERS, 0)))% has sold to %ANAME(BUYER_ID)% for %TOSTR(PROFIT_SUM, "###,##0")% Denari@/C@")
ELSE
    CALL HO_PRINT_LOG(@"@C:{カラー_ピンク}@♡%ANAME(TOINT(LIST_GET(_LIST_SELLERS, 0)))% has sold %ANAME(BUYER_ID)% for %TOSTR(PROFIT_SUM, "###,##0")% Denari@/C@")
ENDIF

RETURN 1
; #endregion

;-------------------------------------------------
;奉仕カテゴリから奉仕カテゴリ名を取得
;-------------------------------------------------
@GET_SERVICE_CATEGORY_NAME(CATEGORY_NUM, SHOW_SHOW_DETAIL = 0)
#FUNCTIONS
#DIM CATEGORY_NUM
#DIM SHOW_SHOW_DETAIL

SELECTCASE CATEGORY_NUM
    CASE 奉仕_通常
        RESULTS = 奉仕_フリー
        SIF SHOW_SHOW_DETAIL == 1
            RESULTS +=  @"(%ANAME(MASTER)% let his body free)"
    CASE 奉仕_口淫
        RESULTS = 奉仕_口淫
        SIF SHOW_SHOW_DETAIL == 1
            RESULTS += " (You will be served by your mouth)"
    CASE 奉仕_手淫
        RESULTS = 奉仕_手淫
        SIF SHOW_SHOW_DETAIL == 1
            RESULTS += "(You will be served by hand)"
    CASE 奉仕_足コキ
        RESULTS = 奉仕_足コキ
        SIF SHOW_SHOW_DETAIL == 1
            RESULTS += "(You will be served with your feet)"
    CASE 奉仕_自慰
        RESULTS = 奉仕_自慰
        SIF SHOW_SHOW_DETAIL == 1
            RESULTS += "(You will be masturbated)"
    CASE 奉仕_ＳＭ
        RESULTS = 奉仕_ＳＭ
        SIF SHOW_SHOW_DETAIL == 1
            RESULTS += @"(%ANAME(MASTER)% will endure SM)"
    CASE 奉仕_Ｖ性交
        RESULTS = 奉仕_Ｖ性交
        SIF SHOW_SHOW_DETAIL == 1
            RESULTS += @"(%ANAME(MASTER)% wants to get V)"
    CASE 奉仕_Ａ性交
        RESULTS = 奉仕_Ａ性交
        SIF SHOW_SHOW_DETAIL == 1
            RESULTS += @"(%ANAME(MASTER)% wants to get A)"
    CASE 奉仕_手コキフェラ
        RESULTS = 奉仕_手コキフェラ
        SIF SHOW_SHOW_DETAIL == 1
            RESULTS += "(You will be served with your mouth and hand)"
    CASE 奉仕_見抜き
        RESULTS = 奉仕_見抜き
        SIF SHOW_SHOW_DETAIL == 1
            RESULTS += @"(%ANAME(MASTER)% will be masturbated while watching)"
    CASE 奉仕_愛撫
        RESULTS = 奉仕_愛撫
        SIF SHOW_SHOW_DETAIL == 1
            RESULTS += @"(%ANAME(MASTER)% will have his body touched)"
    CASE 奉仕_手コキのみ
        RESULTS = 奉仕_手コキのみ
        SIF SHOW_SHOW_DETAIL == 1
            RESULTS +="(You will be served by hand)"
    CASE 奉仕_フェラのみ
        RESULTS = 奉仕_フェラのみ
        SIF SHOW_SHOW_DETAIL == 1
            RESULTS += "(You will be served by your mouth)"
    CASE 奉仕_騎乗位のみ
        RESULTS = 奉仕_騎乗位のみ
        SIF SHOW_SHOW_DETAIL == 1
            RESULTS += "(You will be served in the vagina hole)"
    CASE 奉仕_パイズリ
        RESULTS = 奉仕_パイズリ
        SIF SHOW_SHOW_DETAIL == 1
            RESULTS += "(You will be served with the breast)"
    CASEELSE
        RESULTS = 奉仕
ENDSELECT

RETURNF RESULTS

;-------------------------------------------------
;奉仕カテゴリから奉仕カテゴリ別の金額を取得
;-------------------------------------------------
@CALC_SERVICE_CATEGORY_PRICE(CATEGORY_NUM)
#FUNCTION
#DIM CATEGORY_NUM

SELECTCASE CATEGORY_NUM
    CASE 奉仕_通常
        RESULT = 1000
    CASE 奉仕_口淫
        RESULT = 500
    CASE 奉仕_手淫
        RESULT = 300
    CASE 奉仕_足コキ
        RESULT = 300
    CASE 奉仕_自慰
        RESULT = 200
    CASE 奉仕_ＳＭ
        RESULT = 1000
    CASE 奉仕_Ｖ性交
        RESULT = 1000
    CASE 奉仕_Ａ性交
        RESULT = 1000
    CASE 奉仕_手コキフェラ
        RESULT = 500
    CASE 奉仕_見抜き
        RESULT = 100
    CASE 奉仕_愛撫
        RESULT = 300
    CASE 奉仕_手コキのみ
        RESULT = 200
    CASE 奉仕_フェラのみ
        RESULT = 500
    CASE 奉仕_騎乗位のみ
        RESULT = 1000
    CASE 奉仕_パイズリ
        RESULT = 500
    CASEELSE
        RESULT = 100
ENDSELECT

RETURNF RESULT

;-------------------------------------------------
;覗き見処理
;-------------------------------------------------
@HO_CHECK_PEEPING(ROOM_IDX, MODULE_IDX)
#DIM  ROOM_IDX
#DIM  MODULE_IDX
#DIM  MODULE_LIST_IDX
#DIMS DYNAMIC _LIST_CHARA
#DIM  DYNAMIC CHARA_ID

CALL HO_GET_MODULE_USE_MEMBER(ROOM_IDX, MODULE_IDX)
_LIST_CHARA = %RESULTS%

IF !LIST_COUNT(_LIST_CHARA)
    RETURN 0
ENDIF

FOR LOCAL, 0, LIST_COUNT(_LIST_CHARA)
    CHARA_ID = TOINT(LIST_GET(_LIST_CHARA, LOCAL))
    CALL HO_GET_CHARAACT(CHARA_ID)
    IF RESULTS == "逢瀬中"
        CONTINUE
    ELSE
        RETURN 0
    ENDIF
NEXT

CALL PRINT_TITLE("Peeping", "エロイベント")
PRINTFORML A faint pant voice and water sound are heard from the back. Apparently it seems to be in the middle of a secret ...
PRINTFORML It seems that you can take a peek ...?
PRINTL
CALL ASK_YN("Peep", "Go away")
PRINTL
IF RESULT
    PRINTL
    PRINTFORMW ...... Lets stop getting in the way
    PRINTL
    RETURN 2
ENDIF

IF HO_同行者数 > 0
    PRINTL
    PRINTFORMW ...... There are also accompanying peoples eyes. Lets stop
    PRINTL
    RETURN 2
ENDIF

FOR LOCAL, 0, LIST_COUNT(_LIST_CHARA)
    CHARA_ID = TOINT(LIST_GET(_LIST_CHARA, LOCAL))
    TFLAG:参加者数 ++
    CFLAG:CHARA_ID:調教参加フラグ  = 1
    TCVAR:CHARA_ID:覗き見対象 = 1
    ;売春/買春の場合
    IF TCVAR:CHARA_ID:売春参加者
        TCVAR:CHARA_ID:奉仕者フラグ = 1
    ELSEIF TCVAR:CHARA_ID:買春参加者
        TCVAR:CHARA_ID:被奉仕者フラグ = 1
    ;カップルの場合
    ELSEIF TCVAR:CHARA_ID:奉仕者フラグ == 0 && TCVAR:CHARA_ID:被奉仕者フラグ == 0
        TCVAR:CHARA_ID:奉仕者フラグ = 1
        TCVAR:(CFLAG:CHARA_ID:カップル相手キャラID):被奉仕者フラグ = 1
    ENDIF
NEXT
CALL HO_MASTER_STOP_USE_MODULE()
CALL HO_GET_MODULE_LIST_IDX(ROOM_IDX, MODULE_IDX)
MODULE_LIST_IDX = RESULT

FLAG:調教モード = 調教_逆調教通常
FLAG:ウフフフラグ = 1
TFLAG:覗き見モード = 1
TFLAG:覗き見対象設備IDX = MODULE_LIST_IDX
TFLAG:奉仕モード = 1
TFLAG:調教継続時間 = 90
CALL HO_PRESERVE_PRETRAIN_STATUS()
TFLAG:調教開始時刻 = HO_TIME
TCVAR:MASTER:離脱フラグ = 離脱フラグ_一時離脱

PRINTL
PRINTFORMW %ANAME(MASTER)% secretly looked into the place of affair ...
PRINTL

RETURN 1

;-------------------------------------------------
;買春客生成処理
;-------------------------------------------------
@HO_CREATE_GUEST_BUY_PROSTITUTE
#DIMS DYNAMIC _LIST_CHARA
#DIM  DYNAMIC ROOM_IDX
#DIM  DYNAMIC CHARA_ID
#DIM  DYNAMIC SELLER_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
SELLER_ID = TOINT(LIST_GET(_LIST_CHARA, 0))
IF SELLER_ID != MASTER
    CALL HO_GET_CHARAPLACE(SELLER_ID)
    ROOM_IDX = RESULT
ELSE
    ROOM_IDX = HO_MASTER現在地
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)% came to buy some service@/C@")
    ;売春客は必ずスケベモブ
    CFLAG:CHARA_ID:スケベモブ = 1
    ;ゲストは3-4時間滞在する
    CFLAG:CHARA_ID:キャラ滞在時間 = RAND(36, 42) * HO_単位時間
    IF IS_FEMALE(CHARA_ID)
        CFLAG:CHARA_ID:汎用口上パターン = 1000
    ENDIF
    RETURN 1
ENDIF

RETURN 0

;-------------------------------------------------
; 情事乱入
;-------------------------------------------------
@HO_CHECK_FORCE_JOIN_UFUFU(CHARA_ID)
#DIM  CHARA_ID
#DIM  DYNAMIC CAN_FORCE_JOIN

;親愛による判定
{
    IF (ABL:CHARA_ID:欲望 >= 8 && GMATCH_FALLEN(CHARA_ID, "親愛"))
        || TCVAR:(CHARA_ID):媚薬 && IS_ESTRUS(CHARA_ID)
}
    CALL HO_CAN_FORCE_JOIN_UFUFU(CHARA_ID)
    CAN_FORCE_JOIN = RESULT
    IF !C_COND("素質:大人しい,素質:臆病,素質:プライド低い", "OR", CHARA_ID)
        IF CAN_FORCE_JOIN
            CALL COLOR_PRINTW(@"I witnessed a place of affair; %ANAME(CHARA_ID)% is breathing rough and broken!", カラー_ピンク)
            RETURN 1
        ELSE
            CALL COLOR_PRINTL(@"情事の現場を目撃した%ANAME(CHARA_ID)%は情事の場に押し入ろうとした……！", カラー_ピンク)
            CALL COLOR_PRINTW(@"しかし付け入る隙が無いのを見ると、%ANAME(MASTER)%を一瞥して立ち去っていった……", カラー_ピンク)
            RETURN 0
        ENDIF
    ELSE
        IF CAN_FORCE_JOIN
            CALL COLOR_PRINTL(@"物陰から%ANAME(CHARA_ID)%が様子を伺っている……。情事に耽る%ANAME(MASTER)%から目が離せないようだ……", カラー_ピンク)
            PRINTL
            PRINTFORML どうしたものだろう……
            CALL ASK_YN("呼びつける", "追い払う")
            IF !RESULT
                CALL COLOR_PRINTW(@"様子を伺う%ANAME(CHARA_ID)%を呼びつけると、申し訳無さそうにしながらも情事に加わってきた……！", カラー_ピンク)
                RETURN 1
            ELSE
                CALL COLOR_PRINTW(@"様子を覗き見ている%ANAME(CHARA_ID)%を追い払うと、逃げるように姿を消した……", カラー_ピンク)
                RETURN 0
            ENDIF
        ELSE
            CALL COLOR_PRINTW(@"情事の現場を目撃した%ANAME(CHARA_ID)%は気まずそうな顔をしている……", カラー_ピンク)
            RETURN 0
        ENDIF
    ENDIF
ENDIF
;隷属による判定
IF GMATCH_FALLEN(CHARA_ID, "SLAVE")
    CALL HO_CAN_FORCE_JOIN_UFUFU(CHARA_ID)
    CAN_FORCE_JOIN = RESULT
    IF CAN_FORCE_JOIN
        CALL COLOR_PRINTL(@"情事の現場を目撃した%ANAME(CHARA_ID)%は気まずそうな顔をしている……", カラー_ピンク)
        PRINTL
        PRINTFORML どうしたものだろう……
        CALL ASK_YN("呼びつける", "追い払う")
        IF !RESULT
            CALL COLOR_PRINTW(@"様子を伺う%ANAME(CHARA_ID)%にも身体を捧げるよう無理やり命じた……", カラー_ピンク)
            RETURN 1
        ELSE
            CALL COLOR_PRINTW(@"%ANAME(CHARA_ID)%を追い払うと、ホッとした様子で姿を消した……", カラー_ピンク)
            RETURN 0
        ENDIF
    ELSE
        CALL COLOR_PRINTW(@"情事の現場を目撃した%ANAME(CHARA_ID)%は気まずそうな顔をしている……", カラー_ピンク)
        RETURN 0
    ENDIF
ENDIF

CALL COLOR_PRINTW(@"情事の現場を目撃した%ANAME(CHARA_ID)%は気まずそうな顔をしている……", カラー_ピンク)
RETURN 0

;-------------------------------------------------
;乱入可能可否の判定
;-------------------------------------------------
@HO_CAN_FORCE_JOIN_UFUFU(CHARA_ID)
#DIM  CHARA_ID
#DIM  DYNAMIC ROOM_IDX
#DIM  DYNAMIC MODULE_ID
#DIM  DYNAMIC MODULE_SLOT_IDX

ROOM_IDX = HO_MASTER現在地
CALL HO_GET_MAPDATA(HO_有効マップID, ROOM_IDX, "MODULE_SLOT")
MODULE_ID = C_COND_MAP_GET(MASTER, "設備")

;設備を使用しているならキャパをチェックする
IF MODULE_ID != -1
    CALL HO_GET_MASTER_DATA("MODULE_USAGE")
    MODULE_SLOT_IDX = RESULT
    CALL HO_CHECK_MODULE_CAPACITY(ROOM_IDX, MODULE_SLOT_IDX)
    SIF RESULT < 1
        RETURN 0
ENDIF
;同行者数が上限に到達
IF HO_同行者数 == HO_同行者上限
    RETURN 0
ENDIF
RETURN 1

;-------------------------------------------------
;加入処理(@HO_CAN_FORCE_JOIN_UFUFU)で加入可能であることを判定済である前提
;-------------------------------------------------
@HO_FORCE_JOIN_UFUFU(CHARA_ID)
#DIM CHARA_ID
#DIM  DYNAMIC ROOM_IDX
#DIM  DYNAMIC MODULE_ID
#DIM  DYNAMIC MODULE_SLOT_IDX

ROOM_IDX = HO_MASTER現在地
CALL HO_GET_MAPDATA(HO_有効マップID, ROOM_IDX, "MODULE_SLOT")
MODULE_ID = C_COND_MAP_GET(MASTER, "設備")

IF MODULE_ID != -1
    CALL HO_GET_MASTER_DATA("MODULE_USAGE")
    MODULE_SLOT_IDX = RESULT
ENDIF

;設備を使用しているなら同じ設備を使わせる
CALL HO_ADD_COMPANION(CHARA_ID,,1)
CALL HO_STOP_USE_MODULE(CHARA_ID)
CALL HO_USE_MODULE(CHARA_ID, ROOM_IDX, MODULE_SLOT_IDX)

IF TFLAG:奉仕モード
    IF TCVAR:MASTER:奉仕者フラグ
        TCVAR:CHARA_ID:被奉仕者フラグ = TFLAG:奉仕カテゴリ
    ELSEIF TCVAR:MASTER:被奉仕者フラグ
        TCVAR:CHARA_ID:奉仕者フラグ = TFLAG:奉仕カテゴリ
    ELSE
        RETURN 0
    ENDIF
ENDIF