public static QuquBattler Create(Item item) { var colorId = item[2002]; var partId = item[2003]; QuquBattler result = new QuquBattler { Status = BattlerStatus.存活, Hp = QuquSystem.instance.GetData(colorId, partId, 11), MaxHp = QuquSystem.instance.GetData(colorId, partId, 11), Sp = QuquSystem.instance.GetData(colorId, partId, 12), MaxSp = QuquSystem.instance.GetData(colorId, partId, 12), Level = item.Get <int>(8), ColorId = item.Get <int>(2002), PartId = item.Get <int>(2003), 气势 = QuquSystem.instance.GetData(colorId, partId, 21), 角力 = QuquSystem.instance.GetData(colorId, partId, 22), 牙钳 = QuquSystem.instance.GetData(colorId, partId, 23), 暴击率 = QuquSystem.instance.GetData(colorId, partId, 31), 暴击增伤 = QuquSystem.instance.GetData(colorId, partId, 32), 击伤调整 = QuquSystem.instance.GetData(colorId, partId, 36), 格挡率 = QuquSystem.instance.GetData(colorId, partId, 33), 格挡数值 = QuquSystem.instance.GetData(colorId, partId, 34), 反击率 = QuquSystem.instance.GetData(colorId, partId, 35), Durability = item.Get <int>(901), MaxDurability = item.Get <int>(902), Name = QuquSystem.instance.GetName(colorId, partId), }; return(result); }
public QuquBattler MakeOne(int colorId, int partId) { int maxHp = GetData(colorId, partId, 1) + GetData(colorId, partId, 11) / 20; maxHp += Random.Range(-(maxHp * 35 / 100), maxHp * 35 / 100 + 1); var item = new Item { [2002] = colorId, [2003] = partId, [902] = maxHp, [901] = maxHp, [2007] = GetData(colorId, partId, 98) * Random.Range(0, 21) / 100, }; var battler = QuquBattler.Create(item); for (int i = 0; i < Mathf.Min(3, maxHp - 1); i++) { if (Random.Range(0, 100) < 10) { battler.GetDamage(QuquBattler.DamageTyp.耐力, 1); battler.GetDamage(QuquBattler.DamageTyp.属性); } } return(battler); }
private void SetDamage(QuquBattler battler, QuquBattler.DamageTyp typ, int value = 0) { var change = battler.GetDamage(typ, value); if (showDetail && typ != QuquBattler.DamageTyp.属性) { detail += $" {battler.Name} {typ}: {change[0]}>>{change[1]}\n"; } }
private void 普攻(bool 我方先手) { bool 我方进攻 = 我方先手; for (int i = 0; i < 2; i++) { Count[1]++; if (showDetail) { detail += $" 进攻{Count[1]}\n"; } QuquBattler 进攻者 = battlers[我方进攻 ? 0 : 1]; QuquBattler 防守者 = battlers[我方进攻 ? 1 : 0]; bool 触发暴击 = false; bool 触发格挡 = false; bool 触发反击 = false; int 伤害 = 进攻者.牙钳; if (Random.Range(0, 100) < 进攻者.暴击率) { 触发暴击 = true; 伤害 += 进攻者.暴击增伤; } if (Random.Range(0, 100) < 防守者.格挡率) { 触发格挡 = true; 伤害 = Mathf.Max(0, 伤害 - 防守者.格挡数值); } 触发反击 = (Random.Range(0, 100) < 防守者.反击率); if (斗(我方进攻, !我方进攻, 伤害, 触发暴击, 触发格挡, 触发反击)) { i = 0; //如果有过反击,则一定还有半轮 } if (进攻者.IsDead || 防守者.IsDead) { return; } 我方进攻 = !我方进攻; //交换半场 } }
private bool 斗(bool 进攻方, bool 受伤方, int 耐力伤害, bool 触发暴击, bool 触发格挡, bool 触发反击, bool 是反击 = false, int 反击计数 = 0) { while (true) { Count[2]++; QuquBattler 伤害来源 = battlers[受伤方 ? 1 : 0]; QuquBattler 受伤者 = battlers[受伤方 ? 0 : 1]; int 斗性伤害 = 0; if (触发暴击 | 是反击) { 斗性伤害 = 伤害来源.气势; } if (触发格挡) { 斗性伤害 = Mathf.Max(0, 斗性伤害 - 受伤者.格挡数值); } else if (触发暴击) { int 击伤率 = 伤害来源.暴击率 + 伤害来源.击伤调整; if (Random.Range(0, 100) < 击伤率) { SetDamage(受伤者, QuquBattler.DamageTyp.耐久, 1); if (Random.Range(0, 100) < 击伤率) { SetDamage(受伤者, QuquBattler.DamageTyp.属性); } } } SetDamage(受伤者, QuquBattler.DamageTyp.耐力, 耐力伤害); if (斗性伤害 > 0) { SetDamage(受伤者, QuquBattler.DamageTyp.斗性, 斗性伤害); } if (受伤者.IsDead || !触发反击) { return(是反击); //若本次不触发反击,缠斗结束 } //下一次攻击的反击判定 bool 反击将触发暴击 = false; bool 反击将触发格挡 = false; int 反击伤害 = 进攻方 != 受伤方 ? 受伤者.角力 : 受伤者.牙钳; if (Random.Range(0, 100) < 受伤者.暴击率) { 反击将触发暴击 = true; 反击伤害 += 受伤者.暴击增伤; } if (Random.Range(0, 100) < 伤害来源.格挡率) { 反击将触发格挡 = true; 反击伤害 = Mathf.Max(0, 反击伤害 - 伤害来源.格挡数值); } bool 反击将触发反击 = false; int 反击概率 = 伤害来源.反击率 - 反击计数 * 反击衰减; if (Random.Range(0, 100) < 反击概率) { 反击将触发反击 = true; } 受伤方 = !受伤方; 耐力伤害 = 反击伤害; 触发暴击 = 反击将触发暴击; 触发格挡 = 反击将触发格挡; 触发反击 = 反击将触发反击; 是反击 = true; 反击计数++; } }