#include "stdafx.h"
#include "Game.h"


//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//
// AI - Umela inteligence protihrace 
//
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//
// Jako prvni vypocitam ztratu za poslednich 12 kol. Jedno kolo je 1/4 sekundy
// tedy za jednu secudnu ubehnou 4 kola. Pokud ma hrad vic jak 3/4 velikosti a 
// protivnik ma vic jak 1 jednotku nepodniknem zadnou akci. Pokud ma jenom jednu 
// jednotku podniknem utok jednou jednotkou.
//
//
void C_AI_0::Refresh( bool nulovani )
{
	_hrac->penize  += plus_penize*_hrac->doly;
	_hrac->kameny  += plus_kameny*_hrac->kamenictvy;
	static int citac = 0;
	if( citac == 4 )
	{
		_hrac->mana += plus_mana*_hrac->chram;
		citac = 0;
	}
	citac++;
	_hrac->vedBody += plus_vedBody*_hrac->vedCentrum;

	if(_hrac->Hrad < _hrac->max_hrad/4)
	{
		int nah = (rand() % 10);
		if(nah)
		{
			// Koupit jednotku
			if( g_aktKolo < 5 ) _KoupitJednotkuLehkou();
			else 
			{
				if( CelkemJednotek(g_hrac) > g_hrac.pocStr+g_hrac.pocKat+g_hrac.pocMag ) _KoupitJednotkuTezkou();
			}
		}
	}

	// ztrata za poslednich 12 kol //
	static int poZtrata[12];
	static int iCit=0;
	static int hrad_old=0, hrad_new=0;
	int ztrata = 0;
	hrad_new = _hrac->Hrad;
	if(hrad_old != 0) ztrata = hrad_old - hrad_new;
	if(ztrata < 0) ztrata=0;
	poZtrata[iCit] = ztrata;
	iCit++;
	if(iCit >= 12) 
	{
		iCit=0;
		int celkem_ztrata=0;
		for(register i=0; i<12; i++) celkem_ztrata += poZtrata[i];

		// prvni AI pro 1 jednotku na poli
		if( celkem_ztrata > 30 && 
			_hrac->Hrad > ((_hrac->max_hrad/4)*3) &&
			CelkemJednotek(*_hrac) == 0 &&
			CelkemJednotek(g_hrac) == 1)
		{
			// Vysli 1 jednotku		
			int nah = (rand()%2);
			if(nah==1) 
			{
				if( g_aktKolo < 5 ) _KoupitJednotkuLehkou();
				else {_KoupitJednotkuTezkou();textREC.Add("Grcakkkkk");} 
			}
		}

		// Nakup budov
		static int ztrataPosPet=0;
		static int iCitPosPet=0;

		ztrataPosPet += celkem_ztrata;
		iCitPosPet++;
		if(iCitPosPet == 5)
		{
			// Pokud je mala ztrata tak kupuj budovu
			if(ztrataPosPet < 600+g_aktKolo*50 && CelkemJednotek(g_hrac) < 4 )
			{
				// Jestly jde nakoupit budova tak kup budovu
				static uint iCitBud=0;
				if(iCitBud % 3 == 0)
				{
					if(_KupBudovuDul()) iCitBud++;
					textREC.Add("Pokus o koupeni dolu");
				}else 
				{
					// KUPOVAT VOJENSKE BUDOVY
					if( g_aktKolo == 4 && _KupBudovuKovarna() ) iCitBud++;
					if( g_aktKolo >= 6 && (rand()%6)==1 && _KupDilna1() ) iCitBud++; 
					if( g_aktKolo >= 5 && _KupBudovuStrelnice() ) iCitBud++; 
					if( g_aktKolo >= 3 && _KupBudovuZbrojnice() ) iCitBud++; 
					else
					if(g_aktKolo >= 0 && g_aktKolo < 5 )
					{ 
						if( _KupBudovuKovarna() ) iCitBud++; 
					}
					
					textREC.Add("Pokus o koupeni VOJENSKYCH BUDOV", ztrataPosPet);
				}	
			}
			iCitPosPet = 0;
			ztrataPosPet = 0;
		}
	}
	static bool bNakupJednotek=0;
	static bool bNakupStitu=0;
	static int citac_3kolo =0;
	if(_hrac->penize > _hrac->doly*300 && (rand() % 30 == 1) && g_aktKolo == 4 ) {bNakupJednotek=1;bNakupStitu=1;}
	
	if(_hrac->penize > _hrac->doly*700 && (rand() % 110 == 1)) {bNakupJednotek=1;bNakupStitu=1;textREC.Add("GO GO GO");}
	if(_hrac->penize > _hrac->doly*1300 && (rand() % 20 == 1)) {bNakupJednotek=1;bNakupStitu=1;}
	if(bNakupJednotek)
	{
		if(g_aktKolo == 0) if(!_KoupitJednotkuLehkou()) bNakupJednotek=0;
		if(g_aktKolo == 1)
		{
			if( !_KoupitJednotkuTezkou() ) bNakupJednotek=0;
		}else
		if(g_aktKolo == 2)
		{
			if( !_KoupitJednotkuTezkou() ) bNakupJednotek=0;
			if( !_KoupitJednotkuLehkou() ) bNakupJednotek=0;
		}else
		if(g_aktKolo == 3)
		{
			if( citac_3kolo == 0 ) if( !_KoupitJednotkuStrelce() ) bNakupJednotek=0;
			if( citac_3kolo == 1 ) if( !_KoupitJednotkuTezkou() ) bNakupJednotek=0;
			if( citac_3kolo == 2 ) if( !_KoupitJednotkuLehkou() ) bNakupJednotek=0;
			citac_3kolo++;
		}else
		if(g_aktKolo == 4)
		{
			// utekovy kolo :]
			if( !_KoupitJednotkuLehkou() ) bNakupJednotek=0;
		}else
		if(g_aktKolo >= 5)
		{
			if( citac_3kolo == 0 ) if( !_KoupitJednotkuTezkou() ) bNakupJednotek=0;
			if( citac_3kolo == 1 ) if( !_KoupitJednotkuLehkou() ) bNakupJednotek=0;
			if( citac_3kolo == 2 && (rand()%5)==1 ) if( !_KoupitJednotkuKat() ) bNakupJednotek=0;
			if( citac_3kolo == 3 ) if( !_KoupitJednotkuStrelce() ) bNakupJednotek=0;
			citac_3kolo++;
			if( citac_3kolo > 3 ) citac_3kolo = 0;
		}
	}
	if( bNakupJednotek == 0 ) citac_3kolo=0;

	// Nahodny nakup jednotek
	if( (rand()%(100) ) == 10 )
	{
		if(g_aktKolo >= 0 && g_aktKolo < 4)	_KoupitJednotkuLehkou();
	}

	// bonus
	if(CelkemJednotek(g_hrac) < 1 && Bonus.GetStav() == 2) 
	{
		// od 5 kola tz jednotkz budem stitovat
		if( g_aktKolo >= 5 ) _KoupitJednotkuLehkou();

		// vybrat nejrychlejsi jednotku
		_KoupitJednotkuTezkou(); 
		int nah = (rand()%6);
		if( nah == 3 ) bNakupJednotek = 1;
	}
	else
	if( Bonus.GetStav() > 0 )
	{
		// vysli jednotky
		bNakupJednotek=1;
	}

	//////////////////////////////////////////////////////////////////////////
	// Kupuj Zed
	//////////////////////////////////////////////////////////////////////////

	if( (_hrac->pocStr > 0 || _hrac->pocKat > 0) && _hrac->vyska_zed < 1 && g_aktKolo >= 5 )
	{
		_KupZed();
	}
	if( _hrac->vyska_zed < 2.0f && g_aktKolo >= 5 && g_prot.Hrad < 3000 )
	{
		// stitovat hrad proti fireboolum
		_KupZed();
	}
	if( _hrac->vyska_zed <= 3.0f && g_aktKolo >= 6 && g_prot.Hrad < 4000 && g_hrac.pocKat > 0 )
	{
		// stitovat hrad proti katapultum
		_KupZed();
	}
	if( _hrac->vyska_zed <= 3.6f && g_aktKolo >= 7 && g_hrac.pocKat > 0 && (g_prot.pocStr >= 3 || g_prot.pocKat >= 2) )
	{
		// stitovat strelce proti katapultum
		_KupZed();
	}


	//////////////////////////////////////////////////////////////////////////
	// Vyvolani kouzel
	//////////////////////////////////////////////////////////////////////////
	if(g_aktKolo > 1) // od 2 kola muze kouzlit
	{
		if(g_aktKolo == 2 && (rand()%5)==1)
		{
			if( _ProvedKouzlo1() ) bNakupJednotek=1;
		}
		if(g_aktKolo > 2 && g_aktKolo < 5 && (rand()%5)==1)
		{
			_ProvedKouzlo2();
		}

		if( (g_hrac.Hrad <= 1000) || (g_hrac.Hrad <= 5000 && CelkemJednotek(g_prot) > 2) )
		{
			_ProvedKouzlo2();
		}
		if( g_aktKolo > 3 && (g_hrac.penize > 4000 || g_hrac.kameny > 3000 || g_hrac.mana > 500 || g_hrac.Hrad < 3000) && (rand()%5)==1 )
		{
			// vysati
			static int citac=0;
			if( citac == 0) { if(_ProvedKouzlo3() ) citac++;}
			if( citac == 1) { if(_ProvedKouzlo1() ) citac=0;}
		}

		if( g_aktKolo > 7 && ( (rand()%20)==1 || g_prot.penize > 6000) )
		{
			if( _ProvedKouzlo4() && g_prot.penize > 6000) bNakupJednotek=1;
			// dabel
		}
		if(g_aktKolo >= 2 && (rand()%50)==1 && g_hrac.penize < 6000 && g_hrac.kameny < 8000 && g_hrac.mana < 600 )
		{
			if( _ProvedKouzlo1() ) bNakupJednotek=1;
		}
	}

	hrad_old = hrad_new;

	if( nulovani )
	{
		citac = 0;
		iCit = 0;
		hrad_old = 0;
		hrad_new = 0;
		bNakupJednotek = 0;
		bNakupStitu = 0;
		citac_3kolo = 0;
	}
	return;
}

bool C_AI_0::_KoupitJednotkuLehkou()
{
	if(_hrac->penize > GetCenaJed(cena_jed1, CelkemJednotek(g_prot) ) ) 
	{
		_hrac->penize -= GetCenaJed(cena_jed1, CelkemJednotek(g_prot) );
		g_protScena.Add(2);// 2 - 11
	}
	else return 0;
	return 1;
}

bool C_AI_0::_KoupitJednotkuTezkou()
{
	if(_hrac->penize > GetCenaJed(cena_jed2, CelkemJednotek(g_prot) ) ) 
	{
		_hrac->penize -= GetCenaJed(cena_jed2, CelkemJednotek(g_prot) );
		g_protScena.Add(4);//4
	}
	else return 0;
	return 1;
}

bool C_AI_0::_KoupitJednotkuStrelce()
{
	if(_hrac->penize > GetCenaJed(cena_jed3, CelkemJednotek(g_prot) ) ) 
	{
		_hrac->penize -= GetCenaJed(cena_jed3, CelkemJednotek(g_prot) );
		g_protScena.Add(6);
	}
	else return 0;
	return 1;
}

bool C_AI_0::_KoupitJednotkuKat()
{
	if(_hrac->penize > GetCenaJed(cena_jed4, CelkemJednotek(g_prot) ) ) 
	{
		_hrac->penize -= GetCenaJed(cena_jed4, CelkemJednotek(g_prot) );
		g_protScena.Add(11);
	}
	else return 0;
	return 1;
}

bool C_AI_0::_KupBudovuDul()
{
	if(_hrac->penize > GetCena(cena_dul, _hrac->doly) && _hrac->kameny >= GetCena(kamen_dul, _hrac->doly) ) 
	{
		_hrac->penize -= GetCena(cena_dul, _hrac->doly);
		_hrac->kameny -= GetCena(kamen_dul, _hrac->kamenictvy);
		_hrac->doly++;
	}
	else return 0;
	return 1;
}

bool C_AI_0::_KupKamenolom()
{
	if(_hrac->penize > GetCena(cena_kamen, _hrac->kamenictvy) && _hrac->kameny >= GetCena(kamen_kamen, _hrac->kamenictvy) ) 
	{
		_hrac->penize -= GetCena(cena_kamen, _hrac->doly);
		_hrac->kameny -= GetCena(kamen_kamen, _hrac->doly);
		_hrac->kamenictvy++;
	}
	else return 0;
	return 1;
}

bool C_AI_0::_KupChram()
{
	if(_hrac->penize > GetCena(cena_chram, _hrac->chram) && _hrac->kameny >= GetCena(kamen_chram, _hrac->chram) ) 
	{
		_hrac->penize -= GetCena(cena_chram, _hrac->chram);
		_hrac->kameny -= GetCena(kamen_chram, _hrac->chram);
		_hrac->chram++;
	}
	else return 0;
	return 1;
}

bool C_AI_0::_KupVedCentrum()
{
	if(_hrac->penize > GetCena(cena_vedCen, _hrac->vedCentrum) && _hrac->kameny >= GetCena(kamen_vedCen, _hrac->vedCentrum) ) 
	{
		_hrac->penize -= GetCena(cena_vedCen, _hrac->vedCentrum);
		_hrac->kameny -= GetCena(kamen_vedCen, _hrac->vedCentrum);
		_hrac->vedCentrum++;
	}
	else return 0;
	return 1;
}

bool C_AI_0::_KupBudovuKovarna()
{
	if(_hrac->penize > GetCena(cena_kovarna, _hrac->kovarny) && _hrac->kameny >= GetCena(kamen_kovarna, _hrac->kovarny)) 
	{
		_hrac->penize -= GetCena(cena_kovarna, _hrac->kovarny);
		_hrac->kameny -= GetCena(kamen_kovarna, _hrac->kovarny);
		_hrac->kovarny++;
	}
	else return 0;
	return 1;
}

bool C_AI_0::_KupBudovuZbrojnice()
{
	if(_hrac->penize > GetCena(cena_zbrojnice, _hrac->zbrojnice) && _hrac->kameny >= GetCena(kamen_zbrojnice, _hrac->zbrojnice)) 
	{
		_hrac->penize -= GetCena(cena_zbrojnice, _hrac->zbrojnice);
		_hrac->kameny -= GetCena(kamen_zbrojnice, _hrac->zbrojnice);
		_hrac->zbrojnice++;
	}
	else return 0;
	return 1;
}

bool C_AI_0::_KupBudovuStrelnice()
{
	if(_hrac->penize > GetCena(cena_strelnice, _hrac->strelnice) && _hrac->kameny >= GetCena(kamen_strelnice, _hrac->strelnice)) 
	{
		_hrac->penize -= GetCena(cena_strelnice, _hrac->strelnice);
		_hrac->kameny -= GetCena(kamen_strelnice, _hrac->strelnice);
		_hrac->strelnice++;
	}
	else return 0;
	return 1;
}

bool C_AI_0::_KupDilna1()
{
	if(_hrac->penize > GetCena(cena_dilny1, _hrac->dilny1) && _hrac->kameny >= GetCena(kamen_dilny1, _hrac->dilny1)) 
	{
		_hrac->penize -= GetCena(cena_dilny1, _hrac->dilny1);
		_hrac->kameny -= GetCena(kamen_dilny1, _hrac->dilny1);
		_hrac->dilny1++;
	}
	else return 0;
	return 1;
}


bool C_AI_0::_KupZed()
{
	if(_hrac->penize > cena_hradba && _hrac->kameny >= kamen_hradba) 
	{
		_hrac->penize -= cena_hradba;
		_hrac->kameny -= kamen_hradba;
		_hrac->vyska_zed += 1.2f;
		if( _hrac->vyska_zed > 4.0f ) _hrac->vyska_zed = 4.0f;
	}
	else return 0;
	return 1;
}

bool C_AI_0::_ProvedKouzlo1() // suroviny
{
	if( _hrac->mana >= mana_1 ) 
	{
		_hrac->mana -= mana_1;
		PridejSuroviny(*_hrac, 1, TM.GetIdTexture( g_textures[28] ));
	}
	else return 0;
	return 1;
}

bool C_AI_0::_ProvedKouzlo2() // firebool
{
	if( _hrac->mana >= mana_2 ) 
	{
		_hrac->mana -= mana_2;
		float od_x = (rand()%100)/1000.0f;
		float od_y = (rand()%20)/10.0f -0.5f;
		g_fire.NewFirebool(TM.GetIdTexture(g_textures[15]), TM.GetIdTexture(g_textures[17]), CVector3(4.0f-od_x,1+od_y,-1.0), CVector3(5,0,0), CVector3(-0.05,0,0), 0.5f, 1);
	}
	else return 0;
	return 1;
}

bool C_AI_0::_ProvedKouzlo3() // vysati
{
	if( _hrac->mana >= mana_3 ) 
	{
		_hrac->mana -= mana_3;
		Vysati_soupere( g_prot, g_hrac, 1, TM.GetIdTexture( g_textures[30] ) );
	}
	else return 0;
	return 1;
}

bool C_AI_0::_ProvedKouzlo4() // postava
{
	if( _hrac->mana >= mana_8 ) 
	{
		_hrac->mana -= mana_8;
		g_protScena.Add( 21 );
	}
	else return 0;
	return 1;
}


// KONEC AI