
////////////////////////////////////////////////////////////////////////////
//
// SLIC for Civ series Settler to build tile improvements.
//
// By Dale and Pedrunn
//
// Version 0.1 13-Sep-2002
//
// Version 0.2 13-Sep-2002
//	- AI is thought how to use worker and when to build him
////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////
//
// PLEASE NOTE!
//
// I believe Civ 3 to be an inferior game to CTP2, but considering the
// amount of requests for the Civ series settlers building tile improvements
// I decided to shut those people up once and for all.
//
// NEVER ASK ME TO DO ANOTHER CRAPPY CIV SERIES CONCEPT TO REPLACE THE
// FAR SUPERIOR CTP2 CONCEPTS!
//
////////////////////////////////////////////////////////////////////////////

unit_t STUPID_SYSTEM_UNIT[];
location_t I_LOVE_PW_LOCATION[];
int_t WORKERS_ARE_STUPID_GOOD[];
int_t RETARD_WORKER_IS_WORKING[];

void_f SaveWorkerWork(int_t tmpUnit, int_t tmpLoc, int_t tileimp) {
int_t i;
int_t sucess;
	i = 0;
	while(i < RETARD_WORKER_IS_WORKING.# && sucess == 0){
		if(RETARD_WORKER_IS_WORKING[i] == 1) {
			STUPID_SYSTEM_UNIT[i] = tmpUnit;
			I_LOVE_PW_LOCATION[i] = tmpLoc;
			WORKERS_ARE_STUPID_GOOD[i] = tileimp;
			RETARD_WORKER_IS_WORKING[i] = 1;
			sucess = 1;
		}
		i = i + 1;
	}
	if(sucess == 0) {
		i = RETARD_WORKER_IS_WORKING.# + 1;
		STUPID_SYSTEM_UNIT[i] = tmpUnit;
		I_LOVE_PW_LOCATION[i] = tmpLoc;
		WORKERS_ARE_STUPID_GOOD[i] = tileimp;
		RETARD_WORKER_IS_WORKING[i] = 1;
	}
}

HandleEvent(CreateImprovement) 'CivSettlerBuildTileImps' pre {
int_t numUnits;
int_t counter;
int_t counter2;
int_t i;
int_t settlerUnit2;
int_t tmpPlayer;
int_t numCities;
int_t settlerUnit;
unit_t tmpUnit;
int_t randnum;
location_t tmpLoc;
army_t tmpArmy;
city_t tmpCity;
	settlerUnit = 0;
	settlerUnit2 = 0;
	tmpLoc = location[0];
	tmpPlayer = player[0];
	
	if(!(TerrainType(tmpLoc) == 10
		|| TerrainType(tmpLoc) == 11
		|| TerrainType(tmpLoc) == 12
		|| TerrainType(tmpLoc) == 13
		|| TerrainType(tmpLoc) == 14
		|| TerrainType(tmpLoc) == 15
		|| TerrainType(tmpLoc) == 16
		|| TerrainType(tmpLoc) == 22
		|| TerrainType(tmpLoc) == 23)) {	// Don't need settler for water terrains
		if(IsHumanPlayer(tmpPlayer)) {	// Only do it for Human as AI's wouldn't be able to handle it
			numUnits = GetUnitsAtLocation(tmpLoc);
			if(numUnits > 0) {
				for(counter = 0; counter < numUnits; counter = counter + 1) {
					GetUnitFromCell(tmpLoc, counter, tmpUnit);
					if(tmpUnit.type == UnitDB(UNIT_WORKER)) { 
						settlerUnit = 1;
					}
				}
			}
			if(settlerUnit == 0) {
				return STOP;	// Don't build if no settler there
			}
		}
		else{
			numUnits = GetUnitsAtLocation(tmpLoc);
			if(numUnits > 0) {
				for(counter = 0; counter < numUnits; counter = counter + 1) {
					GetUnitFromCell(tmpLoc, counter, tmpUnit);
					if(tmpUnit.type == UnitDB(UNIT_WORKER)) {	// Look for a settler unit
						settlerUnit = 1;
						settlerUnit2 = 1;
					}
				}
			}
			if(settlerUnit2 == 0) {
				for(counter = 0; counter < player[0].armies; counter = counter + 1) {
					GetArmyByIndex(tmpPlayer, i, tmpArmy);
					numUnits = GetUnitsAtLocation(tmpLoc);
					for(counter2 = 0; counter2 < numUnits; counter2 = counter2 + 1) {
						GetUnitFromCell(tmpLoc, counter2, tmpUnit);
						if(tmpUnit.type == UnitDB(UNIT_WORKER)) {
							for(i = 0; i < STUPID_SYSTEM_UNIT.#; i = i + 1) {
								if(tmpUnit !=  STUPID_SYSTEM_UNIT[i]
								&& RETARD_WORKER_IS_WORKING[i] == 0) {	
									settlerUnit = 1;
									Event: MovePathOrder(tmpArmy, tmpLoc);
									SaveWorkerWork(tmpUnit, tmpLoc, Value[0]); 
								}
							}
						}
					}
				}
			}
			if(settlerUnit2 == 0) {
				i = 0;
				while(settlerUnit2 == 0 && i < 4) { 
					numCities = PlayerCityCount(tmpPlayer);
					randnum = Random(numCities);
					GetCityByIndex(tmpPlayer, randnum, tmpCity);
					if(CityIsValid(tmpCity)) {
						AddUnitToBuildList(tmpCity, UnitDB(UNIT_WORKER));
						settlerUnit2 = 1;
					}
					i = i + 1;
				}
			}
			if(settlerUnit == 0) {
				return STOP;
			}
		}	
	}
}

HandleEvent(GroupOrder) 'DonLrtWorkerBeGrouped' pre {
int_t i;
int_t numUnits;
location_t tmpLoc;
unit_t tmpUnit;
	tmpLoc = army[0].location;
	numUnits = GetUnitsAtLocation(tmpLoc);
	for(i = 0; i < numUnits; i = i + 1) {
		GetUnitFromCell(tmpLoc, i, tmpUnit);
		if(tmpUnit.type == UnitDB(UNIT_WORKER)) {	// Look for a settler unit
			return STOP;
		}
	}
}

HandleEvent(BeginTurn) 'WorkIsSoRetardThatWeMustRemindHim' pre {
int_t i;
unit_t tmpUnit;
	for(i = 0; i < STUPID_SYSTEM_UNIT.#; i = i + 1) {
		if(RETARD_WORKER_IS_WORKING[i] == 1) {	
			Event: MovePathOrder(STUPID_SYSTEM_UNIT[i], I_LOVE_PW_LOCATION[i]);
		}
	}
}

HandleEvent(EndTurn) 'CheckIfUnitMetHisGoal' pre {
int_t i;
unit_t tmpUnit;
	for(i = 0; i < I_LOVE_PW_LOCATION.#; i = i + 1) {
		GetUnitFromCell(I_LOVE_PW_LOCATION[i], i, tmpUnit);
		if(tmpUnit.type == UnitDB(UNIT_WORKER)) {	// Look for a settler unit
			Event: CreateImprovement(player[0], I_LOVE_PW_LOCATION[i], WORKERS_ARE_STUPID_GOOD[i], 0);
			RETARD_WORKER_IS_WORKING[i] = 0;
		}
	}
}


