code:
;-------------------------------------------------
;家畜のあなた押し倒し判定
;@HOUSING_EVENTCOMEND から呼ばれる
;-------------------------------------------------
; #region @HO_CATTLE_PUSHDOWN_EVENT
@HO_CATTLE_PUSHDOWN_EVENT()
#DIM DYNAMIC CHARA_ID
#DIMS DYNAMIC プリセット名
#DIMS DYNAMIC モブ名
#DIM  DYNAMIC 奉仕側カテゴリ
#DIM  DYNAMIC 被奉仕側カテゴリ

;既にウフフ中なら実行しない
SIF FLAG:ウフフフラグ
    RETURN 0
;クールタイムがあるなら実行しない
SIF TCVAR:MASTER:押し倒しクールタイム > 0
    RETURN 0
;大体25%くらいでイベント発生
SIF RAND:4
    RETURN 0

;採集実行後の押し倒しイベント
SIF !HAS_SKILL(MASTER, "SEDUCTION", スキル_大分類_性技)
    RETURN 0

IF C_COND("設備用途:獣姦_馬",, MASTER)
    プリセット名 '= "馬"
    モブ名 '= "牡馬"
ELSEIF C_COND("設備用途:獣姦_豚",, MASTER)
    プリセット名 '= "豚"
    モブ名 '= "豚"
ELSEIF C_COND("設備用途:獣姦_ワーグ",, MASTER)
    プリセット名 '= "ワーグ"
    モブ名 '= "ワーグ"
ELSEIF C_COND("設備用途:触手",, MASTER)
    プリセット名 '= "触手"
    モブ名 '= "触手"
ELSE
    RETURN 0
ENDIF
;キャラ全員に誘蛾の色香が必要
FOR LOCAL, 0, MPLY_NUM
    CHARA_ID = MPLY:LOCAL
    SIF !HAS_SKILL(CHARA_ID, "SEDUCTION", スキル_大分類_性技)
        RETURN 0
NEXT
FOR LOCAL, 0, MTAR_NUM
    CHARA_ID = MTAR:LOCAL
    SIF !HAS_SKILL(CHARA_ID, "SEDUCTION", スキル_大分類_性技)
        RETURN 0
NEXT
SELECTCASE プリセット名
    CASE "触手"
        CALL COLOR_PRINTL(@"%TR(ANAME(MASTER),"が",C_COND_MAP_GETS(MASTER, "設備名"),"で作業をしていると、うねる",モブ名,"にすっかり取り囲まれてしまった")%", カラー_ピンク)
        CALL COLOR_PRINTW(@"%TR("鎌首をもたげる",モブ名,"の先端からは生臭い粘液が絶え間なく滴っている…")%", カラー_ピンク)
    CASEELSE
        CALL COLOR_PRINTL(@"%TR(ANAME(MASTER),"が",C_COND_MAP_GETS(MASTER, "設備名"),"で作業をしていると、",モブ名,"が息を荒げ、じりじりとにじり寄ってきた")%", カラー_ピンク)
        CALL COLOR_PRINTW(@"%TR("どうやらひどく発情しているようだ…")%", カラー_ピンク)
ENDSELECT
PRINTL
CALL ASK_YN(@"%TR("追い払う")%", @"%TR("なすがまま")%")
IF !RESULT
    TCVAR:MASTER:押し倒しクールタイム = RAND(210, 300)
    RETURN 0
ENDIF
PRINTL
CALL COLOR_PRINTW(@"%TR(ANAME(MASTER),"が隙を見せるなり、すかさず",モブ名,"が飛びかかってきた！")%", カラー_ピンク)
SELECTCASE プリセット名
    CASE "触手_設備"
        TFLAG:奉仕カテゴリ = 奉仕_触手乱交
        奉仕側カテゴリ = 奉仕_触手乱交
        被奉仕側カテゴリ = 奉仕_触手乱交
    CASEELSE
        TFLAG:奉仕カテゴリ = 奉仕_獣姦する
        奉仕側カテゴリ = 奉仕_獣姦する
        被奉仕側カテゴリ = 奉仕_獣姦される
ENDSELECT
FLAG:調教モード = 調教_逆調教通常
FLAG:ウフフフラグ = 1
TFLAG:奉仕モード = 1
CALL HO_PRESERVE_PRETRAIN_STATUS()
TFLAG:調教開始時刻 = HO_TIME
;プレイヤーターゲットを全員同行状態に
FOR LOCAL, 0, MPLY_NUM
    CHARA_ID = MPLY:LOCAL
    SIF CHARA_ID != MASTER
        CALL HO_SET_CHARAACT(CHARA_ID, "同行中")
    TCVAR:CHARA_ID:行動待機時間 = 0
    CFLAG:CHARA_ID:主導除外 = 1
    TCVAR:CHARA_ID:被奉仕者フラグ = 被奉仕側カテゴリ
NEXT
FOR LOCAL, 0, MTAR_NUM
    CHARA_ID = MTAR:LOCAL
    SIF CHARA_ID != MASTER
        CALL HO_SET_CHARAACT(CHARA_ID, "同行中")
    TCVAR:CHARA_ID:行動待機時間 = 0
    CFLAG:CHARA_ID:主導除外 = 1
    TCVAR:CHARA_ID:被奉仕者フラグ = 被奉仕側カテゴリ
NEXT
FOR LOCAL, 0, 3
    CALL QST_TRAIN_MOB_PRESET(プリセット名, モブ名)
    CHARA_ID = RESULT
    TCVAR:CHARA_ID:奉仕者フラグ = 奉仕側カテゴリ
    CFLAG:CHARA_ID:設備モブ = 1
    TFLAG:参加者数 ++
NEXT

RETURN 1
; #endregion

;-------------------------------------------------
; 同行者によるお持ち帰りイベント
;-------------------------------------------------
@HO_TAKE_AWAY_EVENT()
; #region
#DIM  DYNAMIC NUM_COMPANION
#DIMS DYNAMIC _LIST_COMPANION
#DIMS DYNAMIC _LIST_ACTOR
#DIM  DYNAMIC OPTION_NUM
#DIMS DYNAMIC _LIST_OPTIONS
#DIM  DYNAMIC SELECTED_CHARA_ID
#DIM  DYNAMIC CHARA_ID
#DIM  DYNAMIC CHARA_IDX

SIF TCVAR:MASTER:離脱フラグ != 離脱フラグ_睡眠
    RETURN 0

CALL HO_GET_COMPANION_LIST
NUM_COMPANION = RESULT
_LIST_COMPANION = %RESULTS%

FOR LOCAL, 0, LIST_COUNT(_LIST_COMPANION)
    CHARA_ID = TOINT(LIST_GET(_LIST_COMPANION, LOCAL))
    IF TALENT:CHARA_ID:合意 == 1 && !CFLAG:CHARA_ID:ゲストモブ
        ;IF TALENT:CHARA_ID:合意 == 1 && IS_ESTRUS(CHARA_ID) && !CFLAG:CHARA_ID:ゲストモブ
        _LIST_ACTOR = %LIST_ADD(_LIST_ACTOR, TOSTR(CHARA_ID))%
    ENDIF
NEXT

SIF !LIST_COUNT(_LIST_ACTOR)
    RETURN 0

;条件に合致した同行者からランダムに一人を選出
CALL LIST_SHUFFLE(_LIST_ACTOR)
SELECTED_CHARA_ID = TOINT(LIST_GET(_LIST_ACTOR, 0))
CALL HO_GET_CHARAIDX(CHARA_ID)
CHARA_IDX = RESULT

;選出された同行者以外を削除
;相席フラグは一律削除(選出された同行者が相席者の場合同行扱いにする)
FOR LOCAL:0, 0, NUM_COMPANION
    CHARA_ID = TOINT(LIST_GET(_LIST_COMPANION, LOCAL:0))
    TCVAR:CHARA_ID:相席フラグ = 0
    SIF CHARA_ID == SELECTED_CHARA_ID
        CONTINUE
    CALL HO_REMOVE_COMPANION(CHARA_ID)
NEXT

CALL HO_FIND_ROOM_BY_TAG("客室")
CALL HO_MOVE_MASTER(RESULT, 1)
CALL HO_MASTER_USE_MODULE(HO_MASTER現在地, CHARA_IDX)
FLAG:調教モード = 調教_閨
FLAG:ウフフフラグ = 1
TFLAG:MASTER行動不能 = 1

CALL PRINT_TITLE("お持ち帰り", "エロイベント")
CALL COLOR_PRINTW(@"%ANAME(SELECTED_CHARA_ID)%はすっかり酔い潰れた%ANAME(MASTER)%を抱きかかえると、そっと自室へと連れ帰った…", カラー_ピンク)
RETURN 1
; #endregion

;-------------------------------------------------
; 起床イベント
; @SOURCE_CHECK から呼ばれる
;-------------------------------------------------
@HO_GET_UP_EVENT(CHARA_ID)
; #region
#DIM CHARA_ID
#DIM  DYNAMIC NUM_COMPANION
#DIMS DYNAMIC _LIST_COMPANION

CALL HO_GET_CHARAACT(CHARA_ID)
IF RESULTS == "睡眠中"
    CALL HO_SET_CHARAACT(CHARA_ID, "待機")
    TCVAR:CHARA_ID:行動待機時間 = 0
ENDIF

; #endregion

;-------------------------------------------------
; 交流・調教対象の強制退出イベント
; 怒り・悲しみが限界に達した場合に発生、 @SOURCE_CHECK から呼ばれる
;-------------------------------------------------
@HO_GET_OUT_EVENT(CHARA_ID)
; #region
#DIM CHARA_ID
#DIM  DYNAMIC NUM_COMPANION
#DIMS DYNAMIC _LIST_COMPANION

CALL HO_REMOVE_COMPANION(CHARA_ID)
TCVAR:CHARA_ID:相席フラグ = 0
IF CFLAG:CHARA_ID:ゲストモブ
    CFLAG:CHARA_ID:キャラ滞在時間 = 0
ENDIF

;逢瀬中で誰もいなくなってしまった場合は逢瀬を終了
IF FLAG:調教モード == 調教_閨 && TFLAG:参加者数 == 0
    CALL TRAIN_EXIT(1)
ENDIF
; #endregion


code:
;-------------------------------------------------
; キャラクターの移動処理
;-------------------------------------------------
;キャラ移動処理の本体
@HO_CHARAACT_MOVE_MAIN(IDX)
#DIM IDX
#DIM DYNAMIC CHARA_ID
#DIM DYNAMIC 移動元ROOM_IDX
#DIM DYNAMIC 移動先ROOM_IDX

;IDを取得
CALL HO_GET_CHARADATA(IDX, "CHARA_ID")
CHARA_ID = RESULT
;キャラが現在いる部屋を取得
CALL HO_GET_CHARADATA(IDX, "ROOM_IDX")
移動元ROOM_IDX = RESULT
CALL HO_CHARAACT_MOVE(IDX)
;移動していない場合は処理を終了
SIF RESULT == -1
    RETURN 0
移動先ROOM_IDX = RESULT
CALL HO_GET_ROOM_NAME(移動先ROOM_IDX)
IF 移動先ROOM_IDX != HO_MASTER現在地 && 移動元ROOM_IDX == HO_MASTER現在地
    CALL HO_PRINT_LOG(@"%ANAME(CHARA_ID)% went to %RESULTS%")
ELSEIF 移動先ROOM_IDX == HO_MASTER現在地
    CALL HO_PRINT_LOG(@"%ANAME(CHARA_ID)% entered %RESULTS%")
ENDIF

RETURN 1

;キャラ移動処理に伴うデータ操作
@HO_CHARAACT_MOVE(IDX)
#DIM IDX
#DIMS DYNAMIC _LIST_MOVELIST
#DIM  DYNAMIC 移動元ROOM_IDX
#DIM  DYNAMIC 移動先ROOM_IDX
#DIMS DYNAMIC GUEST_TYPE
#DIM  DYNAMIC EVENT_LIST_IDX
#DIM  DYNAMIC 移動不可

CALL HO_GET_CHARADATA(IDX, "ROOM_IDX")
移動元ROOM_IDX = RESULT
;移動リストが存在するなら移動処理を実行する
CALL HO_GET_CHARADATA(IDX, "MOVELIST")
SIF RESULT == -1
    RETURN -1
_LIST_MOVELIST = %RESULTS%
SIF LIST_COUNT(_LIST_MOVELIST) == 0
    RETURN -1
移動先ROOM_IDX = TOINT(LIST_GET(_LIST_MOVELIST, 0))
_LIST_MOVELIST = %LIST_REMOVEAT(_LIST_MOVELIST, 0)%

;現在地、または移動先が施錠されている場合は移動不可
CALL HO_GET_MAPDATA(HO_有効マップID, 移動元ROOM_IDX, "IS_LOCKED")
IF RESULT == 1
    移動不可 = 1
ENDIF
CALL HO_GET_MAPDATA(HO_有効マップID, 移動先ROOM_IDX, "IS_LOCKED")
IF RESULT == 1
    移動不可 = 1
ENDIF
;移動ができない場合は移動リストをクリアし移動完了扱いに
IF 移動不可
    CALL HO_SET_CHARADATA(IDX, "MOVELIST", "")
    CALL HO_SET_CHARADATA(IDX, "ACTION", "移動完了")
    RETURN -1
ENDIF

CALL HO_SET_CHARADATA(IDX, "MOVELIST", _LIST_MOVELIST)
CALL HO_SET_CHARADATA(IDX, "ROOM_IDX", TOSTR(移動先ROOM_IDX))
;移動処理終了後も移動リストが残っている場合はキャラの状態を"移動中"に
IF LIST_COUNT(_LIST_MOVELIST) > 0
    CALL HO_SET_CHARADATA(IDX, "ACTION", "移動中")
ELSE
    CALL HO_SET_CHARADATA(IDX, "ACTION", "移動完了")
ENDIF

;クエスト中のイベントポーンの移動
IF FLAG:クエストモード
    CALL HO_GET_CHARADATA(IDX, "GUEST_TYPE")
    IF RESULT != -1
        GUEST_TYPE = %RESULTS%
        IF GUEST_TYPE == "EVENT_PAWN"
            CALL HO_GET_CHARADATA(IDX, "EVENT_LIST_IDX")
            EVENT_LIST_IDX = RESULT
            CALL QST_SET_EVENT_LIST(EVENT_LIST_IDX, "ROOM_IDX", TOSTR(移動先ROOM_IDX))
            CALL QST_EXEC_EVENT_PAWN_COLIDE(HO_MASTER現在地, EVENT_LIST_IDX)
        ENDIF
    ENDIF
ENDIF

RETURN 移動先ROOM_IDX

;-------------------------------------------------
; プレイヤーの移動処理
;-------------------------------------------------
@HO_MOVE_MASTER(ROOM_IDX, STOP_TIME_PROGRESS = 0)
#DIM ROOM_IDX
#DIM STOP_TIME_PROGRESS
#DIMS DYNAMIC ACTIONTYPE
#DIM DYNAMIC CHARA_ID
#DIM DYNAMIC CHARA_IDX
#DIM DYNAMIC DIST

;移動可能判定
IF FLAG:移動制限フラグ == 2
    CALL COLOR_PRINTW("Traveling to other areas is limited", カラー_注意)
    CLEARLINE 1
    RETURN -1
ENDIF

CALL HO_GET_ROUTE(HO_MASTER現在地, ROOM_IDX)
DIST = RESULT
IF DIST == -1
    CALL COLOR_PRINTW("Destination can't be reached (there is no passage, locked, etc.)", カラー_注意)
    CLEARLINE 1
    RETURN -1
    ;隣接エリアへの移動のみ許可
ELSEIF DIST > 1 && FLAG:移動制限フラグ == 1
    CALL COLOR_PRINTW("<Moving restrictions> can only be moved to the adjacent area", カラー_注意)
    CLEARLINE 1
    RETURN -1
ENDIF

;MASTERのモジュール使用状態を解除する
CALL HO_GET_MASTER_DATA("MODULE_USAGE")
IF RESULT != -1
    CALL HO_MASTER_STOP_USE_MODULE(HO_MASTER現在地, RESULT)
ENDIF

;キャラクター毎の処理
FOR CHARA_ID, 0, CHARANUM
    ;コマンド継続状況を解除
    IF IS_PARTICIPATE_TRAIN(CHARA_ID)
        ;EQUIP解除
        CALL RELEASE_ALL_EQUIP(CHARA_ID, 1)
    ENDIF
    ;クエストモード用ゲストモブの離脱処理
    IF FLAG:クエストモード
        IF TCVAR:CHARA_ID:相席フラグ == 1
            CALL HO_REMOVE_COMPANION(CHARA_ID)
            TCVAR:CHARA_ID:相席フラグ = 0
            CFLAG:CHARA_ID:キャラ滞在時間 = 0
        ENDIF
    ENDIF
NEXT

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

;MASTERを移動させる
HO_MASTER現在地 = ROOM_IDX
;足音を鳴らす
CALL FL_PLAYSE("Step_1.mp3")
;時間経過処理
SIF STOP_TIME_PROGRESS == 0 && FLAG:ハウジングモード
    CALL HOUSING_TIME_PROGRESS(DIST, 1)

;同行中のキャラクターはマスターと一緒に移動する
WHILE _DIC_HO_CHARALIST:CHARA_IDX != "-1"
    CALL HO_GET_CHARADATA(CHARA_IDX, "ACTION")
    ACTIONTYPE = %RESULTS%
    CALL HO_GET_CHARADATA(CHARA_IDX, "CHARA_ID")
    CHARA_ID = RESULT
    IF ACTIONTYPE == "同行中"
        CALL HO_SET_CHARAPLACE(CHARA_ID, HO_MASTER現在地)
    ENDIF
    CHARA_IDX ++
WEND

;クエストモード時の移動処理
IF FLAG:調教モード == 調教_クエスト
    ;入室時に発生するイベントをCALL
    CALL QST_EXEC_ENTER_EVENT(HO_MASTER現在地)
    ;未知の部屋をオープン
    CALL QST_CLEAR_FOG_OF_WAR(HO_MASTER現在地)
    ;現在のルームを探索済みルームリストに追加
    CALL QST_ADD_LIST_EXPLORED_ROOM(HO_MASTER現在地)
ENDIF

;-------------------------------------------------
;;現在地から目的地までの最短経路を探索し経路をLIST形式で返却する
; 幅優先探索
; 到達可能な場合は最短経路をリスト形式で返却, 距離を数値で返却
; 目的地が現在地と同じ場合は空文字を返却
; 到達不可の場合は"-1"を返却
;-------------------------------------------------
@HO_GET_ROUTE(ROOM_IDX_FROM, ROOM_IDX_TO, MAP_ID = -1)
#DIM ROOM_IDX_FROM
#DIM ROOM_IDX_TO
#DIM MAP_ID
#DIMS DYNAMIC _LIST_PATH
#DIMS DYNAMIC _LIST_ROUTE
#DIM DYNAMIC QUEUE, HO_MAX_ROOMNUM
#DIM DYNAMIC QUEUE_START
#DIM DYNAMIC QUEUE_END
#DIM DYNAMIC NODE_FROM, HO_MAX_ROOMNUM
#DIM DYNAMIC VISITED, HO_MAX_ROOMNUM
#DIM DYNAMIC CURRENT_NODE

VARI PATH_INDEX
VARI NEXT_ROOM
VARI DISTANCE
VARI REVERSE_INDEX

;現在地と目的地が同じなら移動リストなし、距離0
IF ROOM_IDX_FROM == ROOM_IDX_TO
    RESULTS '= ""
    RETURN 0
ENDIF

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

;現在地が施錠されている場合は移動不可
CALL HO_GET_MAPDATA(HO_有効マップID, ROOM_IDX_FROM, "IS_LOCKED")
IF RESULT == 1
    RETURN -1
ENDIF

;キューの初期化
QUEUE_START = 0
QUEUE_END = 1
QUEUE:0 = ROOM_IDX_FROM
VISITED:ROOM_IDX_FROM = 1

;幅優先探索
WHILE QUEUE_START < QUEUE_END
    CURRENT_NODE = QUEUE:QUEUE_START
    QUEUE_START++

    ;現在のノードから到達可能な経路を取得
    CALL HO_GET_PATH(CURRENT_NODE)
    _LIST_PATH = %RESULTS%

    FOR PATH_INDEX, 0, LIST_COUNT(_LIST_PATH)
        NEXT_ROOM = TOINT(LIST_GET(_LIST_PATH, PATH_INDEX))
        CALL HO_GET_MAPDATA(MAP_ID, NEXT_ROOM, "IS_LOCKED")
        IF RESULT == 1
            CONTINUE
        ENDIF
        ;未訪問のノードのみ処理
        IF !VISITED:NEXT_ROOM
            VISITED:NEXT_ROOM = 1
            NODE_FROM:NEXT_ROOM = CURRENT_NODE
            QUEUE:QUEUE_END = NEXT_ROOM
            QUEUE_END++

            ;目的地に到達したら経路を構築して返却
            IF NEXT_ROOM == ROOM_IDX_TO
                ;経路の構築
                CURRENT_NODE = ROOM_IDX_TO
                _LIST_ROUTE = %LIST_ADD(_LIST_ROUTE, TOSTR(ROOM_IDX_TO))%
                DISTANCE = 0 ;距離カウンター
                WHILE CURRENT_NODE != ROOM_IDX_FROM
                    CURRENT_NODE = NODE_FROM:CURRENT_NODE
                    _LIST_ROUTE = %LIST_ADD(_LIST_ROUTE, TOSTR(CURRENT_NODE))%
                    DISTANCE++
                WEND
                ;逆順に並べ替えて経路復元
                RESULTS '= ""
                FOR LOCAL, DISTANCE - 1, -1, -1
                    RESULTS = %LIST_ADD(RESULTS, LIST_GET(_LIST_ROUTE, LOCAL))%
                NEXT
                RETURN DISTANCE ;距離を返却
            ENDIF
        ENDIF
    NEXT
WEND

;到達不能
RETURN -1

;-------------------------------------------------
;;; 旧バージョン
;-------------------------------------------------
@HO_GET_ROUTE_OLD(ROOM_IDX_FROM, ROOM_IDX_TO, MAP_ID = -1)
#DIM ROOM_IDX_FROM
#DIM ROOM_IDX_TO
#DIM MAP_ID
#DIM CONST MAX_VALUE = 999999 ;距離として取り得ない大きい値であればよい
#DIMS DYNAMIC _LIST_QUEUE
#DIMS DYNAMIC _LIST_PATH
#DIMS DYNAMIC _LIST_ROUTE
#DIMS DYNAMIC _LIST_TEMP
#DIM DYNAMIC QUEUE_IDX
#DIM DYNAMIC NODE_SCORE, HO_MAX_ROOMNUM
#DIM DYNAMIC NODE_FROM, HO_MAX_ROOMNUM
#DIM DYNAMIC DIST
#DIM DYNAMIC MIN_DIST
#DIM DYNAMIC CURRENT_NODE

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

;現在地と目的地が同じなら移動リストなし、距離0
IF ROOM_IDX_FROM == ROOM_IDX_TO
    RESULTS '= ""
    RETURN 0
ENDIF

DIST = 1
MIN_DIST = MAX_VALUE
CURRENT_NODE = ROOM_IDX_FROM
WHILE QUEUE_IDX < HO_MAX_ROOMNUM
    CALL HO_GET_PATH(CURRENT_NODE)
    _LIST_PATH = %RESULTS%
    FOR LOCAL, 0, LIST_COUNT(_LIST_PATH)
        SIF LIST_INDEXOF(_LIST_QUEUE, LIST_GET(_LIST_PATH, LOCAL)) != -1
            CONTINUE
        _LIST_QUEUE = %LIST_ADD(_LIST_QUEUE, LIST_GET(_LIST_PATH, LOCAL))%
        NODE_SCORE:TOINT(LIST_GET(_LIST_PATH, LOCAL)) = NODE_SCORE:CURRENT_NODE + 1
        NODE_FROM:TOINT(LIST_GET(_LIST_PATH, LOCAL)) = CURRENT_NODE
    NEXT
    CURRENT_NODE = TOINT(LIST_GET(_LIST_QUEUE, QUEUE_IDX))
    IF CURRENT_NODE == ROOM_IDX_TO && NODE_SCORE:CURRENT_NODE < MIN_DIST
        MIN_DIST = NODE_SCORE:CURRENT_NODE
    ENDIF
    QUEUE_IDX ++
WEND
SIF MIN_DIST == MAX_VALUE
    RETURN -1
;到達可能であれば経路を復元
CURRENT_NODE = ROOM_IDX_TO
_LIST_TEMP = %LIST_ADD(_LIST_TEMP, TOSTR(ROOM_IDX_TO))%
FOR LOCAL, 0, MIN_DIST - 1
    _LIST_TEMP = %LIST_ADD(_LIST_TEMP, TOSTR(NODE_FROM:CURRENT_NODE))%
    CURRENT_NODE = NODE_FROM:CURRENT_NODE
NEXT
FOR LOCAL, MIN_DIST - 1, -1, -1
    _LIST_ROUTE = %LIST_ADD(_LIST_ROUTE, LIST_GET(_LIST_TEMP, LOCAL))%
NEXT
RESULTS = %_LIST_ROUTE%
RETURN MIN_DIST

repo_name: pervysquirrelz/erafl

license: unknown


code:
;-------------------------------------------------
;キャラクターの行動基準となるスケジュール定義ファイル
;時刻の目安　朝(7時～12時),昼(12時～16時),夕(16時～20時),夜(20時～)
;-------------------------------------------------
@HO_GET_TASK_SCH(CHARA_ID)
#DIM CHARA_ID
#DIM  DYNAMIC CLOCK

CLOCK = HO_TIME /60 * 100 + HO_TIME % 60

SELECTCASE CLOCK
    CASE 700 TO 1159
        RESULTS '= HO_TASK_NAME:(HO_TASK_SCH:CHARA_ID:0)
        RETURN 0
    CASE 1200 TO 1559
        RESULTS '= HO_TASK_NAME:(HO_TASK_SCH:CHARA_ID:1)
        RETURN 1
    CASE 1600 TO 2059
        RESULTS '= HO_TASK_NAME:(HO_TASK_SCH:CHARA_ID:2)
        RETURN 2
    CASE 2100 TO 2500
        RESULTS '= HO_TASK_NAME:(HO_TASK_SCH:CHARA_ID:3)
        RETURN 3
    CASEELSE
        RESULTS '= ""
        RETURN -1
ENDSELECT

;自由行動のタイムテーブル
@HO_SCH_FREE(CHARA_ID)
#DIM CHARA_ID
#DIM  DYNAMIC SCH
#DIMS DYNAMIC ACT
#DIM  DYNAMIC CLOCK
CLOCK = HO_TIME /60 * 100 + HO_TIME % 60
SELECTCASE CLOCK
    CASE 0 TO 700
        ACT '= "就寝"
    CASE 701 TO 900
        ACT '= "食事"
    CASE 901 TO 1159
        ACT '= "自由"
    CASE 1200 TO 1330
        ACT '= "食事"
    CASE 1331 TO 1459
        ACT '= "自由"
    CASE 1500 TO 1630
        ACT '= "自由"
    CASE 1631 TO 1759
        ACT '= "自由"
    CASE 1800 TO 2000
        ACT '= "食事"
    CASE 2001 TO 2100
        ACT '= "入浴"
    CASE 2101 TO 2300
        ACT '= "自由"
    CASE 2301 TO 2500
        IF !RAND:3
            ACT '= "休憩"
        ELSEIF !RAND:2
            ACT '= "飲酒"
        ELSE
            ACT '= "就寝"
        ENDIF
    CASEELSE
        ACT '= "就寝"
ENDSELECT
RESULTS = %ACT%


code:
;-------------------------------------------------
;キャラクターの行動による能力上昇
;-------------------------------------------------
@HO_CHARAACT_ABLUP(CHARA_ID, EXP_NAME, BASE_EXP)
#DIM  CHARA_ID
#DIMS EXP_NAME
#DIM  BASE_EXP
#DIM DYNAMIC EXP_RATE
#DIM DYNAMIC EXP_GAIN
;作業による獲得経験値
EXP_RATE = GROWTYPE_RATE(CHARA_ID, EXP_NAME)
EXP_GAIN = BASE_EXP * EXP_RATE / 100
IF EXP_GAIN > 0
    EXP:CHARA_ID:GETNUM(EXP, @"%EXP_NAME%経験値") += EXP_GAIN
    CALL TRAIN_AUTO_ABLUP(CHARA_ID, 2)
ENDIF


code:
;-------------------------------------------------
;スケジュール指定に用いるタスク定義
;-------------------------------------------------
#DIM CONST ACT_NUM = 1000
#DIM CONST ACT_待機 = 0
#DIM CONST ACT_食事 = 1
#DIM CONST ACT_休憩 = 2
#DIM CONST ACT_飲酒 = 3
#DIM CONST ACT_入浴 = 4
#DIM CONST ACT_採集 = 5
#DIM CONST ACT_採掘 = 6
#DIM CONST ACT_炊事 = 7
#DIM CONST ACT_水浴び = 8
#DIM CONST ACT_自主訓練 = 9
#DIM CONST ACT_演奏 = 10
#DIM CONST ACT_釣り = 11
#DIM CONST ACT_読書 = 12
#DIM CONST ACT_クラフト = 13
#DIM CONST ACT_訓練 = 14
#DIM CONST ACT_店番 = 20
#DIM CONST ACT_買物 = 21
#DIM CONST ACT_売春 = 22
#DIM CONST ACT_買春 = 23
#DIM CONST ACT_宿番 = 24
#DIM CONST ACT_芸能 = 25
#DIM CONST ACT_鑑賞 = 70
#DIM CONST ACT_自慰 = 80
#DIM CONST ACT_逢瀬 = 81
#DIM CONST ACT_拘束 = 82
#DIM CONST ACT_搾乳 = 83
#DIM CONST ACT_追随 = 85
#DIM CONST ACT_逢瀬準備 = 86
#DIM CONST ACT_逢瀬待機 = 87
#DIM CONST ACT_宿泊 = 89
#DIM CONST ACT_仮眠 = 90
#DIM CONST ACT_洗浄 = 91
#DIM CONST ACT_ウフフ目撃 = 92
#DIM CONST ACT_着替 = 93
#DIM CONST ACT_睡眠 = 94
#DIM CONST ACT_監禁 = 97
#DIM CONST ACT_療養 = 98
#DIM CONST ACT_就寝 = 99
;クエスト用
#DIM CONST ACT_徘徊 = 500
#DIM CONST ACT_遊戯 = 998
#DIM CONST ACT_自由 = 999


code:
;-------------------------------------------------
;キャラクターの行動定義
;クエスト用イベントポーンの行動定義
;-------------------------------------------------
@HO_行動定義_イベントポーン(CHARA_ID)
#DIM CHARA_ID
#DIM  DYNAMIC CHARA_IDX
#DIM  DYNAMIC ROOM_IDX
#DIM  DYNAMIC EVENT_ID
#DIMS DYNAMIC _LIST_移動先候補
#DIMS DYNAMIC 現在の行動

;クエスト側でイベント固有の行動定義がされている場合はそれに準じた行動をさせる
TRYCCALLFORM QST_QUEST_{QST_有効クエストID}_EVENT_{EVENT_ID}_行動定義
CATCH
    ;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 !FLAG:クエストモード
        CALL HO_STOP_USE_MODULE(CHARA_ID)
    ENDIF
    CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "待機")

ENDCATCH

;アトランダムな徘徊
;現在地から移動可能な部屋を取得
; CALL HO_GET_PATH(ROOM_IDX)
; _LIST_移動先候補 = %RESULTS%
; ;移動可能な候補からランダムに選出してMOVELISTに登録
; CALL HO_SET_MOVELIST(CHARA_ID, LIST_SET((LIST_GET(_LIST_移動先候補, RAND(0,LIST_COUNT(_LIST_移動先候補))))))


code:
;-------------------------------------------------
;キャラクターの行動定義
;-------------------------------------------------
@HO_行動定義_ウフフ目撃(CHARA_ID)
#DIM CHARA_ID
#DIM  DYNAMIC CHARA_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%

{
    SELECTCASE IFRAND(
        "1",1,
        "2",現在の行動 == "待機" && ROOM_IDX != TCVAR:CHARA_ID:ウフフ目撃場所
        )
}
    CASE 1 ;情事を目撃したのでとりあえず逃げる
        ;今使っているモジュールの使用を停止させる
        CALL HO_STOP_USE_MODULE(CHARA_ID)
        CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "待機")
        ;現在地から移動可能な部屋を取得
        CALL HO_GET_PATH(ROOM_IDX)
        _LIST_移動先候補 = %RESULTS%
        ;情事を目撃した場所を移動先から除外
        _LIST_移動先候補 = %LIST_REMOVEALL(_LIST_移動先候補, TOSTR(TCVAR:CHARA_ID:ウフフ目撃場所))%
        ;移動可能な候補からランダムに選出してMOVELISTに登録
        SIF LIST_COUNT(_LIST_移動先候補) > 0
            CALL HO_SET_MOVELIST(CHARA_ID, LIST_SET((LIST_GET(_LIST_移動先候補, RAND(0,LIST_COUNT(_LIST_移動先候補))))))
    CASE 2 ;待機状態なら適当に休憩
        CALL HO_TRY_USE_MODULE(CHARA_ID, "休憩")
        IF RESULT == 1
            CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "休憩中")
            TCVAR:CHARA_ID:疲労度 -= 100
            ;1時間から2時間強の間で
            TCVAR:CHARA_ID:行動待機時間 = RAND(12, 28) * HO_単位時間
            ;ウフフ目撃フラグを解除
            TCVAR:CHARA_ID:ウフフ目撃フラグ = 0
            RETURN 1
        ELSE
            TCVAR:CHARA_ID:行動失敗カウンタ ++
            ;3回休憩を試みても休憩できる場所がなかった
            IF TCVAR:CHARA_ID:行動失敗カウンタ == 3
                TCVAR:CHARA_ID:行動失敗カウンタ = 0
                TCVAR:CHARA_ID:ウフフ目撃フラグ = 0
            ENDIF
            RETURN -1
        ENDIF
    CASEELSE
ENDSELECT

RETURN -1


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 MODULE_ID
#DIM  DYNAMIC MODULE_LIST_IDX
#DIMS DYNAMIC MODULE_LIST
#DIM  DYNAMIC TIMETABLE
#DIMS DYNAMIC LIST_CRAFT_ORDER_DID
#DIM  DYNAMIC ORDER_DID
#DIM  DYNAMIC LIST_CNT
#DIM  DYNAMIC ORDER_AVAILABLE

;CRAFT_ORDER関連
#DIM  DYNAMIC ITEM_ID
#DIM  DYNAMIC RECIPE_NO
#DIM  DYNAMIC TARGET_NUM
#DIM  DYNAMIC IS_ACTIVE
#DIM  DYNAMIC DETAIL_IDX

;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_GET_TASK_SCH(CHARA_ID)
IF RESULT == -1
    RETURN -1
ELSE
    TIMETABLE = RESULT
ENDIF

;;作業を行う設備を確定する
;作業場リストが設定されている場合指定設備を優先する
IF 現在の行動 != "移動完了"
    LIST_CRAFT_ORDER_DID = %_LIST_HO_CRAFT_ORDER_DID:CHARA_ID:TIMETABLE%
    LIST_CNT = LIST_COUNT(LIST_CRAFT_ORDER_DID)
    IF LIST_CNT == 0
        RETURN -1
    ENDIF
    ORDER_AVAILABLE = 0
    FOR LOCAL, 0, LIST_CNT
        ORDER_DID = LIST_GETINT(LIST_CRAFT_ORDER_DID, LOCAL)
        MODULE_LIST_IDX = DT_CELL_GET("CRAFT_ORDER", ORDER_DID, "MODULE_LIST_IDX", 1)
        SIF !MODULE_LIST_IDX
            CONTINUE
        CALL HO_CRAFT_ORDER_CHECK_ORDER_IS_VALID(CHARA_ID, ORDER_DID)
        SIF !RESULT
            CONTINUE
        ORDER_AVAILABLE = 1
        BREAK
    NEXT
    ;有効な作業指示がひとつもない
    IF !ORDER_AVAILABLE
        RETURN -1
    ENDIF
    ;設備が配置されているエリアを取得
    CALL HO_GET_MODULE_LIST(MODULE_LIST_IDX, "ROOM_IDX")
    IF RESULT != -1
        移動先ROOM_IDX = RESULT
        CALL HO_SET_CHARADATA(CHARA_IDX, "TARGET_MODULE_LIST_IDX", TOSTR(MODULE_LIST_IDX))
        CALL HO_SET_CHARADATA(CHARA_IDX, "CRAFT_ORDER_DID", TOSTR(ORDER_DID))
    ELSE
        RETURN -1
    ENDIF

    CALL HO_GET_ROUTE(ROOM_IDX, 移動先ROOM_IDX)
    SIF RESULT == -1
        RETURN -1
    ;RESULTが0の場合既に目的地と同じ場所にいるので移動の必要なし
    IF RESULT != 0
        _LIST_移動先候補 = %RESULTS%
        CALL HO_STOP_USE_MODULE(CHARA_ID)
        CALL HO_SET_MOVELIST(CHARA_ID, _LIST_移動先候補)
        RETURN 0
    ENDIF
ENDIF

CALL HO_STOP_USE_MODULE(CHARA_ID)
CALL HO_GET_CHARADATA(CHARA_IDX, "TARGET_MODULE_LIST_IDX")
IF RESULT != -1
    CALL HO_TRY_USE_MODULE(CHARA_ID,,,RESULT)
ELSE
    RETURN -1
ENDIF
IF RESULT == 1
    CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "クラフト中")
    CALL HO_SET_CHARADATA(CHARA_IDX, "TARGET_MODULE_LIST_IDX", "")
    TCVAR:CHARA_ID:HO作業進捗量 = 0
    ;大体1時間位作業する
    TCVAR:CHARA_ID:行動待機時間 = RAND(12, 14) * HO_単位時間
    RETURN 1
ELSE
    RETURN -1
ENDIF

@HO_行動定義_クラフト_生産物(CHARA_ID)
#DIM  CHARA_ID
#DIM  DYNAMIC CHARA_IDX
#DIM  DYNAMIC MODULE_ID
#DIM  DYNAMIC MODULE_LIST_IDX
#DIM  DYNAMIC PRODUCTION_RATE
#DIM  DYNAMIC ITEM_ID
#DIMS DYNAMIC ITEM_NAME
#DIM  DYNAMIC RECIPE_NO
#DIM  DYNAMIC ORDER_DID
#DIM  DYNAMIC MATERIAL_NEEDS, ITEM_LENGTH
#DIM  DYNAMIC PRODUCT_ITEMS, ITEM_LENGTH
#DIM  DYNAMIC BASE_EXP = 3
#DIMS DYNAMIC ABL_NAME

TCVAR:CHARA_ID:HO作業進捗量 += 15
TCVAR:CHARA_ID:疲労度 += 5

;TODO:クラフト処理
IF TCVAR:CHARA_ID:HO作業進捗量 > 100
    CALL HO_GET_CHARAIDX(CHARA_ID)
    CHARA_IDX = RESULT
    CALL HO_GET_CHARADATA(CHARA_IDX, "CRAFT_ORDER_DID")
    ORDER_DID = RESULT
    CALL HO_CRAFT_ORDER_CHECK_ORDER_IS_VALID(CHARA_ID, ORDER_DID)
    ;設備IDの取得
    MODULE_LIST_IDX = DT_CELL_GET("CRAFT_ORDER", ORDER_DID, "MODULE_LIST_IDX", 1)
    CALL HO_GET_MODULE_LIST(MODULE_LIST_IDX, "MODULE_ID")
    MODULE_ID = RESULT
    ;DEBUGPRINTFORML %ANAME(CHARA_ID)%のクラフト処理,RESULT = {RESULT},ORDERDID = {ORDER_DID}
    IF !RESULT
        RETURN 0
    ENDIF
    ITEM_ID = DT_CELL_GET("CRAFT_ORDER", ORDER_DID, "ITEM_ID", 1)
    RECIPE_NO = DT_CELL_GET("CRAFT_ORDER", ORDER_DID, "RECIPE_NO", 1)
    CALL GET_ITEM_NAME(ITEM_ID)
    ITEM_NAME = %RESULTS%
    ;コスト取得
    CALL GET_ITEM_MATERIAL_NEEDS(ITEM_ID, MATERIAL_NEEDS, RECIPE_NO)
    CALL USE_MATERIAL(MATERIAL_NEEDS)
    ;生産量取得
    CALL GET_ITEM_INFO(ITEM_ID, ITEM_基準生産量 + RECIPE_NO)
    PRODUCTION_RATE = RESULT
    CALL HO_PRINT_LOG(@"%ANAME(CHARA_ID)%は@C:{カラー_黄}@%ITEM_NAME%@/C@を@C:{カラー_緑}@{PRODUCTION_RATE}@/C@個生産した")
    CALL CHANGE_ITEM_STOCK(ITEM_ID, PRODUCTION_RATE)
    ;作業による獲得経験値
    SELECTCASE MODULE_ID
        CASE 300 ;作業台
            ABL_NAME '= "器用"
        CASE 301 ;金床
            ABL_NAME '= "器用"
        CASE 302 ;キッチン
            ABL_NAME '= "料理"
        CASE 303 ;錬金台
            ABL_NAME '= "知識"
        CASE 305 ;織機
            ABL_NAME '= "器用"
        CASEELSE
            ABL_NAME '= "器用"
    ENDSELECT
    CALL HO_CHARAACT_ABLUP(CHARA_ID, ABL_NAME, BASE_EXP)
    TCVAR:CHARA_ID:HO作業進捗量 = 0
ENDIF

@HO_CRAFT_ORDER_CHECK_ORDER_IS_VALID(CHARA_ID, ORDER_DID)
#DIM  CHARA_ID
#DIM  ORDER_DID
;CRAFT_ORDER関連
#DIM  DYNAMIC ITEM_ID
#DIM  DYNAMIC RECIPE_NO
#DIM  DYNAMIC TARGET_NUM
#DIM  DYNAMIC IS_ACTIVE
#DIM  DYNAMIC LIST_IDX
#DIM  DYNAMIC DETAIL_IDX

#DIM  DYNAMIC MODULE_LIST_IDX
#DIM  DYNAMIC MODULE_ID

;基本情報取得
MODULE_LIST_IDX = DT_CELL_GET("CRAFT_ORDER", ORDER_DID, "MODULE_LIST_IDX", 1)
ITEM_ID = DT_CELL_GET("CRAFT_ORDER", ORDER_DID, "ITEM_ID", 1)
TARGET_NUM = DT_CELL_GET("CRAFT_ORDER", ORDER_DID, "TARGET_NUM", 1)

;既に目標生産数に到達

SIF HO_ITEM_STOCK:ITEM_ID >= TARGET_NUM && TARGET_NUM > 0
    RETURN 0

;アイテム作成可能判定
RECIPE_NO = DT_CELL_GET("CRAFT_ORDER", ORDER_DID, "RECIPE_NO", 1)
CALL HO_GET_MODULE_LIST(MODULE_LIST_IDX, "MODULE_ID")
MODULE_ID = RESULT
CALL HO_CRAFT_ORDER_IS_ITEM_CRAFTABLE(CHARA_ID, MODULE_LIST_IDX, ITEM_ID, RECIPE_NO)
RETURN RESULT

@HO_CRAFT_ORDER_IS_ITEM_CRAFTABLE(CHARA_ID, MODULE_LIST_IDX, ITEM_ID, RECIPE_NO)
#DIM  CHARA_ID
#DIM  MODULE_LIST_IDX
#DIM  ITEM_ID
#DIM  RECIPE_NO
#DIM  DYNAMIC MODULE_ID
#DIM  DYNAMIC MATERIAL_NEEDS, ITEM_LENGTH
#DIM  DYNAMIC STOCKNUM
#DIM  DYNAMIC TEMP_MPLY_FLAG
#DIM  DYNAMIC IS_CRAFTABLE

;クラフトの製造可否判定にMPLYを使っているので、一時的にセット
IF !IS_MPLY(CHARA_ID)
    TEMP_MPLY_FLAG = 1
    CALL ADD_MPLY(CHARA_ID)
ENDIF

;製造可能な設備か
CALL HO_GET_MODULE_LIST(MODULE_LIST_IDX, "MODULE_ID")
MODULE_ID = RESULT
HO_CHECK_ITEM_CRAFTABLE_AT_ROOM_IDX = C_COND_MAP_GET(CHARA_ID, "エリアIDX")
CALL CHECK_ITEM_CRAFTABLE(ITEM_ID, MODULE_ID)
IS_CRAFTABLE = RESULT
HO_CHECK_ITEM_CRAFTABLE_AT_ROOM_IDX = -1
;MPLYを一時的に書き換えているなら元に戻す
IF TEMP_MPLY_FLAG
    CALL DEL_MPLY(CHARA_ID)
ENDIF
IF !IS_CRAFTABLE
    RETURN 0
ENDIF

;素材が充足しているか
CALL GET_ITEM_MATERIAL_NEEDS(ITEM_ID, MATERIAL_NEEDS, RECIPE_NO)
IS_CRAFTABLE = 1
FOR LOCAL:0, 0, ITEM_LENGTH
    IF MATERIAL_NEEDS:(LOCAL:0) > 0
        IF LOCAL == ITEM_ディナリ
            STOCKNUM = MONEY
        ELSEIF LOCAL == ITEM_淫堕点
            STOCKNUM = QST_LEWD_POINT
        ELSE
            STOCKNUM = HO_ITEM_STOCK:(LOCAL:0)
        ENDIF
        IF STOCKNUM < MATERIAL_NEEDS:(LOCAL:0)
            IS_CRAFTABLE = 0
        ENDIF
    ENDIF
NEXT

RETURN IS_CRAFTABLE


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_ROOM_BY_TAG("客室", 1)
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:51 = 0
        TCVAR:CHARA_ID:52 = 0
        BASE:(CHARA_ID):体力 = LIMIT(BASE:(CHARA_ID):体力 + 1200, BASE:(CHARA_ID):体力, MAXBASE:(CHARA_ID):体力)
        BASE:(CHARA_ID):気力 = LIMIT(BASE:(CHARA_ID):気力 + 900, BASE:(CHARA_ID):気力, MAXBASE:(CHARA_ID):気力)
        TCVAR:CHARA_ID:行動待機時間 = RAND(36, 72) * HO_単位時間
        RETURN 1
    ELSE
        RETURN -1
    ENDIF
ENDIF


code:
;-------------------------------------------------
;キャラクターの行動定義
;-------------------------------------------------
@HO_行動定義_休憩(CHARA_ID)
#DIM CHARA_ID
#DIM  DYNAMIC CHARA_IDX
#DIM  DYNAMIC ROOM_IDX
#DIM  DYNAMIC MODULE_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)
移動先ROOM_IDX = RESULT

;捕虜は牢獄でしか休まない
IF CFLAG:CHARA_ID:捕虜先 == 所属_プレイヤー
    CALL HO_FIND_ROOM_BY_TAG("牢獄", 1)
    移動先ROOM_IDX = RESULT
ENDIF

SIF 移動先ROOM_IDX == -1
    RETURN -1

;宿泊客は宿泊先設備を利用
IF TCVAR:CHARA_ID:宿泊先設備IDX > 0
    MODULE_IDX = TCVAR:CHARA_ID:宿泊先設備IDX
    CALL HO_GET_MODULE_LIST(MODULE_IDX, "ROOM_IDX")
    移動先ROOM_IDX = RESULT
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_移動先候補)
    RETURN 0
ENDIF

;移動の必要なし
CALL HO_STOP_USE_MODULE(CHARA_ID)
IF TCVAR:CHARA_ID:宿泊先設備IDX > 0
    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
    BASE:(CHARA_ID):体力 = LIMIT(BASE:(CHARA_ID):体力 + 100, BASE:(CHARA_ID):体力, MAXBASE:(CHARA_ID):体力)
    BASE:(CHARA_ID):気力 = LIMIT(BASE:(CHARA_ID):気力 + 50, BASE:(CHARA_ID):気力, MAXBASE:(CHARA_ID):気力)
    TCVAR:CHARA_ID:行動待機時間 = RAND(6, 12) * HO_単位時間
    RETURN 1
ELSE
    IF !CFLAG:CHARA_ID:捕虜先
        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
    ELSE
        ;虜囚は牢屋さえあればとりあえずは休む
        CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "休憩中")
        TCVAR:CHARA_ID:疲労度 = 0
        BASE:(CHARA_ID):体力 = LIMIT(BASE:(CHARA_ID):体力 + 100, BASE:(CHARA_ID):体力, MAXBASE:(CHARA_ID):体力)
        BASE:(CHARA_ID):気力 = LIMIT(BASE:(CHARA_ID):気力 + 50, BASE:(CHARA_ID):気力, MAXBASE:(CHARA_ID):気力)
        TCVAR:CHARA_ID:行動待機時間 = RAND(6, 12) * HO_単位時間
        RETURN 1
    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 現在の行動 != "移動完了"
    ;基本は最も近い入浴可能なエリアを探す。1/3で適当に選ぶ
    IF RAND:3
        CALL HO_FIND_ROOM_BY_MODULE_USAGE("入浴", ROOM_IDX, "NEAREST")
    ELSE
        CALL HO_FIND_ROOM_BY_MODULE_USAGE("入浴", ROOM_IDX, "RANDOM")
    ENDIF
    IF RESULT != -1
        移動先ROOM_IDX = RESULT
    ELSE
        ;入浴可能なエリアがない場合以後入浴行動を選択しないよう、入浴済みとして扱う
        TCVAR:CHARA_ID:HO入浴済フラグ = 1
        RETURN -1
    ENDIF
    ;目的地を設定したらルートをセット
    CALL HO_GET_ROUTE(ROOM_IDX, 移動先ROOM_IDX)
    SIF RESULT == -1
        RETURN -1
    _LIST_移動先候補 = %RESULTS%
    CALL HO_STOP_USE_MODULE(CHARA_ID)
    CALL HO_SET_MOVELIST(CHARA_ID, _LIST_移動先候補)
    RETURN 0
    ;移動先を設定済み
ELSE
    CALL HO_STOP_USE_MODULE(CHARA_ID)
    CALL HO_TRY_USE_MODULE(CHARA_ID, "入浴")
    IF RESULT == 1
        CALL HO_UNDRESS(CHARA_ID)
        CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "入浴中")
        CALL HO_WASH(CHARA_ID)
        TCVAR:CHARA_ID:疲労度 += 100
        TCVAR:CHARA_ID:行動待機時間 = RAND(6, 9) * HO_単位時間
        TCVAR:CHARA_ID:HO入浴済フラグ = 1
        RETURN 1
    ELSE
        RETURN -1
    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 現在の行動

;疲れている場合はダメ
SIF IS_TIRED(CHARA_ID, 40)
    RETURN -1
;店番を継続している場合、行動待機時間のみ延長する
IF TCVAR:CHARA_ID:HO直前の行動 == ACT_売春
    ;大体1時間半位作業する
    TCVAR:CHARA_ID:行動待機時間 = RAND(18, 20) * HO_単位時間
    RETURN 1
ENDIF

;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)
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", "売春中")
        ;大体1時間半位作業する
        TCVAR:CHARA_ID:行動待機時間 = RAND(18, 20) * HO_単位時間
        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 MODULE_IDX

;宿泊先が未決定なら処理しない
IF TCVAR:CHARA_ID:宿泊先設備IDX < 0
    RETURN -1
ENDIF

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

;宿泊先設備を利用する／設備に向けて移動する
MODULE_IDX = TCVAR:CHARA_ID:宿泊先設備IDX
CALL HO_GET_MODULE_LIST(MODULE_IDX, "ROOM_IDX")
移動先ROOM_IDX = RESULT

;移動処理
IF RESULT != -1
    移動先ROOM_IDX = RESULT
ELSE
    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_移動先候補)
    RETURN 0
    ;移動の必要なし／既に設備のあるエリアに到着している
ELSE
    CALL HO_STOP_USE_MODULE(CHARA_ID)
    CALL HO_TRY_USE_MODULE(CHARA_ID,,,MODULE_IDX)
    IF RESULT == 1
        CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "睡眠中")
        TCVAR:CHARA_ID:疲労度 = 0
        TCVAR:CHARA_ID:睡眠深度 = 10000
        TCVAR:(CHARA_ID):離脱フラグ = 離脱フラグ_睡眠
        TCVAR:CHARA_ID:行動待機時間 = 72 * HO_単位時間
        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_移動先候補)
            RETURN 0
        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 現在の行動

;宿番を継続している場合、行動待機時間のみ延長する
IF TCVAR:CHARA_ID:HO直前の行動 == ACT_宿番
    ;大体1時間半位作業する
    TCVAR:CHARA_ID:行動待機時間 = RAND(18, 20) * HO_単位時間
    RETURN 1
ENDIF

;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)
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", "宿番中")
        ;大体1時間半位作業する
        TCVAR:CHARA_ID:行動待機時間 = RAND(18, 20) * HO_単位時間
        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_FIND_ROOM_BY_TAG("客室", 1)
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:睡眠深度 = 10000
        TCVAR:(CHARA_ID):離脱フラグ = 離脱フラグ_睡眠
        TCVAR:CHARA_ID:行動待機時間 = 72 * HO_単位時間
        RETURN 1
    ELSE
        RETURN -1
    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 現在の行動

;店番を継続している場合、行動待機時間のみ延長する
IF TCVAR:CHARA_ID:HO直前の行動 == ACT_店番
    ;大体1時間半位作業する
    TCVAR:CHARA_ID:行動待機時間 = RAND(18, 20) * HO_単位時間
    RETURN 1
ENDIF

;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)
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", "店番中")
        ;大体1時間半位作業する
        TCVAR:CHARA_ID:行動待機時間 = RAND(18, 20) * HO_単位時間
        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
;IDXを取得
CALL HO_GET_CHARAIDX(CHARA_ID)
CHARA_IDX = RESULT
CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "拘束中")
RETURN 1


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 MODULE_ID
#DIM  DYNAMIC MODULE_LIST_IDX
#DIMS DYNAMIC MODULE_LIST
#DIM  DYNAMIC TIMETABLE

;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_GET_TASK_SCH(CHARA_ID)
IF RESULT == -1
    RETURN -1
ELSE
    TIMETABLE = RESULT
ENDIF

;;作業を行う設備を確定する
;作業場リストが設定されている場合指定設備を優先する
IF 現在の行動 != "移動完了"
    IF LIST_COUNT(_LIST_HO_WORKPLACE:CHARA_ID:TIMETABLE)
        MODULE_LIST_IDX = TOINT(LIST_RAND(_LIST_HO_WORKPLACE:CHARA_ID:TIMETABLE))
        ;設備が配置されているエリアを取得
        CALL HO_GET_MODULE_LIST(MODULE_LIST_IDX, "ROOM_IDX")
        IF RESULT != -1
            移動先ROOM_IDX = RESULT
            CALL HO_SET_CHARADATA(CHARA_IDX, "TARGET_MODULE_LIST_IDX", TOSTR(MODULE_LIST_IDX))
        ELSE
            RETURN -1
        ENDIF
    ELSE
        ;作業場リストが未指定の場合は適合する設備のある最も近いエリアを目的地に
        CALL HO_FIND_NEAREST_ROOM_BY_MODULE_USAGE("採掘", ROOM_IDX)
        IF RESULT != -1
            移動先ROOM_IDX = RESULT
        ELSE
            RETURN -1
        ENDIF
    ENDIF

    CALL HO_GET_ROUTE(ROOM_IDX, 移動先ROOM_IDX)
    SIF RESULT == -1
        RETURN -1
    ;RESULTが0の場合既に目的地と同じ場所にいるので移動の必要なし
    IF RESULT != 0
        _LIST_移動先候補 = %RESULTS%
        CALL HO_STOP_USE_MODULE(CHARA_ID)
        CALL HO_SET_MOVELIST(CHARA_ID, _LIST_移動先候補)
        RETURN 0
    ENDIF
ENDIF

CALL HO_STOP_USE_MODULE(CHARA_ID)
CALL HO_GET_CHARADATA(CHARA_IDX, "TARGET_MODULE_LIST_IDX")
IF RESULT != -1
    CALL HO_TRY_USE_MODULE(CHARA_ID,,,RESULT)
ELSE
    CALL HO_TRY_USE_MODULE(CHARA_ID, "採掘",,,1)
ENDIF
IF RESULT == 1
    CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "採掘中")
    CALL HO_SET_CHARADATA(CHARA_IDX, "TARGET_MODULE_LIST_IDX", "")
    TCVAR:CHARA_ID:HO作業進捗量 = 0
    ;大体2時間位作業する
    TCVAR:CHARA_ID:行動待機時間 = RAND(24, 26) * HO_単位時間
    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

@HO_行動定義_採掘_生産物(CHARA_ID)
#DIM  CHARA_ID
#DIM  DYNAMIC MODULE_ID
#DIM  DYNAMIC PRODUCTION_RATE
#DIM  DYNAMIC ITEM_ID
#DIMS DYNAMIC ITEM_NAME
#DIM  DYNAMIC PRODUCT_ITEMS, ITEM_LENGTH
#DIM  DYNAMIC BASE_EXP = 3
#DIMS DYNAMIC EXP_NAME = "身体"

TCVAR:CHARA_ID:HO作業進捗量 += 10
TCVAR:CHARA_ID:疲労度 += 5

IF TCVAR:CHARA_ID:HO作業進捗量 > 100
    CALL HO_GET_USE_MODULE_INFO(CHARA_ID)
    MODULE_ID = RESULT
    SELECTCASE MODULE_ID
        CASE 157 ;採石場
            PRODUCTION_RATE = LIMIT((ABL:CHARA_ID:身体 / 40),1, 4)
            PRODUCT_ITEMS:ITEM_石材 = PRODUCTION_RATE
        CASE 158 ;鉄鉱脈
            PRODUCTION_RATE = LIMIT((ABL:CHARA_ID:身体 / 40),1, 4)
            PRODUCT_ITEMS:ITEM_鉄鉱石 = PRODUCTION_RATE
        CASE 162 ;マナ鉱脈
            PRODUCTION_RATE = LIMIT((ABL:CHARA_ID:身体 / 40),1, 4)
            PRODUCT_ITEMS:ITEM_マナ結晶 = PRODUCTION_RATE
        CASE 164 ;天然鉱
            PRODUCTION_RATE = LIMIT((ABL:CHARA_ID:身体 / 40),1, 4)
            SELECTCASE RAND:2
                CASE 1
                    PRODUCT_ITEMS:ITEM_硫黄 = PRODUCTION_RATE
                CASEELSE
                    PRODUCT_ITEMS:ITEM_石炭 = PRODUCTION_RATE
            ENDSELECT
        CASE 165 ;塩坑
            PRODUCTION_RATE = LIMIT((ABL:CHARA_ID:身体 / 40),1, 4)
            PRODUCT_ITEMS:ITEM_岩塩 = PRODUCTION_RATE
    ENDSELECT
    FOR ITEM_ID, 0, ITEM_LENGTH
        IF PRODUCT_ITEMS:ITEM_ID > 0
            CALL GET_ITEM_NAME(ITEM_ID)
            ITEM_NAME = %RESULTS%
            CALL HO_PRINT_LOG(@"%ANAME(CHARA_ID)%は@C:{カラー_黄}@%ITEM_NAME%@/C@を@C:{カラー_緑}@{PRODUCT_ITEMS:ITEM_ID}@/C@個採掘した")
            CALL CHANGE_ITEM_STOCK(ITEM_ID, PRODUCT_ITEMS:ITEM_ID)
        ENDIF
    NEXT
    ;作業による獲得経験値
    CALL HO_CHARAACT_ABLUP(CHARA_ID, "身体", BASE_EXP)
    TCVAR:CHARA_ID:HO作業進捗量 = 0
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 MODULE_ID
#DIM  DYNAMIC MODULE_LIST_IDX
#DIMS DYNAMIC MODULE_LIST
#DIM  DYNAMIC TIMETABLE

;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_GET_TASK_SCH(CHARA_ID)
IF RESULT == -1
    RETURN -1
ELSE
    TIMETABLE = RESULT
ENDIF

;;作業を行う設備を確定する
;作業場リストが設定されている場合指定設備を優先する
IF 現在の行動 != "移動完了"
    IF LIST_COUNT(_LIST_HO_WORKPLACE:CHARA_ID:TIMETABLE)
        MODULE_LIST_IDX = TOINT(LIST_RAND(_LIST_HO_WORKPLACE:CHARA_ID:TIMETABLE))
        ;設備が配置されているエリアを取得
        CALL HO_GET_MODULE_LIST(MODULE_LIST_IDX, "ROOM_IDX")
        IF RESULT != -1
            移動先ROOM_IDX = RESULT
            CALL HO_SET_CHARADATA(CHARA_IDX, "TARGET_MODULE_LIST_IDX", TOSTR(MODULE_LIST_IDX))
        ELSE
            RETURN -1
        ENDIF
    ELSE
        ;作業場リストが未指定の場合は適合する設備のある最も近いエリアを目的地に
        CALL HO_FIND_NEAREST_ROOM_BY_MODULE_USAGE("採集", ROOM_IDX)
        IF RESULT != -1
            移動先ROOM_IDX = RESULT
        ELSE
            RETURN -1
        ENDIF
    ENDIF

    CALL HO_GET_ROUTE(ROOM_IDX, 移動先ROOM_IDX)
    SIF RESULT == -1
        RETURN -1
    ;RESULTが0の場合既に目的地と同じ場所にいるので移動の必要なし
    IF RESULT != 0
        _LIST_移動先候補 = %RESULTS%
        CALL HO_STOP_USE_MODULE(CHARA_ID)
        CALL HO_SET_MOVELIST(CHARA_ID, _LIST_移動先候補)
        RETURN 0
    ENDIF
ELSE
    CALL HO_STOP_USE_MODULE(CHARA_ID)
    CALL HO_GET_CHARADATA(CHARA_IDX, "TARGET_MODULE_LIST_IDX")
    IF RESULT != -1
        CALL HO_TRY_USE_MODULE(CHARA_ID,,,RESULT)
    ELSE
        CALL HO_TRY_USE_MODULE(CHARA_ID, "採集",,,1)
    ENDIF
    IF RESULT == 1
        CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "採集中")
        CALL HO_SET_CHARADATA(CHARA_IDX, "TARGET_MODULE_LIST_IDX", "")
        TCVAR:CHARA_ID:HO作業進捗量 = 0
        ;大体2時間位作業する
        TCVAR:CHARA_ID:行動待機時間 = RAND(24, 26) * HO_単位時間
        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

@HO_行動定義_採集_生産物(CHARA_ID)
#DIM  CHARA_ID
#DIM  DYNAMIC MODULE_ID
#DIM  DYNAMIC PRODUCTION_RATE
#DIM  DYNAMIC ITEM_ID
#DIMS DYNAMIC ITEM_NAME
#DIMS DYNAMIC EXP_NAME
#DIM  DYNAMIC BASE_EXP
#DIM  DYNAMIC PRODUCT_ITEMS, ITEM_LENGTH

TCVAR:CHARA_ID:HO作業進捗量 += 10
TCVAR:CHARA_ID:疲労度 += 5

IF TCVAR:CHARA_ID:HO作業進捗量 > 100
    CALL HO_生産物定義_採集(PRODUCT_ITEMS, CHARA_ID)
    BASE_EXP = RESULT
    EXP_NAME = %RESULTS%
    FOR ITEM_ID, 0, ITEM_LENGTH
        IF PRODUCT_ITEMS:ITEM_ID > 0
            CALL GET_ITEM_NAME(ITEM_ID)
            ITEM_NAME = %RESULTS%
            CALL HO_GET_USE_MODULE_INFO(CHARA_ID)
            MODULE_ID = RESULT
            IF MODULE_ID == 27 ;小川のみ　カニの肉を〇匹……？
                CALL HO_PRINT_LOG(@"%ANAME(CHARA_ID)%は@C:{カラー_黄}@%ITEM_NAME%@/C@を@C:{カラー_緑}@{PRODUCT_ITEMS:ITEM_ID}@/C@匹採集した")
            ELSE
                CALL HO_PRINT_LOG(@"%ANAME(CHARA_ID)%は@C:{カラー_黄}@%ITEM_NAME%@/C@を@C:{カラー_緑}@{PRODUCT_ITEMS:ITEM_ID}@/C@個採集した")
            ENDIF
            CALL CHANGE_ITEM_STOCK(ITEM_ID, PRODUCT_ITEMS:ITEM_ID)
        ENDIF
    NEXT
    IF BASE_EXP > 0
        CALL HO_CHARAACT_ABLUP(CHARA_ID, EXP_NAME, BASE_EXP)
    ENDIF
    TCVAR:CHARA_ID:HO作業進捗量 = 0
ENDIF

@HO_生産物定義_採集(PRODUCT_ITEMS, CHARA_ID)
#DIM REF PRODUCT_ITEMS
#DIM CHARA_ID
#DIM  DYNAMIC MODULE_ID
#DIM  DYNAMIC PRODUCTION_RATE
#DIM  DYNAMIC ITEM_ID
#DIMS DYNAMIC ITEM_NAME
#DIM  DYNAMIC BASE_EXP
#DIM  DYNAMIC EXP_RATE
#DIM  DYNAMIC GAIN_EXP
#DIMS DYNAMIC EXP_NAME

CALL HO_GET_USE_MODULE_INFO(CHARA_ID)
MODULE_ID = RESULT
SELECTCASE MODULE_ID
    CASE 27 ;小川 カニかごの有無、季節や時間（アイテム側で定義）で取れる量を変動
        CALL HO_EXIST_MAP_EFFECT("カニかご", CHARA_ID)
        IF RESULT
            $RESELECT
            ;観察が高いほど、スッポンを引く確率が上がっていく仕様
            SELECTCASE RAND:(100 + SQRT(ABL:CHARA_ID:観察))
                CASE 0 TO 10
                    PRODUCTION_RATE = LIMIT((ABL:CHARA_ID:観察 / 40),1, 3)
                    CALL GET_ITEM_INFO(ITEM_川エビ, ITEM_基準生産量)
                    PRODUCT_ITEMS:ITEM_川エビ = RESULT + PRODUCTION_RATE
                    BASE_EXP = 3
                CASE 11 TO 60
                    PRODUCTION_RATE = LIMIT((ABL:CHARA_ID:観察 / 40),1, 3)
                    CALL GET_ITEM_INFO(ITEM_ザリガニ, ITEM_基準生産量)
                    PRODUCT_ITEMS:ITEM_ザリガニ = RESULT + PRODUCTION_RATE
                    BASE_EXP = 3
                CASE 61 TO 85
                    SIF HO_SEASON()==HO_季節_冬
                        GOTO RESELECT
                    PRODUCTION_RATE = LIMIT((ABL:CHARA_ID:観察 / 60),1, 2)
                    CALL GET_ITEM_INFO(ITEM_カニの肉, ITEM_基準生産量)
                    PRODUCT_ITEMS:ITEM_カニの肉 = RESULT + PRODUCTION_RATE
                    BASE_EXP = 6
                CASEELSE
                    SIF HO_SEASON()==HO_季節_冬
                        GOTO RESELECT
                    PRODUCTION_RATE = 0
                    CALL GET_ITEM_INFO(ITEM_スッポン, ITEM_基準生産量)
                    PRODUCT_ITEMS:ITEM_スッポン = RESULT + PRODUCTION_RATE
                    BASE_EXP = 9
            ENDSELECT
        ELSE
            PRODUCTION_RATE = LIMIT((ABL:CHARA_ID:観察 / 40),1, 3)
            CALL GET_ITEM_INFO(ITEM_川エビ, ITEM_基準生産量)
            PRODUCT_ITEMS:ITEM_川エビ = RESULT + PRODUCTION_RATE
            BASE_EXP = 3
        ENDIF
        EXP_NAME '= "観察"
    CASE 156 ;伐採場
        PRODUCTION_RATE = LIMIT((ABL:CHARA_ID:身体 / 40),1, 4)
        CALL GET_ITEM_INFO(ITEM_木材, ITEM_基準生産量)
        PRODUCT_ITEMS:ITEM_木材 = RESULT + PRODUCTION_RATE
        BASE_EXP = 3
        EXP_NAME '= "身体"
    CASE 155 ;薬草群生地
        PRODUCTION_RATE = LIMIT((ABL:CHARA_ID:知識 / 40),1, 4)
        CALL GET_ITEM_INFO(ITEM_薬草, ITEM_基準生産量)
        PRODUCT_ITEMS:ITEM_薬草 = RESULT + PRODUCTION_RATE
        CALL GET_ITEM_INFO(ITEM_香草, ITEM_基準生産量)
        PRODUCT_ITEMS:ITEM_香草 = RESULT + PRODUCTION_RATE
        BASE_EXP = 3
        EXP_NAME '= "知識"
    CASE 163 ;狩場 観察と体力の程度で、鮮肉の大塊の出現率を上げる
        PRODUCTION_RATE = LIMIT((ABL:CHARA_ID:器用 / 40),1, 4)
        IF RAND:(MAX(60, 300 - (ABL:CHARA_ID:観察 + ABL:CHARA_ID:身体))) < 40
            CALL GET_ITEM_INFO(ITEM_鮮肉の大塊, ITEM_基準生産量)
            PRODUCT_ITEMS:ITEM_鮮肉の大塊 = RESULT
            CALL GET_ITEM_INFO(ITEM_動物の革, ITEM_基準生産量)
            PRODUCT_ITEMS:ITEM_動物の革 = RESULT + (PRODUCTION_RATE * 2)
            BASE_EXP = 9
        ELSE
            CALL GET_ITEM_INFO(ITEM_動物の肉, ITEM_基準生産量)
            PRODUCT_ITEMS:ITEM_動物の肉 = RESULT + PRODUCTION_RATE
            CALL GET_ITEM_INFO(ITEM_動物の革, ITEM_基準生産量)
            PRODUCT_ITEMS:ITEM_動物の革 = RESULT + PRODUCTION_RATE
            BASE_EXP = 3
        ENDIF
        EXP_NAME '= "器用"
    CASE 150 ;畑
        PRODUCTION_RATE = LIMIT((ABL:CHARA_ID:器用 / 40),1, 4)
        CALL GET_ITEM_INFO(ITEM_小麦, ITEM_基準生産量)
        PRODUCT_ITEMS:ITEM_小麦 = RESULT + PRODUCTION_RATE
        BASE_EXP = 3
        EXP_NAME '= "器用"
    CASE 151 ;菜園 季節で取れる作物を変更
        PRODUCTION_RATE = LIMIT((ABL:CHARA_ID:器用 / 40),1, 4)
        SELECTCASE HO_SEASON()
            CASE 0 ;春
                CALL GET_ITEM_INFO(ITEM_キャベツ, ITEM_基準生産量)
                PRODUCT_ITEMS:ITEM_キャベツ = RESULT + PRODUCTION_RATE
                CALL GET_ITEM_INFO(ITEM_ニンニク, ITEM_基準生産量)
                PRODUCT_ITEMS:ITEM_ニンニク = RESULT + PRODUCTION_RATE
            CASE 1 ;夏
                CALL GET_ITEM_INFO(ITEM_トマト, ITEM_基準生産量)
                PRODUCT_ITEMS:ITEM_トマト = RESULT + PRODUCTION_RATE
                CALL GET_ITEM_INFO(ITEM_カボチャ, ITEM_基準生産量)
                PRODUCT_ITEMS:ITEM_カボチャ = RESULT + PRODUCTION_RATE
            CASE 2 ;秋
                CALL GET_ITEM_INFO(ITEM_ニンジン, ITEM_基準生産量)
                PRODUCT_ITEMS:ITEM_ニンジン = RESULT + PRODUCTION_RATE
                CALL GET_ITEM_INFO(ITEM_タマネギ, ITEM_基準生産量)
                PRODUCT_ITEMS:ITEM_タマネギ = RESULT + PRODUCTION_RATE
            CASE 3 ;冬
                CALL GET_ITEM_INFO(ITEM_カブ, ITEM_基準生産量)
                PRODUCT_ITEMS:ITEM_カブ = RESULT + PRODUCTION_RATE
                CALL GET_ITEM_INFO(ITEM_ネギ, ITEM_基準生産量)
                PRODUCT_ITEMS:ITEM_ネギ = RESULT + PRODUCTION_RATE
        ENDSELECT
        BASE_EXP = 3
        EXP_NAME '= "器用"
    CASE 170 ;厩
        PRODUCTION_RATE = LIMIT((ABL:CHARA_ID:観察 / 40),1, 4)
        CALL GET_ITEM_INFO(ITEM_動物性油, ITEM_基準生産量)
        PRODUCT_ITEMS:ITEM_動物性油 = RESULT + PRODUCTION_RATE
        CALL GET_ITEM_INFO(ITEM_動物の糞, ITEM_基準生産量)
        PRODUCT_ITEMS:ITEM_動物の糞 = RESULT + PRODUCTION_RATE
        BASE_EXP = 3
        EXP_NAME '= "観察"
    CASE 171 ;鶏小屋
        PRODUCTION_RATE = LIMIT((ABL:CHARA_ID:観察 / 40),1, 4)
        CALL GET_ITEM_INFO(ITEM_動物の卵, ITEM_基準生産量)
        PRODUCT_ITEMS:ITEM_動物の卵 = RESULT + PRODUCTION_RATE
        CALL GET_ITEM_INFO(ITEM_鳥の羽, ITEM_基準生産量)
        PRODUCT_ITEMS:ITEM_鳥の羽 = RESULT + PRODUCTION_RATE
        BASE_EXP = 3
        EXP_NAME '= "観察"
    CASE 172 ;豚小屋
        PRODUCTION_RATE = LIMIT((ABL:CHARA_ID:観察 / 40),1, 4)
        CALL GET_ITEM_INFO(ITEM_動物の肉, ITEM_基準生産量)
        PRODUCT_ITEMS:ITEM_動物の肉 = FTIMES(RESULT + PRODUCTION_RATE, 150)
        BASE_EXP = 3
        EXP_NAME '= "観察"
    CASE 173 ;牛舎
        PRODUCTION_RATE = LIMIT((ABL:CHARA_ID:観察 / 40),1, 4)
        CALL GET_ITEM_INFO(ITEM_乳, ITEM_基準生産量)
        PRODUCT_ITEMS:ITEM_乳 = RESULT + PRODUCTION_RATE
        CALL GET_ITEM_INFO(ITEM_動物の革, ITEM_基準生産量)
        PRODUCT_ITEMS:ITEM_動物の革 = RESULT + PRODUCTION_RATE
        BASE_EXP = 3
        EXP_NAME '= "観察"
    CASE 457 ;ワーグの檻
        PRODUCTION_RATE = LIMIT((ABL:CHARA_ID:観察 / 40),1, 4)
        CALL GET_ITEM_INFO(ITEM_魔獣の肉片, ITEM_基準生産量)
        PRODUCT_ITEMS:ITEM_魔獣の肉片 = RESULT + PRODUCTION_RATE
        BASE_EXP = 3
        EXP_NAME '= "観察"
    CASE 460 ;触手の槽
        PRODUCTION_RATE = LIMIT((ABL:CHARA_ID:知識 / 40),1, 4)
        CALL GET_ITEM_INFO(ITEM_魔獣の肉片, ITEM_基準生産量)
        PRODUCT_ITEMS:ITEM_魔獣の肉片 = FTIMES(RESULT + PRODUCTION_RATE, 75)
        CALL GET_ITEM_INFO(ITEM_精液, ITEM_基準生産量)
        PRODUCT_ITEMS:ITEM_精液 = FTIMES(RESULT + PRODUCTION_RATE, 50)
        BASE_EXP = 3
        EXP_NAME '= "知識"
ENDSELECT

;作業による獲得経験値

RESULTS = %EXP_NAME%
RETURN BASE_EXP


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 MODULE_ID
#DIM  DYNAMIC MODULE_LIST_IDX
#DIMS DYNAMIC MODULE_LIST
#DIM  DYNAMIC TIMETABLE

;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_GET_TASK_SCH(CHARA_ID)
IF RESULT == -1
    RETURN -1
ELSE
    TIMETABLE = RESULT
ENDIF

;;作業を行う設備を確定する
;作業場リストが設定されている場合指定設備を優先する
IF 現在の行動 != "移動完了"
    IF LIST_COUNT(_LIST_HO_WORKPLACE:CHARA_ID:TIMETABLE)
        MODULE_LIST_IDX = TOINT(LIST_RAND(_LIST_HO_WORKPLACE:CHARA_ID:TIMETABLE))
        ;設備が配置されているエリアを取得
        CALL HO_GET_MODULE_LIST(MODULE_LIST_IDX, "ROOM_IDX")
        IF RESULT != -1
            移動先ROOM_IDX = RESULT
            CALL HO_SET_CHARADATA(CHARA_IDX, "TARGET_MODULE_LIST_IDX", TOSTR(MODULE_LIST_IDX))
        ELSE
            RETURN -1
        ENDIF
    ELSE
        ;作業場リストが未指定の場合は適合する設備のある最も近いエリアを目的地に
        CALL HO_FIND_NEAREST_ROOM_BY_MODULE_USAGE("搾乳", ROOM_IDX)
        IF RESULT != -1
            移動先ROOM_IDX = RESULT
        ELSE
            RETURN -1
        ENDIF
    ENDIF

    CALL HO_GET_ROUTE(ROOM_IDX, 移動先ROOM_IDX)
    SIF RESULT == -1
        RETURN -1
    ;RESULTが0の場合既に目的地と同じ場所にいるので移動の必要なし
    IF RESULT != 0
        _LIST_移動先候補 = %RESULTS%
        CALL HO_STOP_USE_MODULE(CHARA_ID)
        CALL HO_SET_MOVELIST(CHARA_ID, _LIST_移動先候補)
        RETURN 0
    ENDIF
ELSE
    CALL HO_STOP_USE_MODULE(CHARA_ID)
    CALL HO_GET_CHARADATA(CHARA_IDX, "TARGET_MODULE_LIST_IDX")
    IF RESULT != -1
        CALL HO_TRY_USE_MODULE(CHARA_ID,,,RESULT)
    ELSE
        CALL HO_TRY_USE_MODULE(CHARA_ID, "搾乳",,,1)
    ENDIF
    IF RESULT == 1
        CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "搾乳中")
        CALL HO_SET_CHARADATA(CHARA_IDX, "TARGET_MODULE_LIST_IDX", "")
        CALL SET_EQUIP_EX(T_N("搾乳機"), MASTER, CHARA_ID, 1)
        TCVAR:CHARA_ID:HO作業進捗量 = 0
        ;大体3時間位作業する
        TCVAR:CHARA_ID:行動待機時間 = RAND(30, 36) * HO_単位時間
        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

@HO_行動定義_搾乳_生産物(CHARA_ID)
#DIM  CHARA_ID
#DIM  DYNAMIC MODULE_ID
#DIM  DYNAMIC PRODUCTION_RATE
#DIM  DYNAMIC ITEM_ID
#DIMS DYNAMIC ITEM_NAME
#DIMS DYNAMIC EXP_NAME
#DIM  DYNAMIC BASE_EXP
#DIM  DYNAMIC PRODUCT_ITEMS, ITEM_LENGTH

TCVAR:CHARA_ID:HO作業進捗量 += 10
TCVAR:CHARA_ID:疲労度 += 5

IF TCVAR:CHARA_ID:HO作業進捗量 > 100
    CALL HO_生産物定義_搾乳(PRODUCT_ITEMS, CHARA_ID)
    BASE_EXP = RESULT
    EXP_NAME = %RESULTS%
    FOR ITEM_ID, 0, ITEM_LENGTH
        IF PRODUCT_ITEMS:ITEM_ID > 0
            CALL GET_ITEM_NAME(ITEM_ID)
            ITEM_NAME = %RESULTS%
            CALL HO_PRINT_LOG(@"%ANAME(CHARA_ID)%から@C:{カラー_ピンク}@%ITEM_NAME%@/C@を@C:{カラー_緑}@{PRODUCT_ITEMS:ITEM_ID}@/C@搾り取った")
            CALL FUCK(CHARA_ID, "欲望, Ｂ, 噴乳, マゾ")
            CALL CHANGE_ITEM_STOCK(ITEM_ID, PRODUCT_ITEMS:ITEM_ID)
        ENDIF
    NEXT
    IF BASE_EXP > 0
        CALL HO_CHARAACT_ABLUP(CHARA_ID, EXP_NAME, BASE_EXP)
    ENDIF
    TCVAR:CHARA_ID:HO作業進捗量 = 0
ENDIF

@HO_生産物定義_搾乳(PRODUCT_ITEMS, CHARA_ID)
#DIM REF PRODUCT_ITEMS
#DIM CHARA_ID
#DIM  DYNAMIC MODULE_ID
#DIM  DYNAMIC PRODUCTION_RATE
#DIM  DYNAMIC ITEM_ID
#DIMS DYNAMIC ITEM_NAME
#DIM  DYNAMIC BASE_EXP
#DIM  DYNAMIC EXP_RATE
#DIM  DYNAMIC GAIN_EXP
#DIMS DYNAMIC EXP_NAME
#DIM  DYNAMIC SKILL_LV

CALL HO_GET_USE_MODULE_INFO(CHARA_ID)
MODULE_ID = RESULT
SELECTCASE MODULE_ID
    CASE 173 ;牛舎
        PRODUCTION_RATE = LIMIT((ABL:CHARA_ID:身体 / 40),1, 4)
        CALL GET_ITEM_INFO(ITEM_乳, ITEM_基準生産量)
        PRODUCT_ITEMS:ITEM_乳 = RESULT + PRODUCTION_RATE
        PRODUCT_ITEMS:ITEM_乳 += HAS_SKILL(CHARA_ID, "MILK_INFLATION", スキル_大分類_性技)
        BASE_EXP = 3
        EXP_NAME '= "身体"
ENDSELECT

;作業による獲得経験値

RESULTS = %EXP_NAME%
RETURN BASE_EXP


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 衣装プリセット

;行動を継続している場合、行動待機時間のみ延長する
IF TCVAR:CHARA_ID:HO直前の行動 == ACT_水浴び
    TCVAR:CHARA_ID:行動待機時間 = RAND(6, 8) * HO_単位時間
    RETURN 1
ENDIF

;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)
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:疲労度 = 0
        BASE:(CHARA_ID):体力 = LIMIT(BASE:(CHARA_ID):体力 + 200, BASE:(CHARA_ID):体力, MAXBASE:(CHARA_ID):体力)
        BASE:(CHARA_ID):気力 = LIMIT(BASE:(CHARA_ID):気力 + 100, BASE:(CHARA_ID):気力, MAXBASE:(CHARA_ID):気力)
        CALL HO_WASH(CHARA_ID)
        TCVAR:CHARA_ID:行動待機時間 = RAND(6, 12) * HO_単位時間

        ;見られる心配がなければ脱ぐ
        CALL HO_CHECK_USE_MODULE_ELEMENT(CHARA_ID, "遮蔽")
        IF RESULT
            CALL HO_CHECK_PUBLIC_EYE(CHARA_ID)
            IF !RESULT
                CALL HO_UNDRESS(CHARA_ID)
                ;見られる可能性があるなら水着に着替える
            ELSE
                ;現在のプリセットを退避し、水着を適用
                衣装プリセット = CFLAG:CHARA_ID:衣装プリセット
                CFLAG:CHARA_ID:衣装プリセット変更予約 = 衣装プリセット_水着
                CALL HO_REDRESS(CHARA_ID)
                ;次回の着替え時に水着から元のプリセットに戻す
                CFLAG:CHARA_ID:衣装プリセット変更予約 = 衣装プリセット
            ENDIF
        ENDIF
        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_FIND_ROOM_BY_TAG("浴室", 1)
IF RESULT != -1
    移動先ROOM_IDX = RESULT
ELSE
    TFLAG:経路_浴室なし = 1
    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_UNDRESS(CHARA_ID)
        CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "入浴中")
        CALL HO_WASH(CHARA_ID)
        TCVAR:CHARA_ID:疲労度 += 100
        TCVAR:CHARA_ID:行動待機時間 = RAND(6, 9) * HO_単位時間
        RETURN 1
    ELSE
        RETURN -1
    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 現在の行動
#DIMS DYNAMIC MAP

;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
        ROOM_IDX = C_COND_MAP_GET(CHARA_ID, "エリアIDX")
        MAP '= @"MAP_{ROOM_IDX}_ROOM_EFFECT"
        CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "演奏中")
        ;演奏系エリア効果付与。演奏系効果は奏者がいなくなると自動解除されるので効果時間は無制限"0"でよい
        ;DEBUGPRINTFORML ピアノ演奏判定C_COND_MAP_GET(CHARA_ID, "設備") {C_COND_MAP_GET(CHARA_ID, "設備")}
        SELECTCASE C_COND_MAP_GET(CHARA_ID, "設備")
            CASE 18 ;ピアノ
                MAP_SET MAP, "ピアノの音色", "0"
            CASE 205, 206 ;舞台、ステージ
                MAP_SET MAP, "歌唱", "0"
            CASEELSE
        ENDSELECT
        IF HO_OCLOCK() >= 1800
            CALL SKILL_GET_LEVEL(CHARA_ID, スキル_大分類_性技, "LEWD_SERENADE")
            IF RESULT > 0
                MAP_SET MAP, "煽欲の小夜曲", "0"
            ENDIF
        ENDIF
        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 現在の行動
#DIM  DYNAMIC 配膳フラグ
#DIMS DYNAMIC MAP

ROOM_IDX = C_COND_MAP_GET(CHARA_ID, "エリアIDX")
MAP '= @"MAP_{ROOM_IDX}_ROOM_EFFECT"

SELECTCASE HO_OCLOCK()
    CASE 830  TO 1059
        IF GETBIT(TCVAR:CHARA_ID:料理実施済, 1)
            RETURN -1
        ENDIF
    CASE 1100 TO 1230
        IF GETBIT(TCVAR:CHARA_ID:料理実施済, 1) && MAP_HAS(MAP, "昼食準備済") < 1
            配膳フラグ = 1
        ELSE
            RETURN -1
        ENDIF
    CASE 1400 TO 1659
        IF GETBIT(TCVAR:CHARA_ID:料理実施済, 2)
            RETURN -1
        ENDIF
    CASE 1700 TO 1859
        IF GETBIT(TCVAR:CHARA_ID:料理実施済, 2) && MAP_HAS(MAP, "夕食準備済") < 1
            配膳フラグ = 2
        ELSE
            RETURN -1
        ENDIF
    CASE 1900 TO 2359
        IF GETBIT(TCVAR:CHARA_ID:料理実施済, 3)
            IF MAP_HAS(MAP, "軽食準備済") < 1
                配膳フラグ = 3
            ELSE
                RETURN -1
            ENDIF
        ENDIF
    CASEELSE
        RETURN -1
ENDSELECT

;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 配膳フラグ
    CALL HO_FIND_ROOM_BY_TAG("食堂")
ELSE
    CALL HO_FIND_ROOM_BY_MODULE_USAGE("炊事", ROOM_IDX)
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
    IF !配膳フラグ
        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(18, 24) * HO_単位時間
            RETURN 1
        ELSE
            RETURN -1
        ENDIF
    ELSE
        CALL HO_STOP_USE_MODULE(CHARA_ID)
        CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "配膳中")
        ROOM_IDX = C_COND_MAP_GET(CHARA_ID, "エリアIDX")
        MAP '= @"MAP_{ROOM_IDX}_ROOM_EFFECT"
        SELECTCASE 配膳フラグ
            CASE 1 ;昼食
                MAP_SET MAP, "昼食準備済", "120"
            CASE 2 ;夕食
                MAP_SET MAP, "夕食準備済", "120"
            CASE 3 ;軽食
                MAP_SET MAP, "軽食準備済", "210"
        ENDSELECT
        TCVAR:CHARA_ID:行動待機時間 = RAND(6, 9) * HO_単位時間
        RETURN 1
    ENDIF
ENDIF

@HO_行動定義_炊事_配膳(CHARA_ID)
#DIM CHARA_ID

@HO_行動定義_炊事_生産物(CHARA_ID)
#DIM  CHARA_ID
#DIM  DYNAMIC MODULE_ID
#DIM  DYNAMIC PRODUCTION_RATE
#DIM  DYNAMIC ITEM_ID
#DIMS DYNAMIC ITEM_NAME
#DIM  DYNAMIC PRODUCT_ITEMS, ITEM_LENGTH
#DIMS DYNAMIC EXP_NAME = "料理"
#DIM  DYNAMIC BASE_EXP = 4

TCVAR:CHARA_ID:HO作業進捗量 += 8
TCVAR:CHARA_ID:疲労度 += 15

IF TCVAR:CHARA_ID:HO作業進捗量 > 100
    CALL HO_生産物定義_炊事(PRODUCT_ITEMS, CHARA_ID)
    IF INRANGE(HO_OCLOCK(), 700, 1200)
        LOCALS '= "昼食"
        SETBIT TCVAR:CHARA_ID:料理実施済, 1
    ELSEIF INRANGE(HO_OCLOCK(), 1300, 1800)
        LOCALS '= "夕食"
        SETBIT TCVAR:CHARA_ID:料理実施済, 2
    ELSEIF HO_OCLOCK() > 1800
        LOCALS '= "軽食"
        SETBIT TCVAR:CHARA_ID:料理実施済, 3
    ENDIF
    CALL HO_PRINT_LOG(@"%ANAME(CHARA_ID)%は@C:{カラー_黄}@%LOCALS%を調理@/C@し終えた")
    TCVAR:CHARA_ID:HO作業進捗量 = 0
    TCVAR:CHARA_ID:行動待機時間 = 0
    CALL HO_CHARAACT_ABLUP(CHARA_ID, EXP_NAME, BASE_EXP)
    IF LIST_INDEXOF(HO_LIST_調理担当者, TOSTR(CHARA_ID)) == -1
        HO_LIST_調理担当者 = %LIST_ADD(HO_LIST_調理担当者, TOSTR(CHARA_ID))%
    ENDIF
    CALL HO_SET_CHARAACT(CHARA_ID, "待機")
ENDIF

@HO_生産物定義_炊事(PRODUCT_ITEMS, CHARA_ID)
#DIM REF PRODUCT_ITEMS
#DIM CHARA_ID
#DIM  DYNAMIC MODULE_ID
#DIM  DYNAMIC PRODUCTION_RATE
#DIM  DYNAMIC ITEM_ID
#DIMS DYNAMIC ITEM_NAME

CALL HO_GET_USE_MODULE_INFO(CHARA_ID)
MODULE_ID = RESULT
SELECTCASE MODULE_ID
    CASE 302 ;キッチン
        PRODUCTION_RATE = LIMIT((ABL:CHARA_ID:料理 / 15),1, 20)
        TFLAG:料理準備度 += PRODUCTION_RATE
        CALL SKILL_GET_LEVEL(CHARA_ID, スキル_大分類_生活, "K9_UNIQUE_SKILL_MASTER_CHEF")
        IF RESULT
            TFLAG:料理準備度 += RESULT
        ENDIF
ENDSELECT

@HO_献立名リスト()
#FUNCTIONS
#DIMS DYNAMIC MAP
#DIMS DYNAMIC 料理名
MAP '= @"MAP_{HO_MASTER現在地}_ROOM_EFFECT"

VARSET LOCALS

SELECTCASE TFLAG:料理準備度 + RAND:3
    CASE 0 TO 1
        LOCALS:0 '= S_R("カリカリの堅パン/蒸しただけの馬鈴薯/年季の入った干し肉/雑草サラダ/申し訳程度に炒めた野草/お湯スープ")
        RETURNF LOCALS:0
    CASE 2 TO 4
        LOCALS:0 '= S_R(@"辛うじて口に入る/悲しみに満ちた/絶望感に満ちた/悲劇的な/悲壮感あふれる/名伏し難き/酷く歪な/恐ろしく%S_R("しょっぱい/甘い/辛い/味のしない")%")
        LOCALS:2 '= S_R("///めいたもの/のような何か/を目指した何か/の残骸/のなり損ない/もどき")
    CASE 5 TO 8
        LOCALS:0 '= S_R("良い香りのする/まずまずの//無難な/そつのない/良い風味の/手堅い完成度の/悪くない/そこそこの/家庭的な")
    CASEELSE
        LOCALS:0 '= S_R("宮廷的な/絶品の/至高の/豪華絢爛な/芳醇な風味の/思わず舌鼓を打つ/素晴らしく美味しい")
ENDSELECT
IF MAP_HAS(MAP, "昼食準備済") > 0 || MAP_HAS(MAP, "夕食準備済") > 0
    LOCALS:1 '= S_R("野菜スープ/オードブル/パスタ/ピザ/肉料理/芋料理/ミンスパイ/星見パイ/ローストチキン/北海魚の煮凝り/レルム風パエリア")
ELSE
    LOCALS:1 '= S_R("野菜スープ/プリン/スコーン/ノルディアン・イブニングティ/フロリアンパフェ/ミルフィーユ/チーズケーキ/クレープ")
ENDIF
料理名 = %LOCALS:0 + LOCALS:1 + LOCALS:2%
RETURNF 料理名


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_ROOM_BY_TAG("客室", 1)
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:行動待機時間 = 72 * HO_単位時間
        RETURN 1
    ELSE
        RETURN -1
    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_FIND_ROOM_BY_TAG("牢獄", 1)
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, "居房")
    CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "監禁中")
    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%

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_REDRESS(CHARA_ID, 1)
        CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "着替中")
        TCVAR:CHARA_ID:行動待機時間 = RAND(6, 12) * HO_単位時間
        RETURN 1
    ELSE
        RETURN -1
    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 現在の行動

;睡眠を継続している場合、行動待機時間のみ延長する
IF TCVAR:CHARA_ID:HO直前の行動 == ACT_睡眠
    ;大体1時間半位延長する
    TCVAR:CHARA_ID:行動待機時間 = RAND(18, 20) * HO_単位時間
    RETURN 1
ENDIF

;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)
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:疲労度 = 0
        BASE:(CHARA_ID):体力 = LIMIT(BASE:(CHARA_ID):体力 + 100, BASE:(CHARA_ID):体力, MAXBASE:(CHARA_ID):体力)
        BASE:(CHARA_ID):気力 = LIMIT(BASE:(CHARA_ID):気力 + 50, BASE:(CHARA_ID):気力, MAXBASE:(CHARA_ID):気力)
        TCVAR:CHARA_ID:行動待機時間 = RAND(6, 12) * HO_単位時間
        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_FIND_NEAREST_ROOM_BY_MODULE_ELEMENT("遮蔽", ROOM_IDX)
IF RESULT != -1
    移動先ROOM_IDX = RESULT
ELSE
    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_CHECK_PUBLIC_EYE(CHARA_ID)
        IF RESULT
            RETURN -1
        ENDIF
        CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "自慰中")
        CALL HO_STRIP(CHARA_ID, 被覆部位_乳首, 衣装状態_半脱)
        CALL HO_STRIP(CHARA_ID, 被覆部位_秘部, 衣装状態_半脱)
        TCVAR:CHARA_ID:疲労度 = 0
        TCVAR:CHARA_ID:行動待機時間 = RAND(6, 12) * HO_単位時間
        TCVAR:CHARA_ID:自慰フラグ = 0
        RETURN 1
    ELSE
        CALL HO_FIND_NEAREST_ROOM_BY_MODULE_ELEMENT("遮蔽", 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
#DIMS DYNAMIC _LIST_移動先候補
#DIMS DYNAMIC 現在の行動
#DIM  DYNAMIC 決定行動

;クエスト中のゲストモブは勝手に自由行動しない
SIF FLAG:クエストモード && CFLAG:CHARA_ID:ゲストモブ
    RETURN 0
;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_行動定義_監禁(CHARA_ID)
    RETURN RESULT
ENDIF

;行動抽選用の重みセット
CALL RAND_WT_INIT()
IF !CFLAG:CHARA_ID:ゲストモブ
    CALL RAND_WT_SET(ACT_徘徊, 10)
    ;おひるとおゆはん30分前であれば自由行動
    IF INRANGE(HO_OCLOCK(), 0, 1129) || INRANGE(HO_OCLOCK(), 0, 1729)
        IF TALENT:CHARA_ID:サボり魔
            CALL RAND_WT_SET(ACT_自主訓練, 10)
        ELSE
            CALL RAND_WT_SET(ACT_自主訓練, 30)
        ENDIF
        SELECTCASE HO_SEASON()
            CASE HO_季節_春
                IF !TFLAG:経路_水場なし
                    CALL RAND_WT_SET(ACT_釣り, 45)
                    CALL RAND_WT_SET(ACT_水浴び, 30)
                ENDIF
                CALL RAND_WT_SET(ACT_遊戯, 20)
            CASE HO_季節_夏
                IF !TFLAG:経路_水場なし
                    CALL RAND_WT_SET(ACT_釣り, 30)
                    CALL RAND_WT_SET(ACT_水浴び, 45)
                ENDIF
                CALL RAND_WT_SET(ACT_遊戯, 20)
            CASE HO_季節_秋
                IF !TFLAG:経路_水場なし
                    CALL RAND_WT_SET(ACT_釣り, 45)
                    CALL RAND_WT_SET(ACT_水浴び, 15)
                ENDIF
                CALL RAND_WT_SET(ACT_遊戯, 30)
                CALL RAND_WT_SET(ACT_読書, 20)
            CASE HO_季節_冬
                CALL RAND_WT_SET(ACT_遊戯, 45)
                CALL RAND_WT_SET(ACT_読書, 20)
                CALL RAND_WT_SET(ACT_休憩, 10)
        ENDSELECT
        ;夜の行動
    ELSEIF HO_OCLOCK() > 2000
        ;芸能型か歌唱値の高いメンバーが演奏を披露
        IF (ABL:CHARA_ID:歌唱 >= 60 || TALENT:CHARA_ID:成長型 == 7) && !RAND:3
            CALL RAND_WT_SET(ACT_演奏, 40)
        ELSEIF !TALENT:CHARA_ID:幼稚 || !TALENT:CHARA_ID:幼児
            IF TALENT:CHARA_ID:サボり魔 || TALENT:CHARA_ID:酒豪
                CALL RAND_WT_SET(ACT_飲酒, 75)
                ;普通のキャラは酩酊以上なら深酒しない
            ELSEIF IS_DRUNK(CHARA_ID) < 3
                CALL RAND_WT_SET(ACT_飲酒, 40)
            ENDIF
        ENDIF
    ENDIF
    ;ゲストモブの活動
ELSE
    ;宿泊客はとりあえず休憩させる
    IF TCVAR:CHARA_ID:宿泊先設備IDX > 0
        CALL RAND_WT_SET(ACT_休憩, 10)
    ELSE
        ;その他のモブは基本的に動かない
        IF 現在の行動 == "待機"
            CALL RAND_WT_SET(ACT_待機, 10)
        ENDIF
    ENDIF
ENDIF

;おひるとおゆはん30分前は新たな行動を開始させない
決定行動 = RAND_WT_RESULT()
$ACT_RESULT
SELECTCASE 決定行動
    CASE ACT_徘徊
        ;今使っているモジュールの使用を停止させる
        CALL HO_STOP_USE_MODULE(CHARA_ID)
        CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "待機")
        ;一定確率でその場で待機
        SIF RAND:3
            RETURN 1
        ;現在地から移動可能な部屋を取得
        CALL HO_GET_PATH(ROOM_IDX)
        _LIST_移動先候補 = %RESULTS%
        ;移動可能な候補からランダムに選出してMOVELISTに登録
        CALL HO_SET_MOVELIST(CHARA_ID, LIST_SET((LIST_GET(_LIST_移動先候補, RAND(0,LIST_COUNT(_LIST_移動先候補))))))
    CASE ACT_自主訓練
        ;300,成長型,;0=万能 1=知将 2=学士 3=両道 4=武官 5=軍師 6=文官 7=芸能 8=料理 9=天才 11=魔術 12=魔人
        IF GROUPMATCH(TALENT:CHARA_ID:成長型, 1, 2, 4, 5, 6, 9, 11)
            CALL HO_行動定義_読書(CHARA_ID)
        ELSEIF GROUPMATCH(TALENT:CHARA_ID:成長型, 0, 3, 4, 9, 12)
            CALL HO_行動定義_運動(CHARA_ID)
        ELSEIF GROUPMATCH(TALENT:CHARA_ID:成長型, 1, 7, 9)
            CALL HO_行動定義_演奏(CHARA_ID)
        ELSE
            CALL HO_行動定義_遊戯(CHARA_ID)
        ENDIF
    CASE ACT_読書
        CALL HO_行動定義_読書(CHARA_ID)
    CASE ACT_釣り
        CALL HO_行動定義_釣り(CHARA_ID)
    CASE ACT_遊戯
        CALL HO_行動定義_遊戯(CHARA_ID)
    CASE ACT_水浴び
        CALL HO_行動定義_水浴び(CHARA_ID)
    CASE ACT_演奏
        CALL HO_行動定義_演奏(CHARA_ID)
    CASE ACT_飲酒
        CALL HO_行動定義_飲酒(CHARA_ID)
    CASE ACT_休憩
        CALL HO_行動定義_休憩(CHARA_ID)
        RETURN RESULT
    CASE ACT_待機
        CALL HO_STOP_USE_MODULE(CHARA_ID)
        CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "待機")
        RETURN 1
ENDSELECT

;自由行動が失敗すると行動不能になるので、徘徊に戻す
IF RESULT == -1
    決定行動 = ACT_徘徊
    GOTO ACT_RESULT
ENDIF

RETURN RESULT


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 MODULE_ID
#DIM  DYNAMIC MODULE_LIST_IDX
#DIMS DYNAMIC MODULE_LIST
#DIM  DYNAMIC TIMETABLE
#DIMS DYNAMIC MAP

;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_GET_TASK_SCH(CHARA_ID)
IF RESULT == -1
    RETURN -1
ELSE
    TIMETABLE = RESULT
ENDIF

;;作業を行う設備を確定する
;作業場リストが設定されている場合指定設備を優先する
IF 現在の行動 != "移動完了"
    IF LIST_COUNT(_LIST_HO_WORKPLACE:CHARA_ID:TIMETABLE)
        MODULE_LIST_IDX = TOINT(LIST_RAND(_LIST_HO_WORKPLACE:CHARA_ID:TIMETABLE))
        ;設備が配置されているエリアを取得
        CALL HO_GET_MODULE_LIST(MODULE_LIST_IDX, "ROOM_IDX")
        IF RESULT != -1
            移動先ROOM_IDX = RESULT
            CALL HO_SET_CHARADATA(CHARA_IDX, "TARGET_MODULE_LIST_IDX", TOSTR(MODULE_LIST_IDX))
        ELSE
            RETURN -1
        ENDIF
    ELSE
        ;作業場リストが未指定の場合は適合する設備のある最も近いエリアを目的地に
        CALL HO_FIND_NEAREST_ROOM_BY_MODULE_USAGE("芸能", ROOM_IDX)
        IF RESULT != -1
            移動先ROOM_IDX = RESULT
        ELSE
            RETURN -1
        ENDIF
    ENDIF

    CALL HO_GET_ROUTE(ROOM_IDX, 移動先ROOM_IDX)
    SIF RESULT == -1
        RETURN -1
    ;RESULTが0の場合既に目的地と同じ場所にいるので移動の必要なし
    IF RESULT != 0
        _LIST_移動先候補 = %RESULTS%
        CALL HO_STOP_USE_MODULE(CHARA_ID)
        CALL HO_SET_MOVELIST(CHARA_ID, _LIST_移動先候補)
        RETURN 0
    ENDIF
ENDIF

CALL HO_STOP_USE_MODULE(CHARA_ID)
CALL HO_GET_CHARADATA(CHARA_IDX, "TARGET_MODULE_LIST_IDX")
IF RESULT != -1
    CALL HO_TRY_USE_MODULE(CHARA_ID,,,RESULT)
ELSE
    CALL HO_TRY_USE_MODULE(CHARA_ID, "芸能",,,1)
ENDIF
IF RESULT == 1
    MODULE_ID = C_COND_MAP_GET(CHARA_ID, "設備")
    MAP '= @"MAP_{ROOM_IDX}_ROOM_EFFECT"
    SELECTCASE MODULE_ID
        CASE 18 ;ピアノ
            MAP_SET MAP, "ピアノの音色", "0"
            CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "演奏中")
        CASE 205, 206
            MAP_SET MAP, "演舞", "0"
            CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "演舞中")
        CASEELSE
    ENDSELECT
    IF HO_OCLOCK() >= 1800
        CALL SKILL_GET_LEVEL(CHARA_ID, スキル_大分類_性技, "LEWD_SERENADE")
        IF RESULT > 0
            MAP_SET MAP, "煽欲の小夜曲", "0"
        ENDIF
    ENDIF
    CALL HO_SET_CHARADATA(CHARA_IDX, "TARGET_MODULE_LIST_IDX", "")
    TCVAR:CHARA_ID:HO作業進捗量 = 0
    ;大体2時間位作業する
    TCVAR:CHARA_ID:行動待機時間 = RAND(24, 26) * HO_単位時間
    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


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 MODULE_ID
#DIM  DYNAMIC MODULE_LIST_IDX
#DIMS DYNAMIC MODULE_LIST
#DIM  DYNAMIC TIMETABLE

;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_GET_TASK_SCH(CHARA_ID)
IF RESULT == -1
    RETURN -1
ELSE
    TIMETABLE = RESULT
ENDIF

;;作業を行う設備を確定する
;作業場リストが設定されている場合指定設備を優先する
IF 現在の行動 != "移動完了"
    IF LIST_COUNT(_LIST_HO_WORKPLACE:CHARA_ID:TIMETABLE)
        MODULE_LIST_IDX = TOINT(LIST_RAND(_LIST_HO_WORKPLACE:CHARA_ID:TIMETABLE))
        ;設備が配置されているエリアを取得
        CALL HO_GET_MODULE_LIST(MODULE_LIST_IDX, "ROOM_IDX")
        IF RESULT != -1
            移動先ROOM_IDX = RESULT
            CALL HO_SET_CHARADATA(CHARA_IDX, "TARGET_MODULE_LIST_IDX", TOSTR(MODULE_LIST_IDX))
        ELSE
            RETURN -1
        ENDIF
    ELSE
        ;作業場リストが未指定の場合は適合する設備のある最も近いエリアを目的地に
        CALL HO_FIND_NEAREST_ROOM_BY_MODULE_USAGE("訓練", ROOM_IDX)
        IF RESULT != -1
            移動先ROOM_IDX = RESULT
        ELSE
            RETURN -1
        ENDIF
    ENDIF

    CALL HO_GET_ROUTE(ROOM_IDX, 移動先ROOM_IDX)
    SIF RESULT == -1
        RETURN -1
    ;RESULTが0の場合既に目的地と同じ場所にいるので移動の必要なし
    IF RESULT != 0
        _LIST_移動先候補 = %RESULTS%
        CALL HO_STOP_USE_MODULE(CHARA_ID)
        CALL HO_SET_MOVELIST(CHARA_ID, _LIST_移動先候補)
        RETURN 0
    ENDIF
ENDIF

CALL HO_STOP_USE_MODULE(CHARA_ID)
CALL HO_GET_CHARADATA(CHARA_IDX, "TARGET_MODULE_LIST_IDX")
IF RESULT != -1
    CALL HO_TRY_USE_MODULE(CHARA_ID,,,RESULT)
ELSE
    CALL HO_TRY_USE_MODULE(CHARA_ID, "訓練",,,1)
ENDIF
IF RESULT == 1
    CALL HO_SET_CHARADATA(CHARA_IDX, "ACTION", "訓練中")
    CALL HO_SET_CHARADATA(CHARA_IDX, "TARGET_MODULE_LIST_IDX", "")
    TCVAR:CHARA_ID:HO作業進捗量 = 0
    ;大体2時間位作業する
    TCVAR:CHARA_ID:行動待機時間 = RAND(24, 26) * HO_単位時間
    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

@HO_行動定義_訓練_生産物(CHARA_ID)
#DIM  CHARA_ID
#DIM  DYNAMIC MODULE_ID
#DIM  DYNAMIC PRODUCTION_RATE
#DIM  DYNAMIC ITEM_ID
#DIMS DYNAMIC ITEM_NAME
#DIM  DYNAMIC PRODUCT_ITEMS, ITEM_LENGTH
#DIM  DYNAMIC BASE_EXP = 5

TCVAR:CHARA_ID:HO作業進捗量 += 7
TCVAR:CHARA_ID:疲労度 += 5

IF TCVAR:CHARA_ID:HO作業進捗量 > 100
    CALL HO_GET_USE_MODULE_INFO(CHARA_ID)
    MODULE_ID = RESULT
    SELECTCASE MODULE_ID
        CASE 50 ;修練場
            CALL HO_ABLUP_MAXHP(CHARA_ID, "運動")
            IF RESULT > 0
                CALL HO_PRINT_LOG(@"%ANAME(CHARA_ID)%の基礎体力が向上した(@C:{カラー_緑}@+{RESULT}@/C@)")
            ENDIF
            CALL HO_CHARAACT_ABLUP(CHARA_ID, "戦闘", BASE_EXP)
            TCVAR:CHARA_ID:HO作業進捗量 = 0
        CASE 21 ;広場
            CALL HO_ABLUP_MAXHP(CHARA_ID, "運動")
            IF RESULT > 0
                CALL HO_PRINT_LOG(@"%ANAME(CHARA_ID)%の基礎体力が向上した(@C:{カラー_緑}@+{RESULT}@/C@)")
            ENDIF
            TCVAR:CHARA_ID:HO作業進捗量 = 0
        CASE 5, 16 ;デスク,書架
            CALL HO_CHARAACT_ABLUP(CHARA_ID, "知識", BASE_EXP)
            TCVAR:CHARA_ID:HO作業進捗量 = 0
    ENDSELECT
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_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:疲労度 += 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 現在の行動

;滞在時間が0以下の場合設備待機に移行
IF CFLAG:CHARA_ID:キャラ滞在時間 <= 0
    CALL HO_行動定義_自由(CHARA_ID)
    RETURN
ENDIF
;疲れたら帰る
IF IS_TIRED(CHARA_ID)
    CFLAG:CHARA_ID:キャラ滞在時間 = 0
    RETURN
ENDIF
;店番を継続している場合、行動待機時間のみ延長する
IF TCVAR:CHARA_ID:HO直前の行動 == ACT_買春
    TCVAR:CHARA_ID:買春失敗カウンタ ++
    ;大体1時間半位作業する
    TCVAR:CHARA_ID:行動待機時間 = RAND(18, 20) * HO_単位時間
    RETURN 1
ENDIF

;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)
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", "買春中")
        ;大体1時間半位作業する
        TCVAR:CHARA_ID:行動待機時間 = RAND(18, 20) * HO_単位時間
        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 現在の行動

;滞在時間が0以下の場合設備待機に移行
IF CFLAG:CHARA_ID:キャラ滞在時間 <= 0
    CALL HO_行動定義_自由(CHARA_ID)
    RETURN
ENDIF
;店番を継続している場合、行動待機時間のみ延長する
IF TCVAR:CHARA_ID:HO直前の行動 == ACT_買物
    ;大体1時間半位作業する
    TCVAR:CHARA_ID:行動待機時間 = RAND(18, 20) * HO_単位時間
    RETURN 1
ENDIF

;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)
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", "買物中")
        ;大体1時間半位作業する
        TCVAR:CHARA_ID:行動待機時間 = RAND(18, 20) * HO_単位時間
        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 現在の行動
#DIM  DYNAMIC MODULE_ID
#DIM  DYNAMIC MODULE_LIST_IDX
#DIMS DYNAMIC MODULE_LIST
#DIMS DYNAMIC LIST_移動先候補
#DIM  DYNAMIC TIMETABLE

#DIM  DYNAMIC TARGET_ID
#DIM  DYNAMIC TARGET_ROOM_IDX

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

TARGET_ID = TCVAR:CHARA_ID:追随相手ID
TARGET_ROOM_IDX = C_COND_MAP_GET(TARGET_ID, "エリアIDX")

DEBUGPRINTFORML %ANAME(CHARA_ID)%が%ANAME(TARGET_ID)%を追随中

IF TARGET_ROOM_IDX != ROOM_IDX
    移動先ROOM_IDX = TARGET_ROOM_IDX
    CALL HO_GET_ROUTE(ROOM_IDX, 移動先ROOM_IDX)
    LIST_移動先候補 = %RESULTS%
    CALL HO_SET_MOVELIST(CHARA_ID, LIST_移動先候補)
    RETURN 0
ENDIF

MODULE_LIST_IDX = C_COND_MAP_GET(TARGET_ID, "設備IDX")
CALL HO_TRY_USE_MODULE(CHARA_ID,,,MODULE_LIST_IDX)
IF RESULT == 1
    ;30分程度ウェイト
    TCVAR:CHARA_ID:行動待機時間 = RAND(6, 8) * HO_単位時間
ELSE
    RETURN -1
ENDIF