[DefendDamagePointsAttribute(0)] // Эффективность защиты
[MaximumSpeedPointsAttribute(18)] // Максимальная скорость
[CamouflagePointsAttribute(18)] // Умение прятаться
[EyesightPointsAttribute(50)] // Дальнозоркость
// CLASS
public class MyAnimal : Animal
{ private PlantState targetPlant = null; // Растение
// private AnimalState targetAnimal = null; // Животное
AnimalState attackerAnimal = null; // Кто атакует
const int cruisingSpeed = 5; // Скорость нормального хода
const int fleeingSpeed = 40; // Скорость при беге
protected override void Initialize()
{Idle += new IdleEventHandler(IdleEvent);
// Load += MyAnimal_Load;
Attacked += new AttackedEventHandler(AttackedEvent);
MoveCompleted += new Move Completed Event Handler(Move Completed Event);
}
// // Загрузка организма
// private void MyAnimal_Load(object sender, LoadEventArgs e)
// {
// }
void IdleEvent(object sender, IdleEventArgs e)
{ try
{ MyWriteTrace();
if (CanReproduce)
{ WriteTrace("Я размножаюсь");
BeginReproduction(null);
}
// Если мы можем есть и имеем еду, то мы едим
if (CanEat)
{ WriteTrace("Я голодный.");
if (!IsEating)
{ WriteTrace("Нет еды: Ищем еду?");
if (targetPlant != null)
{ WriteTrace("Да, я вижу еду.");
if (WithinEatingRange(targetPlant))
{ WriteTrace("Имеем еду, старт поедания.");
BeginEating(targetPlant);
if (IsMoving)
{ WriteTrace("Остановимся, пока едим.");
StopMoving();
}
}
else
{ if (!IsMoving)
{ WriteTrace("Перемещаемся к еде");
BeginMoving(new MovementVector(targetPlant.Position, cruisingSpeed));
}
}
}
else
{WriteTrace("Не могу найти растение.");
if ((!ScanForTargetPlant())&&(!TraceScan()))
if (!IsMoving)
{if (!TraceScan())
{int RandomX = OrganismRandom.Next(0, WorldWidth - 1);
int RandomY = OrganismRandom.Next(0, WorldHeight - 1);
BeginMoving(new MovementVector(new Point(RandomX, RandomY), cruisingSpeed));
}
}
else
{WriteTrace("Перемещаемся и смотрим...");
}
}
}
else
{
WriteTrace("О! Еда.");
if (IsMoving)
{ WriteTrace("Остановимся пока кушаем.");
StopMoving();
}
}
}
else
{ WriteTrace("Воот: ничего не делаем.");
if ((IsMoving)&&(!TraceScan()))
StopMoving();
TraceScan();
}
}
catch (Exception exc)
{ WriteTrace(exc.ToString());
}
// if (!IsMoving)
// {
// Int32 RandomX = OrganismRandom.Next(0, WorldWidth - 1);
// Int32 RandomY = OrganismRandom.Next(0, WorldHeight - 1);
// BeginMoving(new MovementVector(new Point(RandomX, RandomY), 4));
// }
// else
// {
// };
}
void MyWriteTrace()
{ WriteTrace("Мой возраст = ", State.TickAge, " хода."); }
private bool ScanForTargetPlant()
{ try
{ ArrayList foundCreatures = Scan();
// TraceScan();
if (foundCreatures.Count > 0)
{ // Всегда двигаемся подле самого близкого растения или ремовим его
foreach (OrganismState organismState in foundCreatures)
{ if (organismState is PlantState)
{ targetPlant = (PlantState)organismState;
BeginMoving(new MovementVector(organismState.Position, cruisingSpeed));
return true;
}
}
}
}
catch (Exception exc)
{ WriteTrace(exc.ToString());
}
return false;
}
// Вызывается, когда существо было атаковано
void AttackedEvent(object sender, AttackedEventArgs e)
{
if (e.Attacker.IsAlive)
{ Vector newVector = Vector.Subtract(attackerAnimal.Position,Position);
Vector newPositionVector = newVector.Scale(10);
Point newPosition = Vector.Add(Position, newPositionVector);
BeginMoving(new MovementVector(newPosition, fleeingSpeed));
}
}
// Запускается, когда закончили двигаться.
private void MoveCompletedEvent(object sender, MoveCompletedEventArgs e)
{ TraceScan();
}
private bool TraceScan()
{ WriteTrace("СКАНИРУЮ():");
ArrayList OrgArr = Scan();
Int32 ii=0;
Int32 Tick = State.TickAge;
for (Int32 I = 0; I < OrgArr.Count; I++)
{ OrganismState Org = OrgArr[I] as OrganismState;
String S;
if (Org is PlantState)
S = "Растение ";
else
{
if ((Org as AnimalState).AnimalSpecies.IsCarnivore)
S = "Хищник ";
else
{ WriteTrace("Смотрю кто старше");
if (((Org as AnimalState).TickAge > Tick) && (Org.Species.IsSameSpecies(this.Species)))
{ ii = I;
Tick = (Org as AnimalState).TickAge;
}
S = "Травоядный ";
}
}
WriteTrace(S);
}
if (Tick > State.TickAge)
{ WriteTrace("Вижу вожака на основе опыта. Иду следом");
OrganismState Org = OrgArr[ii] as OrganismState;
BeginMoving(new MovementVector((Org as AnimalState).Position, cruisingSpeed));
return true;
}
else
{ return false;
}
}
public override void SerializeAnimal(MemoryStream m)
{
}
public override void DeserializeAnimal(MemoryStream m)
{
}
}
}