你的想法我觉得虽然简化了真实的WAR3模型,不过还是很不错的,基本上该有的都有了。
enum MainProperty
{
Strength = 0,
Agile = 1,
Intelligence = 2
}
class Strength
{
public decimal StartStrength {get;set;}
public decimal IncreaseRate{get;set;}
//这里的get方法可能会从当前地图设置中读取一些信息
}
abstract class Hero
{
public Strength Strength { get; set; }
public Agile Agile { get; set; }
public Intelligence Intelligence { get; set; }
public MainProperty MainProperty { get; set; } //主属性
public decimal Speed { get; set; }
//省略了其他一些属性
public List<Skill> Skills { get; set; }
}
class Skill
{
public virtual Icon Icon { get; set; }
public TimeSpan CoolDown { get; set; }
public virtual void Cast(BaseObject obj) { } //这里施法对象未必是调用者
}
一个玩家选择了巨魔,那么就是创建了一个Troll类的实例,Troll类继承自Hero类并且override了必要的属性和方法。第一级学习了G,Troll类的Skills里加入了这个技能的实例,它的CD是0,它的Cast方法里,将BaseObject转换成Troll对象,然后增加一个重击技能(想象中本质上是在Troll类的AfterAttackHit事件里增加了一个重击伤害的调用,这样在击中后产生随机数,看是否有重击效果,如果有,那么增加伤害并且改变目标状态为眩晕)。在BeforeAttack事件中可能对target做一些判断(比如闪避,miss,无敌等)。近战G技能的调用效果里还包括看当前技能里是否包含2技能飞斧E,如果有则切换该技能(近战/远程2种不同的E可以看成两个技能)。以上是理想情况,实际上DOTA里,巨魔是两个模型,这两个模型有不同的技能,按G就是切换,同时把状态copy过去,所以切换的瞬间无敌能躲技能。再比如巨魔购买了圣剑,圣剑这个item有个PickUp方法,里面就是把当前owner(不一定是个Hero类)的攻击加250,Drop方法相反。巨魔购买了3300,它的PickUp方法是增加owner 25点的Agile,同时Hero类有个RealAttack的属性,这个属性是根据BaseAttack(基础攻击)和等级/主属性值/装备等计算出来的,因此英雄攻击后面的绿字也随之增加了。再说英雄技能比较复杂的情况,例如PD的大招分身,可以简化成如果学习了该技能,就一直有3个无敌且碰撞体积为0的不可见(不等于隐身)单位一直跟着它,它的大招效果就是执行一段动画,同时将本体变成无敌且不可见,将分身显示出来等等。单是英雄的情况可能比较简单,如果考虑到结合地图设置以及玩家控制等等,复杂度就会直线上升了。