//////////////////////////////////////////////////////////////////////////// // // 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; } } }