1
This commit is contained in:
@@ -7,17 +7,30 @@ using UnityEngine;
|
||||
/// </summary>
|
||||
public class DataAttribute {
|
||||
/// <summary> 力量(strength) </summary>
|
||||
public int Str;
|
||||
public virtual int Str { get; set; }
|
||||
/// <summary> 敏捷(dexterity) </summary>
|
||||
public int Dex;
|
||||
public virtual int Dex { get; set; }
|
||||
/// <summary> 体质(constitution) </summary>
|
||||
public int Con;
|
||||
public virtual int Con { get; set; }
|
||||
/// <summary> 智力(intelligence) </summary>
|
||||
public int Int;
|
||||
public virtual int Int { get; set; }
|
||||
/// <summary> 感知(wisdom) </summary>
|
||||
public int Wis;
|
||||
public virtual int Wis { get; set; }
|
||||
/// <summary> 魅力(charisma) </summary>
|
||||
public int Cha;
|
||||
public virtual int Cha { get; set; }
|
||||
|
||||
/// <summary> 力量调整值(strength) </summary>
|
||||
public int StrModifier => Modifier(Str);
|
||||
/// <summary> 敏捷调整值(dexterity) </summary>
|
||||
public int DexModifier => Modifier(Dex);
|
||||
/// <summary> 体质调整值(constitution) </summary>
|
||||
public int ConModifier => Modifier(Con);
|
||||
/// <summary> 智力调整值(intelligence) </summary>
|
||||
public int IntModifier => Modifier(Int);
|
||||
/// <summary> 感知调整值(wisdom) </summary>
|
||||
public int WisModifier => Modifier(Wis);
|
||||
/// <summary> 魅力调整值(charisma) </summary>
|
||||
public int ChaModifier => Modifier(Cha);
|
||||
|
||||
/// <summary> 创建初始属性 </summary>
|
||||
public static DataAttribute Initial() {
|
||||
|
||||
@@ -8,60 +8,49 @@ using UnityEngine;
|
||||
public class DataCharacter : DataAttribute {
|
||||
/// <summary> 角色名字 </summary>
|
||||
public string name;
|
||||
/// <summary> 战斗等级 </summary>
|
||||
public int level = 0;
|
||||
/// <summary> 护甲等级 </summary>
|
||||
public int armorClass = 0;
|
||||
/// <summary> 经验点 </summary>
|
||||
public Vector2Int expPoint;
|
||||
/// <summary> 生命点 </summary>
|
||||
public Vector2Int hitPoint;
|
||||
|
||||
/// <summary> 基础属性 </summary>
|
||||
public DataAttribute basic = Initial();
|
||||
public int expPoint;
|
||||
/// <summary> 种族 </summary>
|
||||
public DataRace race = DataRace.None();
|
||||
public DataRace race;
|
||||
/// <summary> 属性 </summary>
|
||||
public DataAttribute basis;
|
||||
/// <summary> 职业 </summary>
|
||||
public DataProfession profession;
|
||||
/// <summary> 装备栏 </summary>
|
||||
public DataEquipmentSlot equipmentSlot = new DataEquipmentSlot();
|
||||
public DataEquipmentSlot equipmentSlot;
|
||||
|
||||
/// <summary> 力量调整值(strength) </summary>
|
||||
public int StrModifier => Modifier(Str);
|
||||
/// <summary> 敏捷调整值(dexterity) </summary>
|
||||
public int DexModifier => Modifier(Dex);
|
||||
/// <summary> 体质调整值(constitution) </summary>
|
||||
public int ConModifier => Modifier(Con);
|
||||
/// <summary> 智力调整值(intelligence) </summary>
|
||||
public int IntModifier => Modifier(Int);
|
||||
/// <summary> 感知调整值(wisdom) </summary>
|
||||
public int WisModifier => Modifier(Wis);
|
||||
/// <summary> 魅力调整值(charisma) </summary>
|
||||
public int ChaModifier => Modifier(Cha);
|
||||
/// <summary> 战斗等级 </summary>
|
||||
public int Level => GetLevel();
|
||||
/// <summary> 生命点 </summary>
|
||||
public int HitPoint => GetHitPoint();
|
||||
/// <summary> 护甲等级 </summary>
|
||||
public int ArmorClass => GetArmorClass();
|
||||
|
||||
public DataCharacter() {
|
||||
profession = DataProfession.None(this);
|
||||
public override int Str { get => basis.Str + race.Str; }
|
||||
public override int Dex { get => basis.Dex + race.Dex; }
|
||||
public override int Con { get => basis.Con + race.Con; }
|
||||
public override int Int { get => basis.Int + race.Int; }
|
||||
public override int Wis { get => basis.Wis + race.Wis; }
|
||||
public override int Cha { get => basis.Cha + race.Cha; }
|
||||
|
||||
/// <summary> 设置职业 </summary>
|
||||
public void Settings(DataRace race) {
|
||||
this.race = race;
|
||||
}
|
||||
/// <summary> 更新角色状态 </summary>
|
||||
public void Update() {
|
||||
UpdateAttribute();
|
||||
// 战斗等级
|
||||
level = profession.level;
|
||||
// 护甲等级
|
||||
armorClass = GetArmorClass();
|
||||
// 升级经验 = 100 * 3^level
|
||||
expPoint.y = 100 * (int)Mathf.Pow(3, level);
|
||||
// 最大生命值
|
||||
hitPoint.y = profession.HitPoint();
|
||||
/// <summary> 设置职业 </summary>
|
||||
public void Settings(DataProfession profession) {
|
||||
this.profession = profession;
|
||||
profession.character = this;
|
||||
}
|
||||
/// <summary> 更新角色属性 </summary>
|
||||
public void UpdateAttribute() {
|
||||
// 更新属性
|
||||
Cover(basic);
|
||||
// 添加种族属性
|
||||
if (race != null) { Add(race); }
|
||||
// 添加职业属性
|
||||
if (profession != null) { Add(profession); }
|
||||
/// <summary> 战斗等级 </summary>
|
||||
public int GetLevel() {
|
||||
// TODO:需要补充多职业的等级总和
|
||||
return profession.level;
|
||||
}
|
||||
/// <summary> 生命点 </summary>
|
||||
public int GetHitPoint() {
|
||||
// TODO:需要补充多职业的生命值加成
|
||||
return profession.HitPoint();
|
||||
}
|
||||
/// <summary> 计算护甲等级(AC) </summary>
|
||||
public int GetArmorClass() {
|
||||
@@ -69,9 +58,32 @@ public class DataCharacter : DataAttribute {
|
||||
return equipmentSlot.GetArmorClass(DexModifier);
|
||||
}
|
||||
|
||||
/// <summary> 创建默认角色 </summary>
|
||||
public static DataCharacter Create(string name) {
|
||||
DataCharacter character = new DataCharacter();
|
||||
character.name = name;
|
||||
character.race = DataRace.None();
|
||||
character.basis = Initial();
|
||||
character.profession = DataProfession.None();
|
||||
character.profession.Initial(character);
|
||||
character.equipmentSlot = new DataEquipmentSlot();
|
||||
return character;
|
||||
}
|
||||
/// <summary> 创建默认角色 </summary>
|
||||
public static DataCharacter Create(string name, DataRace race, DataProfession profession) {
|
||||
DataCharacter character = new DataCharacter();
|
||||
character.name = name;
|
||||
character.race = race;
|
||||
character.basis = Initial();
|
||||
character.profession = profession;
|
||||
character.profession.Initial(character);
|
||||
character.equipmentSlot = new DataEquipmentSlot();
|
||||
return character;
|
||||
}
|
||||
|
||||
// 打印角色卡
|
||||
public void PrintCharacterSheet() {
|
||||
Debug.Log($"=== {name} LV{level} ===");
|
||||
Debug.Log($"=== {name} LV{Level} ===");
|
||||
Debug.Log($"种族: {race.name}");
|
||||
Debug.Log($"职业: {profession.name}");
|
||||
Debug.Log($"力量: {Str} ({StrModifier.ToString("+#;-#;+0")})");
|
||||
@@ -81,7 +93,7 @@ public class DataCharacter : DataAttribute {
|
||||
Debug.Log($"感知: {Wis} ({WisModifier.ToString("+#;-#;+0")})");
|
||||
Debug.Log($"魅力: {Cha} ({ChaModifier.ToString("+#;-#;+0")})");
|
||||
Debug.Log($"经验值: {expPoint}");
|
||||
Debug.Log($"生命值: {hitPoint}");
|
||||
Debug.Log($"护甲等级: {armorClass})");
|
||||
Debug.Log($"生命值: {HitPoint}");
|
||||
Debug.Log($"护甲等级: {ArmorClass})");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,33 +6,34 @@ using UnityEngine;
|
||||
/// <summary>
|
||||
/// 职业 - 数据
|
||||
/// </summary>
|
||||
public class DataProfession : DataAttribute {
|
||||
/// <summary> 绑定角色 </summary>
|
||||
public readonly DataCharacter character;
|
||||
public class DataProfession {
|
||||
/// <summary> 职业名称 </summary>
|
||||
public readonly string name;
|
||||
/// <summary> 生命骰子 </summary>
|
||||
public readonly int hitDice = 0;
|
||||
/// <summary> 角色 </summary>
|
||||
public DataCharacter character;
|
||||
/// <summary> 职业等级 </summary>
|
||||
public int level = 0;
|
||||
/// <summary> 累计生命点 </summary>
|
||||
public List<int> hitPoints = new List<int>();
|
||||
|
||||
public DataProfession(DataCharacter character, string name, int hitDice) {
|
||||
this.character = character;
|
||||
public DataProfession(string name, int hitDice) {
|
||||
this.name = name;
|
||||
this.hitDice = hitDice;
|
||||
|
||||
character.UpdateAttribute();
|
||||
}
|
||||
/// <summary> 初始:满生命骰子 + 体质调整值 </summary>
|
||||
public void Initial(DataCharacter character) {
|
||||
this.character = character;
|
||||
level = 1;
|
||||
// 初始生命 =
|
||||
hitPoints = new List<int>();
|
||||
// 初始生命 = 满生命骰子 + 体质调整值
|
||||
hitPoints.Add(hitDice + character.ConModifier);
|
||||
}
|
||||
/// <summary> 升级:骰生命骰子+体质调整值 </summary>
|
||||
public void Upgrade(int modifier) {
|
||||
/// <summary> 升级:骰生命骰子 + 体质调整值 </summary>
|
||||
public void Upgrade() {
|
||||
level++;
|
||||
int hitPoint = Dice.Roll(hitDice) + modifier;
|
||||
int hitPoint = Dice.Roll(hitDice) + character.ConModifier;
|
||||
hitPoints.Add(hitPoint);
|
||||
}
|
||||
/// <summary> 生命点:每级生命点总和 </summary>
|
||||
@@ -41,37 +42,37 @@ public class DataProfession : DataAttribute {
|
||||
}
|
||||
|
||||
/// <summary> 无职业 1d4 </summary>
|
||||
public static DataProfession None(DataCharacter character) {
|
||||
return new DataProfession(character, "无", 4);
|
||||
public static DataProfession None() {
|
||||
return new DataProfession("无", 4);
|
||||
}
|
||||
/// <summary> 随机职业 </summary>
|
||||
public static DataProfession Random(DataCharacter character) {
|
||||
public static DataProfession Random() {
|
||||
int index = Dice.Roll(5);
|
||||
if (index == 1) { return Warrior(character); }
|
||||
if (index == 2) { return Wizard(character); }
|
||||
if (index == 3) { return Cleric(character); }
|
||||
if (index == 4) { return Ranger(character); }
|
||||
if (index == 5) { return Chanter(character); }
|
||||
return None(character);
|
||||
if (index == 1) { return Warrior(); }
|
||||
if (index == 2) { return Wizard(); }
|
||||
if (index == 3) { return Cleric(); }
|
||||
if (index == 4) { return Ranger(); }
|
||||
if (index == 5) { return Chanter(); }
|
||||
return None();
|
||||
}
|
||||
/// <summary> 战士 1d10 </summary>
|
||||
public static DataProfession Warrior(DataCharacter character) {
|
||||
return new DataProfession(character, "战士", 10);
|
||||
public static DataProfession Warrior() {
|
||||
return new DataProfession("战士", 10);
|
||||
}
|
||||
/// <summary> 法师 1d6 </summary>
|
||||
public static DataProfession Wizard(DataCharacter character) {
|
||||
return new DataProfession(character, "法师", 6);
|
||||
public static DataProfession Wizard() {
|
||||
return new DataProfession("法师", 6);
|
||||
}
|
||||
/// <summary> 牧师 1d8 </summary>
|
||||
public static DataProfession Cleric(DataCharacter character) {
|
||||
return new DataProfession(character, "牧师", 8);
|
||||
public static DataProfession Cleric() {
|
||||
return new DataProfession("牧师", 8);
|
||||
}
|
||||
/// <summary> 游侠 1d8 </summary>
|
||||
public static DataProfession Ranger(DataCharacter character) {
|
||||
return new DataProfession(character, "游侠", 8);
|
||||
public static DataProfession Ranger() {
|
||||
return new DataProfession("游侠", 8);
|
||||
}
|
||||
/// <summary> 歌者 1d6 </summary>
|
||||
public static DataProfession Chanter(DataCharacter character) {
|
||||
return new DataProfession(character, "歌者", 6);
|
||||
public static DataProfession Chanter() {
|
||||
return new DataProfession("歌者", 6);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
/// <summary>
|
||||
/// 战斗角色
|
||||
/// </summary>
|
||||
public class BattleCharacter : DataAttribute {
|
||||
/// <summary> 角色数据 </summary>
|
||||
public readonly DataCharacter character;
|
||||
|
||||
/// <summary> 角色名字 </summary>
|
||||
public string name;
|
||||
/// <summary> 战斗等级 </summary>
|
||||
public int level;
|
||||
/// <summary> 生命点 </summary>
|
||||
public int hitPoint;
|
||||
/// <summary> 护甲等级 </summary>
|
||||
public int armorClass;
|
||||
/// <summary> 先攻顺序 </summary>
|
||||
public int sequence;
|
||||
|
||||
public BattleCharacter(DataCharacter character) {
|
||||
this.character = character;
|
||||
Cover(character);
|
||||
name = character.name;
|
||||
level = character.Level;
|
||||
hitPoint = character.HitPoint;
|
||||
armorClass = character.ArmorClass;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b4cb406221da1364f97a333bf1e3442c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,40 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
/// <summary>
|
||||
/// 战斗队列
|
||||
/// </summary>
|
||||
public class BattleQueue {
|
||||
/// <summary> 执行队列 </summary>
|
||||
public Queue<BattleCharacter> queue = new Queue<BattleCharacter>();
|
||||
/// <summary> 战斗合集 </summary>
|
||||
public List<BattleCharacter> characters = new List<BattleCharacter>();
|
||||
|
||||
/// <summary> 添加角色 </summary>
|
||||
public void Add(List<BattleCharacter> list) {
|
||||
characters.AddRange(list);
|
||||
}
|
||||
/// <summary> 添加角色 </summary>
|
||||
public void Add(BattleCharacter character) {
|
||||
characters.Add(character);
|
||||
}
|
||||
/// <summary> 先攻:d20 + 敏捷调整值 </summary>
|
||||
public void Sequence() {
|
||||
characters.ForEach(obj => obj.sequence = Dice.Roll20(obj.DexModifier));
|
||||
}
|
||||
/// <summary> 排序:大到小 </summary>
|
||||
public void OrderByDescending() {
|
||||
characters = characters.OrderByDescending(c => c.sequence).ToList();
|
||||
}
|
||||
/// <summary> 回合 </summary>
|
||||
public void Reset() {
|
||||
queue = new Queue<BattleCharacter>(characters);
|
||||
}
|
||||
/// <summary> 当前行动者 </summary>
|
||||
public bool Current(out BattleCharacter battle) {
|
||||
battle = queue.Count > 0 ? queue.Dequeue() : null;
|
||||
return battle != null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ed7fc5b50e619ea4a8eaf9d71dc0ec9d
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,5 +1,8 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using Palmmedia.ReportGenerator.Core;
|
||||
using Unity.VisualScripting;
|
||||
using UnityEngine;
|
||||
|
||||
/// <summary>
|
||||
@@ -31,7 +34,73 @@ public class BattleSimulator {
|
||||
|
||||
// 哥布林射手死亡
|
||||
|
||||
public BattleSimulator() {
|
||||
/// <summary> 回合计数 </summary>
|
||||
public int roundCount;
|
||||
/// <summary> 行动间隔 </summary>
|
||||
public float interval;
|
||||
/// <summary> 最大间隔 </summary>
|
||||
public float maxInterval = 1f;
|
||||
/// <summary> 当前行动 </summary>
|
||||
public Action currentAction;
|
||||
/// <summary> 队伍1 </summary>
|
||||
public BattleTeam team1;
|
||||
/// <summary> 队伍2 </summary>
|
||||
public BattleTeam team2;
|
||||
/// <summary> 战斗队列 </summary>
|
||||
public BattleQueue battleQueue = new BattleQueue();
|
||||
|
||||
public BattleSimulator(List<DataCharacter> cha1, List<DataCharacter> cha2) {
|
||||
List<BattleCharacter> bCha1 = new List<BattleCharacter>();
|
||||
cha1.ForEach(obj => bCha1.Add(new BattleCharacter(obj)));
|
||||
List<BattleCharacter> bCha2 = new List<BattleCharacter>();
|
||||
cha2.ForEach(obj => bCha2.Add(new BattleCharacter(obj)));
|
||||
|
||||
team1 = new BattleTeam(bCha1);
|
||||
team2 = new BattleTeam(bCha2);
|
||||
|
||||
battleQueue.Add(bCha1);
|
||||
battleQueue.Add(bCha2);
|
||||
battleQueue.Sequence();
|
||||
battleQueue.OrderByDescending();
|
||||
|
||||
currentAction = UpdateRound;
|
||||
}
|
||||
public void Update() {
|
||||
if (interval > 0) { interval -= Time.deltaTime; return; }
|
||||
currentAction?.Invoke();
|
||||
}
|
||||
|
||||
/// <summary> 更新回合 </summary>
|
||||
public void UpdateRound() {
|
||||
roundCount++;
|
||||
battleQueue.Reset();
|
||||
Debug.Log($"正式回合 {roundCount}");
|
||||
|
||||
interval = maxInterval;
|
||||
currentAction = SelectActionTarget;
|
||||
}
|
||||
/// <summary> 选择行动对象 </summary>
|
||||
public void SelectActionTarget() {
|
||||
if (!battleQueue.Current(out BattleCharacter character)) {
|
||||
currentAction = UpdateRound; return;
|
||||
}
|
||||
Debug.Log($"当前 {character.name}({character.sequence}) 行动");
|
||||
|
||||
interval = maxInterval;
|
||||
currentAction = SelectActionTarget;
|
||||
}
|
||||
public void SelectAttackTarget(BattleCharacter character) {
|
||||
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 战斗队伍
|
||||
/// </summary>
|
||||
public class BattleTeam {
|
||||
|
||||
public List<BattleCharacter> characters;
|
||||
|
||||
public BattleTeam(List<BattleCharacter> characters) {
|
||||
this.characters = characters;
|
||||
}
|
||||
}
|
||||
@@ -8,19 +8,24 @@ using MuHua;
|
||||
/// </summary>
|
||||
public class ManagerSimulator : ModuleSingle<ManagerSimulator> {
|
||||
|
||||
public DataCharacter character;
|
||||
public List<DataCharacter> cha1 = new List<DataCharacter>();
|
||||
public List<DataCharacter> cha2 = new List<DataCharacter>();
|
||||
public BattleSimulator battleSimulator;
|
||||
|
||||
protected override void Awake() => NoReplace(false);
|
||||
|
||||
private void Start() {
|
||||
character = new DataCharacter();
|
||||
// 种族
|
||||
character.race = DataRace.Orc();
|
||||
// 职业
|
||||
character.profession = DataProfession.Warrior(character);
|
||||
// 更新属性
|
||||
character.Update();
|
||||
// 打印角色卡
|
||||
character.PrintCharacterSheet();
|
||||
cha1.Add(RandomCharacter("艾薇拉"));
|
||||
cha1.Add(RandomCharacter("托尔吉"));
|
||||
cha2.Add(RandomCharacter("哥布林射手"));
|
||||
cha2.Add(RandomCharacter("哥布林战士"));
|
||||
battleSimulator = new BattleSimulator(cha1, cha2);
|
||||
}
|
||||
private void Update() {
|
||||
battleSimulator.Update();
|
||||
}
|
||||
|
||||
private DataCharacter RandomCharacter(string name) {
|
||||
return DataCharacter.Create(name, DataRace.Random(), DataProfession.Random());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,6 +12,13 @@ public static class Dice {
|
||||
public static int Roll(int value) {
|
||||
return Random.Range(1, value + 1);
|
||||
}
|
||||
/// <summary> d20 + 调整值 + 加值 </summary>
|
||||
public static int Roll20(int modifier = 0, int addValue = 0, DiceGrade grade = DiceGrade.平势) {
|
||||
int d1 = Roll(20); int d2 = Roll(20);
|
||||
if (grade == DiceGrade.优势) { d1 = d1 >= d2 ? d1 : d2; }
|
||||
if (grade == DiceGrade.平势) { d1 = d1 <= d2 ? d1 : d2; }
|
||||
return d1 + modifier + addValue;
|
||||
}
|
||||
/// <summary> Attribute规则:投4次d6,去掉最低值 </summary>
|
||||
public static int RollAttribute() {
|
||||
int[] rolls = { Roll(6), Roll(6), Roll(6), Roll(6) };
|
||||
@@ -19,3 +26,8 @@ public static class Dice {
|
||||
return rolls[1] + rolls[2] + rolls[3]; // 弃最低值
|
||||
}
|
||||
}
|
||||
public enum DiceGrade {
|
||||
平势 = 0,
|
||||
优势 = 1,
|
||||
劣势 = 2
|
||||
}
|
||||
@@ -607,7 +607,7 @@ GameObject:
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
m_IsActive: 0
|
||||
--- !u!114 &1769112987
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user