MOD制作に便利なプログラム置き場です。自作。
ドローやスキル生成関連の効果
スキルを〇枚引く。
public override void SkillUseSingle(Skill SkillD, List<BattleChar> Targets)
{
BattleSystem.instance.AllyTeam.Draw(枚数);
}
ターゲットのスキルを優先して〇枚のスキルを引く。
public override void SkillUseSingle(Skill SkillD, List<BattleChar> Targets)
{
for (int i = 0; i < 枚数; i++)
{
BattleSystem.instance.AllyTeam.CharacterDraw(Targets[0], null);
}
}
スキルを生成し手札に加える。
public override void SkillUseSingle(Skill SkillD, List<BattleChar> Targets)
{
Skill skill = Skill.TempSkill("スキル名", this.BChar, this.BChar.MyTeam);
BattleSystem.instance.AllyTeam.Add(skill, true);
this.BChar.MyTeam.ShuffleDeck();
}
スキルを生成しデッキに加える。
public override void SkillUseSingle(Skill SkillD, List<BattleChar> Targets)
{
base.SkillUseSingle(SkillD, Targets);
for (int i = 0; i < 枚数; i++)
{
Skill item = Skill.TempSkill("スキル名①", this.BChar, this.BChar.MyTeam);
this.BChar.MyTeam.Skills_Deck.Add(item);
}
this.BChar.MyTeam.ShuffleDeck();
}
最後に手札から発動したスキルを自身のものとして手札に加える
public override void SkillUseSingle(Skill SkillD, List Targets)
{
Skill lastSkill = BattleSystem.instance.BattleLogs.getLastSkill(
true,
false,
(BattleLog log) =>
log.WhoUse.Info.Ally &&
log.isUsedinHand,
(Skill skill) =>
!skill.FreeUse &&
!skill.MySkill.Rare &&
!skill.Master.NullCheck()
);
if (lastSkill != null)
{
// 特定スキルは除外
if (lastSkill.MySkill.KeyID == "スキル名")
{
return;
}
// 所有者を自身に変更
skillCopy.Master = this.BChar;
// 手札に追加
this.BChar.MyTeam.Add(skillCopy, true);
}
}
デッキから条件を満たすスキルを選択し、自身のスキルとして手札に加える
public override void SkillUseSingle(Skill SkillD, List Targets)
{
List selectableSkills = new List();
foreach (Skill skill in BattleSystem.instance.AllyTeam.Skills_Deck)
{
if (skill.MySkill.KeyID == "スキル名①") continue; // 自身のスキルは除外
if (skill.Master.IsLucy) continue; // 特定キャラクターのスキルは除外
if (skill.MySkill.Rare) continue; // レアスキルは除外
selectableSkills.Add(skill);
}
BattleSystem.DelayInput(BattleSystem.I_OtherSkillSelect(
selectableSkills,
new SkillButton.SkillClickDel(this.OnSkillSelected),
ScriptLocalization.System_SkillSelect.DrawSkill,
false, true, true, false, true));
}
private void OnSkillSelected(SkillButton selectedButton)
{
Skill selectedSkill = selectedButton.Myskill;
// クローン作成(迅速・除外・一定ターン後削除)
Skill clonedSkill = selectedSkill.CloneSkill(false, null, null, false);
clonedSkill.isExcept = true;
clonedSkill.AutoDelete = 枚数;
clonedSkill.APChange--;
// 持ち主を自身に変更
Skill originalSkill = selectedSkill;
clonedSkill.Master = this.BChar;
// 手札に追加
this.BChar.MyTeam.Add(clonedSkill, true);
// 元の持ち主が自身なら追加発動を付与
if (originalSkill.Master == this.BChar)
{
clonedSkill.ExtendedAdd_Battle(new MultiUseOnce());
}
}
手札のスキルに SkillExtended を付与する。
public override void SkillUseSingle(Skill SkillD, List<BattleChar> Targets)
{
base.SkillUseSingle(SkillD, Targets);
foreach (Skill skill in this.BChar.MyTeam.Skills)
{
skill.ExtendedAdd(new 追加効果①());
}
}
デッキのスキルに SkillExtended を付与する。
public override void SkillUseSingle(Skill SkillD, List<BattleChar> Targets)
{
base.SkillUseSingle(SkillD, Targets);
foreach (Skill skill in this.BChar.MyTeam.Skills_Deck)
{
skill.ExtendedAdd(new 追加効果①());
}
}
特定のスキル群から選ばれたスキルを山札の一番上に加える。
public override void SkillUseSingle(Skill SkillD, List<BattleChar> Targets)
{
base.SkillUseSingle(SkillD, Targets);
List<string> 候補スキル群 = new List<string> { "スキル①", "スキル②", "スキル③" };
List<Skill> candidateSkills = new List<Skill>();
foreach (string key in 候補スキル群)
{
Skill temp = Skill.TempSkill(key, this.BChar, this.BChar.MyTeam);
if (temp != null) candidateSkills.Add(temp);
}
if (candidateSkills.Count > 0)
{
BattleSystem.instance.EffectDelays.Enqueue(
BattleSystem.I_OtherSkillSelect(
candidateSkills,
new SkillButton.SkillClickDel(this.OnSkillSelected),
ScriptLocalization.System_SkillSelect.DrawSkill,
false, true, true, false, true
)
);
}
}
private void OnSkillSelected(SkillButton button)
{
Skill chosen = button.Myskill;
if (chosen == null) return;
this.BChar.MyTeam.Skills_Deck.Insert(0, chosen);
}
スキル発動にかかわる効果
スタックがX以上ならすべて消費してスキルを自動発動
public override void Init()
{
base.Init();
// スタックが一定数に達したら発動処理
if (this.StackNum >= 枚数)
{
// スタック全消費
base.SelfDestroy(false);
// 特定のスキルを即時発動
Skill triggerSkill = Skill.TempSkill("スキル名①", this.BChar, this.BChar.MyTeam);
if (triggerSkill != null)
{
BattleSystem.DelayInputAfter(
BattleSystem.instance.SkillRandomUseIenum(
this.BChar, // 発動者
triggerSkill, // 発動するスキル
false, false, false
)
);
}
}
}
自身がスキルを発動するたび
public class バフ名 : Buff, IP_SkillUseHand_Team
{
// 手札からスキルを使用したときに発動
public void SKillUseHand_Team(Skill skill)
{
// 発動者がこのバフの保持者本人でなければ無視
if (skill.Master != this.BChar)
return;
}
}
味方がスキルを〇枚使用する度
public class バフ名: Buff, IP_SkillUseHand_Team
{
private int skillUseCount = 0; // スキル使用回数カウント
private int UseCount = 0;
// スキル使用時の処理
public void SKillUseHand_Team(Skill skill)
{
// 自身以外の味方がスキルを使用したかを判定
if (skill.Master != this.BChar)
{
skillUseCount++;
// スキル使用回数が条件に達した場合の処理
if (skillUseCount >= 枚数)
{
if (UseCount < 枚数)
{
skillUseCount = 0;
UseCount++;
}
}
}
}
public override void BuffStat()
{
skillUseCount = 0;
UseCount = 0;
}
public override string DescExtended()
{
return base.DescExtended()
.Replace("&a", (枚数 - UseCount).ToString()); // 残り回数
}
}
このスキルを使用した時、追加で〇回発動する。
public override void SkillUseSingle(Skill SkillD, List Targets)
{
int extraCount = 回数;
// コルーチンで追加攻撃
BattleSystem.DelayInput(this.PlusAttackChain(Targets[0], extraCount));
}
public IEnumerator PlusAttackChain(BattleChar initialTarget, int count)
{
for (int i = 0; i < count; i++)
{
yield return new WaitForSecondsRealtime(0.3f);
Skill skill = Skill.TempSkill("スキル名", this.BChar, this.BChar.MyTeam);
if (this.BChar != null && !this.BChar.Dummy && !this.BChar.IsDead)
{
BattleChar target = initialTarget;
if (target == null || target.IsDead)
{
List enemies = BattleSystem.instance.EnemyList.Cast().ToList();
if (enemies.Count > 0)
{
target = enemies.Random(this.BChar.GetRandomClass().Main);
}
else
{
break; // 敵がいないなら終了
}
}
this.BChar.ParticleOut(this.MySkill, skill, target);
}
}
}
ランダム(範囲指定)回特定のスキルを自動発動させる。
public override void SkillUseSingle(Skill SkillD, List<BattleChar> Targets)
{
base.SkillUseSingle(SkillD, Targets);
int count = UnityEngine.Random.Range(最小, 最大);
if (count > 0)
{
BattleSystem.DelayInput(this.CastRandomSkill(count));
}
}
private IEnumerator CastRandomSkill(int count)
{
for (int i = 0; i < count; i++)
{
yield return new WaitForSecondsRealtime(0.3f);
Skill skill = Skill.TempSkill("スキル名①", this.BChar, this.BChar.MyTeam);
skill.NotCount = true; // 使用回数に含めない
skill.isExcept = true; // 除外扱い(コピー制御用)
skill.AutoDelete = 1; // 使い捨て
// ターゲット(ランダムな敵)
BattleChar enemy = null;
if (BattleSystem.instance.EnemyList.Count > 0)
{
enemy = BattleSystem.instance.EnemyList.Random(this.BChar.GetRandomClass().Main);
}
this.BChar.ParticleOut(skill, skill, enemy);
}
}
このスキルを引いた時自動で発動
public class スキル名 : Skill_Extended
{
public override IEnumerator DrawAction()
{
BattleSystem.DelayInput(BattleSystem.instance.SkillRandomUseIenum(BattleSystem.instance.AllyTeam.キャラクター名, this.MySkill, false, false, true));
return base.DrawAction();
}
}
マナやコスト関連の効果
マナを回復。
public override void SkillUseSingle(Skill SkillD, List<BattleChar> Targets)
{
BattleSystem.instance.AllyTeam.AP += 増加量;
}
マナを最大値まで回復。
public override void SkillUseSingle(Skill SkillD, List<BattleChar> Targets)
{
this.BChar.MyTeam.AP = this.BChar.MyTeam.MAXAP;
}
特定のスキル群を使用するたびにコスト減少。
private readonly HashSet<string> 特定スキル群 = new HashSet<string>
{
"スキル①", "スキル②", "スキル③"
};
private int costReduction = 0;
public override void Init()
{
base.Init();
this.costReduction = 0;
}
public override void FixedUpdate()
{
this.APChange = -this.costReduction;
}
public override void SkillUseSingle(Skill SkillD, List<BattleChar> Targets)
{
base.SkillUseSingle(SkillD, Targets);
this.costReduction = 0;
}
public void SkillUseTeam(Skill skill)
{
if (特定スキル群.Contains(skill.MySkill.KeyID))
{
this.costReduction++;
}
}
コスト減少(skill extended側)
public override void Init()
{
base.Init();
this.APChange = -数値;
}
マナが回復するたび効果を発動。
public class Buff名 : Buff, IP_APChanged
{
public void APChanged(int OldValue, int NewValue, bool NewTurnRecover)
{
if (!NewTurnRecover && NewValue > OldValue)
{
int diff = NewValue - OldValue;
for (int i = 0; i < diff; i++)
{
BattleSystem.DelayInput(this.AddStack());
}
}
}
private IEnumerator AddStack()
{
ここにしたいことを入力
yield break;
}
}
味方が瀕死になった時コストを0にする
public class スキル名 : Skill_Extended, IP_NearDeath
{
public override void Init()
{
base.Init();
this.UseNum = 0;
}
public override void FixedUpdate()
{
this.APChange = -this.UseNum;
}
public override void SkillUseSingle(Skill SkillD, List Targets)
{
this.UseNum = 0;
}
public void NearDeath(BattleAlly Ally)
{
if (Ally != null && Ally != this.BChar && Ally.Info.Ally == this.BChar.Info.Ally)
{
this.UseNum++;
}
}
public int UseNum;
}
}
バフ・デバフ関連の効果
対象のデバフをランダムに 1 つ解除する。
public override void SkillUseSingle(Skill SkillD, List<BattleChar> Targets)
{
base.SkillUseSingle(SkillD, Targets);
Buff debuff = Targets[0]
.GetBuffs(BattleChar.GETBUFFTYPE.ALLDEBUFF, true, false)
.Random(this.BChar.GetRandomClass().Main);
if (debuff != null)
{
debuff.SelfDestroy(false);
}
}
特定のバフを持つなら
if (BChar.BuffReturn("バフ名①", false) != null)
{
}
自身に特定のバフを付与する。
this.BChar.BuffAdd("バフ名①", this.BChar, false, 0, false, -1, false);
自身以外の味方全員に特定のバフを付与する。
foreach (BattleChar ally in this.BChar.MyTeam.AliveChars)
{
if (ally != this.BChar)
{
ally.BuffAdd("バフ名①", this.BChar, false, 0, false, -1, false);
}
}
特定のバフをリセットし、HPが最も高い敵に再付与。
int totalRemoved = 0;
// 敵のバフを減らして合計数を記録
foreach (BattleChar enemy in BattleSystem.instance.EnemyTeam.AliveChars)
{
Buff decode = enemy.BuffReturn("バフ名①", false);
if (decode != null && decode.StackNum > 1)
{
int removed = decode.StackNum - 1;
totalRemoved += removed;
while (decode.StackNum > 1)
decode.SelfStackDestroy();
}
}
// HPが最も高い敵を取得
BattleChar maxEnemy = BattleSystem.instance.EnemyTeam.AliveChars
.OrderByDescending(e => e.HP)
.FirstOrDefault();
// 減らしたバフの合計数を再付与
if (maxEnemy != null && totalRemoved > 0)
{
for (int i = 0; i < totalRemoved; i++)
{
maxEnemy.BuffAdd("バフ名①", this.BChar, false, 0, false, -1, false);
}
}
ターン終了時に自身のバフの数に応じて、特定のスキルを自動で使用する。
public class バフ名① : Buff, IP_TurnEnd
{
public void TurnEnd()
{
int count = this.BChar.GetBuffs(BattleChar.GETBUFFTYPE.BUFF, false, false).Count;
for (int i = 0; i < count; i++)
{
BattleSystem.DelayInputAfter(AutoUseSkill());
}
}
public IEnumerator AutoUseSkill()
{
Skill skill = Skill.TempSkill("スキル名①", BChar, BChar.MyTeam);
skill.isExcept = true;
skill.FreeUse = true;
skill.PlusHit = true;
// 実在する可能性の高いプロパティで高速化
skill.NoAttackTimeWait = true;
yield return BattleSystem.instance.SkillRandomUseIenum(
BChar,
skill,
true, // ランダムターゲット
true, // FreeUse
false // isCoolDownOff
);
}
}
ターン終了時、ランダムに選ばれた敵に順番にバフを付与する。
public class B_kasuteru_6 : Buff, IP_TurnEnd { public void TurnEnd() { // 敵キャラクターのリストを取得 List enemies = new List(BattleSystem.instance.EnemyList);
if (enemies.Count >= 1)
{
// ランダムに1体目を選び、バフを付与
BattleChar first = enemies.Random(this.BChar.GetRandomClass().Main);
first.BuffAdd("バフ名", this.BChar, false, 150, false, -1, false);
enemies.Remove(first); // 1体目を除外
if (enemies.Count >= 1)
{
// ランダムに2体目を選び、バフを付与
BattleChar second = enemies.Random(this.BChar.GetRandomClass().Main);
second.BuffAdd("バフ名", this.BChar, false, 150, false, -1, false);
}
}
}
相手が行動したとき、バフを付与し、このバフの継続ターンを1減らす。
public class バフ名 : Buff, IP_TargetedAlly
{
public override void Init()
{
base.Init();
}
public IEnumerator Targeted(BattleChar Attacker, List SaveTargets, Skill skill)
{
Attacker.BuffAdd(バフ名, Attacker, false, 0, false, -1, false);
// バフのターンを1減らす
this.TurnUpdate();
yield return new WaitForSeconds(0.2f);
}
}
自分のバフの残りターンを延長する。
public override void SkillUseSingle(Skill skill, List targets)
{
base.SkillUseSingle(skill, targets);
ExtendMyBuffs();
}
private void ExtendMyBuffs()
{
foreach (Buff buff in this.BChar.Buffs)
{
// 非表示バフ、デバフ、無限持続バフは対象外
if (buff.BuffData.Hide || buff.BuffData.Debuff || buff.BuffData.LifeTime == 0f)
continue;
foreach (StackBuff stack in buff.StackInfo)
{
if (stack.RemainTime > 0)
{
stack.RemainTime++;
}
}
}
}
死亡時に味方のうち最もHPが高いキャラクターに、バフをスタック数分付与する。
public class バフ名 : Buff, IP_Dead
{
// 味方リストから自分を除外したリストを作成
List list = new List(this.BChar.MyTeam.AliveChars);
list.Remove(this.BChar); // 自分を除外
if (list == null || list.Count == 0)
{
;
return;
}
// HPが最も高い味方を選択
BattleChar maxHpAlly = list.OrderByDescending(x => x.HP).First();
for (int i = 0; i < this.StackNum; i++)
{
int remainTime = (i < this.StackInfo.Count) ? this.StackInfo[i].RemainTime : -1;
Buff result = maxHpAlly.BuffAdd(
"B_herta_p",
this.Usestate_L,
false,
500,
false,
remainTime,
false
);
if (result != null);
else
;
}
}
}
自分のバフのスタックを消費して別のバフを付与
public override void SkillUseSingle(Skill SkillD, List Targets)
{
//numのリセット
int num = 0;
foreach (Buff buff in this.BChar.GetBuffs(BattleChar.GETBUFFTYPE.BUFF, false, false))
{
// バフ名① バフを持っているか確認
if (buff.GetType() == typeof(バフ名①))
{
// スタック数をnumに合計
num += buff.StackNum;
}
}
if (num > 0)
{
this.BChar.BuffRemove(バフ名①, false);
Targets[0].BuffAdd("バフ名②", this.BChar, false, 0, false, -1, false);
for (int i = 0; i < num - 1; i++)
{
this.BChar.BuffAdd("バフ名①", this.BChar, false, 0, false, -1, false);
}
}
}
アイテム・敵関連の効果
戦闘開始時に空きスロット分のアイテムを補充する。
public class P_キャラクター名 : Passive_Char, IP_BattleStart_UIOnBefore
{
public override void Init()
{
base.Init();
this.OnePassive = true;
}
// 戦闘開始時に空きスロット分のアイテムを補充
public void BattleStartUIOnBefore(BattleSystem Ins)
{
List inventory = PlayData.TSavedata.Inventory;
int emptySlots = inventory.Count(item => item == null);
for (int i = 0; i < emptySlots; i++)
{
ItemBase item = ItemBase.GetItem("アイテム");
ItemBase tempItem = item.Clone();
tempItem.IsBattleTempItem = true;
PartyInventory.InvenM.AddNewItem(tempItem);
}
}
}
敵が〇体なら
if (BattleSystem.instance.EnemyList.Count == 敵の数)
{
}
特定の敵をフィールドに召喚する。
public override void SkillUseSingle(Skill SkillD, List Targets)
{
// 召喚対象の敵リスト
List summonList = new List
{
"敵ID①"
};
foreach (string enemyKey in summonList)
{
// 敵をフィールドに召喚
BattleSystem.DelayInput(
BattleSystem.instance.NewEnemyAutoPos(enemyKey, null)
);
}
}
特定の敵が即座に戦闘不能になる。
public override void SkillUseSingle(Skill SkillD, List Targets)
{
base.SkillUseSingle(SkillD, Targets);
// 特定の敵を戦闘不能にする
List enemyList = BattleSystem.instance.EnemyTeam.AliveChars;
foreach (BattleChar enemy in enemyList)
{
if (enemy.Info.KeyData == "敵ID①" ||
enemy.Info.KeyData == "敵ID②" ||
enemy.Info.KeyData == "敵ID③")
{
try
{
enemy.Dead(false, false);
}
catch
{
;
}
}
}
ダメージ・回復関連の効果
スキル使用者に苦痛ダメージを与える。
public override void SkillUseSingle(Skill SkillD, List<BattleChar> Targets)
{
base.SkillUseSingle(SkillD, Targets);
this.BChar.Damage(this.BChar, ダメージ量, false, true, false, 0, false, false, false);
}
体力が1になるようにダメージを与える。
public override void SkillUseSingle(Skill SkillD, List Targets)
{
base.SkillUseSingle(SkillD, Targets);
if (Targets == null || Targets.Count == 0)
return;
BattleChar target = Targets[0];
if (target.HP > 1)
{
// 現在のHPから1残してダメージを与える
int damage = target.HP - 1;
target.Damage(this.BChar, damage, false, true, false, 0, false, false, false);
}
else
{
// HPが1以下の場合は何もしない
}
}
このスキルで与えたダメージと同量自身を回復する
public class スキル名:Skill_Extended, IP_DealDamage
{
public void DealDamage(BattleChar Take, int Damage, bool IsCri, bool IsDot)
{
if (Damage >= 1)
{
this.BChar.Heal(this.BChar, (float)((int)((float)Damage * 倍率)), false, false, null);
}
}
}
}
ダメージを受けたとき固定ダメージを与え効果を解除する。
public class バフ名① : Buff, IP_DamageTake
{
public override string DescExtended()
{
return base.DescExtended().Replace("&a", 枚数.ToString());
}
// ダメージを受けたとき
public void DamageTake(BattleChar User, int Dmg, bool Cri, ref bool resist, bool NODEF = false, bool NOEFFECT = false, BattleChar Target = null)
{
if (Dmg >= 枚数 && User.Info.Ally != this.BChar.Info.Ally && !NODEF)
{
User.Damage(this.BChar, 枚数, false, true, false, 0, false, false, false); // 相手に固定ダメージ
base.SelfDestroy(false); // 自身の効果を解除
}
}
}
ダメージを受けたとき追加で固定ダメージを与える
public class バフ名① : Buff, IP_DamageTake
{
public override string DescExtended()
{
return base.DescExtended().Replace("&a", 枚数.ToString());
}
// ダメージを受けたとき
public void DamageTake(BattleChar User, int Dmg, bool Cri, ref bool resist, bool NODEF = false, bool NOEFFECT = false, BattleChar Target = null)
{
if (Dmg >= 枚数 && User.Info.Ally != this.BChar.Info.Ally && !NODEF)
{
this.BChar.Damage(this.BChar, 枚数, false, true, false, 0, false, false, false); // 自身に固定ダメージ
}
}
}
ダメージを受けたとき
public class バフ名① : Buff, IP_DamageTake
{
// ダメージを受けたとき
public void DamageTake(BattleChar User, int Dmg, bool Cri, ref bool resist, bool NODEF = false, bool NOEFFECT = false, BattleChar Target = null)
{
if (Dmg > 0) // ダメージを受けた場合のみ
{
// ここに処理を記述
}
}
}
攻撃を受けるとカウントを減らし、別のバフを付与
public class バフ名① : Buff, IP_Hit
{
public override string DescExtended()
{
return base.DescExtended().Replace("&a", this.Num.ToString());
}
public void Hit(SkillParticle SP, int Dmg, bool Cri)
{
if (Dmg != 0 && this.Num > 0)
{
this.Num--;
this.BChar.BuffAdd("バフ名②", base.Usestate_L, false, 0, false, -1, false);
}
throw new NotImplementedException();
}
private int Num = 枚数;
}
攻撃が命中した対象にバフを付与する。
public class バフ名 : Buff, IP_SkillUse_Target
{
public void AttackEffect(BattleChar hit, SkillParticle SP, int DMG, bool Cri)
{
if (hit != null && hit.HP >= 1 && SP.SkillData.IsDamage)
{
// 対象にバフを2層付与
for (int i = 0; i < 枚数; i++)
{
var result = hit.BuffAdd("バフ名②", this.Usestate_F, false, 0, false, -1, false);
}
}
対象の敵を倒した場合や味方を瀕死にした場合
public override void SkillUseSingle(Skill SkillD, List Targets)
{
base.SkillUseSingle(SkillD, Targets);
}
public override void SkillUseSingleAfter(Skill SkillD, List Targets)
{
base.SkillUseSingleAfter(SkillD, Targets);
BattleSystem.DelayInputAfter(this.After(Targets));
}
public IEnumerator After(List Targets)
{
yield return new WaitForSecondsRealtime(0.1f); // 状態更新待機
BattleTeam myTeam = this.BChar.MyTeam;
foreach (BattleChar target in Targets)
{
bool isEnemy = target.MyTeam != myTeam;
bool isAlly = target.MyTeam == myTeam;
// 敵が死んだ場合 → スキルを手札に2枚追加
if (isEnemy && target.IsDead)
{
}
// 味方を瀕死にした場合 → 英雄カウント+1、スキルを手札に2枚追加
if (isAlly && target.HP <= 0)
{
}
}
yield return null;
}
HPが0以下になった時にバフを追加して死亡を防ぎ、HPを最大回復する。
public void HPChange(BattleChar Char, bool Healed)
{
if (Char.HP <= 0)
{
// バフ名 を追加
Char.BuffAdd(バフ名, Char, false, 0, false, -1, false);
// 死亡状態を解除
Char.IsDead = false;
// HPを最大まで回復
Char.Heal(Char, (float)Char.Info.get_stat.maxhp, true, false, null);
}
}
// Token: 0x06003387 RID: 13191 RVA: 0x00166EEF File Offset: 0x001650EF
public override void Init()
{
base.Init();
// 最大HPの増加を削除
}
}
その他スキル
戦闘開始時デッキの一番上に置く。
public override void BattleStartDeck(List Skills_Deck)
{
Skills_Deck.Remove(this.MySkill);
Skills_Deck.Insert(0, this.MySkill);
}
複数の効果から選択
public override void SkillUseSingle(Skill SkillD, List<BattleChar> Targets)
{
base.SkillUseSingle(SkillD, Targets);
List<Skill> candidateSkills = new List<Skill>();
Skill option1 = Skill.TempSkill("スキル①", this.BChar, this.BChar.MyTeam);
if (option1 != null) candidateSkills.Add(option1);
Skill option2 = Skill.TempSkill("スキル②", this.BChar, this.BChar.MyTeam);
if (option2 != null) candidateSkills.Add(option2);
if (candidateSkills.Count > 0)
{
BattleSystem.instance.EffectDelays.Enqueue(
BattleSystem.I_OtherSkillSelect(
candidateSkills,
new SkillButton.SkillClickDel(this.OnMainChoiceSelected),
ScriptLocalization.System_SkillSelect.DrawSkill,
false, true, true, false, true
)
);
}
}
private void OnMainChoiceSelected(SkillButton button)
{
Skill chosen = button.Myskill;
if (chosen == null) return;
if (chosen.MySkill.KeyID == "スキル①")
{
// 効果①
}
else if (chosen.MySkill.KeyID == "スキル②")
{
// 効果②
}
}
特定の条件でのみ発動可能。
public override bool Terms()
{
// ここに条件を指定
}
デッキの特定のスキル群のダメージを+〇。
private readonly HashSet<string> tokenList = new HashSet<string>
{
"スキル名①",
"スキル名②",
"スキル名③",
// ...(多数のスキルIDを定義)
};
public override void SkillUseSingle(Skill SkillD, List<BattleChar> Targets)
{
base.SkillUseSingle(SkillD, Targets);
// デッキ内の対象スキルを強化
foreach (Skill skill in this.BChar.MyTeam.Skills_Deck)
{
if (tokenList.Contains(skill.MySkill.KeyID))
{
var ext = skill.ExtendedFind<強化用拡張>();
if (ext != null)
{
ext.BonusDamage += 数値; // 累積強化
ext.SkillBasePlus.Target_BaseDMG = ext.BonusDamage;
}
else
{
var newExt = new 強化用拡張();
skill.ExtendedAdd_Battle(newExt);
}
}
}
}
public class強化用拡張 : Skill_Extended
{
// 強化値を保持するフィールド
public int BonusDamage = 数値;
public override void Init()
{
base.Init();
this.SkillBasePlus.Target_BaseDMG = BonusDamage;
}
// スキル説明文に &a を置換して追加ダメージを表示
public override string DescExtended(string desc)
{
// desc は元々のスキル説明文
return base.DescExtended(desc).Replace("&a", BonusDamage.ToString());
}
}
}
味方の使用済みスキルをデッキに戻し、オーバーチャージをリセット
public override void SkillUseSingle(Skill SkillD, List Targets)
{
base.SkillUseSingle(SkillD, Targets);
BattleSystem.DelayInput(Effect(Targets));
}
private IEnumerator Effect(List Targets)
{
// 特定キャラクターの使用済みスキルをデッキに戻す
List targetSkills = BattleSystem.instance.AllyTeam.Skills_UsedDeck
.Where(s => s.Master != null && s.Master.Info.KeyData == "キャラクター名①")
.ToList();
foreach (Skill skill in targetSkills)
{
yield return BattleSystem.instance.StartCoroutine(
BattleSystem.instance.AllyTeam._UsedDeckToDeck(skill)
);
}
// 対象キャラクターの使用済みスキルをデッキに戻し、オーバーチャージ解除
foreach (BattleChar target in Targets)
{
if (target == null) continue;
List targetCharSkills = BattleSystem.instance.AllyTeam.Skills_UsedDeck
.Where(s => s.Master == target)
.ToList();
foreach (Skill skill in targetCharSkills)
{
yield return BattleSystem.instance.StartCoroutine(
BattleSystem.instance.AllyTeam._UsedDeckToDeck(skill)
);
}
target.Overload = 0;
}
// 自身のオーバーチャージ解除
if (this.BChar != null)
{
this.BChar.Overload = 0;
}
yield break;
}
自身の持つスキルをデッキからすべて除外する。
base.SkillUseSingle(SkillD, Targets);
// デッキから対象キャラクターのスキルをすべて除外
for (int i = 0; i < this.BChar.MyTeam.Skills_Deck.Count; i++)
{
if (this.BChar.MyTeam.Skills_Deck[i].Master == this.BChar)
{
this.BChar.MyTeam.Skills_Deck.RemoveAt(i);
i--; // インデックス調整
}
}
// 使用済みデッキからも対象キャラクターのスキルを除外
for (int i = 0; i < this.BChar.MyTeam.Skills_UsedDeck.Count; i++)
{
if (this.BChar.MyTeam.Skills_UsedDeck[i].Master == this.BChar)
{
this.BChar.MyTeam.Skills_UsedDeck.RemoveAt(i);
i--;
}
}
public class kari : Skill_Extended
{
private int initialApCost = -1; // 最初に見たときのAP(元コスト)
private int currentBaseCost = -1; // 外部軽減後のコスト
private int lastKnownAp = -1;
private bool costAdjusted = false;
private int reducedCost = 5;
private int lastKnownBaseCost = -1; // 追加
public override void Init()
{
base.Init();
this.BattleExtended = true;
this.OnePassive = true;
this.NotCount = false;
}
public override void HandInit()
{
base.HandInit();
// 外部軽減の影響が出る前に取得されることを期待して初期APを保存
if (initialApCost < 0)
{
initialApCost = MySkill.AP;
currentBaseCost = MySkill.AP;
Debug.Log($"[kari] initialApCost saved: {initialApCost}");
}
BattleSystem.instance.StartCoroutine(ApMonitorLoop());
}
private IEnumerator ApMonitorLoop()
{
while (true)
{
if (BattleSystem.instance?.AllyTeam != null)
{
int currentAp = BattleSystem.instance.AllyTeam.AP;
int externalBaseCost = MySkill.AP - APChange;
bool apChanged = currentAp != lastKnownAp;
bool baseCostChanged = externalBaseCost != lastKnownBaseCost;
if (apChanged || baseCostChanged)
{
lastKnownAp = currentAp;
lastKnownBaseCost = externalBaseCost;
if (baseCostChanged)
{
Debug.Log($"[kari] Detected external cost change: {currentBaseCost} → {externalBaseCost}");
currentBaseCost = externalBaseCost;
if (costAdjusted)
{
APChange = reducedCost - currentBaseCost;
Debug.Log($"[kari] Recalculated APChange due to external cost change: APChange={APChange}");
}
}
// ここで一元的に処理
AdjustApCost();
}
}
yield return new WaitForSeconds(0.1f);
}
}
private void AdjustApCost()
{
if (MySkill == null || BattleSystem.instance?.AllyTeam == null)
return;
int currentAp = BattleSystem.instance.AllyTeam.AP;
int effectiveCost = currentBaseCost + APChange;
Debug.Log($"[kari] AdjustApCost called: currentAp={currentAp}, effectiveCost={effectiveCost}, initialApCost={initialApCost}, APChange={APChange}, costAdjusted={costAdjusted}, currentBaseCost={currentBaseCost}");
if (costAdjusted)
{
if (currentAp >= currentBaseCost)
{
APChange = 0;
costAdjusted = false;
NotCount = false;
Debug.Log("[kari] AP sufficient. Cost reverted to original. NotCount disabled.");
}
else
{
NotCount = true;
Debug.Log("[kari] Still insufficient AP. Keeping reduced cost.");
}
}
else
{
if (currentAp < currentBaseCost)
{
APChange = reducedCost - currentBaseCost;
costAdjusted = true;
NotCount = true;
Debug.Log("[kari] AP insufficient. Cost reduced. NotCount enabled.");
}
else
{
APChange = 0;
NotCount = false;
}
}
}
public override void SkillUseSingle(Skill SkillD, List Targets)
{
if (costAdjusted)
{
// 軽減されたコストで使用された場合の効果
}
else
{
// 通常コストで使用された場合の効果
}
}
public override void DiscardSingle(bool Click)
{
base.DiscardSingle(Click);
APChange = 0;
costAdjusted = false;
NotCount = false;
}
}
}
その他バフ
ターン開始時
public class B_ バフid: Buff, IP_PlayerTurn
public void Turn()
{
}
}
回数制限つきのバフ
// 回数制限を持つバフの基本形
public class Buff名 : Buff
{
private int remainCount = 数値; // 残り回数
public override string DescExtended()
{
// 説明文に残り回数を反映
return base.DescExtended().Replace("&a", this.remainCount.ToString());
}
// 条件を満たした時に呼ばれる処理
public void TriggerEffect()
{
if (this.remainCount > 0)
{
// 効果処理を書く
// 残り回数を減らす
this.remainCount--;
if (this.remainCount <= 0)
this.SelfDestroy();
}
}
}
クリックして発動
public override void BuffOneAwake()
{
base.BuffOneAwake();
if (this.BuffIcon == null)
{
return;
}
Button button = this.BuffIcon.AddComponent
ターン1効果を持つバフ
public class B_:Buff, IP_SkillUseHand_Team, IP_TurnEnd
{
private bool usedThisTurn = false;
public void SKillUseHand_Team(Skill skill)
{
if (this.usedThisTurn)
return;
this.usedThisTurn = true;
}
public void TurnEnd()
{
// ターン終了時にリセット
this.usedThisTurn = false;
}
}
}
ステータスバフ・デバフ
バフの書き方
public override void BuffStat()
{
this.PlusStat.(変数)= 数値f;
this.StackNum;
}
}
PlusStat.atk // 攻撃力増加
PlusStat.hit // 命中率増加
PlusPerStat.Heal // 治癒力増加
PlusStat.cri // クリティカル率増減
PlusStat.dod // 回避率増減
PlusStat.def // 防御力増加
PlusPerStat.MaxHP // 最大体力増加
PlusStat.HEALTaken // 被回復量増加
PlusStat.PlusCriDmg // クリティカルダメージ増加
PlusStat.PlusCriHeal // クリティカル回復増加
PlusStat.HIT_CC // 妨害成功率増加
PlusStat.RES_DOT // 苦痛レジスト増減
PlusSkillStat.Penetration // 防御無視
PlusStat.crihit // 被クリティカル率増減
PlusPerStat.Damage // 攻撃力(永続)
PlusPerStat.Heal // 治癒力(永続)
PlusPerStat.MaxHP // HP(永続)