code:
;-------------------------------------------------
;ルームに配置可能な各種モジュールのデータ
;インテリア
;-------------------------------------------------
;-------------------------------------------------
;観葉植物
;-------------------------------------------------
@HO_MODULE_DATA_700
#DIMS _DIC_MODULE_DATA
_DIC_MODULE_DATA '= "[MODULE_NAME:Houseplant][人数:0][用途:インテリア,][制限:][属性:エリア効果,インテリア,][エリア効果:観葉植物,]"
RESULTS = %_DIC_MODULE_DATA%
;モジュールの内容説明
@HO_MODULE_DESC_700
RESULTS '= "[Command effect correction] Calm down and relieve anxiety, fear, and anger (area effect [houseplant])"
;クラフトモードで要求する作成コスト
@HO_MODULE_CRAFT_RESOURCE_700(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 30000
MATERIAL_NEEDS:ITEM_木材 = 20
MATERIAL_NEEDS:ITEM_薬草 = 10
MATERIAL_NEEDS:ITEM_香草 = 10
RETURN PRICE
;モジュールの作成条件
@HO_MODULE_IS_CRAFTABLE_700
RETURN 1

;-------------------------------------------------
;茶器棚
;-------------------------------------------------
@HO_MODULE_DATA_701
#DIMS _DIC_MODULE_DATA
_DIC_MODULE_DATA '= "[MODULE_NAME:Tea ceremony shelves][人数:0][用途:インテリア,][制限:休憩所,][属性:エリア効果,インテリア,][エリア効果:茶器,]"
RESULTS = %_DIC_MODULE_DATA%
;モジュールの内容説明
@HO_MODULE_DESC_701
RESULTS '= "[Command effect correction] Slightly increased physical recovery during breaks (area effect [tea utensil])"
;クラフトモードで要求する作成コスト
@HO_MODULE_CRAFT_RESOURCE_701(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 35000
MATERIAL_NEEDS:ITEM_木材 = 25
MATERIAL_NEEDS:ITEM_薬草 = 10
MATERIAL_NEEDS:ITEM_香草 = 20
RETURN PRICE
;モジュールの作成条件
@HO_MODULE_IS_CRAFTABLE_701
RETURN 1

;-------------------------------------------------
;淫猥な絵画
;-------------------------------------------------
@HO_MODULE_DATA_702
#DIMS _DIC_MODULE_DATA
_DIC_MODULE_DATA '= "[MODULE_NAME:An obscene painting][人数:0][用途:インテリア,][制限:][属性:エリア効果,インテリア,][エリア効果:淫らな絵画,]"
RESULTS = %_DIC_MODULE_DATA%
;モジュールの内容説明
@HO_MODULE_DESC_702
RESULTS '= "[Command effect correction] Get a response according to the desire when executing the command (area effect [indecent painting])"
;クラフトモードで要求する作成コスト
@HO_MODULE_CRAFT_RESOURCE_702(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 45000
MATERIAL_NEEDS:ITEM_木材 = 25
MATERIAL_NEEDS:ITEM_布 = 10
MATERIAL_NEEDS:ITEM_硫黄 = 5
RETURN PRICE
;モジュールの作成条件
@HO_MODULE_IS_CRAFTABLE_702
RETURN 1

;-------------------------------------------------
;散乱した使用済みゴム
;-------------------------------------------------
@HO_MODULE_DATA_703
#DIMS _DIC_MODULE_DATA
_DIC_MODULE_DATA '= "[MODULE_NAME:Scattered used rubber][人数:0][用途:インテリア,][制限:][属性:エリア効果,インテリア,][エリア効果:散乱した使用済ゴム,]"
RESULTS = %_DIC_MODULE_DATA%
;モジュールの内容説明
@HO_MODULE_DESC_703
RESULTS:0 '= "[Command effect correction] Get a response according to the desire when executing the command"
RESULTS:1 '= "(Area effect [Scattered used rubber])"
;クラフトモードで要求する作成コスト
@HO_MODULE_CRAFT_RESOURCE_703(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 50000
MATERIAL_NEEDS:ITEM_使用済みコンドーム = 30
RETURN PRICE
;モジュールの作成条件
@HO_MODULE_IS_CRAFTABLE_703
RETURN 1

;-------------------------------------------------
;蓄音機
;-------------------------------------------------
@HO_MODULE_DATA_704
#DIMS _DIC_MODULE_DATA
_DIC_MODULE_DATA '= "[MODULE_NAME:Gramophone][人数:0][用途:インテリア,][制限:][属性:インテリア,]"
RESULTS = %_DIC_MODULE_DATA%
;モジュールの内容説明
@HO_MODULE_DESC_704
RESULTS:0 '= "Magic mechanical music player invented in Nordia"
RESULTS:1 '= "It seems that if you use it, it will play music without permission ...?"

;クラフトモードで要求する作成コスト
@HO_MODULE_CRAFT_RESOURCE_704(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 50000
MATERIAL_NEEDS:ITEM_木材 = 25
MATERIAL_NEEDS:ITEM_金属細工 = 18
RETURN PRICE
;モジュールの作成条件
@HO_MODULE_IS_CRAFTABLE_704
RETURN 1

@HO_MODULE_USE_INTERIOR_704()
SIF !HO_BGM_SWITCH
    HO_BGM_SWITCH = 1
CALL FL_PLAYBGM(S_R("Nostalgic_1.ogg/Nostalgic_4.ogg/Nostalgic_5.mp3/Town_3.mp3"))

;-------------------------------------------------
;淫魔の錬成陣
;-------------------------------------------------
@HO_MODULE_DATA_705
#DIMS _DIC_MODULE_DATA
_DIC_MODULE_DATA '= "[MODULE_NAME:Devil's training team][人数:0][用途:インテリア,][制限:工房,][属性:エリア効果,インテリア,][エリア効果:淫魔の錬成陣,]"
RESULTS = %_DIC_MODULE_DATA%
;モジュールの内容説明
@HO_MODULE_DESC_705
RESULTS:0 '= "[Command effect correction] Craft using the deprecated point is possible with alchemy platforms, etc."
RESULTS:1 '= "(エリア効果【淫魔の錬成陣】)"
;クラフトモードで要求する作成コスト
@HO_MODULE_CRAFT_RESOURCE_705(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 300000
MATERIAL_NEEDS:ITEM_高効率魔導触媒 = 4
MATERIAL_NEEDS:ITEM_魔獣の心核 = 2
MATERIAL_NEEDS:ITEM_媚薬 = 10
RETURN PRICE
;モジュールの作成条件
@HO_MODULE_IS_CRAFTABLE_705
RETURN 1

;-------------------------------------------------
;カニかご
;-------------------------------------------------
@HO_MODULE_DATA_706
#DIMS _DIC_MODULE_DATA
_DIC_MODULE_DATA '= "[MODULE_NAME:Crab basket][人数:0][用途:インテリア,][制限:緑地,][属性:エリア効果,インテリア,][エリア効果:カニかご,]"
RESULTS = %_DIC_MODULE_DATA%
;モジュールの内容説明
@HO_MODULE_DESC_706
RESULTS:0 '= "[Command effect correction] When installed in the river, you can collect crayfish etc."
RESULTS:1 '= "(エリア効果【カニかご】)"
;クラフトモードで要求する作成コスト
@HO_MODULE_CRAFT_RESOURCE_706(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 10000
MATERIAL_NEEDS:ITEM_木材 = 15
MATERIAL_NEEDS:ITEM_植物性繊維 = 20
MATERIAL_NEEDS:ITEM_動物の肉 = 10
RETURN PRICE
;モジュールの作成条件
@HO_MODULE_IS_CRAFTABLE_706
RETURN 1

;-------------------------------------------------
;卑猥な書籍
;-------------------------------------------------
@HO_MODULE_DATA_707
#DIMS _DIC_MODULE_DATA
_DIC_MODULE_DATA '= "[MODULE_NAME:Obscene book][人数:0][用途:インテリア,][制限:][属性:エリア効果,インテリア,][エリア効果:卑猥な書籍,]"
RESULTS = %_DIC_MODULE_DATA%
;モジュールの内容説明
@HO_MODULE_DESC_707
RESULTS:0 '= "[Command effect correction] Get certain sexual knowledge when implementing 'Study' commands"
RESULTS:1 '= "(Area effect [obscene book])"
;クラフトモードで要求する作成コスト
@HO_MODULE_CRAFT_RESOURCE_707(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 20000
MATERIAL_NEEDS:ITEM_淫堕点 = 150
RETURN PRICE
;モジュールの作成条件
@HO_MODULE_IS_CRAFTABLE_707
RETURN 1

;-------------------------------------------------
;色絵の磁器
;-------------------------------------------------
@HO_MODULE_DATA_708
#DIMS _DIC_MODULE_DATA
_DIC_MODULE_DATA '= "[MODULE_NAME:Color picture porcelain][人数:0][用途:インテリア,][制限:休憩所,][属性:エリア効果,インテリア,][エリア効果:色絵の磁器,]"
RESULTS = %_DIC_MODULE_DATA%
;モジュールの内容説明
@HO_MODULE_DESC_708
RESULTS '= "[Command effect correction] Slightly increased physical strength and energy recovery during meals (area effect [colored porcelain])"
;クラフトモードで要求する作成コスト
@HO_MODULE_CRAFT_RESOURCE_708(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 50000
MATERIAL_NEEDS:ITEM_石材 = 20
MATERIAL_NEEDS:ITEM_マナ結晶 = 30
RETURN PRICE
;モジュールの作成条件
@HO_MODULE_IS_CRAFTABLE_708
RETURN 0


code:
;-------------------------------------------------
;マップに配置可能な各種ルームのデータ
;いずれファイルごとに分割するかもしれないが、データ仕様が固まりきってないので一旦ひとまとめ
;-------------------------------------------------
;なし
@HO_ROOM_DATA_0
RESULTS '= "[ROOM_NAME:Empty]"

;-------------------------------------------------
;居間
;-------------------------------------------------
@HO_ROOM_DATA_1
#DIMS _DIC_ROOM_DATA
_DIC_ROOM_DATA '= "[ROOM_NAME:Living room][ROOM_TAG:食堂,休憩所,屋内,][ROOM_CAPACITY:8]"
RESULTS = %_DIC_ROOM_DATA%
;ルームの作成条件
@HO_ROOM_IS_CRAFTABLE_1
RETURN 0
;クラフトモードで要求する作成コスト
@HO_ROOM_CRAFT_RESOURCE_1(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 1000000
MATERIAL_NEEDS:ITEM_石材 = 10
MATERIAL_NEEDS:ITEM_木材 = 10
RETURN PRICE
;ルームの内容説明
@HO_ROOM_DESC_1
RESULTS '= "A place for everyone to gather"

;-------------------------------------------------
;プレイヤー私室
;-------------------------------------------------
@HO_ROOM_DATA_2
#DIMS _DIC_ROOM_DATA
_DIC_ROOM_DATA '= "[ROOM_NAME:Private room][ROOM_TAG:プレイヤー私室,屋内,施錠可,][ROOM_CAPACITY:6]"
RESULTS = %_DIC_ROOM_DATA%
;ルームの作成条件
@HO_ROOM_IS_CRAFTABLE_2
RETURN 0
;クラフトモードで要求する作成コスト
@HO_ROOM_CRAFT_RESOURCE_2(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 1000000
MATERIAL_NEEDS:ITEM_石材 = 10
MATERIAL_NEEDS:ITEM_木材 = 10
RETURN PRICE
;ルームの内容説明
@HO_ROOM_DESC_2
RESULTS '= @"%ANAME(MASTER)%'s Room"

;-------------------------------------------------
;客室
;-------------------------------------------------
@HO_ROOM_DATA_3
#DIMS _DIC_ROOM_DATA
_DIC_ROOM_DATA '= "[ROOM_NAME:Guest room][ROOM_TAG:客室,屋内,][ROOM_CAPACITY:0]"
RESULTS = %_DIC_ROOM_DATA%
;ルームの作成条件
@HO_ROOM_IS_CRAFTABLE_3
RETURN 0
;クラフトモードで要求する作成コスト
@HO_ROOM_CRAFT_RESOURCE_3(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 1000000
MATERIAL_NEEDS:ITEM_石材 = 10
MATERIAL_NEEDS:ITEM_木材 = 10
RETURN PRICE
;ルームの内容説明
@HO_ROOM_DESC_3
RESULTS '= "A space for guests.You can't put furniture in this place"

;-------------------------------------------------
;浴室
;-------------------------------------------------
@HO_ROOM_DATA_4
#DIMS _DIC_ROOM_DATA
_DIC_ROOM_DATA '= "[ROOM_NAME:Bathroom][ROOM_TAG:浴室,屋内,施錠可,][ROOM_CAPACITY:6]"
RESULTS = %_DIC_ROOM_DATA%
;ルームの作成条件
@HO_ROOM_IS_CRAFTABLE_4
RETURN 1
;クラフトモードで要求する作成コスト
@HO_ROOM_CRAFT_RESOURCE_4(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 10000
MATERIAL_NEEDS:ITEM_木材 = 40
RETURN PRICE
;ルームの内容説明
@HO_ROOM_DESC_4
RESULTS '= "A place where you can remove dirt of the day"

;-------------------------------------------------
;娯楽室
;-------------------------------------------------
@HO_ROOM_DATA_5
#DIMS _DIC_ROOM_DATA
_DIC_ROOM_DATA '= "[ROOM_NAME:Entertainment room][ROOM_TAG:娯楽室,屋内,施錠可,][ROOM_CAPACITY:6]"
RESULTS = %_DIC_ROOM_DATA%
;ルームの作成条件
@HO_ROOM_IS_CRAFTABLE_5
RETURN 1
;クラフトモードで要求する作成コスト
@HO_ROOM_CRAFT_RESOURCE_5(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 15000
MATERIAL_NEEDS:ITEM_石材 = 20
MATERIAL_NEEDS:ITEM_木材 = 10
RETURN PRICE
;ルームの内容説明
@HO_ROOM_DESC_5
RESULTS '= "You can provide entertainment to the residents by placing playground equipment"

;-------------------------------------------------
;更衣室
;-------------------------------------------------
@HO_ROOM_DATA_6
#DIMS _DIC_ROOM_DATA
_DIC_ROOM_DATA '= "[ROOM_NAME:Locker room][ROOM_TAG:更衣室,屋内,施錠可,][ROOM_CAPACITY:6]"
RESULTS = %_DIC_ROOM_DATA%
;ルームの作成条件
@HO_ROOM_IS_CRAFTABLE_6
RETURN 1
;クラフトモードで要求する作成コスト
@HO_ROOM_CRAFT_RESOURCE_6(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 15000
MATERIAL_NEEDS:ITEM_石材 = 10
MATERIAL_NEEDS:ITEM_木材 = 20
RETURN PRICE
;ルームの内容説明
@HO_ROOM_DESC_6
RESULTS '= "Room for changing clothes"

;-------------------------------------------------
;廊下
;-------------------------------------------------
@HO_ROOM_DATA_7
#DIMS _DIC_ROOM_DATA
_DIC_ROOM_DATA '= "[ROOM_NAME:Corridor][ROOM_TAG:通路,屋内,][ROOM_CAPACITY:6]"
RESULTS = %_DIC_ROOM_DATA%
;ルームの作成条件
@HO_ROOM_IS_CRAFTABLE_7
RETURN 1
;クラフトモードで要求する作成コスト
@HO_ROOM_CRAFT_RESOURCE_7(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 10000
MATERIAL_NEEDS:ITEM_石材 = 10
MATERIAL_NEEDS:ITEM_木材 = 10
RETURN PRICE
;ルームの内容説明
@HO_ROOM_DESC_7
RESULTS '= "In particular, there is no strange corridor"

;-------------------------------------------------
;倉庫
;-------------------------------------------------
@HO_ROOM_DATA_8
#DIMS _DIC_ROOM_DATA
_DIC_ROOM_DATA '= "[ROOM_NAME:Storage][ROOM_TAG:倉庫,屋内,施錠可,][ROOM_CAPACITY:6]"
RESULTS = %_DIC_ROOM_DATA%
;ルームの作成条件
@HO_ROOM_IS_CRAFTABLE_8
RETURN 1
;クラフトモードで要求する作成コスト
@HO_ROOM_CRAFT_RESOURCE_8(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 15000
MATERIAL_NEEDS:ITEM_石材 = 10
MATERIAL_NEEDS:ITEM_木材 = 10
RETURN PRICE
;ルームの内容説明
@HO_ROOM_DESC_8
RESULTS '= "Room for storing materials"

;-------------------------------------------------
;診療室
;-------------------------------------------------
@HO_ROOM_DATA_9
#DIMS _DIC_ROOM_DATA
_DIC_ROOM_DATA '= "[ROOM_NAME:Diagnosis room][ROOM_TAG:仕事場,診療室,屋内,施錠可,][ROOM_CAPACITY:6]"
RESULTS = %_DIC_ROOM_DATA%
;ルームの作成条件
@HO_ROOM_IS_CRAFTABLE_9
RETURN 1
;クラフトモードで要求する作成コスト
@HO_ROOM_CRAFT_RESOURCE_9(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 15000
MATERIAL_NEEDS:ITEM_石材 = 10
MATERIAL_NEEDS:ITEM_木材 = 10
RETURN PRICE
;ルームの内容説明
@HO_ROOM_DESC_9
RESULTS '= "Room for treatment of injured people"

;-------------------------------------------------
;農園
;-------------------------------------------------
@HO_ROOM_DATA_10
#DIMS _DIC_ROOM_DATA
_DIC_ROOM_DATA '= "[ROOM_NAME:Farm][ROOM_TAG:農園,採集,屋外,][ROOM_CAPACITY:8]"
RESULTS = %_DIC_ROOM_DATA%
;ルームの作成条件
@HO_ROOM_IS_CRAFTABLE_10
RETURN 1
;クラフトモードで要求する作成コスト
@HO_ROOM_CRAFT_RESOURCE_10(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 25000
MATERIAL_NEEDS:ITEM_木材 = 10
MATERIAL_NEEDS:ITEM_肥料 = 10
RETURN PRICE
;ルームの内容説明
@HO_ROOM_DESC_10
RESULTS '= "A place to relax with low grass"

;-------------------------------------------------
;庭園
;-------------------------------------------------
@HO_ROOM_DATA_11
#DIMS _DIC_ROOM_DATA
_DIC_ROOM_DATA '= "[ROOM_NAME:Garden][ROOM_TAG:休憩所,緑地,屋外,][ROOM_CAPACITY:8]"
RESULTS = %_DIC_ROOM_DATA%
;ルームの作成条件
@HO_ROOM_IS_CRAFTABLE_11
RETURN 1
;クラフトモードで要求する作成コスト
@HO_ROOM_CRAFT_RESOURCE_11(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 15000
MATERIAL_NEEDS:ITEM_石材 = 10
MATERIAL_NEEDS:ITEM_木材 = 10
RETURN PRICE
;ルームの内容説明
@HO_ROOM_DESC_11
RESULTS '= "A place to relax with low grass"

;-------------------------------------------------
;書庫
;-------------------------------------------------
@HO_ROOM_DATA_12
#DIMS _DIC_ROOM_DATA
_DIC_ROOM_DATA '= "[ROOM_NAME:Archive][ROOM_TAG:書庫,仕事場,屋内,施錠可,][ROOM_CAPACITY:8]"
RESULTS = %_DIC_ROOM_DATA%
;ルームの作成条件
@HO_ROOM_IS_CRAFTABLE_12
RETURN 1
;クラフトモードで要求する作成コスト
@HO_ROOM_CRAFT_RESOURCE_12(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 25000
MATERIAL_NEEDS:ITEM_石材 = 10
MATERIAL_NEEDS:ITEM_木材 = 30
RETURN PRICE
;ルームの内容説明
@HO_ROOM_DESC_12
RESULTS '= "Room for storing books"

;-------------------------------------------------
;訓練場
;-------------------------------------------------
@HO_ROOM_DATA_13
#DIMS _DIC_ROOM_DATA
_DIC_ROOM_DATA '= "[ROOM_NAME:Training ground][ROOM_TAG:訓練場,仕事場,屋内,施錠可,][ROOM_CAPACITY:8]"
RESULTS = %_DIC_ROOM_DATA%
;ルームの作成条件
@HO_ROOM_IS_CRAFTABLE_13
RETURN 1
;クラフトモードで要求する作成コスト
@HO_ROOM_CRAFT_RESOURCE_13(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 40000
MATERIAL_NEEDS:ITEM_建築資材 = 20
RETURN PRICE
;ルームの内容説明
@HO_ROOM_DESC_13
RESULTS '= "Space to accumulate exercise and training"

;-------------------------------------------------
;工房
;-------------------------------------------------
@HO_ROOM_DATA_14
#DIMS _DIC_ROOM_DATA
_DIC_ROOM_DATA '= "[ROOM_NAME:Workshop][ROOM_TAG:工房,仕事場,屋内,施錠可,][ROOM_CAPACITY:8]"
RESULTS = %_DIC_ROOM_DATA%
;ルームの作成条件
@HO_ROOM_IS_CRAFTABLE_14
RETURN 1
;クラフトモードで要求する作成コスト
@HO_ROOM_CRAFT_RESOURCE_14(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 25000
MATERIAL_NEEDS:ITEM_石材 = 10
MATERIAL_NEEDS:ITEM_木材 = 10
RETURN PRICE
;ルームの内容説明
@HO_ROOM_DESC_14
RESULTS '= "A workshop with various tools"

;-------------------------------------------------
;地下牢
;-------------------------------------------------
@HO_ROOM_DATA_15
#DIMS _DIC_ROOM_DATA
_DIC_ROOM_DATA '= "[ROOM_NAME:Jail][ROOM_TAG:牢獄,屋内,施錠可,][ROOM_CAPACITY:8]"
RESULTS = %_DIC_ROOM_DATA%
;ルームの作成条件
@HO_ROOM_IS_CRAFTABLE_15
RETURN 1
;クラフトモードで要求する作成コスト
@HO_ROOM_CRAFT_RESOURCE_15(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 30000
MATERIAL_NEEDS:ITEM_鋼インゴット = 6
MATERIAL_NEEDS:ITEM_石材 = 20
RETURN PRICE
;ルームの内容説明
@HO_ROOM_DESC_15
RESULTS '= "Prison for imprisonment of prisoners"

;-------------------------------------------------
;肉腫の檻
;-------------------------------------------------
@HO_ROOM_DATA_16
#DIMS _DIC_ROOM_DATA
_DIC_ROOM_DATA '= "[ROOM_NAME:Flesh cage][ROOM_TAG:性行為,触手,屋内,施錠可,][ROOM_CAPACITY:8]"
RESULTS = %_DIC_ROOM_DATA%
;ルームの作成条件
@HO_ROOM_IS_CRAFTABLE_16
;QUEST_1 蠢く洞窟の攻略が必要
RETURN QST_SV_QUEST_FLAG:1 == 2

;クラフトモードで要求する作成コスト
@HO_ROOM_CRAFT_RESOURCE_16(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 90000
MATERIAL_NEEDS:ITEM_魔獣の肉片 = 20
MATERIAL_NEEDS:ITEM_動物の肉 = 20
MATERIAL_NEEDS:ITEM_精液 = 40
RETURN PRICE
;ルームの内容説明
@HO_ROOM_DESC_16
RESULTS '= "An unusual space covered with meat wriggling on the wall"

;-------------------------------------------------
;娼館
;-------------------------------------------------
@HO_ROOM_DATA_17
#DIMS _DIC_ROOM_DATA
_DIC_ROOM_DATA '= "[ROOM_NAME:Brothel][ROOM_TAG:娼館,公共,屋内,施錠可,][ROOM_CAPACITY:12]"
RESULTS = %_DIC_ROOM_DATA%
;ルームの作成条件
@HO_ROOM_IS_CRAFTABLE_17
RETURN 1
;クラフトモードで要求する作成コスト
@HO_ROOM_CRAFT_RESOURCE_17(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 75000
MATERIAL_NEEDS:ITEM_コンドーム = 20
MATERIAL_NEEDS:ITEM_石材 = 20
RETURN PRICE
;ルームの内容説明
@HO_ROOM_DESC_17
RESULTS '= "Facilities for providing sexual services"

;-------------------------------------------------
;宿場
;-------------------------------------------------
@HO_ROOM_DATA_20
#DIMS _DIC_ROOM_DATA
_DIC_ROOM_DATA '= "[ROOM_NAME:Inn][ROOM_TAG:公共,屋内,宿場,][ROOM_CAPACITY:12]"
RESULTS = %_DIC_ROOM_DATA%
;ルームの作成条件
@HO_ROOM_IS_CRAFTABLE_20
RETURN 1
;クラフトモードで要求する作成コスト
@HO_ROOM_CRAFT_RESOURCE_20(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 100000
MATERIAL_NEEDS:ITEM_建築資材 = 20
MATERIAL_NEEDS:ITEM_金属細工 = 18
MATERIAL_NEEDS:ITEM_蒸留酒 = 12
RETURN PRICE
;ルームの内容説明
@HO_ROOM_DESC_20
RESULTS '= "Facilities that provide accommodation and food and beverage to adventurers, merchants, travelers"

;-------------------------------------------------
;家畜小屋
;-------------------------------------------------
@HO_ROOM_DATA_21
#DIMS _DIC_ROOM_DATA
_DIC_ROOM_DATA '= "[ROOM_NAME:Livestock hut][ROOM_TAG:家畜,屋内,施錠可,][ROOM_CAPACITY:8]"
RESULTS = %_DIC_ROOM_DATA%
;ルームの作成条件
@HO_ROOM_IS_CRAFTABLE_21
RETURN 1
;クラフトモードで要求する作成コスト
@HO_ROOM_CRAFT_RESOURCE_21(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 60000
MATERIAL_NEEDS:ITEM_建築資材 = 15
MATERIAL_NEEDS:ITEM_小麦 = 60
RETURN PRICE
;ルームの内容説明
@HO_ROOM_DESC_21
RESULTS '= "Hut for breeding various livestock"

;-------------------------------------------------
;大居間
;-------------------------------------------------
@HO_ROOM_DATA_30
#DIMS _DIC_ROOM_DATA
_DIC_ROOM_DATA '= "[ROOM_NAME:Large room][ROOM_TAG:食堂,休憩所,屋内,][ROOM_CAPACITY:12]"
RESULTS = %_DIC_ROOM_DATA%
;ルームの作成条件
@HO_ROOM_IS_CRAFTABLE_30
RETURN 1
;クラフトモードで要求する作成コスト
@HO_ROOM_CRAFT_RESOURCE_30(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 1000000
MATERIAL_NEEDS:ITEM_建築資材 = 40
RETURN PRICE
;ルームの内容説明
@HO_ROOM_DESC_30
RESULTS '= "A living room where many furniture can be placed.Very spacious"

;-------------------------------------------------
;森林
;-------------------------------------------------
@HO_ROOM_DATA_151
#DIMS _DIC_ROOM_DATA
_DIC_ROOM_DATA '= "[ROOM_NAME:Forest][ROOM_TAG:森林,採集,緑地,屋外,地形,][ROOM_CAPACITY:8]"
RESULTS = %_DIC_ROOM_DATA%
;ルームの作成条件
@HO_ROOM_IS_CRAFTABLE_151
RETURN 0
;クラフトモードで要求する作成コスト
@HO_ROOM_CRAFT_RESOURCE_151(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 2500000
MATERIAL_NEEDS:ITEM_石材 = 10
MATERIAL_NEEDS:ITEM_木材 = 10
RETURN PRICE
;ルームの内容説明
@HO_ROOM_DESC_151
RESULTS '= "The growing forest of dense trees"

;-------------------------------------------------
;山岳
;-------------------------------------------------
@HO_ROOM_DATA_152
#DIMS _DIC_ROOM_DATA
_DIC_ROOM_DATA '= "[ROOM_NAME:Mountain][ROOM_TAG:山,採集,屋外,地形,][ROOM_CAPACITY:8]"
RESULTS = %_DIC_ROOM_DATA%
;ルームの作成条件
@HO_ROOM_IS_CRAFTABLE_152
RETURN 0
;クラフトモードで要求する作成コスト
@HO_ROOM_CRAFT_RESOURCE_152(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 2500000
MATERIAL_NEEDS:ITEM_石材 = 10
MATERIAL_NEEDS:ITEM_木材 = 10
RETURN PRICE
;ルームの内容説明
@HO_ROOM_DESC_152
RESULTS '= "A steep mountain.High quality stone and ore can be collected"

;-------------------------------------------------
;クエスト開始地点
;-------------------------------------------------
@HO_ROOM_DATA_200
#DIMS _DIC_ROOM_DATA
_DIC_ROOM_DATA '= "[ROOM_NAME:Start place][ROOM_TAG:クエスト開始地点,][ROOM_CAPACITY:8]"
RESULTS = %_DIC_ROOM_DATA%
;ルームの作成条件
@HO_ROOM_IS_CRAFTABLE_200
RETURN 0
;クラフトモードで要求する作成コスト
@HO_ROOM_CRAFT_RESOURCE_200(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 999999999
RETURN PRICE
;ルームの内容説明
@HO_ROOM_DESC_200
RESULTS '= "Quest start point"

;-------------------------------------------------
;洞窟
;-------------------------------------------------
@HO_ROOM_DATA_201
#DIMS _DIC_ROOM_DATA
_DIC_ROOM_DATA '= "[ROOM_NAME:Cave][ROOM_TAG:山,採集,屋外,地形,][ROOM_CAPACITY:8]"
RESULTS = %_DIC_ROOM_DATA%
;ルームの作成条件
@HO_ROOM_IS_CRAFTABLE_201
RETURN 0
;クラフトモードで要求する作成コスト
@HO_ROOM_CRAFT_RESOURCE_201(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 2500000
MATERIAL_NEEDS:ITEM_石材 = 10
MATERIAL_NEEDS:ITEM_木材 = 10
RETURN PRICE
;ルームの内容説明
@HO_ROOM_DESC_201
RESULTS '= "Quest"

;-------------------------------------------------
;隘路
;-------------------------------------------------
@HO_ROOM_DATA_202
#DIMS _DIC_ROOM_DATA
_DIC_ROOM_DATA '= "[ROOM_NAME:Defile][ROOM_TAG:屋内,][ROOM_CAPACITY:8]"
RESULTS = %_DIC_ROOM_DATA%
;ルームの作成条件
@HO_ROOM_IS_CRAFTABLE_202
RETURN 0
;クラフトモードで要求する作成コスト
@HO_ROOM_CRAFT_RESOURCE_202(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 2500000
MATERIAL_NEEDS:ITEM_石材 = 10
MATERIAL_NEEDS:ITEM_木材 = 10
RETURN PRICE
;ルームの内容説明
@HO_ROOM_DESC_202
RESULTS '= "Quest"

;-------------------------------------------------
;通路
;-------------------------------------------------
@HO_ROOM_DATA_203
#DIMS _DIC_ROOM_DATA
_DIC_ROOM_DATA '= "[ROOM_NAME:Aisle][ROOM_TAG:屋内,][ROOM_CAPACITY:8]"
RESULTS = %_DIC_ROOM_DATA%
;ルームの作成条件
@HO_ROOM_IS_CRAFTABLE_203
RETURN 0
;クラフトモードで要求する作成コスト
@HO_ROOM_CRAFT_RESOURCE_203(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 2500000
MATERIAL_NEEDS:ITEM_石材 = 10
MATERIAL_NEEDS:ITEM_木材 = 10
RETURN PRICE
;ルームの内容説明
@HO_ROOM_DESC_203
RESULTS '= "Quest"

;-------------------------------------------------
;大部屋
;-------------------------------------------------
@HO_ROOM_DATA_204
#DIMS _DIC_ROOM_DATA
_DIC_ROOM_DATA '= "[ROOM_NAME:Aisle][ROOM_TAG:屋内,][ROOM_CAPACITY:8]"
RESULTS = %_DIC_ROOM_DATA%
;ルームの作成条件
@HO_ROOM_IS_CRAFTABLE_204
RETURN 0
;クラフトモードで要求する作成コスト
@HO_ROOM_CRAFT_RESOURCE_204(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
#DIM PRICE = 2500000
MATERIAL_NEEDS:ITEM_石材 = 10
MATERIAL_NEEDS:ITEM_木材 = 10
RETURN PRICE
;ルームの内容説明
@HO_ROOM_DESC_204
RESULTS '= "Quest"

repo_name: pervysquirrelz/erafl

license: unknown


code:
; キャラクター関係
#DIM CONST MAX_CHARANUM = 200
#DIM CONST MAX_RELATION_RECORD = 4000

;ITEMデータ定義
#DIM CONST ITEM_基準生産量 = 0
#DIM CONST ITEM_基準生産量_1 = 1
#DIM CONST ITEM_基準生産量_2 = 2
#DIM CONST ITEM_基準生産量_3 = 3
#DIM CONST ITEM_基準生産量_4 = 4
#DIM CONST ITEM_CANNOT_SELL    = 15
#DIM CONST ITEM_PRICE     = 16
#DIM CONST ITEM_EFFECT_RATE    = 17
#DIM CONST ITEM_CAN_USE_AT_HOME  = 10
#DIM CONST ITEM_CAN_USE_AT_TRAIN = 11
#DIM CONST ITEM_CAN_USE_AT_QUEST = 12
#DIM CONST ITEM_SELL_TYPE        = 15 ;0 = お金で販売,1 = 名誉点で販売
#DIM CONST ITEM_追加生産時間 = 5
#DIM CONST STATUS_LENGTH = 18

;ゲーム開始時のモード
#DIM NEWGAME_SELECT_GAME_MODE

;勢力
#DIM CONST MAX_COUNTRY = 13
#DIM SAVEDATA REL_LIKE_COUNTRY, MAX_COUNTRY, MAX_COUNTRY
#DIMS SAVEDATA COUNTRY_NAME, MAX_COUNTRY

#DIM CONST 所属_無所属 = 0
#DIM CONST 所属_プレイヤー = 1
#DIM CONST 所属_ゲストNPC = 2


code:
@HOUSING_TUTORIAL
IF !FLTUTOR:交流の方法
    PRINTL
    CALL PRINT_TITLE("交流について", "TIPS")
    PRINTL
    PRINTFORML キャラクターとの交流についてのチュートリアルを確認しますか？
    PRINTL
    CALL ASK_YN("はい", "いいえ")
    IF RESULT
        FLTUTOR:交流の方法 = 1
        RETURN
    ENDIF
    PRINTFORML 右上のマップが現在の%ANAME(MASTER)%の領地です。オレンジの箇所が%ANAME(MASTER)%の現在地を示しています
    PRINTFORML 初期状態では下の図のように[私室]エリアにいるはずです
    PRINTFORML エリア名をクリックすることで移動することができます。最初は[居間]に移動してみましょう
    PRINTL
    CALL DRAW_STILL(@"TUTORIAL_エリア1", @"[SIZE_X:600px][SIZE_Y:400px]", 1)
    WAIT
    PRINTL
    PRINTFORML 居間に移動すると画面右上の一覧が以下のように変化するはずです
    PRINTFORML これは居間に置かれている家具や道具といった設備を示しています
    PRINTL
    CALL DRAW_STILL(@"TUTORIAL_設備1", @"[SIZE_X:250px][SIZE_Y:150px]", 1)
    CALL COLOR_PRINTW("会話やスキンシップといった交流は基本的に同じ設備を利用しているキャラクターと可能です", カラー_注意)
    PRINTL
    PRINTL
    PRINTFORML よくわからなければ、まずは[ちゃぶ台]をクリックして[待機]コマンドをクリックし、少し時間を進めてみましょう
    PRINTFORMW 同居人がいればちゃぶ台にやってきて食事を始め、会話やスキンシップが可能になるはずです
    PRINTL
    PRINTFORML その時、右上の一覧は下の図のように変化しているはずです
    PRINTFORML 黄色のコマはプレイヤー、赤または青のコマは同居人がそれぞれこの設備を使っていることを示しています
    PRINTL
    CALL DRAW_STILL(@"TUTORIAL_設備2", @"[SIZE_X:250px][SIZE_Y:150px]", 1)
    WAIT
    PRINTL
    PRINTFORML 同居人はお腹をすかせれば食事をとり、食後には休憩し、読書や運動、思い思いの行動をします
    PRINTFORMW 会話したり、眺めたり、ちょっかいを出してみたり、色々試して仲を深めてみましょう。それでは良い一日を！
    FLTUTOR:交流の方法 = 1
ENDIF

@TUTORIAL_クエストに挑む前に
PRINTL
CALL PRINT_TITLE("クエストに挑む前に", "TIPS")
PRINTL
PRINTFORML クエストについてのチュートリアルを確認しますか？
PRINTL
CALL ASK_YN("はい", "いいえ")
IF RESULT
    FLTUTOR:クエストに挑む前に = 1
    RETURN
ENDIF
PRINTFORML ギルドでは様々なクエストを受注することができます
PRINTFORMW しかし戦いを伴うクエストに挑むのであれば、相応の準備を整えるべきでしょう
PRINTL
PRINTFORML もし仲間の頭数がクエストが要求する推奨パーティ人数に満たないのであれば、
PRINTFORMW まずは仲間を探してみるのが懸命かもしれません
PRINTFORML ギルドのクエストボードには戦いや冒険の他に、求人も掲げられているはずです
PRINTFORMW 彼らの声に耳を傾けてみるのもよいでしょう
PRINTL
PRINTFORMW あるいは一度ホームメニューに戻り、[人材を探す]から在野の冒険者を募るのもよいでしょう
PRINTL
PRINTL
PRINTFORML また、自身を強化することも有効です
PRINTFORMW ホームメニューの[スキル習得]からは冒険や戦闘、生活で役立つ様々なスキルを習得出来ます
PRINTFORMW 最初に習得出来るスキルは限られていますが、何も身につけていないよりはずっと役に立つはずです
PRINTL
CALL PRINT_NOTICE("スキルポイントは自由に振り直しが出来るので色々な組み合わせを試してみるとよいでしょう")
PRINTL
PRINTL
PRINTFORMW それでは良い旅を
FLTUTOR:クエストに挑む前に = 1


code:
;-------------------------------------------------
;エリア効果処理
;-------------------------------------------------
;エリア効果の存在有無チェック
@HO_EXIST_MAP_EFFECT(MAP_EFFECT_NAME, CHARA_ID = 0)
#DIMS MAP_EFFECT_NAME
#DIM  CHARA_ID
#DIM  DYNAMIC ROOM_IDX
#DIMS DYNAMIC MAP_NAME
SIF !FLAG:ハウジングモード
    RETURN 0

IF HO_CHECK_ITEM_CRAFTABLE_AT_ROOM_IDX == -1
    ROOM_IDX = C_COND_MAP_GET(CHARA_ID, "エリアIDX")
ELSE
    ROOM_IDX = HO_CHECK_ITEM_CRAFTABLE_AT_ROOM_IDX
ENDIF
MAP_NAME '= @"MAP_{ROOM_IDX}_ROOM_EFFECT"
IF MAP_HAS(MAP_NAME, MAP_EFFECT_NAME) > 0
    RETURN 1
ELSE
    RETURN 0
ENDIF
;-------------------------------------------------
; @SOURCE_CHECK_2
;快感系以外のソース処理、@SOURCE_CHECK_2 から呼ばれる
;-------------------------------------------------
@HOUSING_INTERIOR_EFFECT_SOURCE_CHECK2(CHARA_ID)
#DIM CHARA_ID
#DIM  DYNAMIC ROOM_IDX
#DIM  DYNAMIC MODULE_IDX
#DIMS DYNAMIC ROOM_EFFECT_MAP
#DIMS DYNAMIC MODULE_EFFECT_MAP
#DIM F_COL

ROOM_IDX = C_COND_MAP_GET(CHARA_ID, "エリアIDX")
ROOM_EFFECT_MAP '= @"MAP_{ROOM_IDX}_ROOM_EFFECT"
MODULE_IDX = C_COND_MAP_GET(CHARA_ID, "設備IDX")
MODULE_EFFECT_MAP '= @"MAP_{MODULE_IDX}_MODULE_EFFECT"

;観葉植物
IF MAP_HAS(ROOM_EFFECT_MAP, "観葉植物") > 0
    SIF PALAM:CHARA_ID:怒主 >= 0
        TIMES PALAM:CHARA_ID:怒主, 0.90
    SIF PALAM:CHARA_ID:怒外 >= 0
        TIMES PALAM:CHARA_ID:怒外, 0.90
    SIF PALAM:CHARA_ID:哀主 >= 0
        TIMES PALAM:CHARA_ID:哀主, 0.90
    SIF PALAM:CHARA_ID:怒外 >= 0
        TIMES PALAM:CHARA_ID:哀外, 0.90
    TIMES SOURCE:CHARA_ID:不安, 0.95
    TIMES SOURCE:CHARA_ID:恐怖, 0.95
    IF CHARA_ID == MASTER
        F_COL = EFFECT_COL_観葉植物
        CALL HO_ROOM_EFFECT_SET_DESC(@"@C:{F_COL}@【観葉植物】@/C@")
    ENDIF
ENDIF

;休憩 & 茶器
IF GROUPMATCH(SELECTCOM, T_N("休憩をとる"), T_N("食事をとる"))
    IF MAP_HAS(ROOM_EFFECT_MAP, "茶器") > 0
        SIF TCVAR:CHARA_ID:HO体力増減値 > 0
            TIMES TCVAR:CHARA_ID:HO体力増減値, 1.2
        SIF TCVAR:CHARA_ID:HO気力増減値 > 0
            TIMES TCVAR:CHARA_ID:HO気力増減値, 1.2
        IF CHARA_ID == MASTER
            F_COL = EFFECT_COL_茶器
            CALL HO_ROOM_EFFECT_SET_DESC(@"@C:{F_COL}@【茶器】@/C@")
        ENDIF
    ELSEIF MAP_HAS(MODULE_EFFECT_MAP, "ぬくもり") > 0
        SIF TCVAR:CHARA_ID:HO体力増減値 > 0
            TIMES TCVAR:CHARA_ID:HO体力増減値, 1.5
        SIF TCVAR:CHARA_ID:HO気力増減値 > 0
            TIMES TCVAR:CHARA_ID:HO気力増減値, 1.5
        IF CHARA_ID == MASTER
            F_COL = EFFECT_COL_ぬくもり
            CALL HO_ROOM_EFFECT_SET_DESC(@"@C:{F_COL}@【ぬくもり】@/C@")
        ENDIF
    ELSEIF MAP_HAS(MODULE_EFFECT_MAP, "薫る薬湯") > 0
        SIF TCVAR:CHARA_ID:HO体力増減値 > 0
            TIMES TCVAR:CHARA_ID:HO体力増減値, 1.5
        SIF TCVAR:CHARA_ID:HO気力増減値 > 0
            TIMES TCVAR:CHARA_ID:HO気力増減値, 1.5
        IF CHARA_ID == MASTER
            F_COL = EFFECT_COL_薫る薬湯
            CALL HO_ROOM_EFFECT_SET_DESC(@"@C:{F_COL}@【薫る薬湯】@/C@")
        ENDIF
    ENDIF
ENDIF

;食事 & 陶磁器
IF GROUPMATCH(SELECTCOM, T_N("食事をとる"))
    IF MAP_HAS(ROOM_EFFECT_MAP, "色絵の磁器") > 0
        SIF TCVAR:CHARA_ID:HO体力増減値 > 0
            TIMES TCVAR:CHARA_ID:HO体力増減値, 1.3
        SIF TCVAR:CHARA_ID:HO気力増減値 > 0
            TIMES TCVAR:CHARA_ID:HO気力増減値, 1.3
        IF CHARA_ID == MASTER
            F_COL = EFFECT_COL_色絵の磁器
            CALL HO_ROOM_EFFECT_SET_DESC(@"@C:{F_COL}@【色絵の磁器】@/C@")
        ENDIF
    ENDIF
ENDIF

;ピアノの音色
IF MAP_HAS(ROOM_EFFECT_MAP, "ピアノの音色") > 0
    SIF PALAM:CHARA_ID:怒主 >= 0
        TIMES PALAM:CHARA_ID:怒主, 0.90
    SIF PALAM:CHARA_ID:怒外 >= 0
        TIMES PALAM:CHARA_ID:怒外, 0.90
    SIF PALAM:CHARA_ID:哀主 >= 0
        TIMES PALAM:CHARA_ID:哀主, 0.90
    SIF PALAM:CHARA_ID:怒外 >= 0
        TIMES PALAM:CHARA_ID:哀外, 0.90
    TIMES SOURCE:CHARA_ID:歓楽, 1.10
    TIMES SOURCE:CHARA_ID:不安, 0.90
    TIMES SOURCE:CHARA_ID:恐怖, 0.90
    IF CHARA_ID == MASTER
        F_COL = EFFECT_COL_ピアノの音色
        CALL HO_ROOM_EFFECT_SET_DESC(@"@C:{F_COL}@【♪ピアノの音色】@/C@")
    ENDIF
ENDIF

;サウナ
IF SEARCH_EQUIP_EITHER(T_N("サウナ"), CHARA_ID) >= 0
    IF MAP_HAS(ROOM_EFFECT_MAP, "熱気浴") > 0
        SIF PALAM:CHARA_ID:怒主 >= 0
            TIMES PALAM:CHARA_ID:怒主, 0.90
        SIF PALAM:CHARA_ID:怒外 >= 0
            TIMES PALAM:CHARA_ID:怒外, 0.90
        SIF PALAM:CHARA_ID:哀主 >= 0
            TIMES PALAM:CHARA_ID:哀主, 0.90
        SIF PALAM:CHARA_ID:怒外 >= 0
            TIMES PALAM:CHARA_ID:哀外, 0.90
        TIMES SOURCE:CHARA_ID:歓楽, 1.10
        TIMES SOURCE:CHARA_ID:不安, 0.90
        TIMES SOURCE:CHARA_ID:恐怖, 0.90
        IF CHARA_ID == MASTER
            F_COL = EFFECT_COL_熱気浴
            CALL HO_ROOM_EFFECT_SET_DESC(@"@C:{F_COL}@【熱気浴】@/C@")
        ENDIF
    ENDIF
ENDIF

IF MAP_HAS(ROOM_EFFECT_MAP, "演舞") > 0
    SIF PALAM:CHARA_ID:怒主 >= 0
        TIMES PALAM:CHARA_ID:怒主, 0.90
    SIF PALAM:CHARA_ID:怒外 >= 0
        TIMES PALAM:CHARA_ID:怒外, 0.90
    SIF PALAM:CHARA_ID:哀主 >= 0
        TIMES PALAM:CHARA_ID:哀主, 0.90
    SIF PALAM:CHARA_ID:怒外 >= 0
        TIMES PALAM:CHARA_ID:哀外, 0.90
    TIMES SOURCE:CHARA_ID:歓楽, 1.10
    TIMES SOURCE:CHARA_ID:不安, 0.90
    TIMES SOURCE:CHARA_ID:恐怖, 0.90
    IF CHARA_ID == MASTER
        F_COL = EFFECT_COL_演舞
        CALL HO_ROOM_EFFECT_SET_DESC(@"@C:{F_COL}@【♪演舞】@/C@")
    ENDIF
ENDIF

IF MAP_HAS(ROOM_EFFECT_MAP, "歌唱") > 0
    SIF PALAM:CHARA_ID:怒主 >= 0
        TIMES PALAM:CHARA_ID:怒主, 0.90
    SIF PALAM:CHARA_ID:怒外 >= 0
        TIMES PALAM:CHARA_ID:怒外, 0.90
    SIF PALAM:CHARA_ID:哀主 >= 0
        TIMES PALAM:CHARA_ID:哀主, 0.90
    SIF PALAM:CHARA_ID:怒外 >= 0
        TIMES PALAM:CHARA_ID:哀外, 0.90
    TIMES SOURCE:CHARA_ID:歓楽, 1.10
    TIMES SOURCE:CHARA_ID:不安, 0.90
    TIMES SOURCE:CHARA_ID:恐怖, 0.90
    IF CHARA_ID == MASTER
        F_COL = EFFECT_COL_歌唱
        CALL HO_ROOM_EFFECT_SET_DESC(@"@C:{F_COL}@【♪歌唱】@/C@")
    ENDIF
ENDIF

;-------------------------------------------------
; @SOURCE_CHECK_1
;快感系のソース処理、@SOURCE_CHECK_1 の絶頂処理前から呼ばれる
;-------------------------------------------------
@HOUSING_INTERIOR_EFFECT_SOURCE_CHECK1_BEFORE_ORGASM(CHARA_ID)
#DIM CHARA_ID
#DIM  DYNAMIC ROOM_IDX
#DIM  DYNAMIC MODULE_IDX
#DIMS DYNAMIC ROOM_EFFECT_MAP
#DIMS DYNAMIC MODULE_EFFECT_MAP
#DIM F_COL

#DIM  DYNAMIC 欲情値

ROOM_IDX = C_COND_MAP_GET(CHARA_ID, "エリアIDX")
ROOM_EFFECT_MAP '= @"MAP_{ROOM_IDX}_ROOM_EFFECT"
MODULE_IDX = C_COND_MAP_GET(CHARA_ID, "設備IDX")
MODULE_EFFECT_MAP '= @"MAP_{MODULE_IDX}_MODULE_EFFECT"

;淫らな絵画
IF MAP_HAS(ROOM_EFFECT_MAP, "淫らな絵画") > 0
    IF IS_PLAYABLE(CHARA_ID)
        欲情値 = CUP:(CHARA_ID):欲情
        IF 欲情値 >= 10000
            SOURCE:(CHARA_ID):感応 += 750
        ELSEIF 欲情値 >= 3000
            SOURCE:(CHARA_ID):感応 += 250
        ELSEIF 欲情値 >= 500
            SOURCE:(CHARA_ID):感応 += 75
        ELSE
            SOURCE:(CHARA_ID):感応 += 25
        ENDIF
        SOURCE:(CHARA_ID):逸脱 += 40
        TIMES SOURCE:(CHARA_ID):逸脱, 1.2

        IF CHARA_ID == MASTER && MAP_HAS(ROOM_EFFECT_MAP, "淫らな絵画") > 0
            F_COL = EFFECT_COL_淫らな絵画
            CALL HO_ROOM_EFFECT_SET_DESC(@"@C:{F_COL}@【❤淫らな絵画】")
        ENDIF
    ENDIF
ENDIF

;卑猥な書籍
IF SELECTCOM == T_N("勉強する") && MAP_HAS(ROOM_EFFECT_MAP, "卑猥な書籍") > 0
    IF IS_PLAYABLE(CHARA_ID)
        欲情値 = CUP:(CHARA_ID):欲情
        IF 欲情値 >= 10000
            SOURCE:(CHARA_ID):感応 += 500
        ELSEIF 欲情値 >= 3000
            SOURCE:(CHARA_ID):感応 += 125
        ELSEIF 欲情値 >= 500
            SOURCE:(CHARA_ID):感応 += 30
        ELSE
            SOURCE:(CHARA_ID):感応 += 10
        ENDIF
        SOURCE:(CHARA_ID):逸脱 += 10
        EXP:(CHARA_ID):性知識経験値 += 25
        PALAM:(CHARA_ID):欲情 += 5
        IF  CHARA_ID == MASTER && MAP_HAS(ROOM_EFFECT_MAP, "卑猥な書籍") > 0
            F_COL = EFFECT_COL_卑猥な書籍
            CALL HO_ROOM_EFFECT_SET_DESC(@"@C:{F_COL}@【❤卑猥な書籍】")
        ENDIF
    ENDIF
ENDIF

;煽欲の小夜曲
IF MAP_HAS(ROOM_EFFECT_MAP, "煽欲の小夜曲") > 0
    PALAM:(CHARA_ID):欲情 += 20 + (ABL:CHARA_ID:歌唱 / 5)
    TIMES SOURCE:CHARA_ID:愛情, 1.45
    TIMES SOURCE:CHARA_ID:歓楽, 1.25
    TIMES SOURCE:CHARA_ID:不安, 0.90
    TIMES SOURCE:CHARA_ID:恐怖, 0.90
    IF CHARA_ID == MASTER
        F_COL = EFFECT_COL_煽欲の小夜曲
        CALL HO_ROOM_EFFECT_SET_DESC(@"@C:{F_COL}@【♪煽欲の小夜曲】@/C@")
    ENDIF
ENDIF

;散乱した使用済ゴム
IF MAP_HAS(ROOM_EFFECT_MAP, "散乱した使用済ゴム") > 0
    SOURCE:(CHARA_ID):感応 += 25 * (ABL:(CHARA_ID):精愛 * 3)
    PALAM:(CHARA_ID):欲情 += 10 * (ABL:(CHARA_ID):精愛 * 3)
    SOURCE:(CHARA_ID):逸脱 += 40
    TIMES SOURCE:(CHARA_ID):逸脱, 1.2
    SOURCE:(CHARA_ID):不潔 += 90
    TIMES SOURCE:(CHARA_ID):不潔, 1.4
    IF CHARA_ID == MASTER
        F_COL = EFFECT_COL_散乱した使用済ゴム
        CALL HO_ROOM_EFFECT_SET_DESC(@"@C:{F_COL}@【❤散乱した使用済ゴム】")
    ENDIF
ENDIF

;むせ返るような精臭
;エリア内の総射精量が一定値に達した場合付与されるエリア効果
;-------------------------------------------------
IF MAP_HAS(ROOM_EFFECT_MAP, "むせ返るような精臭") > 0
    SOURCE:(CHARA_ID):感応 += 25 * (ABL:(CHARA_ID):精愛 * 3)
    PALAM:(CHARA_ID):欲情 += 10 * (ABL:(CHARA_ID):精愛 * 3)
    SOURCE:(CHARA_ID):逸脱 += 40
    SIF IS_NASTY(CHARA_ID, 素質_淫乱_精飲中毒)
        TIMES SOURCE:(CHARA_ID):感応, 1.8
    TIMES SOURCE:(CHARA_ID):逸脱, 1.2
    SOURCE:(CHARA_ID):不潔 += 60
    TIMES SOURCE:(CHARA_ID):不潔, 1.2
    IF CHARA_ID == MASTER
        F_COL = EFFECT_COL_むせ返るような精臭
        CALL HO_ROOM_EFFECT_SET_DESC(@"@C:{F_COL}@【❤むせ返るような精臭】")
    ENDIF
ENDIF

;精液まみれ
;設備内の総射精量が一定値に達した場合付与される設備効果
;-------------------------------------------------
IF MAP_HAS(MODULE_EFFECT_MAP, "精液まみれ") > 0
    SOURCE:(CHARA_ID):感応 += 25 * (ABL:(CHARA_ID):精愛 * 5)
    PALAM:(CHARA_ID):欲情 += 10 * (ABL:(CHARA_ID):精愛 * 5)
    SOURCE:(CHARA_ID):逸脱 += 60
    SIF IS_NASTY(CHARA_ID, 素質_淫乱_精飲中毒)
        TIMES SOURCE:(CHARA_ID):感応, 2
    TIMES SOURCE:(CHARA_ID):逸脱, 2
    SOURCE:(CHARA_ID):不潔 += 80
    TIMES SOURCE:(CHARA_ID):不潔, 1.2
    IF CHARA_ID == MASTER
        F_COL = EFFECT_COL_精液まみれ
        CALL HO_ROOM_EFFECT_SET_DESC(@"@C:{F_COL}@【❤精液まみれ】")
    ENDIF
ENDIF

;-------------------------------------------------
; @SOURCE_CHECK_1
;快感系のソース処理、@SOURCE_CHECK_1 の絶頂処理後に呼ばれる
;-------------------------------------------------
@HOUSING_INTERIOR_EFFECT_SOURCE_CHECK1_AFTER_ORGASM(CHARA_ID)
#DIM CHARA_ID
#DIM  DYNAMIC ROOM_IDX
#DIM  DYNAMIC MODULE_IDX
#DIMS DYNAMIC ROOM_EFFECT_MAP
#DIMS DYNAMIC MODULE_EFFECT_MAP
#DIM  DYNAMIC F_COL
#DIM  DYNAMIC 射精量

ROOM_IDX = C_COND_MAP_GET(CHARA_ID, "エリアIDX")
ROOM_EFFECT_MAP '= @"MAP_{ROOM_IDX}_ROOM_EFFECT"
MODULE_IDX = C_COND_MAP_GET(CHARA_ID, "設備IDX")
MODULE_EFFECT_MAP '= @"MAP_{MODULE_IDX}_MODULE_EFFECT"

;エリア効果【❤むせ返るような精臭】セット処理
IF !MAP_HAS(ROOM_EFFECT_MAP, "むせ返るような精臭") > 0
    CALL HO_GET_MAPDATA(HO_有効マップID, ROOM_IDX, "射精量")
    射精量 = RESULT
    IF 射精量 >= 200
        MAP_SET ROOM_EFFECT_MAP, "むせ返るような精臭", "0"
    ENDIF
ENDIF

;設備効果【❤精液まみれ】セット処理
IF !MAP_HAS(MODULE_EFFECT_MAP, "精液まみれ") > 0
    CALL HO_GET_MODULE_LIST(MODULE_IDX, "射精量")
    射精量 = RESULT
    IF 射精量 >= 200
        MAP_SET MODULE_EFFECT_MAP, "精液まみれ", "0"
    ENDIF
ENDIF

;-------------------------------------------------
;@HO_COM_AFTER から呼ばれるメッセージ出力処理
;-------------------------------------------------
@HOUSING_ROOM_EFFECT_MESSAGE_COM_AFTER()
CALL HO_ROOM_EFFECT_PRINT_DESC

;-------------------------------------------------
; 地の文描写
; 増えてきたら整理する必要あり
;-------------------------------------------------
;同エリアで常に発揮されるエリア効果
@HO_ROOM_EFFECT_COM_TEXT_LAST_DESC_観葉植物
#DIM F_COL = EFFECT_COL_観葉植物
SIF RAND:3
    RETURN
CALLF TAG_PRINTH(@"@C:{F_COL}@瑞々しい葉を付けた植物が辺りの雰囲気を和らげている…@/C@", 1)

@HO_ROOM_EFFECT_COM_TEXT_LAST_DESC_ピアノの音色
#DIM F_COL = EFFECT_COL_ピアノの音色
SIF RAND:2
    RETURN
CALLF TAG_PRINTH(@"@C:{F_COL}@心地よいピアノの音色が辺りに響いている…。心が和らぎ、軽くなる気がした@/C@", 1)

;休憩時のみ発揮されるエリア効果
@HO_ROOM_EFFECT_COM_TEXT_LAST_DESC_茶器
#DIM F_COL = EFFECT_COL_茶器
SIF RAND:2 || SELECTCOM != T_N("休憩をとる")
    RETURN
CALLF TAG_PRINTH(@"@C:{F_COL}@芳醇な茶の良い香りが、心を鎮め、疲れを癒やした…@/C@", 1)

;食事時のみ発揮されるエリア効果
@HO_ROOM_EFFECT_COM_TEXT_LAST_DESC_色絵の磁器
#DIM F_COL = EFFECT_COL_色絵の磁器
SIF RAND:2 || SELECTCOM != T_N("食事をとる")
    RETURN
CALLF TAG_PRINTH(@"@C:{F_COL}@磁器に描かれた繊細な色絵が、料理の彩りをさらに引き立てる…@/C@", 1)

;エロ系_同エリアで常に発揮されるエリア効果
@HO_ROOM_EFFECT_COM_TEXT_LAST_DESC_煽欲の小夜曲
#DIM F_COL = EFFECT_COL_煽欲の小夜曲
SIF RAND:2
    RETURN
CALLF TAG_PRINTH(@"@C:{F_COL}@情欲に訴えかける淫靡な演奏が心を乱す…。身体の内がほのかに火照る気がした@/C@", 1)

@HO_ROOM_EFFECT_COM_TEXT_LAST_DESC_むせ返るような精臭
#DIM F_COL = EFFECT_COL_むせ返るような精臭
{
    CALLF PRINT_RANDC(
        @"@C:{F_COL}@辺りに漂う青臭い精臭が鼻につく…@/C@", 1
        ,@"@C:{F_COL}@周囲に漂う青臭い、濃密な臭気が鼻孔をついた@/C@", 1
        ,@"@C:{F_COL}@濃厚な雄臭があたりに漂っており、嫌でも鼻にまとわりつく…@/C@", 1
        )
}
PRINTL
@HO_ROOM_EFFECT_COM_TEXT_LAST_DESC_精液まみれ
#DIM F_COL = EFFECT_COL_精液まみれ
{
    CALLF PRINT_RANDC(
        @"@C:{F_COL}@おびただしい量の%語彙_精液()%が周囲に四散している@/C@", 1
        ,@"@C:{F_COL}@吐き出された大量の%語彙_精液()%が糸を引いて滴っている@/C@", 1
        ,@"@C:{F_COL}@あちこちに%語彙_精液()%が飛び散り、生ぬるい空気が空間全体を満たしている…@/C@", 1
        )
}
PRINTL

@HO_ROOM_EFFECT_COM_TEXT_LAST_DESC_ぬくもり
#DIM F_COL = EFFECT_COL_ぬくもり
SIF SELECTCOM != T_N("休憩をとる")
    RETURN
{
    CALLF PRINT_RANDC(
        @"@C:{F_COL}@こたつのとろけるようなぬくもりが冷え込んだ身体を包み込んでいる…@/C@", 1
        ,@"@C:{F_COL}@とろけるようなぬくもりに包まれている…しばらくここから動けそうにない…@/C@", 1
        )
}
PRINTL

@HO_ROOM_EFFECT_COM_TEXT_LAST_DESC_薫る薬湯
#DIM F_COL = EFFECT_COL_薫る薬湯
SIF SELECTCOM != T_N("休憩をとる")
    RETURN
{
    CALLF PRINT_RANDC(
        @"@C:{F_COL}@薬草の香りと程よい湯温が、身体を癒やしていく……@/C@", 1
        ,@"@C:{F_COL}@ハーブとスパイスの心地よい香りが、心身をリラックスさせる……@/C@", 1
        ,@"@C:{F_COL}@湯船に溶け出した様々な薬効成分が、疲れを癒やしていく……@/C@", 1
        )
}
PRINTL

@HO_ROOM_EFFECT_COM_TEXT_LAST_DESC_熱気浴
#DIM F_COL = EFFECT_COL_熱気浴
SIF SEARCH_EQUIP_EITHER(T_N("サウナ"), MASTER) < 0
    RETURN
{
    CALLF PRINT_RANDC(
        @"@C:{F_COL}@蒸気の温もりが体の芯まで染み渡り、心と体をゆっくりとほぐしていく……@/C@", 1
        ,@"@C:{F_COL}@熱気が全身を包み込み、疲労感やストレスが汗とともに消えていく……@/C@", 1
        ,@"@C:{F_COL}@木材の香りと心地よい熱気が、心身を癒やしていく…@/C@", 1
        )
}
PRINTL


code:
;-------------------------------------------------
;キャラクターの行動制御(モジュールの使用や視界の判定など)
;
;-------------------------------------------------
;;; キャラクターが現在いるエリア内の設備の使用を試みる
;;; 使用させたい用途または属性またはモジュールリスト上のインデックス番号のいずれか一つを指定して使用する
;;; - ARGS
;;;     - CHARA_ID {int}: キャラクターID
;;;     - USAGE {string}: 設備の用途
;;;     - ELEMENT {string}: 設備の属性
;;;     - MODULE_IDX {int}: 設備のIDX
;;;     - RANDOM {int}: ランダム選択フラグ 0 スロットの上の設備を優先して使用 1 ランダムに使用
;;;     - OPTION {string(DICTIONARY)}: その他の指定オプション
;;;         - [CAPACITY:n] 設備の空き容量がn以上の場合のみ使用
;;; - RETURN
;;;     - RESULT:0 {int}: 0 失敗 1 成功
;-------------------------------------------------
@HO_TRY_USE_MODULE(CHARA_ID, USAGE = "", ELEMENT = "", MODULE_IDX = -1, RANDOM = 0, OPTION = "")
#DIM CHARA_ID
#DIMS USAGE
#DIMS ELEMENT
#DIM  MODULE_IDX
#DIM  RANDOM
#DIMS OPTION
#DIM  DYNAMIC MODULE_ID
#DIM  DYNAMIC CHARA_IDX
#DIM  DYNAMIC OWNER_ID
#DIM  DYNAMIC USER_ID
#DIMS DYNAMIC _LIST_MODULE
#DIMS DYNAMIC _LIST_CHARA_ID
#DIMS DYNAMIC _LIST_OPTIONS
#DIM  DYNAMIC MODULE_SLOT_IDX
#DIM  DYNAMIC ROOM_IDX
#DIM  DYNAMIC IS_ACCEPTABLE

CALL HO_GET_CHARAIDX(CHARA_ID)
CHARA_IDX = RESULT
CALL HO_GET_CHARADATA(CHARA_IDX, "ROOM_IDX")
ROOM_IDX = RESULT
CALL HO_GET_MAPDATA(HO_有効マップID, ROOM_IDX, "MODULE_SLOT")
_LIST_MODULE = %RESULTS%

;用途に合致しているモジュールの一覧を作成
IF MODULE_IDX == -1
    FOR MODULE_SLOT_IDX, 0, LIST_COUNT(_LIST_MODULE)
        CALL HO_GET_MODULE_ID2(ROOM_IDX, MODULE_SLOT_IDX)
        MODULE_ID = RESULT
        IF USAGE != ""
            CALL HO_GET_MODULE_DATA(MODULE_ID, "用途")
            IF LIST_INDEXOF(RESULTS, USAGE) != -1
                _LIST_OPTIONS = %LIST_ADD(_LIST_OPTIONS, TOSTR(MODULE_SLOT_IDX))%
            ENDIF
        ELSEIF ELEMENT != ""
            CALL HO_GET_MODULE_DATA(MODULE_ID, "属性")
            IF LIST_INDEXOF(RESULTS, ELEMENT) != -1
                _LIST_OPTIONS = %LIST_ADD(_LIST_OPTIONS, TOSTR(MODULE_SLOT_IDX))%
            ENDIF
        ENDIF
    NEXT
    ;使用するモジュールをIDX値で直接指定している場合
ELSE
    CALL HO_GET_MODULE_LIST(MODULE_IDX, "ROOM_IDX")
    ;キャラの現在地とモジュールの所在地が不一致ならRETURN
    IF ROOM_IDX != RESULT
        RETURN -1
    ENDIF
    CALL HO_GET_MODULE_LIST(MODULE_IDX, "MODULE_SLOT_IDX")
    _LIST_OPTIONS = %LIST_ADD(_LIST_OPTIONS, TOSTR(RESULT))%
ENDIF

IF LIST_COUNT(_LIST_OPTIONS) > 0
    ;条件を満たす設備が複数あり、ランダム指定の場合は候補リストをシャッフル
    SIF RANDOM
        CALL LIST_SHUFFLE(_LIST_OPTIONS)
    ;キャラが明示的な設備の指定なしに客室の使用を試みた場合、自身の部屋だけを使うように
    IF MODULE_IDX == -1
        CALL HO_CHECK_ROOM_TAG(ROOM_IDX, "客室")
        IF RESULT
            _LIST_OPTIONS '= ""
            _LIST_OPTIONS = %LIST_ADD(_LIST_OPTIONS, TOSTR(CHARA_IDX))%
        ENDIF
    ENDIF
ENDIF
VARI CAPACITY
FOR LOCAL, 0, LIST_COUNT(_LIST_OPTIONS)
    MODULE_SLOT_IDX = TOINT(LIST_GET(_LIST_OPTIONS, LOCAL))
    ;満員のモジュールは使えない
    CALL HO_CHECK_MODULE_CAPACITY(ROOM_IDX, MODULE_SLOT_IDX)
    CAPACITY = RESULT
    SIF CAPACITY == 0
        CONTINUE
    IF OPTION != ""
        ;空き容量が指定されている場合はその容量以上の空き容量があるかを確認
        IF DIC_CONTAINSKEY(OPTION, "CAPACITY")
            IF CAPACITY < DIC_GETINT(OPTION, "CAPACITY")
                CONTINUE
            ENDIF
        ENDIF
    ENDIF
    ;;施錠されているモジュールは使えないが、同行中なら判定をバイパス
    ;同行中は常にMASTERを追随している前提なので、MASTER側で判定する
    IS_ACCEPTABLE = 1
    CALL HO_GET_CHARADATA(CHARA_IDX, "ACTION")
    IF RESULTS == "同行中"
    ELSE
        CALL HO_IS_MODULE_LOCKED(ROOM_IDX, MODULE_SLOT_IDX)
        ;施錠中の場合
        IF RESULT == 1
            IS_ACCEPTABLE = 0
            ;MODULE_IDXを指定しての設備利用の場合
            IF MODULE_IDX != -1
                ;その設備の所有者である、その設備の所有者に招かれている
                IF !IS_ACCEPTABLE
                    CALL HO_GET_MODULE_LIST(MODULE_IDX, "OWNER_ID")
                    OWNER_ID = RESULT
                    IF OWNER_ID == CHARA_ID || TCVAR:CHARA_ID:勧誘されたキャラID == OWNER_ID
                        IS_ACCEPTABLE = 1
                    ENDIF
                ENDIF
                ;利用権があれば施錠されても使用可能とする
                IF !IS_ACCEPTABLE
                    CALL HO_GET_MODULE_LIST(MODULE_IDX, "VISITOR_ID")
                    IF LIST_INDEXOF(RESULTS, TOSTR(CHARA_ID)) != -1
                        IS_ACCEPTABLE = 1
                    ENDIF
                ENDIF
                ;施錠されている設備のなかに勧誘者または恋人がいる
                IF !IS_ACCEPTABLE
                    CALL HO_GET_CHARA_USE_THIS_MODULE(MODULE_IDX, 1)
                    _LIST_CHARA_ID = %RESULTS%
                    FOR LOCAL, 0, LIST_COUNT(_LIST_CHARA_ID)
                        USER_ID = LIST_GETINT(_LIST_CHARA_ID, LOCAL)
                        IF TCVAR:CHARA_ID:勧誘されたキャラID == USER_ID || CFLAG:CHARA_ID:カップル相手キャラID == USER_ID
                            IS_ACCEPTABLE = 1
                        ENDIF
                    NEXT
                ENDIF
            ELSE ;MODULE_IDX未指定の場合は設備利用不可
                IS_ACCEPTABLE = 0
            ENDIF
        ENDIF
    ENDIF
    IF IS_ACCEPTABLE
        ;チェック結果に問題がなければモジュールを使用状態にする
        CALL HO_USE_MODULE(CHARA_ID, ROOM_IDX, MODULE_SLOT_IDX)
        CALL C_COND_SET_INFO_TO_MAP(CHARA_ID, "USE_MODULE")
        RETURN 1
    ENDIF
NEXT
RETURN -1

;モジュールの空きを調べる
@HO_CHECK_MODULE_CAPACITY(ROOM_IDX, MODULE_IDX)
#DIM ROOM_IDX
#DIM MODULE_IDX
#DIM MODULE_ID
#DIM DYNAMIC USER_COUNT
#DIM DYNAMIC CAPACITY

CALL HO_GET_MODULE_ID2(ROOM_IDX, MODULE_IDX)
MODULE_ID = RESULT
SIF RESULT == -1
    RETURN

IF HO_MASTER現在地 == ROOM_IDX
    CALL HO_GET_MASTER_DATA("MODULE_USAGE")
    SIF MODULE_IDX == RESULT
        USER_COUNT ++
ENDIF
LOCAL:1 = 0
WHILE _DIC_HO_CHARALIST:(LOCAL:1) != "-1"
    CALL HO_GET_CHARADATA(LOCAL:1, "ROOM_IDX")
    IF RESULT != ROOM_IDX
        LOCAL:1 ++
        CONTINUE
    ENDIF
    CALL HO_GET_CHARADATA(LOCAL:1, "MODULE_USAGE")
    IF MODULE_IDX == RESULT
        USER_COUNT ++
    ENDIF
    LOCAL:1 ++
WEND
CALL HO_GET_MODULE_DATA(MODULE_ID, "人数")
CAPACITY = RESULT - USER_COUNT

RESULT:1 = USER_COUNT
RESULT:2 = RESULT
RETURN CAPACITY

;キャラデータにモジュールの使用状態を登録
@HO_USE_MODULE(CHARA_ID, ROOM_IDX, MODULE_IDX)
#DIM CHARA_IDX
#DIM ROOM_IDX
#DIM MODULE_IDX
#DIM MODULE_LIST_IDX
#DIM DYNAMIC CHARA_ID
#DIMS DYNAMIC ACTION
#DIMS DYNAMIC MODULE_ID
#DIMS DYNAMIC TEXTOUTPUT

CALL HO_GET_CHARAIDX(CHARA_ID)
CHARA_IDX = RESULT
CALL HO_GET_MODULE_LIST_IDX(ROOM_IDX, MODULE_IDX)
MODULE_LIST_IDX = RESULT
;MODULE_LISTを後付で追加したのでCHARADATAにMODULE_(SLOT)_IDXを"MODULE_USAGE"として保持する理由がない。
;既実装処理のリファクタリングがしんどいので存置
CALL HO_SET_CHARADATA(CHARA_IDX, "MODULE_USAGE", TOSTR(MODULE_IDX))
CALL HO_SET_CHARADATA(CHARA_IDX, "USE_MODULE_IDX", TOSTR(MODULE_LIST_IDX))

;自動施錠指定のモジュールは使用時に施錠
CALL HO_CHECK_MODULE_ELEMENT(ROOM_IDX, MODULE_IDX, "自動施錠")
IF RESULT
    CALL HO_LOCK_ROOM_MODULE(CHARA_ID, ROOM_IDX, MODULE_IDX, 1)
ENDIF

;マスターが対象のモジュールを既に使っている場合は相席モード
CALL HO_GET_CHARAACT(CHARA_ID)
ACTION = %RESULTS%
CALL HO_GET_MASTER_DATA("MODULE_USAGE")
IF HO_MASTER現在地 == ROOM_IDX && RESULT == MODULE_IDX && ACTION != "同行中"
    TEXTOUTPUT = %TR(ANAME(CHARA_ID),"が",ANAME(MASTER),"のそばにやってきた")%
    CALL COLOR_PRINTL(TEXTOUTPUT, カラー_黄緑)
    SIF !TCVAR:CHARA_ID:交流顔合わせ済
        TCVAR:CHARA_ID:交流顔合わせ済 = 1
    TCVAR:CHARA_ID:相席フラグ = 1
    CALL HO_ADD_COMPANION(CHARA_ID, 1)
ENDIF

IF ACTION == "逢瀬中"
    IF TFLAG:覗き見モード && TFLAG:覗き見対象設備IDX == MODULE_LIST_IDX
        TFLAG:参加者数 ++
        CFLAG:CHARA_ID:調教参加フラグ  = 1
        TCVAR:CHARA_ID:覗き見対象 = 1
        TEXTOUTPUT = %TR(ANAME(CHARA_ID),"が情事の場に加わった…")%
        CALL COLOR_PRINTL(TEXTOUTPUT, カラー_ピンク)
    ENDIF
ENDIF

CALL C_COND_SET_INFO_TO_MAP(CHARA_ID, "USE_MODULE")

;モジュールの利用停止
@HO_STOP_USE_MODULE(CHARA_ID)
#DIM CHARA_ID
#DIM DYNAMIC CHARA_IDX
#DIM DYNAMIC ROOM_IDX
#DIM DYNAMIC MODULE_IDX
#DIM DYNAMIC CHARA_GROUP_LIST_IDX
#DIMS DYNAMIC TEXTOUTPUT

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, "MODULE_USAGE")
MODULE_IDX = RESULT
SIF MODULE_IDX == -1
    RETURN
CALL HO_GET_CHARADATA(CHARA_IDX, "CHARA_GROUP")
CHARA_GROUP_LIST_IDX = RESULT

;移動する前に身だしなみを整える
CALL HO_REDRESS(CHARA_ID)
IF RESULT
    CALL HO_IS_TARGET_VISIBLE(MASTER, CHARA_ID)
    IF RESULT
        TEXTOUTPUT = %TR("移動する前に",ANAME(CHARA_ID, RESULT),"は",SPLIT_RAND("衣服の乱れ/着衣の乱れ/身だしなみ",1),"をそっと整えた……")%
        PRINTFORMW %TEXTOUTPUT%
    ENDIF
ENDIF

IF C_COND("設備用途:搾乳",,CHARA_ID) && IS_EQUIP_TARGET(CHARA_ID, T_N("搾乳機"))
    CALL RELEASE_EQUIP_EX(T_N("搾乳機"), -1, CHARA_ID)
ENDIF

;使用していたモジュールを解放
CALL HO_LOCK_ROOM_MODULE(CHARA_ID, ROOM_IDX, MODULE_IDX, 0)
;キャラデータのモジュール使用状況を更新
CALL HO_SET_CHARADATA(CHARA_IDX, "MODULE_USAGE", "-1")
CALL HO_SET_CHARADATA(CHARA_IDX, "USE_MODULE_IDX", "-1")
;グループに属していた場合、グループから離脱
IF CHARA_GROUP_LIST_IDX != -1
    CALL HO_LEAVE_CHARA_GROUP(CHARA_GROUP_LIST_IDX, CHARA_ID)
ENDIF
;相席モードの場合コンパニオンから離脱
IF TCVAR:CHARA_ID:相席フラグ == 1
    CALL HO_REMOVE_COMPANION(CHARA_ID)
    CALL COLOR_PRINTL(@"%TR(ANAME(CHARA_ID, RESULT),"は",ANAME(MASTER),"に別れを告げて立ち去った")%", カラー_黄緑)
    TCVAR:CHARA_ID:相席フラグ = 0
    TCVAR:CHARA_ID:同行解除フラグ = 1
ENDIF
CALL C_COND_SET_INFO_TO_MAP(CHARA_ID, "STOP_USE_MODULE")

;引数に指定した用途に合致し使用可能なモジュールをリストで返す
@HO_GET_USABLE_MODULE(USAGE, ROOM_IDX, USER_NUM = 1)
#DIMS USAGE
#DIM ROOM_IDX
#DIM USER_NUM
#DIMS DYNAMIC _LIST_MODULE
#DIMS DYNAMIC _LIST_OPTIONS
#DIM DYNAMIC MODULE_IDX
#DIM DYNAMIC MODULE_ID

VARSET RESULTS
CALL HO_GET_MAPDATA(HO_有効マップID, ROOM_IDX, "MODULE_SLOT")
_LIST_MODULE = %RESULTS%

;用途に合致しているモジュールの一覧を作成
FOR MODULE_IDX, 0, LIST_COUNT(_LIST_MODULE)
    CALL HO_GET_MODULE_ID2(ROOM_IDX, MODULE_IDX)
    MODULE_ID = RESULT
    CALL HO_GET_MODULE_DATA(MODULE_ID, "用途")
    IF LIST_INDEXOF(RESULTS, USAGE) != -1
        CALL HO_CHECK_MODULE_CAPACITY(ROOM_IDX, MODULE_IDX)
        SIF USER_NUM <= RESULT
            _LIST_OPTIONS = %LIST_ADD(_LIST_OPTIONS, TOSTR(MODULE_IDX))%
    ENDIF
NEXT
IF LIST_COUNT(_LIST_OPTIONS) != 0
    RESULTS = %_LIST_OPTIONS%
    RETURN LIST_COUNT(_LIST_OPTIONS)
ELSE
    RETURN 0
ENDIF
;-------------------------------------------------
;ルームモジュールを施錠
;LOCK = 1:ロック, LOCK = 0:アンロック
;施錠済みのモジュールを再度施錠したり、解錠済みのモジュールを再度解錠しても問題はない
;-------------------------------------------------
@HO_LOCK_ROOM_MODULE(CHARA_ID, ROOM_IDX, MODULE_IDX, LOCK = 1, MAP_ID = -1)
#DIM  CHARA_ID
#DIM  ROOM_IDX
#DIM  MODULE_IDX
#DIM  LOCK
#DIM  MAP_ID
#DIM  DYNAMIC MODULE_ID
#DIMS DYNAMIC _LIST_LOCKED_MODULE

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

VARSET RESULTS
IF LOCK == 1
    ;施錠権限がない場合施錠できない
    CALL HO_CHECK_MODULE_OWNER(ROOM_IDX, MODULE_IDX)
    SIF CHARA_ID != RESULT && RESULT != -1
        RETURN
    CALL HO_GET_MAPDATA(MAP_ID, ROOM_IDX, "LOCKED_MODULE")
    _LIST_LOCKED_MODULE = %RESULTS%
    IF RESULT == -1 ;対象ROOM_IDXに施錠リストが存在しない
        _LIST_LOCKED_MODULE = %LIST_ADD(_LIST_LOCKED_MODULE, TOSTR(MODULE_IDX))%
        CALL HO_SET_MAPDATA(ROOM_IDX, "LOCKED_MODULE", _LIST_LOCKED_MODULE)
    ELSE
        ;対象ROOM_IDXに施錠リストがあるが、対象MODULE_IDXは施錠リストに登録されていない
        IF LIST_INDEXOF(_LIST_LOCKED_MODULE, TOSTR(MODULE_IDX)) == -1
            _LIST_LOCKED_MODULE = %LIST_ADD(_LIST_LOCKED_MODULE, TOSTR(MODULE_IDX))%
            CALL HO_SET_MAPDATA(ROOM_IDX, "LOCKED_MODULE", _LIST_LOCKED_MODULE)
        ENDIF
    ENDIF
ELSE ;アンロック処理
    CALL HO_GET_MAPDATA(MAP_ID, ROOM_IDX, "LOCKED_MODULE")
    _LIST_LOCKED_MODULE = %RESULTS%
    SIF RESULT == -1
        RETURN
    IF LIST_INDEXOF(_LIST_LOCKED_MODULE, TOSTR(MODULE_IDX)) != -1
        _LIST_LOCKED_MODULE = %LIST_REMOVEAT(_LIST_LOCKED_MODULE, LIST_INDEXOF(_LIST_LOCKED_MODULE, TOSTR(MODULE_IDX)))%
        CALL HO_SET_MAPDATA(ROOM_IDX, "LOCKED_MODULE", _LIST_LOCKED_MODULE)
    ENDIF
ENDIF

;ルームモジュールの施錠判定
; RETURN 1 = 施錠中,RETURN = 0 施錠なし
@HO_IS_MODULE_LOCKED(ROOM_IDX, MODULE_IDX, MAP_ID = -1)
#DIM  ROOM_IDX
#DIM  MODULE_IDX
#DIM  MAP_ID
#DIMS DYNAMIC _LIST_LOCKED_MODULE

SIF MAP_ID == -1
    MAP_ID = HO_有効マップID
VARSET RESULTS
CALL HO_GET_MAPDATA(MAP_ID, ROOM_IDX, "LOCKED_MODULE")
_LIST_LOCKED_MODULE = %RESULTS%
IF LIST_INDEXOF(_LIST_LOCKED_MODULE, TOSTR(MODULE_IDX)) != -1
    RETURN 1
ELSE
    RETURN 0
ENDIF

;-------------------------------------------------
;;MPLYからMTARは視認可能か？
; MPLY_ID 主体のCHARA_ID
; MTAR_ID ターゲットのCHARA_ID
; RETURN 1 = 視認可,RETURN = 0 視認不可
;-------------------------------------------------
@HO_IS_TARGET_VISIBLE(MPLY_ID, MTAR_ID)
#DIM MTAR_ID
#DIM MPLY_ID
#DIM DYNAMIC MTAR_IDX
#DIM DYNAMIC MPLY_IDX
#DIM DYNAMIC MTAR_ROOM_IDX
#DIM DYNAMIC MPLY_ROOM_IDX
#DIM DYNAMIC MTAR_MODULE_IDX
#DIM DYNAMIC MPLY_MODULE_IDX
#DIM DYNAMIC MTAR_MODULE_ID
#DIM DYNAMIC MPLY_MODULE_ID

;ハウジングモード外から呼び出されたなら、見えてる扱いにする
IF !FLAG:ハウジングモード
    RETURN 1
ENDIF

;MPLYの設定
IF MPLY_ID == MASTER
    MPLY_ROOM_IDX = HO_MASTER現在地
    CALL HO_GET_MASTER_DATA("MODULE_USAGE")
    MPLY_MODULE_IDX = RESULT
ELSE
    CALL HO_GET_CHARAIDX(MPLY_ID)
    MPLY_IDX = RESULT
    CALL HO_GET_CHARADATA(MPLY_IDX, "ROOM_IDX")
    MPLY_ROOM_IDX = RESULT
    CALL HO_GET_CHARADATA(MPLY_IDX, "MODULE_USAGE")
    MPLY_MODULE_IDX = RESULT
ENDIF

;MTARの設定
IF MTAR_ID == MASTER
    MTAR_ROOM_IDX = HO_MASTER現在地
    CALL HO_GET_MASTER_DATA("MODULE_USAGE")
    MTAR_MODULE_IDX = RESULT
ELSE
    CALL HO_GET_CHARAIDX(MTAR_ID)
    MTAR_IDX = RESULT
    CALL HO_GET_CHARADATA(MTAR_IDX, "ROOM_IDX")
    MTAR_ROOM_IDX = RESULT
    CALL HO_GET_CHARADATA(MTAR_IDX, "MODULE_USAGE")
    MTAR_MODULE_IDX = RESULT
ENDIF
;MTARとMPLYが同じ部屋にいない
SIF MPLY_ROOM_IDX != MTAR_ROOM_IDX
    RETURN 0
;MASTERがMTARを覗いている
IF TFLAG:覗き見モード
    IF TCVAR:MTAR_ID:覗き見対象
        RETURN 1
    ENDIF
ENDIF
;MTARとMPLYがどちらもモジュールを使用しておらず、同じ部屋にいる
SIF MTAR_MODULE_IDX == -1 && MPLY_MODULE_IDX == -1 && MPLY_ROOM_IDX == MTAR_ROOM_IDX
    RETURN 1
RESULT = 0
SIF MTAR_MODULE_IDX != -1
    CALL HO_CHECK_MODULE_ELEMENT(MTAR_ROOM_IDX, MTAR_MODULE_IDX, "遮蔽")
;MTARがモジュールを使用しており、かつ遮蔽されている
IF RESULT == 1
    ;;MTARが遮蔽されている
    ;MPLY,MTARが同じルームのモジュールを使っているなら見えていると判断
    IF MPLY_ROOM_IDX == MTAR_ROOM_IDX && MPLY_MODULE_IDX == MTAR_MODULE_IDX
        RETURN 1
    ELSE
        RETURN 0
    ENDIF
    ;MTARが遮蔽されていない
ELSE
    ;MPLYがモジュールを使っておらず同じ部屋にいるならば見えていると判断
    SIF MPLY_MODULE_IDX == -1 && MPLY_ROOM_IDX == MTAR_ROOM_IDX
        RETURN 1
    ;MPLYが遮蔽されているなら見えていないと判断
    CALL HO_CHECK_MODULE_ELEMENT(MPLY_ROOM_IDX, MPLY_MODULE_IDX, "遮蔽")
    IF RESULT == 1
        RETURN 0
    ELSE
        ;MTAR,MPLYともに遮蔽されていない
        RETURN 1
    ENDIF
ENDIF

RETURN 0

;-------------------------------------------------
;;モジュールのオーナーを調べる
; 現状ではクルーの私室が誰のものかを判別する以外の用途がない
; 個別のモジュールに持ち主を指定する場合、拡張する必要がでてくるかも
; RETURN CHARA_ID(OWNER指定なし = -1)
;-------------------------------------------------
@HO_CHECK_MODULE_OWNER(ROOM_IDX, MODULE_IDX, MAP_ID = -1)
#DIM ROOM_IDX
#DIM MODULE_IDX
#DIM MAP_ID
#DIM DYNAMIC MODULE_ID
#DIM DYNAMIC CHARA_IDX

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

CALL HO_GET_MODULE_ID2(ROOM_IDX, MODULE_IDX, MAP_ID)
MODULE_ID = RESULT
IF MODULE_ID == HO_CREW_PRIVATE_ROOM_ID
    CHARA_IDX = MODULE_IDX
    CALL HO_GET_CHARADATA(CHARA_IDX, "CHARA_ID")
    RETURN RESULT
ENDIF

RETURN -1

;-------------------------------------------------
;プレイヤーのモジュール使用に関する処理
;-------------------------------------------------
;;使用
@HO_MASTER_USE_MODULE(ROOM_IDX, MODULE_IDX)
#DIM ROOM_IDX
#DIM MODULE_IDX
#DIM DYNAMIC MODULE_LIST_IDX
#DIM DYNAMIC MODULE_ID
#DIM DYNAMIC MODULE_CAPACITY
#DIM DYNAMIC CHARA_ID
#DIM DYNAMIC NUM_COMPANION
#DIMS DYNAMIC MODULE_NAME
#DIMS DYNAMIC _LIST_COMPANION
#DIMS DYNAMIC _LIST_ADD_MEMBER
#DIMS DYNAMIC _LIST_PERMISSION
#DIMS DYNAMIC _LIST_USAGE
#DIM DYNAMIC HAS_PERMISSION
#DIM DYNAMIC ADD_MEMBER_NUM
#DIMS DYNAMIC ACTION
#DIM DYNAMIC SEDUCTION_LV
#DIM DYNAMIC CUT_DESCRIPTION

CALL HO_GET_MODULE_ID2(ROOM_IDX, MODULE_IDX)
MODULE_ID = RESULT
CALL HO_GET_FOLLOWER_LIST
NUM_COMPANION = RESULT
_LIST_COMPANION = %RESULTS%
CALL HO_GET_MODULE_DATA(MODULE_ID, "MODULE_NAME")
MODULE_NAME = %RESULTS%
CALL HO_GET_MODULE_DATA(MODULE_ID, "用途")
_LIST_USAGE = %RESULTS%

;インテリアなら使用時効果処理が定義されていれば呼び出す
;インテリアは基本的にキャパシティ0で継続使用できないので効果処理後RETURN
IF LIST_INDEXOF(_LIST_USAGE, "インテリア") != -1
    TRYCCALLFORM HO_MODULE_USE_INTERIOR_{MODULE_ID}
    CATCH
    ENDCATCH
    RETURN
ENDIF

;既にこのモジュールを使っている
CALL HO_GET_MASTER_DATA("MODULE_USAGE")
IF RESULT == MODULE_IDX
    CALL HO_MASTER_STOP_USE_MODULE(ROOM_IDX, MODULE_IDX)
    RETURN
ENDIF

;覗き見判定
;RESULT補足
;1 は情事を覗き見
;2 は情事が起きているが覗き見しない
;いずれも設備は使用しないのでRETURN
IF !FLAG:ウフフフラグ
    CALL HO_CHECK_PEEPING(ROOM_IDX, MODULE_IDX)
    IF RESULT
        RETURN
    ENDIF
ENDIF

;モジュールに空きはあるか
CALL HO_CHECK_MODULE_CAPACITY(ROOM_IDX, MODULE_IDX)
MODULE_CAPACITY = RESULT
IF MODULE_CAPACITY == 0
    CALL COLOR_PRINTW("ここは満員のようだ", カラー_注意)
    CLEARLINE 1
    RETURN
ENDIF

IF MODULE_CAPACITY < NUM_COMPANION + 1
    CALL COLOR_PRINTW(@"この場所を使うには同行者の数が多すぎるようだ(空席:{MODULE_CAPACITY})", カラー_注意)
    CLEARLINE 1
    RETURN
ENDIF

;所有権判定
HAS_PERMISSION = 0
CALL HO_GET_MODULE_LIST_IDX(ROOM_IDX, MODULE_IDX)
MODULE_LIST_IDX = RESULT
CALL HO_GET_MODULE_LIST(MODULE_LIST_IDX, "PERMISSION_LIST")
IF RESULT != -1
    _LIST_PERMISSION = %RESULTS%
    ;MASTERに権限がない
    IF LIST_INDEXOF(_LIST_PERMISSION, TOSTR(MASTER)) == -1
        ;権限を持つメンバーが同行しているか？
        CALL HO_GET_COMPANION_LIST
        _LIST_COMPANION = %RESULTS%
        FOR LOCAL, 0, LIST_COUNT(_LIST_COMPANION)
            IF LIST_INDEXOF(_LIST_PERMISSION, LIST_GET(_LIST_COMPANION, LOCAL)) != -1
                HAS_PERMISSION ++
            ENDIF
        NEXT
        ; IF !HAS_PERMISSION
        ;     CALL COLOR_PRINTW("この場所を使うには所有者と一緒にいるか、所有者の許可がいる", カラー_注意)
        ;     CLEARLINE 1
        ;     RETURN
        ; ENDIF
    ELSE
        HAS_PERMISSION ++
    ENDIF
ENDIF

;モジュールの施錠確認
CALL HO_IS_MODULE_LOCKED(ROOM_IDX, MODULE_IDX)
IF RESULT == 1
    IF !HAS_PERMISSION
        CALL FL_PLAYSE("Door_close_0.mp3")
        CALL COLOR_PRINTW("ここは鍵が掛かっているようだ", カラー_注意)
        CALL HOUSING_UNLOCK_DOOR(ROOM_IDX, MODULE_IDX, 500)
        SIF RESULT != 1
            RETURN
    ELSE
        CALL FL_PLAYSE("Door_open_0.mp3")
        CALL COLOR_PRINTL("ここは鍵が掛かっているようだ", カラー_注意)
        CALL COLOR_PRINTW(@"%ANAME(MASTER)%は鍵を使って錠を外した…", カラー_注意)
    ENDIF
ENDIF

;モジュールの用途別の利用可能判定
IF LIST_GMATCH(_LIST_USAGE, "OR", "売春", "触手")
    FOR LOCAL, 0, LIST_COUNT(_LIST_COMPANION)
        CHARA_ID = TOINT(LIST_GET(_LIST_COMPANION, LOCAL))
        CALL SKILL_GET_LEVEL(CHARA_ID, スキル_大分類_性技, "SEDUCTION")
        SEDUCTION_LV = RESULT
        {
            IF CFLAG:CHARA_ID:捕虜先
                || IS_SLAVE(CHARA_ID)
                || IS_NASTY(CHARA_ID, 素質_淫乱_精液便女)
                || IS_NASTY(CHARA_ID, 素質_淫乱_娼婦)
                || CFLAG:CHARA_ID:スケベモブ
                || (TALENT:CHARA_ID:合意 && SEDUCTION_LV >= 2)
        }
        ELSE
            CALL COLOR_PRINTW(@"%ANAME(CHARA_ID)%はここに一緒に入るのを嫌がっているようだ", カラー_注意)
            CLEARLINE 1
            RETURN
        ENDIF
    NEXT
ELSE
    IF LIST_GMATCH(_LIST_USAGE, "OR", "入浴", "排泄") || (MODULE_NAME == "サウナルーム")
        FOR LOCAL, 0, LIST_COUNT(_LIST_COMPANION)
            CHARA_ID = TOINT(LIST_GET(_LIST_COMPANION, LOCAL))
            IF (TALENT:CHARA_ID:合意 != 1 || TALENT:CHARA_ID:親友) && !CFLAG:CHARA_ID:捕虜先 && !CFLAG:CHARA_ID:スケベモブ
                CALL COLOR_PRINTW(@"%ANAME(CHARA_ID)%はここに一緒に入るのを嫌がっているようだ", カラー_注意)
                CLEARLINE 1
                RETURN
            ENDIF
        NEXT
    ENDIF
ENDIF
;;モジュールが使用可能な場合
;-------------------------------------------------
;コマンド継続状況を解除
FOR CHARA_ID, 0, CHARANUM
    IF IS_PARTICIPATE_TRAIN(CHARA_ID)
        ;EQUIP解除
        CALL RELEASE_ALL_EQUIP(CHARA_ID, 1)
    ENDIF
NEXT

;既に別のモジュールを使用中だった場合は使用を中止
CALL HO_GET_MASTER_DATA("MODULE_USAGE")
IF RESULT != -1
    CALL HO_MASTER_STOP_USE_MODULE()
ENDIF

;相席者を交流対象に加える
CALL HO_GET_MODULE_USE_MEMBER(ROOM_IDX, MODULE_IDX)
_LIST_ADD_MEMBER = %RESULTS%
ADD_MEMBER_NUM = RESULT
FOR LOCAL, 0, ADD_MEMBER_NUM
    CHARA_ID = TOINT(LIST_GET(_LIST_ADD_MEMBER, LOCAL))

    ;交流対象追加前処理
    ;-------------------------------------------------

    ;ラッキースケベ
    CALL HO_GET_CHARAACT(CHARA_ID)
    ACTION = %RESULTS%
    SELECTCASE ACTION
        CASE "自慰中"
            IF RAND:2
                CALLF TAG_PRINT(@"%ANAME(MASTER)%の目に一心不乱に痴態に耽る%ANAME(CHARA_ID)%の姿が飛び込んできた…", 1)
                WAIT
            ELSE
                IF !HAS_PENIS(CHARA_ID)
                    CALLF TAG_PRINT(@"%ANAME(MASTER)%は%ANAME(CHARA_ID)%が物陰で下腹部を弄って快楽に耽っているのを目撃してしまった…", 1)
                    WAIT
                ELSE
                    CALLF TAG_PRINT(@"%ANAME(MASTER)%は%ANAME(CHARA_ID)%が物陰で陰茎を扱き上げて快楽に耽っているのを目撃してしまった…", 1)
                    WAIT
                ENDIF
            ENDIF
        CASEELSE
            CALL HO_CHECK_NAKED(CHARA_ID)
            SELECTCASE RESULT
                CASE 1
                    CALLF TAG_PRINT(@"%ANAME(MASTER)%の目に%ANAME(CHARA_ID)%の@C:{カラー_ピンク}@%STR_BODY("胸：長", CHARA_ID)%@/C@が飛び込んできた…", 1)
                    WAIT
                CASE 2
                    CALLF TAG_PRINT(@"%ANAME(MASTER)%の目に%ANAME(CHARA_ID)%の@C:{カラー_ピンク}@一糸まとわぬ%SPLIT_RAND("下腹部/陰部/秘所")%@/C@が飛び込んできた…", 1)
                    WAIT
                CASE 3
                    CALLF TAG_PRINT(@"%ANAME(MASTER)%の目に%ANAME(CHARA_ID)%の@C:{カラー_ピンク}@一糸まとわぬ%STR_BODY("身体", CHARA_ID)%@/C@が飛び込んできた…", 1)
                    WAIT
            ENDSELECT
    ENDSELECT

    ;交流対象追加
    ;-------------------------------------------------
    IF LOCAL == 0
        IF CUT_DESCRIPTION
            CALL COLOR_PRINTW(@"%ANAME(CHARA_ID, ADD_MEMBER_NUM)%と一緒になった", カラー_黄緑)
        ENDIF
    ENDIF
    SIF !TCVAR:CHARA_ID:交流顔合わせ済
        TCVAR:CHARA_ID:交流顔合わせ済 = 1
    TCVAR:CHARA_ID:相席フラグ = 1
    CALL HO_ADD_COMPANION(CHARA_ID, 1)

NEXT

;同行者にも使用させる
CALL HO_GET_COMPANION_LIST()
NUM_COMPANION = RESULT
_LIST_COMPANION = %RESULTS%
FOR LOCAL:0, 0, NUM_COMPANION
    CALL HO_USE_MODULE(TOINT(LIST_GET(_LIST_COMPANION, LOCAL:0)), ROOM_IDX, MODULE_IDX)
NEXT

;自動施錠指定のモジュールは使用時に施錠
CALL HO_CHECK_MODULE_ELEMENT(ROOM_IDX, MODULE_IDX, "自動施錠")
IF RESULT
    CALL HO_LOCK_ROOM_MODULE(MASTER, ROOM_IDX, MODULE_IDX)
ENDIF

;MASTERのモジュール使用状態を更新する
CALL HO_CHECK_MODULE_OWNER(ROOM_IDX, MODULE_IDX)
CALL HO_SET_MASTER_DATA("MODULE_USAGE", TOSTR(MODULE_IDX))
;広域変数にMASTERが使用中のモジュールの情報を更新する。
CALL HO_GET_MODULE_LIST_IDX(ROOM_IDX, MODULE_IDX)
HO_MASTER_USE_MODULE_LIST_IDX = RESULT
;MASTERのC_COND更新
CALL C_COND_SET_INFO_TO_MAP(MASTER, "USE_MODULE")

;モジュール使用時の押し倒し判定
IF NUM_COMPANION == 1
    CHARA_ID = TOINT(LIST_GET(_LIST_COMPANION, 0))
    CALL HO_CHARAACT_CHECK_NPC_PUSHDOWN_MASTER(CHARA_ID)
ENDIF

;;モジュールの使用を止める
@HO_MASTER_STOP_USE_MODULE(ROOM_IDX = -1, MODULE_IDX = -1)
#DIM ROOM_IDX
#DIM MODULE_IDX
#DIM DYNAMIC CHARA_ID
#DIM DYNAMIC MODULE_ID
#DIM DYNAMIC NUM_COMPANION
#DIMS DYNAMIC _LIST_COMPANION
#DIMS DYNAMIC _LIST_REMOVE_MEMBER
#DIM DYNAMIC REMOVE_MEMBER_NUM
#DIM DYNAMIC MESSAGE_PRINTED_FLAG

SIF ROOM_IDX == -1
    ROOM_IDX = HO_MASTER現在地
IF MODULE_IDX == -1
    CALL HO_GET_MASTER_DATA("MODULE_USAGE")
    MODULE_IDX = RESULT
ENDIF

;コマンド継続状況を解除
FOR CHARA_ID, 0, CHARANUM
    IF IS_PARTICIPATE_TRAIN(CHARA_ID)
        ;EQUIP解除
        CALL RELEASE_ALL_EQUIP(CHARA_ID, 1)
    ENDIF
NEXT

;相席者を交流対象から除外する
CALL HO_GET_MODULE_USE_MEMBER(ROOM_IDX, MODULE_IDX)
_LIST_REMOVE_MEMBER = %RESULTS%
REMOVE_MEMBER_NUM = RESULT
FOR LOCAL, 0, REMOVE_MEMBER_NUM
    CHARA_ID = TOINT(LIST_GET(_LIST_REMOVE_MEMBER, LOCAL))
    IF TCVAR:CHARA_ID:相席フラグ == 1
        CALL COLOR_PRINTL(@"%ANAME(CHARA_ID)%と別れた", カラー_黄緑)
        CALL HO_REMOVE_COMPANION(CHARA_ID)
        TCVAR:CHARA_ID:相席フラグ = 0
        MESSAGE_PRINTED_FLAG = 1
    ENDIF
NEXT
SIF MESSAGE_PRINTED_FLAG
    WAIT
;コンパニオンリストを更新
IF MODULE_IDX != -1
    ;施錠している場合は解錠
    CALL HO_IS_MODULE_LOCKED(ROOM_IDX, MODULE_IDX)
    SIF RESULT && REMOVE_MEMBER_NUM == 0
        CALL HO_LOCK_ROOM_MODULE(MASTER, ROOM_IDX, MODULE_IDX, 0)
    ; ;MODULE_IDに設定されている使用中止メッセージを出力 -> いらない気がする
    ; CALL HO_GET_MODULE_ID2(HO_MASTER現在地, MODULE_IDX)
    ; MODULE_ID = RESULT
    ; CALL HO_CHECK_MODULE_OWNER(ROOM_IDX, MODULE_IDX)
    ; IF RESULT == -1
    ;     TRYCALLFORM HO_MODULE_USE_MESSAGE_{MODULE_ID}(MASTER, 1)
    ; ELSE
    ;     TRYCALLFORM HO_MODULE_USE_MESSAGE_{MODULE_ID}(MASTER, 1, RESULT)
    ; ENDIF
    ; CALL HO_PRINT_LOG(RESULTS)
ENDIF
CALL HO_GET_COMPANION_LIST
NUM_COMPANION = RESULT
_LIST_COMPANION = %RESULTS%

;MASTERのモジュール使用状態を未使用に
CALL HO_SET_MASTER_DATA("MODULE_USAGE", "-1")
;広域変数のMASTERが使用中のモジュールの情報を初期化
HO_MASTER_USE_MODULE_LIST_IDX = -1

;同行者の使用状態も解除
FOR LOCAL:0, 0, NUM_COMPANION
    CALL HO_STOP_USE_MODULE(TOINT(LIST_GET(_LIST_COMPANION, LOCAL:0)))
NEXT

;特定のエリアエフェクトの解除判定
CALL HO_ROOM_EFFECT_REMOVE_CHECK(HO_MASTER現在地)

;行動不能状態になったマスターを強制的に移動させる
@HO_FORCE_MASTER_REST
#DIM DYNAMIC NUM_COMPANION
#DIMS DYNAMIC _LIST_COMPANION
#DIM DYNAMIC OPTION_NUM
#DIMS DYNAMIC _LIST_OPTIONS

;全エリアの施錠フラグをクリア
FOR LOCAL:0, 0, HO_MAX_ROOMNUM
    CALL HO_SET_MAPDATA(LOCAL:0, "IS_LOCKED", "0")
NEXT

CALL HO_MASTER_STOP_USE_MODULE

;お持ち帰りイベント発生なら以降の処理を中断
CALL HO_TAKE_AWAY_EVENT()
SIF RESULT
    RETURN

CALL HO_GET_COMPANION_LIST
NUM_COMPANION = RESULT
_LIST_COMPANION = %RESULTS%

FOR LOCAL:0, 0, NUM_COMPANION
    CALL HO_REMOVE_COMPANION(TOINT(LIST_GET(_LIST_COMPANION, LOCAL:0)))
NEXT

CALL HO_FIND_ROOM_BY_TAG("プレイヤー私室")
CALL HO_MOVE_MASTER(RESULT, 1)
CALL HO_GET_USABLE_MODULE("仮眠", HO_MASTER現在地)
OPTION_NUM = RESULT
_LIST_OPTIONS = %RESULTS%
IF TCVAR:MASTER:離脱フラグ == 離脱フラグ_睡眠
    CALL HO_MASTER_USE_MODULE(HO_MASTER現在地, TOINT(LIST_GET(_LIST_OPTIONS, RAND(0, OPTION_NUM))))
    CALL COLOR_PRINTW(@"すっかり酔い潰れてしまった%ANAME(MASTER)%はいつの間にか私室で横になっていた…", カラー_注意)
    TCVAR:MASTER:離脱フラグ = 0
    IF IS_DRUNK(MASTER) > 2
        PALAM:MASTER:酔い = 6000
    ENDIF
    BASE:(MASTER):体力 = LIMIT(BASE:(MASTER):体力 + 600, BASE:(MASTER):体力, MAXBASE:(MASTER):体力)
    BASE:(MASTER):気力 = LIMIT(BASE:(MASTER):気力 + 450, BASE:(MASTER):気力, MAXBASE:(MASTER):気力)
ELSE
    IF OPTION_NUM != 0
        CALL HO_MASTER_USE_MODULE(HO_MASTER現在地, TOINT(LIST_GET(_LIST_OPTIONS, RAND(0, OPTION_NUM))))
        CALL COLOR_PRINTW(@"疲れ切った%ANAME(MASTER)%は私室で横になり仮眠をとることにした", カラー_注意)
        TCVAR:MASTER:行動不能フラグ = 0
        TCVAR:MASTER:失神フラグ = 0
        BASE:(MASTER):体力 = LIMIT(BASE:(MASTER):体力 + 1200, BASE:(MASTER):体力, MAXBASE:(MASTER):体力)
        BASE:(MASTER):気力 = LIMIT(BASE:(MASTER):気力 + 900, BASE:(MASTER):気力, MAXBASE:(MASTER):気力)
    ELSE
        CALL COLOR_PRINTW(@"疲れ切った%ANAME(MASTER)%は私室に戻り休憩することにした。……が、部屋に寝具が無いためあまりきちんと休めなかった", カラー_注意)
        TCVAR:MASTER:行動不能フラグ = 0
        TCVAR:MASTER:失神フラグ = 0
        BASE:(MASTER):体力 = LIMIT(BASE:(MASTER):体力 + 600, BASE:(MASTER):体力, MAXBASE:(MASTER):体力)
        BASE:(MASTER):気力 = LIMIT(BASE:(MASTER):気力 + 450, BASE:(MASTER):気力, MAXBASE:(MASTER):気力)
    ENDIF
ENDIF
;3時間経過させる
CALL HOUSING_TIME_PROGRESS(180 / HO_単位時間, 1)

;-------------------------------------------------
; 条件を満たすメンバーをマスターが使用しているモジュールに招待する
;-------------------------------------------------
@HO_MASTER_TRY_INVITE(CHARA_ID, FORCE_INVITE = 0)
#DIM  CHARA_ID
#DIM  FORCE_INVITE
#DIM  DYNAMIC ROOM_IDX
#DIM  DYNAMIC MODULE_IDX
#DIM  DYNAMIC MODULE_ID
#DIMS DYNAMIC MODULE_NAME
#DIMS DYNAMIC _LIST_USAGE
#DIM DYNAMIC SEDUCTION_LV

ROOM_IDX = HO_MASTER現在地
CALL HO_GET_MASTER_DATA("MODULE_USAGE")
MODULE_IDX = RESULT
SIF MODULE_IDX == -1
    RETURN 0
CALL HO_GET_MODULE_ID2(ROOM_IDX, MODULE_IDX)
MODULE_ID = RESULT
CALL HO_GET_MODULE_DATA(MODULE_ID, "MODULE_NAME")
MODULE_NAME = %RESULTS%
CALL HO_GET_MODULE_DATA(MODULE_ID, "用途")
_LIST_USAGE = %RESULTS%

;モジュールに空きがあるかチェック
CALL HO_CHECK_MODULE_CAPACITY(ROOM_IDX, MODULE_IDX)
IF RESULT == 0 && !FORCE_INVITE
    CALL COLOR_PRINTW(@"%ANAME(CHARA_ID)%を同じ席に誘おうとしたが、席に空きがない", カラー_注意)
    RETURN 0
ELSEIF RESULT == 0 && FORCE_INVITE
    PRINTFORMW エラー：キャパシティに空きのない設備に対してFORCE_INVITEが実行されました
    RETURN 0
ENDIF

IF !FORCE_INVITE
    ;キャラが招待可能な行動状態かチェック。とりあえず待機ならOK
    CALL HO_GET_CHARAACT(CHARA_ID)
    IF !GROUPMATCH(RESULTS, "待機", "休憩中", "拘束中")
        CALL COLOR_PRINTW(@"%ANAME(CHARA_ID)%を同じ席に誘おうとしたが、取込中のようだ", カラー_注意)
        RETURN 0
    ENDIF

    ;モジュールの用途別の利用可能判定
    IF LIST_GMATCH(_LIST_USAGE, "OR", "売春", "触手")
        CALL SKILL_GET_LEVEL(CHARA_ID, スキル_大分類_性技, "SEDUCTION")
        SEDUCTION_LV = RESULT
        {
            IF CFLAG:CHARA_ID:捕虜先
                || IS_SLAVE(CHARA_ID)
                || IS_NASTY(CHARA_ID, 素質_淫乱_精液便女)
                || IS_NASTY(CHARA_ID, 素質_淫乱_娼婦)
                || CFLAG:CHARA_ID:スケベモブ
                || (TALENT:CHARA_ID:合意 && SEDUCTION_LV >= 2)
        }
        ELSE
            CALL COLOR_PRINTW(@"%ANAME(CHARA_ID)%はここに一緒に入るのを嫌がっているようだ", カラー_注意)
            RETURN 0
        ENDIF
    ELSE
        IF LIST_GMATCH(_LIST_USAGE, "OR", "入浴", "排泄") || (MODULE_NAME == "サウナルーム")
            IF TALENT:CHARA_ID:合意 != 1 && !CFLAG:CHARA_ID:捕虜先 && !CFLAG:CHARA_ID:スケベモブ
                CALL COLOR_PRINTW(@"%ANAME(CHARA_ID)%はここに一緒に入るのを嫌がっているようだ", カラー_注意)
                RETURN 0
            ENDIF
        ENDIF
    ENDIF
ENDIF

;CHARA_IDをコンパニオンに加える
CALL HO_ADD_COMPANION(CHARA_ID,,FORCE_INVITE)
;コンパニオン追加条件を満たしていなかった
SIF RESULT == 0
    RETURN 1
;MASTERと同じモジュールを使わせる
CALL HO_USE_MODULE(CHARA_ID, ROOM_IDX, MODULE_IDX)
RETURN 1

;-------------------------------------------------
;;; キャラのステータスを取得・変更する関数
;;; - ARGS
;;;   - CHARA_ID: キャラID
;;;   - OPTIONS: オプション文字列
;;;     - "" : 各部位精液量をそのまま返却
;;;     - "体外のみ": 身体の外側の精液のみをカウント
;;;     - "体内のみ": 身体の内側の精液のみをカウント
;;; - RETURN
;;;   精液量
;-------------------------------------------------
@HO_CHECK_CUM_AMOUNT(CHARA_ID, OPTIONS = "")
#DIM  CHARA_ID
#DIMS OPTIONS
#DIM  DYNAMIC CUM_AMOUNT
#FUNCTION
FOR LOCAL,0, CUM_SLOT_NUM
    SIF OPTIONS == "体内のみ" && !GROUPMATCH(LOCAL:0, 射精部位_アナル, 射精部位_膣内, 射精部位_尿道, 射精部位_オナホ, 射精部位_触手, 射精部位_ゴム, 射精部位_口)
        CONTINUE
    SIF OPTIONS == "体外のみ" && GROUPMATCH(LOCAL:0, 射精部位_アナル, 射精部位_膣内, 射精部位_尿道, 射精部位_オナホ, 射精部位_触手, 射精部位_ゴム, 射精部位_口)
        CONTINUE
    CUM_AMOUNT += CUM_GET_AMOUNT:CHARA_ID:(LOCAL:0)
NEXT
RETURNF CUM_AMOUNT

;-------------------------------------------------
;;; 汚れを洗浄する処理。入浴などから呼ばれる
;;; 体内とみなす部位はデフォルトで値をクリアしない
;-------------------------------------------------
@HO_WASH(CHARA_ID, 体内を除外 = 1)
#DIM CHARA_ID
#DIM 体内を除外
#DIM DYNAMIC CUM_AMOUNT
#DIM DYNAMIC MODULE_ID

FOR LOCAL,0, CUM_SLOT_NUM
    IF 体内を除外 && GROUPMATCH(LOCAL:0, 射精部位_アナル, 射精部位_膣内, 射精部位_尿道, 射精部位_オナホ, 射精部位_触手, 射精部位_ゴム, 射精部位_口)
        CONTINUE
    ENDIF
    IF C_COND("設備用途:精液風呂",, CHARA_ID)
        CUM_GET_AMOUNT:CHARA_ID:(LOCAL:0) += RAND(8, 15)
    ELSE
        CUM_GET_AMOUNT:CHARA_ID:(LOCAL:0) = 0
    ENDIF
NEXT
TCVAR:CHARA_ID:汗量 = 0

;-------------------------------------------------
;;; 特定のアクションをしているメンバーをリスト形式で返却
;;; ACTIONは','区切りで10個まで複数指定できる
;-------------------------------------------------
@HO_CHECK_PLAY_WITH(ACTION)
#DIMS ACTION
#DIMS DYNAMIC _LIST_MEMBER
#DIM DYNAMIC MEMBER_NUM
#DIMS DYNAMIC _LIST_PLAY_WITH
#DIM DYNAMIC CHARA_ID

VARS ACTIONS, 10
VARI ACTIONNUM
SPLIT ACTION, ",", ACTIONS
ACTIONNUM = RESULT

LOCAL:1 = 0
VARSET RESULTS
CALL HO_GET_COMPANION_LIST
SIF RESULT == 0
    RETURN 0
MEMBER_NUM = RESULT
_LIST_MEMBER = %RESULTS%
FOR LOCAL, 0, MEMBER_NUM
    CHARA_ID = TOINT(LIST_GET(_LIST_MEMBER, LOCAL))
    IF TCVAR:CHARA_ID:相席フラグ != 1
        LOCAL:1 ++
        _LIST_PLAY_WITH = %LIST_ADD(_LIST_PLAY_WITH, TOSTR(CHARA_ID))%
    ELSE
        CALL HO_GET_CHARAACT(CHARA_ID)
        VARI I
        FOR I, 0, ACTIONNUM
            IF RESULTS == ACTIONS:I
                LOCAL:1 ++
                _LIST_PLAY_WITH = %LIST_ADD(_LIST_PLAY_WITH, TOSTR(CHARA_ID))%
            ENDIF
        NEXT
    ENDIF
NEXT
RESULTS = %_LIST_PLAY_WITH%
RETURN LOCAL:1

;指定したエリアと同じエリアにいるキャラをリスト形式で取得
@HO_GET_MEMBER_IN_ROOM(ROOM_IDX, INCLUDE_MASTER = 1)
#DIM ROOM_IDX
#DIM INCLUDE_MASTER
#DIM  DYNAMIC IDX
#DIM  DYNAMIC CHARA_ID
#DIMS DYNAMIC _LIST_MEMBER

IF INCLUDE_MASTER
    IF HO_MASTER現在地 == ROOM_IDX
        _LIST_MEMBER = %LIST_ADD(_LIST_MEMBER, TOSTR(MASTER))%
    ENDIF
ENDIF

WHILE _DIC_HO_CHARALIST:IDX != "-1"
    CALL HO_GET_CHARADATA(IDX, "ROOM_IDX")
    IF RESULT == ROOM_IDX
        CALL HO_GET_CHARADATA(IDX, "CHARA_ID")
        CHARA_ID = RESULT
        _LIST_MEMBER = %LIST_ADD(_LIST_MEMBER, TOSTR(CHARA_ID))%
    ENDIF
    IDX ++
WEND

RESULTS = %_LIST_MEMBER%
RETURN LIST_COUNT(_LIST_MEMBER)

;指定したエリアと同じエリアいてかつ指定した行動をとっているキャラをリスト形式で取得
@HO_GET_MEMBER_IN_ROOM_BY_ACTION(ROOM_IDX, ACTION, INCLUDE_MASTER = 1)
#DIM  ROOM_IDX
#DIMS ACTION
#DIM  INCLUDE_MASTER
#DIM  DYNAMIC IDX
#DIM  DYNAMIC CHARA_ID
#DIMS DYNAMIC _LIST_ALL_MEMBER
#DIMS DYNAMIC _LIST_MEMBER

IF INCLUDE_MASTER
    IF HO_MASTER現在地 == ROOM_IDX
        _LIST_ALL_MEMBER = %LIST_ADD(_LIST_MEMBER, TOSTR(MASTER))%
    ENDIF
ENDIF

CALL HO_GET_MEMBER_IN_ROOM(ROOM_IDX, INCLUDE_MASTER)
_LIST_ALL_MEMBER += RESULTS
FOR LOCAL, 0, LIST_COUNT(_LIST_ALL_MEMBER)
    CHARA_ID = TOINT(LIST_GET(_LIST_ALL_MEMBER, LOCAL))
    CALL HO_GET_CHARAACT(CHARA_ID)
    IF ACTION == RESULTS
        _LIST_MEMBER = %LIST_ADD(_LIST_MEMBER, TOSTR(CHARA_ID))%
    ENDIF
NEXT
RESULTS = %_LIST_MEMBER%
RETURN LIST_COUNT(_LIST_MEMBER)


code:
;-------------------------------------------------
;キャラクターグループリスト
;-------------------------------------------------
@HO_SET_CHARA_GROUP_LIST(CHARA_GROUP_LIST_IDX, DATANAME, VALUES)
#DIM  CHARA_GROUP_LIST_IDX
#DIMS DATANAME
#DIMS VALUES
#DIM  MAP_ID

SIF MAP_ID == -1
    MAP_ID = HO_有効マップID
SIF _DIC_HO_CHARA_GROUP_LIST:CHARA_GROUP_LIST_IDX == "-1"
    _DIC_HO_CHARA_GROUP_LIST:CHARA_GROUP_LIST_IDX '= ""

_DIC_HO_CHARA_GROUP_LIST:CHARA_GROUP_LIST_IDX = %DIC_SET(_DIC_HO_CHARA_GROUP_LIST:CHARA_GROUP_LIST_IDX, DATANAME, VALUES)%
RETURN

@HO_GET_CHARA_GROUP_LIST(CHARA_GROUP_LIST_IDX, DATANAME)
#DIM MAP_ID
#DIM  CHARA_GROUP_LIST_IDX
#DIM ROOM_IDX
#DIMS DATANAME

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

VARSET RESULTS
SIF DIC_GET(_DIC_HO_CHARA_GROUP_LIST:CHARA_GROUP_LIST_IDX, DATANAME) == ""
    RETURN -1

ISNUMERIC DIC_GET(_DIC_HO_CHARA_GROUP_LIST:CHARA_GROUP_LIST_IDX, DATANAME)
IF RESULT
    RETURN TOINT(DIC_GET(_DIC_HO_CHARA_GROUP_LIST:CHARA_GROUP_LIST_IDX, DATANAME))
ELSE
    RESULTS = %DIC_GET(_DIC_HO_CHARA_GROUP_LIST:CHARA_GROUP_LIST_IDX, DATANAME)%
    RETURN
ENDIF

@HO_FORM_CHARA_GROUP(ACTION, MODULE_LIST_IDX, CHARA_ID)
#DIMS ACTION
#DIM MODULE_LIST_IDX
#DIM CHARA_ID
#DIM CHARA_IDX
#DIM DYNAMIC CHARA_GROUP_LIST_IDX
#DIMS DYNAMIC _LIST_CHARA_ID

CALL HO_GET_CHARAIDX(CHARA_ID)
CHARA_IDX = RESULT

FOR CHARA_GROUP_LIST_IDX, 0, HO_MAX_GROUPNUM
    IF _DIC_HO_CHARA_GROUP_LIST:CHARA_GROUP_LIST_IDX == ""
        CALL HO_SET_CHARA_GROUP_LIST(CHARA_GROUP_LIST_IDX, "ACTION", ACTION)
        CALL HO_SET_CHARA_GROUP_LIST(CHARA_GROUP_LIST_IDX, "MODULE_LIST_IDX", TOSTR(MODULE_LIST_IDX))
        CALL HO_SET_CHARA_GROUP_LIST(CHARA_GROUP_LIST_IDX, "CHARA_LIST", LIST_ADD(_LIST_CHARA_ID, TOSTR(CHARA_ID)))
        CALL HO_SET_CHARADATA(CHARA_IDX, "CHARA_GROUP", TOSTR(CHARA_GROUP_LIST_IDX))
        RETURN
    ENDIF
NEXT

@HO_JOIN_CHARA_GROUP(CHARA_GROUP_LIST_IDX, CHARA_ID)
#DIM CHARA_ID
#DIM CHARA_GROUP_LIST_IDX
#DIMS DYNAMIC _LIST_CHARA_ID
#DIM DYNAMIC CHARA_IDX

CALL HO_GET_CHARAIDX(CHARA_ID)
CHARA_IDX = RESULT

CALL HO_GET_CHARA_GROUP_LIST(CHARA_GROUP_LIST_IDX, "CHARA_LIST")
_LIST_CHARA_ID = %RESULTS%

;グループ参加時に関係性の値を加算
VARI TARGET_ID
VARI I
FOR I, 0, LIST_COUNT(_LIST_CHARA_ID)
    TARGET_ID = LIST_GETINT(_LIST_CHARA_ID, I)
    CALL REL_ADD(CHARA_ID, TARGET_ID, RAND(3, 5))
    CALL REL_ADD(TARGET_ID, CHARA_ID, RAND(3, 5))
NEXT

;同一CHARA_IDの重複登録を容認しない。ただし同一CHARA_IDはこの関数の前段で弾かれている想定
IF LIST_INDEXOF(_LIST_CHARA_ID, TOSTR(CHARA_ID)) != -1
    DEBUGPRINTFORM @HO_JOIN_CHARA_GROUP:CHARA_ID{CHARA_ID}をCHARA_GROUP_LIST:{CHARA_GROUP_LIST_IDX}に多重に登録しようとしました
    RETURN -1
ENDIF
CALL HO_SET_CHARA_GROUP_LIST(CHARA_GROUP_LIST_IDX, "CHARA_LIST", LIST_ADD(_LIST_CHARA_ID, TOSTR(CHARA_ID)))
CALL HO_SET_CHARADATA(CHARA_IDX, "CHARA_GROUP", TOSTR(CHARA_GROUP_LIST_IDX))

;グループ離脱
@HO_LEAVE_CHARA_GROUP(CHARA_GROUP_LIST_IDX, CHARA_ID)
#DIM CHARA_GROUP_LIST_IDX
#DIM CHARA_ID
#DIMS DYNAMIC _LIST_CHARA_ID
#DIM  DYNAMIC CHARA_IDX
#DIM  DYNAMIC LIST_IDX

CALL HO_GET_CHARAIDX(CHARA_ID)
CHARA_IDX = RESULT

CALL HO_GET_CHARA_GROUP_LIST(CHARA_GROUP_LIST_IDX, "CHARA_LIST")
_LIST_CHARA_ID = %RESULTS%

LIST_IDX = LIST_INDEXOF(_LIST_CHARA_ID, TOSTR(CHARA_ID))

IF LIST_IDX != -1
    _LIST_CHARA_ID = %LIST_REMOVEAT(_LIST_CHARA_ID, LIST_IDX)%
    ;自分が離脱してもグループに誰か残っている
    IF LIST_COUNT(_LIST_CHARA_ID) != 0
        CALL HO_SET_CHARA_GROUP_LIST(CHARA_GROUP_LIST_IDX, "CHARA_LIST", _LIST_CHARA_ID)
        ;一緒に行動するか判定
        ;CALL HO_TRY_ACT_TOGETHER(CHARA_ID, _LIST_CHARA_ID)
    ELSE
        CALL HO_DISMISS_CHARA_GROUP(CHARA_GROUP_LIST_IDX)
    ENDIF
    CALL HO_SET_CHARADATA(CHARA_IDX, "CHARA_GROUP", "-1")
ELSE
    RETURN -1
ENDIF

CALL HO_GET_CHARA_GROUP_LIST(CHARA_GROUP_LIST_IDX, "CHARA_LIST")
_LIST_CHARA_ID = %RESULTS%

;グループの解散
@HO_DISMISS_CHARA_GROUP(CHARA_GROUP_LIST_IDX)
#DIM CHARA_GROUP_LIST_IDX
_DIC_HO_CHARA_GROUP_LIST:CHARA_GROUP_LIST_IDX '= ""

;キャラが加入しているグループリストのIDXを確認
@HO_CHECK_CHARA_JOINED_GROUP(CHARA_ID)
#DIM CHARA_ID
#DIM  DYNAMIC CHARA_GROUP_LIST_IDX
#DIMS DYNAMIC _LIST_CHARA

FOR CHARA_GROUP_LIST_IDX, 0, HO_MAX_GROUPNUM
    CALL HO_GET_CHARA_GROUP_LIST(CHARA_GROUP_LIST_IDX, "CHARA_LIST")
    SIF RESULT == -1
        CONTINUE
    _LIST_CHARA = %RESULTS%
    IF LIST_INDEXOF(_LIST_CHARA, TOSTR(CHARA_ID)) != -1
        RETURN CHARA_GROUP_LIST_IDX
    ENDIF
NEXT

RETURN -1

;対象モジュールでグループが形成されているか確認。結果はリスト形式で返却
@HO_CHECK_GROUP_FORMED(MODULE_LIST_IDX)
#DIM MODULE_LIST_IDX
#DIM  DYNAMIC CHARA_GROUP_LIST_IDX
#DIMS DYNAMIC _LIST_GROUP

VARSET RESULTS
FOR CHARA_GROUP_LIST_IDX, 0, HO_MAX_GROUPNUM
    CALL HO_GET_CHARA_GROUP_LIST(CHARA_GROUP_LIST_IDX, "MODULE_LIST_IDX")
    SIF RESULT == -1
        CONTINUE
    IF MODULE_LIST_IDX == RESULT
        _LIST_GROUP = %LIST_ADD(_LIST_GROUP, TOSTR(CHARA_GROUP_LIST_IDX))%
    ENDIF
NEXT

IF LIST_COUNT(_LIST_GROUP) != 0
    RESULTS = %_LIST_GROUP%
    RETURN 1
ELSE
    RETURN -1
ENDIF

;-------------------------------------------------
;;;グループから離脱する際にグループ内の仲間に一緒に行動するか働きかける
;;;@ARGS
;;;- CHARA_ID {int} :実行するキャラID
;;;- LIST_CHARA_ID {string(list)} :対象とするキャラクターのIDリスト
;;;@RETURN
;;;- RESULT
;;;  - RESULT:0 {bool} :誰かを誘ったか
;-------------------------------------------------
@HO_TRY_ACT_TOGETHER(CHARA_ID, LIST_CHARA_ID)
;region
#DIM  CHARA_ID
#DIMS LIST_CHARA_ID
#DIM  DYNAMIC TARGET_ID
;設定されているスケジュール行動がフリーでありすでに誰かを勧誘済みでないこと
CALL HO_GET_TASK_SCH(CHARA_ID)
IF !GROUPMATCH(RESULTS, "自由", "休憩") || TCVAR:CHARA_ID:勧誘したキャラID != -1
    RETURN 0
ENDIF

FOR LOCAL, 0, LIST_COUNT(LIST_CHARA_ID)
    TARGET_ID = LIST_GETINT(LIST_CHARA_ID, LOCAL)
    CALL HO_GET_TASK_SCH(TARGET_ID)
    ;設定されているスケジュール行動がフリーでありすでに誰かに勧誘されていないこと
    IF !GROUPMATCH(RESULTS, "自由", "休憩") || TCVAR:CHARA_ID:勧誘されたキャラID != -1
        CONTINUE
    ENDIF

    TCVAR:CHARA_ID:勧誘したキャラID = TARGET_ID
    TCVAR:TARGET_ID:勧誘されたキャラID = CHARA_ID

    TCVAR:CHARA_ID:予約済行動 = ACT_休憩
    TCVAR:TARGET_ID:追随相手ID = CHARA_ID
    DEBUGPRINTFORML ;-------------------------------------------------
    DEBUGPRINTFORML %ANAME(CHARA_ID)%は%ANAME(TARGET_ID)%を勧誘した
    DEBUGPRINTFORML 予約済行動 = {TCVAR:CHARA_ID:予約済行動}
    DEBUGPRINTFORML ;-------------------------------------------------
    BREAK
NEXT
;#endregion
;ペア行動のリセット
@HO_RESET_PAIR_ACT(CHARA_ID)
#DIM CHARA_ID
#DIM DYNAMIC TARGET_ID

TARGET_ID = TCVAR:CHARA_ID:勧誘したキャラID

TCVAR:CHARA_ID:グループ活動フラグ = 0
TCVAR:CHARA_ID:勧誘したキャラID = -1
IF TARGET_ID == -1
    RETURN
ENDIF
TCVAR:TARGET_ID:勧誘されたキャラID = -1
TCVAR:TARGET_ID:追随相手ID = -1


code:
;-------------------------------------------------
;コンパニオンの制御
;-------------------------------------------------
;-------------------------------------------------
;同行者を追加する
; 相席だけの場合はSHARE_MODE = 1で追加する
; RESULT 失敗 = 0, 成功 = 1
;-------------------------------------------------
@HO_ADD_COMPANION(CHARA_ID, SHARE_MODE = 0, FORCE_ADD = 0)
#DIM CHARA_ID
#DIM SHARE_MODE
#DIM FORCE_ADD
#DIMS DYNAMIC _LIST_COMPANION

VARSET RESULTS

SIF CHARA_ID == MASTER
    RETURN 0
;同行可能かを判定。相席モードの場合判定バイパス
IF SHARE_MODE != 1 && !FORCE_ADD
    CALL HO_IS_ADDABLE_COMPANION(CHARA_ID)
    SIF RESULT == 0
        RETURN 0
ENDIF

;調教一時参加扱いならば同行者/相席判定前にフラグを消す
;参加者数は調教一時参加扱いにした際加算されているはずなので加算しない
IF TCVAR:CHARA_ID:調教一時参加扱い
    TCVAR:CHARA_ID:調教一時参加扱い = 0
    CFLAG:CHARA_ID:調教参加フラグ = 0
ELSE
    TFLAG:参加者数 ++
ENDIF

;相席状態から同行に遷移する場合
IF TCVAR:CHARA_ID:相席フラグ == 1 && CFLAG:CHARA_ID:調教参加フラグ == 1
    TCVAR:CHARA_ID:相席フラグ = 0
    CALL HO_SET_CHARAACT(CHARA_ID, "同行中")
    TCVAR:CHARA_ID:行動待機時間 = 0
    TCVAR:CHARA_ID:予約済行動 = 0
    HO_同行者数 ++
    ;対象キャラクターの行動描写文字列を更新
    CALL HO_CHARAACT_DESC_SETSTR(,CHARA_ID)
    RETURN 1
ENDIF

CFLAG:CHARA_ID:調教参加フラグ = 1
;MASTERが独立して行動している場合の考慮
IF MTAR:0 == MASTER && MPLY:0 == MASTER
    CALL DEL_MTAR(MASTER)
ENDIF
;相席モードの場合は行動は書き換えない
IF SHARE_MODE == 0
    CALL HO_SET_CHARAACT(CHARA_ID, "同行中")
    CALL HO_STOP_USE_MODULE(CHARA_ID)
    TCVAR:CHARA_ID:行動待機時間 = 0
    TCVAR:CHARA_ID:予約済行動 = 0
    HO_同行者数 ++
ENDIF

;リストの管理
CALL HO_GET_MASTER_DATA("COMPANION_LIST")
_LIST_COMPANION = %RESULTS%
IF LIST_INDEXOF(_LIST_COMPANION, TOSTR(CHARA_ID)) == -1
    _LIST_COMPANION = %LIST_ADD(_LIST_COMPANION, TOSTR(CHARA_ID))%
    CALL HO_SET_MASTER_DATA("COMPANION_LIST", _LIST_COMPANION)
ELSE
    THROW 同一キャラを多重に登録しようとしました CHARA_ID{CHARA_ID}
ENDIF

;対象キャラクターの行動描写文字列を更新
CALL HO_CHARAACT_DESC_SETSTR(,CHARA_ID)

RETURN 1

;-------------------------------------------------
;同行者を削除する
; SHARE_MODE = 1の場合は同行状態から相席状態に移行する
; RESULT 失敗 = 0, 成功 = 1, 対象が同行者でない = -1
;-------------------------------------------------
@HO_REMOVE_COMPANION(CHARA_ID, SHARE_MODE = 0)
#DIM CHARA_ID
#DIMS DYNAMIC _LIST_COMPANION
#DIM DYNAMIC LIST_INDEX
#DIM DYNAMIC SHARE_MODE

;リストの管理
CALL HO_GET_MASTER_DATA("COMPANION_LIST")
_LIST_COMPANION = %RESULTS%

LIST_INDEX = LIST_INDEXOF(_LIST_COMPANION, TOSTR(CHARA_ID))
;同行者リスト内にキャラIDが存在しない場合は何もしない
SIF LIST_INDEX == -1
    RETURN -1

; 同行状態の時
IF TCVAR:CHARA_ID:相席フラグ != 1
    HO_同行者数 --
    CALL HO_SET_CHARAACT(CHARA_ID, "待機")
    ;SHARE_MODE=1の場合は相席状態に移行して終了
    IF SHARE_MODE == 1
        TCVAR:CHARA_ID:相席フラグ = 1
        RETURN 1
    ENDIF
    ;同行状態のときのみ実行(相席状態の時にHO_STOP_USE_MODULE関数内でこの関数が呼ばれるため)
    CALL HO_STOP_USE_MODULE(CHARA_ID)
ELSEIF SHARE_MODE == 1
    RETURN -1
ENDIF

TFLAG:参加者数 --
TCVAR:CHARA_ID:相席フラグ = 0
CFLAG:CHARA_ID:調教参加フラグ = 0
TCVAR:CHARA_ID:同行解除フラグ = 1
SIF FLAG:主導権所有者 == CHARA_ID
    FLAG:主導権所有者 = -1
CALL DEL_MTAR(CHARA_ID)
CALL DEL_MPLY(CHARA_ID)
CALL RELEASE_ALL_EQUIP(CHARA_ID, 1)
IF MTAR_NUM == 0
    CALL RESET_ACTOR
ENDIF

;同行者データの更新
_LIST_COMPANION = %LIST_REMOVEAT(_LIST_COMPANION, LIST_INDEX)%
CALL HO_SET_MASTER_DATA("COMPANION_LIST", _LIST_COMPANION)

;対象キャラクターの行動描写文字列を更新
CALL HO_CHARAACT_DESC_SETSTR(,CHARA_ID)

;-------------------------------------------------
;同行者（相席含む）の情報を取得する
; RESULTS:0  同行者のリスト
; RETURN     同行者の数
;-------------------------------------------------
@HO_GET_COMPANION_LIST
#DIMS DYNAMIC _LIST_COMPANION

VARSET RESULTS
CALL HO_GET_MASTER_DATA("COMPANION_LIST")
_LIST_COMPANION = %RESULTS%

RESULTS = %_LIST_COMPANION%
RETURN LIST_COUNT(_LIST_COMPANION)

;-------------------------------------------------
;同行者（相席含まず）の情報を取得する
; RESULTS:0  同行者のリスト
; RETURN     同行者の数
;-------------------------------------------------
@HO_GET_FOLLOWER_LIST
#DIMS DYNAMIC _LIST_COMPANION
#DIMS DYNAMIC _LIST_FOLLOWER
#DIM DYNAMIC CHARA_ID

VARSET RESULTS
CALL HO_GET_MASTER_DATA("COMPANION_LIST")
_LIST_COMPANION = %RESULTS%
FOR LOCAL, 0, LIST_COUNT(_LIST_COMPANION)
    CHARA_ID = TOINT(LIST_GET(_LIST_COMPANION, LOCAL))
    SIF TCVAR:CHARA_ID:相席フラグ != 1
        _LIST_FOLLOWER = %LIST_ADD(_LIST_FOLLOWER, TOSTR(CHARA_ID))%
NEXT
RESULTS = %_LIST_FOLLOWER%
RETURN LIST_COUNT(_LIST_FOLLOWER)

;-------------------------------------------------
;同行可能かを判定する
; CHARA_ID :追加対象キャラID
; RETURN 失敗 = -0, 成功 = 1
;-------------------------------------------------
@HO_IS_ADDABLE_COMPANION(CHARA_ID)
#DIM CHARA_ID

CALL HO_GET_COMPANION_LIST
IF RESULT > HO_同行者上限
    CALL COLOR_PRINTW(@"同行者の数が多すぎるようだ(上限:{HO_同行者上限}人まで)", カラー_注意)
    RETURN 0
ENDIF

;MASTERから見えてないキャラは同行不可
CALL HO_IS_TARGET_VISIBLE(MASTER, CHARA_ID)
IF !RESULT
    CALL COLOR_PRINTW(@"ここからでは相手の様子がわからない……", カラー_注意)
    RETURN 0
ENDIF
IF !CFLAG:CHARA_ID:捕虜先
    ;;「COMF:390 二人で出掛ける」の判定処理をそのまま流用
    ;判定値初期化
    TCVAR:(CHARA_ID):24 = 0
    SETCOLOR カラー_注釈
    CALL COM_ORDER_TARGET390(CHARA_ID)
    ;実行値をマウント
    TCVAR:(CHARA_ID):25 = 25
    ;判定結果を表示
    PRINTFORML  = {TCVAR:(CHARA_ID):24} %TOSTR_COMPARE(TCVAR:(CHARA_ID):24, TCVAR:(CHARA_ID):25)% 実行値 {TCVAR:(CHARA_ID):25}
    RESETCOLOR
    IF TCVAR:(CHARA_ID):24 >= TCVAR:(CHARA_ID):25
        CALL KOJO_EVENT(CHARA_ID, 300)
        PRINTFORMW %ANAME(MASTER)%の誘いに%ANAME(CHARA_ID)%は応じ、同行に加わった
        PRINTL
        SIF !TCVAR:CHARA_ID:交流顔合わせ済
            TCVAR:CHARA_ID:交流顔合わせ済 = 1
        RETURN 1
    ELSE
        CALL KOJO_EVENT(CHARA_ID, 301)
        PRINTFORMW %ANAME(CHARA_ID)%を同行に誘ったものの、断られてしまった……
        PRINTL
        SIF !TCVAR:CHARA_ID:交流顔合わせ済
            TCVAR:CHARA_ID:交流顔合わせ済 = 1
        RETURN 0
    ENDIF
ELSE ;捕虜は無条件で連れ出し可能
    CALL KOJO_EVENT(CHARA_ID, 302)
    PRINTFORMW 虜囚の%ANAME(CHARA_ID)%を無理やり連れ出した……
    PRINTL
    SIF !TCVAR:CHARA_ID:交流顔合わせ済
        TCVAR:CHARA_ID:交流顔合わせ済 = 1
    RETURN 1
ENDIF

;-------------------------------------------------
; 同じモジュールを共有しているメンバーを取得する
;-------------------------------------------------
@HO_GET_MODULE_SHARE_MEMBER(CHARA_ID, INCLUDE_MASTER = 0)
#DIM CHARA_ID
#DIM INCLUDE_MASTER
#DIM DYNAMIC CHARA_IDX
#DIM DYNAMIC ROOM_IDX
#DIM DYNAMIC MODULE_IDX
#DIMS DYNAMIC _LIST_CHARA_ID

VARSET RESULTS
IF CHARA_ID != MASTER
    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, "MODULE_USAGE")
    MODULE_IDX = RESULT
ELSE
    CHARA_IDX = HO_MASTER現在地
    CALL HO_GET_MASTER_DATA("MODULE_USAGE")
    MODULE_IDX = RESULT
ENDIF
IF INCLUDE_MASTER == 1
    CALL HO_GET_MASTER_DATA("MODULE_USAGE")
    SIF ROOM_IDX == HO_MASTER現在地 && MODULE_IDX == RESULT
        _LIST_CHARA_ID = %LIST_ADD(_LIST_CHARA_ID, TOSTR(MASTER))%
ENDIF

LOCAL:0 = 0
WHILE _DIC_HO_CHARALIST:(LOCAL:0) != "-1"
    CALL HO_GET_CHARADATA(LOCAL:0, "ROOM_IDX")
    IF RESULT != ROOM_IDX
        LOCAL:0 ++
        CONTINUE
    ENDIF
    CALL HO_GET_CHARADATA(LOCAL:0, "MODULE_USAGE")
    IF MODULE_IDX == RESULT
        CALL HO_GET_CHARADATA(LOCAL:0, "CHARA_ID")
        _LIST_CHARA_ID = %LIST_ADD(_LIST_CHARA_ID, TOSTR(RESULT))%
    ENDIF
    LOCAL:0 ++
WEND
RESULTS = %_LIST_CHARA_ID%
RETURN LIST_COUNT(_LIST_CHARA_ID)

;-------------------------------------------------
;;;対象の設備を使用しているメンバーを取得する
;;;@ARGS
;;;- MODULE_LIST_IDX {int} :
;;;- INCLUDE_MASTER  {int} :主人公をメンバーとして含むか
;;;@RETURN
;;;- RESULT
;;;  - RESULT:0 {int} :設備を利用しているキャラの数
;;;- RESULTS
;;;  - RESULTS:0 {string(list)} :設備を利用しているキャラのIDリスト
;-------------------------------------------------
@HO_GET_CHARA_USE_THIS_MODULE(MODULE_LIST_IDX, INCLUDE_MASTER = 0)
;region
#DIM  MODULE_LIST_IDX
#DIM  INCLUDE_MASTER
#DIM  DYNAMIC CHARA_IDX
#DIMS DYNAMIC _LIST_CHARA_ID

VARSET RESULTS
IF INCLUDE_MASTER == 1
    SIF MODULE_LIST_IDX == HO_MASTER_USE_MODULE_LIST_IDX
        _LIST_CHARA_ID = %LIST_ADD(_LIST_CHARA_ID, TOSTR(MASTER))%
ENDIF

CHARA_IDX = 0
WHILE _DIC_HO_CHARALIST:(CHARA_IDX) != "-1"
    CALL HO_GET_CHARADATA(CHARA_IDX, "USE_MODULE_IDX")
    IF RESULT != MODULE_LIST_IDX
        CHARA_IDX ++
        CONTINUE
    ENDIF
    CALL HO_GET_CHARADATA(CHARA_IDX, "CHARA_ID")
    _LIST_CHARA_ID = %LIST_ADD(_LIST_CHARA_ID, TOSTR(RESULT))%
    CHARA_IDX ++
WEND

LOCAL = LIST_COUNT(_LIST_CHARA_ID)
RESULTS = %_LIST_CHARA_ID%
RETURN LOCAL

;新しく使用することは非推奨。@HO_GET_CHARA_USE_THIS_MODULE をつかうこと
@HO_GET_MODULE_USE_MEMBER(ROOM_IDX, MODULE_IDX, INCLUDE_MASTER = 0)
#DIM INCLUDE_MASTER
#DIM DYNAMIC ROOM_IDX
#DIM DYNAMIC MODULE_IDX
#DIMS DYNAMIC _LIST_CHARA_ID

VARSET RESULTS
IF INCLUDE_MASTER == 1
    CALL HO_GET_MASTER_DATA("MODULE_USAGE")
    SIF ROOM_IDX == HO_MASTER現在地 && MODULE_IDX == RESULT
        _LIST_CHARA_ID = %LIST_ADD(_LIST_CHARA_ID, TOSTR(MASTER))%
ENDIF

LOCAL:0 = 0
WHILE _DIC_HO_CHARALIST:(LOCAL:0) != "-1"
    CALL HO_GET_CHARADATA(LOCAL:0, "ROOM_IDX")
    IF RESULT != ROOM_IDX
        LOCAL:0 ++
        CONTINUE
    ENDIF
    CALL HO_GET_CHARADATA(LOCAL:0, "MODULE_USAGE")
    IF MODULE_IDX == RESULT
        CALL HO_GET_CHARADATA(LOCAL:0, "CHARA_ID")
        _LIST_CHARA_ID = %LIST_ADD(_LIST_CHARA_ID, TOSTR(RESULT))%
    ENDIF
    LOCAL:0 ++
WEND
RESULTS = %_LIST_CHARA_ID%
RETURN LIST_COUNT(_LIST_CHARA_ID)
;#endregion