using System;
using System.Collections.Generic;
using System.Text;
namespace Tumon.Game
{
/// <summary>
/// Действия героя
/// </summary>
interface IHero
{
/// <summary>
/// Получение действия от другого героя
/// </summary>
/// <param name="strikeTyp">Тип удара</param>
/// <param name="power">Сила удара</param>
void GetAct(Knowledge strikeTyp, int power, bool addTo);
/// <summary>
/// Применение действия на другого героя
/// </summary>
/// <param name="hitHero"></param>
/// <param name="hitKnowledge"></param>
void Act(IHero hitHero, Knowledge hitKnowledge);
void ActAffects();
}
/// <summary>
/// Герой
/// </summary>
abstract class Hero : IHero
{
/// <summary>
/// Показатель здоровья
/// </summary>
protected int health;
abstract public int Health { get; set; }
/// <summary>
/// Уровень
/// </summary>
protected int level;
abstract public int Level { get; set; }
/// <summary>
/// Опыт
/// </summary>
protected int experience;
abstract public int Experience { get; set; }
/// <summary>
/// Показатель маны
/// </summary>
protected int manna;
abstract public int Manna { get; set; }
/// <summary>
/// Знания и навыки которые имеет герой
/// </summary>
protected List<Knowledge> heroKnowledges = new List<Knowledge>();
abstract public List<Knowledge> HeroKnowledges { get; set; }
/// <summary>
/// Знания и навыки действующие в данный момент
/// </summary>
protected List<Knowledge> activeKnowledges = new List<Knowledge>();
abstract public List<Knowledge> ActiveKnowledges { get; set; }
/// <summary>
/// Получение нанесенного удара
/// </summary>
/// <param name="strikeTyp">Тип удара</param>
/// <param name="power">Сила удара</param>
abstract public void GetAct(Knowledge strikeTyp, int power, bool addTo);
/// <summary>
/// Взаимодействовать с героем
/// </summary>
/// <param name="hitHero"></param>
abstract public void Act(IHero hitHero, Knowledge hitKnowledge);
/// <summary>
/// Воздействие эффектов
/// </summary>
public void ActAffects()
{
for (int i = 0; i < ActiveKnowledges.Count; i++)
{
GetAct(ActiveKnowledges[i], ActiveKnowledges[i].Power,false);
if (ActiveKnowledges[i].ActiveTime != 0) ActiveKnowledges[i] = null;
}
ActiveKnowledges.RemoveAll(delegate(Knowledge kn) { return kn == null; });
}
}
/// <summary>
/// Возможность героя
/// </summary>
abstract class Knowledge
{
/// <summary>
/// Название навыка
/// </summary>
protected string name;
abstract public string Name { get; set; }
/// <summary>
/// Тип навыка
/// <example>(Огонь,Вода,Хак)</example>
/// </summary>
protected TypesOfKnowledge knowledgeType;
abstract public TypesOfKnowledge KnowledgeType { get; set; }
/// <summary>
/// Размер наносимого ущерба если положительный то защита, если отрицательный то атака
/// </summary>
protected int power;
abstract public int Power { get; set; }
/// <summary>
/// Промежуток времени активности навыка.
/// <example>Если навык защита от огня работает 10 раундов значение равно 10, если все время значение -1 и если это удар огнем "разовый" равно 0</example>
/// </summary>
protected int activeTime;
abstract public int ActiveTime { get; set; }
public override string ToString()
{
return name;
}
}
/// <summary>
/// Типы возможностей героя
/// </summary>
enum TypesOfKnowledge
{
/// <summary>
/// Огненая стрела
/// </summary>
FireBolt = 0,
PhysicalHit = 1
}
}
namespace Tumon.Game
{
class HandAttack:Knowledge
{
/// <summary>
/// Название навыка
/// </summary>
public override string Name { get { return name; } set { name = value; } }
/// <summary>
/// Тип навыка
/// <example>(Огонь,Вода,Хак)</example>
/// </summary>
public override TypesOfKnowledge KnowledgeType { get { return knowledgeType; } set { knowledgeType = value; } }
/// <summary>
/// Размер наносимого ущерба если положительный то защита, если отрицательный то атака
/// </summary>
public override int Power { get { return power; } set { power = value; } }
/// <summary>
/// Промежуток времени активности навыка.
/// <example>Если навык защита от огня работает 10 раундов значение равно 10, если все время значение -1 и если это удар огнем "разовый" равно 0</example>
/// </summary>
public override int ActiveTime { get { return activeTime; } set { activeTime = value; } }
public HandAttack()
{
Name = "удар рукой";
KnowledgeType = TypesOfKnowledge.PhysicalHit;
ActiveTime = 0;
Power = 10;
}
}
class VirusAttack : Knowledge
{
/// <summary>
/// Название навыка
/// </summary>
public override string Name { get { return name; } set { name = value; } }
/// <summary>
/// Тип навыка
/// <example>(Огонь,Вода,Хак)</example>
/// </summary>
public override TypesOfKnowledge KnowledgeType { get { return knowledgeType; } set { knowledgeType = value; } }
/// <summary>
/// Размер наносимого ущерба если положительный то защита, если отрицательный то атака
/// </summary>
public override int Power { get { return power; } set { power = value; } }
/// <summary>
/// Промежуток времени активности навыка.
/// <example>Если навык защита от огня работает 10 раундов значение равно 10, если все время значение -1 и если это удар огнем "разовый" равно 0</example>
/// </summary>
public override int ActiveTime { get { return activeTime; } set { activeTime = value; } }
public VirusAttack()
{
Name = "вирусная атака";
KnowledgeType = TypesOfKnowledge.PhysicalHit;
ActiveTime = 3;
Power = 10;
}
}
class Hacker:Hero
{
private Random rnd = new Random();
/// <summary>
/// Показатель здоровья
/// </summary>
public override int Health { get { return health; } set { health = value; } }
/// <summary>
/// Уровень
/// </summary>
public override int Level { get { return level; } set { level = value; } }
/// <summary>
/// Опыт
/// </summary>
public override int Experience { get { return experience; } set { experience = value; } }
/// <summary>
/// Показатель маны
/// </summary>
public override int Manna { get { return manna; } set { manna = value; } }
/// <summary>
/// Знания и навыки которые имеет герой
/// </summary>
public override List<Knowledge> HeroKnowledges { get { return heroKnowledges; } set { heroKnowledges = value; } }
/// <summary>
/// Знания и навыки действующие в данный момент
/// </summary>
public override List<Knowledge> ActiveKnowledges { get { return activeKnowledges; } set { activeKnowledges = value; } }
/// <summary>
/// Получение нанесенного удара
/// </summary>
/// <param name="strikeTyp">Тип удара</param>
/// <param name="power">Сила удара</param>
public override void GetAct(Knowledge strikeTyp, int power, bool addTo)
{
Health = Health - power;
if (addTo && (strikeTyp.ActiveTime > 0 || strikeTyp.ActiveTime == -1))
{
if (strikeTyp.ActiveTime != -1) strikeTyp.ActiveTime--;
ActiveKnowledges.Add(strikeTyp);
}
OnAttack(new AttackEvent(strikeTyp,power));
}
/// <summary>
/// Взаимодействовать с героем
/// </summary>
/// <param name="hitHero"></param>
public override void Act(IHero hitHero, Knowledge hitKnowledge)
{
float rand = (float)rnd.Next(1, 4) / 4;
int power = (int)(rand * level * hitKnowledge.Power);
hitHero.GetAct(hitKnowledge, power,true);
}
public Hacker()
:this(1, new List<Knowledge>(0))
{
}
public Hacker(int hackerlevel)
: this(hackerlevel, new List<Knowledge>(0))
{
}
public Hacker(int hackerlevel, List<Knowledge> hackerKnowledge)
{
Level = hackerlevel;
Experience = 0;
health = 100;
heroKnowledges.Add(new HandAttack());
heroKnowledges.AddRange(hackerKnowledge);
}
public delegate void AttackEventDelegate(object obj, AttackEvent e);
public event AttackEventDelegate Attack;
private void OnAttack(AttackEvent e)
{
if (Attack != null) Attack(this,e);
}
}
class AttackEvent : EventArgs
{
private int attackPower;
public int AttackPower { get { return attackPower; } set { attackPower = value; } }
private Knowledge attackKnowledge;
public Knowledge AttackKnowledge { get { return attackKnowledge; } set { attackKnowledge = value; } }
public AttackEvent(Knowledge knowledge, int power)
{
AttackKnowledge = knowledge;
AttackPower = power;
}
}
class MainClass
{
public static void Main()
{
List<Knowledge> kn = new List<Knowledge>();
kn.Add(new VirusAttack());
Hacker hk1 = new Hacker(2);
hk1.Attack += new Hacker.AttackEventDelegate(Attackhk1);
Hacker hk2 = new Hacker(1, kn);
hk2.Attack += new Hacker.AttackEventDelegate(Attackhk2);
hk2.Act(hk1, hk2.HeroKnowledges[1]);
while (hk1.Health > 0 && hk2.Health > 0)
{
hk1.Act(hk2, hk1.HeroKnowledges[0]);
hk2.Act(hk1, hk2.HeroKnowledges[0]);
hk1.ActAffects();
hk2.ActAffects();
}
}
static void Attackhk1(object obj,AttackEvent e)
{
Console.WriteLine("герой 1 атакован: " + e.AttackKnowledge.Name + " с силой: " + e.AttackPower);
}
static void Attackhk2(object obj, AttackEvent e)
{
Console.WriteLine("герой 2 атакован: " + e.AttackKnowledge.Name + " с силой: " + e.AttackPower);
}
}
}