diff --git a/ERB/HOUSING/HOUSING.ERH b/ERB/HOUSING/HOUSING.ERH
index 5450c0e641b91e11e7a837559f00c910173d7451..aa0c404111c45069dae5b49aabc732f286f0a912 100644
--- a/ERB/HOUSING/HOUSING.ERH
+++ b/ERB/HOUSING/HOUSING.ERH
@@ -272,7 +272,9 @@
 #DIM HO_SCH_IS_DRAW_SUBWND
 ;ページ管理
 #DIM HO_SCH_PAGE
-
+;コピペ用
+#DIM HO_SCH_COPIED_FROM
+#DIMS HO_SCH_HEADER_MESSAGE
 ;エディットモード
 ;-------------------------------------------------
 #DIM HO_EDIT_MODE
diff --git a/ERB/HOUSING/HOUSING_SCHEDULE_MENU.ERB b/ERB/HOUSING/HOUSING_SCHEDULE_MENU.ERB
index 5ddb0ce70ea65366e4db8099dcf711a8d0ec67db..1f9de6e4a84659929f55e60e5c6cef8edcb7785d 100644
--- a/ERB/HOUSING/HOUSING_SCHEDULE_MENU.ERB
+++ b/ERB/HOUSING/HOUSING_SCHEDULE_MENU.ERB
@@ -4,7 +4,8 @@
 @HO_SCH_MENU()
 #DIM CONST WINDOW_ID = 0
 #DIM DYNAMIC LINE_NUM
-
+HO_SCH_COPIED_FROM = -1
+HO_SCH_HEADER_MESSAGE '= ""
 LINE_NUM = LINECOUNT
 
 WHILE 1
@@ -49,7 +50,7 @@ WEND
 BTN_ID = HO_スケジュールボタンID
 
 CALL WndMgr_CreateWindow(WINDOW_ID, 0, 1, WND_WIDTH, WND_HEIGHT, 2)
-CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@S:1@@C:{カラー_注釈}@◇ スケジュール管理 ◇@/C@@/S@")
+CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@S:1@@C:{カラー_注釈}@◇ スケジュール管理 ◇@/C@@/S@  %HO_SCH_HEADER_MESSAGE%")
 CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))
 
 ;明細リスト作成
@@ -176,6 +177,11 @@ ELSE
         CALL HO_SCH_ASSIGN_CRAFT_ORDER(TOINT(DIC_GET(RESULTS, "ASSIGN_ORDER")))
     ELSEIF DIC_CONTAINSKEY(RESULTS, "RESET_ORDER")
         CALL HO_SCH_RESET_CRAFT_ORDER()
+    ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "COPY_SCHEDULE_FROM_CHARA")
+        HO_SCH_COPIED_FROM = TOINT(DIC_GET(INPUT_VALUES, "COPY_SCHEDULE_FROM_CHARA"))
+        HO_SCH_HEADER_MESSAGE '= @"@C:{カラー_注意}@%SNAME(HO_SCH_COPIED_FROM)%からコピー中(実行不可タスクはコピーされません)@/C@"
+    ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "PASTE_SCHEDULE_TO_CHARA")
+        CALL HO_SCH_PASTE_SCHEDULE_TO_CHARA(TOINT(DIC_GET(INPUT_VALUES, "PASTE_SCHEDULE_TO_CHARA")))
     ENDIF
 
 ENDIF
@@ -414,10 +420,13 @@ ENDIF
 BTN_ID = HO_スケジュールボタンID + (CHARA_ID * 100) 
 
 ARRAYS_STR_CHARA_INFO:0 += @"%SNAME(CHARA_ID), MAX_CHARANAME_LENGTH / 2, LEFT%"
-ARRAYS_STR_CHARA_INFO:0 += @"%TAG_PRINT_SHAPE(@"朝:@B:{BTN_ID + 0}@[%TOHALF(HO_TASK_NAME:(HO_TASK_SCH:(CHARA_ID):0))%]@/B@", 16, 1, 0)%"
-ARRAYS_STR_CHARA_INFO:0 += @"%TAG_PRINT_SHAPE(@"昼:@B:{BTN_ID + 1}@[%TOHALF(HO_TASK_NAME:(HO_TASK_SCH:(CHARA_ID):1))%]@/B@", 16, 1, 0)%"
-ARRAYS_STR_CHARA_INFO:0 += @"%TAG_PRINT_SHAPE(@"夕:@B:{BTN_ID + 2}@[%TOHALF(HO_TASK_NAME:(HO_TASK_SCH:(CHARA_ID):2))%]@/B@", 16, 1, 0)%"
-ARRAYS_STR_CHARA_INFO:0 += @"%TAG_PRINT_SHAPE(@"晩:@B:{BTN_ID + 3}@[%TOHALF(HO_TASK_NAME:(HO_TASK_SCH:(CHARA_ID):3))%]@/B@", 16, 1, 0)%"
+ARRAYS_STR_CHARA_INFO:0 += @"%TAG_PRINT_SHAPE(@"朝:@B:{BTN_ID + 0}@[%TOHALF(HO_TASK_NAME:(HO_TASK_SCH:(CHARA_ID):0))%]@/B@", 12, 1, 0)%"
+ARRAYS_STR_CHARA_INFO:0 += @"%TAG_PRINT_SHAPE(@"昼:@B:{BTN_ID + 1}@[%TOHALF(HO_TASK_NAME:(HO_TASK_SCH:(CHARA_ID):1))%]@/B@", 12, 1, 0)%"
+ARRAYS_STR_CHARA_INFO:0 += @"%TAG_PRINT_SHAPE(@"夕:@B:{BTN_ID + 2}@[%TOHALF(HO_TASK_NAME:(HO_TASK_SCH:(CHARA_ID):2))%]@/B@", 12, 1, 0)%"
+ARRAYS_STR_CHARA_INFO:0 += @"%TAG_PRINT_SHAPE(@"晩:@B:{BTN_ID + 3}@[%TOHALF(HO_TASK_NAME:(HO_TASK_SCH:(CHARA_ID):3))%]@/B@", 14, 1, 0)%"
+ARRAYS_STR_CHARA_INFO:0 += @"%TAG_PRINT_SHAPE(@"@B:[COPY_SCHEDULE_FROM_CHARA:{CHARA_ID}]@[コピー]@/B@", 7, 1, 0)%"
+SIF HO_SCH_COPIED_FROM != -1
+    ARRAYS_STR_CHARA_INFO:0 += @"%TAG_PRINT_SHAPE(@"@B:[PASTE_SCHEDULE_TO_CHARA:{CHARA_ID}]@[ペースト]@/B@", 7, 1, 0)%"
 
 CALL GET_STR_SEX(CHARA_ID, 1)
 ARRAYS_STR_CHARA_INFO:1 += @"%TAG_PRINT_SHAPE(@"%RESULTS%", 4, 1, 0)%"
@@ -501,4 +510,33 @@ FOR ITER_I, 0, ITEM_LENGTH
 NEXT
 
 RESULTS = %STRS%
-RETURN
\ No newline at end of file
+RETURN
+
+@HO_SCH_PASTE_SCHEDULE_TO_CHARA(CHARA_ID)
+#DIM CHARA_ID
+#DIM TIMETABLE
+#DIMS DYNAMIC TASK_NAME
+HO_SCH_HEADER_MESSAGE '= @"@C:{カラー_注意}@%ANAME(HO_SCH_COPIED_FROM)%から%ANAME(CHARA_ID)%にコピー@/C@"
+
+FOR TIMETABLE, 0, HO_TIMETABLENUM
+    ;虜囚が担当可能なタスクは限定
+    TASK_NAME '= HO_TASK_NAME:(HO_TASK_SCH:HO_SCH_COPIED_FROM:TIMETABLE)
+
+    SIF CFLAG:CHARA_ID:捕虜先 == 所属_プレイヤー && !GROUPMATCH(TASK_NAME, "自由", "採集", "採掘", "売春", "搾乳")
+        CONTINUE
+    
+    IF TASK_NAME == "売春"
+        SIF !CAN_PROSTITUTE(CHARA_ID)
+            CONTINUE
+    ELSEIF TASK_NAME == "搾乳"
+        SIF !HAS_TALENT(CHARA_ID, "母乳体質")
+            CONTINUE
+        SIF CFLAG:CHARA_ID:捕虜先 != 所属_プレイヤー && !IS_NASTY(CHARA_ID, 素質_淫乱_雌牛)
+            CONTINUE
+    ENDIF
+    
+    HO_TASK_SCH:CHARA_ID:TIMETABLE = HO_TASK_SCH:HO_SCH_COPIED_FROM:TIMETABLE
+    _LIST_HO_WORKPLACE:CHARA_ID:TIMETABLE '= _LIST_HO_WORKPLACE:HO_SCH_COPIED_FROM:TIMETABLE
+    _LIST_HO_CRAFT_ORDER_DID:CHARA_ID:TIMETABLE '= _LIST_HO_CRAFT_ORDER_DID:HO_SCH_COPIED_FROM:TIMETABLE
+
+NEXT
\ No newline at end of file
diff --git a/ERB/SYSTEM/DATATABLE/DATATABLE.ERB b/ERB/SYSTEM/DATATABLE/DATATABLE.ERB
index 4ed18e39dbb4c6465cefa2c7fc9195aa3f7f5d61..53949fcaa4a4a737f8f310a3763e67fa66530889 100644
--- a/ERB/SYSTEM/DATATABLE/DATATABLE.ERB
+++ b/ERB/SYSTEM/DATATABLE/DATATABLE.ERB
@@ -209,6 +209,9 @@ RETURN 1
         "ENEMY_PASSIVE_SKILL",
         "ENEMY_ACTIVE_SKILL",
         "ENEMY_AI",
+        "ENEMY_AI_ROUTINE_SEQUENCE",
+        "ENEMY_AI_ROUTINE_MODE",
+        "ENEMY_DEF_NAME",
         "ENEMY_SELECTED_SKILL",
         "DROP_ITEM_LIST",
         "EXP",
@@ -229,7 +232,7 @@ RETURN 1
 }
 DT_CREATE DB_NAME
 FOR LOCAL, 0, VARSIZE("COLUMN")
-    IF GROUPMATCH(COLUMN:LOCAL, "CHARA_NAME", "SKILL_LIST", "TEMP_WEAPON", "STATE", "SUBSTATE", "EFFECT", "PORTRAIT_EFFECT", "PORTRAIT_OPTIONS", "ENEMY_ACTIVE_SKILL", "ENEMY_PASSIVE_SKILL", "ENEMY_SELECTED_SKILL", "ENEMY_AI", "DROP_ITEM_LIST")
+    IF GROUPMATCH(COLUMN:LOCAL, "CHARA_NAME", "SKILL_LIST", "TEMP_WEAPON", "STATE", "SUBSTATE", "EFFECT", "PORTRAIT_EFFECT", "PORTRAIT_OPTIONS", "ENEMY_DEF_NAME", "ENEMY_AI_ROUTINE_MODE", "ENEMY_ACTIVE_SKILL", "ENEMY_PASSIVE_SKILL", "ENEMY_SELECTED_SKILL", "ENEMY_AI", "DROP_ITEM_LIST")
         DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "string"
     ELSEIF GROUPMATCH(COLUMN:LOCAL, "HP", "MAX_HP", "BARRIER")
         DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "int32"
@@ -310,12 +313,14 @@ RETURN 1
         "ENEMY_PASSIVE_SKILL",
         "ENEMY_ACTIVE_SKILL",
         "ENEMY_AI",
+        "ENEMY_AI_ROUTINE_MODE",
+        "ENEMY_AI_ROUTINE_SEQUENCE",
         "DROP_ITEM_LIST",
         "EXP",
 }
 DT_CREATE DB_NAME
 FOR LOCAL, 0, VARSIZE("COLUMN")
-    IF GROUPMATCH(COLUMN:LOCAL, "ENEMY_DEF_NAME", "ENEMY_PASSIVE_SKILL", "ENEMY_ACTIVE_SKILL", "ENEMY_AI", "DROP_ITEM_LIST")
+    IF GROUPMATCH(COLUMN:LOCAL, "ENEMY_DEF_NAME", "ENEMY_PASSIVE_SKILL", "ENEMY_ACTIVE_SKILL", "ENEMY_AI", "ENEMY_AI_ROUTINE_MODE", "DROP_ITEM_LIST")
         DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "string"
     ELSEIF GROUPMATCH(COLUMN:LOCAL, "HP", "MAX_HP")
         DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "int32"
@@ -328,6 +333,69 @@ CALL CC_ENEMY_DATA()
 
 RETURN 1
 
+;-------------------------------------------------
+;;; エネミールーチン格納用テーブルを作成&初期化  
+;;; `@QST_QUEST_XX_ENEMY_DATA`内でENEMY_DATAとともに作成すればよい  
+;;; ルーチン行動AIを使うにはENEMY_DATAで`"ENEMY_AI", "[AI_FUNC:ROUTINE]"`と指定
+;;; #### 入力パラメータ
+;;;   - **<å¿…é ˆ>** ENEMY_DEF_NAME
+;;;     - 作成されるDB名は `@"CC_ENEMY_ROUTINE_TABLE_%ENEMY_DEF_NAME%"`
+;-------------------------------------------------
+@CREATE_CC_ENEMY_ROUTINE_TABLE(ENEMY_DEF_NAME)
+#DIMS ENEMY_DEF_NAME
+#DIMS DB_NAME
+
+DB_NAME '= @"CC_ENEMY_ROUTINE_TABLE_%ENEMY_DEF_NAME%"
+;DEBUGPRINTFORML DB_NAME %DB_NAME%
+
+IF DT_EXIST(DB_NAME)
+    DT_CLEAR DB_NAME
+    RETURN
+ENDIF
+
+DT_CREATE DB_NAME
+DT_COLUMN_ADD DB_NAME, "MODE", "string"
+DT_COLUMN_ADD DB_NAME, "SEQUENCE", "int16"
+DT_COLUMN_ADD DB_NAME, "SKILL_DEF_NAME", "string"
+DT_COLUMN_ADD DB_NAME, "WEIGHT", "int16"
+DT_COLUMN_ADD DB_NAME, "CONDITION", "string"
+
+;-------------------------------------------------
+;;; エネミールーチン登録  
+;;; 事前に@CREATE_CC_ENEMY_ROUTINE_TABLE(ENEMY_DEF_NAME)でテーブルを作成
+;-------------------------------------------------
+;;; #### 入力パラメータ
+;;;   - **<å¿…é ˆ>** ENEMY_DEF_NAME
+;;;   - **<必須>** SEQUENCE: ルーチン実行順。0から実行。必ず連番。重複する場合はWEIGHTに従って重みづけ判定される
+;;;   - **<必須>** SKILL_DEF_NAME: ENEMY_ACTIVE_SKILLで指定済みのスキル名称
+;;;     - 通常攻撃を行わせるには"NORMAL_ATTACK"か""を指定
+;;;   - **<任意>** WEIGHT: 重みづけ値。指定しない場合は100
+;;;   - **<任意>** MODE: "ATTACK_MODE" "DEFENCE_MODE" のように指定することで、複数のルーチンテーブルを持つように振る舞える
+;;;     - 使用する場合は @CC_SET_ENEMY_AI_ROUTINE_MODE か @CC_ACTION_SET_ENEMY_AI_ROUTINE_MODE を用いてここで定義したモードをアクターに与える。
+;;;   - **<任意>** CONDITION: TOINT(STRFORM(CONDITION))形式で判定される選択条件。満たさない場合は重みづけ = 0
+;-------------------------------------------------
+@CC_ADD_ENEMY_ROUTINE(ENEMY_DEF_NAME, SEQUENCE, SKILL_DEF_NAME, WEIGHT = 100, MODE = "",  CONDITION = "{1}")
+#DIMS ENEMY_DEF_NAME
+#DIMS  MODE
+#DIM  SEQUENCE
+#DIMS SKILL_DEF_NAME
+#DIM  WEIGHT
+#DIMS CONDITION
+
+#DIMS DB_NAME
+
+DEBUGPRINTFORML %ENEMY_DEF_NAME% %MODE%
+
+DB_NAME '= @"CC_ENEMY_ROUTINE_TABLE_%ENEMY_DEF_NAME%"
+{
+    DT_ROW_ADD DB_NAME 
+        ,"MODE", MODE
+        ,"SEQUENCE", SEQUENCE
+        ,"SKILL_DEF_NAME", SKILL_DEF_NAME
+        ,"WEIGHT", WEIGHT
+        ,"CONDITION", CONDITION
+}
+
 ;-------------------------------------------------
 ; XMLスキル定義から取得したスキル諸情報を格納する参照用テーブル
 ;-------------------------------------------------
diff --git a/ERB/TRAIN/CLOSE_COMBAT/CC_ACTION.ERB b/ERB/TRAIN/CLOSE_COMBAT/CC_ACTION.ERB
index d41e3394438ce995cb52958d4ab5ef266db938e7..4391817551955d9d9ad708f7d320c70b9e1ff1bf 100644
--- a/ERB/TRAIN/CLOSE_COMBAT/CC_ACTION.ERB
+++ b/ERB/TRAIN/CLOSE_COMBAT/CC_ACTION.ERB
@@ -129,6 +129,31 @@ VALUE = DT_CELL_GET("CC_ACTION", ACTION_DID, "VALUE", 1)
 CALL KOJO_XML_COMBAT(ACTION_DID, "EXEC")
 CALL CC_SET_SP_TOKEN(TARGET_DID, TOKEN_NAME, VALUE)
 CALL KOJO_XML_COMBAT(ACTION_DID, "RESULT")
+
+;-------------------------------------------------
+;;; トークン個数をすべてリセット
+;-------------------------------------------------
+;;; #### 入力パラメータ
+;;; - CC_ACTIONテーブル 
+;;;   - **<必須>** ACTOR_DID: 動作主アクターID
+;;;   - **<必須>** TARGET_DID: 対象アクターID
+;-------------------------------------------------
+@CC_ACTION_RESET_SP_TOKEN(ACTION_DID)
+#DIM  ACTION_DID
+#DIM  TARGET_DID
+#DIMS TOKEN_NAME
+#DIM  VALUE
+
+TARGET_DID = DT_CELL_GET("CC_ACTION", ACTION_DID, "TARGET_DID", 1)
+
+CALL KOJO_XML_COMBAT(ACTION_DID, "EXEC")
+
+DT_ROW_REMOVE "CC_SP_TOKEN_NUM", TARGET_DID
+DT_ROW_ADD "CC_SP_TOKEN_NUM", "ID", TARGET_DID
+
+CALL KOJO_XML_COMBAT(ACTION_DID, "RESULT")
+
+
 ;-------------------------------------------------
 ;;; HP減少  
 ;;; ダメージ計算を行わず、直接HPを減らします。
@@ -403,6 +428,252 @@ DT_CELL_SET "CC_ACTOR", RESULT, "EFFECT", "増援", 1
 
 CALL KOJO_XML_COMBAT(ACTION_DID, "RESULT")
 
+
+
+;-------------------------------------------------
+;;; 服破壊  
+;-------------------------------------------------
+;;; #### 入力パラメータ
+;;; - CC_ACTIONテーブル 
+;;;   - **<必須>** ACTOR_DID: 動作主アクターID
+;;;   - **<必須>** TARGET_DID: 対象アクターID
+;;;   - **<必須>** SUCCESS_RATE: 成功率
+;;; #### 結果
+;;; - CC_AFLAG
+;;;   - INVALID_CHARA_ID: 1 = TARGETがキャラIDを持たない
+;;;   - ALREADY_NAKED: 1 = すでにすっぽんぽん
+;;;   - CLOTH_TORN = 破壊された衣服の描写(メッセージ表示用)
+;-------------------------------------------------
+@CC_ACTION_TEAR_CLOTH(ACTION_DID)
+#DIM  ACTION_DID
+#DIM  ACTOR_DID
+#DIM  TARGET_DID
+#DIM  SUCCESS_RATE
+#DIM  TARGET_CHARA_ID
+
+ACTOR_DID = DT_CELL_GET("CC_ACTION", ACTION_DID, "ACTOR_DID", 1)
+TARGET_DID = CC_GET_ACT_INFO(ACTION_DID, "TARGET_DID")
+TARGET_CHARA_ID = DT_CELL_GET("CC_ACTOR", TARGET_DID, "CHARA_ID", 1)
+SUCCESS_RATE = DT_CELL_GET("CC_ACTION", ACTION_DID, "SUCCESS_RATE", 1)
+
+IF TARGET_CHARA_ID == -1
+	CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "INVALID_CHARA_ID", "1")
+	RETURN 0
+ENDIF
+
+CALL KOJO_XML_COMBAT(ACTION_DID, "EXEC")
+
+IF C_COND("露出_胸:露出",,TARGET_CHARA_ID) && C_COND("露出_秘部:露出",,TARGET_CHARA_ID)
+	CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "ALREADY_NAKED", "1")
+	GOTO ACTION_RESULT
+ENDIF
+
+;抵抗は現状未定義なのでSUCCESS_RATE%
+IF !CC_CHECK_REGIST(ACTOR_DID, TARGET_DID, "EXPOSE", SUCCESS_RATE)
+	CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "INFLICT_REGISTED", "1")
+	GOTO ACTION_RESULT
+ENDIF
+
+IF RAND:2 && !C_COND("露出_胸:露出",,TARGET_CHARA_ID)
+	CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "DAMAGED_CLOTH", C_COND_MAP_GETS(TARGET_CHARA_ID, "被覆衣装描写_胸"))
+	CALL HO_STRIP(TARGET_CHARA_ID, 被覆部位_乳首, 衣装状態_破, 1)
+	SIF C_COND("露出_胸:露出",,TARGET_CHARA_ID)
+		CALL CC_SET_SP_TOKEN(TARGET_CHARA_ID, "CHEST_EXPOSE", 1)
+ELSE
+	;CALL CC_PRINT(@"%ATK_CHARA_NAME%の攻撃によって%DEF_CHARA_NAME%の@C:{カラー_ピンク}@%衣装描写%@/C@は無惨に引き裂かれてしまった…!")
+	CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "DAMAGED_CLOTH", C_COND_MAP_GETS(TARGET_CHARA_ID, "被覆衣装描写_秘部"))
+	CALL HO_STRIP(TARGET_CHARA_ID, 被覆部位_秘部, 衣装状態_破, 1)
+	SIF C_COND("露出_秘部:露出",,TARGET_CHARA_ID)
+		CALL CC_SET_SP_TOKEN(TARGET_CHARA_ID, "GENITAL_EXPOSE", 1)
+ENDIF
+
+$ ACTION_RESULT
+CALL KOJO_XML_COMBAT(ACTION_DID, "RESULT")
+
+
+;-------------------------------------------------
+;;; 膨乳。  
+;-------------------------------------------------
+;;; #### 入力パラメータ
+;;; - CC_ACTIONテーブル 
+;;;   - **<必須>** ACTOR_DID: 動作主アクターID
+;;;   - **<必須>** TARGET_DID: 対象アクターID
+;;;   - **<必須>** VALUE: 増減量
+;;; #### 結果
+;;; - CC_AFLAG
+;;;   - NOT_CHANGED: 1 = 能力の変動がなかった
+;-------------------------------------------------
+@CC_ACTION_BUST_INFLATION(ACTION_DID)
+#DIM  ACTION_DID
+#DIM  TARGET_DID
+#DIM  VALUE
+#DIM  TARGET_CHARA_ID
+#DIM  NEW_VALUE
+
+#DIM CONST UPPER_LIMIT = 4
+#DIM CONST LOWER_LIMIT = -2
+
+
+TARGET_DID = CC_GET_ACT_INFO(ACTION_DID, "TARGET_DID")
+TARGET_CHARA_ID = DT_CELL_GET("CC_ACTOR", TARGET_DID, "CHARA_ID", 1)
+VALUE = CC_GET_ACT_INFO(ACTION_DID, "VALUE")
+
+IF TARGET_CHARA_ID == -1
+	CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "INVALID_CHARA_ID", "1")
+	RETURN 0
+ENDIF
+
+CALL KOJO_XML_COMBAT(ACTION_DID, "EXEC")
+
+NEW_VALUE = LIMIT(TALENT:TARGET_CHARA_ID:バストサイズ + VALUE, LOWER_LIMIT, UPPER_LIMIT)
+
+IF NEW_VALUE == TALENT:TARGET_CHARA_ID:バストサイズ
+	CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "NOT_CHANGED", "1")
+ELSE
+	TALENT:TARGET_CHARA_ID:バストサイズ = NEW_VALUE
+	CALL SET_BUSTSIZE(TARGET_CHARA_ID, TALENT:TARGET_CHARA_ID:バストサイズ)
+	CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "BUST_RESULT", TOSTR_BUSTSIZE(TALENT:TARGET_CHARA_ID:バストサイズ))
+ENDIF
+
+CALL KOJO_XML_COMBAT(ACTION_DID, "RESULT")
+
+
+;-------------------------------------------------
+;;; エネミーデータ改変  
+;;; 事前定義したENEMY_DATAを適用する  
+;;; OPTIONに連想配列でデータを指定すると、こちらが優先される
+;-------------------------------------------------
+;;; #### 入力パラメータ
+;;; - CC_ACTIONテーブル 
+;;;   - **<必須>** ACTOR_DID: 動作主となるアクターのID
+;;;   - **<必須>** TARGET_DID: 変更対象アクターのID
+;;;   - **<任意>** DEF_NAME: 変更先のENEMY_DEF_NAME
+;;;   - **<任意>** OPTION: オーバーライドするパラメータ
+;;;     - ENEMY_PASSIVE_SKILL と ENEMY_ACTIVE_SKILL は入れ子対策のため`[ENEMY_PASSIVE_SKILL:<SMITE;1><MANA_SMITE;1>]`形式で与えてください
+;-------------------------------------------------
+@CC_ACTION_MODIFY_ENEMY_DATA(ACTION_DID)
+#DIM  ACTION_DID
+#DIM  TARGET_DID
+#DIMS  DEF_NAME
+#DIMS  OPTION
+
+#DIM DYNAMIC ENEMY_DID
+#DIM DYNAMIC COLUMN_NUM
+#DIMS DYNAMIC COLUMNS, 1000
+#DIMS DIC_SKILL
+
+TARGET_DID = CC_GET_ACT_INFO(ACTION_DID, "TARGET_DID")
+DEF_NAME = %CC_GETS_ACT_INFO(ACTION_DID, "DEF_NAME")%
+OPTION = %CC_GETS_ACT_INFO(ACTION_DID, "OPTION")%
+
+CALL KOJO_XML_COMBAT(ACTION_DID, "EXEC")
+
+IF DEF_NAME != ""
+
+	DT_SELECT "ENEMY_DATA", @"ENEMY_DEF_NAME = '%DEF_NAME%'"
+	IF RESULT < 1
+		DEBUGPRINTFORML エラー:指定されたエネミー定義"%DEF_NAME%"は存在しません
+		RETURN 0
+	ELSE
+		ENEMY_DID = RESULT:1 
+	ENDIF
+
+
+	COLUMN_NUM = DT_COLUMN_NAMES("ENEMY_DATA", COLUMNS)
+	FOR LOCAL, 0, COLUMN_NUM
+		SELECTCASE DT_COLUMN_EXIST("CC_ACTOR", COLUMNS:LOCAL)
+			CASE 1, 2, 3, 4
+				DEBUGPRINTFORML BEFORE {DT_CELL_GET("CC_ACTOR", TARGET_DID, COLUMNS:LOCAL, 1)}
+				CALL CC_SET_ENEMYDATA(TARGET_DID, COLUMNS:LOCAL, DT_CELL_GET("ENEMY_DATA", ENEMY_DID, COLUMNS:LOCAL, 1))
+				DEBUGPRINTFORML AFTER {DT_CELL_GET("CC_ACTOR", TARGET_DID, COLUMNS:LOCAL, 1)}
+			CASE 5
+				DEBUGPRINTFORML BEFORE %DT_CELL_GETS("CC_ACTOR", TARGET_DID, COLUMNS:LOCAL, 1)%
+				CALL CC_SETS_ENEMYDATA(TARGET_DID, COLUMNS:LOCAL, DT_CELL_GETS("ENEMY_DATA", ENEMY_DID, COLUMNS:LOCAL, 1))
+				DEBUGPRINTFORML AFTER %DT_CELL_GETS("CC_ACTOR", TARGET_DID, COLUMNS:LOCAL, 1)%
+			CASEELSE
+				DEBUGPRINTFORML 指定された行名%COLUMNS:LOCAL%が存在しません			
+		ENDSELECT
+	NEXT
+ENDIF
+
+IF OPTION != ""
+	COLUMN_NUM = DIC_KEYSF(OPTION)
+	ARRAYCOPY "RESULTS", "COLUMNS"
+	FOR LOCAL, 0, COLUMN_NUM
+		IF GROUPMATCH(COLUMNS:LOCAL, "ENEMY_ACTIVE_SKILL", "ENEMY_PASSIVE_SKILL")
+			DIC_SKILL = %DIC_GET(OPTION, COLUMNS:LOCAL)%
+			DEBUGPRINTFORML DIC_SKILL: %DIC_SKILL%
+			DIC_SKILL = %REPLACE(DIC_SKILL, "<", "[")%
+			DIC_SKILL = %REPLACE(DIC_SKILL, ";", ":")%
+			DIC_SKILL = %REPLACE(DIC_SKILL, ">", "]")%
+			DEBUGPRINTFORML DIC_SKILL: %DIC_SKILL%
+			CALL CC_SETS_ENEMYDATA(TARGET_DID, COLUMNS:LOCAL, DIC_SKILL)
+			CONTINUE
+		ENDIF
+
+		SELECTCASE DT_COLUMN_EXIST("CC_ACTOR", COLUMNS:LOCAL)
+			CASE 1, 2, 3, 4
+				DEBUGPRINTFORML BEFORE {DT_CELL_GET("CC_ACTOR", TARGET_DID, COLUMNS:LOCAL, 1)}
+				CALL CC_SET_ENEMYDATA(TARGET_DID, COLUMNS:LOCAL, DIC_GETINT(OPTION, COLUMNS:LOCAL))
+				DEBUGPRINTFORML AFTER {DT_CELL_GET("CC_ACTOR", TARGET_DID, COLUMNS:LOCAL, 1)}
+			CASE 5
+				DEBUGPRINTFORML BEFORE %DT_CELL_GETS("CC_ACTOR", TARGET_DID, COLUMNS:LOCAL, 1)%
+				CALL CC_SETS_ENEMYDATA(TARGET_DID, COLUMNS:LOCAL, DIC_GET(OPTION, COLUMNS:LOCAL))
+				DEBUGPRINTFORML AFTER %DT_CELL_GETS("CC_ACTOR", TARGET_DID, COLUMNS:LOCAL, 1)%
+			CASEELSE
+				DEBUGPRINTFORML 指定された行名%COLUMNS:LOCAL%が存在しません
+		ENDSELECT
+	NEXT
+ENDIF
+
+CALL KOJO_XML_COMBAT(ACTION_DID, "RESULT")
+
+;-------------------------------------------------
+;;; アクターステート変更
+;-------------------------------------------------
+;;; #### 入力パラメータ
+;;; - CC_ACTIONテーブル 
+;;;   - **<必須>** ACTOR_DID: 動作主となるアクターのID
+;;;   - **<必須>** TARGET_DID: 変更対象アクターのID
+;;;   - **<必須>** DEF_NAME: ステート名
+;-------------------------------------------------
+@CC_ACTION_SET_ACTOR_STATE(ACTION_DID)
+#DIM  ACTION_DID
+#DIM  TARGET_DID
+#DIMS  DEF_NAME
+
+TARGET_DID = CC_GET_ACT_INFO(ACTION_DID, "TARGET_DID")
+DEF_NAME = %CC_GETS_ACT_INFO(ACTION_DID, "DEF_NAME")%
+
+CALL KOJO_XML_COMBAT(ACTION_DID, "EXEC")
+
+DT_CELL_SET "CC_ACTOR", TARGET_DID, "STATE", DEF_NAME, 1
+
+CALL KOJO_XML_COMBAT(ACTION_DID, "RESULT")
+
+;-------------------------------------------------
+;;; AIルーチン変更
+;-------------------------------------------------
+;;; #### 入力パラメータ
+;;; - CC_ACTIONテーブル 
+;;;   - **<必須>** ACTOR_DID: 動作主となるアクターのID
+;;;   - **<必須>** TARGET_DID: 変更対象アクターのID
+;;;   - **<必須>** DEF_NAME: モード名
+;;;   - **<任意>** VALUE: 変更後初期シーケンス
+;-------------------------------------------------
+@CC_ACTION_SET_ENEMY_AI_ROUTINE_MODE(ACTION_DID)
+#DIM  ACTION_DID
+#DIM  TARGET_DID
+#DIMS  DEF_NAME
+#DIM  VALUE
+
+TARGET_DID = CC_GET_ACT_INFO(ACTION_DID, "TARGET_DID")
+DEF_NAME = %CC_GETS_ACT_INFO(ACTION_DID, "DEF_NAME")%
+VALUE = CC_GET_ACT_INFO(ACTION_DID, "VALUE")
+
+CALL KOJO_XML_COMBAT(ACTION_DID, "EXEC")
+CALL CC_SET_ENEMY_AI_ROUTINE_MODE(TARGET_DID, DEF_NAME, VALUE)
+CALL KOJO_XML_COMBAT(ACTION_DID, "RESULT")
 ;-------------------------------------------------
 ;;; CLOSE_COMBAT_DRAW_WINDOW呼び出し
 ;-------------------------------------------------
diff --git a/ERB/TRAIN/CLOSE_COMBAT/CLOSE_COMBAT_FUNCTION.ERB b/ERB/TRAIN/CLOSE_COMBAT/CLOSE_COMBAT_FUNCTION.ERB
index cd15f092d1763113306d66ca747f46fc28ebc86b..2fa19a98a97b5381e9518361644a47f5cd421edd 100644
--- a/ERB/TRAIN/CLOSE_COMBAT/CLOSE_COMBAT_FUNCTION.ERB
+++ b/ERB/TRAIN/CLOSE_COMBAT/CLOSE_COMBAT_FUNCTION.ERB
@@ -150,6 +150,8 @@ ENDIF
 ;;; 引数:3 (任意)能力値を補正する場合指定。テーブル定義の能力値に対してn%加算し補正をかける。百分率指定  
 ;;; 引数:4 (任意)オプション辞書  [KEY:VALUE]の辞書形式で指定。各オプションは以下参照  
 ;;; "CHARA_ID" 指定したキャラとテーブルにないパラメータの同期をとる(ポートレイト、衣装状態など) 。戦闘用パラメータはテーブルの値より参照  
+;;; "HP"など"CC_ACTOR" に含まれるパラメータを指定することで、パラメータを上書き可能  
+;;;   -  ENEMY_PASSIVE_SKILL と ENEMY_ACTIVE_SKILL は入れ子対策のため`[ENEMY_PASSIVE_SKILL:<SMITE;1><MANA_SMITE;1>]`形式で与えてください
 ;;; - RETURN  
 ;;; RESULT:0 データテーブル上のID
 ;;;-------------------------------------------------
@@ -162,6 +164,10 @@ ENDIF
 #DIM  ステータス補正
 #DIMS DIC_OPTIONS
 #DIM  DYNAMIC ID
+#DIM  ACTOR_DID
+#DIM  COLUMN_NUM
+#DIMS COLUMNS, 1000
+#DIMS DIC_SKILL
 
 ;戦闘開始時の補正ステータス
 #DIM  DYNAMIC 最大HP
@@ -242,6 +248,9 @@ ENDIF
         ,"REGIST_DEATH", DT_CELL_GET("ENEMY_DATA", ID, "REGIST_DEATH", 1)
         ,"SELECTED_SKILL_SLOT", -1
         ,"ENEMY_AI", DT_CELL_GETS("ENEMY_DATA", ID, "ENEMY_AI", 1)
+        ,"ENEMY_DEF_NAME", ENEMY_DEF_NAME
+        ,"ENEMY_AI_ROUTINE_MODE", DT_CELL_GETS("ENEMY_DATA", ID, "ENEMY_AI_ROUTINE_MODE", 1)
+        ,"ENEMY_AI_ROUTINE_SEQUENCE", DT_CELL_GET("ENEMY_DATA", ID, "ENEMY_AI_ROUTINE_SEQUENCE", 1)
         ,"ENEMY_ACTIVE_SKILL", DT_CELL_GETS("ENEMY_DATA", ID, "ENEMY_ACTIVE_SKILL", 1)
         ,"ENEMY_PASSIVE_SKILL", DT_CELL_GETS("ENEMY_DATA", ID, "ENEMY_PASSIVE_SKILL", 1)
         ,"DROP_ITEM_LIST", DT_CELL_GETS("ENEMY_DATA", ID, "DROP_ITEM_LIST", 1)
@@ -249,12 +258,47 @@ ENDIF
         ,"SHOW_PORTRAIT", SHOW_PORTRAIT
         ,"IS_PLAYABLE", 0
 }
+ACTOR_DID = RESULT
 ;CALL DEBUG_TIMER_END
 
+IF DIC_OPTIONS != ""
+	COLUMN_NUM = DIC_KEYSF(DIC_OPTIONS)
+	ARRAYCOPY "RESULTS", "COLUMNS"
+	FOR LOCAL, 0, COLUMN_NUM
+        SIF COLUMNS:LOCAL == "CHARA_ID"
+            CONTINUE
+
+		IF GROUPMATCH(COLUMNS:LOCAL, "ENEMY_ACTIVE_SKILL", "ENEMY_PASSIVE_SKILL")
+			DIC_SKILL = %DIC_GET(DIC_OPTIONS, COLUMNS:LOCAL)%
+			;DEBUGPRINTFORML DIC_SKILL: %DIC_SKILL%
+			DIC_SKILL = %REPLACE(DIC_SKILL, "<", "[")%
+			DIC_SKILL = %REPLACE(DIC_SKILL, ";", ":")%
+			DIC_SKILL = %REPLACE(DIC_SKILL, ">", "]")%
+			;DEBUGPRINTFORML DIC_SKILL: %DIC_SKILL%
+			CALL CC_SETS_ENEMYDATA(ACTOR_DID, COLUMNS:LOCAL, DIC_SKILL)
+			CONTINUE
+		ENDIF
+
+		SELECTCASE DT_COLUMN_EXIST("CC_ACTOR", COLUMNS:LOCAL)
+			CASE 1, 2, 3, 4
+				;DEBUGPRINTFORML BEFORE {DT_CELL_GET("CC_ACTOR", TARGET_DID, COLUMNS:LOCAL, 1)}
+				CALL CC_SET_ENEMYDATA(ACTOR_DID, COLUMNS:LOCAL, DIC_GETINT(DIC_OPTIONS, COLUMNS:LOCAL))
+				;DEBUGPRINTFORML AFTER {DT_CELL_GET("CC_ACTOR", TARGET_DID, COLUMNS:LOCAL, 1)}
+			CASE 5
+				;DEBUGPRINTFORML BEFORE %DT_CELL_GETS("CC_ACTOR", TARGET_DID, COLUMNS:LOCAL, 1)%
+				CALL CC_SETS_ENEMYDATA(ACTOR_DID, COLUMNS:LOCAL, DIC_GET(DIC_OPTIONS, COLUMNS:LOCAL))
+				;DEBUGPRINTFORML AFTER %DT_CELL_GETS("CC_ACTOR", TARGET_DID, COLUMNS:LOCAL, 1)%
+			CASEELSE
+				DEBUGPRINTFORML 指定された行名%COLUMNS:LOCAL%が存在しません
+		ENDSELECT
+	NEXT
+ENDIF
+
 ;トークン管理テーブルにキャラクターを追加
-DT_ROW_ADD "CC_SP_TOKEN_NUM", "ID", RESULT
+DT_ROW_ADD "CC_SP_TOKEN_NUM", "ID", ACTOR_DID
+CALL CC_CREATE_ACTOR_FLAG(ACTOR_DID)
 
-RETURN RESULT
+RETURN ACTOR_DID
 
 ;-------------------------------------------------
 ;;; エネミーデータの指定キーに値を設定する
@@ -535,6 +579,8 @@ ACTOR_DID = RESULT
 
 ;トークン管理テーブルにキャラクターを追加
 DT_ROW_ADD "CC_SP_TOKEN_NUM", "ID", ACTOR_DID
+;アクターフラグ用の連想配列を作成
+CALL CC_CREATE_ACTOR_FLAG(ACTOR_DID)
 
 ;発情トークン追加
 CALL CC_ADD_SP_TOKEN(ACTOR_DID, "ESTRUS", TCVAR:CHARA_ID:媚薬)
@@ -626,6 +672,8 @@ ENDIF
 #DIM 敵視_魔術師
 #DIM 敵視_低耐久
 
+#DIM ACTOR_DID
+
 IF !MOB_ELITE
     防御力 = 戦闘 / 10
     軽減値 = LIMIT(MAX_HP / 15, 0, 300)
@@ -657,9 +705,12 @@ ENDIF
         ,"SELECTED_SKILL_SLOT", -1
         ,"ENEMY_ACTIVE_SKILL", ""
 }
+ACTOR_DID = RESULT
 
 ;トークン管理テーブルにキャラクターを追加
-DT_ROW_ADD "CC_SP_TOKEN_NUM", "ID", RESULT
+DT_ROW_ADD "CC_SP_TOKEN_NUM", "ID", ACTOR_DID
+;アクターフラグ用の連想配列を作成
+CALL CC_CREATE_ACTOR_FLAG(ACTOR_DID)
 
 ; DEBUGPRINTFORML *-----------------------*
 ; DEBUGPRINTFORML %CC_NAME%
@@ -718,6 +769,65 @@ ENDIF
 
 RETURN 加算軽減値
 
+;-------------------------------------------------
+;;;各アクターのフラグ
+;-------------------------------------------------
+@CC_CREATE_ACTOR_FLAG(ACTOR_DID)
+#DIM  ACTOR_DID
+MAP_RELEASE @"ACTOR_FLAG_{ACTOR_DID}"
+MAP_CREATE @"ACTOR_FLAG_{ACTOR_DID}"
+
+@CC_SETS_ACTOR_FLAG(ACTOR_DID, KEYS, VALUES)
+#DIM  ACTOR_DID
+#DIMS KEYS
+#DIMS VALUES
+MAP_SET @"ACTOR_FLAG_{ACTOR_DID}", KEYS, VALUES
+
+;;; 数値をフラグ変数にセット
+@CC_SET_ACTOR_FLAG(ACTOR_DID, KEYS, VALUE)
+#DIM  ACTOR_DID
+#DIMS KEYS
+#DIM  VALUE
+CALL CC_SETS_ACTOR_FLAG(ACTOR_DID, KEYS, TOSTR(VALUE))
+
+;;; 数値をフラグ変数に加算
+@CC_ADD_ACTOR_FLAG(ACTOR_DID, KEYS, ADD_VALUE)
+#DIM  ACTOR_DID
+#DIMS KEYS
+#DIM  ADD_VALUE
+#DIM  CURRENT_VALUE
+
+CURRENT_VALUE = CC_GET_ACTOR_FLAG(ACTOR_DID, KEYS)
+CALL CC_SET_ACTOR_FLAG(ACTOR_DID, KEYS, CURRENT_VALUE + ADD_VALUE)
+
+;;; @CC_SET_ACTOR_FLAGでセットしたフラグ変数を取得する
+@CC_GETS_ACTOR_FLAG(ACTOR_DID, KEYS)
+#FUNCTIONS
+#DIM  ACTOR_DID
+#DIMS KEYS
+RETURNF MAP_GET(@"ACTOR_FLAG_{ACTOR_DID}", KEYS)
+
+;;; @CC_SET_ACTOR_FLAGでセットしたフラグ変数を数値変換して取得する
+@CC_GET_ACTOR_FLAG(ACTOR_DID, KEYS)
+#FUNCTION
+#DIM  ACTOR_DID
+#DIMS KEYS
+RETURNF TOINT(CC_GETS_ACTOR_FLAG(ACTOR_DID, KEYS))
+
+;;; @CC_SET_ACTOR_FLAGでセットしたフラグ変数を削除する
+@CC_REMOVE_ACTOR_FLAG(ACTOR_DID, KEYS)
+#DIM  ACTOR_DID
+#DIMS KEYS
+MAP_REMOVE @"ACTOR_FLAG_{ACTOR_DID}", KEYS
+
+@CC_RELEASE_ALL_ACTOR_FLAG
+#DIM MEM_CNT
+#DIM IDX, CC_MAX_MEMBER_NUM
+
+MEM_CNT = DT_SELECT("CC_ACTOR",,, IDX)
+FOR LOCAL, 0, MEM_CNT
+    MAP_RELEASE @"ACTOR_FLAG_{IDX:LOCAL}"
+NEXT
 ;-------------------------------------------------
 ;戦闘処理時のスキル実行関数
 ;-------------------------------------------------
@@ -859,11 +969,14 @@ FOR LOCAL, 0, FINDELEMENT(ATK_SKILL_DEF_LIST, "",,, 1)
     SIF RESULT && !PERCENT(TOINT(RESULTS))
         CONTINUE
     XML_GET _XML_SKILL, "//triggerCondition", RESULTS, 1
+    SIF RESULT
+        DEBUGPRINTFORML triggerCondition %RESULTS% = {TOINT(STRFORM(RESULTS))}
     SIF RESULT && !TOINT(STRFORM(RESULTS))
         CONTINUE
     XML_GET _XML_SKILL, @"//func[//executeAt[(text()='%EXECUTE_AT%')]]", RESULTS, 1
     SIF !RESULT
         CONTINUE
+    DEBUGPRINTFORML EXEC CC_%RESULTS%
     TRYCCALLFORM CC_%RESULTS%(ATTACKER_DID, DEFENDER_DID, _XML_SKILL)
         ;パッシブは行数が増えがちなので使用せずEXECとまとめて表示
         ;CALL KOJO_XML_COMBAT_BY_TRIGGER_ID(RESULT, "TRIGGER")
@@ -1389,4 +1502,29 @@ ENDIF
         ,"REQTOKEN_TOCAST", REQTOKEN_TOCAST
 }
 RETURN 1
-; #endregion
\ No newline at end of file
+; #endregion
+
+
+;-------------------------------------------------
+;全員分のパッシブ発動チェック
+;-------------------------------------------------
+@CC_PASSIVE_CHECK_ALL(EXECUTE_AT)
+#DIMS EXECUTE_AT
+#DIMS ACTOR_LIST, CC_MAX_MEMBER_NUM + 1
+#DIM  DYNAMIC ACTOR_DID
+#DIM  DYNAMIC TARGET_DID
+
+CALL CLOSE_COMBAT_SET_ORDER(ACTOR_LIST)
+FOR LOCAL, 0, CC_MAX_MEMBER_NUM + 1
+	SIF ACTOR_LIST:LOCAL == "-1"
+		BREAK
+
+	ACTOR_DID = TOINT(DIC_GET(ACTOR_LIST:LOCAL, "ACTOR_DID"))
+	CALL CLOSE_COMBAT_SET_TARGET(ACTOR_DID)
+	TARGET_DID = RESULT
+	CALL CC_EXEC_PASSIVE_SKILL(EXECUTE_AT, ACTOR_DID, TARGET_DID)
+    CALL CC_EXEC_WPN_PASSIVE_SKILL(EXECUTE_AT, ACTOR_DID, TARGET_DID)
+
+	CALL CLOSE_COMBAT_DRAW_WINDOW(ACTOR_DID)
+
+NEXT
\ No newline at end of file
diff --git a/ERB/TRAIN/CLOSE_COMBAT/CLOSE_COMBAT_MAIN.ERB b/ERB/TRAIN/CLOSE_COMBAT/CLOSE_COMBAT_MAIN.ERB
index c255f6126440ce515f1c7c169ac20262facf8eaa..0462d6113be88e8eca8fe706aeada6111f860725 100644
--- a/ERB/TRAIN/CLOSE_COMBAT/CLOSE_COMBAT_MAIN.ERB
+++ b/ERB/TRAIN/CLOSE_COMBAT/CLOSE_COMBAT_MAIN.ERB
@@ -1,4 +1,4 @@
-;-------------------------------------------------
+;-------------------------------------------------
 ;戦闘処理
 ;予め"CC_ATTACKER_LIST", "CC_DEFENDER_LIST"のリスト(連想配列)に指定されたメンバーにて戦闘を実施する
 ; 戻り値 1 = "ATTACKER"勝利, 2 = "DEFENDER"勝利
@@ -218,6 +218,8 @@ CALL WndMgr_DestroyWindow(-1)
 CALL CC_RELEASE_ALL_ACT_FLAG
 CALL CC_RELEASE_ALL_TRIGGERED_SKILL_FLAG
 DT_CLEAR "CC_ACTION"
+;アクターフラグを破棄
+CALL CC_RELEASE_ALL_ACTOR_FLAG
 
 RETURN WINNER
 ; #endregion
diff --git a/ERB/TRAIN/CLOSE_COMBAT/ENEMY_DATA/CC_ENEMY_AI.ERB b/ERB/TRAIN/CLOSE_COMBAT/ENEMY_DATA/CC_ENEMY_AI.ERB
index 7c108b93dbc9f889d5461f66df6823f84190390a..ee4176eec8abde83b78ae60b4b040f0fd0002bfe 100644
--- a/ERB/TRAIN/CLOSE_COMBAT/ENEMY_DATA/CC_ENEMY_AI.ERB
+++ b/ERB/TRAIN/CLOSE_COMBAT/ENEMY_DATA/CC_ENEMY_AI.ERB
@@ -269,3 +269,87 @@ SELECTCASE RAND_WT_RESULT()
         NEXT
 ENDSELECT
 
+
+;-------------------------------------------------
+;;; ルーチン行動用AI  
+;;; @CREATE_CC_ENEMY_ROUTINE_TABLEと@CC_ADD_ENEMY_ROUTINEで事前登録したルーチンに従って行動する
+;-------------------------------------------------
+@CC_ENEMY_AI_ROUTINE(CHARA_DID)
+#DIM  CHARA_DID
+#DIMS DB_NAME
+#DIMS  MODE
+#DIM  SEQUENCE
+#DIM  CANDIDATE_NUM
+#DIM  CANDIDATE, 10
+#DIM  SELECTED
+#DIM  WEIGHT
+#DIMS ENEMY_SELECTED_SKILL
+
+#DIM MAX_HP
+#DIM HP
+
+MODE = %DT_CELL_GETS("CC_ACTOR", CHARA_DID, "ENEMY_AI_ROUTINE_MODE", 1)%
+SEQUENCE = DT_CELL_GET("CC_ACTOR", CHARA_DID, "ENEMY_AI_ROUTINE_SEQUENCE", 1)
+DB_NAME '= @"CC_ENEMY_ROUTINE_TABLE_%DT_CELL_GETS("CC_ACTOR", CHARA_DID, "ENEMY_DEF_NAME", 1)%"
+
+;条件判定に使いそうな情報を展開
+MAX_HP = DT_CELL_GET("CC_ACTOR", CHARA_DID, "MAX_HP", 1)
+HP = DT_CELL_GET("CC_ACTOR", CHARA_DID, "HP", 1)
+
+;DEBUGPRINTFORML MODE = %MODE%, SEQUENCE = {SEQUENCE}
+CANDIDATE_NUM = DT_SELECT(DB_NAME, @"MODE = '%MODE%' AND SEQUENCE = {SEQUENCE}",, CANDIDATE)
+
+;シーケンスが末尾を超えているなら0に戻して再取得
+IF CANDIDATE_NUM == 0
+    SEQUENCE = 0
+    CANDIDATE_NUM = DT_SELECT(DB_NAME, @"MODE = '%MODE%' AND SEQUENCE = {SEQUENCE}",, CANDIDATE)
+ENDIF
+;DEBUGPRINTFORML CANDIDATE_NUM = {CANDIDATE_NUM}
+CALL RAND_WT_INIT()
+FOR LOCAL, 0, CANDIDATE_NUM
+    WEIGHT = DT_CELL_GET(DB_NAME, CANDIDATE:LOCAL, "WEIGHT", 1)
+
+    ;CONDITIONに指定した条件を満たさない場合は重み0
+    ;DEBUGPRINTFORML %DT_CELL_GETS(DB_NAME, CANDIDATE:LOCAL, "CONDITION", 1)% = {TOINT(STRFORM(DT_CELL_GETS(DB_NAME, CANDIDATE:LOCAL, "CONDITION", 1)))}
+    SIF !TOINT(STRFORM(DT_CELL_GETS(DB_NAME, CANDIDATE:LOCAL, "CONDITION", 1)))
+        WEIGHT = 0
+    
+    ;要求トークンを満たさない場合は重み0
+    CALL CC_CHECK_REQTOKEN_TOCAST(CHARA_DID, DT_CELL_GETS(DB_NAME, CANDIDATE:LOCAL, "SKILL_DEF_NAME", 1), スキル_ジャンル_戦闘)
+    SIF !RESULT
+        WEIGHT = 0
+
+    ;DEBUGPRINTFORML {LOCAL}: WEIGHT ={WEIGHT}
+    CALL RAND_WT_SET(LOCAL, WEIGHT)
+NEXT
+
+SELECTED = RAND_WT_RESULT()
+;候補なしの場合は通常攻撃
+IF SELECTED == -1
+    ENEMY_SELECTED_SKILL '= ""
+ELSE
+    ENEMY_SELECTED_SKILL = %DT_CELL_GETS(DB_NAME, CANDIDATE:SELECTED, "SKILL_DEF_NAME", 1)%
+ENDIF
+
+SIF ENEMY_SELECTED_SKILL == "NORMAL_ATTACK"
+    ENEMY_SELECTED_SKILL '= ""
+
+;DEBUGPRINTFORML ENEMY_SELECTED_SKILL %ENEMY_SELECTED_SKILL%
+DT_CELL_SET "CC_ACTOR", CHARA_DID, "ENEMY_SELECTED_SKILL", ENEMY_SELECTED_SKILL, 1
+
+DT_CELL_SET "CC_ACTOR", CHARA_DID, "ENEMY_AI_ROUTINE_SEQUENCE", SEQUENCE + 1, 1
+
+;-------------------------------------------------
+;;; ルーチンモード変更
+;;; #### 入力パラメータ
+;;; - **<必須>** CHARA_DID: アクターID
+;;; - **<必須>** MODE: 変更後のモードを文字列で指定
+;;; - **<任意>** SEQUENCE: 変更後の初期シーケンスを指定(非指定時0)
+;-------------------------------------------------
+@CC_SET_ENEMY_AI_ROUTINE_MODE(CHARA_DID, MODE, SEQUENCE = 0)
+#DIM  CHARA_DID
+#DIMS MODE
+#DIM  SEQUENCE
+
+DT_CELL_SET "CC_ACTOR", CHARA_DID, "ENEMY_AI_ROUTINE_MODE", MODE, 1
+DT_CELL_SET "CC_ACTOR", CHARA_DID, "ENEMY_AI_ROUTINE_SEQUENCE", SEQUENCE, 1
\ No newline at end of file