code:
<?xml version="1.0" encoding="utf-8"?>
<data>
  <command skillDefName="K9_UNIQUE_SKILL_MAGIC_BREAK_SWORD" actionName="ANY" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>[$CC_ANAME]の持つ武器が、魔法を断つ澄んだ青い光を纏う！</contents>
  </command>
  <command skillDefName="K9_UNIQUE_SKILL_BLUE_STAR" actionName="ANY" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0" eval="{!CC_AFLAG(ACTION_DID, "SUB_GUARD_BY_BLUE_STAR")}">
    <contents>[$CC_ANAME]の青く輝く魔力剣が敵を切り裂く！</contents>
  </command>
  <command skillDefName="K9_UNIQUE_SKILL_BLUE_STAR" actionName="ANY" name="ガード破壊" kojoPlace="EXEC" priority="11" isExclusive="TRUE" sequence="0" eval="{CC_AFLAG(ACTION_DID, "SUB_GUARD_BY_BLUE_STAR")}">
    <contents>[$CC_ANAME]の青く輝く魔力剣が敵を切り裂く！　青き光の一撃が[$CC_TNAME]の防御を崩した！</contents>
  </command>
  <command skillDefName="K9_UNIQUE_SKILL_LIGHT_PURFICATION" actionName="CC_ACTION_SUB_SP_TOKEN" name="実行" kojoPlace="RESULT" priority="10" isExclusive="TRUE" sequence="0">
    <contents>[$CC_ANAME]から放たれた聖なるマナの光が、仲間達の体の異常を取り除いてゆく！</contents>
  </command>
  <command skillDefName="K9_UNIQUE_SKILL_BLUE_SLASH" actionName="ANY" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>[$CC_ANAME]の持つ武器から放たれた、澄み渡る青き閃光が敵を呑み込む！</contents>
  </command>
  <command skillDefName="K9_UNIQUE_SKILL_MULTI" actionName="CC_ACTION_ADD_NORMAL_ATTACK_BASE_PARAM" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>@C:{カラー_注意}@≪%CC_GETS_ACT_INFO(ACTION_DID, "SKILL_NAME")%≫@/C@が発動！[$CC_ANAME]は素早く追撃を放つ！</contents>
  </command>
  <command skillDefName="OPENIN_SHIELD_SWORD" actionName="ANY" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>[$CC_ANAME]は詠唱しながら前線に走り、手に持つ武器に魔法を断つ澄んだ青い光を纏わせた！</contents>
  </command>
</data>


code:
<?xml version="1.0" encoding="utf-8"?>
<data>
  <command skillDefName="Q61_OPENING_MODE_SHIFT" actionName="ANY" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>@C{カラー_赤}@システム、戦闘モードに移行します@/C@</contents>
  </command>
  <command skillDefName="TOKEN_SKILL_Q61_MODE_SHIFT" actionName="ANY" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>@C:{カラー_赤}@システム、防御モードに移行します@/C@
    @C:{カラー_注意}@*行動キャンセル*@/C@</contents>
  </command>
  <command skillDefName="EMEMY_ACT_Q61_ATTACK_SHIFT" actionName="ANY" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>@C{カラー_注意}@システム、戦闘モードに移行します@/C@</contents>
  </command>
  <command skillDefName="Q61_GUARDIAN_REBOOT" actionName="ANY" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="1">
    <contents>

    ……？
    @C:{カラー_注意}@≪%CC_GETS_ACT_INFO(ACTION_DID, "SKILL_NAME")%≫@/C@が発動！@C:{カラー_赤}@[$CC_ANAME]は活動を再開した！@/C@
    @C:{カラー_赤}@……任務ヲ……遂行……@/C@</contents>
  </command>
  <command skillDefName="TOKEN_SKILL_Q61_BURN_OUT_SELF_DAMAGE" actionName="ANY" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>@C:{カラー_赤}@[$CC_ANAME]に{[$DAMAGE]}の自壊ダメージ！@/C@</contents>
  </command>
  <command skillDefName="TOKEN_SKILL_Q61_BURN_OUT_REACT" actionName="ANY" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>[$CC_ANAME]は≪再行動≫を得た！</contents>
  </command>
  <command skillDefName="EMEMY_ACT_Q61_POWER_UP" actionName="ANY" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>[$CC_ANAME]の攻撃力が{%CC_GET_ACT_INFO(ACTION_DID, "VALUE")%}ポイント増加した！</contents>
  </command>
  <command skillDefName="EMEMY_ACT_Q61_POWER_UP" actionName="ANY" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE">
    <contents>[$CC_TNAME]に脆弱を付与！</contents>
  </command>
  <command skillDefName="EMEMY_ACT_Q61_SHARP_THORN" actionName="ANY" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>[$CC_ANAME]は鋭利な棘に包まれた！</contents>
  </command>
  <command skillDefName="Q61_SLIME_PREPARE_SPLIT" actionName="ANY" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>[$CC_ANAME]の様子がおかしい……
    @C:{カラー_注意}@*行動キャンセル*@/C@</contents>
  </command>
  <command skillDefName="Q61_KING_SLIME_SPLIT" actionName="ANY" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>[$CC_ANAME]は分裂した！</contents>
  </command>
  <command skillDefName="Q61_ACID_SLIME_SPLIT" actionName="ANY" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>[$CC_ANAME]は分裂した！</contents>
  </command>
  <command skillDefName="Q61_PINK_SLIME_SPLIT" actionName="ANY" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>[$CC_ANAME]は分裂した！</contents>
  </command>
  <command skillDefName="Q61_NEBURI_SLIME_SPLIT" actionName="ANY" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>[$CC_ANAME]は分裂した！</contents>
  </command>
  <command skillDefName="Q61_PINK_BODY" actionName="ANY" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>@C:{カラー_ピンク}@[$CC_ANAME]の体液を浴びた[$CC_TNAME]は発情した！@/C@</contents>
  </command>
  <command skillDefName="Q61_BUST_INFLATION" actionName="ANY" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>@C:{カラー_ピンク}@[$CC_ANAME]は[$CC_TNAME]の胸を執拗にこねくりまわした！@/C@</contents>
  </command>

  <command skillDefName="ENEMY_OPENING_ADD_MAGIC_REGIST" actionName="ANY" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>@C:{カラー_注意}@[$CC_ANAME]は魔術に耐性がある！@/C@</contents>
  </command>
</data>

repo_name: pervysquirrelz/erafl

license: unknown


code:
<?xml version="1.0" encoding="utf-8"?>
<data>
  <command skillDefName="TOKEN_SKILL_POISON" actionName="ANY" name="ダメージ発生" kojoPlace="RESULT" priority="10" isExclusive="TRUE">
    <contents>毒に蝕まれている[$CC_ANAME]は@C:{カラー_パ紫}@{CC_AFLAG(ACTION_DID, "HP_LOST")}@/C@のHPを失った……！</contents>
  </command>
  <command skillDefName="TOKEN_SKILL_POISON" actionName="ANY" name="戦闘不能" kojoPlace="DEFEAT" priority="10" isExclusive="TRUE">
    <contents>@C:{カラー_注意}@――[$CC_ANAME]は力尽き倒れた！@/C@</contents>
  </command>
  <command skillDefName="TOKEN_SKILL_BURN" actionName="ANY" name="ダメージ発生" kojoPlace="RESULT" priority="10" isExclusive="TRUE">
    <contents>火傷を負った[$CC_ANAME]は@C:{カラー_パ赤}@{CC_AFLAG(ACTION_DID, "HP_LOST")}@/C@のHPを失った……！</contents>
  </command>
  <command skillDefName="TOKEN_SKILL_BURN" actionName="ANY" name="戦闘不能" kojoPlace="DEFEAT" priority="10" isExclusive="TRUE">
    <contents>@C:{カラー_注意}@――[$CC_ANAME]は力尽き倒れた！@/C@</contents>
  </command>
  <command skillDefName="TOKEN_SKILL_STUN" actionName="ANY" name="行動不能" kojoPlace="RESULT" priority="10" isExclusive="TRUE">
    <contents>[$CC_ANAME]は体勢を崩しており攻撃できない！</contents>
  </command>
  <command skillDefName="TOKEN_SKILL_ORGASM" actionName="ANY" name="行動不能" kojoPlace="RESULT" priority="10" isExclusive="TRUE">
    <contents>@C:{カラー_ピンク}@[$CC_ANAME]は激しい絶頂の快楽に苛まれており攻撃できない！@/C@</contents>
  </command>
  <command skillDefName="TOKEN_SKILL_ESTRUS" actionName="ANY" name="行動不能" kojoPlace="EXEC" priority="10" isExclusive="TRUE">
    <contents>@C:{カラー_ピンク}@[$CC_ANAME]は発情しきっており理性を失っている！@/C@</contents>
  </command>
  <command skillDefName="TOKEN_SKILL_SLEEP" actionName="ANY" name="行動不能" kojoPlace="RESULT" priority="10" isExclusive="TRUE" eval="{CC_SP_TOKEN_NUM(ACTOR_DID, "SLEEP") != 0}">
    <contents>[$CC_ANAME]は眠っている！</contents>
  </command>
  <command skillDefName="TOKEN_SKILL_SLEEP" actionName="ANY" name="行動不能" kojoPlace="RESULT" priority="10" isExclusive="TRUE" eval="{CC_SP_TOKEN_NUM(ACTOR_DID, "SLEEP") == 0}">
    <contents>[$CC_ANAME]は目を覚ました！</contents>
  </command>
  <command skillDefName="TOKEN_SKILL_BINDINGTRAP" actionName="ANY" name="行動不能" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>足元に仕掛けられたくくり罠が発動！</contents>
  </command>
  <command skillDefName="TOKEN_SKILL_BINDINGTRAP" actionName="ANY" name="行動不能" kojoPlace="RESULT" priority="10" isExclusive="TRUE" sequence="1" eval="{CC_AFLAG(ACTION_DID, "INFLICT_REGISTED")}">
    <contents>しかし[$CC_ANAME]は、罠にかかりつつも即座に体勢を立て直した！</contents>
  </command>
  <command skillDefName="TOKEN_SKILL_BEARTRAP" actionName="ANY" name="行動不能" kojoPlace="RESULT" priority="10" isExclusive="TRUE" sequence="0">
    <contents>足元に仕掛けられたベアトラップが発動！[$CC_ANAME]は@C:{カラー_オレンジ}@{CC_AFLAG(ACTION_DID, "HP_LOST")}@/C@のダメージを受けた……！</contents>
  </command>
  <command skillDefName="TOKEN_SKILL_BEARTRAP" actionName="ANY" name="行動不能" kojoPlace="RESULT" priority="10" isExclusive="TRUE" sequence="2" eval="{CC_AFLAG(ACTION_DID, "INFLICT_REGISTED")}">
    <contents>しかし[$CC_ANAME]は、罠にかかりつつも即座に体勢を立て直した！</contents>
  </command>
  <command skillDefName="TOKEN_SKILL_SLEEP_ATTACKED" actionName="ANY" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE">
    <contents>@C:{カラー_注意}@[$CC_ANAME]は目を覚ました！@/C@</contents>
  </command>
  <command skillDefName="ANY" actionName="CC_ACTION_VITAL_POINT" name="ダメージ発生" kojoPlace="RESULT" priority="10" isExclusive="TRUE" eval="{[$DAMAGE] != 0}">
    <contents>[$CC_TNAME]の全身から血が噴き出る！@C:{カラー_オレンジ}@{[$DAMAGE]}@/C@のHPを失った！</contents>
  </command>
  <command skillDefName="ANY" actionName="CC_ACTION_VITAL_POINT" name="ダメージなし" kojoPlace="RESULT" priority="10" isExclusive="TRUE" eval="{[$DAMAGE] == 0}">
    <contents>しかし、何も起こらなかった！</contents>
  </command>
  <command skillDefName="THORN" actionName="CC_ACTION_LOSS_HP" name="ダメージ発生" kojoPlace="RESULT" priority="10" isExclusive="TRUE">
    <contents>[$CC_ANAME]の鋭い棘により、[$CC_TNAME]は@C:{カラー_オレンジ}@{[$DAMAGE]}@/C@のHPを失った！</contents>
  </command>
  <command skillDefName="COUNTER_ATTACK" actionName="CC_ACTION_ATTACK" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE">
    <contents>[$CC_ANAME]は反撃した！！</contents>
  </command>
  <command skillDefName="ARROW_RAIN" actionName="CC_ACTION_ATTACK" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>矢の雨が敵陣を襲う！</contents>
  </command>
  <command skillDefName="VITAL_POINT_CORPSE_EXPLOSION" actionName="CC_ACTION_ATTACK" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>@C:{カラー_赤}@眩い光とともに[$CC_ANAME]は爆散した！@/C@</contents>
  </command>
  <command skillDefName="DRAGON_KICK" actionName="CC_ACTION_ATTACK" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>@C:{カラー_黄緑}@≪%CC_GETS_ACT_INFO(ACTION_DID, "SKILL_NAME")%≫@/C@が発動！急降下してくる[$CC_ANAME]の蹴撃が、[$CC_TNAME]めがけて突き刺さる！</contents>
  </command>
  <command skillDefName="DRAGON_DIVE" actionName="CC_ACTION_ATTACK" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>@C:{カラー_黄緑}@≪%CC_GETS_ACT_INFO(ACTION_DID, "SKILL_NAME")%≫@/C@が発動！急降下してくる[$CC_ANAME]が、[$CC_TNAME]に襲い掛かる！</contents>
  </command>
  <command skillDefName="LANCE_CHARGE" actionName="CC_ACTION_ATTACK" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>@C:{カラー_黄緑}@≪%CC_GETS_ACT_INFO(ACTION_DID, "SKILL_NAME")%≫@/C@が発動！[$CC_ANAME]が疾駆する馬上で槍を構え、[$CC_TNAME]に突撃する！</contents>
  </command>
  <command skillDefName="LANCE_CHARGE" actionName="CC_ACTION_ATTACK" name="実行" kojoPlace="EXEC" priority="11" isExclusive="TRUE" sequence="0" eval="{CC_AFLAG(ACTION_DID, "LOST_PROVOKE_BY_CHARGE")}">
    <contents>@C:{カラー_黄緑}@≪%CC_GETS_ACT_INFO(ACTION_DID, "SKILL_NAME")%≫@/C@が発動！[$CC_ANAME]が疾駆する馬上で槍を構え、[$CC_TNAME]に突撃する！
        @C:{カラー_オレンジ}@[$CC_TNAME]は[挑発]を失った！@/C@</contents>
  </command>
  <command skillDefName="CURSE_HEMOPTYSIS" actionName="CC_ACTION_ATTACK" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>@C:{カラー_黄緑}@≪%CC_GETS_ACT_INFO(ACTION_DID, "SKILL_NAME")%≫@/C@が発動！項垂れた[$CC_ANAME]が吐き出す、呪詛を孕んだ血煙流が地を薙ぎ払う！</contents>
  </command>
</data>


code:
<?xml version="1.0" encoding="utf-8"?>
<data>
  <command skillDefName="WPN_HARDSHOT" actionName="CC_ACTION_ATTACK" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE">
    <contents>[$CC_ANAME]は暴発寸前まで火薬を込めて敵を狙い撃った！</contents>
  </command>
  <command skillDefName="WPN_FROST_SMITE" actionName="CC_ACTION_ATTACK" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE">
    <contents>凍てつく刃の一閃が仇なす者を引き裂く！</contents>
  </command>
  <command skillDefName="WPN_ELECTRIC_ARROW" actionName="CC_ACTION_ATTACK" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE">
    <contents>稲妻を帯びた矢が標的を貫く！</contents>
  </command>
  <command skillDefName="WPN_MANA_SMITE" actionName="CC_ACTION_ATTACK" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>黄金の刀身から放たれた魔力の一閃が仇なす全てを斬り裂く！</contents>
  </command>
  <command skillDefName="WPN_ACT_HIDING" actionName="ANY" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE">
    <contents>[$CC_ANAME]の存在感が薄れていく！</contents>
  </command>
  <command skillDefName="WPN_ADD_CAST_SELF" actionName="ANY" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE">
    <contents>[$CC_ANAME]は詠唱陣を展開した！</contents>
  </command>
  <command skillDefName="WPN_ADD_MAG_GUARD" actionName="ANY" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE">
    <contents>[$CC_ANAME]の身体を理力の盾が覆った！</contents>
  </command>
  <command skillDefName="WPN_FLAME_THROW" actionName="CC_ACTION_ATTACK" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>火焔の噴流が[$CC_TNAME]を襲う！</contents>
  </command>
  <command skillDefName="WPN_TRAMPLE" actionName="ANY" name="実行" kojoPlace="EXEC" priority="10" isExclusive="TRUE" sequence="0">
    <contents>@C:{カラー_黄緑}@≪%CC_GETS_ACT_INFO(ACTION_DID, "SKILL_NAME")%≫ @/C@%CC_AFLAGS(ACTION_DID, "DEF_CHARA_NAME")%を打ち倒した[$CC_ANAME]は身を翻し、さらなる攻撃の態勢に移った！</contents>
  </command>
  <command skillDefName="WPN_ADD_POISON" actionName="CC_ACTION_INFLICT_ABNORMALITY" name="毒付与成功" kojoPlace="RESULT" priority="10" isExclusive="TRUE" token="POISON" eval="{CC_AFLAG(ACTION_DID, "INFLICT_SUCCEEDED")}">
    <contents>@C:{カラー_注意}@≪%CC_GETS_ACT_INFO(ACTION_DID, "SKILL_NAME")%≫@/C@が発動！[$CC_TNAME]の身体は毒に侵された！</contents>
  </command>
  <command skillDefName="WPN_ADD_POISON" actionName="CC_ACTION_INFLICT_ABNORMALITY" name="毒付与失敗(効果量不足)非表示" kojoPlace="RESULT" priority="10" isExclusive="TRUE" token="POISON" eval="{CC_AFLAG(ACTION_DID, "ALREADY_INFLICTED")}">
  </command>
  <command skillDefName="WPN_ADD_POISON" actionName="CC_ACTION_INFLICT_ABNORMALITY" name="毒付与失敗(抵抗)非表示" kojoPlace="RESULT" priority="10" isExclusive="TRUE" token="POISON" eval="{CC_AFLAG(ACTION_DID, "INFLICT_REGISTED")}">
  </command>
  <command skillDefName="WPN_BEARTRAP" actionName="ANY" name="実行" kojoPlace="RESULT" priority="10" isExclusive="TRUE">
    <contents>[$CC_ANAME]は[$CC_TNAME]の近くに罠を仕掛けた！</contents>
  </command>
  <command skillDefName="WPN_BREAK_CAST" actionName="CC_ACTION_SUB_SP_TOKEN" name="実行" kojoPlace="RESULT" priority="10" isExclusive="TRUE">
    <contents>マナを帯びた一撃が[$CC_TNAME]の詠唱陣を破壊した！</contents>
  </command>
</data>


code:
;-------------------------------------------------
;;; 単体攻撃処理を実施
;;; #### 入力パラメータ
;;; - CC_ACTIONテーブル
;;;   - **<必須>** ACTOR_DID: 攻撃するアクターのID
;;;   - **<必須>** TARGET_DID: 攻撃を受けるアクターのID
;;;   - **<任意>** DAMAGE_MODIFIER: ダメージ補正値(%)。CC_CALC_DAMAGE後に乗算。非指定 or 0の場合は100%
;;;   - **<任意>** OPTION: CC_CALC_DAMAGEの引数 DIC_OPTION
;;;   - **<任意>** DAMAGE_FORMULA: @CC_CALC_DAMAGEの代わりに使用する専用ダメージ計算式の関数名。
;;;     - `TRYCCALLFORM %DAMAGE_FORMULA%(ACTOR_DID, TARGET_DID, ACTION_DID)`形式で呼び出し
;;;   - **<通常攻撃のみ>** CRITICAL_RATE: クリティカル率(%)
;;;   - **<通常攻撃のみ>** CRITICAL_DAMAGE_RATE: クリティカルダメージ補正率(%)
;;; - CC_AFLAG / 連想配列 CC_ACT_FLAG_{ACTION_DID}
;;;   - **<任意>** IS_NORMAL_ATTACK: 1 = 通常攻撃扱いでクリティカル判定や関連パッシブ呼び出しを実施
;;;   - **<任意>** CONTINUE_ATTACK_EVENIF_ATTACKER_DIED: 1 = 攻撃アクターが戦闘不能でも攻撃処理を実施
;;;   - **<任意>** COUNTER_PROHIBITED: 1 = 攻撃後にTARGETの`EXEC_AT = "COUNTER"`のパッシブスキルを誘発しない
;;; #### 結果
;;; - CC_AFLAG
;;;   - ATTACK_AVOIDED: 1 = 攻撃を回避された
;;;   - ATTACK_SUCCEEDED: 1 = 攻撃が命中した(備考: バリアによる軽減/ダメージ0も命中扱い)
;;;   - CRITICAL_HIT: 1 = クリティカルヒットした(通常攻撃のみ)
;;;   - DAMAGE: 最終ダメージを代入
;;;   - TARGET_DEFEATED: 1 = 今回の攻撃でTARGETが戦闘不能になった
;;;   - DECREASED_BY_BARRIER: 1 = バリアで軽減された
;;;   - NULLIFIED_BY_BARRIER: 1 = バリアで無効化(ダメージ0)された
;;;   - BARRIER_BEFORE/BARRIER_AFTER: ダメージ処理前後のバリア値
;;; ***
;;; #### パッシブスキルトリガーポイント
;;; - **<ACTOR主体、通常攻撃のみ>** NORMAL_ATTACK_HIT: EXEC口上の呼び出し後、ダメージ計算前に実施
;;; - **<ACTOR主体、通常攻撃のみ>** AFTER_NORMAL_ATTACK: ダメージ処理後かつRESULT口上呼び出し後に実施
;;; - **<ACTOR主体>** DEFEAT_ENEMY: 今回の攻撃でTARGETを戦闘不能にした場合に実施
;;; - **<TARGET主体>** DEFEATED: 今回の攻撃でTARGETが戦闘不能になった場合に実施
;;; - **<TARGET主体>** AFTER_EACH_ATTACKED: 戦闘不能判定後、TARGETが生存している場合に実施
;;; - **<TARGET主体>** COUNTER: 戦闘不能判定後、COUNTER_PROHIBITEDフラグが0かつTARGETが生存している場合に実施
;-------------------------------------------------
@CC_ACTION_ATTACK(ACTION_DID)
#DIM  ACTION_DID
#DIM  ACTOR_DID
#DIM  TARGET_DID
#DIM  IS_NORMAL_ATTACK
#DIM  DAMAGE_MODIFIER
#DIM  CRITICAL_MODIFIER
;DEBUGPRINTFORML CC_ACTION_ATTACK: %CC_GETS_ACT_INFO(ACTION_DID, "SKILL_DEF_NAME")%
ACTOR_DID = DT_CELL_GET("CC_ACTION", ACTION_DID, "ACTOR_DID", 1)
TARGET_DID = DT_CELL_GET("CC_ACTION", ACTION_DID, "TARGET_DID", 1)
IS_NORMAL_ATTACK = CC_AFLAG(ACTION_DID, "IS_NORMAL_ATTACK")

IF DT_CELL_GETS("CC_ACTOR", ACTOR_DID, "STATE", 1) == "戦闘不能" && !CC_AFLAG(ACTION_DID, "CONTINUE_ATTACK_EVENIF_ATTACKER_DIED")
	DEBUGPRINTFORML CONTINUE_ATTACK_EVENIF_ATTACKER_DIED = {CC_AFLAG(ACTION_DID, "CONTINUE_ATTACK_EVENIF_ATTACKER_DIED")}
	RETURN 1
ENDIF
;SIF DT_CELL_GETS("CC_ACTOR", TARGET_DID, "STATE", 1) == "戦闘不能"
;	RETURN 1

CALL KOJO_XML_COMBAT(ACTION_DID, "EXEC")

;回避判定
CALL CC_AVOID_CHECK(ACTOR_DID, TARGET_DID, ACTION_DID)
IF RESULT
	CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "ATTACK_AVOIDED", "1")
	GOTO ACTION_RESULT
ENDIF

SIF IS_NORMAL_ATTACK
	CALL CC_EXEC_PASSIVE_SKILL("NORMAL_ATTACK_HIT", ACTOR_DID, TARGET_DID)

DAMAGE_MODIFIER = CC_GET_ACT_INFO(ACTION_DID, "DAMAGE_MODIFIER") == 0 ? 100 # CC_GET_ACT_INFO(ACTION_DID, "DAMAGE_MODIFIER")

IF DT_CELL_GETS("CC_ACTION", ACTION_DID, "DAMAGE_FORMULA", 1) == ""
	CALL CC_CALC_DAMAGE(ACTOR_DID, TARGET_DID, CC_GETS_ACT_INFO(ACTION_DID, "OPTION"))
	CC_DAMAGE = FTIMES(CC_DAMAGE, DAMAGE_MODIFIER)
ELSE
	;専用のダメージ計算式が指定されている場合
	TRYCCALLFORM %DT_CELL_GETS("CC_ACTION", ACTION_DID, "DAMAGE_FORMULA", 1)%(ACTOR_DID, TARGET_DID, ACTION_DID)
	CATCH
		DEBUGPRINTFORML ダメージ計算式<%DT_CELL_GETS("CC_ACTION", ACTION_DID, "DAMAGE_FORMULA", 1)%>が呼ばれましたが、対応する関数が見つかりませんでした
	ENDCATCH
ENDIF

IF IS_NORMAL_ATTACK
	IF RAND:100 < CC_GET_ACT_INFO(ACTION_DID, "CRITICAL_RATE") + CC_MODIFIER_MAP_GET("CRITICAL_RATE_ADD")
		CC_DAMAGE = FTIMES(CC_DAMAGE, CC_GET_ACT_INFO(ACTION_DID, "CRITICAL_DAMAGE_RATE") + CC_MODIFIER_MAP_GET("CRITICAL_DAMAGE_MULTI"))
		CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "CRITICAL_HIT", "1")
	ENDIF
	;効果音セット
	IF CC_SE == ""
		IF CC_AFLAG(ACTION_DID, "CRITICAL_HIT")
			CC_SE '= @"%S_R("Critical_0")%.mp3"
		ELSE
			CC_SE '= @"%S_R("Slash_0/Slash_1/Slash_2/Slash_3")%.mp3"
		ENDIF
	ENDIF
ENDIF

CALL CC_TAKE_DAMAGE_NEW(ACTOR_DID, TARGET_DID, ACTION_DID)
CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "ATTACK_SUCCEEDED", "1")

$ ACTION_RESULT
DT_CELL_SET "CC_ACTOR", TARGET_DID, "EFFECT", "被ダメージ", 1
CALL KOJO_XML_COMBAT(ACTION_DID, "RESULT")

IF IS_NORMAL_ATTACK
	CALL CC_EXEC_PASSIVE_SKILL("AFTER_NORMAL_ATTACK", ACTOR_DID, TARGET_DID)
	CALL CC_EXEC_WPN_PASSIVE_SKILL("AFTER_NORMAL_ATTACK", ACTOR_DID, TARGET_DID)
ENDIF

CALL CC_CHECK_KNOCKED_OUT_NEW(ACTION_DID)
SIF RESULT
	RETURN

CALL CC_TRIGGER_SP_TOKEN_PASSIVE_SKILL("AFTER_EACH_ATTACKED", TARGET_DID, ACTOR_DID, ACTION_DID)
CALL CC_EXEC_PASSIVE_SKILL("AFTER_EACH_ATTACKED", TARGET_DID, ACTOR_DID)
IF !CC_AFLAG(ACTION_DID, "COUNTER_PROHIBITED")
	CALL CC_EXEC_PASSIVE_SKILL("COUNTER", TARGET_DID, ACTOR_DID)
	CALL CC_TRIGGER_SP_TOKEN_PASSIVE_SKILL("COUNTER", TARGET_DID, ACTOR_DID, ACTION_DID)
ENDIF

;-------------------------------------------------
;;; 多段攻撃処理。
;;; 複数回攻撃をワンアクションで簡便に処理する。
;;; 内部ではデコイ判定やバリアを一発毎に判定しているが、意図からして細かな記録/メッセージ表示は割愛。
;;; フレーバー上はターゲットからの介入の余地がない瞬間的な連続攻撃を想定しているため、カウンターは一発のみ誘発する。
;-------------------------------------------------
;;; #### 入力パラメータ
;;; - CC_ACTIONテーブル
;;;   - **<必須>** ACTOR_DID: 攻撃するアクターのID
;;;   - **<必須>** TARGET_DID: 攻撃を受けるアクターのID
;;;   - **<必須>** NUMBER_OF_ATTACKS: 攻撃回数
;;;   - **<任意>** DAMAGE_MODIFIER: ダメージ補正値(%)。CC_CALC_DAMAGE後に乗算。非指定 or 0の場合は100%
;;;   - **<任意>** OPTION: CC_CALC_DAMAGEの引数 DIC_OPTION
;;;   - **<任意>** DAMAGE_FORMULA: @CC_CALC_DAMAGEの代わりに使用する専用ダメージ計算式の関数名。
;;;     - `TRYCCALLFORM %DAMAGE_FORMULA%(ACTOR_DID, TARGET_DID, ACTION_DID)`形式で呼び出し
;;; - CC_AFLAG / 連想配列 CC_ACT_FLAG_{ACTION_DID}
;;;   - **<任意>** CONTINUE_ATTACK_EVENIF_ATTACKER_DIED: 1 = 攻撃アクターが戦闘不能でも攻撃処理を実施
;;;   - **<任意>** COUNTER_PROHIBITED: 1 = 攻撃後にTARGETの`EXEC_AT = "COUNTER"`のパッシブスキルを誘発しない
;;; #### 結果
;;; - CC_AFLAG
;;;   - NUMBER_OF_ATTACKS: 攻撃回数
;;;   - ATTACK_AVOIDED: 攻撃を回避された回数
;;;   - ATTACK_SUCCEEDED: 攻撃が命中した回数(備考: バリアによる軽減/ダメージ0も命中扱い)
;;;   - DAMAGE: 合計ダメージ
;;;   - AVERAGE_DAMAGE: 平均ダメージ
;;;   - ALL_ATTACK_AVOIDED: 1 = すべての攻撃を回避された
;;;   - TARGET_DEFEATED: 1 = 今回の攻撃でTARGETが戦闘不能になった
;;; ***
;;; #### パッシブスキルトリガーポイント
;;; - **<ACTOR主体>** DEFEAT_ENEMY: 今回の攻撃でTARGETを戦闘不能にした場合に実施
;;; - **<TARGET主体>** DEFEATED: 今回の攻撃でTARGETが戦闘不能になった場合に実施
;;; - **<TARGET主体>** AFTER_EACH_ATTACKED: 戦闘不能判定後、TARGETが生存している場合に実施
;;; - **<TARGET主体>** COUNTER: 戦闘不能判定後、COUNTER_PROHIBITEDフラグが0かつTARGETが生存している場合に実施
;-------------------------------------------------
@CC_ACTION_MULTIPLE_ATTACK(ACTION_DID)
#DIM  ACTION_DID
#DIM  ACTOR_DID
#DIM  TARGET_DID
#DIM  NUMBER_OF_ATTACKS
#DIM  DAMAGE_MODIFIER

#DIM DYNAMIC ATTACK_AVOIDED
#DIM DYNAMIC ATTACK_SUCCEEDED
#DIM DYNAMIC TOTAL_DAMAGE

ACTOR_DID = DT_CELL_GET("CC_ACTION", ACTION_DID, "ACTOR_DID", 1)
TARGET_DID = DT_CELL_GET("CC_ACTION", ACTION_DID, "TARGET_DID", 1)
NUMBER_OF_ATTACKS = DT_CELL_GET("CC_ACTION", ACTION_DID, "NUMBER_OF_ATTACKS", 1)
DAMAGE_MODIFIER = CC_GET_ACT_INFO(ACTION_DID, "DAMAGE_MODIFIER") == 0 ? 100 # CC_GET_ACT_INFO(ACTION_DID, "DAMAGE_MODIFIER")

SIF DT_CELL_GETS("CC_ACTOR", ACTOR_DID, "STATE", 1) == "戦闘不能" && !CC_AFLAG(ACTION_DID, "CONTINUE_ATTACK_EVENIF_ATTACKER_DIED")
	RETURN 1
SIF DT_CELL_GETS("CC_ACTOR", TARGET_DID, "STATE", 1) == "戦闘不能"
	RETURN 1

CALL KOJO_XML_COMBAT(ACTION_DID, "EXEC")

FOR LOCAL, 0, NUMBER_OF_ATTACKS
	IF DT_CELL_GETS("CC_ACTION", ACTION_DID, "DAMAGE_FORMULA", 1) == ""
		CALL CC_CALC_DAMAGE(ACTOR_DID, TARGET_DID, CC_GETS_ACT_INFO(ACTION_DID, "OPTION"))
		CC_DAMAGE = FTIMES(CC_DAMAGE, DAMAGE_MODIFIER)
	ELSE
		;専用のダメージ計算式が指定されている場合
		TRYCCALLFORM %DT_CELL_GETS("CC_ACTION", ACTION_DID, "DAMAGE_FORMULA", 1)%(ACTOR_DID, TARGET_DID, ACTION_DID)
		CATCH
			DEBUGPRINTFORML ダメージ計算式<%DT_CELL_GETS("CC_ACTION", ACTION_DID, "DAMAGE_FORMULA", 1)%>が呼ばれましたが、対応する関数が見つかりませんでした
		ENDCATCH
	ENDIF

	CALL CC_AVOID_CHECK(ACTOR_DID, TARGET_DID, ACTION_DID)
	IF RESULT
		ATTACK_AVOIDED ++
	ELSE
		ATTACK_SUCCEEDED ++
		TOTAL_DAMAGE += CC_DAMAGE
	ENDIF
NEXT
IF ATTACK_SUCCEEDED > 0
	CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "NUMBER_OF_ATTACKS", TOSTR(NUMBER_OF_ATTACKS))
	CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "ATTACK_AVOIDED", TOSTR(ATTACK_AVOIDED))
	CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "ATTACK_SUCCEEDED", TOSTR(ATTACK_SUCCEEDED))
	CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "AVERAGE_DAMAGE", TOSTR(TOTAL_DAMAGE / ATTACK_SUCCEEDED))
ELSE
	CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "NUMBER_OF_ATTACKS", TOSTR(NUMBER_OF_ATTACKS))
	CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "ALL_ATTACK_AVOIDED", "1")
ENDIF
CC_DAMAGE = TOTAL_DAMAGE
CALL CC_TAKE_DAMAGE_NEW(ACTOR_DID, TARGET_DID, ACTION_DID)

DT_CELL_SET "CC_ACTOR", TARGET_DID, "EFFECT", "被ダメージ", 1

CALL KOJO_XML_COMBAT(ACTION_DID, "RESULT")

CALL CC_CHECK_KNOCKED_OUT_NEW(ACTION_DID)
SIF RESULT
	RETURN

CALL CC_TRIGGER_SP_TOKEN_PASSIVE_SKILL("AFTER_EACH_ATTACKED", TARGET_DID, ACTOR_DID, ACTION_DID)
CALL CC_EXEC_PASSIVE_SKILL("AFTER_EACH_ATTACKED", TARGET_DID, ACTOR_DID)
IF !CC_AFLAG(ACTION_DID, "COUNTER_PROHIBITED")
	CALL CC_EXEC_PASSIVE_SKILL("COUNTER", TARGET_DID, ACTOR_DID)
	CALL CC_TRIGGER_SP_TOKEN_PASSIVE_SKILL("COUNTER", TARGET_DID, ACTOR_DID, ACTION_DID)
ENDIF

;-------------------------------------------------
;;;<追撃>系スキル用の、通常攻撃ダメージ基礎補正値を低い値で更新する処理。
;-------------------------------------------------
;;; #### 入力パラメータ
;;; - CC_ACTIONテーブル
;;;   - **<必須>** ACTOR_DID: 動作主アクターのID (口上呼び出し用)
;;;   - **<必須>** VALUE: 通常攻撃のダメージ補正値(%)。現在値より低い場合はこの値で更新
;-------------------------------------------------
@CC_ACTION_UPDATE_NORMAL_ATTACK_BASE_DAMAGE(ACTION_DID)
#DIM ACTION_DID

CALL KOJO_XML_COMBAT(ACTION_DID, "EXEC")

SIF CC_GET_ACT_INFO(ACTION_DID, "VALUE") < CC_NORMAL_ATTACK_BASE_DAMAGE_RATE
	CC_NORMAL_ATTACK_BASE_DAMAGE_RATE = MAX(CC_GET_ACT_INFO(ACTION_DID, "VALUE"), 0)
;-------------------------------------------------
;;;<追撃>系スキル用の、通常攻撃の基礎パラメータを加減算する処理。
;-------------------------------------------------
;;; #### 入力パラメータ
;;; - CC_ACTIONテーブル
;;;   - **<必須>** ACTOR_DID: 動作主アクターのID (口上呼び出し用)
;;;   - **<任意>** NUMBER_OF_ATTACKS: 加算/減算する攻撃回数。
;;;   - **<任意>** DAMAGE_MODIFIER: 加算/減算するダメージ補正値(%)。
;;;   - **<任意>** CRITICAL_RATE: 加算/減算するクリティカル率(%)。
;;;   - **<任意>** CRITICAL_DAMAGE_RATE: 加算/減算するクリティカルダメージ補正値(%)。
;-------------------------------------------------
@CC_ACTION_ADD_NORMAL_ATTACK_BASE_PARAM(ACTION_DID)
#DIM ACTION_DID

CALL KOJO_XML_COMBAT(ACTION_DID, "EXEC")

CC_NUMBER_OF_NORMAL_ATTACKS = MAX(CC_NUMBER_OF_NORMAL_ATTACKS + CC_GET_ACT_INFO(ACTION_DID, "NUMBER_OF_ATTACKS"), 1)
CC_NORMAL_ATTACK_BASE_DAMAGE_RATE = MAX(CC_NORMAL_ATTACK_BASE_DAMAGE_RATE + CC_GET_ACT_INFO(ACTION_DID, "DAMAGE_MODIFIER"), 1)
CC_NORMAL_ATTACK_BASE_CRITICAL_RATE = MAX(CC_NORMAL_ATTACK_BASE_CRITICAL_RATE + CC_GET_ACT_INFO(ACTION_DID, "CRITICAL_RATE"), 0)
CC_NORMAL_ATTACK_BASE_CRITICAL_DAMAGE_RATE = MAX(CC_NORMAL_ATTACK_BASE_CRITICAL_DAMAGE_RATE + CC_GET_ACT_INFO(ACTION_DID, "CRITICAL_DAMAGE_RATE"), 0)

;-------------------------------------------------
;;;通常攻撃補正値変更
;;;チェイス系で基礎補正 + 個々の敵の補正として使う予定だったが、デバフを攻撃命中後に統一したので現状未使用
;;;@CC_ATKSKILL_CHASE_ATTACKを参照のこと
;-------------------------------------------------
;;; #### 入力パラメータ
;;; - CC_ACTIONテーブル
;;;   - **<必須>** ACTOR_DID: 動作主アクターのID (口上呼び出し用)
;;;   - **<任意>** DAMAGE_MODIFIER: 加算/減算するダメージ補正値(%)。
;;;   - **<任意>** CRITICAL_RATE: 加算/減算するクリティカル率(%)。
;;;   - **<任意>** CRITICAL_DAMAGE_RATE: 加算/減算するクリティカルダメージ補正値(%)。
@CC_ACTION_ADD_NORMAL_ATTACK_PARAM(ACTION_DID)
#DIM ACTION_DID

CALL KOJO_XML_COMBAT(ACTION_DID, "EXEC")

CC_NORMAL_ATTACK_DAMAGE_MODIFIER = MAX(CC_NORMAL_ATTACK_DAMAGE_MODIFIER + CC_GET_ACT_INFO(ACTION_DID, "DAMAGE_MODIFIER"), 1)
CC_NORMAL_ATTACK_CRITICAL_RATE_MODIFIER = MAX(CC_NORMAL_ATTACK_CRITICAL_RATE_MODIFIER + CC_GET_ACT_INFO(ACTION_DID, "CRITICAL_RATE"), 0)
CC_NORMAL_ATTACK_CRITICAL_DAMAGE_MODIFIER = MAX(CC_NORMAL_ATTACK_CRITICAL_DAMAGE_MODIFIER + CC_GET_ACT_INFO(ACTION_DID, "CRITICAL_DAMAGE_RATE"), 0)

;-------------------------------------------------
;;;通常攻撃全体攻撃化
;;;`CC_FLAG_NORMAL_ATTACK_ALL = 1`とするだけの処理
;-------------------------------------------------
;;; #### 入力パラメータ
;;; - CC_ACTIONテーブル
;;;   - **<必須>** ACTOR_DID: 動作主アクターのID (口上呼び出し用)
;-------------------------------------------------
@CC_ACTION_SET_NORMAL_ATTACK_ALL(ACTION_DID)
#DIM ACTION_DID

CALL KOJO_XML_COMBAT(ACTION_DID, "EXEC")

CC_FLAG_NORMAL_ATTACK_ALL = 1

;-------------------------------------------------
;;;関連サブルーチン
;-------------------------------------------------
;-------------------------------------------------
;;;回避判定。
;;;回避成功 = RETURN 1
;-------------------------------------------------
@CC_AVOID_CHECK(ACTOR_DID, TARGET_DID, ACTION_DID)
#DIM ACTOR_DID
#DIM TARGET_DID
#DIM ACTION_DID
#DIM SKILL_LV
#DIM EFFECT_RATE
#DIM CONST BLIND_MISS_RATE = 50

;盲目
IF CC_SP_TOKEN_NUM(ACTOR_DID, "BLIND") && RAND:100 < BLIND_MISS_RATE
	CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "AVOIDED_BY_BLIND", "1")
	RETURN 1
ENDIF

;分身
IF CC_SP_TOKEN_NUM(TARGET_DID, "DECOY_SHADOW")
	CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "AVOIDED_BY_DECOY_SHADOW", "1")

	IF CC_CHECK_DECOY_AMPLIFIER(TARGET_DID)
		CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "DECOY_PRESERVED", "1")
	ELSE
		CALL CC_SUB_SP_TOKEN(TARGET_DID, "DECOY_SHADOW", 1)
	ENDIF
	RETURN 1
ENDIF
;デコイ
IF CC_SP_TOKEN_NUM(TARGET_DID, "DECOY")
	CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "AVOIDED_BY_DECOY", "1")

	IF CC_CHECK_DECOY_AMPLIFIER(TARGET_DID)
		CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "DECOY_PRESERVED", "1")
	ELSE
		CALL CC_SET_SP_TOKEN(TARGET_DID, "DECOY", 0)
	ENDIF
	RETURN 1
ENDIF
;一撃離脱
IF CC_SP_TOKEN_NUM(TARGET_DID, "HIT_AND_RUN")
	CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "AVOIDED_BY_HIT_AND_RUN", "1")
	CALL CC_SUB_SP_TOKEN(TARGET_DID, "HIT_AND_RUN", 1)
	RETURN 1
ENDIF

;ドラゴンジャンプ、昇竜
IF CC_SP_TOKEN_NUM(TARGET_DID, "DRAGON_JUMP")
	CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "AVOIDED_BY_DRAGON_JUMP", "1")
	RETURN 1
ENDIF
IF CC_SP_TOKEN_NUM(TARGET_DID, "DRAGON_RISING")
	CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "AVOIDED_BY_DRAGON_RISING", "1")
	RETURN 1
ENDIF
;IF CC_SP_TOKEN_NUM(TARGET_DID, "CHARGE_PREP")
;	CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "AVOIDED_BY_CHARGE_PREP", "1")
;	RETURN 1
;ENDIF

;パリィ
IF CC_SP_TOKEN_NUM(TARGET_DID, "MAG_BREAK")
	SKILL_LV = HAS_SKILL(DT_CELL_GET("CC_ACTOR", TARGET_DID, "CHARA_ID", 1), "K9_UNIQUE_SKILL_PARRY", スキル_大分類_冒険)

	IF SKILL_LV > 0
		CALL SKILL_GET_EFFECT_RATE(スキル_ジャンル_戦闘, "K9_UNIQUE_SKILL_PARRY", SKILL_LV)
		EFFECT_RATE = RESULT
		IF RAND:100 < EFFECT_RATE
			CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "AVOIDED_BY_PARRY", "1")
			RETURN 1
		ENDIF
	ENDIF
ELSE
	RETURN 0
ENDIF

;-------------------------------------------------
;;;幻影投影判定。成功(トークン減らない) = RETURN 1
;-------------------------------------------------
@CC_CHECK_DECOY_AMPLIFIER(TARGET_DID)
#FUNCTION
#DIM TARGET_DID
#DIM DYNAMIC SKILL_LV

SKILL_LV = HAS_SKILL(DT_CELL_GET("CC_ACTOR", TARGET_DID, "CHARA_ID", 1), "WPN_DECOY_AMPLIFIER", スキル_大分類_武器)

IF SKILL_LV > 0 &&	RAND:100 < WPN_SKILL_GET_EFFECT_RATEF("WPN_DECOY_AMPLIFIER", SKILL_LV, 1)
	RETURNF 1
ELSE
	RETURNF 0
ENDIF

;-------------------------------------------------
;;; 最終ダメージ処理
;-------------------------------------------------
@CC_TAKE_DAMAGE_NEW(ACTOR_DID, TARGET_DID, ACTION_DID)
#DIM  ACTOR_DID
#DIM  TARGET_DID
#DIM  ACTION_DID

;;バリアによる減衰
;-------------------------------------------------
VARI BARRIER_BEFORE
VARI BARRIER_AFTER
BARRIER_BEFORE = CC_SP_TOKEN_NUM(TARGET_DID, "BARRIER")
IF BARRIER_BEFORE > 0 && CC_DAMAGE > 0
	BARRIER_AFTER = MAX(0, BARRIER_BEFORE - CC_DAMAGE)
	CALL CC_SET_SP_TOKEN(TARGET_DID, "BARRIER", BARRIER_AFTER)
	CC_DAMAGE = MAX(0, CC_DAMAGE - BARRIER_BEFORE)
	IF CC_DAMAGE == 0
		CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "NULLIFIED_BY_BARRIER", "1")
	ELSE
		CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "DECREASED_BY_BARRIER", "1")
	ENDIF
	CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "BARRIER_BEFORE", TOSTR(BARRIER_BEFORE))
	CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "BARRIER_AFTER", TOSTR(BARRIER_AFTER))
ENDIF

;;バリア以外に被ダメージ時に増減するトークンの処理
;(マイナスダメージ値:回復は未考慮)
;-------------------------------------------------
SIF CC_DAMAGE != 0
	CALL CC_DAMAGE_CULC_TOKEN(ACTOR_DID, TARGET_DID, ACTION_DID, CC_DAMAGE)

;;ダメージ反映
;-------------------------------------------------
VARI HP
VARI MAX_HP
HP = DT_CELL_GET("CC_ACTOR", TARGET_DID, "HP", 1)
MAX_HP = DT_CELL_GET("CC_ACTOR", TARGET_DID, "MAX_HP", 1)

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

CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "DAMAGE", TOSTR(CC_DAMAGE))

RETURN 1

;-------------------------------------------------
;;;被ダメージによって増減するその他のトークンの処理
;-------------------------------------------------
@CC_DAMAGE_CULC_TOKEN(ACTOR_DID, TARGET_DID, ACTION_DID, DAMAGE)
#DIM ACTOR_DID
#DIM TARGET_DID
#DIM ACTION_DID
#DIM DAMAGE
#DIM TOKEN_COUNT

;<突撃準備>はダメージ毎に50％の確率で－１、最小値１
IF CC_SP_TOKEN_NUM(TARGET_DID, "CHARGE_PREP") >= 2 && RAND:100 > 50
	CALL CC_SUB_SP_TOKEN(TARGET_DID, "CHARGE_PREP", 1)
	CALL CC_SET_ACT_FLAG_BY_ID(ACTION_DID, "LOST_CHARGE_PREP", "1")
ENDIF


code:
;-------------------------------------------------
;;; スタックした関数を先頭から実行。
;; _LIST_ACTION: アクション情報の連想配列リスト。0番目の要素が上でスタックする。一括追加したアクションには同じブロックIDが付与される。
;; ブロックIDが同じアクションは途中で割り込まれない一連のアクションとして実行される。
;-------------------------------------------------
@CC_ACTION_MANAGER_(METHOD)
#DIMS METHOD

#DIM  SERIAL_BLOCK_ID
#DIM  TOP
#DIM  ALREADY_RESOLVING
#DIM  BLOCK_STACK, CC_MAX_ACTION
#DIM  CURRENT_BLOCK
#DIM  SKILL_SEQUENCE
#DIM  SEQUENCE
#DIM  TRIGGER_ID
#DIM  ACTION_DID
#DIMS ABORT_CONDITION
#DIMS BLOCK_ABORT_CONDITION

SELECTCASE METHOD
	CASE "INIT"
		TOP = -1
		ALREADY_RESOLVING = 0
		SERIAL_BLOCK_ID = 0
		VARSET BLOCK_STACK, -1
		CALL CC_ACTION_MANAGER_CREATE_ACTION_TABLE
		CALLF CC_TRIGGER_TABLE_("INIT")
	CASE "ADD_NEW_BLOCK_TO_TOP"
		SERIAL_BLOCK_ID ++
		TOP ++
		BLOCK_STACK:TOP = SERIAL_BLOCK_ID
		RESULT:1 = 0
		RETURN SERIAL_BLOCK_ID
	CASE "ADD_NEW_BLOCK_TO_BOTTOM"
		SERIAL_BLOCK_ID ++
		TOP ++
		ARRAYSHIFT BLOCK_STACK, 1, SERIAL_BLOCK_ID
		RESULT:1 = 0
		RETURN SERIAL_BLOCK_ID
	CASE "ADD_TO_CURRENT_BLOCK"
		;DEBUGPRINTFORML ADD_TO_CURRENT_BLOCK {DT_SELECT("CC_TRIGGERED_SKILL", @"BLOCK = {CURRENT_BLOCK}", "SKILL_SEQUENCE DESC")}
		DT_SELECT "CC_TRIGGERED_SKILL", @"BLOCK = {CURRENT_BLOCK}", "SKILL_SEQUENCE DESC"

		RESULT:1 = DT_CELL_GET("CC_TRIGGERED_SKILL", RESULT:1, "SKILL_SEQUENCE", 1) + 1
		RETURN CURRENT_BLOCK
	CASE "INSTANT"
		;BLOCK_STACKに登録せずその場で処理するスキル用
		RESULT:1 = 0
		RETURN -1

	CASE "GET_CURRENT_BLOCK"
		IF ALREADY_RESOLVING
			RETURN CURRENT_BLOCK
		ELSE
			RETURN -1
		ENDIF
	CASE "GET_CURRENT_TRIGGER_ID"
		IF ALREADY_RESOLVING
			RETURN TRIGGER_ID
		ELSE
			RETURN -1
		ENDIF
	CASE "GET_CURRENT_ACTION_DID"
		IF ALREADY_RESOLVING
			RETURN ACTION_DID
		ELSE
			RETURN -1
		ENDIF
	CASE "RESOLVE"
		SIF ALREADY_RESOLVING == 1
			RETURN 0
		ALREADY_RESOLVING = 1
		;ブロック
		WHILE 1
			;CALL DEBUG_OUTPUT_TABLE("CC_ACTION")
			SIF TOP == -1
				BREAK
			CURRENT_BLOCK = BLOCK_STACK:TOP
			BLOCK_STACK:TOP = -1
			TOP --

			SIF DT_SELECT("CC_TRIGGERED_SKILL", @"BLOCK = {CURRENT_BLOCK}") == 0
				CONTINUE

			SKILL_SEQUENCE = 0
			;スキル
			WHILE 1
				SIF DT_SELECT("CC_TRIGGERED_SKILL", @"BLOCK = {CURRENT_BLOCK} AND SKILL_SEQUENCE = {SKILL_SEQUENCE}",, TRIGGER_ID) == 0
					BREAK

				SEQUENCE = 0
				;アクション
				WHILE 1
					SIF DT_SELECT("CC_ACTION", @"TRIGGER_ID = {TRIGGER_ID} AND SEQUENCE = {SEQUENCE}",, ACTION_DID) == 0
						BREAK
					ABORT_CONDITION = %DT_CELL_GETS("CC_ACTION", ACTION_DID, "ABORT_CONDITION", 1)%
					IF ABORT_CONDITION != "" && TOINT(STRFORM(ABORT_CONDITION))
						;DEBUGPRINTFORML ABORT: BLOCK{CURRENT_BLOCK}_{SEQUENCE}: %DT_CELL_GETS("CC_ACTION", ACTION_DID, "FUNCTION_NAME", 1)%
						SEQUENCE ++
						CONTINUE
					ENDIF

					DEBUGPRINTFORML EXEC: %CC_GETS_ACT_INFO(ACTION_DID, "SKILL_DEF_NAME")%: BLOCK {CURRENT_BLOCK}_{SKILL_SEQUENCE}_{SEQUENCE}: %DT_CELL_GETS("CC_ACTION", ACTION_DID, "FUNCTION_NAME", 1)%
					TRYCCALLFORM %DT_CELL_GETS("CC_ACTION", ACTION_DID, "FUNCTION_NAME", 1)%(ACTION_DID)
						SIF RESULT == -1
							BREAK
					CATCH
						DEBUGPRINTFORML スキル<%CC_GETS_ACT_INFO(ACTION_DID, "FUNCTION_NAME")%>が呼ばれましたが、対応するスキル処理関数が見つかりませんでした
					ENDCATCH
					;DEBUGPRINTFORML CC_ACT_FLAG_{CURRENT_BLOCK}_{SKILL_SEQUENCE}_{SEQUENCE}: %MAP_GETKEYS(@"CC_ACT_FLAG_{ACTION_DID}")%

					SEQUENCE ++
				WEND
				SKILL_SEQUENCE ++
			WEND
			;CALL DEBUG_OUTPUT_TABLE("CC_ACTION")
		WEND
		;DEBUGPRINTFORML END_RESOLVE
		ALREADY_RESOLVING = 0
	CASEELSE
		DEBUGPRINTFORML 未定義のメソッド<%METHOD%>が呼ばれました
ENDSELECT

@CC_ACTION_MANAGER_CREATE_ACTION_TABLE
#DIMS CONST DB_NAME = "CC_ACTION"

IF DT_EXIST(DB_NAME)
	DT_CLEAR DB_NAME
	RETURN
ENDIF

DT_CREATE DB_NAME
DT_COLUMN_ADD DB_NAME, "TRIGGER_ID", "int64"
DT_COLUMN_ADD DB_NAME, "SEQUENCE", "int16"
DT_COLUMN_ADD DB_NAME, "FUNCTION_NAME", "string"
DT_COLUMN_ADD DB_NAME, "ACTOR_DID", "int64"
DT_COLUMN_ADD DB_NAME, "TARGET_DID", "int64"

DT_COLUMN_ADD DB_NAME, "ABORT_CONDITION", "string"

DT_COLUMN_ADD DB_NAME, "DAMAGE_MODIFIER", "int16"
DT_COLUMN_ADD DB_NAME, "CRITICAL_RATE", "int16"
DT_COLUMN_ADD DB_NAME, "CRITICAL_DAMAGE_RATE", "int16"
DT_COLUMN_ADD DB_NAME, "DAMAGE_FORMULA", "string"
DT_COLUMN_ADD DB_NAME, "OPTION", "string"
DT_COLUMN_ADD DB_NAME, "NUMBER_OF_ATTACKS", "int16"

DT_COLUMN_ADD DB_NAME, "TOKEN_NAME", "string"
DT_COLUMN_ADD DB_NAME, "VALUE", "int32"
DT_COLUMN_ADD DB_NAME, "EFFECT_RATE", "int32"
DT_COLUMN_ADD DB_NAME, "SUCCESS_RATE", "int8"
DT_COLUMN_ADD DB_NAME, "ENHANCE_REGIST_AFTER_INFLICT", "int8"

DT_COLUMN_ADD DB_NAME, "ABLITY_NAME", "string"

DT_COLUMN_ADD DB_NAME, "SIDE", "int8"
DT_COLUMN_ADD DB_NAME, "DEF_NAME", "string"
DT_COLUMN_ADD DB_NAME, "DISP_NAME", "string"

@CC_GET_ACT_INFO(ACTION_DID, COLUMN)
#FUNCTION
#DIM  ACTION_DID
#DIMS COLUMN

IF DT_COLUMN_EXIST("CC_TRIGGERED_SKILL", COLUMN)
	RETURNF DT_CELL_GET("CC_TRIGGERED_SKILL", DT_CELL_GET("CC_ACTION", ACTION_DID, "TRIGGER_ID", 1), COLUMN, 1)
ELSE
	RETURNF DT_CELL_GET("CC_ACTION", ACTION_DID, COLUMN, 1)
ENDIF

@CC_GETS_ACT_INFO(ACTION_DID, COLUMN)
#FUNCTIONS
#DIM  ACTION_DID
#DIMS COLUMN

IF DT_COLUMN_EXIST("CC_TRIGGERED_SKILL", COLUMN)
	RETURNF DT_CELL_GETS("CC_TRIGGERED_SKILL", DT_CELL_GET("CC_ACTION", ACTION_DID, "TRIGGER_ID", 1), COLUMN, 1)
ELSE
	RETURNF DT_CELL_GETS("CC_ACTION", ACTION_DID, COLUMN, 1)
ENDIF

@CC_EDIT_ADD_ACT_INFO(ACTION_DID, COLUMN, VALUE)
#DIM  ACTION_DID
#DIMS COLUMN
#DIM  VALUE
DT_CELL_SET "CC_ACTION", ACTION_DID, COLUMN, CC_GET_ACT_INFO(ACTION_DID, COLUMN) + VALUE, 1

;-------------------------------------------------
; アクション結果を保存する連想配列
;-------------------------------------------------
;-------------------------------------------------
; アクションIDから記録
;-------------------------------------------------
@CC_SET_ACT_FLAG_BY_ID(ACTION_DID, KEY, VALUE)
#DIM ACTION_DID
#DIMS KEY
#DIMS VALUE
#DIM BLOCK
#DIM SEQUENCE

IF !MAP_EXIST(@"CC_ACT_FLAG_{ACTION_DID}")
	MAP_CREATE @"CC_ACT_FLAG_{ACTION_DID}"
ENDIF

MAP_SET @"CC_ACT_FLAG_{ACTION_DID}", KEY, VALUE

;-------------------------------------------------
; アクションIDから取得
;-------------------------------------------------
@CC_GETS_ACT_FLAG_BY_ID(ACTION_DID, KEY)
#FUNCTIONS
#DIM  ACTION_DID
#DIMS KEY

RETURNF MAP_GET(@"CC_ACT_FLAG_{ACTION_DID}", KEY)

;-------------------------------------------------
; トリガーIDとシーケンス番号から取得
;-------------------------------------------------
@CC_GETS_ACT_FLAG(TRIGGER_ID, SEQUENCE, KEY)
#FUNCTIONS
#DIM TRIGGER_ID
#DIM SEQUENCE
#DIMS KEY
#DIM ACTION_DID

SIF DT_SELECT("CC_ACTION", @"TRIGGER_ID = {TRIGGER_ID} AND SEQUENCE = {SEQUENCE}",, ACTION_DID) == 0
	RETURNF "-1"

RETURNF CC_GETS_ACT_FLAG_BY_ID(ACTION_DID, KEY)

;-------------------------------------------------
; 整数値に変換してから取得
;-------------------------------------------------
@CC_GET_ACT_FLAG_BY_ID(ACTION_DID, KEY)
#FUNCTION
#DIM  ACTION_DID
#DIMS KEY

RETURNF TOINT(CC_GETS_ACT_FLAG_BY_ID(ACTION_DID, KEY))

@CC_GET_ACT_FLAG(TRIGGER_ID, SEQUENCE, KEY)
#FUNCTION
#DIM TRIGGER_ID
#DIM SEQUENCE
#DIMS KEY

RETURNF TOINT(CC_GETS_ACT_FLAG(TRIGGER_ID, SEQUENCE, KEY))

;-------------------------------------------------
; 短縮版
;-------------------------------------------------
@CC_AFLAG(ACTION_DID, KEY)
#FUNCTION
#DIM  ACTION_DID
#DIMS KEY

RETURNF CC_GET_ACT_FLAG_BY_ID(ACTION_DID, KEY)

@CC_AFLAGS(ACTION_DID, KEY)
#FUNCTIONS
#DIM  ACTION_DID
#DIMS KEY

RETURNF CC_GETS_ACT_FLAG_BY_ID(ACTION_DID, KEY)

;-------------------------------------------------
; 連想配列の削除
;-------------------------------------------------
@CC_RELEASE_ACT_FLAG(ACTION_DID)
#DIM  ACTION_DID

MAP_RELEASE @"CC_ACT_FLAG_{ACTION_DID}"

@CC_RELEASE_ALL_ACT_FLAG
#DIM NUM
#DIM ACTION_DID
#DIM BLOCK
VARI I
NUM = DT_ROW_LENGTH("CC_ACTION")
FOR I, 0, NUM
	ACTION_DID = DT_CELL_GET("CC_ACTION", I, "ID")
	CALL CC_RELEASE_ACT_FLAG(ACTION_DID)
NEXT
;-------------------------------------------------
; スキル誘発ID
;-------------------------------------------------
@CC_TRIGGER_TABLE_(METHOD)
#FUNCTION
#DIMS METHOD
#DIMS CONST DB_NAME = "CC_TRIGGERED_SKILL"

SELECTCASE METHOD
	CASE "INIT"
		IF DT_EXIST(DB_NAME)
			DT_CLEAR DB_NAME
			RETURNF 1
		ENDIF
		DT_CREATE DB_NAME
		DT_COLUMN_ADD DB_NAME, "BLOCK", "int16"
		DT_COLUMN_ADD DB_NAME, "SKILL_SEQUENCE", "int16"
		DT_COLUMN_ADD DB_NAME, "SKILL_DEF_NAME", "string"
		DT_COLUMN_ADD DB_NAME, "SKILL_NAME", "string"
		DT_COLUMN_ADD DB_NAME, "SKILL_LV", "int8"
		DT_COLUMN_ADD DB_NAME, "SKILL_DID", "int64"
		DT_COLUMN_ADD DB_NAME, "TOKEN_DID", "int64"
		DT_COLUMN_ADD DB_NAME, "IS_TOKEN_SKILL", "int8"
	CASEELSE
		THROW 未定義のメソッド<%METHOD%>が呼ばれました
ENDSELECT

@CC_GET_TRIGGER_INFO(TRIGGER_ID, COLUMN)
#FUNCTION
#DIM  TRIGGER_ID
#DIMS COLUMN

RETURNF DT_CELL_GET("CC_TRIGGERED_SKILL", TRIGGER_ID, COLUMN, 1)

@CC_GETS_TRIGGER_INFO(TRIGGER_ID, COLUMN)
#FUNCTIONS
#DIM  TRIGGER_ID
#DIMS COLUMN

RETURNF DT_CELL_GETS("CC_TRIGGERED_SKILL", TRIGGER_ID, COLUMN, 1)

;-------------------------------------------------
; トリガーしたスキルの結果を保存する連想配列
;-------------------------------------------------
;-------------------------------------------------
; トリガーIDから記録
;-------------------------------------------------
@CC_SET_TRIGGERED_SKILL_FLAG(TRIGGER_ID, KEY, VALUE)
#DIM TRIGGER_ID
#DIMS KEY
#DIMS VALUE
#DIM BLOCK
#DIM SEQUENCE

IF !MAP_EXIST(@"CC_TRIGGER_FLAG_{TRIGGER_ID}")
	MAP_CREATE @"CC_TRIGGER_FLAG_{TRIGGER_ID}"
ENDIF

MAP_SET @"CC_TRIGGER_FLAG_{TRIGGER_ID}", KEY, VALUE
;-------------------------------------------------
; アクションIDから記録
;-------------------------------------------------
@CC_SET_TRIGGERED_SKILL_FLAG_BY_ACTION_ID(ACTION_ID, KEY, VALUE)
#DIM ACTION_ID
#DIMS KEY
#DIMS VALUE
#DIM BLOCK
#DIM SEQUENCE

CALL CC_SET_TRIGGERED_SKILL_FLAG(CC_GET_ACT_INFO(ACTION_ID, "TRIGGER_ID"), KEY, VALUE)

;-------------------------------------------------
; トリガーIDから取得
;-------------------------------------------------
@CC_GETS_TRIGGERED_SKILL_FLAG(TRIGGER_ID, KEY)
#FUNCTIONS
#DIM TRIGGER_ID
#DIMS KEY

RETURNF MAP_GET(@"CC_TRIGGER_FLAG_{TRIGGER_ID}", KEY)

@CC_GET_TRIGGERED_SKILL_FLAG(TRIGGER_ID, KEY)
#FUNCTION
#DIM TRIGGER_ID
#DIMS KEY

RETURNF TOINT(CC_GETS_TRIGGERED_SKILL_FLAG(TRIGGER_ID, KEY))

;-------------------------------------------------
; 削除
;-------------------------------------------------
@CC_RELEASE_TRIGGERED_SKILL_FLAG(TRIGGER_ID)
#DIM  TRIGGER_ID

MAP_RELEASE @"CC_TRIGGER_FLAG_{TRIGGER_ID}"

@CC_RELEASE_ALL_TRIGGERED_SKILL_FLAG
#DIM NUM
#DIM TRIGGER_ID
#DIM BLOCK
VARI I
NUM = DT_ROW_LENGTH("CC_TRIGGERED_SKILL")
FOR I, 0, NUM
	TRIGGER_ID = DT_CELL_GET("CC_TRIGGERED_SKILL", I, "ID")
	CALL CC_RELEASE_TRIGGERED_SKILL_FLAG(TRIGGER_ID)
NEXT

;-------------------------------------------------
; スキル発動時共通初期化処理
; RESULT = TRIGGER_ID
;-------------------------------------------------
@CC_SKILL_TRIGGER_INIT(ACTOR_DID, TARGET_DID, XML_SKILL, BLOCK_REGISTRAION, EQUIP_DID = 0)
#DIM  ACTOR_DID
#DIM  TARGET_DID
#DIMS XML_SKILL
#DIMS BLOCK_REGISTRAION
#DIM EQUIP_DID
#DIM  BLOCK
#DIM  SKILL_SEQUENCE

CALL CCS_INIT_PARAM()
CALL CCS_SET_PARAM(ACTOR_DID, TARGET_DID, XML_SKILL, EQUIP_DID)

CALL CC_ACTION_MANAGER_(BLOCK_REGISTRAION)
BLOCK = RESULT
SKILL_SEQUENCE = RESULT:1
{
	DT_ROW_ADD "CC_TRIGGERED_SKILL"
		,"BLOCK", BLOCK
		,"SKILL_SEQUENCE", SKILL_SEQUENCE
		,"SKILL_DEF_NAME", CCS_SKILL_DEF_NAME
		,"SKILL_NAME", CCS_SKILL_NAME
		,"SKILL_LV", CCS_SKILL_LV
}
DEBUGPRINTFORML %BLOCK_REGISTRAION%: %CCS_SKILL_DEF_NAME% BLOCK = {BLOCK} SKILL_SEQUENCE = {SKILL_SEQUENCE}
RETURN RESULT

;-------------------------------------------------
; トークンスキル発動時共通初期化処理
; RESULT = TRIGGER_ID
;-------------------------------------------------
@CC_TOKEN_SKILL_TRIGGER_INIT(ACTOR_DID, TARGET_DID, SKILL_DID, BLOCK_REGISTRAION)
#DIM  ACTOR_DID
#DIM  TARGET_DID
#DIM SKILL_DID
#DIMS BLOCK_REGISTRAION

#DIM  BLOCK
#DIM  SKILL_SEQUENCE
#DIM TRIGGER_ID

CALL CCS_INIT_PARAM()
CALL CC_ACTION_MANAGER_(BLOCK_REGISTRAION)
BLOCK = RESULT
SKILL_SEQUENCE = RESULT:1
{
	DT_ROW_ADD "CC_TRIGGERED_SKILL"
		,"BLOCK", BLOCK
		,"SKILL_SEQUENCE", SKILL_SEQUENCE
		,"SKILL_DEF_NAME", DT_CELL_GETS("SP_TOKEN_SKILL_PARAMS", SKILL_DID, "SKILL_DEF_NAME", 1)
		,"SKILL_NAME", DT_CELL_GETS("SP_TOKEN_SKILL_PARAMS", SKILL_DID, "SKILL_NAME", 1)
		,"SKILL_DID", SKILL_DID
		,"TOKEN_DID", DT_CELL_GET("SP_TOKEN_SKILL_PARAMS", SKILL_DID, "PARENT_TOKEN_ID", 1)
		,"IS_TOKEN_SKILL", 1
}
TRIGGER_ID = RESULT

RETURN TRIGGER_ID

;-------------------------------------------------
;;; アクションとトリガーの解放処理
;;; CC_FLOW = ATTACKの終了時に呼び出される
;-------------------------------------------------
@CLOSE_COMBAT_RELEASE_ACTION
DT_CLEAR "CC_ACTION"
DT_CLEAR "CC_TRIGGERED_SKILL"


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 補正攻撃力
#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 LIST_LENGTH
#DIMS DYNAMIC _XML_SKILL
#DIM  DYNAMIC EQUIP_NUM
#DIM  DYNAMIC EQUIP_DID, 10

クリティカル率 = 3
クリティカルダメージ倍率 = 120

;;戦闘用に一時使用する武器が設定されている場合は武器定義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)
    補正攻撃力 += WPN_STATUS:WPN_攻撃力
    補正防御力 += WPN_STATUS:WPN_防御力
    補正軽減値 += WPN_STATUS:WPN_軽減値
    補正魔力   += WPN_STATUS:WPN_魔力
    補正行動力 += WPN_STATUS:WPN_行動力
    補正敵視   += WPN_STATUS:WPN_敵視
    脅威選定    = WPN_STATUS:WPN_脅威選定
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)
            補正攻撃力 += WPN_STATUS:WPN_攻撃力
            補正防御力 += WPN_STATUS:WPN_防御力
            補正軽減値 += WPN_STATUS:WPN_軽減値
            補正魔力   += WPN_STATUS:WPN_魔力
            補正行動力 += WPN_STATUS:WPN_行動力
            補正敵視   += WPN_STATUS:WPN_敵視
            IF LOCAL == 0 ;脅威選定は武器の値を参照
                脅威選定    = WPN_STATUS:WPN_脅威選定
            ENDIF
        NEXT
    ENDIF
ENDIF
補正攻撃力 = 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)

;素質補正
IF HAS_TALENT(CHARA_ID, "魔術師")
    補正魔力   = (ABL:CHARA_ID:魔術 + (ABL:CHARA_ID:魔術) * 補正魔力 / 100)
    補正防御力 = FTIMES(補正防御力, 75)
    補正軽減値 = FTIMES(補正軽減値, 50)
    ;成長型：魔人の魔力値は2割減、防御ペナルティは無しの処理
ELSEIF TALENT:CHARA_ID:成長型 == 12
    補正魔力   = (ABL:CHARA_ID:魔術 + (ABL:CHARA_ID:魔術) * 補正魔力 / 100)
    補正魔力   = FTIMES(補正魔力, 80)
ELSE
    補正魔力   = ABL:CHARA_ID:魔術 + (ABL:CHARA_ID:知識 * 補正魔力 / 100)
    ;非魔術師の魔力値は4割減
    補正魔力   = FTIMES(補正魔力, 60)
ENDIF

VARI SKILL_LV
VARS SKILL_DEF_NAME
VARI EFFECT_RATE
VARI 攻撃力補正率
VARI 魔力補正率
VARI 軽減値補正率

;スキルによる補正
VARSET SKILL_DEF_LIST
CALL DIC_KEYS(_DIC_SKILL_LIST:CHARA_ID:スキル_大分類_冒険)
LIST_LENGTH = RESULT
ARRAYCOPY "RESULTS", "SKILL_DEF_LIST"
FOR LOCAL, 0, LIST_LENGTH
    ;スキル定義のOUTER_XML取得
    XML_GET XMLID_SKILL_BATTLE, @"//defname[@parentname='%SKILL_DEF_LIST:LOCAL%'][.//category[(text()='BATTLE')]]", _XML_SKILL, 3
    SIF !RESULT
        CONTINUE
    ;スキルによる攻撃力補正
    CALL CC_CALC_ATK_BUFF(CHARA_ID, _XML_SKILL, 補正攻撃力)
    補正攻撃力 += RESULT
    CALL CC_CALC_DEF_BUFF(CHARA_ID, _XML_SKILL, 補正軽減値)
    補正軽減値 += RESULT
NEXT

;装備スキルによる補正
FOR LOCAL, 0, EQUIP_NUM
    ;;単純加算系の補正
    ;攻撃力補正
    CALL CC_GET_STATUS_BOOST_ADD_BY_EQUIP(EQUIP_DID:LOCAL, "WPN_ATK_BONUS")
    攻撃力補正率 += RESULT
    ;魔力補正
    CALL CC_GET_STATUS_BOOST_ADD_BY_EQUIP(EQUIP_DID:LOCAL, "WPN_MAG_BONUS")
    魔力補正率 += RESULT
    ;軽減値補正
    CALL CC_GET_STATUS_BOOST_ADD_BY_EQUIP(EQUIP_DID:LOCAL, "WPN_ARMOR_BONUS")
    軽減値補正率 += RESULT
    ;毒耐性
    CALL CC_GET_STATUS_BOOST_ADD_BY_EQUIP(EQUIP_DID:LOCAL, "WPN_BOOST_REGIST_POISON")
    毒耐性 += RESULT
    ;燃焼耐性
    CALL CC_GET_STATUS_BOOST_ADD_BY_EQUIP(EQUIP_DID:LOCAL, "WPN_BOOST_REGIST_BURN")
    燃焼耐性 += RESULT
    ;スタン耐性
    CALL CC_GET_STATUS_BOOST_ADD_BY_EQUIP(EQUIP_DID:LOCAL, "WPN_BOOST_REGIST_STUN")
    スタン耐性 += RESULT
    ;盲目耐性
    CALL CC_GET_STATUS_BOOST_ADD_BY_EQUIP(EQUIP_DID:LOCAL, "WPN_BOOST_REGIST_BLIND")
    盲目耐性 += RESULT
    ;クリティカル率
    CALL CC_GET_STATUS_BOOST_ADD_BY_EQUIP(EQUIP_DID:LOCAL, "WPN_BOOST_CRT")
    クリティカル率 += RESULT
    ;クリティカルダメージ倍率
    CALL CC_GET_STATUS_BOOST_ADD_BY_EQUIP(EQUIP_DID:LOCAL, "WPN_BOOST_CRT_DAMAGE")
    クリティカルダメージ倍率 += RESULT
NEXT

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

補正攻撃力 = 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

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", MAXBASE:CHARA_ID:体力
        ,"HP", BASE:CHARA_ID:体力
        ,"STR", ABL:CHARA_ID:戦闘
        ,"MAG", 補正魔力
        ,"ATTACK", 補正攻撃力
        ,"DEFENCE", 補正防御力
        ,"ARMOR", 補正軽減値
        ,"AGILITY", 補正行動力
        ,"CRITICAL_RATE", クリティカル率
        ,"CRITICAL_DAMAGE_RATE", クリティカルダメージ倍率
        ,"HATE_RATE", 補正敵視
        ,"TARGETING", 脅威選定
        ,"REGIST_POISON", 毒耐性
        ,"REGIST_BURN", 燃焼耐性
        ,"REGIST_STUN", スタン耐性
        ,"REGIST_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


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}
;-------------------------------------------------
; 魔力ダメージ乗算補正:食事効果
;------------------------------------------------
MODIFIER = GET_MEAL_INSTANT_BUFF(MEAL_EFFECT_ID_DEF, "MAG_G")
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) - 10000 * NOWEX:(CHARA_ID):(LOCAL:0), 0, 9999)

		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