The-Powder-Toy/src/simulation/elements/FIGH.cpp

140 lines
3.7 KiB
C++

#include "simulation/Elements.h"
//#TPT-Directive ElementClass Element_FIGH PT_FIGH 158
Element_FIGH::Element_FIGH()
{
Identifier = "DEFAULT_PT_FIGH";
Name = "FIGH";
Colour = PIXPACK(0xFFE0A0);
MenuVisible = 1;
MenuSection = SC_SPECIAL;
Enabled = 1;
Advection = 0.5f;
AirDrag = 0.00f * CFDS;
AirLoss = 0.2f;
Loss = 1.0f;
Collision = 0.0f;
Gravity = 0.0f;
Diffusion = 0.0f;
HotAir = 0.00f * CFDS;
Falldown = 0;
Flammable = 0;
Explosive = 0;
Meltable = 0;
Hardness = 0;
Weight = 50;
Temperature = R_TEMP+14.6f+273.15f;
HeatConduct = 0;
Description = "Fighter. Tries to kill stickmen.";
State = ST_NONE;
Properties = 0;
LowPressure = IPL;
LowPressureTransition = NT;
HighPressure = IPH;
HighPressureTransition = NT;
LowTemperature = ITL;
LowTemperatureTransition = NT;
HighTemperature = 620.0f;
HighTemperatureTransition = PT_FIRE;
Update = &Element_FIGH::update;
Graphics = &Element_STKM::graphics;
}
//#TPT-Directive ElementHeader Element_FIGH static int update(UPDATE_FUNC_ARGS)
int Element_FIGH::update(UPDATE_FUNC_ARGS)
{
playerst* figh = &sim->fighters[(unsigned char)parts[i].tmp];
unsigned int tarx, tary;
parts[i].tmp2 = 0; //0 - stay in place, 1 - seek a stick man
//Set target cords
if (sim->player.spwn && sim->player2.spwn)
{
if ((pow((float)sim->player.legs[2]-x, 2) + pow((float)sim->player.legs[3]-y, 2))<=
(pow((float)sim->player2.legs[2]-x, 2) + pow((float)sim->player2.legs[3]-y, 2)))
{
tarx = (unsigned int)sim->player.legs[2];
tary = (unsigned int)sim->player.legs[3];
}
else
{
tarx = (unsigned int)sim->player2.legs[2];
tary = (unsigned int)sim->player2.legs[3];
}
parts[i].tmp2 = 1;
}
else
{
if (sim->player.spwn)
{
tarx = (unsigned int)sim->player.legs[2];
tary = (unsigned int)sim->player.legs[3];
parts[i].tmp2 = 1;
}
if (sim->player2.spwn)
{
tarx = (unsigned int)sim->player2.legs[2];
tary = (unsigned int)sim->player2.legs[3];
parts[i].tmp2 = 1;
}
}
switch (parts[i].tmp2)
{
case 1:
if ((pow(float(tarx-x), 2) + pow(float(tary-y), 2))<600)
{
if (figh->elem == PT_LIGH || figh->elem == PT_NEUT
|| sim->elements[figh->elem].Properties&(PROP_DEADLY|PROP_RADIOACTIVE)
|| sim->elements[figh->elem].Temperature>=323 || sim->elements[figh->elem].Temperature<=243)
figh->comm = (int)figh->comm | 0x08;
}
else
if (tarx<x)
{
if(!(sim->eval_move(PT_FIGH, figh->legs[4]-10, figh->legs[5]+6, NULL)
&& sim->eval_move(PT_FIGH, figh->legs[4]-10, figh->legs[5]+3, NULL)))
figh->comm = 0x01;
else
figh->comm = 0x02;
if (!sim->eval_move(PT_FIGH, figh->legs[4]-4, figh->legs[5]-1, NULL)
|| !sim->eval_move(PT_FIGH, figh->legs[12]-4, figh->legs[13]-1, NULL)
|| sim->eval_move(PT_FIGH, 2*figh->legs[4]-figh->legs[6], figh->legs[5]+5, NULL))
figh->comm = (int)figh->comm | 0x04;
}
else
{
if (!(sim->eval_move(PT_FIGH, figh->legs[12]+10, figh->legs[13]+6, NULL)
&& sim->eval_move(PT_FIGH, figh->legs[12]+10, figh->legs[13]+3, NULL)))
figh->comm = 0x02;
else
figh->comm = 0x01;
if (!sim->eval_move(PT_FIGH, figh->legs[4]+4, figh->legs[5]-1, NULL)
|| !sim->eval_move(PT_FIGH, figh->legs[4]+4, figh->legs[5]-1, NULL)
|| sim->eval_move(PT_FIGH, 2*figh->legs[12]-figh->legs[14], figh->legs[13]+5, NULL))
figh->comm = (int)figh->comm | 0x04;
}
break;
default:
figh->comm = 0;
break;
}
figh->pcomm = figh->comm;
Element_STKM::run_stickman(figh, UPDATE_FUNC_SUBCALL_ARGS);
return 0;
}
Element_FIGH::~Element_FIGH() {}