#pragma once
#include "Jass.h"
#include "Game_structures.h"

bool fVampireTactics1(VampirePlayer *pVampirePlayer);

void fActionGoToGlobal(VampirePlayer *pVampirePlayer, DataUnit *pDataUnit, DataGoTo *pDataGoTo, real vR);

bool fComeToMe(DataUnit *pDataUnit1, DataUnit *pDataUnit2, real vR);
bool fDistanceMeasurement(DataUnit *pDataUnit1, DataUnit *pDataUnit2, real vR);

integer fFilterMainHuman();

void fInitTroopsVampire(VampirePlayer * pVampirePlayer);

unit fGetNearestUnitEnemyForVampire(HGROUP g, DataUnit *pDataUnit);

void fResetTheResolution(VampirePlayer *pVampirePlayer);
void fWeReturnAfterTheRetreat(VampirePlayer * pVampirePlayer);
bool fStealth(VampirePlayer *pVampirePlayer);
bool fTreatment(VampirePlayer *pVampirePlayer);
bool fTransmissionOfImmortality(VampirePlayer *pVampirePlayer);
void fCompletingAVampireAttack(VampirePlayer *pVampirePlayer);
void fTheBeginningOfTheVampireAttack(VampirePlayer *pVampirePlayer);
void fEnlightenCliffLevel(VampirePlayer *pVampirePlayer);
bool fEnableImmortality(VampirePlayer *pVampirePlayer);
bool fEnlighten(VampirePlayer *pVampirePlayer);
void fResetErrors(VampirePlayer *pVampirePlayer);
void fInitialStage(VampirePlayer *pVampirePlayer);

bool fOrderToIdDataUnit(VampirePlayer *pVampirePlayer, DataUnit *pDataUnit, integer vOrder, unsigned short vIdDataUnit);

bool fVampireGetGoldCoin(VampirePlayer * pVampirePlayer);

void fSkillVampire(sVampire *pVampire, integer vFlag);

void fGameVampire();

void fActionsTini(VampirePlayer *pVampirePlayer);
void fActionsVampire(VampirePlayer *pVampirePlayer);

bool fVampireTactics2(VampirePlayer *pVampirePlayer);

void fActionsInfernal(VampirePlayer *pVampirePlayer);

integer fFilterFirstTower();

unit fGetNearestUnitEnemyForInfernal(HGROUP g, DataUnit *pDataUnit);

void fEndAttack();

unit fGetNearestUnitEnemy(HGROUP g, DataUnit *pDataUnit, bool vFlagVisible);
bool fStepBack(VampirePlayer *pVampirePlayer, DataUnit *pDataUnit);

//unit fGetNearestUnitEnemyForInfernalFire(HGROUP g, DataUnit *pDataUnit);

integer fFilterWall();

bool fBreezeToUnit(VampirePlayer *pVampirePlayer, sUnitParam *vUnitParam, DataUnit *pDataUnit, real vTimer, bool vFlagBreeze);

void fBreeze();

bool fZeroBaseBreeze(VampirePlayer *pVampirePlayer);

bool fStepForward(VampirePlayer *pVampirePlayer, DataUnit *pDataUnit);
bool fStepBack(VampirePlayer *pVampirePlayer, DataUnit *pDataUnit, real vR);
bool fMoveOver(VampirePlayer *pVampirePlayer, DataUnit *pDataUnit, DataUnit *pDataUnit2);

bool fGoToGlobalBase(VampirePlayer *pVampirePlayer);
bool fKillInfernals(VampirePlayer *pVampirePlayer);

integer fFilterInfernal();
unit fGetNearestUnit(HGROUP g, DataUnit *pDataUnit);

void fAddDataUnitInRange(VampirePlayer *pVampirePlayer);

void fAddDataUnitInRange(VampirePlayer *pVampirePlayer, DataUnit *pDataUnit);

unsigned short fFindBaseNext(VampirePlayer *pVampirePlayer, unsigned short vBaseNo);

unsigned short fFindBaseBig(VampirePlayer *pVampirePlayer);

bool fEnlightenWall(VampirePlayer *pVampirePlayer);

void fGoNextBase(VampirePlayer * pVampirePlayer);

void fCompletingAVampireAttackToStage(VampirePlayer *pVampirePlayer);

unsigned int fEndPoint(VampirePlayer *pVampirePlayer, unsigned short vBaseHuman);