code:
;-------------------------------------------------
; 所持武器を管理するテーブル
; 同じ構成で装備品データを管理するテーブルを作成する際に利用するため、
; DB_NAMEを引数で取れるように
;-------------------------------------------------
@CREATE_WEAPON_STOCK_TABLE(DB_NAME = "WEAPON_STOCK")
#DIMS DB_NAME

DT_CREATE DB_NAME
IF DT_COLUMN_EXIST(DB_NAME, "WEAPON_ID") > 0
    ;v0.244追加項目
    IF !DT_COLUMN_EXIST("WEAPON_STOCK", "PASSIVE_WEAPON_SKILL")
        DT_COLUMN_ADD "WEAPON_STOCK", "PASSIVE_WEAPON_SKILL"
    ENDIF
    IF !DT_COLUMN_EXIST("WEAPON_STOCK", "ACTIVE_WEAPON_SKILL")
        DT_COLUMN_ADD "WEAPON_STOCK", "ACTIVE_WEAPON_SKILL"
    ENDIF
    ;v0.272追加項目
    IF !DT_COLUMN_EXIST("WEAPON_STOCK", "EQUIP_TYPE")
        DT_COLUMN_ADD "WEAPON_STOCK", "EQUIP_TYPE", "int16"
        DT_SELECT "WEAPON_STOCK"
        ;後から追加した列は初期値がNULLなので0初期化
        FOR LOCAL, 0, RESULT
            DT_CELL_SET "WEAPON_STOCK", RESULT:(1 + LOCAL), "EQUIP_TYPE", 0, 1
        NEXT
    ENDIF
    ;v0.280追加項目
    IF !DT_COLUMN_EXIST("WEAPON_STOCK", "EQUIP_SLOT_ID")
        DT_COLUMN_ADD "WEAPON_STOCK", "EQUIP_SLOT_ID", "int16"
        DT_SELECT "WEAPON_STOCK"
        ;後から追加した列は初期値がNULLなので0初期化
        FOR LOCAL, 0, RESULT
            DT_CELL_SET "WEAPON_STOCK", RESULT:(1 + LOCAL), "EQUIP_SLOT_ID", 0, 1
        NEXT
    ENDIF
    ;v0.282追加項目
    IF !DT_COLUMN_EXIST("WEAPON_STOCK", "PRICE")
        DT_COLUMN_ADD "WEAPON_STOCK", "PRICE", "int64"
        DT_SELECT "WEAPON_STOCK"
        ;後から追加した列は初期値がNULLなので0初期化
        FOR LOCAL, 0, RESULT
            DT_CELL_SET "WEAPON_STOCK", RESULT:(1 + LOCAL), "PRICE", 0, 1
        NEXT
    ENDIF
    IF !DT_COLUMN_EXIST("WEAPON_STOCK", "ON_SALE_FLAG")
        DT_COLUMN_ADD "WEAPON_STOCK", "ON_SALE_FLAG", "int16"
        ;後から追加した列は初期値がNULLなので0初期化
        DT_SELECT "WEAPON_STOCK"
        FOR LOCAL, 0, RESULT
            DT_CELL_SET "WEAPON_STOCK", RESULT:(1 + LOCAL), "ON_SALE_FLAG", 0, 1
        NEXT
    ENDIF
    ;v0.340追加項目
    IF !DT_COLUMN_EXIST("WEAPON_STOCK", "PASSIVE_SKILL_SLOT")
        DT_COLUMN_ADD "WEAPON_STOCK", "PASSIVE_SKILL_SLOT", "int16"
        ;後から追加した列は初期値がNULLなので0初期化
        DT_SELECT "WEAPON_STOCK"
        FOR LOCAL, 0, RESULT
            DT_CELL_SET "WEAPON_STOCK", RESULT:(1 + LOCAL), "PASSIVE_SKILL_SLOT", 0, 1
        NEXT
    ENDIF
    IF !DT_COLUMN_EXIST("WEAPON_STOCK", "PASSIVE_SKILL_SLOT_USED")
        DT_COLUMN_ADD "WEAPON_STOCK", "PASSIVE_SKILL_SLOT_USED", "int16"
        ;後から追加した列は初期値がNULLなので0初期化
        DT_SELECT "WEAPON_STOCK"
        FOR LOCAL, 0, RESULT
            DT_CELL_SET "WEAPON_STOCK", RESULT:(1 + LOCAL), "PASSIVE_SKILL_SLOT_USED", 0, 1
        NEXT
    ENDIF
    IF !DT_COLUMN_EXIST("WEAPON_STOCK", "PASSIVE_SKILL_SLOT_USED_SKILL_NAME")
        DT_COLUMN_ADD "WEAPON_STOCK", "PASSIVE_SKILL_SLOT_USED_SKILL_NAME"
        ;後から追加した列は初期値がNULLなのでSPACE初期化
        DT_SELECT "WEAPON_STOCK"
        FOR LOCAL, 0, RESULT
            DT_CELL_SET "WEAPON_STOCK", RESULT:(1 + LOCAL), "PASSIVE_SKILL_SLOT_USED_SKILL_NAME", "", 1
        NEXT
    ENDIF
    IF !DT_COLUMN_EXIST("WEAPON_STOCK", "ACTIVE_SKILL_SLOT")
        DT_COLUMN_ADD "WEAPON_STOCK", "ACTIVE_SKILL_SLOT", "int16"
        ;後から追加した列は初期値がNULLなので0初期化
        DT_SELECT "WEAPON_STOCK"
        FOR LOCAL, 0, RESULT
            DT_CELL_SET "WEAPON_STOCK", RESULT:(1 + LOCAL), "ACTIVE_SKILL_SLOT", 0, 1
        NEXT
    ENDIF
    IF !DT_COLUMN_EXIST("WEAPON_STOCK", "ACTIVE_SKILL_SLOT_USED")
        DT_COLUMN_ADD "WEAPON_STOCK", "ACTIVE_SKILL_SLOT_USED", "int16"
        ;後から追加した列は初期値がNULLなので0初期化
        DT_SELECT "WEAPON_STOCK"
        FOR LOCAL, 0, RESULT
            DT_CELL_SET "WEAPON_STOCK", RESULT:(1 + LOCAL), "ACTIVE_SKILL_SLOT_USED", 0, 1
        NEXT
    ENDIF
    IF !DT_COLUMN_EXIST("WEAPON_STOCK", "ACTIVE_SKILL_SLOT_USED_SKILL_NAME")
        DT_COLUMN_ADD "WEAPON_STOCK", "ACTIVE_SKILL_SLOT_USED_SKILL_NAME"
        ;後から追加した列は初期値がNULLなのでSPACE初期化
        DT_SELECT "WEAPON_STOCK"
        FOR LOCAL, 0, RESULT
            DT_CELL_SET "WEAPON_STOCK", RESULT:(1 + LOCAL), "ACTIVE_SKILL_SLOT_USED_SKILL_NAME", "", 1
        NEXT
    ENDIF
    ;v0.350追加項目
    IF !DT_COLUMN_EXIST("WEAPON_STOCK", "FAVORITE_FLAG")
        DT_COLUMN_ADD "WEAPON_STOCK", "FAVORITE_FLAG", "int16"
        ;後から追加した列は初期値がNULLなので0初期化
        DT_SELECT "WEAPON_STOCK"
        FOR LOCAL, 0, RESULT
            DT_CELL_SET "WEAPON_STOCK", RESULT:(1 + LOCAL), "FAVORITE_FLAG", 0, 1
        NEXT
    ENDIF
    RETURN 0
ENDIF

DT_COLUMN_ADD DB_NAME, "WEAPON_ID" ,"int16"
DT_COLUMN_ADD DB_NAME, "WEAPON_NAME"
DT_COLUMN_ADD DB_NAME, "MATERIAL" ,"int16"
DT_COLUMN_ADD DB_NAME, "WEAPON_RANK" ,"int16"
DT_COLUMN_ADD DB_NAME, "EQUIP_CHARA_ID" ,"int16"
DT_COLUMN_ADD DB_NAME, "PASSIVE_WEAPON_SKILL"
DT_COLUMN_ADD DB_NAME, "ACTIVE_WEAPON_SKILL"
DT_COLUMN_ADD DB_NAME, "PASSIVE_SKILL_SLOT" ,"int16"
DT_COLUMN_ADD DB_NAME, "PASSIVE_SKILL_SLOT_USED" ,"int16"
DT_COLUMN_ADD DB_NAME, "PASSIVE_SKILL_SLOT_USED_SKILL_NAME"
DT_COLUMN_ADD DB_NAME, "ACTIVE_SKILL_SLOT" ,"int16"
DT_COLUMN_ADD DB_NAME, "ACTIVE_SKILL_SLOT_USED" ,"int16"
DT_COLUMN_ADD DB_NAME, "ACTIVE_SKILL_SLOT_USED_SKILL_NAME"
DT_COLUMN_ADD DB_NAME, "EQUIP_TYPE" ,"int16"
DT_COLUMN_ADD DB_NAME, "EQUIP_SLOT_ID" ,"int16"
DT_COLUMN_ADD DB_NAME, "PRICE" ,"int64"
DT_COLUMN_ADD DB_NAME, "ON_SALE_FLAG" ,"int16"
DT_COLUMN_ADD DB_NAME, "FAVORITE_FLAG" ,"int16"

RETURN 1

;-------------------------------------------------
; 未入手装備品を管理するための参照用テーブル
;-------------------------------------------------
@CREATE_EQUIP_DATA_TABLE
#DIMS CONST DB_NAME = "EQUIP_DATA"

;WEAPON_STOCK_TABLEを再利用
CALL CREATE_WEAPON_STOCK_TABLE("EQUIP_DATA")

DT_CREATE DB_NAME
;装備情報をを一意で名称から引けるよう列追加
DT_COLUMN_ADD DB_NAME, "WEAPON_DEF_NAME"
;定義済みデータを読み込み
CALL ADD_EQUIP_DATA
RETURN 1

;-------------------------------------------------
; エンチャントルーンを管理するテーブル
;-------------------------------------------------
@CREATE_RUNE_STOCK_TABLE
#DIMS CONST DB_NAME = "RUNE_STOCK"

DT_CREATE DB_NAME
DT_COLUMN_ADD DB_NAME, "SKILL_DEF_NAME" ,"string"
DT_COLUMN_ADD DB_NAME, "WPN_SKILL_GENRE" ,"int16"
DT_COLUMN_ADD DB_NAME, "SKILL_LV" ,"int16"
DT_COLUMN_ADD DB_NAME, "AMOUNT" ,"int16"
RETURN 1

;-------------------------------------------------
; 交易品販売商品の在庫を管理するテーブル
;-------------------------------------------------
@CREATE_TRADE_STOCK_TABLE
#DIMS CONST DB_NAME = "TRADE_STOCK"

DT_CREATE DB_NAME
DT_COLUMN_ADD DB_NAME, "CATEGORY" ,"int16"
DT_COLUMN_ADD DB_NAME, "ITEM_ID" ,"int16"
DT_COLUMN_ADD DB_NAME, "WEAPON_DID" ,"int16"
DT_COLUMN_ADD DB_NAME, "ITEM_NAME"
DT_COLUMN_ADD DB_NAME, "AMOUNT" ,"int16"
DT_COLUMN_ADD DB_NAME, "PRICE" ,"int16"

RETURN 1

;-------------------------------------------------
; 戦闘イベント用アクター管理テーブル
;-------------------------------------------------
@CREATE_CC_ACTOR_TABLE
#DIMS CONST DB_NAME = "CC_ACTOR"
{
    #DIMS CONST COLUMN =
        "CHARA_ID",
        "CHARA_NAME",
        "SIDE",
        "PLACEMENT",
        "FACTION",
        "STATE",
        "SUBSTATE",
        "MAX_HP",
        "HP",
        "STR",
        "MAG",
        "ATTACK",
        "DEFENCE",
        "ARMOR",
        "AGILITY",
        "HATE_RATE",
        "TARGETING",
        "CRITICAL_RATE",
        "CRITICAL_DAMAGE_RATE",
        "SKILL_LIST",
        "SELECTED_SKILL_SLOT",
        "SELECTED_SKILL_TARGET",
        "WPN_PASSIVE_SKILLS",
        "RELIC_1_PASSIVE_SKILLS",
        "RELIC_2_PASSIVE_SKILLS",
        "ENEMY_TYPE",
        "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",
        "TEMP_WEAPON",
        "MEAL_EFFECT_ID",
        "REGIST_POISON",
        "REGIST_BURN",
        "REGIST_STUN",
        "REGIST_CHARM",
        "REGIST_PANIC",
        "REGIST_BLIND",
        "REGIST_DEATH",
        "EFFECT",
        "SHOW_PORTRAIT",
        "PORTRAIT_EFFECT",
        "PORTRAIT_OPTIONS",
        "IS_PLAYABLE",
        "WEAPON_DID"
}
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_DEF_NAME", "ENEMY_AI_ROUTINE_MODE", "ENEMY_ACTIVE_SKILL", "ENEMY_PASSIVE_SKILL", "ENEMY_SELECTED_SKILL", "ENEMY_AI", "DROP_ITEM_LIST", "WPN_PASSIVE_SKILLS", "RELIC_1_PASSIVE_SKILLS", "RELIC_2_PASSIVE_SKILLS")
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "string"
    ELSEIF GROUPMATCH(COLUMN:LOCAL, "WEAPON_DID")
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "int64"
    ELSEIF GROUPMATCH(COLUMN:LOCAL, "HP", "MAX_HP", "BARRIER")
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "int32"
    ELSE
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "int16"
    ENDIF
NEXT

RETURN 1

;-------------------------------------------------
; 各要素から算出したキャラクターのステータスを格納する参照用テーブル
;-------------------------------------------------
@CREATE_CHARA_STATUS_TABLE
#DIMS CONST DB_NAME = "CHARA_STATUS"
{
    #DIMS CONST COLUMN =
        "CHARA_ID",
        "CHARA_NAME",
        "MAX_HP",
        "HP",
        "STR",
        "MAG",
        "ATTACK",
        "DEFENCE",
        "ARMOR",
        "AGILITY",
        "CRITICAL_RATE",
        "CRITICAL_DAMAGE_RATE",
        "HATE_RATE",
        "TARGETING",
        "REGIST_POISON",
        "REGIST_STUN",
        "REGIST_BURN",
        "REGIST_CHARM",
        "REGIST_PANIC",
        "REGIST_BLIND",
        "REGIST_DEATH",
}
DT_CREATE DB_NAME
FOR LOCAL, 0, VARSIZE("COLUMN")
    IF GROUPMATCH(COLUMN:LOCAL, "CHARA_NAME")
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "string"
    ELSEIF GROUPMATCH(COLUMN:LOCAL, "HP", "MAX_HP")
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "int32"
    ELSE
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "int16"
    ENDIF
NEXT

RETURN 1

;-------------------------------------------------
; エネミーデータ格納用テーブル
;-------------------------------------------------
@CREATE_CC_ENEMY_DATA_TABLE
#DIMS CONST DB_NAME = "ENEMY_DATA"
{
    #DIMS CONST COLUMN =
        "ENEMY_DEF_NAME",
        "ENEMY_NAME",
        "ENEMY_TYPE",
        "MAX_HP",
        "STR",
        "MAG",
        "ATTACK",
        "DEFENCE",
        "ARMOR",
        "AGILITY",
        "HATE_RATE",
        "TARGETING",
        "REGIST_POISON",
        "REGIST_STUN",
        "REGIST_BURN",
        "REGIST_CHARM",
        "REGIST_PANIC",
        "REGIST_BLIND",
        "REGIST_DEATH",
        "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_NAME", "ENEMY_PASSIVE_SKILL", "ENEMY_ACTIVE_SKILL", "ENEMY_AI", "ENEMY_AI_ROUTINE_MODE", "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"
    ELSE
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "int16"
    ENDIF
NEXT
;定義エネミーデータをテーブルに追加
;CALL CC_ENEMY_DATA()
CALL CC_ENEMY_DATA_FROM_XML()

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スキル定義から取得したスキル諸情報を格納する参照用テーブル
;-------------------------------------------------
@CREATE_SKILL_PARAMS_TABLE
#DIMS CONST DB_NAME = "SKILL_PARAMS"
{
    #DIMS CONST COLUMN =
        "SKILL_DEF_NAME",
        "SKILL_NAME",
        "SKILL_LV",
        "EFFECT_RATE",
        "EFFECT_RATE2",
        "EFFECT_RATE3",
        "COOLTIME",
        "REQTOKEN_TOCAST",
        "REQITEM_TOCAST",
}
DT_CREATE DB_NAME
FOR LOCAL, 0, VARSIZE("COLUMN")
    IF GROUPMATCH(COLUMN:LOCAL, "SKILL_DEF_NAME", "SKILL_NAME", "REQITEM_TOCAST", "REQTOKEN_TOCAST")
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "string"
    ELSE
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "int16"
    ENDIF
NEXT

RETURN 1

;-------------------------------------------------
; XMLスキル定義から取得した武器スキル諸情報を格納する参照用テーブル
;-------------------------------------------------
@CREATE_WPN_SKILL_PARAMS_TABLE
#DIMS CONST DB_NAME = "WPN_SKILL_PARAMS"
{
    #DIMS CONST COLUMN =
        "SKILL_DEF_NAME",
        "SKILL_NAME",
        "SKILL_LV",
        "EFFECT_RATE",
        "EFFECT_RATE2",
        "EFFECT_RATE3",
        "COOLTIME",
        "REQTOKEN_TOCAST",
        "REQITEM_TOCAST",
}
DT_CREATE DB_NAME
FOR LOCAL, 0, VARSIZE("COLUMN")
    IF GROUPMATCH(COLUMN:LOCAL, "SKILL_DEF_NAME", "SKILL_NAME", "REQITEM_TOCAST", "REQTOKEN_TOCAST")
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "string"
    ELSE
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "int16"
    ENDIF
NEXT

RETURN 1

;-------------------------------------------------
; 戦闘時のキャラクターのスキルスロットの状態を管理するテーブル
;-------------------------------------------------
@CREATE_CC_SKILL_SLOT_TABLE
#DIMS CONST DB_NAME = "CC_SKILL_SLOT"
{
    #DIMS CONST COLUMN =
        "CHARA_ID",
        "EQUIP_DID",
        "SKILL_DEF_NAME",
        "SKILL_SLOT_IDX",
        "SKILL_LV",
        "COOLTIME"
}
DT_CREATE DB_NAME
FOR LOCAL, 0, VARSIZE("COLUMN")
    IF GROUPMATCH(COLUMN:LOCAL, "SKILL_DEF_NAME")
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "string"
    ELSEIF GROUPMATCH(COLUMN:LOCAL, "EQUIP_DID")
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "int64"
    ELSE
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "int16"
    ENDIF
NEXT

RETURN 1

;-------------------------------------------------
; 戦闘イベント用トークン付与数管理テーブル
;-------------------------------------------------
@CREATE_CC_SP_TOKEN_NUM_TABLE
#DIMS CONST DB_NAME = "CC_SP_TOKEN_NUM"
#DIMS TOKEN_NAME
#DIM TOKEN_NUM

IF DT_EXIST("CC_SP_TOKEN_NUM")
    DT_CLEAR "CC_SP_TOKEN_NUM"
ENDIF

DT_CREATE DB_NAME

;処理順が定義されたトークンを先に登録(DT_COLUMN_ADDの仕様上、重複登録はされない)
TOKEN_NUM = VARSIZE("TOKEN_PRIORITY")
FOR LOCAL, 0, TOKEN_NUM
    DT_COLUMN_ADD DB_NAME, TOKEN_PRIORITY:LOCAL ,"int32"
NEXT

XML_GET XMLID_TOKEN, @"//defname/@parentname", RESULTS, 1
TOKEN_NUM = RESULT
FOR LOCAL, 0, TOKEN_NUM
    DT_COLUMN_ADD DB_NAME, RESULTS:LOCAL ,"int32"
NEXT

RETURN 1

;-------------------------------------------------
;トークン個数テーブルにキャラクターを登録
;-------------------------------------------------
@CC_SP_TOKEN_SETUP_NUM_TABLE()
#DIM DYNAMIC IDX, CC_MAX_MEMBER_NUM
#DIM DYNAMIC MEM_CNT

MEM_CNT = DT_SELECT("CC_ACTOR",,, IDX)
FOR LOCAL, 0, MEM_CNT
    ;CC_ACTORテーブルと同じIDXで個数を取得できるようにする
    DT_ROW_ADD "CC_SP_TOKEN_NUM", "ID", DT_CELL_GET("CC_ACTOR", IDX:LOCAL, "ID", 1)
NEXT

;-------------------------------------------------
; XMLスキル定義から取得したトークン情報を格納する参照用テーブルを作成
;-------------------------------------------------
@CREATE_CC_SP_TOKEN_TABLE

SIF DT_EXIST("SP_TOKEN_PARAMS")
    DT_CLEAR "SP_TOKEN_PARAMS"
SIF DT_EXIST("SP_TOKEN_SKILL_PARAMS")
    DT_CLEAR "SP_TOKEN_SKILL_PARAMS"
SIF DT_EXIST("SP_TOKEN_MODIFIER_PARAMS")
    DT_CLEAR "SP_TOKEN_MODIFIER_PARAMS"

CALL CREATE_CC_SP_TOKEN_PARAMS_TABLE
CALL CREATE_CC_SP_TOKEN_SKILL_PARAMS_TABLE
CALL CREATE_CC_SP_TOKEN_MODIFIER_PARAMS_TABLE

CALL SET_CC_SP_TOKEN_TABLES

;-------------------------------------------------
; XMLスキル定義から取得したトークン情報を格納する参照用テーブル
;-------------------------------------------------
@CREATE_CC_SP_TOKEN_PARAMS_TABLE
#DIMS CONST DB_NAME = "SP_TOKEN_PARAMS"
{
    #DIMS CONST COLUMN =
        "TOKEN_DEF_NAME",
        "TOKEN_NAME",
        "UNICODE_ICON",
        "ICON_COLOR",
        "CATEGORY",
        "BUFF_OR_DEBUFF",
        "ALLOW_MINUS_VALUE",
        "TOOLTIP",
        "IGNORE_QUANTITY",
}

DT_CREATE DB_NAME
FOR LOCAL, 0, VARSIZE("COLUMN")
    IF GROUPMATCH(COLUMN:LOCAL, "TOKEN_DEF_NAME", "TOKEN_NAME", "CATEGORY", "BUFF_OR_DEBUFF", "TOOLTIP", "UNICODE_ICON", "ICON_COLOR")
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "string"
    ELSE
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "int16"
    ENDIF
NEXT

@CC_GETS_SP_TOKEN_PARAMS(DID, COLUMN)
#FUNCTIONS
#DIM DID
#DIMS COLUMN

RETURNF DT_CELL_GETS("SP_TOKEN_PARAMS", DID, COLUMN, 1)
;-------------------------------------------------
; XMLスキル定義から取得したトークン付属スキル情報を格納する参照用テーブル
;-------------------------------------------------
@CREATE_CC_SP_TOKEN_SKILL_PARAMS_TABLE
#DIMS CONST DB_NAME = "SP_TOKEN_SKILL_PARAMS"
{
    #DIMS CONST COLUMN =
        "SKILL_DEF_NAME",
        "SKILL_NAME",
        "EXECUTE_AT",
        "TARGETING_REQUIRED",
        "OVERRIDE_TARGETING",
        "TARGETING_SIDE",
        "EFFECT_RATE",
        "FUNC_NAME",
        "PARENT_TOKEN_ID",
        "PARENT_TOKEN_NAME",
        "TRIGGER_CHANCE",
        "TRIGGER_CONDITION"
}
DT_CREATE DB_NAME
FOR LOCAL, 0, VARSIZE("COLUMN")
    IF GROUPMATCH(COLUMN:LOCAL, "PARENT_TOKEN_NAME", "SKILL_DEF_NAME", "SKILL_NAME", "EXECUTE_AT", "FUNC_NAME", "TRIGGER_CONDITION")
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "string"
    ELSEIF GROUPMATCH(COLUMN:LOCAL, "PARENT_TOKEN_ID")
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "int64"
    ELSE
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "int16"
    ENDIF
NEXT

RETURN 1

@CC_GETS_SP_TOKEN_SKILL_PARAMS(DID, COLUMN)
#FUNCTIONS
#DIM DID
#DIMS COLUMN

RETURNF DT_CELL_GETS("SP_TOKEN_SKILL_PARAMS", DID, COLUMN, 1)

@CC_GET_SP_TOKEN_SKILL_PARAMS(DID, COLUMN)
#FUNCTION
#DIM DID
#DIMS COLUMN

RETURNF DT_CELL_GET("SP_TOKEN_SKILL_PARAMS", DID, COLUMN, 1)

@CREATE_CC_SP_TOKEN_MODIFIER_PARAMS_TABLE
#DIMS CONST DB_NAME = "SP_TOKEN_MODIFIER_PARAMS"
{
    #DIMS CONST COLUMN =
        "PARENT_TOKEN_ID",
        "PARENT_TOKEN_NAME",
        "CATEGORY",
        "MODIFIED_AT",
        "FUNC_NAME",
        "EFFECT_RATE",
        "MODIFY_CHANCE",
        "MODIFY_CONDITION"
}
DT_CREATE DB_NAME
FOR LOCAL, 0, VARSIZE("COLUMN")
    IF GROUPMATCH(COLUMN:LOCAL, "PARENT_TOKEN_NAME", "CATEGORY", "MODIFIED_AT", "FUNC_NAME", "MODIFY_CONDITION")
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "string"
    ELSEIF GROUPMATCH(COLUMN:LOCAL, "PARENT_TOKEN_ID")
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "int64"
    ELSE
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "int16"
    ENDIF
NEXT

RETURN 1

@CC_GETS_SP_TOKEN_MODIFIER_PARAMS(DID, COLUMN)
#FUNCTIONS
#DIM DID
#DIMS COLUMN

RETURNF DT_CELL_GETS("SP_TOKEN_MODIFIER_PARAMS", DID, COLUMN, 1)

@CC_GET_SP_TOKEN_MODIFIER_PARAMS(DID, COLUMN)
#FUNCTION
#DIM DID
#DIMS COLUMN

RETURNF DT_CELL_GET("SP_TOKEN_MODIFIER_PARAMS", DID, COLUMN, 1)

;-------------------------------------------------
; トークン情報テーブルへの登録
;-------------------------------------------------
@SET_CC_SP_TOKEN_TABLES
#DIM TOKEN_NUM
#DIMS _XML_TOKEN, SP_TOKEN_MAX_TYPE
#DIM TOKEN_SKILL_NUM
#DIMS _XML_SKILL, SP_TOKEN_MAX_SKILL
#DIM TOKEN_MODIFIER_NUM
#DIMS _XML_MODIFIER, SP_TOKEN_MAX_MODIFIER
#DIMS PARENT_TOKEN_NAME
#DIM  PARENT_TOKEN_ID

TOKEN_NUM = XML_GET(XMLID_TOKEN, "//defname", _XML_TOKEN, 3)
SIF TOKEN_NUM > SP_TOKEN_MAX_TYPE
    THROW XMLで定義されたトークンの種類がSP_TOKEN_MAX_TYPE({SP_TOKEN_MAX_TYPE})を超過しました

;DEBUGPRINTFORML TOKEN_NUM {TOKEN_NUM}
VARI I
VARI J
FOR I, 0, TOKEN_NUM

    CALL SET_CC_SP_TOKEN_PARAMS_TABLE(_XML_TOKEN:I)
    PARENT_TOKEN_ID = RESULT
    XML_GET _XML_TOKEN:I, "//defname/@parentname", PARENT_TOKEN_NAME, 1

    TOKEN_SKILL_NUM = XML_GET(XMLID_TOKEN, @"//defname[@parentname='%PARENT_TOKEN_NAME%']/triggeredskill", _XML_SKILL, 3)
    IF TOKEN_SKILL_NUM != 0
        SIF TOKEN_SKILL_NUM > SP_TOKEN_MAX_SKILL
            THROW XMLで定義されたトークン[%PARENT_TOKEN_NAME%]のスキルの種類がSP_TOKEN_MAX_SKILL({SP_TOKEN_MAX_SKILL})を超過しました

        FOR J, 0, TOKEN_SKILL_NUM
            CALL SET_CC_SP_TOKEN_SKILL_PARAMS_TABLE(PARENT_TOKEN_NAME, PARENT_TOKEN_ID, _XML_SKILL:J)
        NEXT
    ENDIF

    TOKEN_MODIFIER_NUM = XML_GET(XMLID_TOKEN, @"//defname[@parentname='%PARENT_TOKEN_NAME%']/modifier", _XML_MODIFIER, 3)
    ;DEBUGPRINTFORML PARENT_TOKEN_NAME %PARENT_TOKEN_NAME% TOKEN_MODIFIER_NUM {TOKEN_MODIFIER_NUM} _XML_MODIFIER %_XML_MODIFIER%
    IF TOKEN_MODIFIER_NUM != 0
        SIF TOKEN_MODIFIER_NUM > SP_TOKEN_MAX_MODIFIER
            THROW XMLで定義されたトークン[%PARENT_TOKEN_NAME%]のスキルの種類がSP_TOKEN_MAX_MODIFIER({SP_TOKEN_MAX_MODIFIER})を超過しました

        FOR J, 0, TOKEN_MODIFIER_NUM
            CALL SET_CC_SP_TOKEN_MODIFIER_PARAMS_TABLE(PARENT_TOKEN_NAME, PARENT_TOKEN_ID, _XML_MODIFIER:J)
        NEXT
    ENDIF
NEXT

@SET_CC_SP_TOKEN_PARAMS_TABLE(_XML_TOKEN)
#DIMS _XML_TOKEN

#DIMS DYNAMIC TOKEN_DEF_NAME
#DIMS DYNAMIC TOKEN_NAME
#DIMS DYNAMIC UNICODE_ICON
#DIMS DYNAMIC ICON_COLOR
#DIMS DYNAMIC CATEGORY
#DIMS DYNAMIC BUFF_OR_DEBUFF
#DIMS DYNAMIC TOOLTIP
#DIM  DYNAMIC ALLOW_MINUS_VALUE
#DIM  DYNAMIC IGNORE_QUANTITY
#DIMS DYNAMIC XML_ICON, SP_TOKEN_MAX_LAYER
#DIMS DYNAMIC DISP_CATEGORY
#DIM DYNAMIC  DISP_CATEGORY_COLOR
VARSET RESULTS

XML_GET _XML_TOKEN, "//defname/@parentname", TOKEN_DEF_NAME, 1
XML_GET _XML_TOKEN, "//tokenname", TOKEN_NAME, 1
XML_GET _XML_TOKEN, "//category", CATEGORY, 1
XML_GET _XML_TOKEN, "//buffDebuff", BUFF_OR_DEBUFF, 1
XML_GET _XML_TOKEN, "//tooltip", TOOLTIP, 1
XML_GET _XML_TOKEN, "//allowMinusValue", RESULTS, 1
ALLOW_MINUS_VALUE = TOINT(RESULTS)
XML_GET _XML_TOKEN, "//ignoreQuantity", RESULTS, 1
IGNORE_QUANTITY = TOINT(RESULTS)

VARI ICON_LAYER_NUM
ICON_LAYER_NUM = XML_GET(_XML_TOKEN, "//unicodeIcon", XML_ICON, 3)
SIF ICON_LAYER_NUM > SP_TOKEN_MAX_LAYER
    THROW アイコンのレイヤー数が最大値(SP_TOKEN_MAX_LAYER = {SP_TOKEN_MAX_LAYER})を超過しました

FOR LOCAL, 0, ICON_LAYER_NUM
    ;DEBUGPRINTFORML XML_ICON:{LOCAL} %XML_ICON:LOCAL%
    XML_GET XML_ICON:LOCAL, "//@unicode", RESULTS, 1
    UNICODE_ICON = %LIST_ADD(UNICODE_ICON, RESULTS)%
    XML_GET XML_ICON:LOCAL, "//@color", RESULTS, 1
    ICON_COLOR = %LIST_ADD(ICON_COLOR, RESULTS)%
    ;DEBUGPRINTFORML UNICODE_ICON %UNICODE_ICON%
    ;DEBUGPRINTFORML ICON_COLOR %ICON_COLOR%
NEXT

{
    DT_ROW_ADD "SP_TOKEN_PARAMS"
        ,"TOKEN_DEF_NAME", TOKEN_DEF_NAME
        ,"TOKEN_NAME", TOKEN_NAME
        ,"UNICODE_ICON", UNICODE_ICON
        ,"ICON_COLOR", ICON_COLOR
        ,"CATEGORY", CATEGORY
        ,"BUFF_OR_DEBUFF", BUFF_OR_DEBUFF
        ,"TOOLTIP", TOOLTIP
        ,"ALLOW_MINUS_VALUE", ALLOW_MINUS_VALUE
        ,"IGNORE_QUANTITY", IGNORE_QUANTITY
}
RETURN RESULT

@SET_CC_SP_TOKEN_SKILL_PARAMS_TABLE(PARENT_TOKEN_NAME, PARENT_TOKEN_ID, _XML_SKILL)
#DIMS PARENT_TOKEN_NAME
#DIM  PARENT_TOKEN_ID
#DIMS _XML_SKILL

#DIMS DYNAMIC SKILL_DEF_NAME
#DIMS DYNAMIC SKILL_NAME
#DIMS DYNAMIC EXECUTE_AT
#DIM DYNAMIC TARGETING_REQUIRED
#DIM DYNAMIC OVERRIDE_TARGETING
#DIM DYNAMIC TARGETING_SIDE
#DIM DYNAMIC EFFECT_RATE
#DIM DYNAMIC CONTINUE_ATTACK_EVENIF_DIED
#DIMS DYNAMIC FUNC_NAME
#DIM DYNAMIC TRIGGER_CHANCE
#DIMS DYNAMIC TRIGGER_CONDITION
VARSET RESULTS

XML_GET _XML_SKILL, "//triggeredskill/@parentname", SKILL_DEF_NAME, 1
XML_GET _XML_SKILL, "//skillname", SKILL_NAME, 1
XML_GET _XML_SKILL, "//executeAt", EXECUTE_AT, 1
XML_GET _XML_SKILL, "//func", FUNC_NAME, 1
SIF XML_GET(_XML_SKILL, "//targetingRequired", RESULTS, 1)
    TARGETING_REQUIRED = TOINT(RESULTS)
SIF XML_GET(_XML_SKILL, "//overrideTargeting", RESULTS, 1)
    OVERRIDE_TARGETING = TOINT(RESULTS)
SIF XML_GET(_XML_SKILL, "//targetingSide", RESULTS, 1)
TARGETING_SIDE = TOINT(RESULTS)
SIF XML_GET(_XML_SKILL, "//rate", RESULTS, 1)
    EFFECT_RATE = TOINT(RESULTS)
SIF XML_GET(_XML_SKILL, "//triggerChance", RESULTS, 1)
    TRIGGER_CHANCE = TOINT(RESULTS)
XML_GET _XML_SKILL, "//triggerCondition", TRIGGER_CONDITION, 1

{
    DT_ROW_ADD "SP_TOKEN_SKILL_PARAMS"
        ,"SKILL_DEF_NAME", SKILL_DEF_NAME
        ,"SKILL_NAME", SKILL_NAME
        ,"EXECUTE_AT", EXECUTE_AT
        ,"TARGETING_REQUIRED", TARGETING_REQUIRED
        ,"OVERRIDE_TARGETING", OVERRIDE_TARGETING
        ,"TARGETING_SIDE", TARGETING_SIDE
        ,"EFFECT_RATE", EFFECT_RATE
        ,"FUNC_NAME", FUNC_NAME
        ,"PARENT_TOKEN_NAME", PARENT_TOKEN_NAME
        ,"PARENT_TOKEN_ID", PARENT_TOKEN_ID
        ,"TRIGGER_CHANCE", TRIGGER_CHANCE
        ,"TRIGGER_CONDITION", TRIGGER_CONDITION
}

@SET_CC_SP_TOKEN_MODIFIER_PARAMS_TABLE(PARENT_TOKEN_NAME, PARENT_TOKEN_ID, _XML_SKILL)
#DIMS PARENT_TOKEN_NAME
#DIM  PARENT_TOKEN_ID
#DIMS _XML_SKILL

#DIMS DYNAMIC SKILL_DEF_NAME
#DIMS DYNAMIC SKILL_NAME
#DIMS DYNAMIC CATEGORY
#DIMS DYNAMIC MODIFIED_AT
#DIM DYNAMIC TARGETING_REQUIRED
#DIM DYNAMIC OVERRIDE_TARGETING
#DIM DYNAMIC TARGETING_SIDE
#DIM DYNAMIC EFFECT_RATE
#DIM DYNAMIC CONTINUE_ATTACK_EVENIF_DIED
#DIMS DYNAMIC FUNC_NAME
#DIM DYNAMIC MODIFY_CHANCE
#DIMS DYNAMIC MODIFY_CONDITION
VARSET RESULTS

XML_GET _XML_SKILL, "//modifier/@category", CATEGORY, 1
XML_GET _XML_SKILL, "//modifier/@modifiedAt", MODIFIED_AT, 1
XML_GET _XML_SKILL, "//modifierFunction", FUNC_NAME, 1
XML_GET _XML_SKILL, "//rate", RESULTS, 1
EFFECT_RATE = TOINT(RESULTS)
IF XML_GET(_XML_SKILL, "//modifyChance", RESULTS, 1)
    MODIFY_CHANCE = TOINT(RESULTS)
ELSE
    MODIFY_CHANCE = 100
ENDIF
XML_GET _XML_SKILL, "//modifyCondition", MODIFY_CONDITION, 1

{
    DT_ROW_ADD "SP_TOKEN_MODIFIER_PARAMS"
        ,"PARENT_TOKEN_NAME", PARENT_TOKEN_NAME
        ,"PARENT_TOKEN_ID", PARENT_TOKEN_ID
        ,"CATEGORY", CATEGORY
        ,"MODIFIED_AT", MODIFIED_AT
        ,"EFFECT_RATE", EFFECT_RATE
        ,"FUNC_NAME", FUNC_NAME
        ,"MODIFY_CHANCE", MODIFY_CHANCE
        ,"MODIFY_CONDITION", MODIFY_CONDITION
}

;-------------------------------------------------
; キャラクターの衣装ドロア
;-------------------------------------------------
@CREATE_CLOTH_DRAWER_TABLE
#DIMS CONST DB_NAME = "CLOTH_DRAWER"
{
    #DIMS CONST COLUMN =
        "CLOTH_ID",
        "PARTS_IDX",
        "OWNER_CHARA_UID",
        "PRESET_LIST"
}
DT_CREATE DB_NAME
FOR LOCAL, 0, VARSIZE("COLUMN")
    IF GROUPMATCH(COLUMN:LOCAL, "PRESET_LIST")
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "string"
    ELSE
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "int32"
    ENDIF
NEXT
RETURN 1

;-------------------------------------------------
; 加工指示
;-------------------------------------------------
@CREATE_CRAFT_ORDER_TABLE
#DIMS CONST DB_NAME = "CRAFT_ORDER"
{
    #DIMS CONST COLUMN =
        "ITEM_ID",
        "MODULE_LIST_IDX",
        "RECIPE_NO",
        "TARGET_NUM",
        "IS_ACTIVE"
}
DT_CREATE DB_NAME
FOR LOCAL, 0, VARSIZE("COLUMN")
    IF GROUPMATCH(COLUMN:LOCAL, "PRESET_LIST")
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "string"
    ELSE
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "int32"
    ENDIF
NEXT
DEBUGPRINTFORML DATATABLE "CRAFT_ORDER" IS CREATED
RETURN 1

;-------------------------------------------------
; エリア・設備メニューのソート用テーブル
;-------------------------------------------------
@CREATE_HO_EDIT_CRAFT_ITEM_TABLE
#DIMS CONST DB_NAME = "EDIT_CRAFT_ITEM"
{
    #DIMS CONST COLUMN =
        "ITEM_ID",
        "ITEM_TYPE",
        "ITEMNUM",
        "ROOM_TAG",
        "USAGE_TAG",
        "LIMITATION_TAG",
        "ELEMENT_TAG",
}
DT_CREATE DB_NAME
FOR LOCAL, 0, VARSIZE("COLUMN")
    IF GROUPMATCH(COLUMN:LOCAL, "ROOM_TAG", "USAGE_TAG", "LIMITATION_TAG", "ELEMENT_TAG")
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "string"
    ELSE
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "int32"
    ENDIF
NEXT
RETURN 1

;-------------------------------------------------
;;; 口上デイリー管理用テーブル
;-------------------------------------------------
@CREATE_KOJO_DAILY_TABLE
#DIMS CONST DB_NAME = "KOJO_DAILY"
{
    #DIMS CONST COLUMN =
        "KOJO_ID",
        "GENRE",
        "RATE",
        "EVENT_NAME_ENG",
        "EVENT_NAME_JP"
}
DT_CREATE DB_NAME
FOR LOCAL, 0, VARSIZE("COLUMN")
    IF GROUPMATCH(COLUMN:LOCAL, "EVENT_NAME_ENG", "EVENT_NAME_JP")
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "string"
    ELSE
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "int16"
    ENDIF
NEXT

;-------------------------------------------------
; 口上デイリーイベントの非活性管理
;-------------------------------------------------
@CREATE_KOJO_DAILY_DISABLE_TABLE
#DIMS CONST DB_NAME = "KOJO_DAILY_DISABLE"
{
    #DIMS CONST COLUMN =
        "KOJO_ID",
        "EVENT_NAME_ENG"
}
DT_CREATE DB_NAME
FOR LOCAL, 0, VARSIZE("COLUMN")
    IF GROUPMATCH(COLUMN:LOCAL, "EVENT_NAME_ENG")
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "string"
    ELSE
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "int16"
    ENDIF
NEXT

;-------------------------------------------------
;;; キャラクター間の関係性管理
;;; - REL_FROM_ID {int} :関係性を持つ元キャラクターID
;;; - REL_TO_ID   {int} :関係性を持つ先キャラクターID
;;; - LIKE {int} :好感度
;;; - DEPENDENCE {int} :依存度
;;; - SUBORDINATE {int} :従属度
;;; - DOMINANCE {int} :支配度
;;; - RELATION {int} :関係性
;;; - ALLOW_UFUFU {int} :肉体関係の許容
;;; - ALLOW_LOVER {int} :誰かと恋愛関係を結ぶことを許容
;;; - ALLOW_SUBORDINATE {int} :誰かに従属することを許容
;;; - ALLOW_DOMINANCE {int} :誰かを支配することを許容
;;; - UFUFU_COUNT {int} :肉体関係イベントを発生させた回数
;;;
;;; ・モブキャラの関係性は保持しない
;;; ・キャラクター削除時に該当キャラをFROMorTOに持つレコードは削除する
;-------------------------------------------------
@CREATE_CHARA_RELATION_TABLE
#DIMS CONST DB_NAME = "CHARA_RELATION"
{
    #DIMS CONST COLUMN =
        "REL_FROM_ID",
        "REL_TO_ID",
        "LIKE",
        "DEPENDENCE",
        "SUBORDINATE",
        "DOMINANCE",
        "RELATION",
        "ALLOW_UFUFU",
        "ALLOW_LOVER",
        "ALLOW_SUBORDINATE",
        "ALLOW_DOMINANCE",
        "UFUFU_COUNT",
}
DT_CREATE DB_NAME
FOR LOCAL, 0, VARSIZE("COLUMN")
    IF GROUPMATCH(COLUMN:LOCAL, "")
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "string"
    ELSE
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "int16"
    ENDIF
NEXT

;-------------------------------------------------
; セーブされるデータテーブルのリリース
;-------------------------------------------------
@DATATABLE_RELEASE
DT_RELEASE "WEAPON_STOCK"
DT_RELEASE "TRADE_STOCK"
DT_RELEASE "CLOTH_DRAWER"
DT_RELEASE "CRAFT_ORDER"
DT_RELEASE "RUNE_STOCK"
DT_RELEASE "KOJO_DAILY_DISABLE"
DT_RELEASE "CHARA_RELATION"


code:
;-------------------------------------------------
; 用語集用データテーブル
;-------------------------------------------------
@CREATE_FLPEDIA_TABLE
#DIMS CONST DB_NAME = "FLPEDIA_TABLE"
{
    #DIMS CONST COLUMN =
        "FUNC_NAME",
        "MAIN_CATEGORY"
}
DT_CREATE DB_NAME
FOR LOCAL, 0, VARSIZE("COLUMN")
    IF GROUPMATCH(COLUMN:LOCAL, "FUNC_NAME", "MAIN_CATEGORY")
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "string"
    ELSE
        DT_COLUMN_ADD DB_NAME, COLUMN:LOCAL, "int16"
    ENDIF
NEXT

RETURN 1

repo_name: napo/erafl

license: unknown


code:
@EDIT_HAIR_COLOR(対象)
#DIM FIRST_LINE
#DIM 対象
#DIM HAIR_RGB, 3
#DIM HAIR_HSV, 3
#DIM CREDRAW

CALL COLOR_PICKER(TALENT:対象:髪色)

TALENT:対象:髪色 = RESULT


code:
;-------------------------------------------------
;コンフィグの初期設定
;-------------------------------------------------
@INIT_CONFIG_DAILY
DAILY_EVENT_COUNT = 2
KOJO_DAILY_EVENT_COUNT = 2
DAILY_EVENT_ODDS = 1
KOJO_DAILY_EVENT_ODDS = 1

;-------------------------------------------------
;ＳＬＧ部分に関する設定
;-------------------------------------------------
@CONFIG_EVENT_DAILY
#DIM コンフィグ所属, DAILY_GENRE_NUM, 299
#DIM イベント数, DAILY_GENRE_NUM
#DIM 表示, DAILY_GENRE_NUM
#DIM 選択項目
#DIM 選択番号
#DIMS EVENT_NAME_ENG
#DIMS EVENT_NAME_JAP
#DIM FIRST_LINE
VARSET コンフィグ所属, -1
VARSET イベント数
VARSET 表示
FOR LOCAL, 0, VARSIZE("DAILY_EVENT_NAME_ENG", 1)
	EVENT_NAME_ENG = %DAILY_DISABLE_NAME:LOCAL%
	TRYCCALLFORM EVENT_DAILY_%EVENT_NAME_ENG%_GENRE
		コンフィグ所属:RESULT:(イベント数:RESULT) = LOCAL
		イベント数:RESULT++
		;DEBUGPRINTFORML %EVENT_NAME_ENG%:{RESULT}
	CATCH
		;DEBUGPRINTFORML %EVENT_NAME_ENG%見つからず
	ENDCATCH
NEXT

FIRST_LINE = LINECOUNT

$SHOW_LOOP

CALL SINGLE_DRAWLINE
PRINTFORML デイリーのコンフィグを設定します
CALL SINGLE_DRAWLINE

FOR LOCAL, 0, DAILY_GENRE_NUM
	PRINTFORM ◇　%デイリー_ジャンル名:LOCAL, 10, LEFT%
	PRINTBUTTON @"[切り替え]", LOCAL * 300 + 99
	PRINTFORM %TOSTR_SPACE(5)%
	PRINTBUTTON @"[全てオフ]", LOCAL * 300 + 98
	PRINTFORM %TOSTR_SPACE(5)%
	PRINTBUTTON @"[全てオン]", LOCAL * 300 + 97
	PRINTL
	SIF 表示:LOCAL == 0
		CONTINUE
	FOR LOCAL:1, 0, VARSIZE("コンフィグ所属", 1)
		SIF コンフィグ所属:LOCAL:(LOCAL:1) == -1
			BREAK
		SIF GET_DAILY_INDEX_FROM_ENG(デイリー_通常, DAILY_DISABLE_NAME:(コンフィグ所属:LOCAL:(LOCAL:1))) == -1
			CONTINUE
		EVENT_NAME_JAP = %DAILY_EVENT_NAME:デイリー_通常:GET_DAILY_INDEX_FROM_ENG(デイリー_通常, DAILY_DISABLE_NAME:(コンフィグ所属:LOCAL:(LOCAL:1)))%
		IF DAILY_DISABLE:(コンフィグ所属:LOCAL:(LOCAL:1))
			SETCOLOR カラー_選択不可
		ENDIF
		PRINTBUTTON @"\@ DAILY_DISABLE:(コンフィグ所属:LOCAL:(LOCAL:1)) ? [オフ] # [オン] \@", LOCAL * 300 + LOCAL:1
		PRINTFORM %TOSTR_SPACE(5)%
		PRINTFORM %EVENT_NAME_JAP, 30, LEFT%
		PRINTL
		RESETCOLOR
	NEXT
NEXT
CALL SINGLE_DRAWLINE
PRINTFORML [9990] デイリー発生倍率 - {DAILY_EVENT_ODDS}
PRINTFORML [9991] デイリー発生個数 - {DAILY_EVENT_COUNT}
PRINTFORML [9992] 口上デイリー倍率 - {KOJO_DAILY_EVENT_ODDS}
PRINTFORML [9993] 口上デイリー個数 - {KOJO_DAILY_EVENT_COUNT}
PRINTFORML [9999] 戻る
INPUT
IF RESULT == 9999
	RETURN
ELSEIF GROUPMATCH(RESULT, 9990, 9991, 9992, 9993)
	SELECTCASE RESULT
		CASE 9990
			DAILY_EVENT_ODDS = ROUND_INCREMENT(DAILY_EVENT_ODDS, 0, 10)
		CASE 9991
			DAILY_EVENT_COUNT = ROUND_INCREMENT(DAILY_EVENT_COUNT, 0, 10)
		CASE 9992
			KOJO_DAILY_EVENT_ODDS = ROUND_INCREMENT(KOJO_DAILY_EVENT_ODDS, 0, 10)
		CASE 9993
			KOJO_DAILY_EVENT_COUNT = ROUND_INCREMENT(KOJO_DAILY_EVENT_COUNT, 0, 10)
	ENDSELECT
ELSE
	選択項目 = RESULT / 300
	選択番号 = RESULT % 300
	PRINTFORML {選択項目}
	PRINTFORML {選択番号}
	IF !INRANGE(選択項目, 0, VARSIZE("コンフィグ所属", 0))
		CLEARLINE LINECOUNT - FIRST_LINE
		GOTO SHOW_LOOP
	ENDIF
	IF 選択番号 == 99
		表示:選択項目 = !表示:選択項目
	ELSEIF 選択番号 == 98 || 選択番号 == 97
		FOR LOCAL:1, 0, VARSIZE("コンフィグ所属", 1)
			SIF コンフィグ所属:選択項目:(LOCAL:1) == -1
				BREAK
			DAILY_DISABLE:(コンフィグ所属:選択項目:(LOCAL:1)) = 選択番号 - 97
		NEXT
	ELSEIF コンフィグ所属:選択項目:選択番号 == -1
	ELSE
		DAILY_DISABLE:(コンフィグ所属:選択項目:選択番号) = !DAILY_DISABLE:(コンフィグ所属:選択項目:選択番号)
	ENDIF
	CLEARLINE LINECOUNT - FIRST_LINE
	GOTO SHOW_LOOP
ENDIF

;死に分岐
CLEARLINE LINECOUNT - FIRST_LINE
GOTO SHOW_LOOP


code:
;スケベ系
#DIM CONST 薬売り_発生フラグ = 0
#DIM CONST 薬売り_調教対象ID = 1
#DIM CONST 薬売り_調教進行度 = 2
#DIM CONST 薬売り_陥落報告済み = 3

;金貸し
#DIM CONST 金貸し_返済期限 = 11
#DIM CONST 金貸し_残り融資額 =  12
#DIM CONST 金貸し_カタID = 13
#DIM CONST 金貸し_融資総額 = 14
#DIM CONST 金貸し_発生フラグ= 15

;富豪
#DIM CONST 富豪_発生フラグ = 30
#DIM CONST 富豪_お気に入りID = 31
#DIM CONST 富豪_お気に入り調教回数 = 32
#DIM CONST 富豪_誘拐カウンタ = 33
#DIM CONST 富豪_誘拐対象 = 34
#DIM CONST 富豪_調教カウンタ = 35
#DIM CONST 富豪_愛妾カウンタ = 36
#DIM CONST 富豪_探索断念フラグ = 37

;募金
#DIM CONST 募金_発生フラグ = 40
#DIM CONST 募金_抱いた回数 = 41

;催眠
#DIM CONST 催眠_発生フラグ = 50

;接待
#DIM CONST 接待_発生フラグ = 60
#DIM CONST 接待_連続で断った回数 = 61

;恩返し
#DIM CONST 恩返し_発生フラグ = 70
#DIM CONST 恩返し_通い妻フラグ = 71
#DIM CONST 恩返し_動物番号 = 72
#DIM CONST 恩返し_妊娠フラグ = 73
#DIM CONST 恩返し_妊娠度 = 74
#DIM CONST 恩返し_キャラID = 75;追加分
#DIM CONST 恩返し_デート = 76;追加分

;賭け
#DIM CONST 賭け_初回実行済み = 80

;河童娘
#DIM CONST 河童_発生フラグ = 90
#DIM CONST 河童_商売した回数 = 91
#DIM CONST 河童_抱いた回数 = 92

;素質トレーナー
#DIM CONST 素質トレーナー_発生フラグ = 100

;セックストレーナー
#DIM CONST セックストレーナー_発生フラグ = 110

;触手トレーナー
#DIM CONST 触手トレーナー_発生フラグ = 120

;士官要求
#DIM CONST 士官要求_発生禁止カウンタ = 150
#DIM CONST 士官要求_野盗斬り捨てフラグ = 151

;資金援助要求
#DIM CONST 資金援助要求_発生禁止カウンタ = 160

;野盗討伐
#DIM CONST 野盗討伐_発生フラグ = 200

;野盗身代金
#DIM CONST 野盗身代金要求_発生フラグ = 210

;野盗蜂起
#DIM CONST 野盗_蜂起カウンタ = 220

;闇討ち
#DIM CONST 闇討ち提案_発生フラグ = 300

;睡姦
#DIM CONST 睡姦_発生フラグ = 310

;賞金首討伐
#DIM CONST 賞金稼ぎ_発生フラグ = 320
#DIM CONST 賞金稼ぎ_討伐フラグ,6 = 321,322,323,324,325,326

;家庭教師
#DIM CONST 家庭教師_発生フラグ = 340
#DIM CONST 家庭教師_お気に入りID = 341
#DIM CONST 家庭教師_授業実施回数 = 342
#DIM CONST 家庭教師_逢瀬フラグ = 343

;士官籠絡
#DIM CONST 麻薬漬け_ターゲット = 345
#DIM CONST 麻薬漬け_工作員ID = 346
#DIM CONST 麻薬漬け_篭絡段階 = 347

;淫紋
#DIM CONST 淫紋_発生フラグ = 350
#DIM CONST 淫紋_浸食値 = 351
#DIM CONST 淫紋_浸食中キャラID = 352
#DIM CONST 淫紋_あなた依存 = 353;追加分
#DIM CONST 淫紋_あなた依存ID = 354;追加分
#DIM CONST 淫紋_純愛フラグ = 355;追加分
#DIM CONST 淫紋_純愛フラグID = 356;追加分

;外来人フェロモン
#DIM CONST フェロモン中毒_対象ID = 360
#DIM CONST フェロモン中毒_発生回数 = 361

;屋形船
#DIM CONST 屋形船_発生フラグ = 370

;種族間抗争
#DIM CONST 種族間抗争_娘惚れフラグ = 390
#DIM CONST 種族間抗争_娘の種族 = 391
#DIM CONST 種族間抗争_娘2の種族 = 392

;天狗の密着取材
#DIM CONST 天狗取材_発生フラグ = 400
#DIM CONST 天狗取材_夜の取材回数 = 401
#DIM CONST 天狗取材_キャラID = 402;追加分
#DIM CONST 天狗取材_デート = 403;追加分

#DIM CONST 暗殺者_完了フラグ = 410

;催眠トレーナー
#DIM CONST 催眠トレーナー_発生フラグ = 420
#DIM CONST 催眠トレーナー_深度 = 421
#DIM CONST 催眠トレーナー_前回対象者ID = 422
#DIM CONST 催眠トレーナー_レイプ回数 = 423

;妖精暮らしデイリー
#DIM CONST 妖精暮らし_同棲フラグ = 430
#DIM CONST 妖精暮らし_エロカウント = 431

;野盗処刑デイリー
#DIM CONST 野盗処刑_少女部下フラグ = 440

;アルバイトデイリー
#DIM CONST アルバイト_発生フラグ = 460

;動物遣いデイリー
#DIM CONST 動物遣い_発生フラグ = 470

;マセガキデイリー
#DIM CONST マセガキ_発生フラグ = 480
#DIM CONST マセガキ_奴隷ID = 481
#DIM CONST マセガキ_調教深度 = 482

;催眠お仕事_状態管理フラグデイリー
#DIM CONST 催眠お仕事_調教対象ID = 490
#DIM CONST 催眠お仕事_状態管理フラグ = 491
#DIM CONST 催眠お仕事_進行度 = 492

;兎集落デイリー
#DIM CONST 兎の宴_発生フラグ = 500

;墓地デイリー
#DIM CONST 墓地の怪_発生フラグ = 510

;マヨヒガデイリー
#DIM CONST 猫大好き_発生フラグ = 520

;AV撮影デイリー
#DIM CONST AV撮影_中毒進行度 = 530
#DIM CONST AV撮影_進行度 = 531
#DIM CONST AV撮影_対象ID = 532
#DIM CONST AV撮影_発生フラグ = 533

;援助交際_発生フラグデイリー
#DIM CONST 援助交際_発生フラグ = 540
#DIM CONST 援助交際_対象ID = 541
#DIM CONST 援助交際_生ハメ許可 = 542

;妖怪ヤクザデイリー
#DIM CONST やくざ_遭遇 = 550
#DIM CONST やくざ_繋がり = 551
#DIM CONST やくざ_仕事回数 = 552
#DIM CONST やくざ_肉便器対象ID = 553
#DIM CONST やくざ_発生フラグ = 554
#DIM CONST やくざ_妊娠 = 555
#DIM CONST やくざ_面会 = 556

#DIM CONST 仕官の誘い_非勧誘残ターン = 560

;催眠調教デイリー
#DIM CONST 催眠調教_発生フラグ = 570
#DIM CONST 催眠調教_対象ID = 571
#DIM CONST 催眠調教_侵攻度 = 572

;領内ぶらりエロの旅
#DIM CONST 領内ぶらりエロの旅_人妻 = 590
#DIM CONST 領内ぶらりエロの旅_乱交パーティー = 591
#DIM CONST 領内ぶらりエロの旅_恋文 = 592
#DIM CONST 領内ぶらりエロの旅_ナンパ = 593
#DIM CONST 領内ぶらりエロの旅_花売り = 594
#DIM CONST 領内ぶらりエロの旅_セックスオークション = 595
#DIM CONST 領内ぶらりエロの旅_色町の娼婦 = 596
#DIM CONST 領内ぶらりエロの旅_スラム街の娼婦 = 597

#DIM CONST 新興宗教_発生フラグ = 580
#DIM CONST 新興宗教_潜入中キャラID = 581
#DIM CONST 新興宗教_洗脳度 = 582

#DIM CONST 蜂起反乱クールタイム = 590


code:
;共通デイリーイベント：派生処理
@DAILY_DERIVATION()
#DIM EVENT_NUM
#DIMS NAME_ENG
#DIMS NAME_JAP
#DIM EVENT_COUNT
#DIM EVENT_ARRAY, VARSIZE("SHAFFLE_ARRAY")

SIF !IS_DAILY_EVENT_HAPPEN(MASTER)
	RETURN 0

SIF DAILY_CANCEL
	RETURN 0

EVENT_NUM = VARSIZE("DAILY_EVENT_NAME_ENG", 1)

FOR LOCAL, 0, EVENT_NUM
	NAME_ENG = %DAILY_EVENT_NAME_ENG:デイリー_通常派生:LOCAL%
	NAME_JAP = %DAILY_EVENT_NAME:デイリー_通常派生:LOCAL%

	RESULT = 0
	TRYCCALLFORM EVENT_DAILY_DERIVATION_%NAME_ENG%_DISABLE()
		SIF RESULT == 1
			CONTINUE

		;放浪中の拠点フェイズデイリーは特殊な関数が必要
		IF !CFLAG:MASTER:所属
			RESULT = 0
			TRYCALLFORM EVENT_DAILY_DERIVATION_%NAME_ENG%_ALLOW_WHEN_WANDERING()
			SIF RESULT == 0
				CONTINUE
		ENDIF

		TRYCALLFORM EVENT_DAILY_DERIVATION_%NAME_ENG%_DECISION()
		SIF RESULT == 0
			CONTINUE

		VARSET DAILY_TARGET, -1
		VARSET DAILY_TARGET_NUM
		RESULT = 1
		TRYCALLFORM EVENT_DAILY_DERIVATION_%NAME_ENG%_SETTARGET()
		SIF RESULT == 0
			CONTINUE

		RESULTS =
		TRYCALLFORM EVENT_DAILY_DERIVATION_%NAME_ENG%_NAME()
		IF RESULTS == ""
			CALL DAILY_START_DERIVATION(NAME_JAP)
		ELSE
			CALL DAILY_START_DERIVATION(RESULTS)
		ENDIF

		CALLFORM EVENT_DAILY_DERIVATION_%NAME_ENG%()
		SIF DAILY_CANCEL
			RETURN
	CATCH
		;DEBUGPRINTFORML EVENT_DAILY_DERIVATION_%NAME_ENG%_DECISIONみつからず
	ENDCATCH
NEXT


code:
{
    #DIMS CONST DAILY_TALENT_NAME =
        "薬売りの性奴隷", "貴族の虜", "貴族の愛人", "借り物", "淫紋", "富豪の愛妾", "元愛妾",
        "催眠中毒", "カジノの従業員", "マセガキの奴隷", "催眠奴隷", "愛玩奴隷", "街娼", "富豪の虜囚",
        "無自覚催眠奴隷", "教祖様のしもべ", "愛欲の淫紋"
}

#DIM CONST 素質_デイリー_薬売りの性奴隷 = 0
#DIM CONST 素質_デイリー_貴族の虜 = 1
#DIM CONST 素質_デイリー_貴族の愛人 = 2
#DIM CONST 素質_デイリー_淫紋 = 4
#DIM CONST 素質_デイリー_富豪の愛妾 = 5
#DIM CONST 素質_デイリー_元愛妾 = 6
#DIM CONST 素質_デイリー_催眠中毒 = 7
#DIM CONST 素質_デイリー_カジノの従業員 = 8
#DIM CONST 素質_デイリー_マセガキの奴隷 = 9
#DIM CONST 素質_デイリー_催眠奴隷 = 10
#DIM CONST 素質_デイリー_愛玩奴隷 = 11
#DIM CONST 素質_デイリー_街娼 = 12
#DIM CONST 素質_デイリー_富豪の虜囚 = 13
#DIM CONST 素質_デイリー_無自覚催眠奴隷 = 14
#DIM CONST 素質_デイリー_教祖様のしもべ = 15
#DIM CONST 素質_デイリー_愛欲の淫紋 = 16


code:
@RELATION_EVENT()
#DIM 対象
#DIM DYNAMIC DID, MAX_CHARANUM
#DIM DYNAMIC CHARA_ID_ARRAY, RELATION_EVENT_最大実行回数, RELATION_EVENT_最大人数
#DIM DYNAMIC CHARA_ID_ARRAY_EXEC,  RELATION_EVENT_最大人数
VARI MAIN_CHARA_ID
VARI TARGET_ID

;変数の初期化
CVARSET CFLAG, GETNUM(CFLAG, "関係性デイリー実施済"), 0
VARSET CHARA_ID_ARRAY:0:0, -1
;連想配列の初期化
CALL DAILY_MAP_RELEASE()
CALL DAILY_MAP_CREATE()

;イベント最大実行回数だけ関係性イベントを繰り返す
VARI I
VARI J
VARI 実行回数
;メインの実行者と対象者を決定
CALL RELATION_EVENT_DECIDE_MAIN_CHARA(CHARA_ID_ARRAY)
FOR I, 0, RESULT
    VARSET CHARA_ID_ARRAY_EXEC, -1
    FOR J, 0, RELATION_EVENT_最大人数
        CHARA_ID_ARRAY_EXEC:J = CHARA_ID_ARRAY:I:J
    NEXT
    CALL DRAW_LINE
    CALL RELATION_EVENT_良き友人(CHARA_ID_ARRAY_EXEC)
    PRINTW
NEXT

@RELATION_EVENT_DECIDE_MAIN_CHARA(CHARA_ID_ARRAY)
; #region RELATION_EVENT_DECIDE_MAIN_CHARA
#DIM REF CHARA_ID_ARRAY, 0, 0
#DIM DYNAMIC MAIN_CHARA_ID
#DIM DYNAMIC TARGET_ID
#DIM DYNAMIC DID, MAX_RELATION_RECORD

;関係性レコードを抽出する
VARI RECORD_NUM
RECORD_NUM = DT_SELECT("CHARA_RELATION",,, DID)

;該当なしなら終了
IF !RECORD_NUM
    RETURN 0
ENDIF

;メインの実行者と対象を決定する
CALL ARRAY_SHAFFLE(RECORD_NUM)
VARI I
VARI J

VARI 実行回数
FOR I, 0, RECORD_NUM
    IF 実行回数 == RELATION_EVENT_最大実行回数
        BREAK
    ENDIF
    MAIN_CHARA_ID = DT_CELL_GET("CHARA_RELATION", DID:(SHAFFLE_ARRAY:I), "REL_FROM_ID", 1)
    TARGET_ID = DT_CELL_GET("CHARA_RELATION", DID:(SHAFFLE_ARRAY:I), "REL_TO_ID", 1)
    IF CFLAG:(MAIN_CHARA_ID):関係性デイリー実施済 || CFLAG:(TARGET_ID):関係性デイリー実施済
        CONTINUE
    ENDIF
    CALL DAILY_MAP_SETINT("REL_DID", DID:(SHAFFLE_ARRAY:実行回数))
    CFLAG:MAIN_CHARA_ID:関係性デイリー実施済 = 1
    CFLAG:TARGET_ID:関係性デイリー実施済 = 1
    CHARA_ID_ARRAY:実行回数:0 = MAIN_CHARA_ID
    CHARA_ID_ARRAY:実行回数:1 = TARGET_ID
    実行回数 ++
NEXT

VARI CANDIDATE
VARI 参加人数 = 2 ;メインキャラと対象キャラは必ず含むので二人から開始
FOR I, 0, 実行回数
    ;追加のメンバーをランダムに追加する
    ;メインキャラと関係のあるメンバーから抽出
    VARSET DID
    RECORD_NUM = DT_SELECT("CHARA_RELATION", @"REL_FROM_ID = {CHARA_ID_ARRAY:I:0} AND REL_TO_ID <> {CHARA_ID_ARRAY:I:1}",, DID)
    IF !RECORD_NUM
        CONTINUE
    ENDIF
    CALL ARRAY_SHAFFLE(RECORD_NUM)
    FOR J, 0, RECORD_NUM
        IF 参加人数 == RELATION_EVENT_最大人数
            BREAK
        ENDIF
        CANDIDATE = DT_CELL_GET("CHARA_RELATION", DID:(SHAFFLE_ARRAY:J), "REL_TO_ID", 1)
        IF CFLAG:CANDIDATE:関係性デイリー実施済 || RAND:100 >= 30
            CONTINUE
        ENDIF
        CHARA_ID_ARRAY:I:参加人数 = CANDIDATE
        CFLAG:CANDIDATE:関係性デイリー実施済 = 1
        参加人数 ++
    NEXT
NEXT

RETURN 実行回数
; #endregion

@RELATION_EVENT_良き友人(CHARA_ID_ARRAY)
; #region RELATION_EVENT_良き友人
#DIM REF CHARA_ID_ARRAY
{
    #DIMS CONST SITUATIONS =
        "移動"
        , "趣味"
        , "季節"
}
{
    #DIMS CONST TOPIC =
        "器用"
        , "戦闘"
        , "知識"
        , "料理"
        , "歌唱"
}
VARS TEXT
VARI MAIN_CHARA_ID
VARI TARGET_ID
VARI ADD_CHARA_ID1
VARI ADD_CHARA_ID2
VARI MEMBER_NUM
VARI 好感度上昇値

MEMBER_NUM = FINDELEMENT(CHARA_ID_ARRAY, -1)
IF MEMBER_NUM == -1
    MEMBER_NUM = RELATION_EVENT_最大人数
ENDIF

MAIN_CHARA_ID = CHARA_ID_ARRAY:0
TARGET_ID = CHARA_ID_ARRAY:1
ADD_CHARA_ID1 = CHARA_ID_ARRAY:2
ADD_CHARA_ID2 = CHARA_ID_ARRAY:3

VARI I
FOR I, 0, MEMBER_NUM
    CALL DRAW_PORTRAIT(CHARA_ID_ARRAY:I, @"[サイズ:120px][POS_X:{25 + (140 * I)}px]",,I == MEMBER_NUM - 1 ? 1 # 0)
NEXT
VARS DIC_ABL_UP
SELECTCASE SITUATIONS:(RAND:VARSIZE("SITUATIONS"))
    CASE "移動"
        {
            TEXT '= @"
                %ANAME(MAIN_CHARA_ID)%は%ANAME(TARGET_ID, MEMBER_NUM - 1)%と一緒に街へ買い出しに出かけている
                道すがら語り合った%S_R("好きな食べ物/共通の趣味/最近の時事/恋愛談義")%の話題を通して互いの仲はより深まったようだ
                "
        }

        {
            TEXT '= @"
                %ANAME(MAIN_CHARA_ID)%は%ANAME(TARGET_ID, MEMBER_NUM - 1)%は隊商馬車に揺られて街道を移動している
                荷台の上で語り合った%S_R("好きな食べ物/共通の趣味/最近の時事/恋愛談義")%の話題を通して互いの仲はより深まったようだ
                "
        }

        {
            TEXT '= @"
                %ANAME(MAIN_CHARA_ID)%と%ANAME(TARGET_ID, MEMBER_NUM - 1)%は山道を一緒に歩いている
                険しい道のりを助け合いながら進み、%S_R("互いの思い出/将来の夢/これまでの冒険の話/故郷の思い出")%について語り合ううちに互いの仲は深まったようだ
                "
        }

        {
            TEXT '= @"
                %ANAME(MAIN_CHARA_ID)%と%ANAME(TARGET_ID, MEMBER_NUM - 1)%は野営の準備を終え、焚き火を囲んでいる
                夜が更けるまで%S_R("旅の思い出/将来の夢/これまでの冒険の話/故郷の思い出")%について語り合ったことで、互いの仲は深まったようだ
                "
        }
    CASE "趣味"
        SELECTCASE TOPIC:(RAND:VARSIZE("TOPIC"))
            CASE "器用"
                ;釣り(器用・観察)
                {
                    TEXT '= @"
                        %ANAME(MAIN_CHARA_ID)%と%ANAME(TARGET_ID, MEMBER_NUM - 1)%は河原で肩を並べて釣り糸を垂れている
                        釣果は%S_R("大変良好だったようだ/それなりだったようだ/もの寂しげに終わったようだ/散々だったようだ")%
                        ……それはそれとして互いの仲は深まったようだ
                        "
                }
                DIC_ABL_UP '= @"[器用:{RAND(3, 6)}][観察:{RAND(3, 6)}]"
            CASE "戦闘"
                ;訓練(戦闘・身体)
                {
                    TEXT '= @"
                        %ANAME(MAIN_CHARA_ID)%と%ANAME(TARGET_ID, MEMBER_NUM - 1)%は林で訓練を重ねている
                        模擬戦は終始%S_R(@"%ANAME(MAIN_CHARA_ID)%/%ANAME(TARGET_ID)%")%が優勢だったようだ
                        共に汗を流しているうちに互いの仲は深まったようだ
                        "
                }
                DIC_ABL_UP '= @"[戦闘:{RAND(3, 6)}][身体:{RAND(3, 6)}]"
            CASE "知識"
                ;議論(知識・話術)
                {
                    TEXT '= @"
                        %ANAME(MAIN_CHARA_ID)%と%ANAME(TARGET_ID, MEMBER_NUM - 1)%は居間で%S_R(@"戦術/魔術/今日の晩御飯/歴史/哲学/神学/午後のおやつ/赤べこ/ギルドの依頼/明日の朝食/恋愛論/明日の朝食/サンドウィッチの具材/戦闘理論/魔物の生態/次の旅程/資金の使い道/領地経営")%について熱い論議を交わしている
                        弁舌のペースは終始%S_R(@"%ANAME(MAIN_CHARA_ID)%/%ANAME(TARGET_ID)%")%が握っていたようだ
                        互いの考えを聞き合ううちに互いの仲は深まったようだ
                        "
                }
                DIC_ABL_UP '= @"[知識:{RAND(3, 6)}][話術:{RAND(3, 6)}]"
            CASE "料理"
                ;料理(料理)
                {
                    TEXT '= @"
                        %ANAME(MAIN_CHARA_ID)%と%ANAME(TARGET_ID, MEMBER_NUM - 1)%は一緒に料理を作っている
                        出来栄えは%S_R("見事な絶品/まずまずの出来/過不足ないもの/やや失敗気味/悲劇的な有様/大惨事の一歩手前", 1, "およそ口に入るとは思えない有様", 1)%だったが
                        それはそれとして協力して作るうちに互いの仲は深まったようだ
                        "
                }
                DIC_ABL_UP '= @"[料理:{RAND(6, 9)}]"
            CASE "歌唱"
                ;歌唱(歌唱・社交)
                {
                    TEXT '= @"
                        %ANAME(MAIN_CHARA_ID)%と%ANAME(TARGET_ID, MEMBER_NUM - 1)%は一緒に%S_R("歌を歌って/詩を吟じて/踊りの練習をして/楽器の練習をして")%いる
                        その内容は%S_R("披露していれば名演となったもの/見事な内容/それなりの内容/ややぎこちないもの/悲劇的な有様", 1, "小鳥のさえずりの方が心地よい有様", 1)%であったが
                        それはそれとして協力して演じるうちに互いの仲は深まったようだ
                        "
                }
                DIC_ABL_UP '= @"[歌唱:{RAND(3, 6)}][社交:{RAND(3, 6)}]"
        ENDSELECT
    CASE "季節"
        SELECTCASE HO_SEASON()
            CASE HO_季節_春
                ;春
                {
                    TEXT '= @"
                        春の陽気の中、%ANAME(MAIN_CHARA_ID)%と%ANAME(TARGET_ID, MEMBER_NUM - 1)%は%S_R("散歩/ピクニック/茶会")%を楽しんでいる
                        穏やかな時間を過ごすうちに互いの仲は深まったようだ
                        "
                }
            CASE HO_季節_夏
                ;夏
                {
                    TEXT '= @"
                        真夏の陽光が照り付ける中、%ANAME(MAIN_CHARA_ID)%と%ANAME(TARGET_ID, MEMBER_NUM - 1)%は涼を求めて川辺にいる
                        %S_R("水浴びを楽しみ/氷菓子を食べ/夕涼みをし")%ながら暑さを忘れるほど会話が弾み、互いの仲は深まったようだ
                        "
                }
            CASE HO_季節_秋
                ;秋
                {
                    TEXT '= @"
                        葉が紅に色付く秋の午後、%ANAME(MAIN_CHARA_ID)%と%ANAME(TARGET_ID, MEMBER_NUM - 1)%は一緒に出かけている
                        鮮やかな色彩の木々の下で%S_R("お茶を楽しみ/栗拾いをし/きのこ狩りをし/薪を集め")%ながら
                        季節の移ろいを感じて、互いの仲は深まったようだ
                        "
                }
            CASE HO_季節_冬
                ;冬
                {
                    TEXT '= @"
                        冬の寒さの中、%ANAME(MAIN_CHARA_ID)%と%ANAME(TARGET_ID, MEMBER_NUM - 1)%は暖炉の前で飲み物を片手に談話をしている
                        %S_R("温かい飲み物/手作りの菓子/温かいスープ")%を分け合いながら静かな冬の夜長を過ごすうちに互いの仲は深まったようだ
                        "
                }
        ENDSELECT
ENDSELECT
CALL PRINT_DIAG(TEXT)
PRINTL
VARI FROM_ID
VARI TO_ID
VARI I
VARI J
好感度上昇値 = RAND(3, 6) * 5
FOR I, 0, MEMBER_NUM
    FROM_ID = CHARA_ID_ARRAY:I
    FOR J, 0, MEMBER_NUM
        TO_ID = CHARA_ID_ARRAY:J
        IF FROM_ID == TO_ID
            CONTINUE
        ENDIF
        CALL REL_ADD(FROM_ID, TO_ID, 好感度上昇値)
    NEXT
NEXT
PRINTFORML %ANAME(MAIN_CHARA_ID, 2)%の好感度+{好感度上昇値}

;活動内容に即した経験値の加算
VARS KEYS_ABL, 5
VARI KEY_NUM
VARI CHARA_ID
CALL DIC_KEYS(DIC_ABL_UP)
KEY_NUM = RESULT
ARRAYCOPY "RESULTS", "KEYS_ABL"
IF KEY_NUM > 0
    ;隊商メンバーの経験値加算
    FOR I, 0, MEMBER_NUM
        CHARA_ID = CHARA_ID_ARRAY:I
        FOR J, 0, KEY_NUM
            EXP:CHARA_ID:(GETNUM(EXP, @"%KEYS_ABL:J%経験値")) += DIC_GETINT(DIC_ABL_UP, @"%KEYS_ABL:J%")
        NEXT
    NEXT
    ;経験値加算結果の表示
    FOR I, 0, KEY_NUM
        PRINTFORML %ANAME(MAIN_CHARA_ID, 2)%の%KEYS_ABL:I%経験値+{DIC_GETINT(DIC_ABL_UP, @"%KEYS_ABL:I%")}
    NEXT
    ;レベルアップ処理
    FOR I, 0, MEMBER_NUM
        CHARA_ID = CHARA_ID_ARRAY:I
        CALL TRAIN_AUTO_ABLUP(CHARA_ID)
    NEXT
ENDIF


code:
#DIM CONST RELATION_EVENT_最大実行回数 = 3
#DIM CONST RELATION_EVENT_最大人数 = 5


code:
;---------------------
;基本的な発生確率(1000分率 100で10%)
;これにコンフィグ項目の発生頻度がかけられるので、必ずしもこの通りにはならない
;---------------------
@EVENT_DAILY_RELATION_LOVERS_RATE()
RETURN 75

;---------------------
;確率以外の発生判定
;〇期以降になると発生するとか、デイリー側で利用している変数が-1だったら起こさない　みたいなはじき方をするときに使う
;---------------------
@EVENT_DAILY_RELATION_LOVERS_DECISION()
RETURN 1

;---------------------
;ジャンル
;コンフィグ設定で使用
;---------------------
@EVENT_DAILY_RELATION_LOVERS_GENRE()
RETURN デイリー_ジャンル_エロ

;---------------------
;特定の条件を満たすキャラをランダムに選択する場合に利用
;他の関数は必須だが、これだけはなくてもよい　というかパフォーマンスへ影響するので不要なら作ってはならない
;対象が存在せずデイリーを開始できない場合は0を返すことでデイリーの発生をキャンセルする
;---------------------
@EVENT_DAILY_RELATION_LOVERS_SETTARGET()
#DIM DYNAMIC DID, MAX_RELATION_RECORD
IF DT_SELECT("CHARA_RELATION", @"RELATION IN ({関係性_恋人}, {関係性_親愛})",, DID)
    RETURN 1
ELSE
    RETURN 0
ENDIF

;---------------------
;本体
;イベントが発生した場合は1、発生しなかった場合は0を返す
;発生しなかったというのは例えば、特定条件を満たすキャラからランダムに一人選ぶデイリーで、そもそもその条件を満たすキャラが一人もいないみたいなとき
;旧仕様で作ったことある人向けにいうと「旧仕様のデイリー本体冒頭で-1を返すような状況」
;---------------------
@EVENT_DAILY_RELATION_LOVERS()
#DIM 対象
#DIM DYNAMIC DID, MAX_RELATION_RECORD
VARI RECORD_NUM

;関係性が<恋人>のレコードを抽出する
RECORD_NUM = DT_SELECT("CHARA_RELATION", @"RELATION IN ({関係性_恋人}, {関係性_親愛})",, DID)

;該当なしなら終了
IF !RECORD_NUM
    RETURN 0
ENDIF

;連想配列の初期化
CALL DAILY_MAP_RELEASE()
CALL DAILY_MAP_CREATE()

CALL ARRAY_SHAFFLE(RECORD_NUM)
VARI I
VARI MAIN_CHARA_ID
VARI TARGET_ID
FOR I, 0, RECORD_NUM
    MAIN_CHARA_ID = DT_CELL_GET("CHARA_RELATION", DID:(SHAFFLE_ARRAY:0), "REL_FROM_ID", 1)
    TARGET_ID = DT_CELL_GET("CHARA_RELATION", DID:(SHAFFLE_ARRAY:0), "REL_TO_ID", 1)
    IF CFLAG:MAIN_CHARA_ID:関係性デイリー実施済 || CFLAG:TARGET_ID:関係性デイリー実施済
        CONTINUE
    ENDIF
    CALL DAILY_MAP_SETINT("REL_DID", DID:(SHAFFLE_ARRAY:0))
    CALL EVENT_DAILY_RELATION_LOVERS_恋人たちの逢瀬()
    RETURN 1
NEXT

RETURN 0

@EVENT_DAILY_RELATION_LOVERS_恋人たちの逢瀬()
VARS TEXT
VARI REL_DID
VARI MAIN_CHARA_ID
VARI TARGET_ID
VARI TARGET_NUM
VARI 好感度上昇値
VARI ALLOW_UFUFU

REL_DID = DAILY_MAP_GETINT("REL_DID")
;デイリーイベントで直接DATATABLE叩くのはいまいち
MAIN_CHARA_ID = DT_CELL_GET("CHARA_RELATION", REL_DID, "REL_FROM_ID", 1)
TARGET_ID = DT_CELL_GET("CHARA_RELATION", REL_DID, "REL_TO_ID", 1)
ALLOW_UFUFU = DT_CELL_GET("CHARA_RELATION", REL_DID, "ALLOW_UFUFU", 1)
CALL DAILY_MAP_SETINT("MAIN_CHARA_ID", MAIN_CHARA_ID)
CALL DAILY_MAP_SETINT("TARGET_ID", TARGET_ID)

CALL PRINT_TITLE("恋人たちの逢瀬", "エロイベント")
CALL DRAW_PORTRAIT(MAIN_CHARA_ID, "[感情:幸][OVL_表情:赤面][サイズ:180px][POS_X:25px]",,0)
CALL DRAW_PORTRAIT(TARGET_ID, "[感情:幸][OVL_表情:赤面][サイズ:180px][POS_X:225px]",,1)
{
    TEXT '= @"
        恋仲になった%ANAME(MAIN_CHARA_ID)%と%ANAME(TARGET_ID)%は%ANAME(MAIN_CHARA_ID)%の部屋で密やかな逢瀬を交わしている
        二人は互いに寄り添いあい、指を絡め、幸福なひと時を楽しんでいるようだ……
        [$W]
        "
}
CALL PRINT_DIAG(TEXT)

;肉体関係禁止
IF !ALLOW_UFUFU
    {
        TEXT '= @"
            %ANAME(MAIN_CHARA_ID)%が%ANAME(TARGET_ID)%の肌に指を這わせると、%ANAME(TARGET_ID)%はそっと%ANAME(MAIN_CHARA_ID)%の唇に自身の唇を重ねる
            ……だが、そのキスは触れるか触れないか程度の軽い口づけ

            二人はそれ以上先踏み出そうとはせず、清らかな互いの関係性を楽しんでいるようだ
            "
    }
    CALL PRINT_DIAG(TEXT)
    RETURN 0
ENDIF
;肉体関係許可
{
    TEXT '= @"
        %ANAME(MAIN_CHARA_ID)%が%ANAME(TARGET_ID)%の肌に指を這わせると、%ANAME(TARGET_ID)%はそっと%ANAME(MAIN_CHARA_ID)%の唇に自身の唇を重ねる
        始めは触れるか触れないか程度であった軽い口づけは、繰り返すうちに熱を帯び、舌を絡め合わせる情熱的なものへと変わっていく

        そのまま二人はベッドへなだれ込むと、情欲の赴くがままに互いの身体を貪りあい始めた……
        [$W]
        "
}
CALL PRINT_DIAG(TEXT)
VARS CANDIDATES, 3
CANDIDATES:0 '= "のぞき見る  "
CANDIDATES:1 '= "そっとしておく"
IF TALENT:MAIN_CHARA_ID:合意 && TALENT:TARGET_ID:合意 && IS_NASTY(MAIN_CHARA_ID, 素質_淫乱_淫乱) && IS_NASTY(TARGET_ID, 素質_淫乱_淫乱)
    CANDIDATES:2 '= "割って入る"
ENDIF
{
    CALL ASK_MULTI_ANNOTATION_P(
        @"%CANDIDATES:0%", "情事の様子を見る"
        ,@"%CANDIDATES:1%", "イベントを終了"
        ,@"%CANDIDATES:2%", "逢瀬の場に割り込む"
        )
}
SELECTCASE RESULT
    CASE 0, 2
        CVARSET CFLAG, GETNUM(CFLAG, "調教参加フラグ") , 0
        IF RESULT == 0
            FLAG:ターンエンド調教 = 調教_慰安
        ELSE
            FLAG:ターンエンド調教 = 調教_閨
            FLAG:調教シチュエーション指定 = 調教シチュエーション_和姦
            CFLAG:MASTER:調教参加フラグ = 1
        ENDIF
        ;ウフフ処理
        CFLAG:MAIN_CHARA_ID:調教参加フラグ = 1
        CFLAG:TARGET_ID:調教参加フラグ = 1

        CALL FL_PLAYSE("Cloth_undress_0.mp3")

        CALL ADD_EVENTTRAIN_CALLEE("RELATION_DAILY_恋人たちの逢瀬")
        CALL ADD_EVENTEND_CALLEE("RELATION_DAILY_恋人たちの逢瀬")
        ;ウフフ省略
    CASEELSE
        VARS キス相手
        VARS セックス相手
        VARS 同性処理
        IF IS_SAMESEX(MAIN_CHARA_ID, TARGET_ID)
            IF IS_MALE(MAIN_CHARA_ID)
                同性処理 = "ＢＬ,"
            ELSE
                同性処理 = "レズ,"
            ENDIF
        ENDIF

        IF HAS_PENIS(MAIN_CHARA_ID)
            キス相手 = %ANAME(TARGET_ID)%
            セックス相手 = %ANAME(TARGET_ID)%
            IF HAS_VAGINA(TARGET_ID)
                CALL FUCK(MAIN_CHARA_ID, @"欲望, 奉仕, 性技, Ｃ, Ｖ, Ａ, Ｂ, Ｍ, 性交, 精愛, 射精, キス, 口淫, Ｖ性交, Ａ性交, %同性処理%", "キス喪失, 処女喪失, Ａ処女喪失, 膣内射精, 腸内射精, 口内射精", GET_ID(TARGET_ID), キス相手, セックス相手, "", "和姦", 0)
            ELSE
                CALL FUCK(MAIN_CHARA_ID, @"欲望, 奉仕, 性技, Ｃ, Ｖ, Ａ, Ｂ, Ｍ, 性交, 精愛, 射精, キス, 口淫, Ｖ性交, Ａ性交, %同性処理%", "キス喪失, 処女喪失, Ａ処女喪失, 腸内射精, 口内射精", GET_ID(TARGET_ID), キス相手, セックス相手, "", "和姦", 0)
            ENDIF
        ELSEIF HAS_PENIS(TARGET_ID)
            キス相手 = %ANAME(MAIN_CHARA_ID)%
            セックス相手 = %ANAME(MAIN_CHARA_ID)%
            IF HAS_VAGINA(MAIN_CHARA_ID)
                CALL FUCK(TARGET_ID, @"欲望, 奉仕, 性技, Ｃ, Ｖ, Ａ, Ｂ, Ｍ, 性交, 精愛, 射精, キス, 口淫, Ｖ性交, Ａ性交, %同性処理%", "キス喪失, 処女喪失, Ａ処女喪失, 膣内射精, 腸内射精, 口内射精", GET_ID(MAIN_CHARA_ID), キス相手, セックス相手, "", "和姦", 0)
            ELSE
                CALL FUCK(TARGET_ID, @"欲望, 奉仕, 性技, Ｃ, Ｖ, Ａ, Ｂ, Ｍ, 性交, 精愛, 射精, キス, 口淫, Ｖ性交, Ａ性交, %同性処理%", "キス喪失, 処女喪失, Ａ処女喪失, 膣内射精, 腸内射精, 口内射精", GET_ID(MAIN_CHARA_ID), キス相手, セックス相手, "", "和姦", 0)

            ENDIF
        ELSE
            キス相手 = %ANAME(TARGET_ID)%
            セックス相手 = %ANAME(TARGET_ID)%
            CALL FUCK(MAIN_CHARA_ID, @"欲望, 奉仕, 性技, Ｃ, Ｖ, Ａ, Ｂ, Ｍ, 性交, キス, 口淫, %同性処理%", "キス喪失", GET_ID(MAIN_CHARA_ID), キス相手, セックス相手, "", "和姦", 0)
        ENDIF
        {
            TEXT '= @"

                ………………[$W]
                …………[$W]
                ……[$W]

                熱い交わりを通して二人の関係はさらに深まったようだ[$W]
                "
        }
        CALL PRINT_DIAG(TEXT)

        VARI 好感度加算値
        VARI 依存度加算値
        好感度加算値 = RAND(4, 7) * 30
        依存度加算値 = RAND(1, 3) * 30
        PRINTFORMW 相互の好感度+{好感度加算値}　依存度+{依存度加算値}
        CALL REL_ADD(MAIN_CHARA_ID, TARGET_ID, 好感度加算値, 依存度加算値)
        CALL REL_ADD(TARGET_ID, MAIN_CHARA_ID, 好感度加算値, 依存度加算値)
ENDSELECT

RETURN 1

;ターンエンド調教開始直前処理
@EVENTTRAIN_RELATION_DAILY_恋人たちの逢瀬()
VARS TEXT
VARI MAIN_CHARA_ID
VARI TARGET_ID
VARI REL_DID
MAIN_CHARA_ID = DAILY_MAP_GETINT("MAIN_CHARA_ID")
TARGET_ID = DAILY_MAP_GETINT("TARGET_ID")

;MASTERが乱入している
IF CFLAG:MASTER:調教参加フラグ
    {
        TEXT '= @"
            @C:{カラー_注意}@%ANAME(MASTER)%は%ANAME(MAIN_CHARA_ID)%と%ANAME(TARGET_ID)%の情事の間に割って入り込んだ！@/C@[$W]

            ……思わぬ闖入者にはじめこそ困惑した様子であった%ANAME(MAIN_CHARA_ID)%と%ANAME(TARGET_ID)%であったが、
            顔を見合わせると、淫猥な笑みを浮かべ、%ANAME(MASTER)%を手招きした……[$W]
            "
    }
    CALL PRINT_DIAG(TEXT)
    TFLAG:調教ターン数 = 25
    FLAG:調教スキップ可 = 1
ELSE
    TFLAG:調教ターン数 = 20
    FLAG:調教スキップ可 = 1
ENDIF

;ターンエンド調教後処理
@EVENTEND_RELATION_DAILY_恋人たちの逢瀬()
VARS TEXT
VARI MAIN_CHARA_ID
VARI TARGET_ID
MAIN_CHARA_ID = DAILY_MAP_GETINT("MAIN_CHARA_ID")
TARGET_ID = DAILY_MAP_GETINT("TARGET_ID")
{
    TEXT '= @"

        ………………[$W]
        …………[$W]
        ……[$W]

        熱い交わりを通して二人の関係はさらに深まったようだ[$W]
        "
}
CALL PRINT_DIAG(TEXT)

VARI 好感度加算値
VARI 依存度加算値
好感度加算値 = RAND(4, 7) * 30
依存度加算値 = RAND(1, 3) * 30
PRINTFORMW 相互の好感度+{好感度加算値}　依存度+{依存度加算値}
CALL REL_ADD(MAIN_CHARA_ID, TARGET_ID, 好感度加算値, 依存度加算値)
CALL REL_ADD(TARGET_ID, MAIN_CHARA_ID, 好感度加算値, 依存度加算値)


code:
;---------------------
;基本的な発生確率(1000分率 100で10%)
;これにコンフィグ項目の発生頻度がかけられるので、必ずしもこの通りにはならない
;---------------------
@EVENT_DAILY_RELATION_MASTER_AND_SLAVE_RATE()
RETURN 75

;---------------------
;確率以外の発生判定
;〇期以降になると発生するとか、デイリー側で利用している変数が-1だったら起こさない　みたいなはじき方をするときに使う
;---------------------
@EVENT_DAILY_RELATION_MASTER_AND_SLAVE_DECISION()
RETURN 1

;---------------------
;ジャンル
;コンフィグ設定で使用
;---------------------
@EVENT_DAILY_RELATION_MASTER_AND_SLAVE_GENRE()
RETURN デイリー_ジャンル_エロ

;---------------------
;特定の条件を満たすキャラをランダムに選択する場合に利用
;他の関数は必須だが、これだけはなくてもよい　というかパフォーマンスへ影響するので不要なら作ってはならない
;対象が存在せずデイリーを開始できない場合は0を返すことでデイリーの発生をキャンセルする
;---------------------
@EVENT_DAILY_RELATION_MASTER_AND_SLAVE_SETTARGET()
#DIM DYNAMIC DID, MAX_CHARANUM
IF DT_SELECT("CHARA_RELATION", @"RELATION IN ({関係性_服従}, {関係性_隷属})",, DID)
    RETURN 1
ELSE
    RETURN 0
ENDIF

;---------------------
;本体
;イベントが発生した場合は1、発生しなかった場合は0を返す
;発生しなかったというのは例えば、特定条件を満たすキャラからランダムに一人選ぶデイリーで、そもそもその条件を満たすキャラが一人もいないみたいなとき
;旧仕様で作ったことある人向けにいうと「旧仕様のデイリー本体冒頭で-1を返すような状況」
;---------------------
@EVENT_DAILY_RELATION_MASTER_AND_SLAVE()
#DIM 対象
#DIM DYNAMIC DID, MAX_CHARANUM
VARI RECORD_NUM

;関係性が<服従>・<隷属>のレコードを抽出する
RECORD_NUM = DT_SELECT("CHARA_RELATION", @"RELATION IN ({関係性_服従}, {関係性_隷属})",, DID)

;該当なしなら終了
IF !RECORD_NUM
    RETURN 0
ENDIF

;連想配列の初期化
CALL DAILY_MAP_RELEASE()
CALL DAILY_MAP_CREATE()

CALL ARRAY_SHAFFLE(RECORD_NUM)
VARI I
VARI MAIN_CHARA_ID
VARI TARGET_ID
FOR I, 0, RECORD_NUM
    MAIN_CHARA_ID = DT_CELL_GET("CHARA_RELATION", DID:(SHAFFLE_ARRAY:0), "REL_FROM_ID", 1)
    TARGET_ID = DT_CELL_GET("CHARA_RELATION", DID:(SHAFFLE_ARRAY:0), "REL_TO_ID", 1)
    IF CFLAG:MAIN_CHARA_ID:関係性デイリー実施済 || CFLAG:TARGET_ID:関係性デイリー実施済
        CONTINUE
    ENDIF
    CALL DAILY_MAP_SETINT("REL_DID", DID:(SHAFFLE_ARRAY:0))
    CALL EVENT_DAILY_RELATION_MASTER_AND_SLAVE_躾の時間()
    RETURN 1
NEXT

RETURN 0

@EVENT_DAILY_RELATION_MASTER_AND_SLAVE_躾の時間()
VARS TEXT
VARI REL_DID
VARI MAIN_CHARA_ID
VARI TARGET_ID
VARI TARGET_NUM
VARI 好感度上昇値
VARI ALLOW_UFUFU

REL_DID = DAILY_MAP_GETINT("REL_DID")
;デイリーイベントで直接DATATABLE叩くのはいまいち
MAIN_CHARA_ID = DT_CELL_GET("CHARA_RELATION", REL_DID, "REL_FROM_ID", 1)
TARGET_ID = DT_CELL_GET("CHARA_RELATION", REL_DID, "REL_TO_ID", 1)
ALLOW_UFUFU = DT_CELL_GET("CHARA_RELATION", REL_DID, "ALLOW_UFUFU", 1)
CALL DAILY_MAP_SETINT("MAIN_CHARA_ID", MAIN_CHARA_ID)
CALL DAILY_MAP_SETINT("TARGET_ID", TARGET_ID)

CALL PRINT_TITLE("躾の時間", "エロイベント")
CALL DRAW_PORTRAIT(MAIN_CHARA_ID, "[感情:悲][OVL_表情:赤面][サイズ:180px][POS_X:25px]",,0)
CALL DRAW_PORTRAIT(TARGET_ID, "[感情:幸][目:細目(発情)][OVL_表情:赤面][サイズ:180px][POS_X:225px]",,1)
{
    TEXT '= @"
        %ANAME(MAIN_CHARA_ID)%は%ANAME(TARGET_ID)%に心の底から依存しきり、最早離れることのできない存在になっている
        一方%ANAME(TARGET_ID)%もまた%ANAME(MAIN_CHARA_ID)%の存在を独占し、自らの意のままとすることに深い精神的な充足を抱いている

        歪な依存関係を築いた二人は、夜な夜な密会を交わし、内に秘めた歪んだ欲望を発散しようとしている……
        [$W]
        "
}
CALL PRINT_DIAG(TEXT)

;肉体関係禁止
IF !ALLOW_UFUFU
    {
        TEXT '= @"
            %ANAME(TARGET_ID)%は嗜虐的な表情を浮かべ、%ANAME(MAIN_CHARA_ID)%を数度打擲する
            ……%ANAME(MAIN_CHARA_ID)%にとってその苦痛と屈辱は、最早快感に変わりつつある

            %ANAME(TARGET_ID)%は%ANAME(MAIN_CHARA_ID)%をその場に跪かせると、自身の昏い欲望が満足する打擲を続けた
            室内にはぴしゃりと肉を打つ音と、どこか色を帯びた呻きが静かに響き続けた……[$W]

            "
    }
    CALL PRINT_DIAG(TEXT)
    RETURN 0
ENDIF
;肉体関係許可
{
    TEXT '= @"
        %ANAME(TARGET_ID)%は嗜虐的な表情を浮かべ、%ANAME(MAIN_CHARA_ID)%を数度打擲する
        ……%ANAME(MAIN_CHARA_ID)%にとってその苦痛と屈辱は、最早快感に変わりつつある[$W]

        %ANAME(TARGET_ID)%は%ANAME(MAIN_CHARA_ID)%をその場に跪かせると、自身の昏い欲望を発散するために打擲を続ける[$W]

        %ANAME(MAIN_CHARA_ID)%を打つ度に%ANAME(TARGET_ID)%は内から昏い劣情がこみ上げるのを感じていた
        対する%ANAME(MAIN_CHARA_ID)%も苦痛を伴う痴態を晒すことに性的な快感を感じ、それを隠さなくなってきている[$W]

        二人の行為は次第にエスカレートしていく……[$W]

        %ANAME(TARGET_ID)%は%ANAME(MAIN_CHARA_ID)%を\"使って\"自身に渦巻く屈折した欲望を充足させようとしている
        %IS_MALE(TARGET_ID) ? "彼" # "彼女"%が取った手段は……

        "
}
CALL PRINT_DIAG(TEXT)
VARS CANDIDATES, 4
CANDIDATES:0 '= @"激しく打ち据える"
CANDIDATES:1 '= @"犬のように扱う"
CANDIDATES:2 '= @"自らを辱めさせる"
CANDIDATES:3 '= @"ここで切り上げる"

{
    CALL ASK_MULTI_ANNOTATION_P(
        @"%CANDIDATES:0%", @"%ANAME(TARGET_ID)%は手や道具を使って%ANAME(MAIN_CHARA_ID)%を嬲る"
        ,@"%CANDIDATES:1%", @"%ANAME(MAIN_CHARA_ID)%に舌だけでの奉仕を強要する"
        ,@"%CANDIDATES:2%", @"%ANAME(MAIN_CHARA_ID)%に眼前で自身を慰めさせ、痴態を晒させる"
        ,@"%CANDIDATES:3%", "逢瀬を終了"
        )
}
SELECTCASE RESULT
    CASE 0, 1, 2
        CVARSET CFLAG, GETNUM(CFLAG, "調教参加フラグ") , 0
        FLAG:ターンエンド調教 = 調教_慰安
        CFLAG:MAIN_CHARA_ID:調教参加フラグ = 1
        CFLAG:TARGET_ID:調教参加フラグ = 1
        ;ウフフ処理開始
        CALL FL_PLAYSE("Whip_0.mp3")
        CALL ADD_EVENTTRAIN_CALLEE("RELATION_DAILY_躾の時間")
        CALL ADD_EVENTEND_CALLEE("RELATION_DAILY_躾の時間")
        SELECTCASE RESULT
            CASE 0
                CALL DAILY_MAP_SET("調教", "ＳＭ")
                PRINTFORMW %ANAME(TARGET_ID)%は自らの手練を駆使し、%ANAME(MAIN_CHARA_ID)%をさらに嬲ることにした…
            CASE 1
                CALL DAILY_MAP_SET("調教", "舌技")
                PRINTFORMW %ANAME(TARGET_ID)%は%ANAME(MAIN_CHARA_ID)%に対し、舌だけを使って自身を満足させるよう強要した…
            CASE 2
                CALL DAILY_MAP_SET("調教", "自慰")
                PRINTFORMW %ANAME(TARGET_ID)%は%ANAME(MAIN_CHARA_ID)%に対し、痴態を晒させ、自身を楽しませるよう命じた…
        ENDSELECT

        ;ウフフ省略
    CASEELSE
        CALL FUCK_SM_S(TARGET_ID, MAIN_CHARA_ID)
        CALL FUCK_SM_S(MAIN_CHARA_ID, TARGET_ID)
        {
            TEXT '= @"

                ………………[$W]
                …………[$W]
                ……[$W]

                熱い交わりを通して二人の関係はさらに深まったようだ[$W]
                "
        }
        CALL PRINT_DIAG(TEXT)

        VARI 従属度加算値
        VARI 支配度加算値
        VARI 依存度加算値
        従属度加算値 = RAND(1, 3) * 30
        支配度加算値 = RAND(1, 3) * 30
        依存度加算値 = RAND(1, 3) * 30
        PRINTFORMW 相互の依存度+{依存度加算値}　従属度+{従属度加算値}　支配度+{支配度加算値}
        CALL REL_ADD(MAIN_CHARA_ID, TARGET_ID,, 依存度加算値, 従属度加算値)
        CALL REL_ADD(TARGET_ID, MAIN_CHARA_ID,, 依存度加算値,, 支配度加算値)
ENDSELECT

RETURN 1

;ターンエンド調教開始直前処理
@EVENTTRAIN_RELATION_DAILY_躾の時間()
VARS TEXT
VARI MAIN_CHARA_ID
VARI TARGET_ID
VARI REL_DID
VARS 調教タイプ
MAIN_CHARA_ID = DAILY_MAP_GETINT("MAIN_CHARA_ID")
TARGET_ID = DAILY_MAP_GETINT("TARGET_ID")

SELECTCASE DAILY_MAP_GET("調教")
    CASE "ＳＭ"
        TCVAR:MAIN_CHARA_ID:奉仕者フラグ = 奉仕_ＳＭする
        TCVAR:TARGET_ID:被奉仕者フラグ = 奉仕_ＳＭする
        CFLAG:MAIN_CHARA_ID:主導除外 = 1
    CASE "舌技"
        TCVAR:MAIN_CHARA_ID:奉仕者フラグ = 奉仕_舌技させる
        TCVAR:TARGET_ID:被奉仕者フラグ = 奉仕_舌技させる
        CFLAG:MAIN_CHARA_ID:主導除外 = 1
    CASE "自慰"
        TCVAR:MAIN_CHARA_ID:奉仕者フラグ = 奉仕_自慰させる
        TCVAR:TARGET_ID:被奉仕者フラグ = 奉仕_自慰させる
        CFLAG:MAIN_CHARA_ID:主導除外 = 1

ENDSELECT
TFLAG:奉仕モード = 1
TFLAG:調教ターン数 = 25
FLAG:調教スキップ可 = 1

;ターンエンド調教後処理
@EVENTEND_RELATION_DAILY_躾の時間()
VARS TEXT
VARI MAIN_CHARA_ID
VARI TARGET_ID
MAIN_CHARA_ID = DAILY_MAP_GETINT("MAIN_CHARA_ID")
TARGET_ID = DAILY_MAP_GETINT("TARGET_ID")
{
    TEXT '= @"

        ………………[$W]
        …………[$W]
        ……[$W]

        秘めたる欲望の発散を通して二人の関係はさらに深まったようだ[$W]
        "
}
CALL PRINT_DIAG(TEXT)

VARI 従属度加算値
VARI 支配度加算値
VARI 依存度加算値
従属度加算値 = RAND(1, 3) * 30
支配度加算値 = RAND(1, 3) * 30
依存度加算値 = RAND(1, 3) * 30
PRINTFORMW 相互の依存度+{依存度加算値}　従属度+{従属度加算値}　支配度+{支配度加算値}
CALL REL_ADD(MAIN_CHARA_ID, TARGET_ID,, 依存度加算値, 従属度加算値)
CALL REL_ADD(TARGET_ID, MAIN_CHARA_ID,, 依存度加算値,, 支配度加算値)


code:
@EVENT_DAILY()
#DIM EVENT_NUM
#DIMS NAME_ENG
#DIMS NAME_JAP
#DIM EVENT_COUNT
#DIM EVENT_ARRAY, VARSIZE("SHAFFLE_ARRAY")

DAILY_CANCEL = 0
EVENT_COUNT = DAILY_EVENT_COUNT
CVARSET CFLAG, GETNUM(CFLAG, "関係性デイリー実施済"), 0

SIF !IS_DAILY_EVENT_HAPPEN(MASTER)
	RETURN 0

CALL DAILY_DERIVATION()

SIF DAILY_CANCEL
	RETURN 0

EVENT_NUM = DAILY_EVENT_NUM

CALL FISHER_YATES_SHAFFLE(EVENT_NUM)

ARRAYCOPY "SHAFFLE_ARRAY", "EVENT_ARRAY"

FOR LOCAL, 0, EVENT_NUM
	;ターンエンド調教が有効な場合は後続のデイリーイベントを実行しない
	SIF FLAG:ターンエンド調教
		BREAK
	SIF EVENT_COUNT == 0
		BREAK
	NAME_ENG = %DAILY_EVENT_NAME_ENG:デイリー_通常:(EVENT_ARRAY:LOCAL)%
	NAME_JAP = %DAILY_EVENT_NAME:デイリー_通常:(EVENT_ARRAY:LOCAL)%

	SIF DAILY_GET_DISABLE_CONFIG(NAME_ENG)
		CONTINUE

	TRYCCALLFORM EVENT_DAILY_%NAME_ENG%_RATE()

		SIF RESULT * DAILY_EVENT_ODDS <= RAND:1000
			CONTINUE

		;放浪中の拠点フェイズデイリーは特殊な関数が必要
		IF !CFLAG:MASTER:所属
			RESULT = 0
			TRYCALLFORM EVENT_DAILY_%NAME_ENG%_ALLOW_WHEN_WANDERING()
			SIF RESULT == 0
				CONTINUE
		ENDIF

		RESULT = 1
		TRYCALLFORM EVENT_DAILY_%NAME_ENG%_DECISION()
		SIF RESULT == 0
			CONTINUE

		VARSET DAILY_TARGET, -1
		VARSET DAILY_TARGET_NUM
		RESULT = 1
		TRYCALLFORM EVENT_DAILY_%NAME_ENG%_SETTARGET()
		SIF RESULT == 0
			CONTINUE

		;デイリーイベントの実行が確定
		;キャラ情報の初期化
		FOR LOCAL, 0, CHARANUM
			CALL SET_CHARA_CLOTH_DATA(LOCAL)
		NEXT
		RESULTS =
		TRYCALLFORM EVENT_DAILY_%NAME_ENG%_NAME()
		IF RESULTS == ""
			CALL DAILY_START(NAME_JAP)
		ELSE
			CALL DAILY_START(RESULTS)
		ENDIF
		CALLFORM EVENT_DAILY_%NAME_ENG%()

		IF RESULT == 1
			EVENT_COUNT --
		ENDIF
		SIF DAILY_CANCEL
			RETURN
	CATCH
		;DEBUGPRINTFORML EVENT_DAILY_%NAME_ENG%_RATEみつからず
	ENDCATCH
NEXT

;-------------------------------------------------------------------------------
;指定キャラについて、「放浪したり死んだりしていない」「捕虜でない」「どこかの勢力に所属している」を満たしているなら真
;-------------------------------------------------------------------------------
@IS_DAILY_EVENT_HAPPEN(ARG:0)
#FUNCTION
IF CFLAG:(ARG:0):特殊状態 == 0 && CFLAG:(ARG:0):捕虜先 == 0
	RETURNF 1
ENDIF
RETURNF 0

;-------------------------------------------------------------------------------
;デイリーイベントにおいて、ランダムに対象キャラを選出する
;捕虜でなく、死んだりしていないのは前提
;ARG:0 0自勢力キャラ　1全勢力から選択
;RESULT 選出された対象キャラ
;-------------------------------------------------------------------------------
@DAILY_EVENT_RAND_CHARASELECT(ARG:0 = 0)
IF ARG:0
	CALL SELECT_CHARA_RANDOM("DAILY_EVENT_RAND_CHARASELECT_ALL")
ELSE
	CALL SELECT_CHARA_RANDOM("DAILY_EVENT_RAND_CHARASELECT_OUR_COUNTRY")
ENDIF
RETURN RESULT

@SELECT_CHARA_RANDOM_LOGIC_DAILY_EVENT_RAND_CHARASELECT_OUR_COUNTRY(対象)
#DIM 対象
RETURN CFLAG:対象:所属 == CFLAG:MASTER:所属 && !CFLAG:(対象):捕虜先 && !CFLAG:(対象):特殊状態

@SELECT_CHARA_RANDOM_LOGIC_DAILY_EVENT_RAND_CHARASELECT_ALL(対象)
#DIM 対象
RETURN !CFLAG:(対象):捕虜先 && !CFLAG:(対象):特殊状態

;-------------------------------------------------------------------------------
;デイリーイベントにおいて、ランダムに対象都市を選出する
;ARG:0 0自勢力都市　1全勢力から選択
;RESULT 選出された対象都市
;-------------------------------------------------------------------------------
@DAILY_EVENT_RAND_CITYSELECT(ARG:0 = 0)
#DIM 対象, MAX_CITY
#DIM カウンタ, 1
VARSET 対象
VARSET カウンタ

;シャッフル用の配列を作成する
FOR LOCAL, 1, MAX_CITY
	IF CITY_TYPE:LOCAL == 1
		BREAK
	ENDIF
	IF ARG:0 || (!ARG:0 && CITY_OWNER:LOCAL == CFLAG:MASTER:所属)
		対象:カウンタ = LOCAL
		カウンタ ++
	ENDIF
NEXT

RETURN カウンタ ? 対象:(RAND:カウンタ) # -1

;-------------------------------------------------------------------------------
;デイリーイベントにおいて、ランダムに対象国家を選出する
;RESULT 選出された対象国家
;-------------------------------------------------------------------------------
@DAILY_EVENT_RAND_COUNTRYSELECT
#DIM 対象, MAX_COUNTRY
#DIM カウンタ
VARSET 対象
VARSET カウンタ

;シャッフル用の配列を作成する
FOR LOCAL, 0, MAX_COUNTRY
	IF IS_COUNTRY(LOCAL)
		対象:カウンタ = LOCAL
		カウンタ ++
	ENDIF
NEXT

RETURN カウンタ ? 対象:(RAND:カウンタ) # -1


code:
;-------------------------------------------------
;;; 共通デイリーイベント登録処理
;-------------------------------------------------
@CREATE_DAILY_MAP()
CALL REGISTER_DAILY(デイリー_通常       ,"RELATION_LOVERS"                     ,"関係性イベント　恋人")
CALL REGISTER_DAILY(デイリー_通常       ,"RELATION_MASTER_AND_SLAVE"           ,"関係性イベント　支配と服従")
; CALL REGISTER_DAILY(デイリー_通常       ,"3P"                            ,"3P")
; CALL REGISTER_DAILY(デイリー_通常       ,"ALCOHOL"                       ,"酒宴の誘い")
; CALL REGISTER_DAILY(デイリー_通常       ,"ARBEIT"                        ,"アルバイト")
; CALL REGISTER_DAILY(デイリー_通常       ,"ASSASSIN_GIRL"                 ,"暗殺者")
; CALL REGISTER_DAILY(デイリー_通常       ,"BANDIT_ARREST"                 ,"野盗の放浪者捕縛")
; CALL REGISTER_DAILY(デイリー_通常       ,"BANQUET"                       ,"宴会とその後…")
; CALL REGISTER_DAILY(デイリー_通常       ,"BATH_PLAY"                     ,"混浴の誘い")
; CALL REGISTER_DAILY(デイリー_通常       ,"BLAIN_WASH"                    ,"謎の催眠術師")
; CALL REGISTER_DAILY(デイリー_通常       ,"BOUNCER"                       ,"用心棒")
; CALL REGISTER_DAILY(デイリー_通常       ,"BOUNTY_HUNTER"                 ,"賞金首討伐")
; CALL REGISTER_DAILY(デイリー_通常       ,"CONFESSION"                    ,"告白")
; CALL REGISTER_DAILY(デイリー_通常       ,"DAILY_MISC"                    ,"小型イベント")
; CALL REGISTER_DAILY(デイリー_通常       ,"DATE"                          ,"デート")
; CALL REGISTER_DAILY(デイリー_通常       ,"DOCTOR_DRUG"                   ,"麻薬治療医")
; CALL REGISTER_DAILY(デイリー_通常       ,"DOCTOR_GAIRAI"                 ,"闇医者")
; CALL REGISTER_DAILY(デイリー_通常       ,"DRUG_ADDICT"                   ,"薬物中毒者の末路")
; CALL REGISTER_DAILY(デイリー_通常       ,"DRUG_SEX"                      ,"シャブセックス")
; ; CALL REGISTER_DAILY(デイリー_通常       ,"DRUNK_RAPE"                    ,"酔姦")
; CALL REGISTER_DAILY(デイリー_通常       ,"EVERY_DAY"                     ,"とりとめもない日常")
; ; CALL REGISTER_DAILY(デイリー_通常       ,"FAIR_DATE"                     ,"縁日デート")
; ; CALL REGISTER_DAILY(デイリー_通常       ,"FAIRY_LIFE"                    ,"妖精暮らし")
; ;CALL REGISTER_DAILY(デイリー_通常       ,"FRIEND_H_DAY"                  ,"ある日の出来事")

;;; デイリーイベント用連想配列操作関数
;;; 各デイリーイベントの発生時に初期化される。内容はイベント毎に自由に使用可
@DAILY_MAP_CREATE()
MAP_CREATE "DAILY_MAP"

@DAILY_MAP_RELEASE()
MAP_RELEASE "DAILY_MAP"
RETURN RESULT

@DAILY_MAP_REMOVE(KEY)
#DIMS KEY
MAP_REMOVE "DAILY_MAP", KEY

@DAILY_MAP_GET(KEY)
#FUNCTIONS
#DIMS KEY
RETURNF MAP_GET("DAILY_MAP", KEY)

@DAILY_MAP_GETINT(KEY)
#FUNCTION
#DIMS KEY
RETURNF TOINT(MAP_GET("DAILY_MAP", KEY))

@DAILY_MAP_SET(KEY, VALUE)
#DIMS KEY
#DIMS VALUE
MAP_SET "DAILY_MAP", KEY, VALUE
RETURN RESULT

@DAILY_MAP_SETINT(KEY, VALUE)
#DIMS KEY
#DIM  VALUE
MAP_SET "DAILY_MAP", KEY, TOSTR(VALUE)
RETURN RESULT


code:
@GET_DAILY_INDEX_FROM_ENG(ジャンル,アクセサ)
#FUNCTION
#DIM ジャンル
#DIMS アクセサ
FOR LOCAL, 0, VARSIZE("DAILY_EVENT_NAME_ENG", 1)
	SIF DAILY_EVENT_NAME_ENG:ジャンル:LOCAL == アクセサ
		RETURNF LOCAL
NEXT
RETURNF -1

@DAILY_GET_DISABLE_CONFIG(アクセサ)
#FUNCTION
#DIMS アクセサ
#DIM 番号
番号 = FINDELEMENT(DAILY_DISABLE_NAME, アクセサ, 0, VARSIZE("DAILY_DISABLE_NAME"), 1)
SIF 番号 >= 0
	RETURNF DAILY_DISABLE:番号

THROW DAILY_DISABLE_NAME上に存在しない名前%アクセサ%が渡されました

@DAILY_SET_DISABLE(アクセサ, 状態)
#DIMS アクセサ
#DIM 番号
#DIM 状態
番号 = FINDELEMENT(DAILY_DISABLE_NAME, アクセサ, 0, VARSIZE("DAILY_DISABLE_NAME"), 1)
SIF 番号 < 0
	RETURN 0

DAILY_DISABLE:番号 = 状態
RETURN 1

@REGISTER_DAILY(ジャンル, アクセサ, 名前)
#DIM ジャンル
#DIMS アクセサ
#DIMS 名前
#DIMS 派生
#DIM 番号
SIF !INRANGE(ジャンル, デイリー_通常, デイリー_通常派生)
	THROW DAILY_REGISTERに存在しないジャンル{ジャンル}が渡されました

IF ジャンル == デイリー_通常派生
	派生 = DERIVATION_
ELSE
	派生 =
ENDIF

IF GROUPMATCH(ジャンル, デイリー_通常)
	TRYCCALLFORM EVENT_DAILY_%アクセサ%_%派生%RATE()
	CATCH
		SETCOLOR カラー_警告
		PRINTFORMW DAILY_REGISTERに渡された%名前%,%アクセサ%のRATE関数が見つかりません
		PRINTFORMW あなたがプレイヤーなら、パッチに抜けがないか、競合がないかを確認してください
		PRINTFORMW あなたが開発者なら、RATE関数以下の必須関数を設定したかを確認してください
		RETURN
	ENDCATCH
ELSE
	TRYCCALLFORM EVENT_DAILY_%派生%%アクセサ%_DISABLE()
	CATCH
		SETCOLOR カラー_警告
		PRINTFORMW DAILY_REGISTERに渡された%名前%,%アクセサ%のDISABLE関数が見つかりません
		PRINTFORMW あなたがプレイヤーなら、パッチに抜けがないか、競合がないかを確認してください
		PRINTFORMW あなたが開発者なら、RATE関数以下の必須関数を設定したかを確認してください
		RETURN
	ENDCATCH
ENDIF

DAILY_EVENT_NAME_ENG:ジャンル:(DAILY_EVENT_NUM:ジャンル) = %アクセサ%
DAILY_EVENT_NAME:ジャンル:(DAILY_EVENT_NUM:ジャンル) = %名前%

;派生形はDISABLE_NAMEに登録する必要がないのでFINALLYへ
SIF ジャンル == デイリー_通常派生
	GOTO FINALLY

番号 = FINDELEMENT(DAILY_DISABLE_NAME, アクセサ, 0, VARSIZE("DAILY_DISABLE_NAME"), 1)

;登録済みならFINALLYへ
SIF 番号 != -1
	GOTO FINALLY

;まだ登録していないなら、空いている番号を探して登録
FOR LOCAL, 0, VARSIZE("DAILY_DISABLE_NAME")
	IF DAILY_DISABLE_NAME:LOCAL == ""
		DAILY_DISABLE_NAME:LOCAL = %アクセサ%
		BREAK
	ENDIF
NEXT

$FINALLY

DAILY_EVENT_NUM:ジャンル ++


code:
;CONSTに追記する形でのデイリー登録は廃止されました

#DIM CONST デイリー_通常 = 0
#DIM CONST デイリー_通常派生 = 1

#DIMS DAILY_NAME
#DIM SAVEDATA DVAR, 1000
;デイリーイベント用STRING
#DIMS SAVEDATA DSTR, 1000

#DIM DAILY_TARGET, MAX_CHARA_NUM
#DIM DAILY_TARGET_NUM

;口上デイリーイベント用変数
#DIM SAVEDATA CHARADATA KDVAR, 200
#DIMS SAVEDATA CHARADATA KDSTR, 200

#DIM SAVEDATA CHARADATA KDATEVAR, 200

;それ以降のデイリーイベント発生をキャンセルするフラグ
#DIM DAILY_CANCEL

#DIMS DAILY_EVENT_NAME, 2, 1000
#DIMS DAILY_EVENT_NAME_ENG, 2, 1000
#DIMS KOJO_DAILY_EVENT_NAME,     200, 2, 20
#DIMS KOJO_DAILY_EVENT_NAME_ENG, 200, 2, 20

#DIM DAILY_EVENT_NUM, 2
#DIM KOJO_DAILY_EVENT_NUM, 200, 2

#DIM  SAVEDATA DAILY_DISABLE,          VARSIZE("DAILY_EVENT_NAME_ENG", 1)
#DIMS SAVEDATA DAILY_DISABLE_NAME,     VARSIZE("DAILY_EVENT_NAME_ENG", 1)

#DIM  SAVEDATA KOJO_DAILY_DISABLE,          200, VARSIZE("KOJO_DAILY_EVENT_NAME_ENG", 2)
#DIMS SAVEDATA KOJO_DAILY_DISABLE_NAME,     200, VARSIZE("KOJO_DAILY_EVENT_NAME_ENG", 2)

#DIM  SAVEDATA  GLOBAL G_DAILY_DISABLE,          5, VARSIZE("DAILY_EVENT_NAME_ENG", 1)
#DIMS SAVEDATA  GLOBAL G_DAILY_DISABLE_NAME,     5, VARSIZE("DAILY_EVENT_NAME_ENG", 1)
#DIM  SAVEDATA  GLOBAL G_KOJO_DAILY_DISABLE,     5, 200, VARSIZE("KOJO_DAILY_EVENT_NAME_ENG", 2)
#DIMS SAVEDATA  GLOBAL G_KOJO_DAILY_DISABLE_NAME,5, 200, VARSIZE("KOJO_DAILY_EVENT_NAME_ENG", 2)

#DIM SAVEDATA DAILY_EVENT_COUNT
#DIM SAVEDATA KOJO_DAILY_EVENT_COUNT
#DIM SAVEDATA DAILY_EVENT_ODDS
#DIM SAVEDATA KOJO_DAILY_EVENT_ODDS

#DIM SAVEDATA GLOBAL G_DAILY_EVENT_COUNT, 5
#DIM SAVEDATA GLOBAL G_KOJO_DAILY_EVENT_ODDS, 5
#DIM SAVEDATA GLOBAL G_KOJO_DAILY_EVENT_COUNT, 5
#DIM SAVEDATA GLOBAL G_DAILY_EVENT_ODDS, 5

#DIM CONST DAILY_GENRE_NUM = 5
#DIM CONST デイリー_ジャンル_通常 = 0
#DIM CONST デイリー_ジャンル_エロ = 1
#DIM CONST デイリー_ジャンル_その他 = 5
{
    #DIMS CONST デイリー_ジャンル名 =
        "通常",
        "エロ",
        "",
        "",
        "その他",

}

;-------------------------------
; デイリー管理用変数
;-------------------------------
#DIM SAVEDATA DAILY_PROGRESS_MOSER
#DIM SAVEDATA DAILY_MOSER_COMPLETE_DATE


code:
;---------------------
;基本的な発生確率(1000分率 100で10%)
;これにコンフィグ項目の発生頻度がかけられるので、必ずしもこの通りにはならない
;---------------------
@EVENT_DAILY_XX_RATE()
RETURN 0

;---------------------
;確率以外の発生判定
;〇期以降になると発生するとか、デイリー側で利用している変数が-1だったら起こさない　みたいなはじき方をするときに使う
;---------------------
@EVENT_DAILY_XX_DECISION()
RETURN 1

;---------------------
;ジャンル
;コンフィグ設定で使用
;---------------------
@EVENT_DAILY_XX_GENRE()
RETURN デイリー_ジャンル_通常

;---------------------
;特定の条件を満たすキャラをランダムに選択する場合に利用
;他の関数は必須だが、これだけはなくてもよい　というかパフォーマンスへ影響するので不要なら作ってはならない
;対象が存在せずデイリーを開始できない場合は0を返すことでデイリーの発生をキャンセルする
;---------------------
@EVENT_DAILY_XX_SETTARGET()
FOR LOCAL, 0, CHARANUM

NEXT
RETURN 1

;---------------------
;イベントの進行度合いに応じてイベント名を変更したい場合に利用
;変更する必要がない場合、この関数は不要
;---------------------
@EVENT_DAILY_XX_NAME()
RESULTS = ""

;---------------------
;本体
;イベントが発生した場合は1、発生しなかった場合は0を返す
;発生しなかったというのは例えば、特定条件を満たすキャラからランダムに一人選ぶデイリーで、そもそもその条件を満たすキャラが一人もいないみたいなとき
;旧仕様で作ったことある人向けにいうと「旧仕様のデイリー本体冒頭で-1を返すような状況」
;---------------------
@EVENT_DAILY_XX()

RETURN 1


code:
;---------------------
;対応するデイリーのDISABLEを返す。設定しない場合、イベントは発生しない。
;---------------------
@EVENT_DAILY_DERIVATION_XX_DISABLE()
RETURN DAILY_GET_DISABLE_CONFIG("")

;---------------------
;発生判定
;〇期以降になると発生するとか、デイリー側で利用している変数が-1だったら起こさない　みたいなはじき方をするときに使う
;---------------------
@EVENT_DAILY_DERIVATION_XX_DECISION()
RETURN 1

;---------------------
;特定の条件を満たすキャラをランダムに選択する場合に利用
;他の関数は必須だが、これだけはなくてもよい　というかパフォーマンスへ影響するので不要なら作ってはならない
;対象が存在せずデイリーを開始できない場合は0を返すことでデイリーの発生をキャンセルする
;---------------------
@EVENT_DAILY_DERIVATION_XX_SETTARGET()
FOR LOCAL, 0, CHARANUM

NEXT
RETURN 1

;---------------------
;イベントの進行度合いに応じてイベント名を変更したい場合に利用
;変更する必要がない場合、この関数は不要
;---------------------
@EVENT_DAILY_DERIVATION_XX_NAME()
RESULTS = ""

;---------------------
;本体
;---------------------
@EVENT_DAILY_DERIVATION_XX()

RETURN 1


code:
;朝イベントに関する処理

;-------------------------------------------------
;朝に起こるイベント
;-------------------------------------------------
@EVENT_MORNING
;コンフィグで抑制されているなら戻る
IF CONFIG:0 == 1
	RETURN
ENDIF

;-------------------------------------------------
;特殊な朝イベント
;-------------------------------------------------
@EVENT_MORNING_SP
#DIM LIST_CHARA, MAX_CHARA_NUM
#DIM LIST_LAST

;主人公が捕虜のとき
IF CFLAG:MASTER:捕虜先 >= 1
	;外来勢力とホフゴブ勢力の番号を取得(ID:299と300)
	LOCAL:3 = GET_COUNTRY_FROM_ID(SP_COUNTRY_ID:(特殊勢力_外来人))
	LOCAL:5 = GET_COUNTRY_FROM_ID(SP_COUNTRY_ID:(特殊勢力_ゴブリン))
	;逆調教のメイン調教者のキャラ番号を取得
	LOCAL:4 = ID_TO_CHARA(FLAG:逆調教メイン調教者)

	;主人公を囚えているのが外来勢力以外で、逆調教のメイン調教者が存在し、性知識Lv3以下、捕虜でない
	IF CFLAG:MASTER:捕虜先 != LOCAL:3 && CFLAG:MASTER:捕虜先 != LOCAL:5 && LOCAL:4 >= 0 && ABL:(LOCAL:4):性知識 <= 3 && CFLAG:(LOCAL:4):所属 == CFLAG:MASTER:捕虜先 && ABL:(LOCAL:4):9 == 0
		CALL SINGLE_DRAWLINE
		;口上の表示
		CALL KOJO_EVENT(LOCAL:4, 241)

		SELECTCASE ABL:(LOCAL:4):性知識
			CASE 0
				EXP:(LOCAL:4):性知識経験値 += 200
			CASE 1
				EXP:(LOCAL:4):性知識経験値 += 50
			CASE 2
				EXP:(LOCAL:4):性知識経験値 += 20
			CASE 3
				EXP:(LOCAL:4):性知識経験値 += 8
		ENDSELECT
		CALL TRAIN_AUTO_ABLUP(LOCAL:4)
	ENDIF

	;主人公が捕虜でないとき
ELSE
	;性知識Lv1～2で[恋慕]持ちのキャラは自分から性知識を学ぶ
	LIST_LAST = 0
	FOR LOCAL:0, 0, CHARANUM
		IF LOCAL:0 != MASTER && TALENT:(LOCAL:0):恋慕 && GROUPMATCH(ABL:(LOCAL:0):性知識, 1, 2) && !TALENT:(LOCAL:0):虚ろ && CFLAG:(LOCAL:0):特殊状態 == 0 && CFLAG:(LOCAL:0):捕虜先 == 0
			LIST_CHARA:(LIST_LAST) = LOCAL:0
			LIST_LAST ++
		ENDIF
	NEXT
	;人数が多いほど高確率で発生
	IF RAND:(LIST_LAST + 1) >= 1
		LOCAL:2 = LIST_CHARA:(RAND:LIST_LAST)

		CALL SINGLE_DRAWLINE
		;口上の表示
		CALL KOJO_EVENT(LOCAL:2, 240)

		EXP:(LOCAL:2):性知識経験値 += 50
		CALL TRAIN_AUTO_ABLUP(LOCAL:2)
	ENDIF

ENDIF


code:
;捕虜の扱い関係

;-------------------------------------------------
;捕虜の扱いを設定する
;-------------------------------------------------
@SETSTATE_PRISONER
#DIM FIRST_LINE
;1ページ22人までのコマンドが表示される
;LOCAL
	;0:ループ用
	;5:捕虜の人数/選んだボタンの対象キャラ
	;6:選んだボタンの捕虜の扱い
	;7:表示した行数をカウントする
	;8:ループ内で捕虜の人数をカウントするためにある
	;10:最大ページ
	;11:現在のページ
	;15:表示位置調整用
	;20:触手調教可能

;●捕虜の人数をカウント
LOCAL:5 = 0
FOR LOCAL:0, 0, CHARANUM
	IF LOCAL:0 != MASTER && CFLAG:(LOCAL:0):捕虜先 != 0 && CFLAG:(LOCAL:0):捕虜先 == CFLAG:MASTER:所属 && CFLAG:(LOCAL:0):軟禁中 == 0
		LOCAL:5 ++
	ENDIF
NEXT

;捕虜が一人もいなければ戻る
IF LOCAL:5 == 0
	RETURN
ENDIF

;●表示部分
LOCAL:10 = (LOCAL:5 - 1) / 22 + 1
LOCAL:11 = 1

;触手調教が可能かどうかを判定
LOCAL:20 = ITEM:触手部屋 && ID_TO_CHARA(FLAG:触手部屋管理者) >= 0 && IS_SYOKUSYU_MANAGE(ID_TO_CHARA(FLAG:触手部屋管理者))
FIRST_LINE = LINECOUNT
$SHOW_LOOP

CALL SINGLE_DRAWLINE
PRINTFORML 各捕虜の扱いを設定して下さい
CALL SINGLE_DRAWLINE

PRINTFORM %TOSTR_SPACE(40)%
PRINTFORM <一括>
PRINTBUTTON "{拘留}",10
PRINTBUTTON "{拷問}",12
PRINTBUTTON "{身体開発}",13
PRINTBUTTON "{説得}",14
PRINTBUTTON "{性処理}",15
IF LOCAL:20
	PRINTBUTTON "{触手調教}",16
ENDIF
PRINTBUTTON "{娼館}",17
PRINTBUTTON "{搾乳}",18
PRINTL

LOCAL:7 = 0
LOCAL:8 = 0
LOCAL:12 = (LOCAL:11 - 1) * 22
LOCAL:13 = LOCAL:11 * 22
FOR LOCAL:0, 0, CHARANUM
	IF LOCAL:0 != MASTER && CFLAG:(LOCAL:0):捕虜先 == CFLAG:MASTER:所属 && CFLAG:(LOCAL:0):軟禁中 == 0
		IF LOCAL:8 >= LOCAL:12 && LOCAL:8 < LOCAL:13
			PRINTBUTTON @"{NO:(LOCAL:0)+100, 4}[%SNAME(LOCAL:0), MAX_CHARANAME_LENGTH / 2, LEFT%]", NO:(LOCAL:0)+100
			PRINT
			CALL PRINT_SEX(LOCAL:0, 1)
			IF TALENT:(LOCAL:0):崩壊
				CALL COLOR_PRINT("崩", 0xFF0000)
			ELSEIF TALENT:(LOCAL:0):虚ろ
				CALL COLOR_PRINT("虚", 0xEE7800)
			ELSE
				PRINT
			ENDIF
			IF CFLAG:(LOCAL:0):所属
				PRINTFORM 所属:%SNAME(GET_COUNTRY_BOSS(CFLAG:LOCAL:所属)), MAX_CHARANAME_LENGTH / 2, LEFT%
			ELSE
				PRINTFORM 所属:%@"----", MAX_CHARANAME_LENGTH / 2, LEFT%
			ENDIF
			SETCOLOR カラー_注釈
			PRINTFORM 精神:
			RESETCOLOR
			CALL PRINT_GRADATIONBAR(BASE:(LOCAL):精神力, MAXBASE:(LOCAL):精神力, 10, 0x5E9AFF)
			CALL SETSTATE_PRISONER_BUTTON(LOCAL:0, 0, "拘留")
			CALL SETSTATE_PRISONER_BUTTON(LOCAL:0, 2, "拷問")
			CALL SETSTATE_PRISONER_BUTTON(LOCAL:0, 3, "身体開発")
			CALL SETSTATE_PRISONER_BUTTON(LOCAL:0, 4, "説得")
			CALL SETSTATE_PRISONER_BUTTON(LOCAL:0, 5, "性処理")
			IF LOCAL:20
				CALL SETSTATE_PRISONER_BUTTON(LOCAL:0, 6, "触手調教")
			ENDIF
			CALL SETSTATE_PRISONER_BUTTON(LOCAL:0, 7, "娼館")
			CALL SETSTATE_PRISONER_BUTTON(LOCAL:0, 8, "搾乳")
			PRINTL
			LOCAL:7 ++
		ENDIF
		LOCAL:8 ++
	ENDIF
NEXT
CALL SINGLE_DRAWLINE

IF LOCAL:10 >= 2
	LOCAL:7 += 2

	LOCAL:15 = 25
	IF LOCAL:11 >= 2
		PRINTBUTTON "[8] 前のページ", 8
		LOCAL:15 -= 12
	ENDIF
	PRINTFORM %TOSTR_SPACE(LOCAL:15)%

	LOCALS:0 = page{LOCAL:11}/{LOCAL:10}
	PRINTPLAINFORM %LOCALS:0, 25, LEFT%

	IF LOCAL:11 < LOCAL:10
		PRINTBUTTON "[9] 次のページ", 9
	ENDIF
	PRINTL
	CALL SINGLE_DRAWLINE
ENDIF
PRINTBUTTON "[0] 決  定", 0

REDRAW 0

$INPUT_LOOP
INPUT

IF RESULT == 0
	REDRAW 1
	RETURN
ELSEIF RESULT == 8 && LOCAL:11 >= 2
	LOCAL:11 --
ELSEIF RESULT == 9 && LOCAL:11 < LOCAL:10
	LOCAL:11 ++
ELSEIF RESULT == 10 || (RESULT >= 12 && RESULT <= 15) || (RESULT == 16 && LOCAL:20) || RESULT == 17 || RESULT == 18
	CALL SETSTATE_PRISONER_SETALL(RESULT - 10)
ELSEIF INRANGE(RESULT, 100, 999) && NO_TO_CHARA(RESULT - 100) != -1
	LOCAL:2 = NO_TO_CHARA(RESULT - 100)
	VARSET SHOP_CHARA_LIST, -1
	LOCAL:1 = 0
	FOR LOCAL:0, 0, CHARANUM
		IF CFLAG:(LOCAL:0):捕虜先 == CFLAG:MASTER:所属
			SHOP_CHARA_LIST:(LOCAL:1) = LOCAL:0
			LOCAL:1 ++
		ENDIF
	NEXT
	CALL SHOW_INFO_WITH_UI(LOCAL:2, 1)
ELSEIF RESULT >= 1000
	LOCAL:5 = RESULT / 1000 - 1
	LOCAL:6 = RESULT % 1000
	IF LOCAL:5 < CHARANUM && LOCAL:5 != MASTER && CFLAG:(LOCAL:5):捕虜先 == CFLAG:MASTER:所属 && CFLAG:(LOCAL:5):軟禁中 == 0
		IF CFLAG:(LOCAL:5):捕虜の扱い != LOCAL:6 && (LOCAL:6 == 0 || (LOCAL:6 >= 2 && LOCAL:6 <= 5) || (LOCAL:6 == 6 && LOCAL:20)) || LOCAL:6 == 7 || LOCAL:6 == 8
			CFLAG:(LOCAL:5):捕虜の扱い = LOCAL:6
		ENDIF
	ENDIF
ELSE
	CLEARLINE 1
	GOTO INPUT_LOOP
ENDIF
CLEARLINE LINECOUNT - FIRST_LINE
GOTO SHOW_LOOP

;-------------------------------------------------
;SETSTATE_PRISONERで使用するボタン表示関数
;引数  0:捕虜のキャラ番号 1:扱いの種別番号 2:ボタンに表示される文字列
;-------------------------------------------------
@SETSTATE_PRISONER_BUTTON(ARG:0, ARG:1, ARGS:2)
IF CFLAG:(ARG:0):捕虜の扱い == ARG:1
	SETCOLOR カラー_選択中
	PRINTPLAINFORM \{%ARGS:2%\}
	RESETCOLOR
ELSE
	PRINTBUTTON @"\{%ARGS:2%\}", ARG:0 * 1000 + ARG:1 + 1000
ENDIF

;-------------------------------------------------
;捕虜の扱いを一括で(ARG:0)にする
;-------------------------------------------------
@SETSTATE_PRISONER_SETALL(ARG:0)
FOR LOCAL:0, 0, CHARANUM
	IF LOCAL:0 != MASTER && CFLAG:(LOCAL:0):捕虜先 != 0 && CFLAG:(LOCAL:0):捕虜先 == CFLAG:MASTER:所属 && CFLAG:(LOCAL:0):軟禁中 == 0
		CFLAG:(LOCAL:0):捕虜の扱い = ARG:0
	ENDIF
NEXT

;-------------------------------------------------
;捕虜の扱いに対応したイベント
;-------------------------------------------------
@EVENT_PRISONER
;LOCAL
	;2:一つ前に出力されたのが拘留状況描写である
	;20:触手部屋使用可能
	;21:触手調教の予定だった奴隷がいたか
;触手部屋が使用可能かどうかを判定
LOCAL:20 = 0
IF ITEM:触手部屋 && ID_TO_CHARA(FLAG:触手部屋管理者) >= 0 && IS_SYOKUSYU_MANAGE(ID_TO_CHARA(FLAG:触手部屋管理者))
	LOCAL:20 = 1
ENDIF

IF !LOCAL:20
	LOCAL:21 = 0
	FOR LOCAL:0, 0, CHARANUM
		IF CFLAG:(LOCAL:0):捕虜の扱い == 6
			CFLAG:(LOCAL:0):捕虜の扱い = 0
			LOCAL:21 = 1
		ENDIF
	NEXT
	IF LOCAL:21
		SETCOLOR カラー_注意
		PRINTFORMW ※触手部屋が使用できないため、一部の捕虜の扱いを「触手調教」から「拘留」に変更しました
		RESETCOLOR
	ENDIF
ENDIF

LOCAL:2 = 0
FOR LOCAL:0, 0, CHARANUM
	;LOCAL:0が捕虜であることを意味するお決まり表現
	IF LOCAL:0 != MASTER && CFLAG:(LOCAL:0):捕虜先 != 0 && CFLAG:(LOCAL:0):捕虜先 == CFLAG:MASTER:所属 && CFLAG:(LOCAL:0):軟禁中 == 0
		;捕虜の扱いが拘留の場合は扱いの描写が一行で終わるので前後に特別改行を入れずに連続で結果を出す
		;捕虜の扱いがそれ以外の場合は扱いの描写が複数行にわたるので分かりやすいように前後に改行が一行ずつはいるように調整する
		;イメージ
			;キャラ1拘留テキスト
			;キャラ2拘留テキスト
			;キャラ3拘留テキスト
			;
			;キャラ4拘留以外テキスト
			;キャラ4拘留以外テキスト続き
			;(wait)
			;キャラ5拘留以外テキスト
			;キャラ5拘留以外テキスト続き
			;(wait)
			;キャラ6拘留テキスト
			;キャラ7拘留テキスト
		IF CFLAG:(LOCAL:0):捕虜の扱い != 0 && LOCAL:2
			PRINTL
		ENDIF
		CALLFORM EVENT_PRISONER{CFLAG:(LOCAL:0):捕虜の扱い}(LOCAL:0)
		IF CFLAG:(LOCAL:0):捕虜の扱い != 0
			WAIT
			CALL TALENT_CHECK(LOCAL:0)
			PRINTL
			LOCAL:2 = 0
		ELSE
			LOCAL:2 = 1
		ENDIF
	ENDIF
NEXT

;■拘留
@EVENT_PRISONER0(ARG:0)
CALL EVENT_PRISONER_TEXT0(ARG:0)

;■拷問
@EVENT_PRISONER2(ARG:0)
CALL EVENT_PRISONER_TEXT2(ARG:0)
IF TALENT:(ARG:0):崩壊 || TALENT:(ARG:0):虚ろ

ELSE
	IF ABL:(ARG:0):身体 >= 70 || TALENT:(ARG:0):痛みに強い
		PRINTFORML %ANAME(ARG:0)%は歯を食いしばって必死に痛みと屈辱に耐えている…
		IF TALENT:(ARG:0):痛みに強い
			CFLAG:(ARG:0):捕虜怖 = 2500
		ELSE
			CFLAG:(ARG:0):捕虜怖 = 3300
		ENDIF
	ELSEIF TALENT:(ARG:0):痛みに弱い || TALENT:(ARG:0):幼稚
		PRINTFORML %ANAME(ARG:0)%は痛みのあまり泣き叫びながら許しを請うている…
		CFLAG:(ARG:0):捕虜怖 = 4100
	ELSE
		PRINTFORML %ANAME(ARG:0)%は鞭で打たれるたびに悲鳴を上げている…
		CFLAG:(ARG:0):捕虜怖 = 3500
	ENDIF
	CFLAG:(ARG:0):捕虜怖 = CFLAG:(ARG:0):捕虜怖 * (200 - ABL:(ARG:0):身体 / 2) / 200
	CFLAG:(ARG:0):捕虜怒 = 2000
	CFLAG:(ARG:0):捕虜哀 = 2000
ENDIF

CALL FUCK(ARG:0, "苦痛快楽, マゾ, 緊縛")

CFLAG:(ARG:0):精神力回復量補正 = 50

;■身体開発
@EVENT_PRISONER3(ARG:0)
CALL EVENT_PRISONER_TEXT3(ARG:0)
SELECTCASE RAND:4
	CASE 0
		CALL FUCK(ARG:0, "欲望, Ｃ, Ｃ")
	CASE 1
		CALL FUCK(ARG:0, "欲望, Ｂ, Ｂ")
	CASE 2
		CALL FUCK(ARG:0, "欲望, Ｖ, Ｖ")
	CASE 3
		CALL FUCK(ARG:0, "欲望, Ａ, Ａ")
ENDSELECT

CALL TRAIN_AUTO_ABLUP(ARG:0)
CFLAG:(ARG:0):捕虜怒 = 800
CFLAG:(ARG:0):捕虜哀 = 800
CFLAG:(ARG:0):捕虜怖 = 250

;■説得
@EVENT_PRISONER4(ARG:0)
CALL EVENT_PRISONER_TEXT4(ARG:0)
CALL TRAIN_AUTO_ABLUP(ARG:0)
CFLAG:(ARG:0):捕虜怒 = 0
CFLAG:(ARG:0):捕虜哀 = 0
CFLAG:(ARG:0):捕虜怖 = 100

;■性処理
@EVENT_PRISONER5(ARG:0)
CALL EVENT_PRISONER_TEXT5(ARG:0)

LOCAL:0 = 2000

IF TALENT:(ARG:0):処女 && HAS_VAGINA(ARG:0)
	IF TALENT:(ARG:0):処女 == 1
		LOCAL:0 += 3000
	ELSE
		LOCAL:0 += 1500
	ENDIF
ENDIF

IF TALENT:(ARG:0):キス未経験
	LOCAL:0 += 1000
ENDIF

SELECTCASE ABL:(ARG:0):欲望
	CASE 0
		TIMES LOCAL:0, 1.00
	CASE 1
		TIMES LOCAL:0, 0.70
	CASE 2
		TIMES LOCAL:0, 0.50
	CASE 3
		TIMES LOCAL:0, 0.35
	CASE 4
		TIMES LOCAL:0, 0.20
	CASEELSE
		LOCAL:0 = LOCAL:0 / (ABL:(ARG:0):欲望 + 1)
ENDSELECT

;絶頂経験による補正
LOCAL:0 = CALC_LOSEBASE_EXP_CORRECTION(ARG:0, LOCAL:0)

CFLAG:(ARG:0):捕虜怒 = LOCAL:0
CFLAG:(ARG:0):捕虜哀 = LOCAL:0
CFLAG:(ARG:0):捕虜怖 = LOCAL:0

CALL FUCK(ARG:0, "欲望, 性技, 精愛, 性交, 射精, Ｃ, Ｖ, Ｂ, Ｍ, Ａ, 苦痛快楽, 緊縛, マゾ, ＢＬ, 輪姦, 口淫, Ｖ性交, Ａ性交", "処女喪失, Ａ処女喪失, 膣内射精, キス喪失, 腸内射精, 口内射精", GET_SPERM_ID("兵士"), "兵士のペニス", "兵士", "", "輪姦")

;徴兵効率の増加
LOCAL:1 = 0
LOCAL:1 += MAX(ABL:(ARG:0):Ｃ感 - 1, 0)
LOCAL:1 += MAX(ABL:(ARG:0):Ｖ感 - 1, 0) * 3
LOCAL:1 += MAX(ABL:(ARG:0):Ａ感 - 1, 0) * 3
LOCAL:1 += MAX(ABL:(ARG:0):Ｂ感 - 1, 0)
LOCAL:1 += MAX(ABL:(ARG:0):Ｍ感 - 1, 0) / 2
LOCAL:1 = LOCAL:1 * (ABL:(ARG:0):欲望 + 2) / 2
LOCAL:2 = MIN(LOCAL:1 * 10 + 100, 800)

IF TALENT:(ARG:0):崩壊
	TIMES LOCAL:2, 0.40
ELSEIF TALENT:(ARG:0):虚ろ
	TIMES LOCAL:2, 0.80
ENDIF

SELECTCASE FLAG:兵数増加追加値
	CASE IS > 3000
		TIMES LOCAL:1, 0.10
	CASE IS > 2000
		TIMES LOCAL:1, 0.25
	CASE IS > 1000
		TIMES LOCAL:1, 0.5
ENDSELECT

FLAG:兵数増加追加値 += LOCAL:2

;■触手調教
@EVENT_PRISONER6(ARG:0)
CALL EVENT_PRISONER_TEXT6(ARG:0)

LOCAL:0 = 3000

IF TALENT:(ARG:0):処女 && HAS_VAGINA(ARG:0)
	IF TALENT:(ARG:0):処女 == 1
		LOCAL:0 += 4000
	ELSE
		LOCAL:0 += 2000
	ENDIF
ENDIF

SELECTCASE ABL:(ARG:0):欲望
	CASE 0
		TIMES LOCAL:0, 1.00
	CASE 1
		TIMES LOCAL:0, 0.95
	CASE 2
		TIMES LOCAL:0, 0.90
	CASE 3
		TIMES LOCAL:0, 0.85
	CASE 4
		TIMES LOCAL:0, 0.80
	CASEELSE
		LOCAL:0 = LOCAL:0 * 7 / (ABL:(ARG:0):欲望 + 5)
ENDSELECT

SELECTCASE ABL:(ARG:0):触手
	CASE 0
		TIMES LOCAL:0, 1.00
	CASE 1
		TIMES LOCAL:0, 0.70
	CASE 2
		TIMES LOCAL:0, 0.40
	CASE 3
		TIMES LOCAL:0, 0.25
	CASE 4
		TIMES LOCAL:0, 0.12
	CASEELSE
		LOCAL:0 = LOCAL:0 / (ABL:(ARG:0):触手 * 3)
ENDSELECT

;絶頂経験による補正
LOCAL:0 = CALC_LOSEBASE_EXP_CORRECTION(ARG:0, LOCAL:0)

CFLAG:(ARG:0):捕虜怒 = LOCAL:0
CFLAG:(ARG:0):捕虜哀 = LOCAL:0
CFLAG:(ARG:0):捕虜怖 = LOCAL:0

CALL FUCK(ARG:0, "欲望, 性技, 精愛, 性交, 射精, Ｃ, Ｖ, Ｂ, Ｍ, Ａ, 苦痛快楽, 緊縛, マゾ, 輪姦, 口淫, 触手, Ｖ性交, Ａ性交", "処女喪失, Ａ処女喪失, 膣内射精, キス喪失, 腸内射精, 口内射精", GET_SPERM_ID("触手"), "触手", "触手", "", "輪姦")

;絶頂回数の計算
LOCAL:1 = 0
LOCAL:1 += MAX(ABL:(ARG:0):Ｃ感 - 1, 0) * 2
LOCAL:1 += MAX(ABL:(ARG:0):Ｖ感 - 1, 0) * 3
LOCAL:1 += MAX(ABL:(ARG:0):Ａ感 - 1, 0) * 3
LOCAL:1 += MAX(ABL:(ARG:0):Ｂ感 - 1, 0) * 2
LOCAL:1 += MAX(ABL:(ARG:0):Ｍ感 - 1, 0)
LOCAL:1 = LOCAL:1 * (ABL:(ARG:0):欲望 + 2) / 2

;触手部屋の管理者に魔術経験値と触手経験値を与える
LOCAL:2 = SQRT(LOCAL:1 * 100) / 4 + 5
LOCAL:2 = LOCAL:2 * MAX(100 - ABL:(ID_TO_CHARA(FLAG:触手部屋管理者)):魔術, 20) / 100
IF TALENT:(ARG:0):虚ろ
	TIMES LOCAL:2, 0.50
ELSEIF TALENT:(ARG:0):崩壊
	TIMES LOCAL:2, 0.20
ENDIF

PRINTFORML <%ANAME(ID_TO_CHARA(FLAG:触手部屋管理者))%>
CALL PRINT_ADD_EXP(ID_TO_CHARA(FLAG:触手部屋管理者), "触手経験値", 10)
CALL PRINT_ADD_EXP(ID_TO_CHARA(FLAG:触手部屋管理者), "魔術経験値", LOCAL:2)
CALL TRAIN_AUTO_ABLUP(ID_TO_CHARA(FLAG:触手部屋管理者))
PRINTL

CFLAG:(ARG:0):精神力回復量補正 = 80

;■娼館
@EVENT_PRISONER7(ARG:0)
CALL EVENT_PRISONER_TEXT7(ARG:0)
LOCAL:0 = 2000

IF TALENT:(ARG:0):処女 && HAS_VAGINA(ARG:0)
	IF TALENT:(ARG:0):処女 == 1
		LOCAL:0 += 3000
	ELSE
		LOCAL:0 += 1500
	ENDIF
ENDIF

IF TALENT:(ARG:0):キス未経験
	LOCAL:0 += 1000
ENDIF

SELECTCASE ABL:(ARG:0):欲望
	CASE 0
		TIMES LOCAL:0, 1.00
	CASE 1
		TIMES LOCAL:0, 0.70
	CASE 2
		TIMES LOCAL:0, 0.50
	CASE 3
		TIMES LOCAL:0, 0.35
	CASE 4
		TIMES LOCAL:0, 0.20
	CASEELSE
		LOCAL:0 = LOCAL:0 / (ABL:(ARG:0):欲望 + 1)
ENDSELECT

;絶頂経験による補正(20で1/2、100で1/10、2000で1/20、50000で1/60)
LOCAL:0 = CALC_LOSEBASE_EXP_CORRECTION(ARG:0, LOCAL:0)

CFLAG:(ARG:0):捕虜怒 = LOCAL:0
CFLAG:(ARG:0):捕虜哀 = LOCAL:0
CFLAG:(ARG:0):捕虜怖 = LOCAL:0

CALL FUCK(ARG:0, "欲望, 性技, 精愛, 性交, 射精, Ｃ, Ｖ, Ｂ, Ｍ, Ａ, 口淫, Ｖ性交, Ａ性交", "処女喪失, Ａ処女喪失, 膣内射精, キス喪失, 腸内射精, 口内射精", GET_SPERM_ID("娼館の客"), "娼館の客", "娼館の客", "", "売春")

;もらえる額の計算
LOCAL:1 = ABL:(ARG:0):欲望 + ABL:(ARG:0):奉仕 + ABL:(ARG:0):性技 + ABL:(ARG:0):性交 + ABL:(ARG:0):Ｃ感 + ABL:(ARG:0):Ｖ感 + ABL:(ARG:0):Ａ感 + ABL:(ARG:0):Ｂ感
LOCAL:1 = LIMIT(RAND(LOCAL:1 / 10, LOCAL:1 / 10 + 10) * 100, 100, 3000)

PRINTFORML %ANAME(ARG:0)%は金{LOCAL:1}を稼いだようだ
MONEY += LOCAL:1

;■搾乳
@EVENT_PRISONER8(ARG:0)
#DIM MILK_AMOUNT
#DIM VALUE
#DIM SPOUT_MILK
CALL EVENT_PRISONER_TEXT8(ARG:0)
;母乳が出ないキャラは搾乳されると母乳が出る体質になっていく 先に処理
IF !TALENT:(ARG:0):母乳体質 && IS_FEMALE(ARG:0)
	EXP:(ARG:0):搾乳経験値 += (1 + RAND:3)
	SIF TALENT:(ARG:0):Ｂ敏感
		EXP:(ARG:0):搾乳経験値 += 1
	SIF TALENT:(ARG:0):Ｂ鈍感
		EXP:(ARG:0):搾乳経験値 += -1
	SIF GETBIT(TALENT:(ARG:0):淫乱系, 素質_淫乱_淫乳)
		EXP:(ARG:0):搾乳経験値 += 2
	SIF GETBIT(TALENT:(ARG:0):淫乱系, 素質_淫乱_雌牛)
		EXP:(ARG:0):搾乳経験値 += 2
	SIF ABL:(ARG:0):Ｂ感 >= ランク閾値:ランク_その他:ランク_D
		EXP:(ARG:0):搾乳経験値 += 2
	IF EXP:(ARG:0):搾乳経験値 >= 40
		IF TALENT:(ARG:0):母乳体質
			PRINTFORML 度重なる強引な搾乳に%ANAME(ARG:0)%は乳腺が壊れてしまったのを感じた
		ELSE
			PRINTFORML 度重なる強引な搾乳についに%ANAME(ARG:0)%の胸から母乳が漏れ始めた
		ENDIF
		TALENT:(ARG:0):母乳体質 = 1
		CFLAG:(ARG:0):一時的母乳体質 = 0
		PRINTFORML %ANAME(ARG:0)%は体が変えられてしまったことに衝撃を受け複雑な感情を強く感じている
		CFLAG:(ARG:0):捕虜怒 += 2000
		CFLAG:(ARG:0):捕虜哀 += 2000
		CFLAG:(ARG:0):捕虜怖 += 2000
	ENDIF
ENDIF
IF TALENT:(ARG:0):母乳体質
	SPOUT_MILK = ABL:(ARG:0):噴乳 * 2 + ABL:(ARG:0):Ｂ感 * 2 + 3
	SIF TALENT:(ARG:0):Ｂ敏感
		SPOUT_MILK *= 3 / 2
	SIF TALENT:(ARG:0):Ｂ鈍感
		SPOUT_MILK *= 3 / 4
	SIF GETBIT(TALENT:(ARG:0):淫乱系, 素質_淫乱_淫乳)
		SPOUT_MILK *= 3 / 2
	SIF GETBIT(TALENT:(ARG:0):淫乱系, 素質_淫乱_雌牛)
		SPOUT_MILK *= 2
	SPOUT_MILK = MAX(SPOUT_MILK, 1)
	;調教時より時間が長いから一回100ccと適当に見積もる
	MILK_AMOUNT = SPOUT_MILK * 100
	VALUE = SQRT(MILK_AMOUNT) * (19 + TALENT:(ARG:0):人気 * 10 + VIRGIN(ARG:0) * 20)
	MONEY += VALUE
	CALL FUCK(ARG:0, "Ｂ感, 噴乳, 苦痛快楽, マゾ")
	PRINTFORML %ANAME(ARG:0)%から{MILK_AMOUNT}ccの母乳を搾り出し、{VALUE}の買値がついた
ELSEIF IS_MALE(ARG:0) && !TALENT:(ARG:0):母乳体質
	SPOUT_MILK = 0
	CALL FUCK(ARG:0, "Ｂ感")
	PRINTFORML 男である%ANAME(ARG:0)%からは母乳を絞りようもなかった…
ELSE
	SPOUT_MILK = 0
	CALL FUCK(ARG:0, "Ｂ感, 苦痛快楽, マゾ")
	SELECTCASE RAND:2
		CASE 0
			PRINTFORML だが、%ANAME(ARG:0)%から母乳を絞ることはできなかった
		CASE 1
			PRINTFORML %ANAME(ARG:0)%はむず痒さに顔を歪めたが結局母乳は出なかった
	ENDSELECT
ENDIF
;処理内容を基に能力が上がるかチェックする 経験が入らないことが明らかである場合必要ない
CALL TRAIN_AUTO_ABLUP(ARG:0)

CFLAG:(ARG:0):捕虜怒 += 1000
CFLAG:(ARG:0):捕虜哀 += 1500
CFLAG:(ARG:0):捕虜怖 += 1500

CFLAG:(ARG:0):精神力回復量補正 = 80

;-------------------------------------------------
;捕虜の扱いに応じたターン終了時の機嫌・共感値・評価値変化
;-------------------------------------------------
@PRISONER_CHANGE_EMOTION(ARG:0)
;監禁中
IF CFLAG:(ARG:0):軟禁中 == 0
	SELECTCASE CFLAG:(ARG:0):捕虜の扱い
		;拘留
		CASE 0
			TIMES PALAM:(ARG:0):怒外, 0.70
			TIMES PALAM:(ARG:0):哀外, 0.70
			TIMES PALAM:(ARG:0):怖外, 0.70
			TIMES PALAM:(ARG:0):怒主, 0.60
			TIMES PALAM:(ARG:0):哀主, 0.60
			TIMES PALAM:(ARG:0):怖主, 0.30
			BASE:(ARG:0):精神力 = MIN(BASE:(ARG:0):精神力 + MAX(MAXBASE:(ARG:0):精神力 / 10, 300), MAXBASE:(ARG:0):精神力)
		;拷問
		CASE 2
			CUP:(ARG:0):怒主 = CFLAG:(ARG:0):捕虜怒
			CUP:(ARG:0):哀主 = CFLAG:(ARG:0):捕虜哀
			CUP:(ARG:0):怖主 = CFLAG:(ARG:0):捕虜怖
			;ソース処理の関数を流用
			CALL UP_TALENT_CHECK3(ARG:0)

			PALAM:(ARG:0):怒外 += CUP:(ARG:0):怒主
			PALAM:(ARG:0):哀外 += CUP:(ARG:0):哀主
			PALAM:(ARG:0):怖外 += CUP:(ARG:0):怖主
			TIMES PALAM:(ARG:0):怒主, 0.25
			TIMES PALAM:(ARG:0):哀主, 0.25
			TIMES PALAM:(ARG:0):怖主, 0.70

			BASE:(ARG:0):精神力 = MAX(BASE:(ARG:0):精神力 - MIN(CUP:(ARG:0):怖主 / 2, MAXBASE:(ARG:0):精神力 / 10), -500)
			IF BASE:(ARG:0):精神力 < 0
				CFLAG:(ARG:0):崩壊 += 800 - BASE:(ARG:0):精神力 * 2
			ENDIF

		;身体開発
		CASE 3
			CUP:(ARG:0):怒主 = CFLAG:(ARG:0):捕虜怒
			CUP:(ARG:0):哀主 = CFLAG:(ARG:0):捕虜哀
			CUP:(ARG:0):怖主 = CFLAG:(ARG:0):捕虜怖
			;ソース処理の関数を流用
			CALL UP_TALENT_CHECK3(ARG:0)

			PALAM:(ARG:0):怒外 += CUP:(ARG:0):怒主
			PALAM:(ARG:0):哀外 += CUP:(ARG:0):哀主
			PALAM:(ARG:0):怖外 += CUP:(ARG:0):怖主
			TIMES PALAM:(ARG:0):怒主, 0.30
			TIMES PALAM:(ARG:0):哀主, 0.30
			TIMES PALAM:(ARG:0):怖主, 0.40

			BASE:(ARG:0):精神力 = MAX(BASE:(ARG:0):精神力 - CUP:(ARG:0):怖主 / 2, -500)
			IF BASE:(ARG:0):精神力 < 0
				CFLAG:(ARG:0):崩壊 += 400 - BASE:(ARG:0):精神力
			ENDIF
		;説得
		CASE 4
			TIMES PALAM:(ARG:0):怒主, 0.30
			TIMES PALAM:(ARG:0):哀主, 0.30
			TIMES PALAM:(ARG:0):怖主, 0.40
			BASE:(ARG:0):精神力 = MIN(BASE:(ARG:0):精神力 + MAX(MAXBASE:(ARG:0):精神力 / 15, 300), MAXBASE:(ARG:0):精神力)
		;性処理
		CASE 5
			CUP:(ARG:0):怒主 = CFLAG:(ARG:0):捕虜怒
			CUP:(ARG:0):哀主 = CFLAG:(ARG:0):捕虜哀
			CUP:(ARG:0):怖主 = CFLAG:(ARG:0):捕虜怖
			;ソース処理の関数を流用
			CALL UP_TALENT_CHECK3(ARG:0)

			PALAM:(ARG:0):怒外 += CUP:(ARG:0):怒主
			PALAM:(ARG:0):哀外 += CUP:(ARG:0):哀主
			PALAM:(ARG:0):怖外 += CUP:(ARG:0):怖主
			TIMES PALAM:(ARG:0):怒主, 0.30
			TIMES PALAM:(ARG:0):哀主, 0.30
			TIMES PALAM:(ARG:0):怖主, 0.50

			BASE:(ARG:0):精神力 = MAX(BASE:(ARG:0):精神力 - CUP:(ARG:0):怖主, -500)
			IF BASE:(ARG:0):精神力 < 0
				CFLAG:(ARG:0):崩壊 += 800 - BASE:(ARG:0):精神力 * 2
			ENDIF

		;触手調教
		CASE 6
			CUP:(ARG:0):怒主 = CFLAG:(ARG:0):捕虜怒
			CUP:(ARG:0):哀主 = CFLAG:(ARG:0):捕虜哀
			CUP:(ARG:0):怖主 = CFLAG:(ARG:0):捕虜怖
			;ソース処理の関数を流用
			CALL UP_TALENT_CHECK3(ARG:0)

			PALAM:(ARG:0):怒外 += CUP:(ARG:0):怒主
			PALAM:(ARG:0):哀外 += CUP:(ARG:0):哀主
			PALAM:(ARG:0):怖外 += CUP:(ARG:0):怖主
			TIMES PALAM:(ARG:0):怒主, 0.30
			TIMES PALAM:(ARG:0):哀主, 0.30
			TIMES PALAM:(ARG:0):怖主, 0.50

			BASE:(ARG:0):精神力 = MAX(BASE:(ARG:0):精神力 - CUP:(ARG:0):怖主, -500)
			IF BASE:(ARG:0):精神力 < 0
				CFLAG:(ARG:0):崩壊 += 800 - BASE:(ARG:0):精神力 * 2
			ENDIF

		;娼館
		CASE 7
			CUP:(ARG:0):怒主 = CFLAG:(ARG:0):捕虜怒
			CUP:(ARG:0):哀主 = CFLAG:(ARG:0):捕虜哀
			CUP:(ARG:0):怖主 = CFLAG:(ARG:0):捕虜怖
			;ソース処理の関数を流用
			CALL UP_TALENT_CHECK3(ARG:0)

			PALAM:(ARG:0):怒外 += CUP:(ARG:0):怒主
			PALAM:(ARG:0):哀外 += CUP:(ARG:0):哀主
			PALAM:(ARG:0):怖外 += CUP:(ARG:0):怖主
			TIMES PALAM:(ARG:0):怒主, 0.30
			TIMES PALAM:(ARG:0):哀主, 0.30
			TIMES PALAM:(ARG:0):怖主, 0.40

			BASE:(ARG:0):精神力 = MAX(BASE:(ARG:0):精神力 - CUP:(ARG:0):怖主, -500)
			IF BASE:(ARG:0):精神力 < 0
				CFLAG:(ARG:0):崩壊 += 300 - BASE:(ARG:0):精神力 * 2
			ENDIF

		;搾乳
		CASE 8
			;捕虜の扱いに関わる機嫌の変動処理
			;捕虜の扱いによって生まれた感情を一端CUPに収めてSOURCE処理と同じ関数を通して素質に応じた倍率をかける
			CUP:(ARG:0):怒主 = CFLAG:(ARG:0):捕虜怒
			CUP:(ARG:0):哀主 = CFLAG:(ARG:0):捕虜哀
			CUP:(ARG:0):怖主 = CFLAG:(ARG:0):捕虜怖
			;ソース処理の関数を流用
			CALL UP_TALENT_CHECK3(ARG:0)

			;捕虜の扱いによって生まれた感情は周りへの反感、もしくはストレスとして処理される
			PALAM:(ARG:0):怒外 += CUP:(ARG:0):怒主
			PALAM:(ARG:0):哀外 += CUP:(ARG:0):哀主
			PALAM:(ARG:0):怖外 += CUP:(ARG:0):怖主

			;主人公への反感が薄れる　数字が大きいほど薄れにくい
			;反発が強いコマンドだから乳が出るようになると減りにくくなる
			IF TALENT:(ARG:0):母乳体質
				TIMES PALAM:(ARG:0):怒主, 0.30
				TIMES PALAM:(ARG:0):哀主, 0.20
				TIMES PALAM:(ARG:0):怖主, 0.40
			ELSE
				TIMES PALAM:(ARG:0):怒主, 0.20
				TIMES PALAM:(ARG:0):哀主, 0.20
				TIMES PALAM:(ARG:0):怖主, 0.30
			ENDIF

			;精神力を計算してそれが少なかったら崩壊する
			;拷問と同程度に精神ショックが大きい　身体改造されるわけだからね
			BASE:(ARG:0):精神力 = MAX(BASE:(ARG:0):精神力 - CUP:(ARG:0):怖主 / 2, -500)
			IF BASE:(ARG:0):精神力 < 0
				CFLAG:(ARG:0):崩壊 += 800 - BASE:(ARG:0):精神力
			ENDIF

	ENDSELECT

;軟禁中
ELSE
	TIMES PALAM:(ARG:0):怒外, 0.30
	TIMES PALAM:(ARG:0):哀外, 0.30
	TIMES PALAM:(ARG:0):怖外, 0.30
	TIMES PALAM:(ARG:0):怒主, 0.05
	TIMES PALAM:(ARG:0):哀主, 0.05
	TIMES PALAM:(ARG:0):怖主, 0.05
ENDIF

;-------------------------------------------------
;捕虜の収監による国家感情の変動（捕虜一人当たり／ターン)
;;;;;ARG:0 捕虜となっている個人
;-------------------------------------------------
@PRISONER_CHANGE_RELATION(ARG:0)
#DIM LIKE
#DIM HATE

LIKE = 0
HATE = 0

SIF CFLAG:(ARG:0):捕虜先 == 0
	RETURN
SIF CFLAG:(ARG:0):解放カウンタ == 0
	RETURN

;MASTER所属国でない勢力に捕虜にされている
SIF CFLAG:(ARG:0):捕虜先 != CFLAG:(MASTER):所属
	RETURN

;MASTERが待遇決める＆投獄
IF CFLAG:(ARG:0):軟禁中 == 0
	SELECTCASE CFLAG:(ARG:0):捕虜の扱い
		;拘留
		CASE 0
			LIKE = 0
			HATE = 1
		;拷問
		CASE 2
			LIKE = -4
			HATE = 4
		;身体開発
		CASE 3
			LIKE = -3
			HATE = 4
		;説得
		CASE 4
			LIKE = 0
			HATE = 0
			CALL CHANGE_RELATION_O_TO_C(ARG:0, CFLAG:MASTER:所属, 30, -10)
			SIF CFLAG:(ARG:0):所属
				CALL CHANGE_RELATION_O_TO_C(ARG:0, CFLAG:(ARG:0):所属, -10, 15)
		;性処理
		CASE 5
			LIKE = -5
			HATE = 10
		;触手調教
		CASE 6
			LIKE = -10
			HATE = 15
		;娼館
		CASE 7
			LIKE = -10
			HATE = 15
		;さく乳
		CASE 8
			LIKE = -5
			HATE = 10
	ENDSELECT
;MASTERが待遇決める＆軟禁
ELSE
	LIKE = 5
	HATE = -5
ENDIF

IF CFLAG:(ARG:0):所属 != 0
	LOCAL:0 = GET_COUNTRY_BOSS(CFLAG:(ARG:0):捕虜先)
	LOCAL:1 = GET_COUNTRY_BOSS(CFLAG:(ARG:0):所属)

	SIF REL_LIKE:(LOCAL:1):(LOCAL:0) > 300 && LIKE > 0
		LIKE = 0
	SIF REL_HATE:(LOCAL:1):(LOCAL:0) < 300 && HATE < 0
		HATE = 0

	CALL CHANGE_RELATION_C_TO_C(CFLAG:(ARG:0):所属, CFLAG:(ARG:0):捕虜先, LIKE, HATE)
ELSE
	CALL CHANGE_RELATION_O_TO_C(ARG:0, CFLAG:(ARG:0):捕虜先, LIKE, HATE)
ENDIF

;PRINTFORML 後　%ANAME(ARG:0)% → %ANAME(MASTER)% L{REL_LIKE:(ARG:0):(MASTER)}  H{REL_HATE:(ARG:0):(MASTER)}