using System;
using System.Drawing;
using System.Collections;
using System.IO;
using OrganismBase;
//Это существо - хищник. Оно будет поджидать других существ, и, когда они попадут
//в поле его видимости, есть их.
[assembly: OrganismClass("CSharpCreatures.SimpleCarnivore")]//Название класса организма
[assembly: AuthorInformation("Your Name", "someone@microsoft.com")]//Информация об авторе
namespace CSharpCreatures
{
//Указание на то, что существо - хищник.
[CarnivoreAttribute(true)]
// Сделаем существ достаточно большими, но не очень, чтобы быстрее размножались.
[MatureSize(30)]
// Пусть существа будут скорпионами
// Пусть они отображаются на миникарте синим цветом
[AnimalSkin(AnimalSkinFamily.Beetle)]
[MarkingColor(KnownColor.Blue)]
// Сделаем существам высокий уровень атаки, среднюю скорость и зрение
[MaximumEnergyPoints(0)]
[EatingSpeedPoints(0)]
[AttackDamagePoints(52)]
[DefendDamagePoints(0)]
[MaximumSpeedPoints(28)]
[CamouflagePoints(0)]
[EyesightPoints(20)]
public class SimpleCarnivore : Animal
{
AnimalState targetAnimal;
protected override void Initialize()
{
Load += new LoadEventHandler(LoadEvent);
Idle += new IdleEventHandler(IdleEvent);
}
void LoadEvent(object sender, LoadEventArgs e)
{
try
{
if(targetAnimal != null)
{
//Поиск еды (животных)
targetAnimal = (AnimalState) LookFor(targetAnimal);
}
}
catch(Exception exc)
{
// При ошибках выдать сообщение
WriteTrace(exc.ToString());
}
}
void IdleEvent(object sender, IdleEventArgs e)
{
try
{
//Размножаться, когда возможно
if(CanReproduce)
BeginReproduction(null);
// Если существо атакует, либо передвигается, либо ест, то ничего не делать.
if ( IsAttacking || IsMoving || IsEating )
{
return;
}
// Поиск еды
if(targetAnimal == null)
{
FindNewTarget();
}
// Если найдено существо...
if(targetAnimal != null )
{
// проверить живо ли оно...
if ( targetAnimal.IsAlive )
{
// если живо, то проверить, достаточно ли оно близко...
if ( WithinAttackingRange(targetAnimal) )
{
BeginAttacking(targetAnimal);//если да, то атаковать...
}
else
{
MoveToTarget();// иначе двигаться к цели.
}
}
else
{
// Если существо неживое, попробовать съесть его.
if ( WithinEatingRange(targetAnimal) )
{
if (CanEat)
{
BeginEating(targetAnimal);
}
}
else
{
//Если оно слишком далеко, то приблизиться к нему.
MoveToTarget();
}
}
}
else
{
// Если вокруг нет существ, то оставаться на месте, и ждать их.
StopMoving();
}
}
catch(Exception exc)
{
WriteTrace(exc.ToString());//сообщить об ошибке, если она возникнет.
}
}
// Поиск существ
void FindNewTarget()
{
try
{
ArrayList foundAnimals = Scan();
// Просматриваем найденные организмы.
if(foundAnimals.Count > 0)
{
foreach(OrganismState organismState in foundAnimals)
{
// Если найденный организм животное, и не принадлежит к тому же виду, что и
// наш организм, то сделать организм целевым.
if(organismState is AnimalState && !IsMySpecies(organismState))
{
targetAnimal = (AnimalState) organismState;
}
}
}
}
catch(Exception exc)
{
WriteTrace(exc.ToString());//Если возникнут ошибки, сообщить о них.
}
}
// Движение к цели
void MoveToTarget()
{
try
{
// Если нет целевого существа, то ничего не делать...
if ( targetAnimal == null )
{
return;
}
// иначе двигаться к целевому существу.
BeginMoving(new MovementVector(targetAnimal.Position, Species.MaximumSpeed));
}
catch(Exception exc)
{
WriteTrace(exc.ToString()); //Если возникнут ошибки, сообщить о них.
}
}
public override void SerializeAnimal(MemoryStream m)
{
}
public override void DeserializeAnimal(MemoryStream m)
{
}
}
}