code:
;-------------------------------------------------
; スキルオートの行動定義
;-------------------------------------------------
@CLOSE_COMBAT_SET_ALLY_AUTO_ACTION(CHARA_DID)
#DIM  DYNAMIC CHARA_DID
#DIM  DYNAMIC CHARA_ID
#DIM  DYNAMIC IS_PLAYABLE
#DIMS DYNAMIC SKILL_DEF_NAME
#DIM  DYNAMIC IS_CASTABLE
#DIM  DYNAMIC SKILL_SLOT_IDX
#DIM  DYNAMIC EQUIP_DID
#DIM  DYNAMIC SKILL_DID, VARSIZE("SKILL_DEF_LIST")
#DIM  DYNAMIC EQUIP_SKILL_NUM

CHARA_ID = DT_CELL_GET("CC_ACTOR", CHARA_DID, "CHARA_ID", 1)
IS_PLAYABLE = DT_CELL_GET("CC_ACTOR", CHARA_DID, "IS_PLAYABLE", 1)
SIF !IS_PLAYABLE
    RETURN

;スキルスロットの先頭から使えるスキルを探す
FOR SKILL_SLOT_IDX, 0, LIST_COUNT(_LIST_ACTIVE_SKILL_SLOT:CHARA_ID:0)
    SKILL_DEF_NAME = %LIST_GET(_LIST_ACTIVE_SKILL_SLOT:CHARA_ID:0, SKILL_SLOT_IDX)%
    ;実行可否判定
    CALL CLOSE_COMBAT_SKILL_CAN_CAST(CHARA_DID, SKILL_DEF_NAME, SKILL_SLOT_IDX)
    IS_CASTABLE = RESULT
    IF IS_CASTABLE == 1
        DT_CELL_SET "CC_ACTOR", CHARA_DID, "SELECTED_SKILL_SLOT", SKILL_SLOT_IDX, 1
        RETURN 1
    ENDIF
NEXT

;WEAPON
;DT_TOXML "CC_SKILL_SLOT"
DT_SELECT "CC_SKILL_SLOT",@"CHARA_ID = {CHARA_ID} AND NOT EQUIP_DID = 0","SKILL_SLOT_IDX ASC",SKILL_DID
EQUIP_SKILL_NUM = RESULT
FOR LOCAL, 0, EQUIP_SKILL_NUM
    SKILL_DEF_NAME = %DT_CELL_GETS("CC_SKILL_SLOT", SKILL_DID:LOCAL, "SKILL_DEF_NAME", 1)%
    SKILL_SLOT_IDX = LOCAL + 3
    ;実行可否判定
    CALL CLOSE_COMBAT_SKILL_CAN_CAST(CHARA_DID, SKILL_DEF_NAME, SKILL_SLOT_IDX)
    IS_CASTABLE = RESULT
    IF IS_CASTABLE == 1
        DT_CELL_SET "CC_ACTOR", CHARA_DID, "SELECTED_SKILL_SLOT", SKILL_SLOT_IDX, 1
        RETURN 1
    ENDIF
NEXT


code:
;-------------------------------------------------
;;; キャラステータスや装備から戦闘用ステータスを算出し
;;; ステータステーブルに格納する
;-------------------------------------------------
@CC_CALC_CHARA_STATUS(CHARA_ID)
; #region
#DIM  CHARA_ID
#DIM  DYNAMIC WEAPON_LIST_IDX
#DIM  DYNAMIC WEAPON_ID
#DIM  DYNAMIC MATERIAL

#DIM  DYNAMIC 補正最大HP
#DIM  DYNAMIC 補正HP
#DIM  DYNAMIC 補正攻撃力
#DIM  DYNAMIC 補正行動力
#DIM  DYNAMIC 補正防御力
#DIM  DYNAMIC 補正軽減値
#DIM  DYNAMIC 補正魔力
#DIM  DYNAMIC 補正敵視
#DIM  DYNAMIC 脅威選定
#DIM  DYNAMIC クリティカル率
#DIM  DYNAMIC クリティカルダメージ倍率
#DIM  DYNAMIC 毒耐性
#DIM  DYNAMIC 燃焼耐性
#DIM  DYNAMIC スタン耐性
#DIM  DYNAMIC 盲目耐性
#DIM  DYNAMIC IGNORE_MUGGLE_PENALTY
#DIM  CONST   BASE_CRITICAL_RATE = 3
#DIM  CONST   BASE_CRITICAL_DAMAGE_RATE = 120
#DIM  CONST   MUGGLE_MAG_PENALTY = -40
#DIM  DYNAMIC TALENT_COUNT
#DIMS DYNAMIC TALENT_ID, 100

#DIM  DYNAMIC LIST_LENGTH
#DIMS DYNAMIC _XML_SKILL
#DIM  DYNAMIC EQUIP_NUM
#DIM  DYNAMIC EQUIP_DID, 10

#DIMS CONST WPN_MAP_NAME = "WPN_MODIFIER_RESULT"    ;武器補正集計用配列
#DIMS CONST STATUS_MAP_NAME = "MAP_MODIFIED_RESULT"    ;最終結果集計用連想配列

IF !MAP_EXIST(WPN_MAP_NAME)
    MAP_CREATE WPN_MAP_NAME
ELSE
    MAP_CLEAR WPN_MAP_NAME
ENDIF
IF !MAP_EXIST(STATUS_MAP_NAME)
    MAP_CREATE STATUS_MAP_NAME
ELSE
    MAP_CLEAR STATUS_MAP_NAME
ENDIF

CC_CALC_CHARA_STATUS_IS_BAREHAND = 0

;;戦闘用に一時使用する武器が設定されている場合は武器定義ERBのステータスを参照する
;何も指定されていなければ装備を参照
IF _DIC_CC_TEMP_WEAPON:CHARA_ID != ""
    WEAPON_ID = TOINT(DIC_GET(_DIC_CC_TEMP_WEAPON:CHARA_ID, "WEAPON_ID"))
    MATERIAL = TOINT(DIC_GET(_DIC_CC_TEMP_WEAPON:CHARA_ID, "MATERIAL"))
    CALL GET_WEAPON_STATUS(WEAPON_ID, MATERIAL)
    CALL MAP_ADD(WPN_MAP_NAME, "ATK", WPN_STATUS:WPN_攻撃力)
    CALL MAP_ADD(WPN_MAP_NAME, "DEF", WPN_STATUS:WPN_防御力)
    CALL MAP_ADD(WPN_MAP_NAME, "ARMOR", WPN_STATUS:WPN_軽減値)
    CALL MAP_ADD(WPN_MAP_NAME, "MAG", WPN_STATUS:WPN_魔力)
    CALL MAP_ADD(WPN_MAP_NAME, "AGI", WPN_STATUS:WPN_行動力)
    CALL MAP_ADD(WPN_MAP_NAME, "HATE_RATE", WPN_STATUS:WPN_敵視)
    脅威選定    = WPN_STATUS:WPN_脅威選定
    SIF WEAPON_ID == 0
        CC_CALC_CHARA_STATUS_IS_BAREHAND = 1
ELSE
    CALL GET_ALL_WEAPON_LIST_IDX_BY_CHARA_ID(CHARA_ID)
    EQUIP_NUM = RESULT
    IF EQUIP_NUM
        FOR LOCAL, 0, EQUIP_NUM
            EQUIP_DID:LOCAL = RESULT:(LOCAL + 1)
            CALL GET_WEAPON_STATUS_FROM_STOCK_TABLE(, EQUIP_DID:LOCAL)
            CALL MAP_ADD(WPN_MAP_NAME, "ATK", WPN_STATUS:WPN_攻撃力)
            CALL MAP_ADD(WPN_MAP_NAME, "DEF", WPN_STATUS:WPN_防御力)
            CALL MAP_ADD(WPN_MAP_NAME, "ARMOR", WPN_STATUS:WPN_軽減値)
            CALL MAP_ADD(WPN_MAP_NAME, "MAG", WPN_STATUS:WPN_魔力)
            CALL MAP_ADD(WPN_MAP_NAME, "AGI", WPN_STATUS:WPN_行動力)
            CALL MAP_ADD(WPN_MAP_NAME, "HATE_RATE", WPN_STATUS:WPN_敵視)
            IF LOCAL == 0 ;脅威選定は武器の値を参照
                脅威選定    = WPN_STATUS:WPN_脅威選定
            ENDIF
        NEXT
    ENDIF
    CALL GET_WEAPON_LIST_IDX_BY_CHARA_ID(CHARA_ID)
    SIF RESULT == 0
        CC_CALC_CHARA_STATUS_IS_BAREHAND = 1
ENDIF

;格闘スキル関連のターゲティング変更。あまりよい書き方ではないが暫定
VARI SKILL_LV
VARS TARGETING
IF CC_CALC_CHARA_STATUS_IS_BAREHAND
    ;ターゲティング
    SKILL_LV = HAS_SKILL(CHARA_ID, "PSV_MARTIAL_ARTS")
    IF SKILL_LV
        TARGETING = %CC_SKILL_GETS_LABELED_VALUE_FROM_XML("PSV_MARTIAL_ARTS", SKILL_LV, "TARGETING")%
        IF ISNUMERIC(TARGETING)
            脅威選定 = TOINT(TARGETING)
        ELSEIF EXISTVAR(@"WPN_脅威選定_%TARGETING%")
            脅威選定 = GETVAR(@"WPN_脅威選定_%TARGETING%")
        ENDIF
    ENDIF
ENDIF

;補正値一括取得
CALL CC_MODIFIER_MAP_INIT
CALL CC_PASSIVE_SKILL_CALC_MODIFIER_BY_CHARA_ID("CC_CALC_CHARA_STATUS", CHARA_ID)
CALL CC_TALENT_CALC_MODIFIER_BY_CHARA_ID("CC_CALC_CHARA_STATUS", CHARA_ID)
;DEBUGPRINTFORML %ANAME(CHARA_ID)%
;DEBUGPRINTFORML %MAP_TOXML("CC_MODIFIER")%

CALL CC_CALC_CHARA_STATUS_APPLY_MODIFIER(WPN_MAP_NAME, "WPN")

;DEBUGPRINTFORML CALL CC_CALC_CHARA_STATUS_APPLY_MODIFIER(STATUS_MAP_NAME, "WPN")
;DEBUGPRINTFORML %MAP_TOXML(STATUS_MAP_NAME)%

[SKIPSTART]
補正攻撃力 = MAX(0, 補正攻撃力)
補正行動力 = MAX(0, 補正行動力)
;キャラのステータスによる補正
補正攻撃力 = ABL:CHARA_ID:戦闘 + (ABL:CHARA_ID:戦闘 * 補正攻撃力 / 100)
補正行動力 = ABL:CHARA_ID:身体 + (ABL:CHARA_ID:身体 * 補正行動力 / 100)
クリティカル率 += MIN(ABL:CHARA_ID:観察 / 8, 30)
クリティカルダメージ倍率 += MIN(ABL:CHARA_ID:器用 / 5, 50)
[SKIPEND]
;キャラステータスと武器パラメータから算出
補正攻撃力 = ABL:CHARA_ID:戦闘 + (ABL:CHARA_ID:戦闘 * MAX(0, MAP_GETINT(WPN_MAP_NAME, "ATK")) / 100)
補正行動力 = ABL:CHARA_ID:身体 + (ABL:CHARA_ID:身体 * MAX(0, MAP_GETINT(WPN_MAP_NAME, "AGI")) / 100)
CALL MAP_SETINT(STATUS_MAP_NAME, "ATK", 補正攻撃力)
CALL MAP_SETINT(STATUS_MAP_NAME, "AGI", 補正行動力)
;武器パラメータそのまま
MAP_SET STATUS_MAP_NAME, "DEF", MAP_GET(WPN_MAP_NAME, "DEF")
MAP_SET STATUS_MAP_NAME, "ARMOR", MAP_GET(WPN_MAP_NAME, "ARMOR")
MAP_SET STATUS_MAP_NAME, "HATE_RATE", MAP_GET(WPN_MAP_NAME, "HATE_RATE")
;キャラステータスから算出
CALL MAP_SETINT(STATUS_MAP_NAME, "MAX_HP", MAXBASE:CHARA_ID:体力)
CALL MAP_SETINT(STATUS_MAP_NAME, "HP", BASE:CHARA_ID:体力)
CALL MAP_SETINT(STATUS_MAP_NAME, "CRITICAL_RATE", BASE_CRITICAL_RATE + MIN(ABL:CHARA_ID:観察 / 8, 30))
CALL MAP_SETINT(STATUS_MAP_NAME, "CRITICAL_DAMAGE", BASE_CRITICAL_DAMAGE_RATE + MIN(ABL:CHARA_ID:器用 / 5, 50))

;素質補正
;魔力算出ペナルティ有無の取得
TALENT_COUNT = XML_GET(XMLID_TALENT, @"//defname[flag/ignoreMugglePenalty='TRUE']/@id", TALENT_ID, 1)
FOR LOCAL, 0, TALENT_COUNT
    IF TALENT:CHARA_ID:TOINT(TALENT_ID:LOCAL)
        IGNORE_MUGGLE_PENALTY = 1
        BREAK
    ENDIF
NEXT

IF IGNORE_MUGGLE_PENALTY
    補正魔力 = MAX(0, MAP_GETINT(WPN_MAP_NAME, "MAG"))
    補正魔力 = (ABL:CHARA_ID:魔術 + (ABL:CHARA_ID:魔術) * 補正魔力 / 100)
    CALL MAP_SETINT(STATUS_MAP_NAME, "MAG", 補正魔力)
ELSE
    ;武器の魔力を扱えるかを表す知識補正
    補正魔力 = MAX(0, MAP_GETINT(WPN_MAP_NAME, "MAG"))
    補正魔力   = ABL:CHARA_ID:魔術 + (ABL:CHARA_ID:知識 * 補正魔力 / 100)
    CALL MAP_SETINT(STATUS_MAP_NAME, "MAG", 補正魔力)
    ;非魔術師の魔力値は4割減
    CALL CC_MODIFIER_MAP_ADD("TALENT_MAG_MULTI", MUGGLE_MAG_PENALTY)
ENDIF

;素質補正一括反映 元仕様でFTIMESが入るので、スキル補正と分割
CALL CC_CALC_CHARA_STATUS_APPLY_MODIFIER(STATUS_MAP_NAME, "TALENT")
;DEBUGPRINTFORML CALL CC_CALC_CHARA_STATUS_APPLY_MODIFIER(STATUS_MAP_NAME, "TALENT")
;DEBUGPRINTFORML %MAP_TOXML(STATUS_MAP_NAME)%

;スキル補正一括反映
CALL CC_CALC_CHARA_STATUS_APPLY_MODIFIER(STATUS_MAP_NAME, "SKILL")
;DEBUGPRINTFORML CALL CC_CALC_CHARA_STATUS_APPLY_MODIFIER(STATUS_MAP_NAME, "SKILL")
;DEBUGPRINTFORML %MAP_TOXML(STATUS_MAP_NAME)%

;食事によるクリティカル、状態異常耐性の補正(１戦闘永続)
IF CFLAG:CHARA_ID:QST食事
    TRYCALLFORMF GET_INFO_INSTANT_BUFF_{CFLAG:CHARA_ID:QST食事}("CRT")
    ;クリティカル率 += RESULT
    CALL MAP_ADD(STATUS_MAP_NAME, "CRITICAL_RATE", RESULT)
    TRYCALLFORMF GET_INFO_INSTANT_BUFF_{CFLAG:CHARA_ID:QST食事}("CRT_D")
    ;クリティカルダメージ倍率 += RESULT
    CALL MAP_ADD(STATUS_MAP_NAME, "CRITICAL_DAMAGE", RESULT)
    TRYCALLFORMF GET_INFO_INSTANT_BUFF_{CFLAG:CHARA_ID:QST食事}("REG_POISON")
    ;毒耐性 += RESULT
    CALL MAP_ADD(STATUS_MAP_NAME, "RESIST_POISON", RESULT)
    TRYCALLFORMF GET_INFO_INSTANT_BUFF_{CFLAG:CHARA_ID:QST食事}("REG_BURN")
    ;燃焼耐性 += RESULT
    CALL MAP_ADD(STATUS_MAP_NAME, "RESIST_BURN", RESULT)
    TRYCALLFORMF GET_INFO_INSTANT_BUFF_{CFLAG:CHARA_ID:QST食事}("REG_STUN")
    ;スタン耐性 += RESULT
    CALL MAP_ADD(STATUS_MAP_NAME, "RESIST_STUN", RESULT)
    TRYCALLFORMF GET_INFO_INSTANT_BUFF_{CFLAG:CHARA_ID:QST食事}("REG_BLIND")
    ;盲目耐性 += RESULT
    CALL MAP_ADD(STATUS_MAP_NAME, "RESIST_BLIND", RESULT)
ENDIF

[SKIPSTART]
補正攻撃力 = FTIMES(補正攻撃力, 攻撃力補正率 + 100)
補正魔力   = FTIMES(補正魔力, 魔力補正率 + 100)
補正軽減値 = FTIMES(補正軽減値, 軽減値補正率 + 100)

;;同系非重複スキルの補正
;理の解明
SKILL_LV = HAS_SKILL(CHARA_ID, "WPN_CONV_WIS_TO_MAG", スキル_大分類_武器)
IF SKILL_LV
    CALL WPN_SKILL_GET_EFFECT_RATE("WPN_CONV_WIS_TO_MAG", SKILL_LV)
    EFFECT_RATE = RESULT
    補正魔力 += FTIMES(ABL:CHARA_ID:知識, EFFECT_RATE)
ENDIF
[SKIPEND]

;DEBUGPRINTFORML 最終値: %MAP_TOXML(STATUS_MAP_NAME)%

IF DT_EXIST("CHARA_STATUS")
    DT_CLEAR "CHARA_STATUS"
ENDIF
CALL CREATE_CHARA_STATUS_TABLE

{
    DT_ROW_ADD "CHARA_STATUS"
        ,"CHARA_ID", CHARA_ID
        ,"CHARA_NAME", ANAME(CHARA_ID)
        ,"MAX_HP", MAP_GETINT(STATUS_MAP_NAME, "MAX_HP")
        ,"HP", MAP_GETINT(STATUS_MAP_NAME, "HP")
        ,"STR", ABL:CHARA_ID:戦闘
        ,"MAG", MAP_GETINT(STATUS_MAP_NAME, "MAG")
        ,"ATTACK", MAP_GETINT(STATUS_MAP_NAME, "ATK")
        ,"DEFENCE", MAP_GETINT(STATUS_MAP_NAME, "DEF")
        ,"ARMOR", MAP_GETINT(STATUS_MAP_NAME, "ARMOR")
        ,"AGILITY", MAP_GETINT(STATUS_MAP_NAME, "AGI")
        ,"CRITICAL_RATE", MAP_GETINT(STATUS_MAP_NAME, "CRITICAL_RATE")
        ,"CRITICAL_DAMAGE_RATE", MAP_GETINT(STATUS_MAP_NAME, "CRITICAL_DAMAGE")
        ,"HATE_RATE", MAP_GETINT(STATUS_MAP_NAME, "HATE_RATE")
        ,"TARGETING", 脅威選定
        ,"REGIST_POISON", MAP_GETINT(STATUS_MAP_NAME, "RESIST_POISON")
        ,"REGIST_BURN", MAP_GETINT(STATUS_MAP_NAME, "RESIST_BURN")
        ,"REGIST_STUN", MAP_GETINT(STATUS_MAP_NAME, "RESIST_STUN")
        ,"REGIST_BLIND", MAP_GETINT(STATUS_MAP_NAME, "RESIST_BLIND")
}
RETURN
; #endregion

@CC_GET_STATUS_BOOST_ADD_BY_EQUIP(EQUIP_DID, SKILL_DEF_NAME)
#DIM  EQUIP_DID
#DIMS SKILL_DEF_NAME
VARI SKILL_LV

SKILL_LV = WPN_HAS_SKILL(EQUIP_DID, SKILL_DEF_NAME)
IF SKILL_LV
    CALL WPN_SKILL_GET_EFFECT_RATE(SKILL_DEF_NAME, SKILL_LV)
    RETURN RESULT
ENDIF

;;;乗算補正->加算補正の順で補正値をまとめて適用する
@CC_CALC_CHARA_STATUS_APPLY_MODIFIER(STATUS_MAP_NAME, PREFIX)
#DIMS STATUS_MAP_NAME
#DIMS PREFIX
#DIMS MODIFIER_TYPE
#DIMS STATUS_NAME
#DIM  CURRENT_VALUE
#DIM  MODIFIED_VALUE
{
    #DIMS CONST STATUS_LIST =
        "MAX_HP"
        ,"HP"
        ,"ATK"
        ,"DEF"
        ,"ARMOR"
        ,"MAG"
        ,"AGI"
        ,"HATE_RATE"
        ,"CRITICAL_RATE"
        ,"CRITICAL_DAMAGE"
        ,"RESIST_POISON"
        ,"RESIST_STUN"
        ,"RESIST_BURN"
        ,"RESIST_BLIND"
}

FOR LOCAL, 0, VARSIZE("STATUS_LIST")
    STATUS_NAME = %STATUS_LIST:LOCAL%
    CURRENT_VALUE = TOINT(MAP_GET(STATUS_MAP_NAME, STATUS_NAME))
    ;乗算補正
    MODIFIED_VALUE = FTIMES(CURRENT_VALUE, MAX(0, 100 + CC_MODIFIER_MAP_GET(@"%PREFIX%_%STATUS_NAME%_MULTI")))
    ;加算補正
    MODIFIED_VALUE += CC_MODIFIER_MAP_GET(@"%PREFIX%_%STATUS_NAME%_ADD")
    MAP_SET STATUS_MAP_NAME, STATUS_NAME, TOSTR(MODIFIED_VALUE)
NEXT

repo_name: napo/erafl

license: unknown


code:
;-------------------------------------------------
;基礎ダメージ値計算
; DIC_OPTIONはスキル固有のダメージ計算時に使用
; パラメータ一覧
; [IGNORE_ARMOR:1] … 防御側軽減値を無視
;-------------------------------------------------
@CC_CALC_DAMAGE(ATTACKER_DID, DEFENDER_DID, DIC_OPTION)
#DIM  ATTACKER_DID
#DIM  DEFENDER_DID
#DIMS DIC_OPTION
#DIM  SOURCE_ACTION_DID
#DIM  DYNAMIC ATTACKER_MAG
#DIM  DYNAMIC DEFENDER_MAG
#DIM  DYNAMIC P_ARMOR
#DIM  DYNAMIC F_ARMOR
#DIM  DYNAMIC F_ARMOR_REMAIN
#DIM  DYNAMIC MEAL_EFFECT_ID_ATK = -1
#DIM  DYNAMIC MEAL_EFFECT_ID_DEF = -1
#DIM  DYNAMIC MAGIC_DAMAGE
#DIM  DYNAMIC ダメージ基準倍率 = 80
#DIM  DYNAMIC 与ダメージ補正率 = 100
#DIM  DYNAMIC MINIMUM_DAMAGE
#DIM  DYNAMIC MODIFIER

;負数なら回復と見なして戻る
IF CC_DAMAGE < 0
    RETURN
ENDIF

;DEBUGPRINTFORML -------------------------------------------------
;DEBUGPRINTFORML @CC_CALC_DAMAGE
;CALL DEBUG_TIMER_START("CC_CALC_DAMAGE")
;補正値一括取得
CALL CC_MODIFIER_MAP_INIT
CALL CC_CALC_MODIFIER_CC_DAMAGE(ATTACKER_DID, DEFENDER_DID)

;食事効果の取得（攻撃側）
IF CC_SP_TOKEN_NUM(ATTACKER_DID, "MEAL_EFFECT") > 0
    MEAL_EFFECT_ID_ATK = DT_CELL_GET("CC_ACTOR", ATTACKER_DID, "MEAL_EFFECT_ID", 1)
ENDIF
;食事効果の取得（防御側）
IF CC_SP_TOKEN_NUM(DEFENDER_DID, "MEAL_EFFECT") > 0
    MEAL_EFFECT_ID_DEF = DT_CELL_GET("CC_ACTOR", DEFENDER_DID, "MEAL_EFFECT_ID", 1)
ENDIF

;-------------------------------------------------
; 攻撃力に基づく基礎ダメージ値の算出
;-------------------------------------------------
; #region 基礎ダメージ値の算出
CC_DAMAGE = SQRT(DT_CELL_GET("CC_ACTOR", ATTACKER_DID, "ATTACK", 1)) * ダメージ基準倍率 * RAND(95, 100) / 100
;DEBUGPRINTFORML 基礎ダメージ  CC_DAMAGE={CC_DAMAGE}
;-------------------------------------------------
; 基礎ダメージ乗除補正:トークン&スキル
;-------------------------------------------------
MODIFIER = CC_MODIFIER_MAP_GET("BASE_DAMAGE_MULTI")
CC_DAMAGE = FTIMES(CC_DAMAGE, MAX(0, 100 + MODIFIER))
;DEBUGPRINTFORML 基礎ダメージ乗除補正トークン&スキル:{100 + MODIFIER}％ CC_DAMAGE = {CC_DAMAGE}
;-------------------------------------------------
; 基礎ダメージ乗除補正:食事(別乗算とする)
;-------------------------------------------------
MODIFIER = GET_MEAL_INSTANT_BUFF(MEAL_EFFECT_ID_ATK, "ATK") - GET_MEAL_INSTANT_BUFF(MEAL_EFFECT_ID_DEF, "GRD")
CC_DAMAGE = FTIMES(CC_DAMAGE, MAX(0, 100 + MODIFIER))
;DEBUGPRINTFORML 基礎ダメージ乗除補正食事: {100 + MODIFIER}％  CC_DAMAGE = {CC_DAMAGE}
;-------------------------------------------------
; 基礎ダメージ加算補正枠
;-------------------------------------------------
MODIFIER = CC_MODIFIER_MAP_GET("BASE_DAMAGE_ADD")
CC_DAMAGE = MAX(0, CC_DAMAGE + MODIFIER)
;DEBUGPRINTFORML 基礎ダメージ加算補正: +{MODIFIER}pt  CC_DAMAGE = {CC_DAMAGE}
; #endregion

;-------------------------------------------------
; 防御力(防御率)算出
; 防御力はダメージを割合でカットする
;-------------------------------------------------
; #region 防御力(防御率)算出
;基礎防御率取得
P_ARMOR = DT_CELL_GET("CC_ACTOR", DEFENDER_DID, "DEFENCE", 1)
;DEBUGPRINTFORML 基礎防御率 = {P_ARMOR}％
;-------------------------------------------------
; 防御力乗算補正:トークン&スキル
;-------------------------------------------------
MODIFIER = CC_MODIFIER_MAP_GET("P_ARMOR_MULTI")
P_ARMOR = FTIMES(P_ARMOR, MAX(0, 100 + MODIFIER))
;DEBUGPRINTFORML 防御力乗算補正トークン&スキル: {100 + MODIFIER}％ P_ARMOR = {P_ARMOR}
;-------------------------------------------------
; 防御力加減補正:トークン&スキル
;-------------------------------------------------
MODIFIER = CC_MODIFIER_MAP_GET("P_ARMOR_ADD")
P_ARMOR = MAX(0, P_ARMOR + MODIFIER)
;DEBUGPRINTFORML 防御力加減補正 +{MODIFIER}pt P_ARMOR = {P_ARMOR}
;-------------------------------------------------
;★ダメージに対する修正
;-------------------------------------------------
CC_DAMAGE -= FTIMES(CC_DAMAGE, P_ARMOR)
;DEBUGPRINTFORML 防御力補正 {100 - P_ARMOR}％  CC_DAMAGE = {CC_DAMAGE}
; #endregion

;-------------------------------------------------
; 軽減値算出
; 軽減値はダメージを実数で減算する
;-------------------------------------------------
; #region 軽減値算出
;基礎防御率取得
;軽減値無視オプションがなければ軽減値による補正を行う
IF DIC_GET(DIC_OPTION, "IGNORE_ARMOR") != "1"
    ;基礎軽減値の取得
    F_ARMOR = DT_CELL_GET("CC_ACTOR", DEFENDER_DID, "ARMOR", 1)
    ;DEBUGPRINTFORML 基礎軽減値={F_ARMOR}pt
    ;-------------------------------------------------
    ; 軽減値乗算補正:トークン&スキル
    ;-------------------------------------------------
    MODIFIER = CC_MODIFIER_MAP_GET("F_ARMOR_MULTI")
    F_ARMOR = FTIMES(F_ARMOR, MAX(0, 100 + MODIFIER))
    ;DEBUGPRINTFORML 軽減値乗算補正トークン&スキル: {100 + MODIFIER}％  F_ARMOR = {F_ARMOR}
    ;-------------------------------------------------
    ; 軽減値加減補正:トークン&スキル
    ;-------------------------------------------------
    MODIFIER = CC_MODIFIER_MAP_GET("F_ARMOR_ADD")
    F_ARMOR = MAX(0, F_ARMOR + MODIFIER)
    ;DEBUGPRINTFORML 軽減値加減補正 {MODIFIER}pt  F_ARMOR = {F_ARMOR}

    ;軽減値余剰値の計算
    IF F_ARMOR > CC_DAMAGE
        F_ARMOR_REMAIN = F_ARMOR - CC_DAMAGE
    ENDIF
    ;★ダメージに対する修正
    CC_DAMAGE = MAX(0, CC_DAMAGE - F_ARMOR)
    ;DEBUGPRINTFORML 軽減値適用 -{F_ARMOR}pt  CC_DAMAGE = {CC_DAMAGE}
ENDIF
;-------------------------------------------------
; 魔力による追加ダメージの算出
;-------------------------------------------------
; #region 魔力追加ダメージ算出
ATTACKER_MAG = DT_CELL_GET("CC_ACTOR", ATTACKER_DID, "MAG", 1)
DEFENDER_MAG = DT_CELL_GET("CC_ACTOR", DEFENDER_DID, "MAG", 1)
;DEBUGPRINTFORML 基礎魔力攻撃力={ATTACKER_MAG}
;DEBUGPRINTFORML 基礎魔力防御力={DEFENDER_MAG}
;-------------------------------------------------
; 魔力攻撃力乗算補正:トークン&スキル
;-------------------------------------------------
MODIFIER = CC_MODIFIER_MAP_GET("ATTACKER_MAG_MULTI")
ATTACKER_MAG = FTIMES(ATTACKER_MAG, MAX(0, 100 + MODIFIER))
;DEBUGPRINTFORML 魔力攻撃力乗算補正トークン&スキル: {100 + MODIFIER}％  ATTACKER_MAG = {ATTACKER_MAG}
;-------------------------------------------------
; 魔力攻撃力乗算補正:食事効果
;-------------------------------------------------
MODIFIER = GET_MEAL_INSTANT_BUFF(MEAL_EFFECT_ID_ATK, "MAG_A")
ATTACKER_MAG = FTIMES(ATTACKER_MAG, MAX(0, 100 + MODIFIER))
;DEBUGPRINTFORML 魔力攻撃力乗算補正食事効果: x{100 + MODIFIER}％  ATTACKER_MAG = {ATTACKER_MAG}
;-------------------------------------------------
; 魔力攻撃力加減補正:トークン&スキル
;-------------------------------------------------
MODIFIER = CC_MODIFIER_MAP_GET("ATTACKER_MAG_ADD")
ATTACKER_MAG = MAX(0, ATTACKER_MAG + MODIFIER)
;DEBUGPRINTFORML 魔力攻撃力加減補正 +{MODIFIER}pt  ATTACKER_MAG = {ATTACKER_MAG}

;-------------------------------------------------
; 魔力防御力乗算補正:トークン&スキル
;-------------------------------------------------
MODIFIER = CC_MODIFIER_MAP_GET("DEFENDER_MAG_MULTI")
DEFENDER_MAG = FTIMES(DEFENDER_MAG, MAX(0, 100 + MODIFIER))
;DEBUGPRINTFORML 魔力防御力乗算補正トークン&スキル: {100 + MODIFIER}％  DEFENDER_MAG = {DEFENDER_MAG}
;-------------------------------------------------
; 魔力防御力加減補正:トークン&スキル
;-------------------------------------------------
MODIFIER = CC_MODIFIER_MAP_GET("DEFENDER_MAG_ADD")
DEFENDER_MAG = MAX(0, DEFENDER_MAG + MODIFIER)
;DEBUGPRINTFORML 魔力防御力加減補正 +{MODIFIER}pt  DEFENDER_MAG = {DEFENDER_MAG}

;-------------------------------------------------
;★魔力追加ダメージ仮値算出
;-------------------------------------------------
MAGIC_DAMAGE = SQRT(MAX(ATTACKER_MAG - DEFENDER_MAG, 0)) * ダメージ基準倍率 * RAND(80, 100) / 100
;DEBUGPRINTFORML 魔力追加ダメージ仮値算出  MAGIC_DAMAGE = {MAGIC_DAMAGE}
;-------------------------------------------------
; 魔力ダメージ乗算補正:トークン&スキル
;------------------------------------------------
MODIFIER = CC_MODIFIER_MAP_GET("MAG_DAMAGE_MULTI")
MAGIC_DAMAGE = FTIMES(MAGIC_DAMAGE, MAX(0, 100 + MODIFIER))
;DEBUGPRINTFORML 魔力ダメージ乗算補正:トークン&スキル {100 + MODIFIER}％  MAGIC_DAMAGE = {MAGIC_DAMAGE}
;-------------------------------------------------
; 魔力ダメージ乗算補正:食事効果
;------------------------------------------------
;MAG_Gは正の数で定義されているので、負数に変換
MODIFIER = GET_MEAL_INSTANT_BUFF(MEAL_EFFECT_ID_DEF, "MAG_G") * -1
MAGIC_DAMAGE = FTIMES(MAGIC_DAMAGE, MAX(0, 100 + MODIFIER))
;DEBUGPRINTFORML 魔力ダメージ乗算補正:食事効果 {100 + MODIFIER}％  MAGIC_DAMAGE = {MAGIC_DAMAGE}
;-------------------------------------------------
; 魔力ダメージ加減補正:トークン&スキル
;-------------------------------------------------
MODIFIER = CC_MODIFIER_MAP_GET("MAG_DAMAGE_ADD")
MAGIC_DAMAGE = MAX(0, MAGIC_DAMAGE + MODIFIER)
;DEBUGPRINTFORML 魔力ダメージ加減補正 +{MODIFIER}pt  MAGIC_DAMAGE = {MAGIC_DAMAGE}
;-------------------------------------------------
; 魔力ダメージ加減補正:軽減値余剰値の適用
;-------------------------------------------------
IF F_ARMOR_REMAIN > 0
    MAGIC_DAMAGE = MAX(0, MAGIC_DAMAGE - F_ARMOR_REMAIN)
ENDIF
;-------------------------------------------------
;★魔力追加ダメージのダメージへの反映
;-------------------------------------------------
CC_DAMAGE += MAGIC_DAMAGE
;DEBUGPRINTFORML 魔力追加ダメージのダメージへの反映 +{MAGIC_DAMAGE}pt  CC_DAMAGE = {CC_DAMAGE}
;-------------------------------------------------
; 与ダメージ補正
;-------------------------------------------------
; #region 与ダメージ補正
;-------------------------------------------------
; 攻撃側スキルによる与ダメージ率加減
;-------------------------------------------------

;-------------------------------------------------
; 最終ダメージ乗算補正:トークン&スキル
;------------------------------------------------
MODIFIER = CC_MODIFIER_MAP_GET("FINAL_DAMAGE_MULTI")
CC_DAMAGE = FTIMES(CC_DAMAGE, MAX(0, 100 + MODIFIER))
;DEBUGPRINTFORML 最終ダメージ乗算補正:トークン&スキル {100 + MODIFIER}％  CC_DAMAGE = {CC_DAMAGE}
;-------------------------------------------------
; 最終ダメージ加算補正:トークン&スキル
;-------------------------------------------------
MODIFIER = CC_MODIFIER_MAP_GET("FINAL_DAMAGE_ADD")
;------------------------------------------------
;★与ダメージ補正の反映
;------------------------------------------------
CC_DAMAGE = MAX(0, CC_DAMAGE + MODIFIER)
;DEBUGPRINTFORML 魔力ダメージ加減補正 +{MODIFIER}pt  CC_DAMAGE = {CC_DAMAGE}
; #endregion

;-------------------------------------------------
; 最小ダメージ保証値の決定
;-------------------------------------------------
MINIMUM_DAMAGE = RAND(80, 100)

;-------------------------------------------------
; 最終ダメージの決定
;-------------------------------------------------
CC_DAMAGE = MAX(CC_DAMAGE, MINIMUM_DAMAGE)
;DEBUGPRINTFORML 最終ダメージ  CC_DAMAGE = {CC_DAMAGE}
;DEBUGPRINTFORML -------------------------------------------------
;CALL DEBUG_TIMER_END

;-------------------------------------------------
;;; 「HPを失う」効果。TARGET_DIDに諸々を考慮しない固定ダメージを与える。
;-------------------------------------------------
@CC_LOSS_HP(TARGET_DID, VALUE, ACTION_DID)
#DIM TARGET_DID
#DIM VALUE
#DIM ACTION_DID

VARI HP
VARI MAX_HP
VARI NEW_HP

HP = DT_CELL_GET("CC_ACTOR", TARGET_DID, "HP", 1)
MAX_HP = DT_CELL_GET("CC_ACTOR", TARGET_DID, "MAX_HP", 1)

NEW_HP = LIMIT(HP - VALUE, 0, MAX_HP)
DT_CELL_SET "CC_ACTOR", TARGET_DID, "HP", NEW_HP, 1

CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "HP_LOST", TOSTR(HP - NEW_HP))

;-------------------------------------------------
;;; 戦闘不能判定
;-------------------------------------------------
@CC_CHECK_KNOCKED_OUT(TARGET_DID, KNOCKED_OUT_MESSAGE = "DEFAULT")
#DIM DYNAMIC TARGET_DID
#DIMS DYNAMIC KNOCKED_OUT_MESSAGE

SIF DT_CELL_GETS("CC_ACTOR", TARGET_DID, "STATE", 1) == "戦闘不能"
    RETURN 2	;既に戦闘不能

IF DT_CELL_GET("CC_ACTOR", TARGET_DID, "HP", 1) <= 0
    SIF KNOCKED_OUT_MESSAGE == "DEFAULT"
        KNOCKED_OUT_MESSAGE '= @"@C:{カラー_注意}@――%DT_CELL_GETS("CC_ACTOR", TARGET_DID, "CHARA_NAME", 1)%は戦闘不能になった！@/C@"

    DT_CELL_SET "CC_ACTOR", TARGET_DID, "STATE", "戦闘不能", 1
    CALL CC_PRINT(KNOCKED_OUT_MESSAGE)
    ;サブステートをクリア
    DT_CELL_SET "CC_ACTOR", TARGET_DID, "SUBSTATE", "", 1
    CALL CC_TRIGGER_SP_TOKEN_PASSIVE_SKILL("DEFEATED", TARGET_DID)
    RETURN 1	;今回戦闘不能になった
ENDIF

RETURN 0
;-------------------------------------------------
;;; 戦闘不能判定(ACTION_MANAGER用)
;-------------------------------------------------
@CC_CHECK_KNOCKED_OUT_NEW(ACTION_DID)
#DIM ACTOR_DID
#DIM TARGET_DID
#DIM ACTION_DID

ACTOR_DID = CC_GET_ACT_INFO(ACTION_DID, "ACTOR_DID")
TARGET_DID = CC_GET_ACT_INFO(ACTION_DID, "TARGET_DID")

SIF DT_CELL_GETS("CC_ACTOR", TARGET_DID, "STATE", 1) == "戦闘不能"
    RETURN 2	;既に戦闘不能

CALL CC_EXEC_PASSIVE_SKILL("BEFORE_KNOCKED_OUT", TARGET_DID, ACTOR_DID)

SIF DT_CELL_GET("CC_ACTOR", TARGET_DID, "HP", 1) > 0
    RETURN 0

DT_CELL_SET "CC_ACTOR", TARGET_DID, "STATE", "戦闘不能", 1
;サブステートをクリア
DT_CELL_SET "CC_ACTOR", TARGET_DID, "SUBSTATE", "", 1
CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "TARGET_DEFEATED", "1")
CALL KOJO_XML_COMBAT(ACTION_DID, "DEFEAT")

SIF ACTOR_DID != TARGET_DID
    CALL CC_EXEC_WPN_PASSIVE_SKILL("DEFEAT_ENEMY", ACTOR_DID, TARGET_DID)
CALL CC_TRIGGER_SP_TOKEN_PASSIVE_SKILL("DEFEATED", TARGET_DID, ACTOR_DID, ACTION_DID)
CALL CC_EXEC_PASSIVE_SKILL("DEFEATED", TARGET_DID, ACTOR_DID)
RETURN 1	;今回戦闘不能になった


code:
;-------------------------------------------------
;;; 指定された関数を呼び出しスキル効果を上書きする
;;; ENEMYDATAのENEMY_AIより[SKILL_OVERRIDE_FUNC:関数名]で指定
;-------------------------------------------------
@CCS_SKILL_OVERRIDE_FUNC(ACTOR_DID, FUNCTION_NAME)
#DIM  ACTOR_DID
#DIMS FUNCTION_NAME
TRYCCALLFORM CCS_SKILL_OVERRIDE_FUNC_%FUNCTION_NAME%(ACTOR_DID)
    RETURN 1
CATCH
    RETURN 0
ENDCATCH

@CCS_SKILL_OVERRIDE_FUNC_蟲類汎用(ACTOR_DID)
#DIM  ACTOR_DID

SELECTCASE CCS_SKILL_DEF_NAME
    CASE "ACT_TEMPTATION"
        CCS_SKILL_NAME '= "催淫液"
    CASE "ACT_MOLESTATION", "ACT_MOLESTATION_MALE"
        CCS_SKILL_NAME '= "這い回る"
ENDSELECT

@CCS_SKILL_OVERRIDE_FUNC_触手汎用(ACTOR_DID)
#DIM  ACTOR_DID

SELECTCASE CCS_SKILL_DEF_NAME
    CASE "ACT_STUN_ENEMY"
        CCS_SKILL_NAME '= "絡め取る"
ENDSELECT

@CCS_SKILL_OVERRIDE_FUNC_不定形汎用(ACTOR_DID)
#DIM  ACTOR_DID

SELECTCASE CCS_SKILL_DEF_NAME
    CASE "POISON_ATTACK"
        CCS_SKILL_NAME '= "毒液"
ENDSELECT


code:
;-------------------------------------------------
;ソースの処理など
;-------------------------------------------------
@CC_SOURCE_CHECK(ACTOR_DID)
#DIM ACTOR_DID
#DIM DYNAMIC CHARA_ID

CHARA_ID = DT_CELL_GET("CC_ACTOR", ACTOR_DID, "CHARA_ID", 1)

CALL CC_SOURCE_CHECK_1(ACTOR_DID)
CALL CC_SOURCE_CHECK_2(ACTOR_DID)
CALL CHECK_SEXUAL_PREFERENCE(CHARA_ID)
;-------------------------------------------------
;CHARA_ID番のキャラについて、快楽系ソースと絶頂の処理を行う
;-------------------------------------------------
@CC_SOURCE_CHECK_1(ACTOR_DID)
#DIM ACTOR_DID
#DIM DYNAMIC CHARA_ID

CHARA_ID = DT_CELL_GET("CC_ACTOR", ACTOR_DID, "CHARA_ID", 1)

;●ソースが上限値を超えた場合、上限値に修正
FOR LOCAL:0, 0, 100
	SOURCE:(CHARA_ID):(LOCAL:0) = LIMIT(SOURCE:(CHARA_ID):(LOCAL:0), 0, 100000000)
NEXT

;●快楽系ソースの計算
;快楽系(0～9)のみを計算
FOR LOCAL:0, 0, 10
	TRYCALLFORM CALC_SOURCE{LOCAL:0}(CHARA_ID)
NEXT

;●素質などによるパラメータ上昇の補正(快感系)
CALL UP_TALENT_CHECK1(CHARA_ID)

;領内活動の設備補正
IF FLAG:ハウジングモード
	CALL HOUSING_INTERIOR_EFFECT_SOURCE_CHECK1_BEFORE_ORGASM(CHARA_ID)
ENDIF

;●絶頂の処理
CALL CC_SOURCE_ORGASM(ACTOR_DID)

;領内活動の設備補正
IF FLAG:ハウジングモード
	CALL HOUSING_INTERIOR_EFFECT_SOURCE_CHECK1_AFTER_ORGASM(CHARA_ID)
ENDIF

;●ターゲット以外のキャラに感応のソースを追加する
;プレイヤーまたはターゲットなら欲情上昇量を記録
IF IS_MPLY(CHARA_ID) || IS_MTAR(CHARA_ID)
	TFLAG:欲情上昇量 += CUP:(CHARA_ID):欲情
	TFLAG:58 = MAX(SOURCE:(CHARA_ID):逸脱, TFLAG:58)

	;ターゲットが絶頂していた場合
	FOR LOCAL:0, 0, 6
		IF NOWEX:(CHARA_ID):(LOCAL:0) > 0
			TFLAG:絶頂数 += NOWEX:(CHARA_ID):(LOCAL:0)
			;ターゲットとしてとられ絶頂した場合、焦らされ度を減少させる
			TCVAR:(CHARA_ID):焦らされ度 = MAX(TCVAR:(CHARA_ID):焦らされ度 - ((NOWEX:(CHARA_ID):(LOCAL:0)) * 5), 0)
		ENDIF
	NEXT

	;プレイヤー・ターゲットでないなら記録した欲情上昇量に応じて感応・逸脱のソースを追加する(行動不能なら除く)
ELSEIF IS_PLAYABLE(CHARA_ID)
	IF TFLAG:欲情上昇量 >= 30000
		SOURCE:(CHARA_ID):感応 += 3000
		TCVAR:(CHARA_ID):焦らされ度 += RAND(15, 20)
	ELSEIF TFLAG:欲情上昇量 >= 10000
		SOURCE:(CHARA_ID):感応 += 1500
		TCVAR:(CHARA_ID):焦らされ度 += RAND(10, 15)
	ELSEIF TFLAG:欲情上昇量 >= 3000
		SOURCE:(CHARA_ID):感応 += 500
		TCVAR:(CHARA_ID):焦らされ度 += 8
	ELSEIF TFLAG:欲情上昇量 >= 500
		SOURCE:(CHARA_ID):感応 += 150
		TCVAR:(CHARA_ID):焦らされ度 += 6
	ELSEIF TFLAG:欲情上昇量 >= 100
		SOURCE:(CHARA_ID):感応 += 50
		TCVAR:(CHARA_ID):焦らされ度 += 3
	ENDIF
	SOURCE:(CHARA_ID):感応 += TFLAG:絶頂数 * 100
	SOURCE:(CHARA_ID):逸脱 += TFLAG:58 / 3
ENDIF

;麻薬つかってたら歓喜が入る
SIF TCVAR:(CHARA_ID):麻薬
	SOURCE:(CHARA_ID):歓喜 += 500

;-------------------------------------------------
;CHARA_ID番のキャラについて、快楽系以外のソースの処理を行う
;-------------------------------------------------
;気絶・睡眠中・催眠中は感情に関わるソースを全てゼロにする
@CC_SOURCE_CHECK_2(ACTOR_DID)
#DIM ACTOR_DID
#DIM DYNAMIC CHARA_ID

CHARA_ID = DT_CELL_GET("CC_ACTOR", ACTOR_DID, "CHARA_ID", 1)

IF TCVAR:(CHARA_ID):失神フラグ || TCVAR:(CHARA_ID):離脱フラグ == 1 || TCVAR:(CHARA_ID):催眠中 > 0
	FOR LOCAL:0, 10, 40
		IF SOURCENAME:(LOCAL:0) != "苦痛"
			SOURCE:(CHARA_ID):(LOCAL:0) = 0
		ENDIF
	NEXT
	SOURCE:(CHARA_ID):欲情追加 = 0
ENDIF

;各ソースによるパラメータの変動量を計算(快楽系(0～9)は飛ばす)
FOR LOCAL:0, 10, 100
	TRYCALLFORM CALC_SOURCE{LOCAL:0}(CHARA_ID)
NEXT

;●性癖設定に応じたソースの追加
CALL ADD_SOURCE_TENDENCY(CHARA_ID)

;●素質などによるパラメータ上昇の補正(快感系以外)
CALL UP_TALENT_CHECK2(CHARA_ID)

;領内活動の設備補正
IF FLAG:ハウジングモード
	;コマンド実行後のエリア効果の更新
	CALL HO_ROOM_EFFECT_REMOVE_CHECK(HO_MASTER現在地)
	CALL HOUSING_INTERIOR_EFFECT_SOURCE_CHECK2(CHARA_ID)
ENDIF

;●欲望経験値の取得
;今回の欲情パラメータの増加量と絶頂回数が影響する
LOCAL:0 = MIN(CUP:(CHARA_ID):欲情 / ((ABL:(CHARA_ID):欲望 + 1) * (ABL:(CHARA_ID):欲望 + 1) * 100), 30)
EXP:(CHARA_ID):欲望経験値 += LOCAL:0

;●潤滑増加の処理
IF !IS_MALE(CHARA_ID)
	;快感による潤滑増加
	LOCAL:0 = (CUP:(CHARA_ID):0 + CUP:(CHARA_ID):1 + CUP:(CHARA_ID):2 + CUP:(CHARA_ID):3 + CUP:(CHARA_ID):4) / 5
	;快感パラメータの上昇が合計100以下なら潤滑は増加しない
	IF LOCAL:0 < 20
		LOCAL:0 = 0
	ENDIF

	;欲情上昇による潤滑の増加
	IF FLAG:ウフフフラグ
		;ウフフ中
		LOCAL:0 += CUP:(CHARA_ID):欲情 / 2
	ELSE
		;非ウフフ
		LOCAL:0 += CUP:(CHARA_ID):欲情 / 10
	ENDIF

	IF TALENT:(CHARA_ID):濡れやすい
		TIMES LOCAL:0, 2.50
	ENDIF
	IF TALENT:(CHARA_ID):濡れにくい
		TIMES LOCAL:0, 0.40
	ENDIF
	;男性・男の娘は少し濡れづらい
	;濡れやすいがある場合は除外
	IF GROUPMATCH(TALENT:(CHARA_ID):性別, 0, 4) && TALENT:(CHARA_ID):濡れやすい == 0
		TIMES LOCAL:0, 0.60
	ENDIF

	CUP:(CHARA_ID):潤滑 += LOCAL:0
ENDIF

;●失神or睡眠状態なら機嫌の変動量をゼロにする
IF TCVAR:(CHARA_ID):失神フラグ || TCVAR:(CHARA_ID):離脱フラグ == 1
	FOR LOCAL:0, 10, 16
		CUP:(CHARA_ID):(LOCAL:0) = 0
	NEXT
ENDIF

;●PALAMにCUPの値を加える
;CUPCHECKだと表示面で不都合があるため、独自に処理
FOR LOCAL:0, 0, 100
	IF GROUPMATCH(LOCAL:0, 40)
		;潤滑はLv9まで
		LOCAL:1 = PALAMLV:9
	ELSEIF GROUPMATCH(LOCAL:0, 10, 11, 12, 13, 14, 15)
		;機嫌は1000000まで
		LOCAL:1 = 1000000
	ELSE
		;それ以外はLv25まで
		LOCAL:1 = PALAMLV:25
	ENDIF

	;強制友好化ありなら補正
	IF CFLAG:(CHARA_ID):強制友好化 && GROUPMATCH(LOCAL, GETNUM(CUP, "怒主"), GETNUM(CUP, "哀主"), GETNUM(CUP, "怖主"), GETNUM(CUP, "怒外"), GETNUM(CUP, "哀外"), GETNUM(CUP, "怖外"))
		IF CUP:(CHARA_ID):(LOCAL:0) > 0
			CUP:(CHARA_ID):(LOCAL:0) = 0
		ELSEIF CUP:(CHARA_ID):(LOCAL:0) > -100
			CUP:(CHARA_ID):(LOCAL:0) += RAND(-20, 0)
		ENDIF
	ENDIF

	IF CFLAG:(CHARA_ID):凌辱被害者フラグ && GROUPMATCH(LOCAL, GETNUM(CUP, "怒主"), GETNUM(CUP, "哀主"), GETNUM(CUP, "怖主"), GETNUM(CUP, "怒外"), GETNUM(CUP, "哀外"), GETNUM(CUP, "怖外"))
		IF CUP:(CHARA_ID):(LOCAL:0) > 0
			CUP:(CHARA_ID):(LOCAL:0) += (CUP:(CHARA_ID):(LOCAL:0)) * 3
		ELSEIF CUP:(CHARA_ID):(LOCAL:0) < -5
			CUP:(CHARA_ID):(LOCAL:0) = RAND(-5, 0)
		ENDIF
	ENDIF

	;強制友好化ありなら補正
	;	SIF GROUPMATCH(LOCAL, GETNUM(CUP, "怒主"), GETNUM(CUP, "哀主"), GETNUM(CUP, "怖主"), GETNUM(CUP, "怒外"), GETNUM(CUP, "哀外"), GETNUM(CUP, "怖外"))
	;		PRINTFORML PALAM %PALAMNAME:(LOCAL)% : {CUP:(CHARA_ID):LOCAL}

	;快感パラメータは独自処理(絶頂により低下)
	IF LOCAL:0 >= 0 && LOCAL:0 <= 9
		LOCAL:2 = PALAM:(CHARA_ID):(LOCAL:0)
		PALAM:(CHARA_ID):(LOCAL:0) = LIMIT(PALAM:(CHARA_ID):(LOCAL:0) + CUP:(CHARA_ID):(LOCAL:0) - 100000 * NOWEX:(CHARA_ID):(LOCAL:0), 0, 99999)

		IF LOCAL:0 <= 5
			;快感系の経験取得
			CALL ADD_EXP_SENSE(CHARA_ID, LOCAL:0, LOCAL:2)
		ENDIF
		;パラメータ上昇量にキャップを掛ける
	ELSEIF PALAM:(CHARA_ID):(LOCAL:0) + CUP:(CHARA_ID):(LOCAL:0) > LOCAL:1
		PALAM:(CHARA_ID):(LOCAL:0) = LOCAL:1
	ELSE
		PALAM:(CHARA_ID):(LOCAL:0) += CUP:(CHARA_ID):(LOCAL:0)
	ENDIF
NEXT

IF NOWEX:(CHARA_ID):射精 >= 1
	;射精した場合潮吹きのPALAMを0に
	PALAM:(CHARA_ID):潮吹き = 0
ENDIF


code:
;-------------------------------------------------
;戦闘絶頂に関する処理
;-------------------------------------------------
@CC_SOURCE_ORGASM(ACTOR_DID)
#DIM ACTOR_DID
#DIMS DYNAMIC CHARA_NAME
#DIM DYNAMIC TRANCE
#DIM DYNAMIC CHARA_ID
#DIMS 出力文字列
#DIM DYNAMIC COLORUSED
#DIM DYNAMIC HP
#DIM DYNAMIC MAX_HP
#DIM DYNAMIC ESTRUS_TOKEN

CHARA_ID = DT_CELL_GET("CC_ACTOR", ACTOR_DID, "CHARA_ID", 1)
CHARA_NAME = %DT_CELL_GETS("CC_ACTOR", ACTOR_DID, "CHARA_NAME", 1)%
;HP取得
HP = DT_CELL_GET("CC_ACTOR", ACTOR_DID, "HP", 1)
MAX_HP = DT_CELL_GET("CC_ACTOR", ACTOR_DID, "MAX_HP", 1)
;欲情トークンの値
ESTRUS_TOKEN = DT_CELL_GET("CC_ACTOR", ACTOR_DID, "ESTRUS_TOKEN", 1)

VARSET LOCAL, 0

;表示用
LOCALS:0 = Ｃ
LOCALS:1 = Ｖ
LOCALS:2 = Ａ
LOCALS:3 = Ｂ
LOCALS:4 = Ｍ
LOCALS:5 = Ｕ
;射精箇所表示用	;射精箇所表示用
LOCALS:6 =
;●絶頂の判定と表示
LOCAL:5 = 0
LOCAL:6 = 0
LOCAL:10 = 0
;射精関連の処理
LOCAL:15 = 0
VARI 獲得CUP
FOR LOCAL:0, 0, 6

	;欲情トークン数によるCUP補正。1トークンあたり20%増加
	獲得CUP = CUP:CHARA_ID:LOCAL
	獲得CUP = FTIMES(獲得CUP, ESTRUS_TOKEN * 20 + 100)
	LOCAL:2 = PALAM:(CHARA_ID):(LOCAL:0) + 獲得CUP

	;絶頂した場合
	IF LOCAL:2 >= 10000
		LOCAL:10 = 1

		;絶頂箇所の数を加算
		LOCAL:5 ++

		;絶頂強度に応じてNOWEXをセットし、メッセージの表示を行う
		IF LOCAL:2 >= 150000
			IF CHARA_ID == MASTER
				COLORUSED = 0x800080
			ELSE
				COLORUSED = 0xFF4000
			ENDIF
			NOWEX:(CHARA_ID):(LOCAL:0) = 9
			出力文字列 = 最強
			;最強絶頂箇所の数を加算
			LOCAL:6 ++
		ELSEIF LOCAL:2 >= 80000
			IF CHARA_ID == MASTER
				COLORUSED = 0x6000FF
			ELSE
				COLORUSED = カラー_オレンジ
			ENDIF
			NOWEX:(CHARA_ID):(LOCAL:0) = 4
			出力文字列 = 超強
		ELSEIF LOCAL:2 >= 30000
			IF CHARA_ID == MASTER
				COLORUSED = 0x0080FF
			ELSE
				COLORUSED = 0xFFC000
			ENDIF
			NOWEX:(CHARA_ID):(LOCAL:0) = 2
			出力文字列 = 強
		ELSE
			IF CHARA_ID == MASTER
				COLORUSED = カラー_シアン
			ELSE
				COLORUSED = カラー_注意
			ENDIF
			NOWEX:(CHARA_ID):(LOCAL:0) = 1
		ENDIF
		CALL CC_PRINT(@"%ANAME(CHARA_ID)%:@C:{COLORUSED}@%出力文字列%絶頂%LOCALS:(LOCAL:0)%@/C@")

		;絶頂経験を増やす
		EXP:(CHARA_ID):絶頂経験 += NOWEX:(CHARA_ID):(LOCAL:0)
	ENDIF
NEXT

;●噴乳の判定と表示
LOCAL:2 = PALAM:(CHARA_ID):噴乳 + CUP:(CHARA_ID):噴乳

;噴乳した場合
IF LOCAL:2 >= 10000 && SOURCE:(CHARA_ID):快Ｂ + SOURCE:(CHARA_ID):快Ｖ + SOURCE:(CHARA_ID):快Ａ > 0
	LOCAL:10 = 1

	;絶頂強度に応じてNOWEXをセットし、メッセージの表示を行う
	IF LOCAL:2 >= 300000
		IF CHARA_ID == MASTER
			COLORUSED = 0x800080
		ELSE
			COLORUSED = 0xFF4000
		ENDIF
		NOWEX:(CHARA_ID):噴乳 = 9
		出力文字列 = 超々大量
	ELSEIF LOCAL:2 >= 150000
		IF CHARA_ID == MASTER
			COLORUSED = 0x6000FF
		ELSE
			COLORUSED = カラー_オレンジ
		ENDIF
		NOWEX:(CHARA_ID):噴乳 = 4
		出力文字列 = 超大量
	ELSEIF LOCAL:2 >= 50000
		IF CHARA_ID == MASTER
			COLORUSED = 0x0080FF
		ELSE
			COLORUSED = 0xFFC000
		ENDIF
		NOWEX:(CHARA_ID):噴乳 = 2
		出力文字列 = 大量
	ELSE
		IF CHARA_ID == MASTER
			COLORUSED = カラー_シアン
		ELSE
			COLORUSED = カラー_注意
		ENDIF
		NOWEX:(CHARA_ID):噴乳 = 1
	ENDIF
	CALL CC_PRINT(@"%ANAME(CHARA_ID)%:@C:{COLORUSED}@%出力文字列%噴乳@/C@")

	EXP:(CHARA_ID):噴乳経験値 += NOWEX:(CHARA_ID):噴乳

ENDIF

;●潮吹きの判定と表示
LOCAL:11 = 0
IF CONFIG:9 == 1 && NOWEX:(CHARA_ID):射精 == 0
	IF (NOWEX:(CHARA_ID):Ｃ絶頂 >= 2 || NOWEX:(CHARA_ID):Ｖ絶頂 >= 2) && PALAM:(CHARA_ID):潮吹き + CUP:(CHARA_ID):潮吹き >= 10000
		LOCAL:11 = 1
	ELSEIF (NOWEX:(CHARA_ID):Ｃ絶頂 >= 1 || NOWEX:(CHARA_ID):Ｖ絶頂 >= 1) && PALAM:(CHARA_ID):潮吹き + CUP:(CHARA_ID):潮吹き >= 20000
		LOCAL:11 = 1
	ENDIF
ENDIF

IF LOCAL:11
	LOCAL:10 = 1

	IF CHARA_ID == MASTER
		COLORUSED = 0x0080FF
	ELSE
		COLORUSED = 0xFFC000
	ENDIF
	CALL CC_PRINT(@"%ANAME(CHARA_ID)%:@C:{COLORUSED}@潮吹き@/C@")

	NOWEX:(CHARA_ID):潮吹き = 1

	SOURCE:(CHARA_ID):露出 += 100
	IF !HAS_VAGINA(CHARA_ID)
		SOURCE:(CHARA_ID):屈従 += 300
	ELSE
		SOURCE:(CHARA_ID):屈従 += 50
	ENDIF
ENDIF

;●おもらしの判定と表示
;絶頂・尿意限界によるおもらしの設定が有効の場合
IF CONFIG:90 == 1
	;尿意がある状態で絶頂強度の合計が4以上によるおもらし
	IF TCVAR:(CHARA_ID):尿残量 >= 1500 && SUM_NOWEX(CHARA_ID, 1, 0) >= 4
		TCVAR:(CHARA_ID):失禁種類 = 1
		;尿意が高い状態で絶頂することによるおもらし
	ELSEIF TCVAR:(CHARA_ID):尿残量 >= 3000 && SUM_NOWEX(CHARA_ID, 1, 0) >= 1
		TCVAR:(CHARA_ID):失禁種類 = 2
		;尿意の限界によるおもらし
	ELSEIF TCVAR:(CHARA_ID):尿残量 >= 4000
		TCVAR:(CHARA_ID):失禁種類 = 3
	ENDIF
ENDIF

IF TCVAR:(CHARA_ID):失禁種類

	LOCAL:10 = 1

	IF CHARA_ID == MASTER
		COLORUSED = カラー_シアン
	ELSE
		COLORUSED = カラー_注意
	ENDIF
	IF TCVAR:(CHARA_ID):尿残量 >= 3000
		CALL CC_PRINT(@"%ANAME(CHARA_ID)%:@C:{COLORUSED}@大量おもらし@/C@")
		TCVAR:(CHARA_ID):失禁量 = 2
	ELSE
		CALL CC_PRINT(@"%ANAME(CHARA_ID)%:@C:{COLORUSED}@おもらし@/C@")
		TCVAR:(CHARA_ID):失禁量 = 1
	ENDIF

	;尿残量を0にする
	TCVAR:(CHARA_ID):尿残量 = 0

	;おもらしによる経験・ソースの追加
	EXP:(CHARA_ID):排泄経験値 += 1
	EXP:(CHARA_ID):おもらし経験 += TCVAR:(CHARA_ID):失禁量

	LOCAL:3 = 400

	SELECTCASE ABL:(CHARA_ID):排泄
		CASE 0
			TIMES LOCAL:3, 0.00
		CASE 1
			TIMES LOCAL:3, 0.10
		CASE 2
			TIMES LOCAL:3, 0.20
		CASE 3
			TIMES LOCAL:3, 0.40
		CASE 4
			TIMES LOCAL:3, 0.70
		CASEELSE
			LOCAL:3 = LOCAL:3 * (100 + (ABL:(CHARA_ID):排泄 - 5) * 2) / 100
	ENDSELECT

	SOURCE:(CHARA_ID):露出 += 300
	SOURCE:(CHARA_ID):逸脱 += 80
	SOURCE:(CHARA_ID):中毒充足 += LOCAL:3

ENDIF

;●射精の判定と表示
LOCAL:2 = PALAM:(CHARA_ID):射精 + CUP:(CHARA_ID):射精

;射精した場合
IF LOCAL:2 >= 10000 && SOURCE:(CHARA_ID):快Ｐ + NOWEX:(CHARA_ID):Ｖ絶頂 + NOWEX:(CHARA_ID):Ａ絶頂 > 0
	LOCAL:10 = 1
	CALL CC_PROCESS_EJACULATION(CHARA_ID, LOCAL:2, LOCAL:10)
ENDIF

;●ソースの追加・気力の消耗
LOCAL:30 = 0
LOCAL:31 = 0
FOR LOCAL:0, 0, 8
	LOCAL:2 = 0
	LOCAL:3 = 0
	IF NOWEX:(CHARA_ID):(LOCAL:0) > 0
		;ソースの追加
		CALL ADD_SOURCE_ORGASM(CHARA_ID, LOCAL:0)

		;絶頂箇所に応じた基本消耗度の設定
		SELECTCASE LOCAL:0
				;Ｃ絶頂
			CASE 0
				LOCAL:2 = 15000
				LOCAL:3 = 8000
				;Ｖ絶頂
			CASE 1
				LOCAL:2 = 15000
				LOCAL:3 = 10000
				;Ａ絶頂
			CASE 2
				LOCAL:2 = 25000
				LOCAL:3 = 17000
				;Ｂ絶頂
			CASE 3
				LOCAL:2 = 10000
				LOCAL:3 = 8000
				;Ｍ絶頂
			CASE 4
				LOCAL:2 = 15000
				LOCAL:3 = 7000
				;Ｕ絶頂
			CASE 5
				LOCAL:2 = 15000
				LOCAL:3 = 8000
				;射精
			CASE 6
				LOCAL:2 = 15000
				LOCAL:3 = 10000
				;噴乳
			CASE 7
				LOCAL:2 = 20000
				LOCAL:3 = 10000
				;潮吹き
			CASE 8
				LOCAL:2 = 6000
				LOCAL:3 = 6000
		ENDSELECT

		;絶頂強度に基づく補正
		LOCAL:2 *= MAX(NOWEX:(CHARA_ID):(LOCAL:0) / 3, 1)
		LOCAL:3 *= MAX(NOWEX:(CHARA_ID):(LOCAL:0) / 3, 1)

		IF LOCAL == GETNUM(EX, "射精")
			;射精による体力・気力の消耗を計算
			;射精Lvによる補正
			SELECTCASE ABL:(CHARA_ID):射精
				CASE 0
					TIMES LOCAL:2, 1.00
					TIMES LOCAL:3, 1.00
				CASE 1
					TIMES LOCAL:2, 0.95
					TIMES LOCAL:3, 0.80
				CASE 2
					TIMES LOCAL:2, 0.90
					TIMES LOCAL:3, 0.70
				CASE 3
					TIMES LOCAL:2, 0.85
					TIMES LOCAL:3, 0.60
				CASE 4
					TIMES LOCAL:2, 0.80
					TIMES LOCAL:3, 0.50
				CASEELSE
					LOCAL:2 = FTIMES(LOCAL:2, MAX(80 - (ABL:(CHARA_ID):射精 - 5), 20))
					LOCAL:3 = LOCAL:3 / (MIN(ABL:(CHARA_ID):射精 - 5, 55) * 2 + 10)
			ENDSELECT
		ELSEIF LOCAL == GETNUM(EX, "噴乳")
			;噴乳による体力・気力の消耗を計算
			;噴乳Lvによる補正
			SELECTCASE ABL:(CHARA_ID):噴乳
				CASE 0
					TIMES LOCAL:2, 1.00
					TIMES LOCAL:3, 1.00
				CASE 1
					TIMES LOCAL:2, 0.95
					TIMES LOCAL:3, 0.80
				CASE 2
					TIMES LOCAL:2, 0.90
					TIMES LOCAL:3, 0.70
				CASE 3
					TIMES LOCAL:2, 0.85
					TIMES LOCAL:3, 0.60
				CASE 4
					TIMES LOCAL:2, 0.80
					TIMES LOCAL:3, 0.50
				CASEELSE
					LOCAL:2 = FTIMES(LOCAL:2, MAX(80 - (ABL:(CHARA_ID):噴乳 - 5), 20))
					LOCAL:3 = LOCAL:3 / (MIN(ABL:(CHARA_ID):噴乳 - 5, 55) * 2 + 10)
			ENDSELECT
			IF GETBIT(TALENT:(CHARA_ID):淫乱系, 素質_淫乱_雌牛)
				TIMES LOCAL:2, 0.5
				TIMES LOCAL:3, 0.25
			ENDIF
		ENDIF
		;欲望Lvによる補正
		IF ABL:(CHARA_ID):欲望 < 5
			LOCAL:2 = LOCAL:2 * (30 - ABL:(CHARA_ID):欲望) / 30
			LOCAL:3 = LOCAL:3 * (15 - ABL:(CHARA_ID):欲望) / 15
		ELSE
			LOCAL:2 = LOCAL:2 * (130 - MIN(ABL:(CHARA_ID):欲望, 30)) / 150
			LOCAL:3 = LOCAL:3 * (45 - MIN(ABL:(CHARA_ID):欲望, 30)) / 60
		ENDIF
		LOCAL:30 += LOCAL:2
		LOCAL:31 += LOCAL:3
	ENDIF
NEXT

;●同時絶頂ボーナスの設定
LOCAL:7 = 1
IF LOCAL:5 == 6
	LOCAL:7 = 16
ELSEIF LOCAL:5 == 5
	LOCAL:7 = 12
ELSEIF LOCAL:5 == 4
	LOCAL:7 = 8
ELSEIF LOCAL:5 >= 2
	IF LOCAL:5 == 3
		LOCAL:7 = 4
	ELSE
		LOCAL:7 = 2
	ENDIF
ENDIF

FOR LOCAL:0, 0, 100

	;絶頂回数を加算
	EX:(CHARA_ID):(LOCAL:0) += NOWEX:(CHARA_ID):(LOCAL:0) * LOCAL:7
NEXT

IF LOCAL:5 == 6
	;六重絶頂
	IF LOCAL:6 == 6
		COLORUSED = カラー_警告
		CALL CC_PRINT(@"@C:{COLORUSED}@<最 強 六 重 絶 頂>@/C@")
	ELSE
		COLORUSED = 0xFF4000
		CALL CC_PRINT(@"@C:{COLORUSED}@<六 重 絶 頂>@/C@")
	ENDIF
ELSEIF LOCAL:5 == 5
	;五重絶頂
	IF LOCAL:6 == 5
		COLORUSED = カラー_警告
		CALL CC_PRINT(@"@C:{COLORUSED}@<最 強 五 重 絶 頂>@/C@")
	ELSE
		COLORUSED = 0xFF4000
		CALL CC_PRINT(@"@C:{COLORUSED}@<五 重 絶 頂>@/C@")
	ENDIF
ELSEIF LOCAL:5 == 4
	;四重絶頂
	IF LOCAL:6 == 4
		COLORUSED = カラー_オレンジ
		CALL CC_PRINT(@"@C:{COLORUSED}@<最 強 四 重 絶 頂>@/C@")
	ELSE
		COLORUSED = 0xFFC000
		CALL CC_PRINT(@"@C:{COLORUSED}@<四 重 絶 頂>@/C@")
	ENDIF
ENDIF

IF LOCAL:10
	;絶頂による体力・気力の消耗
	LOCAL:8 = LOCAL:30 / 200
	LOCAL:9 = LOCAL:31 / 200
	DOWNBASE:(CHARA_ID):体力 += LIMIT(LOCAL:8, 0, 300)
	DOWNBASE:(CHARA_ID):気力 += LIMIT(LOCAL:9, 0, 300)

	CALL CC_PRINT(@"%CHARA_NAME%は絶頂に達して、@C:{カラー_ピンク}@{DOWNBASE:(CHARA_ID):体力}@/C@ダメージを受けた")
	HP = LIMIT(HP - DOWNBASE:(CHARA_ID):体力, 0, MAX_HP)
	BASE:CHARA_ID:気力 -= DOWNBASE:(CHARA_ID):気力
ENDIF

SIF BASE:(CHARA_ID):精神力 > 0 && CFLAG:(CHARA_ID):崩壊
	CFLAG:(CHARA_ID):崩壊 = MAX(CFLAG:(CHARA_ID):崩壊 - SUM_NOWEX(CHARA_ID) * 5, 0)

TRANCE = SUM_NOWEX(CHARA_ID, 0, 0)
IF TRANCE > 0
	IF TRANCE >= 8
		SELECTCASE RAND:3
			CASE 0
				CALL CC_PRINT(@"@C:{カラー_ピンク}@%CHARA_NAME%は強烈な絶頂感に何度も背を反らせ、打ち上げられた魚のように体を跳ねさせた…@/C@")
			CASE 1
				CALL CC_PRINT(@"@C:{カラー_ピンク}@%CHARA_NAME%は怒涛の快楽に息も絶え絶えに身悶えして身を捩っている…@/C@")
			CASE 2
				CALL CC_PRINT(@"@C:{カラー_ピンク}@%CHARA_NAME%は快楽の渦の中に揉まれ、狂った様に歓喜の叫び声を上げている…@/C@")
		ENDSELECT
	ELSEIF TRANCE >= 3
		SELECTCASE RAND:3
			CASE 0
				CALL CC_PRINT(@"@C:{カラー_ピンク}@%CHARA_NAME%は身体をのけ反らせて激しく絶頂し、口から涎を垂らしてガクガクと痙攣した…@/C@")
			CASE 1
				CALL CC_PRINT(@"@C:{カラー_ピンク}@%CHARA_NAME%は身悶えする様な快楽に、体を捩りながら歓喜の声を上げている…@/C@")
			CASE 2
				CALL CC_PRINT(@"@C:{カラー_ピンク}@%CHARA_NAME%は唇を噛み締め目をぎゅっと瞑り、襲いくる快楽に甘い声を漏らしている…@/C@")
		ENDSELECT
	ELSE
		SELECTCASE RAND:3
			CASE 0
				CALL CC_PRINT(@"@C:{カラー_ピンク}@%CHARA_NAME%は絶頂に達しビクビクと体を震わせた…@/C@")
			CASE 1
				CALL CC_PRINT(@"@C:{カラー_ピンク}@%CHARA_NAME%は媚びた甘い声を上げながら絶頂に震えた…@/C@")
			CASE 2
				CALL CC_PRINT(@"@C:{カラー_ピンク}@%CHARA_NAME%はとろんと顔をとろけさせ絶頂に浸った…@/C@")
		ENDSELECT
	ENDIF

ENDIF
;絶頂トークンを加算
IF SUM_NOWEX(CHARA_ID, 1, 1) && CC_SP_TOKEN_NUM(ACTOR_DID, "ORGASM") < 3
	CALL CC_ADD_SP_TOKEN(ACTOR_DID, "ORGASM", 1)
ENDIF
DT_CELL_SET "CC_ACTOR", ACTOR_DID, "HP", HP, 1

;-------------------------------------------------
;戦闘射精の内部処理
;-------------------------------------------------
@CC_PROCESS_EJACULATION(対象, 強度, スラッシュ)
#DIM 対象
#DIM 射精相手
#DIM 射精先
#DIM 強度
#DIM 射精量
#DIM 補正後射精量
#DIM スラッシュ
#DIM DYNAMIC COLORUSED
#DIMS 出力文字列
#DIMS あふれ文字列
#DIMS 射精先文字列
#DIM 愛情倍率
#DIM 屈従倍率
#DIM 恐怖倍率
#DIM DYNAMIC ROOM_IDX
#DIM DYNAMIC MODULE_IDX

VARSET LOCAL

出力文字列 =

IF IS_EQUIP_TARGET(対象, 78) && TCVAR:対象:77 == 0
	CALL CC_PRINT(@"@C:{カラー_ピンク}@%ANAME(対象)%射精止め@/C@")
	TCVAR:(対象):76 += 強度
	RETURN 0
ENDIF

;絶頂強度に応じてNOWEXをセットし、メッセージの表示を行う
IF 強度 >= 200000 || ((TALENT:(対象):絶倫 || TCVAR:(対象):メイガスの夜) && 強度 >= 80000)
	IF 対象 == MASTER
		COLORUSED = 0x800080
	ELSE
		COLORUSED = 0xFF4000
	ENDIF
	IF !TALENT:対象:絶倫 && !TCVAR:対象:メイガスの夜
		射精量 = 20 + (強度 - 150000) / 20000
	ELSE
		射精量 = 20 + (強度 - 60000) / 10000
	ENDIF
	出力文字列 =  超々大量
ELSEIF 強度 >= 80000 || ((TALENT:(対象):絶倫 || TCVAR:(対象):メイガスの夜) && 強度 >= 40000)
	IF 対象 == MASTER
		COLORUSED = 0x6000FF
	ELSE
		COLORUSED = カラー_オレンジ
	ENDIF
	射精量 = RAND(10, 21)
	出力文字列 = 超大量
ELSEIF 強度 >= 40000 || TALENT:(対象):絶倫 || TCVAR:(対象):メイガスの夜
	IF 対象 == MASTER
		COLORUSED = 0x0080FF
	ELSE
		COLORUSED = 0xFFC000
	ENDIF
	射精量 = RAND(5, 16)
	出力文字列 = 大量
ELSE
	IF 対象 == MASTER
		COLORUSED = カラー_シアン
	ELSE
		COLORUSED = カラー_注意
	ENDIF
	射精量 = RAND(3, 9)
ENDIF

SIF IS_EQUIP_TARGET(対象, GETNUM(TRAINNAME, "玉揉み"))
	射精量 = 射精量 * 3 / 2

IF SOURCE:(対象):快Ｐ == 0 && NOWEX:対象:Ｖ絶頂 + NOWEX:対象:Ａ絶頂 > 0
	出力文字列 = %出力文字列%ところてん
ENDIF
CALL CC_PRINT(@"%ANAME(対象)%@C:{COLORUSED}@%出力文字列%射精@/C@")

;スキルによる補正
CALL LEWDSKILL_CUM_INFLATION(対象, 射精量)
射精量 += RESULT

NOWEX:対象:射精 = 射精量
EXP:(対象):射精経験値 += 射精量 / 3
EXP:(対象):絶頂経験 += 射精量 / 3

射精先文字列 =
あふれ文字列 =
FOR LOCAL:0, 0, STACK_SPERM_CHARA_NUM:対象:0

	射精相手 = STACK_SPERM_CHARA_MAP:対象:LOCAL
	射精先 = STACK_SPERM_TO_MAP:対象:LOCAL

	;射精場所に応じた補正を掛けて精愛経験値を加算
	;射精場所に応じたソースを追加(LOCAL:13=愛情倍率、屈従倍率=屈従倍率、恐怖倍率=恐怖倍率)
	愛情倍率 = 20
	屈従倍率 = 20
	恐怖倍率 = 20

	IF !GROUPMATCH(射精先, 射精部位_無駄, 射精部位_触手)
		SELECTCASE ABL:(射精相手):精愛
			CASE 0
				LOCAL:12 = 0
			CASE 1
				LOCAL:12 = 20
			CASE 2
				LOCAL:12 = 50
			CASE 3
				LOCAL:12 = 80
			CASE 4
				LOCAL:12 = 120
			CASEELSE
				LOCAL:12 = MIN(ABL:(射精相手):精愛 * 3 + 150, 2000)
		ENDSELECT
	ENDIF
	SELECTCASE 射精先
			;膣内
		CASE 1
			愛情倍率 = 80
			屈従倍率 = 60
			恐怖倍率 = 200
			IF IS_OVULATION(射精相手)
				TIMES 愛情倍率, 1.5
				TIMES 屈従倍率, 1.5
				TIMES 恐怖倍率, 1.5
				TIMES LOCAL:12, 1.5
			ENDIF
			EXP:射精相手:膣内射精経験 ++
			;アナル
		CASE 2
			愛情倍率 = 40
			屈従倍率 = 120
			恐怖倍率 = 40
			EXP:射精相手:腸内射精経験 ++
		CASE 3
			;口
		CASE 4
			愛情倍率 = 50
			屈従倍率 = 40
			恐怖倍率 = 40
			EXP:射精相手:口内射精経験 ++
			;胸
		CASE 5
			愛情倍率 = 40
			屈従倍率 = 30
			恐怖倍率 = 30
		CASE 6
		CASE 7
			;顔
		CASE 8
			愛情倍率 = 30
			屈従倍率 = 30
			恐怖倍率 = 30
			;髪
		CASE 9
		CASE 10
		CASE 11
			;オナホ
		CASE 12
			;触手
		CASE 13
			;ゴム
		CASE 14
			;その他
		CASEELSE
	ENDSELECT

	;おねだり充足補正
	IF TCVAR:射精相手:精飲おねだりフラグ == 1
		愛情倍率 += 50
		TCVAR:射精相手:精飲おねだりフラグ = 2
	ENDIF

	IF !GROUPMATCH(射精先, 射精部位_無駄, 射精部位_触手)
		;射精量による補正
		SELECTCASE NOWEX:(対象):射精
			CASE 1 TO 3
				TIMES 愛情倍率, 1.00
				TIMES 屈従倍率, 1.00
				TIMES 恐怖倍率, 1.00
			CASE 4 TO 6
				TIMES 愛情倍率, 1.50
				TIMES 屈従倍率, 1.50
				TIMES 恐怖倍率, 1.50
			CASE 7 TO 10
				TIMES 愛情倍率, 2.00
				TIMES 屈従倍率, 2.00
				TIMES 恐怖倍率, 2.00
			CASE IS > 10
				TIMES 愛情倍率, 2.50
				TIMES 屈従倍率, 2.50
				TIMES 恐怖倍率, 2.50
		ENDSELECT
		SIF !GROUPMATCH(射精先, 射精部位_ゴム)
			EXP:(射精相手):精愛経験値 += 射精量
	ENDIF

	IF !GROUPMATCH(射精先, 射精部位_無駄, 射精部位_触手)
		;愛情ソースの追加
		CALL ADD_SOURCE_AIZYOU(射精相手, 愛情倍率)
	ENDIF

	補正後射精量 = CUM_AMOUNT_CORRECTION(GET_ID(対象), 射精相手, 射精先, 射精量)

	IF !GROUPMATCH(射精先, 射精部位_無駄, 射精部位_触手)
		IF !IS_INITIATIVE(射精相手)
			LOCAL:16 = 100
			IF TALENT:(射精相手):恋慕 || TALENT:(射精相手):服従
				LOCAL:16 = 0
			ELSEIF CFLAG:(射精相手):2 >= 1500
				LOCAL:16 = 30
			ELSEIF CFLAG:(射精相手):2 >= 800
				LOCAL:16 = 60
			ENDIF
			SOURCE:(射精相手):恐怖 += 射精量 * 恐怖倍率 * LOCAL:16 / 100
		ENDIF

		SOURCE:(射精相手):中毒充足 += 射精量 * LOCAL:12

		;スキル：精飲発情体質持ちなら確率で発情フラグを立てる
		TCVAR:射精相手:精飲発情フラグ = 0
		IF 射精先 == 射精部位_口
			CALL SKILL_GET_LEVEL(射精相手, スキル_大分類_性技, "CUM_ADDICTION")
			IF RESULT
				IF TCVAR:射精相手:精飲おねだりフラグ == 1 && RAND:100 < 50
					TCVAR:射精相手:60 += 1
					TCVAR:射精相手:精飲発情フラグ = 1
				ELSEIF RAND:100 < 30
					TCVAR:射精相手:60 += 1
					TCVAR:射精相手:精飲発情フラグ = 1
				ENDIF
			ENDIF
		ENDIF

		IF 補正後射精量 != CORRECT_CUM_OVERFLOW(射精相手, 射精先, 補正後射精量)
			あふれ文字列=%あふれ文字列%%TOSTR_SPACE(MAX_CHARANAME_LENGTH + 1)%すでにいっぱいの%ANAME(射精相手)%の%CUM_SLOT_NAME:射精先%から、{補正後射精量 - CORRECT_CUM_OVERFLOW(射精相手, 射精先, 補正後射精量)}mlの精液が溢れた……\n
			IF 射精部位_膣内
				;あふれ分の2/3を膨張率に加算する
				WOMB_INFLATION_RATE:射精相手:0 += (((補正後射精量 - CORRECT_CUM_OVERFLOW(射精相手, 射精先, 補正後射精量)) * 2 / 3) * 100) / CALC_WOMB_SIZE(射精相手)
				補正後射精量 = CORRECT_CUM_OVERFLOW(射精相手, 射精先, 補正後射精量)
			ENDIF
		ENDIF
	ENDIF

	;体内に対する射精か見る。コンドームの場合INJECTIONさせない
	IF !IS_EQUIP_PLAYER(対象, 75)
		CALL RECORD_CREAMPIE(射精相手, GET_ID(対象), 補正後射精量, 射精先)
	ENDIF

	CUM_TO_COUNT:(対象):(射精先) ++
	CUM_TO_AMOUNT:(対象):(射精先) += 補正後射精量

	射精先文字列=%射精先文字列%(%CUM_SLOT_NAME:射精先%

	CUM_GET_AMOUNT:(射精相手):(射精先) += 補正後射精量
	CUM_GET_COUNT:(射精相手):射精先 ++
	CUM_CUR_AMOUNT:(射精相手):(射精先) += 補正後射精量
	射精先文字列=%射精先文字列%:{補正後射精量}ml
	IF !GROUPMATCH(射精先, 射精部位_無駄, 射精部位_ゴム, 射精部位_触手)
		射精先文字列=%射精先文字列%:%ANAME(射精相手)%
	ENDIF
	射精先文字列=%射精先文字列%)
NEXT
SIF 射精先文字列 != ""
	CALL CC_PRINT(@"%射精先文字列%")
IF あふれ文字列 != ""
	CALL CC_PRINT(@"%SUBSTRING(あふれ文字列, 0, STRLENS(あふれ文字列) - 1)%")
ENDIF


code:
;-------------------------------------------------
;;; 指定された定義名のトークンが存在するか
;-------------------------------------------------
@CC_SP_TOKEN_IS_EXIST(TOKEN_NAME)
#FUNCTION
#DIMS DYNAMIC TOKEN_NAME
RETURNF XML_GET(XMLID_TOKEN, @"//defname[@parentname='%TOKEN_NAME%']") > 0

;-------------------------------------------------
;;; トークン数の取得
;-------------------------------------------------
@CC_SP_TOKEN_NUM(ACTOR_DID, TOKEN_NAME)
#FUNCTION
#DIM  DYNAMIC ACTOR_DID
#DIMS DYNAMIC TOKEN_NAME

RETURNF DT_CELL_GET("CC_SP_TOKEN_NUM", ACTOR_DID, TOKEN_NAME, 1)

;-------------------------------------------------
;;; 指定値でのトークン付与
;-------------------------------------------------
@CC_SET_SP_TOKEN(ACTOR_DID, TOKEN_NAME, VALUE)
#DIM  DYNAMIC ACTOR_DID
#DIMS DYNAMIC TOKEN_NAME
#DIM  DYNAMIC VALUE

DT_CELL_SET "CC_SP_TOKEN_NUM", ACTOR_DID, TOKEN_NAME, VALUE, 1

;-------------------------------------------------
;;; トークンの加算処理
;-------------------------------------------------
@CC_ADD_SP_TOKEN(ACTOR_DID, TOKEN_NAME, VALUE)
#DIM  DYNAMIC ACTOR_DID
#DIMS DYNAMIC TOKEN_NAME
#DIM  DYNAMIC VALUE
#DIM DYNAMIC TOKEN_COUNT

SIF VALUE < 0
    THROW 正の値を与えてください

TOKEN_COUNT = CC_SP_TOKEN_NUM(ACTOR_DID, TOKEN_NAME) + VALUE
CALL CC_SET_SP_TOKEN(ACTOR_DID, TOKEN_NAME, TOKEN_COUNT)

;-------------------------------------------------
;;; トークンの減算処理
;-------------------------------------------------
@CC_SUB_SP_TOKEN(ACTOR_DID, TOKEN_NAME, VALUE)
#DIM  ACTOR_DID
#DIMS TOKEN_NAME
#DIM  VALUE
#DIM TOKEN_COUNT
DEBUGPRINTFORML CC_SUB_SP_TOKEN({ACTOR_DID}, %TOKEN_NAME%, {VALUE})
DEBUGPRINTFORML %DT_CELL_GETS("CC_ACTOR", ACTOR_DID, "CHARA_NAME", 1)%
SIF VALUE < 0
    THROW 正の値を与えてください

TOKEN_COUNT = CC_SP_TOKEN_NUM(ACTOR_DID, TOKEN_NAME) - VALUE
SIF !CC_SP_TOKEN_ALLOW_MINUS(TOKEN_NAME)
    TOKEN_COUNT = MAX(TOKEN_COUNT, 0)

CALL CC_SET_SP_TOKEN(ACTOR_DID, TOKEN_NAME, TOKEN_COUNT)

;-------------------------------------------------
;;; トークン個数がマイナス値を許容するか
;-------------------------------------------------
@CC_SP_TOKEN_ALLOW_MINUS(TOKEN_NAME)
#FUNCTION
#DIMS TOKEN_NAME
#DIMS DYNAMIC ALLOW_MINUS_VALUE

XML_GET XMLID_TOKEN, @"//defname[@parentname='%TOKEN_NAME%']/allowMinusValue", ALLOW_MINUS_VALUE, 1
RETURNF TOINT(ALLOW_MINUS_VALUE)

;-------------------------------------------------
;;; トークンパッシブスキル実行
;;;  - 処理順はCC_SP_TOKEN_NUMテーブルをTOKEN_PRIORITY配列の順番に作成している
;-------------------------------------------------
@CC_TRIGGER_SP_TOKEN_PASSIVE_SKILL(EXECUTE_AT, ACTOR_DID, OPPORNENT_DID = -1, SOURCE_ACTION_DID = -1)
#DIMS DYNAMIC EXECUTE_AT
#DIM DYNAMIC ACTOR_DID
#DIM DYNAMIC OPPORNENT_DID
#DIM DYNAMIC SOURCE_ACTION_DID

#DIMS DYNAMIC PARENT_TOKEN_NAMES, SP_TOKEN_MAX_TYPE
#DIM  DYNAMIC TOKEN_TYPE_NUM
#DIM  DYNAMIC TOKEN_NUM
#DIMS DYNAMIC PARENT_TOKEN_NAME
#DIM DYNAMIC SKILL_COUNT
#DIM DYNAMIC SKILL_DID, SP_TOKEN_MAX_SKILL
#DIMS DYNAMIC FUNC_NAME
#DIM DYNAMIC TRIGGER_CHANCE
#DIMS DYNAMIC TRIGGER_CONDITION
#DIM DYNAMIC ITER_I
#DIM DYNAMIC ITER_J

TOKEN_TYPE_NUM = DT_COLUMN_NAMES("CC_SP_TOKEN_NUM")
ARRAYCOPY "RESULTS", "PARENT_TOKEN_NAMES"
;DEBUGPRINTFORML ------------------------------------------------------------
;DEBUGPRINTFORML CC_EXEC_SP_TOKEN_PASSIVE_SKILL EXECUTE_AT_%EXECUTE_AT%
;DEBUGPRINTFORML %DT_CELL_GETS("CC_ACTOR", ACTOR_DID, "CHARA_NAME", 1)%
FOR ITER_I, 1, TOKEN_TYPE_NUM
    PARENT_TOKEN_NAME = %PARENT_TOKEN_NAMES:ITER_I%

    SIF CC_SP_TOKEN_NUM(ACTOR_DID, PARENT_TOKEN_NAME) == 0
        CONTINUE
    ;DEBUGPRINTFORML %PARENT_TOKEN_NAME% = {CC_SP_TOKEN_NUM(ACTOR_DID, PARENT_TOKEN_NAME)}個
    SKILL_COUNT = DT_SELECT("SP_TOKEN_SKILL_PARAMS", @"PARENT_TOKEN_NAME = '%PARENT_TOKEN_NAME%' AND EXECUTE_AT = '%EXECUTE_AT%'",,SKILL_DID)
    SIF SKILL_COUNT == 0
        CONTINUE
    ;DEBUGPRINTFORML %PARENT_TOKEN_NAME% SKILL_COUNT {SKILL_COUNT}
    FOR ITER_J, 0, SKILL_COUNT
        ;確率発動条件
        TRIGGER_CHANCE = CC_GET_SP_TOKEN_SKILL_PARAMS(SKILL_DID:ITER_J, "TRIGGER_CHANCE")
        ;DEBUGPRINTFORML TRIGGER_CHANCE {TRIGGER_CHANCE}
        SIF TRIGGER_CHANCE != 0 && !PERCENT(TRIGGER_CHANCE)
            CONTINUE
        ;発動条件
        TRIGGER_CONDITION = %CC_GETS_SP_TOKEN_SKILL_PARAMS(SKILL_DID:ITER_J,"TRIGGER_CONDITION")%
        ;DEBUGPRINTFORML TRIGGER_CONDITION %TRIGGER_CONDITION%
        SIF TRIGGER_CONDITION != "" && !TOINT(STRFORM(TRIGGER_CONDITION))
            CONTINUE

        FUNC_NAME = %DT_CELL_GETS("SP_TOKEN_SKILL_PARAMS", SKILL_DID:ITER_J, "FUNC_NAME", 1)%
        TRYCCALLFORM CC_SP_TOKEN_SKILL_%FUNC_NAME%(ACTOR_DID, OPPORNENT_DID, SKILL_DID:ITER_J, SOURCE_ACTION_DID)
            CALL KOJO_XML_COMBAT_BY_TRIGGER_ID(RESULT, "TRIGGER")
            CALL CC_ACTION_MANAGER_("RESOLVE")
        CATCH
            DEBUGPRINTFORML スキル<%FUNC_NAME%>が呼ばれましたが、対応するスキル処理関数が見つかりませんでした
        ENDCATCH
    NEXT
NEXT

CALL CC_ACTION_MANAGER_("RESOLVE")
IF SOURCE_ACTION_DID == -1
    CALL CLOSE_COMBAT_DRAW_WINDOW(ACTOR_DID)
ENDIF

@CC_ABNORMALITY_CHECK_COMMON_TRIGGER_CONDITION(ACTOR_DID)
#FUNCTION
#DIM ACTOR_DID

SIF DT_CELL_GETS("CC_ACTOR", ACTOR_DID, "STATE", 1) == "戦闘不能"
    RETURNF 0
RETURNF 1

@CC_ABNORMALITY_CHECK_ESTRUS_TRIGGER_CONDITION(ACTOR_DID)
#FUNCTION
#DIM ACTOR_DID

SIF DT_CELL_GETS("CC_ACTOR", ACTOR_DID, "STATE", 1) == "戦闘不能"
    RETURNF 0
SIF CC_SP_TOKEN_NUM(ACTOR_DID, "ESTRUS") <= 2
    RETURNF 0
SIF RAND:10 >= CC_SP_TOKEN_NUM(ACTOR_DID, "ESTRUS")
    RETURNF 0

RETURNF 1

;-------------------------------------------------
;;; トークン用ターゲティング->CLOSE_COMBAT_SET_TARGETに統合
;-------------------------------------------------
;攻撃側、防御側決定
;RESULT:0 攻撃側リスト(MEM_LIST1)
;RESULT:1 防御側リスト(MEM_LIST2)
;ACTOR, ACTOR番のキャラが行動する
;-------------------------------------------------
; #region @CLOSE_COMBAT_SP_TOKEN_SET_TARGET
[SKIPSTART]
@CLOSE_COMBAT_SP_TOKEN_SET_TARGET(ACTOR_DID, SKILL_DID)
#DIM DYNAMIC ACTOR_DID
#DIM DYNAMIC ACTOR_CHARA_ID
#DIM DYNAMIC TARGET_DID
#DIM DYNAMIC TARGETING
#DIM DYNAMIC TARGETING_SIDE
#DIM DYNAMIC DECIDED_TARGETING_SIDE
#DIM DYNAMIC TARGETING_OVERRIDE_FLAG
#DIM DYNAMIC HATE_RATE
#DIM DYNAMIC HP
#DIM DYNAMIC MAX_HP
#DIM DYNAMIC ATTACK
#DIM DYNAMIC MAG
#DIM DYNAMIC SIDE
#DIM DYNAMIC CHARA_ID
#DIM DYNAMIC IS_PLAYABLE

#DIM  DYNAMIC IDX, CC_MAX_MEMBER_NUM
#DIMS DYNAMIC TAC_LIST, CC_MAX_MEMBER_NUM

#DIM  DYNAMIC MAX_TARGET
#DIM  DYNAMIC MEM_CNT
#DIM  DYNAMIC TGT_IDX
#DIMS DYNAMIC _LIST_TARGET
#DIM  DYNAMIC PREV_THREAT_POINT
#DIM  DYNAMIC THREAT_POINT
#DIM  DYNAMIC IS_ASCEND

#DIM DYNAMIC SKILL_DID
#DIMS DYNAMIC TARGET_LIST

IS_PLAYABLE = DT_CELL_GET("CC_ACTOR", ACTOR_DID, "IS_PLAYABLE", 1)
;キャラクターにセットされている脅威選定ルーチンを取得
;-------------------------------------------------
TARGETING = DT_CELL_GET("CC_ACTOR", ACTOR_DID, "TARGETING", 1)
;トークンによる脅威選定ルーチンの上書き判定
ACTOR_CHARA_ID =  DT_CELL_GET("CC_ACTOR", ACTOR_DID, "CHARA_ID", 1)

IF DT_CELL_GET("SP_TOKEN_SKILL_PARAMS", SKILL_DID, "TARGETING_REQUIRED", 1) == 1
    TARGETING = DT_CELL_GET("SP_TOKEN_SKILL_PARAMS", SKILL_DID, "OVERRIDE_TARGETING", 1)
    TARGETING_SIDE = DT_CELL_GET("SP_TOKEN_SKILL_PARAMS", SKILL_DID, "TARGETING_SIDE", 1)
    TARGETING_OVERRIDE_FLAG = 1
ENDIF

;攻撃対象側を決定
;TARGETING_SIDEの値は0 = 相手
;TARGETING_SIDEの値は1 = 味方
;TARGETING_SIDEの値は-1 = 全員(未実装)
;-------------------------------------------------
SIDE = DT_CELL_GET("CC_ACTOR", ACTOR_DID, "SIDE", 1)
IF TARGETING_SIDE == 1
    DECIDED_TARGETING_SIDE = SIDE
ELSE
    DECIDED_TARGETING_SIDE = SIDE == 0 ? 1 # 0
ENDIF

IF TARGETING == WPN_脅威選定_選択
    CALL CLOSE_COMBAT_TARGET_SELECT(ACTOR_DID, DECIDED_TARGETING_SIDE)
    TARGET_DID = RESULT
    RETURN TARGET_DID
ENDIF

;脅威度の計算とリストの作成
;-------------------------------------------------
MEM_CNT = DT_SELECT("CC_ACTOR", @"SIDE = {DECIDED_TARGETING_SIDE}",, IDX)
;[挑発]持ちがいる場合は、無作為と同じ脅威選定を行う
;アクティブスキルで脅威選定が上書きされている場合はアクティブスキル側が優先される
FOR LOCAL, 0, MEM_CNT
    {
        IF !TARGETING_OVERRIDE_FLAG
            && !GROUPMATCH(TARGETING
            ,WPN_脅威選定_全体
            ,WPN_脅威選定_性攻撃男向け
            ,WPN_脅威選定_性攻撃女向け
            )
    }
        TARGETING = WPN_脅威選定_無作為
    ENDIF
NEXT
MAX_TARGET = 0
MEM_CNT = DT_SELECT("CC_ACTOR", @"SIDE = {DECIDED_TARGETING_SIDE}",, IDX)
FOR LOCAL, 0, MEM_CNT
    SIF DT_CELL_GETS("CC_ACTOR", IDX:LOCAL, "STATE", 1) == "戦闘不能"
        CONTINUE
    HATE_RATE = DT_CELL_GET("CC_ACTOR", IDX:LOCAL, "HATE_RATE", 1)
    ;<挑発>のトークン持ちは脅威度を15倍
    IF CC_SP_TOKEN_NUM(IDX:LOCAL, "PROVOKE") > 0
        HATE_RATE = HATE_RATE * 15
    ENDIF
    HP     = DT_CELL_GET("CC_ACTOR", IDX:LOCAL, "HP", 1)
    MAX_HP = DT_CELL_GET("CC_ACTOR", IDX:LOCAL, "MAX_HP", 1)
    ATTACK = DT_CELL_GET("CC_ACTOR", IDX:LOCAL, "ATTACK", 1)
    MAG = DT_CELL_GET("CC_ACTOR", IDX:LOCAL, "MAG", 1)
    CHARA_ID = DT_CELL_GET("CC_ACTOR", IDX:LOCAL, "CHARA_ID", 1)

    SELECTCASE TARGETING
        CASE WPN_脅威選定_高脅威
            THREAT_POINT = ATTACK * 100 * HATE_RATE / 100
        CASE WPN_脅威選定_低脅威
            THREAT_POINT = HATE_RATE * 100 / MAX(ATTACK, 1)
        CASE WPN_脅威選定_低耐久
            THREAT_POINT = MAX_HP * 100 * MAX(HATE_RATE, 1) / 100
        CASE WPN_脅威選定_低HP
            THREAT_POINT = HP * 100 * MAX(HATE_RATE, 1) / 100
        CASE WPN_脅威選定_低割合HP, WPN_脅威選定_高割合HP
            THREAT_POINT = MAX(HP * 100 / MAX_HP, 1) * MAX(HATE_RATE, 1) / 100
        CASE WPN_脅威選定_魔術師
            THREAT_POINT = MAG * 100 * HATE_RATE / 100
        CASE WPN_脅威選定_性攻撃男向け, WPN_脅威選定_性攻撃女向け
            SIF CHARA_ID == -1
                CONTINUE
            THREAT_POINT = HATE_RATE
            THREAT_POINT = FTIMES(THREAT_POINT, 100 + (HAS_SKILL(CHARA_ID, "SEDUCTION", スキル_大分類_性技) * 50))
            SIF CC_SP_TOKEN_NUM(IDX:LOCAL, "CHEST_EXPOSE") > 0
                THREAT_POINT *= 5
            SIF CC_SP_TOKEN_NUM(IDX:LOCAL, "GENITAL_EXPOSE") > 0
                THREAT_POINT *= 5
            SIF CC_SP_TOKEN_NUM(IDX:LOCAL, "ESTRUS") > 0
                THREAT_POINT *= 5
            SIF CC_SP_TOKEN_NUM(IDX:LOCAL, "ORGASM") > 0
                THREAT_POINT *= 10
            SIF CC_SP_TOKEN_NUM(IDX:LOCAL, "STUN") > 0
                THREAT_POINT *= 2
            IF TARGETING == WPN_脅威選定_性攻撃女向け && IS_MALE(CHARA_ID)
                THREAT_POINT = -1
            ELSEIF TARGETING == WPN_脅威選定_性攻撃男向け && IS_FEMALE(CHARA_ID)
                THREAT_POINT = -1
            ENDIF
        CASEELSE
            THREAT_POINT = HATE_RATE
    ENDSELECT
    TAC_LIST:TGT_IDX = %DIC_SET(TAC_LIST:TGT_IDX, "DID", TOSTR(IDX:LOCAL))%
    TAC_LIST:TGT_IDX = %DIC_SET(TAC_LIST:TGT_IDX, "THREAT_POINT", TOSTR(THREAT_POINT))%
    TGT_IDX ++
NEXT
MAX_TARGET = TGT_IDX
TAC_LIST:(TGT_IDX) '= "-1"

; 算出した脅威度に基づくソート
;-------------------------------------------------
SELECTCASE TARGETING
        ;低いほど優先度が高い脅威選定は昇順ソート
    CASE WPN_脅威選定_低耐久,WPN_脅威選定_低HP, WPN_脅威選定_低割合HP
        CALL ARRAYSORT_DIC(TAC_LIST, "THREAT_POINT", 0)
        IS_ASCEND = 1
    CASEELSE
        IF TARGETING != WPN_脅威選定_無作為 || TARGETING != WPN_脅威選定_全体
            CALL ARRAYSORT_DIC(TAC_LIST, "THREAT_POINT", 1)
        ENDIF
ENDSELECT

; 全体攻撃処理
;-------------------------------------------------
IF TARGETING == WPN_脅威選定_全体
    FOR LOCAL, 0, MAX_TARGET
        TARGET_LIST = %LIST_ADD(TARGET_LIST, DIC_GET(TAC_LIST:LOCAL, "DID"))%
    NEXT
    RESULTS = %TARGET_LIST%
    RETURN 1
ENDIF

; 最終的なターゲットの選出
;-------------------------------------------------
IF MAX_TARGET == 0
    TARGET_DID = TOINT(DIC_GET(TAC_LIST:0, "DID"))
ELSE
    FOR LOCAL, 0, MAX_TARGET
        IF LOCAL == 0
            PREV_THREAT_POINT = TOINT(DIC_GET(TAC_LIST:LOCAL,  "THREAT_POINT"))
            _LIST_TARGET = %LIST_ADD(_LIST_TARGET, DIC_GET(TAC_LIST:LOCAL, "DID"))%
        ELSE
            THREAT_POINT = TOINT(DIC_GET(TAC_LIST:LOCAL,  "THREAT_POINT"))
            ;脅威度が同値のキャラがいる場合を考慮して最終的な選出リストをつくる
            IF THREAT_POINT == PREV_THREAT_POINT
                _LIST_TARGET = %LIST_ADD(_LIST_TARGET, DIC_GET(TAC_LIST:LOCAL, "DID"))%
            ELSEIF IS_ASCEND && THREAT_POINT < PREV_THREAT_POINT
                _LIST_TARGET '= ""
                _LIST_TARGET = %LIST_ADD(_LIST_TARGET, DIC_GET(TAC_LIST:LOCAL, "DID"))%
            ELSEIF !IS_ASCEND  &&  THREAT_POINT > PREV_THREAT_POINT
                _LIST_TARGET '= ""
                _LIST_TARGET = %LIST_ADD(_LIST_TARGET, DIC_GET(TAC_LIST:LOCAL, "DID"))%
            ENDIF
        ENDIF
    NEXT
    ;アクティブスキルで脅威選定ルーチンが変更されている場合は確実にそれに従う
    IF TARGETING_OVERRIDE_FLAG
        TARGET_DID = TOINT(LIST_RAND(_LIST_TARGET))
        ;確率85%で最優先目標を狙う。同値の対象がいる場合は同値の対象からランダムに選出
    ELSEIF RAND:100 < 85 && TARGETING != WPN_脅威選定_無作為
        TARGET_DID = TOINT(LIST_RAND(_LIST_TARGET))
    ELSE
        ;上記以外は完全に無作為に選出する
        ;TARGET_DID = TOINT(DIC_GET(TAC_LIST:RAND(0,MAX_TARGET), "DID"))
        ;無作為の場合は敵視の値による重み付け抽選をおこなう
        CALL RAND_WT_INIT()
        FOR LOCAL, 0, MAX_TARGET
            ;THREAT_POINT0の場合重み付け抽選できないので1点加算
            CALL RAND_WT_SET(LOCAL, TOINT(DIC_GET(TAC_LIST:LOCAL, "THREAT_POINT")) + 1)
        NEXT
        TARGET_DID =  TOINT(DIC_GET(TAC_LIST:RAND_WT_RESULT(), "DID"))
    ENDIF
ENDIF
TARGET_LIST = %LIST_ADD(TARGET_LIST, TOSTR(TARGET_DID))%
RESULTS '=  TARGET_LIST

RETURN 1
; #endregion
[SKIPEND]
;-------------------------------------------------
;;; 全員のトークンパッシブスキル実行チェック
;-------------------------------------------------
@CC_SP_TOKEN_TRIGGER_CHECK(EXECUTE_AT)
#DIMS EXECUTE_AT
#DIMS DYNAMIC ACTOR_LIST, CC_MAX_MEMBER_NUM + 1
#DIM ACTOR_DID

CALL CLOSE_COMBAT_SET_ORDER(ACTOR_LIST)

FOR LOCAL, 0, CC_MAX_MEMBER_NUM + 1
    SIF ACTOR_LIST:LOCAL == "-1"
        BREAK

    ACTOR_DID = TOINT(DIC_GET(ACTOR_LIST:LOCAL, "ACTOR_DID"))
    CALL CC_TRIGGER_SP_TOKEN_PASSIVE_SKILL(EXECUTE_AT, ACTOR_DID)
NEXT

CALL CLOSE_COMBAT_DRAW_WINDOW()

;-------------------------------------------------
;;; テーブルの中身をテキスト出力
;-------------------------------------------------
@DEBUG_OUTPUT_TABLE(DATA_TABLE, DESTIONATION = "CONSOLE")
#DIMS DATA_TABLE
#DIMS DYNAMIC COLUMN_NAMES
#DIM DYNAMIC IDX
#DIM DYNAMIC ROW_NUM
#DIMS DYNAMIC TEXT
#DIMS DESTIONATION
#DIMS ROWS, 1000

SIF !DT_EXIST(DATA_TABLE)
    THROW データテーブル%DATA_TABLE%が存在しません

FOR LOCAL, 0, DT_COLUMN_NAMES(DATA_TABLE)
    TEXT += @"%RESULTS:LOCAL%,"
NEXT
TEXT += "\n"
FOR LOCAL, 0, DT_ROW_LENGTH(DATA_TABLE)
    CALL DEBUG_PRINT_ROW(DATA_TABLE, LOCAL)
    TEXT += RESULTS
NEXT

SELECTCASE DESTIONATION
    CASE "CONSOLE"
        SPLIT TEXT, "\n", ROWS
        FOR LOCAL, 0, RESULT
            DEBUGPRINTFORML %ROWS:LOCAL%
        NEXT
    CASE "TEXT_FILE"
        SAVETEXT TEXT, @"sav/datatable_%DATA_TABLE%.txt"
    CASEELSE

ENDSELECT

@DEBUG_PRINT_ROW(DATA_TABLE, ROW_NUM)
#DIMS DATA_TABLE
#DIM ROW_NUM
#DIMS DYNAMIC COLUMN_NAME
#DIMS DYNAMIC TEXT

FOR LOCAL, 0, DT_COLUMN_NAMES(DATA_TABLE)
    COLUMN_NAME = %RESULTS:LOCAL%
    IF DT_COLUMN_EXIST(DATA_TABLE, COLUMN_NAME) == 5	;string
        TEXT += @"%DT_CELL_GETS(DATA_TABLE, ROW_NUM, COLUMN_NAME)%,"
    ELSE
        TEXT += @"{DT_CELL_GET(DATA_TABLE, ROW_NUM, COLUMN_NAME)},"
    ENDIF
NEXT
TEXT += "\n"

RESULTS '= TEXT


code:
;-------------------------------------------------
;;; トークン関連の処理
;-------------------------------------------------
;-------------------------------------------------
;;; 状態異常系トークンの付与判定
;-------------------------------------------------
@CC_CHECK_REGIST(ATTACKER_DID, DEFENDER_DID, TOKEN_NAME, SUCCESS_RATE)
#FUNCTION
#DIM  ATTACKER_DID
#DIM  DEFENDER_DID
#DIMS TOKEN_NAME
#DIM  SUCCESS_RATE
#DIM  DYNAMIC REGIST
#DIM  DYNAMIC TOKEN_DID

IF DT_COLUMN_EXIST("CC_ACTOR", @"REGIST_%TOKEN_NAME%")
    REGIST = DT_CELL_GET("CC_ACTOR", DEFENDER_DID, @"REGIST_%TOKEN_NAME%", 1)
ELSE
    DEBUGPRINTFORM  @CC_CHECK_REGIST 指定されたトークン名%TOKEN_NAME%に対応する抵抗値が未定義です
    REGIST = 0
ENDIF
;;防御側トークンによる補正(補正量はトークン定義から取得すべきであり、あまり良い実装ではない。暫定)
;耐性系トークン
IF CC_SP_TOKEN_NUM(DEFENDER_DID, @"REGIST_%TOKEN_NAME%") > 0
    REGIST += 60
ENDIF

RETURNF RAND:100 < SUCCESS_RATE - REGIST

;-------------------------------------------------
;;; トークンの取得
;-------------------------------------------------
@CC_GET_TOKEN(ACTOR_DID, TOKEN_NAME)
#FUNCTION
#DIM  ACTOR_DID
#DIMS TOKEN_NAME

RETURNF DT_CELL_GET("CC_ACTOR", ACTOR_DID, TOKEN_NAME, 1)

;-------------------------------------------------
;;; 指定値でのトークン付与
;-------------------------------------------------
@CC_SET_TOKEN(ACTOR_DID, TOKEN_NAME, VALUE)
#DIM  ACTOR_DID
#DIMS TOKEN_NAME
#DIM  VALUE

DT_CELL_SET "CC_ACTOR", ACTOR_DID, TOKEN_NAME, VALUE, 1

;-------------------------------------------------
;;; トークンの加減処理
;-------------------------------------------------
@CC_CHANGE_TOKEN(ACTOR_DID, TOKEN_NAME, VALUE)
#DIM  ACTOR_DID
#DIMS TOKEN_NAME
#DIM  VALUE

VARI TOKEN_COUNT
TOKEN_COUNT = DT_CELL_GET("CC_ACTOR", ACTOR_DID, TOKEN_NAME, 1)
TOKEN_COUNT = MAX(TOKEN_COUNT + VALUE, 0)
CALL CC_SET_TOKEN(ACTOR_DID, TOKEN_NAME, TOKEN_COUNT)


code:
#DIM CONST CC_MAX_MEMBER_NUM = 12
#DIM CONST WND_ID_LEFT   = 0
#DIM CONST WND_ID_RIGHT  = 1
#DIM CONST WND_ID_BOTTOM = 2
#DIMS CC_MES_LIST, 200
#DIM  CC_DAMAGE

#DIM  CC_NUMBER_OF_NORMAL_ATTACKS
#DIM  CC_NORMAL_ATTACK_BASE_DAMAGE_RATE
#DIM  CC_NORMAL_ATTACK_BASE_CRITICAL_RATE
#DIM  CC_NORMAL_ATTACK_BASE_CRITICAL_DAMAGE_RATE
#DIM  CC_FLAG_NORMAL_ATTACK_ALL

#DIM  CC_NORMAL_ATTACK_DAMAGE_MODIFIER
#DIM  CC_NORMAL_ATTACK_CRITICAL_RATE_MODIFIER
#DIM  CC_NORMAL_ATTACK_CRITICAL_DAMAGE_MODIFIER

#DIM  CC_通常攻撃最終ダメージ補正
#DIM  CC_攻撃回数
#DIM  CC_クリティカル率
#DIM  CC_クリティカルダメージ倍率
#DIM  CC_クリティカルフラグ
#DIM  CC_全体攻撃フラグ ;攻撃可能な全ターゲットを対象に攻撃処理を実施
#DIM  CC_ダメージ処理非実施フラグ ;スキル発動のみでダメージ処理を実施しない
#DIM  CC_全対象スキル処理フラグ ;全対象に対して個別にスキルを発動する
#DIMS CC_MULTI_TARGET_LIST
#DIMS CONST CC_COLLATERAL_DAMAGE_TARGET_MAP = "CC_COLLATERAL_DAMAGE_TARGET_MAP"
#DIM  CC_ATTACKED_COUNT
#DIM  CC_MULTI_TARGET_ATTACKED_COUNT
#DIM  CC_入力受付待ち ;スキルの対象選択時など特定の入力が必須の場合、このフラグを立てる
#DIMS CC_SE ;メッセージウィンドウ描画時に効果音を鳴らす

;リストの末尾に"-1"を付加するため最大メンバー数+1を要素数として定義
#DIMS CC_ATTACKER_LIST, CC_MAX_MEMBER_NUM / 2 + 1
#DIMS CC_DEFENDER_LIST, CC_MAX_MEMBER_NUM / 2 + 1
;一時使用武器用のリスト
#DIMS _DIC_CC_TEMP_WEAPON, MAX_CHARANUM
;スキル関数を指定して直接スキル処理を呼び出すための関数
#DIMS CC_LIST_SKILL_FUNC_CALLEE
#DIM  CC_スキル再発動
#DIM  CC_再発動元スキルスロット
;戦闘画面のボタンID管理
;アクティブスキル発動ボタン(1-2桁:スロット番号,3-6桁:CHARA_ID)
#DIM CONST ACTIVE_SKILL_BTN_ID = 1000000
;戦闘画面のフロー制御
#DIMS CC_FLOW
#DIM  CC_IS_ACTIVE_SKILL_EXECUTABLE
#DIM  CC_ROUND_COUNT
#DIM  CC_FORCE_END

#DIM  CC_AUTO_MODE					;0=マニュアル、1=通常攻撃オート、2=スキルオート
#DIM  SAVEDATA CC_AUTO_MODE_INPUT ;0=通常攻撃、1=スキル
#DIM  SAVEDATA CC_AUTO_INPUT_WAIT = 200		;オート入力待ち時間 200=通常, 133=1.5倍速, 100=2倍速

#DIM CC_CALC_CHARA_STATUS_IS_BAREHAND ;CC_CALC_CHARA_STATUS用の素手フラグ　1=素手

;アクションスタック
#DIM CONST CC_MAX_ACTION = 1000
;-------------------------------------------------
; 描画関連
;-------------------------------------------------
;キャラ選択ボタン用GID
#DIM  CC_BTN_RECT1_GID = 10000
#DIM  CC_BTN_RECT2_GID = 10001
#DIMS CC_MEM_SERECT_BTN_SRC, CC_MAX_MEMBER_NUM

#DIM  CC_TOKEN_ICONS_GID = 10010


code:
;-------------------------------------------------
;攻撃処理
;-------------------------------------------------
@CLOSE_COMBAT_ATTACK(ATTACKER_DID, DEFENDER_DID)
#DIM ACTION_DID
#DIM ATTACKER_DID
#DIM DEFENDER_DID
#DIM CHARA_ID
#DIM CONST ダメージ基準倍率 = 80
#DIM DYNAMIC ATTACK_COUNT
#DIM DYNAMIC USE_ON_ATTACK_ACTIVE_SKILL
;キャラ情報
#DIMS DYNAMIC ATK_CHARA_NAME
#DIMS DYNAMIC DEF_CHARA_NAME
#DIM  DYNAMIC ATK_CHARA_ID
#DIM  DYNAMIC DEF_CHARA_ID
#DIM DYNAMIC IS_PLAYABLE
#DIM DYNAMIC HP
#DIM DYNAMIC MAX_HP
#DIM DYNAMIC TOKEN_COUNT
#DIMS DYNAMIC ATK_LIST
#DIMS DYNAMIC DEF_LIST
#DIM DYNAMIC  ATK_SELECT_SLOT = -1
#DIM DYNAMIC  DEF_SELECT_SLOT = -1
#DIMS DYNAMIC SKILL_DEF_NAME
#DIMS DYNAMIC ATK_ENEMY_SELECT_SKILL
#DIMS DYNAMIC DEF_ENEMY_SELECT_SKILL
;武器情報
#DIM  DYNAMIC ATK_WEAPON_DID
#DIM  DYNAMIC DEF_WEAPON_DID
#DIMS DYNAMIC DIC_WPN_SKILL
#DIM  DYNAMIC WPN_SKILLNUM
#DIMS DYNAMIC WPN_SKILL_DEF_LIST, VARSIZE("SKILL_DEF_LIST")

#DIM DYNAMIC LIST_LENGTH
#DIMS DYNAMIC _XML_SKILL
#DIMS DYNAMIC ATK_SKILL_DEF_LIST, VARSIZE("SKILL_DEF_LIST")
#DIMS DYNAMIC DEF_SKILL_DEF_LIST, VARSIZE("SKILL_DEF_LIST")

#DIM CONST POISON_DAMAGE = 300
#DIM CONST BURN_DAMAGE = 150
#DIM CONST BEARTRAP_DAMAGE = 300

CC_DAMAGE = 0
ATK_CHARA_NAME = %DT_CELL_GETS("CC_ACTOR", ATTACKER_DID, "CHARA_NAME", 1)%
DEF_CHARA_NAME = %DT_CELL_GETS("CC_ACTOR", DEFENDER_DID, "CHARA_NAME", 1)%
ATK_CHARA_ID = DT_CELL_GET("CC_ACTOR", ATTACKER_DID, "CHARA_ID", 1)
DEF_CHARA_ID = DT_CELL_GET("CC_ACTOR", DEFENDER_DID, "CHARA_ID", 1)

;攻撃側の処理
IS_PLAYABLE = DT_CELL_GET("CC_ACTOR", ATTACKER_DID, "IS_PLAYABLE", 1)
;操作可能キャラの場合
IF IS_PLAYABLE
    CALL DIC_KEYS(_DIC_SKILL_LIST:ATK_CHARA_ID:1)
    ARRAYCOPY "RESULTS", "ATK_SKILL_DEF_LIST"
    ATK_SELECT_SLOT = DT_CELL_GET("CC_ACTOR", ATTACKER_DID, "SELECTED_SKILL_SLOT", 1)
    CALL GET_WEAPON_LIST_IDX_BY_CHARA_ID(ATK_CHARA_ID)
    SIF RESULT
        ATK_WEAPON_DID = RESULT:1
ELSE
    ATK_ENEMY_SELECT_SKILL = %DT_CELL_GETS("CC_ACTOR", ATTACKER_DID, "ENEMY_SELECTED_SKILL", 1)%
ENDIF

;防御側の処理
IS_PLAYABLE = DT_CELL_GET("CC_ACTOR", DEFENDER_DID, "IS_PLAYABLE", 1)
;操作可能キャラの場合
IF IS_PLAYABLE == 1
    CALL DIC_KEYS(_DIC_SKILL_LIST:DEF_CHARA_ID:1)
    ARRAYCOPY "RESULTS", "DEF_SKILL_DEF_LIST"
    DEF_SELECT_SLOT = DT_CELL_GET("CC_ACTOR", DEFENDER_DID, "SELECTED_SKILL_SLOT", 1)
    CALL GET_WEAPON_LIST_IDX_BY_CHARA_ID(DEF_CHARA_ID)
    SIF RESULT
        DEF_WEAPON_DID = RESULT:1
ELSE
    DEF_ENEMY_SELECT_SKILL = %DT_CELL_GETS("CC_ACTOR", DEFENDER_DID, "ENEMY_SELECTED_SKILL", 1)%
ENDIF

;ステートの変更
;-------------------------------------------------
DT_CELL_SET "CC_ACTOR", ATTACKER_DID, "STATE", "攻撃", 1

;攻撃処理の実行可否判定（スタンなどを処理）
;-------------------------------------------------
CALL CC_TRIGGER_SP_TOKEN_PASSIVE_SKILL("ABNORMALITY_CHECK", ATTACKER_DID)

IF GROUPMATCH(DT_CELL_GETS("CC_ACTOR", ATTACKER_DID, "STATE", 1), "戦闘不能", "行動不能")
    DT_CELL_SET "CC_ACTOR", ATTACKER_DID, "SUBSTATE", "", 1
    RETURN 0
ENDIF

;防御処理
VARI ARMOR
VARI BARRIER
IF DT_CELL_GETS("CC_ACTOR", ATTACKER_DID, "SUBSTATE", 1) == "防御"
    DT_CELL_SET "CC_ACTOR", ATTACKER_DID, "SUBSTATE", "", 1
    CALL CC_EXEC_DEFENCE(ATTACKER_DID, DEFENDER_DID)
    RETURN 0
ENDIF

IF ATK_SELECT_SLOT != -1
    ;操作可能キャラのON_ATTACKアクティブスキル
    CALL CC_EXEC_ACTIVE_SKILL("ON_ATTACK", ATTACKER_DID, DEFENDER_DID)
    IF RESULT
        DT_CELL_SET "CC_ACTOR", ATTACKER_DID, "SELECTED_SKILL_SLOT", -1, 1
        ATK_SELECT_SLOT = -1
        RETURN 1
    ENDIF
ELSEIF ATK_ENEMY_SELECT_SKILL != ""
    ;操作不可キャラのON_ATTACKアクティブスキル
    CALL CC_EXEC_ACTIVE_SKILL("ON_ATTACK", ATTACKER_DID, DEFENDER_DID, ATK_ENEMY_SELECT_SKILL)
    IF RESULT
        DT_CELL_SET "CC_ACTOR", ATTACKER_DID, "ENEMY_SELECTED_SKILL", "", 1
        RETURN 1
    ENDIF
ENDIF

;通常攻撃
CALL CC_EXEC_NORMAL_ATTACK(ATTACKER_DID, DEFENDER_DID)

RETURN 1
[SKIPSTART]
CC_ATTACKED_COUNT = 0
WHILE CC_攻撃回数 > CC_ATTACKED_COUNT
    USE_ON_ATTACK_ACTIVE_SKILL = 0
    IF CC_ATTACKED_COUNT
        CALL CC_PRINT(@"@S:1@<%ATK_CHARA_NAME%の追撃>@/S@")
    ENDIF
    ;スキル処理前の基礎ダメージ値計算
    ;-------------------------------------------------
    CALL CC_CALC_DAMAGE(ATTACKER_DID, DEFENDER_DID)
    IF ATK_SELECT_SLOT != -1
        ;攻撃側アクティブスキル処理
        ;-------------------------------------------------
        CALL CC_EXEC_ACTIVE_SKILL("ON_ATTACK", ATTACKER_DID, DEFENDER_DID)
        IF RESULT && !CC_全対象スキル処理フラグ
            DT_CELL_SET "CC_ACTOR", ATTACKER_DID, "SELECTED_SKILL_SLOT", -1, 1
            ATK_SELECT_SLOT = -1
            USE_ON_ATTACK_ACTIVE_SKILL = 1
        ENDIF
    ELSEIF CC_LIST_SKILL_FUNC_CALLEE != ""
        WHILE LIST_COUNT(CC_LIST_SKILL_FUNC_CALLEE) > 0
            CALL CC_EXEC_ACTIVE_SKILL("ON_ATTACK", ATTACKER_DID, DEFENDER_DID, LIST_GET(CC_LIST_SKILL_FUNC_CALLEE, 0))
            IF RESULT && !CC_全対象スキル処理フラグ
                USE_ON_ATTACK_ACTIVE_SKILL = 1
            ENDIF
            CC_LIST_SKILL_FUNC_CALLEE = %LIST_REMOVEAT(CC_LIST_SKILL_FUNC_CALLEE, 0)%
        WEND
        CC_スキル再発動 = 0
        CC_再発動元スキルスロット = -1
    ELSEIF ATK_ENEMY_SELECT_SKILL != ""
        CALL CC_EXEC_ACTIVE_SKILL("ON_ATTACK", ATTACKER_DID, DEFENDER_DID, ATK_ENEMY_SELECT_SKILL)
        IF RESULT && !CC_全対象スキル処理フラグ
            DT_CELL_SET "CC_ACTOR", ATTACKER_DID, "ENEMY_SELECTED_SKILL", "", 1
            USE_ON_ATTACK_ACTIVE_SKILL = 1
        ENDIF
    ENDIF
    ; 通常攻撃処理
    IF !CC_全体攻撃フラグ && !USE_ON_ATTACK_ACTIVE_SKILL
        ; -------------------------------------------------
        ;トークン[追撃]による攻撃回数加算、初回通常攻撃処理時に攻撃回数を1加算
        SIF CC_ATTACKED_COUNT == 0 && CC_SP_TOKEN_NUM(ATTACKER_DID, "ADD_ATTACK") > 0
            CC_攻撃回数 ++
        ;ダメージ処理前攻撃側パッシブスキル処理
        CALL CC_EXEC_PASSIVE_SKILL("ON_ATTACK", ATTACKER_DID, DEFENDER_DID)
        ; 武器パッシブスキル処理
        CALL CC_EXEC_WPN_PASSIVE_SKILL("ON_ATTACK", ATTACKER_DID, DEFENDER_DID)
        ;クリティカルフラグセット
        IF RAND:100 < CC_クリティカル率
            CC_クリティカルフラグ = 1
        ENDIF
        ;効果音セット
        IF CC_SE == ""
            IF CC_クリティカルフラグ
                CC_SE '= @"%S_R("Critical_0")%.mp3"
            ELSE
                CC_SE '= @"%S_R("Slash_0/Slash_1/Slash_2/Slash_3")%.mp3"
            ENDIF
        ENDIF
    ENDIF
    IF !CC_ダメージ処理非実施フラグ
        ;デコイ処理
        IF CC_DAMAGE >= 0
            CALL CC_STATUS_EFFECT_CHECK_DECOY(ATTACKER_DID, DEFENDER_DID)
            IF RESULT
                CALL CC_TRIGGER_SP_TOKEN_PASSIVE_SKILL("AFTER_EACH_ATTACKED", DEFENDER_DID, ATTACKER_DID)
                CALL CC_EXEC_PASSIVE_SKILL("COUNTER", DEFENDER_DID, ATTACKER_DID)
                CALL CC_TRIGGER_SP_TOKEN_PASSIVE_SKILL("COUNTER", DEFENDER_DID, ATTACKER_DID)
                RETURN 1
            ENDIF
        ENDIF
        IF !CC_全体攻撃フラグ && !USE_ON_ATTACK_ACTIVE_SKILL
            ;通常攻撃時ダメージ処理
            CALL CC_TAKE_DAMAGE(ATTACKER_DID, DEFENDER_DID, 1)
        ELSE
            ;スキル系ダメージ処理
            CALL CC_TAKE_DAMAGE(ATTACKER_DID, DEFENDER_DID, 0)
        ENDIF
        CALL CC_TRIGGER_SP_TOKEN_PASSIVE_SKILL("AFTER_EACH_ATTACKED", DEFENDER_DID, ATTACKER_DID)
        CALL CC_EXEC_PASSIVE_SKILL("COUNTER", DEFENDER_DID, ATTACKER_DID)
        CALL CC_TRIGGER_SP_TOKEN_PASSIVE_SKILL("COUNTER", DEFENDER_DID, ATTACKER_DID)
    ELSE
        ;CC_ダメージ処理非実施フラグ = 0
    ENDIF
    ;再発動効果を持たない攻撃時発動のアクティブスキルを使用したは攻撃回数に関わらず1度のみ攻撃行動を実行する
    SIF USE_ON_ATTACK_ACTIVE_SKILL && !CC_スキル再発動
        BREAK
    CC_ATTACKED_COUNT ++

    ;反撃等による攻撃側の死亡判定
    CALL CC_CHECK_KNOCKED_OUT(ATTACKER_DID)
    SIF RESULT
        BREAK
WEND

;戦闘不能判定
;-------------------------------------------------
;防御側HP取得
CALL CC_CHECK_KNOCKED_OUT(DEFENDER_DID)
IF RESULT == 1
    CALL CC_EXEC_WPN_PASSIVE_SKILL("DEFEAT_ENEMY", ATTACKER_DID, DEFENDER_DID)
ENDIF
;演出用のパラメータ設定
;-------------------------------------------------
DT_CELL_SET "CC_ACTOR", DEFENDER_DID, "EFFECT", "被ダメージ", 1

RETURN 1
[SKIPEND]

;-------------------------------------------------
; 攻撃開始前の処理
;-------------------------------------------------
; #region @CLOSE_COMBAT_BEFORE_ATTACK
@CLOSE_COMBAT_BEFORE_ATTACK(ATTACKER_DID, DEFENDER_DID)
#DIM ATTACKER_DID
#DIM DEFENDER_DID
#DIM CHARA_ID
;キャラ情報
#DIMS DYNAMIC ATK_CHARA_NAME
#DIMS DYNAMIC DEF_CHARA_NAME
#DIM  DYNAMIC ATK_CHARA_ID
#DIM  DYNAMIC DEF_CHARA_ID
#DIM  DYNAMIC ATK_IS_PLAYABLE
#DIM  DYNAMIC DEF_IS_PLAYABLE
#DIM  DYNAMIC HP
#DIM  DYNAMIC TOKEN_COUNT
#DIMS DYNAMIC ATK_LIST
#DIMS DYNAMIC DEF_LIST
#DIM  DYNAMIC ATK_SELECT_SLOT = -1
#DIM  DYNAMIC DEF_SELECT_SLOT = -1
#DIMS DYNAMIC SKILL_DEF_NAME
;武器情報
#DIM  DYNAMIC ATK_WEAPON_DID
#DIM  DYNAMIC DEF_WEAPON_DID
#DIMS DYNAMIC DIC_WPN_SKILL
#DIM  DYNAMIC WPN_SKILLNUM
#DIMS DYNAMIC WPN_SKILL_DEF_LIST, VARSIZE("SKILL_DEF_LIST")

#DIM DYNAMIC LIST_LENGTH
#DIMS DYNAMIC _XML_SKILL
#DIMS DYNAMIC ATK_SKILL_DEF_LIST, VARSIZE("SKILL_DEF_LIST")
#DIMS DYNAMIC DEF_SKILL_DEF_LIST, VARSIZE("SKILL_DEF_LIST")

;キャラ情報・スキル情報取得
;-------------------------------------------------
ATK_CHARA_ID = DT_CELL_GET("CC_ACTOR", ATTACKER_DID, "CHARA_ID", 1)
DEF_CHARA_ID = DT_CELL_GET("CC_ACTOR", DEFENDER_DID, "CHARA_ID", 1)
ATK_IS_PLAYABLE = DT_CELL_GET("CC_ACTOR", ATTACKER_DID, "IS_PLAYABLE", 1)
DEF_IS_PLAYABLE = DT_CELL_GET("CC_ACTOR", DEFENDER_DID, "IS_PLAYABLE", 1)

IF ATK_IS_PLAYABLE
    CALL DIC_KEYS(_DIC_SKILL_LIST:ATK_CHARA_ID:1)
    ARRAYCOPY "RESULTS", "ATK_SKILL_DEF_LIST"
    ATK_SELECT_SLOT = DT_CELL_GET("CC_ACTOR", ATTACKER_DID, "SELECTED_SKILL_SLOT", 1)
    CALL GET_WEAPON_LIST_IDX_BY_CHARA_ID(ATK_CHARA_ID)
    SIF RESULT
        ATK_WEAPON_DID = RESULT:1
ENDIF

IF DEF_IS_PLAYABLE
    CALL DIC_KEYS(_DIC_SKILL_LIST:DEF_CHARA_ID:1)
    ARRAYCOPY "RESULTS", "DEF_SKILL_DEF_LIST"
    DEF_SELECT_SLOT = DT_CELL_GET("CC_ACTOR", DEFENDER_DID, "SELECTED_SKILL_SLOT", 1)
    CALL GET_WEAPON_LIST_IDX_BY_CHARA_ID(DEF_CHARA_ID)
    SIF RESULT
        DEF_WEAPON_DID = RESULT:1
ENDIF

CALL CC_ACTIVESKILL_NORMAL_ATTACK_INIT(ATTACKER_DID)

;攻撃前アクティブスキル処理
;-------------------------------------------------
IF ATK_SELECT_SLOT != -1
    ;キャラアクティブスキル
    CALL CC_EXEC_ACTIVE_SKILL("BEFORE_ATTACK", ATTACKER_DID, DEFENDER_DID)
    IF RESULT
        DT_CELL_SET "CC_ACTOR", ATTACKER_DID, "SELECTED_SKILL_SLOT", -1, 1
    ENDIF
ELSEIF !ATK_IS_PLAYABLE
    ;エネミーアクティブスキル
    SKILL_DEF_NAME = %DT_CELL_GETS("CC_ACTOR", ATTACKER_DID, "ENEMY_SELECTED_SKILL", 1)%
    IF SKILL_DEF_NAME != ""
        CALL CC_EXEC_ACTIVE_SKILL("BEFORE_ATTACK", ATTACKER_DID, DEFENDER_DID, SKILL_DEF_NAME)
        IF RESULT
            DT_CELL_SET "CC_ACTOR", ATTACKER_DID, "ENEMY_SELECTED_SKILL", "", 1
        ENDIF
    ENDIF
ELSE
ENDIF

;パッシブスキル処理
;アクティブスキルの発動が予約されている場合パッシブスキルは発動しない
;-------------------------------------------------
IF ATK_IS_PLAYABLE
    ;キャラパッシブスキル
    CALL CC_EXEC_PASSIVE_SKILL("BEFORE_ATTACK", ATTACKER_DID, DEFENDER_DID)
    ; 武器パッシブスキル
    CALL CC_EXEC_WPN_PASSIVE_SKILL("BEFORE_ATTACK", ATTACKER_DID, DEFENDER_DID)
ELSE
    ;エネミーパッシブスキル
    IF SKILL_DEF_NAME == ""
        CALL CC_EXEC_PASSIVE_SKILL("BEFORE_ATTACK", ATTACKER_DID, DEFENDER_DID)
    ENDIF
ENDIF
;ENDIF

; FOR LOCAL, 0, FINDELEMENT(ATK_SKILL_DEF_LIST, "",,, 1)
;     XML_GET XMLID_SKILL_BATTLE, @"//defname[@parentname='%ATK_SKILL_DEF_LIST:LOCAL%']", _XML_SKILL, 3
;     SIF !RESULT
;         CONTINUE
;     XML_GET _XML_SKILL, @"//func[contains(text(), 'BEFORE_ATTACK')]", RESULTS, 1
;     IF RESULT
;         DEBUGPRINTFORML RESULTS = %RESULTS%
;         TRYCCALLFORM CC_%RESULTS%(ATTACKER_DID, DEFENDER_DID, _XML_SKILL)
;         CATCH
;             DEBUGPRINTFORML CAUTION:@CLOSE_COMBAT_ATTACK
;             DEBUGPRINTFORML スキル<%RESULTS%>が呼ばれましたが、対応するスキル処理関数が見つかりませんでした
;         ENDCATCH
;     ENDIF
; NEXT
; #endregion

;-------------------------------------------------
; 攻撃終了後の処理
;-------------------------------------------------
; #region @CLOSE_COMBAT_AFTER_ATTACK
@CLOSE_COMBAT_AFTER_ATTACK(ATTACKER_DID, DEFENDER_DID)
#DIM ATTACKER_DID
#DIM DEFENDER_DID
#DIM CHARA_ID
#DIM CONST ダメージ基準倍率 = 80
;キャラ登録番号
#DIMS DYNAMIC ATK_CHARA_NAME
#DIMS DYNAMIC DEF_CHARA_NAME
#DIM  DYNAMIC ATK_CHARA_ID
#DIM  DYNAMIC DEF_CHARA_ID
#DIM  DYNAMIC IS_PLAYABLE
#DIM DYNAMIC HP
#DIM DYNAMIC TOKEN_COUNT
#DIMS DYNAMIC ATK_LIST
#DIMS DYNAMIC DEF_LIST
#DIM DYNAMIC  ATK_SELECT_SLOT = -1
#DIM DYNAMIC  DEF_SELECT_SLOT = -1
#DIMS DYNAMIC SKILL_DEF_NAME

#DIM DYNAMIC LIST_LENGTH
#DIMS DYNAMIC _XML_SKILL
#DIMS DYNAMIC ATK_SKILL_DEF_LIST, VARSIZE("SKILL_DEF_LIST")
#DIMS DYNAMIC DEF_SKILL_DEF_LIST, VARSIZE("SKILL_DEF_LIST")

;キャラ情報・スキル情報取得
;-------------------------------------------------
ATK_CHARA_NAME = %DT_CELL_GETS("CC_ACTOR", ATTACKER_DID, "CHARA_NAME", 1)%
DEF_CHARA_NAME = %DT_CELL_GETS("CC_ACTOR", DEFENDER_DID, "CHARA_NAME", 1)%
ATK_CHARA_ID = DT_CELL_GET("CC_ACTOR", ATTACKER_DID, "CHARA_ID", 1)
DEF_CHARA_ID = DT_CELL_GET("CC_ACTOR", DEFENDER_DID, "CHARA_ID", 1)

IS_PLAYABLE = DT_CELL_GET("CC_ACTOR", ATTACKER_DID, "IS_PLAYABLE", 1)
IF IS_PLAYABLE
    CALL DIC_KEYS(_DIC_SKILL_LIST:ATK_CHARA_ID:1)
    ARRAYCOPY "RESULTS", "ATK_SKILL_DEF_LIST"
    ATK_SELECT_SLOT = DT_CELL_GET("CC_ACTOR", ATTACKER_DID, "SELECTED_SKILL_SLOT", 1)
ENDIF

IS_PLAYABLE = DT_CELL_GET("CC_ACTOR", DEFENDER_DID, "IS_PLAYABLE", 1)
IF IS_PLAYABLE
    CALL DIC_KEYS(_DIC_SKILL_LIST:DEF_CHARA_ID:1)
    ARRAYCOPY "RESULTS", "DEF_SKILL_DEF_LIST"
    DEF_SELECT_SLOT = DT_CELL_GET("CC_ACTOR", DEFENDER_DID, "SELECTED_SKILL_SLOT", 1)
ENDIF

;攻撃終了後アクティブスキル処理
;-------------------------------------------------
IS_PLAYABLE = DT_CELL_GET("CC_ACTOR", ATTACKER_DID, "IS_PLAYABLE", 1)
IF ATK_SELECT_SLOT != -1
    CALL CC_EXEC_ACTIVE_SKILL("AFTER_ATTACK", ATTACKER_DID, DEFENDER_DID)
    IF RESULT
        DT_CELL_SET "CC_ACTOR", ATTACKER_DID, "SELECTED_SKILL_SLOT", -1, 1
    ENDIF
ELSEIF !IS_PLAYABLE
    SKILL_DEF_NAME = %DT_CELL_GETS("CC_ACTOR", ATTACKER_DID, "ENEMY_SELECTED_SKILL", 1)%
    IF SKILL_DEF_NAME != ""
        CALL CC_EXEC_ACTIVE_SKILL("AFTER_ATTACK", ATTACKER_DID, DEFENDER_DID, SKILL_DEF_NAME)
        IF RESULT
            DT_CELL_SET "CC_ACTOR", ATTACKER_DID, "ENEMY_SELECTED_SKILL", "", 1
        ENDIF
    ENDIF
ENDIF

;攻撃終了後トークン効果誘発
;-------------------------------------------------
CALL CC_TRIGGER_SP_TOKEN_PASSIVE_SKILL("AFTER_ATTACK", ATTACKER_DID, DEFENDER_DID)

; #endregion

;-------------------------------------------------
; 特殊な状態の処理
;-------------------------------------------------
;被攻撃時のデコイ処理
;デコイが攻撃を受け止めた場合は1を返す
; @CC_STATUS_EFFECT_CHECK_DECOY(ATTACKER_DID, DEFENDER_DID)
; #DIM ATTACKER_DID
; #DIM DEFENDER_DID
; #DIM  DYNAMIC TOKEN_COUNT
; #DIM  DYNAMIC DEF_CHARA_ID
; #DIMS DYNAMIC ATK_CHARA_NAME
; #DIMS DYNAMIC DEF_CHARA_NAME
; #DIM  DYNAMIC SKILL_LV
; #DIM  DYNAMIC EFFECT_RATE
; #DIMS DYNAMIC SKILL_NAME
; #DIM DECOY_SHADOW = 0
; #DIM CHEST_EXPOSE = 0

; DECOY_SHADOW = CC_SP_TOKEN_NUM(DEFENDER_DID, "DECOY_SHADOW")

; ;分身を持つ場合は分身を優先
; IF DECOY_SHADOW
;     TOKEN_COUNT = DECOY_SHADOW
; ELSE
;     TOKEN_COUNT = CC_SP_TOKEN_NUM(DEFENDER_DID, "DECOY")
; ENDIF
; DEF_CHARA_ID = DT_CELL_GET("CC_ACTOR", DEFENDER_DID, "CHARA_ID", 1)
; ATK_CHARA_NAME = %DT_CELL_GETS("CC_ACTOR", ATTACKER_DID, "CHARA_NAME", 1)%
; DEF_CHARA_NAME = %DT_CELL_GETS("CC_ACTOR", DEFENDER_DID, "CHARA_NAME", 1)%
; IF TOKEN_COUNT > 0
;     ;幻影投影を持っている場合デコイ持続判定を行う
;     SKILL_LV = HAS_SKILL(DEF_CHARA_ID, "WPN_DECOY_AMPLIFIER", スキル_大分類_武器)
;     IF SKILL_LV > 0
;         CALL SKILL_GET_NAME(武器スキル_パッシブ, "WPN_DECOY_AMPLIFIER", 1)
;         SKILL_NAME = %RESULTS%
;         CALL SKILL_GET_EFFECT_RATE(武器スキル_パッシブ, "WPN_DECOY_AMPLIFIER", SKILL_LV, 1)
;         EFFECT_RATE = RESULT
;         IF RAND:100 < EFFECT_RATE
;             IF DECOY_SHADOW
;                 CALL CC_PRINT(@"%ATK_CHARA_NAME%の攻撃を%DEF_CHARA_NAME%の分身が代わりに引き受けた！")
;                 CALL CC_PRINT(@"@C:{カラー_黄緑}@<%SKILL_NAME%> %DEF_CHARA_NAME%の分身はなお形を保っている！@/C@")
;             ELSE
;                 CALL CC_PRINT(@"%ATK_CHARA_NAME%の攻撃を%DEF_CHARA_NAME%のデコイが代わりに引き受けた！")
;                 CALL CC_PRINT(@"@C:{カラー_黄緑}@<%SKILL_NAME%> %DEF_CHARA_NAME%のデコイはなお形を保っている！@/C@")
;             ENDIF
;             ;攻撃自体は成功しているので1を返す
;             RETURN 1
;         ENDIF
;     ENDIF
;     IF DECOY_SHADOW
;         CALL CC_SUB_SP_TOKEN(DEFENDER_DID, "DECOY_SHADOW", 1)
;         CALL CC_PRINT(@"%ATK_CHARA_NAME%の攻撃を%DEF_CHARA_NAME%の分身が代わりに引き受けた！")
;         CALL CC_PRINT(@"分身の一体が霧散した……！")
;     ELSE
;         CALL CC_SET_SP_TOKEN(DEFENDER_DID, "DECOY", 0)
;         CALL CC_PRINT(@"%ATK_CHARA_NAME%の攻撃を%DEF_CHARA_NAME%のデコイが代わりに引き受けた！")
;         CALL CC_PRINT(@"デコイは霧散した……！")
;     ENDIF
;     ;攻撃自体は成功しているので1を返す
;     RETURN 1
; ENDIF
; CHEST_EXPOSE = CC_SP_TOKEN_NUM(DEFENDER_DID, "CHEST_EXPOSE")
; IF CHEST_EXPOSE > 0
; ENDIF
; RETURN 0