bin/ai/regression/regression.nut
author truelight
Wed, 17 Oct 2007 23:45:22 +0000
branchnoai
changeset 9709 196a08fbfeb6
parent 9700 e442ce398e83
child 9710 ba44f8c1fd52
permissions -rw-r--r--
(svn r11289) [NoAI] -Add [FS#1346]: added AIVehicle::Is(Stopped)InDepot() (dihedral)
class Regression extends AIController {
	stop     = false;

	function Start();
	function Stop();

	constructor() {	}
}



function Regression::TestInit()
{
	local settings = AISettings();

	print("");
	print("--TestInit--");
	print(" TickTest: " + this.GetTick());
	this.Sleep(1);
	print(" TickTest: " + this.GetTick());
	print(" SetCommandDelay: " + settings.SetCommandDelay(1));
}

function Regression::Std()
{
	print("");
	print("--Std--");
	print(" abs(-21): " + abs(-21));
	print(" abs( 21): " + abs(21));
}

function Regression::Base()
{
	local base = AIBase();

	print("");
	print("--AIBase--");
	print("  Rand():       " + base.Rand());
	print("  Rand():       " + base.Rand());
	print("  Rand():       " + base.Rand());
	print("  RandRange(0): " + base.RandRange(0));
	print("  RandRange(0): " + base.RandRange(0));
	print("  RandRange(0): " + base.RandRange(0));
	print("  RandRange(1): " + base.RandRange(1));
	print("  RandRange(1): " + base.RandRange(1));
	print("  RandRange(1): " + base.RandRange(1));
	print("  RandRange(2): " + base.RandRange(2));
	print("  RandRange(2): " + base.RandRange(2));
	print("  RandRange(2): " + base.RandRange(2));
	print("  RandRange(9): " + base.RandRange(9));
	print("  RandRange(9): " + base.RandRange(9));
	print("  RandRange(9): " + base.RandRange(9));
	print("  Chance(1, 2): " + base.Chance(1, 2));
	print("  Chance(1, 2): " + base.Chance(1, 2));
	print("  Chance(1, 2): " + base.Chance(1, 2));
}

function Regression::Airport()
{
	local airport = AIAirport();
	local company = AICompany();

	print("");
	print("--AIAirport--");

	print("  IsHangarTile():       " + airport.IsHangarTile(32116));
	print("  IsAirportTile():      " + airport.IsAirportTile(32116));
	print("  GetHangarOfAirport(): " + airport.GetHangarOfAirport(32116));

	for (local i = -1; i < 10; i++) {
		print("  AiportAvailable(" + i + "):          " + airport.AiportAvailable(i));
		print("  GetAirportWidth(" + i + "):          " + airport.GetAirportWidth(i));
		print("  GetAirportHeight(" + i + "):         " + airport.GetAirportHeight(i));
		print("  GetAirportCoverageRadius(" + i + "): " + airport.GetAirportCoverageRadius(i));
	}

	print("  GetBankBalance():     " + company.GetBankBalance(AICompany.MY_COMPANY));
	print("  BuildAirport():       " + airport.BuildAirport(32116, 0));
	print("  IsHangarTile():       " + airport.IsHangarTile(32116));
	print("  IsAirportTile():      " + airport.IsAirportTile(32116));
	print("  GetHangarOfAirport(): " + airport.GetHangarOfAirport(32116));
	print("  IsHangarTile():       " + airport.IsHangarTile(32119));
	print("  IsAirportTile():      " + airport.IsAirportTile(32119));
	print("  GetBankBalance():     " + company.GetBankBalance(AICompany.MY_COMPANY));

	print("  RemoveAirport():      " + airport.RemoveAirport(32118));
	print("  IsHangarTile():       " + airport.IsHangarTile(32119));
	print("  IsAirportTile():      " + airport.IsAirportTile(32119));
	print("  GetBankBalance():     " + company.GetBankBalance(AICompany.MY_COMPANY));
	print("  BuildAirport():       " + airport.BuildAirport(32116, 0));
}

function Regression::Cargo()
{
	local cargo = AICargo();

	print("");
	print("--AICargo--");
	for (local i = -1; i < 15; i++) {
		print("  Cargo " + i);
		print("    IsValidCargo():          " + cargo.IsValidCargo(i));
		print("    GetCargoLabel():         '" + cargo.GetCargoLabel(i)+ "'");
		print("    IsFreight():             " + cargo.IsFreight(i));
		print("    GetCargoIncome(0, 0):    " + cargo.GetCargoIncome(0, 0, i));
		print("    GetCargoIncome(10, 10):  " + cargo.GetCargoIncome(10, 10, i));
		print("    GetCargoIncome(100, 10): " + cargo.GetCargoIncome(100, 10, i));
		print("    GetCargoIncome(10, 100): " + cargo.GetCargoIncome(10, 100, i));
	}
}

function Regression::Company()
{
	local company = AICompany();

	print("");
	print("--Company--");

	/* Test AIXXXMode() in scopes */
	{
		local test = AITestMode();
		print("  SetCompanyName():     " + company.SetCompanyName("Regression"));
		print("  SetCompanyName():     " + company.SetCompanyName("Regression"));
		{
			local exec = AIExecMode();
			print("  SetCompanyName():     " + company.SetCompanyName("Regression"));
			print("  SetCompanyName():     " + company.SetCompanyName("Regression"));
		}
	}

	print("  GetCompanyName():            " + company.GetCompanyName(AICompany.MY_COMPANY));
	print("  GetPresidentName():          " + company.GetPresidentName(AICompany.MY_COMPANY));
	print("  SetPresidentName():          " + company.SetPresidentName("Regression AI"));
	print("  GetPresidentName():          " + company.GetPresidentName(AICompany.MY_COMPANY));
	print("  GetCompanyValue():           " + company.GetCompanyValue(AICompany.MY_COMPANY));
	print("  GetBankBalance():            " + company.GetBankBalance(AICompany.MY_COMPANY));
	print("  GetCompanyName():            " + company.GetCompanyName(240));
	print("  GetLoanAmount():             " + company.GetLoanAmount());
	print("  GetMaxLoanAmount():          " + company.GetMaxLoanAmount());
	print("  GetLoanInterval():           " + company.GetLoanInterval());
	print("  SetLoanAmount(1):            " + company.SetLoanAmount(1));
	print("  SetLoanAmount(100):          " + company.SetLoanAmount(100));
	print("  SetLoanAmount(10000):        " + company.SetLoanAmount(10000));
	print("  GetBankBalance():            " + company.GetBankBalance(AICompany.MY_COMPANY));
	print("  GetLoanAmount():             " + company.GetLoanAmount());
	print("  SetMinimumLoanAmount(31337): " + company.SetMinimumLoanAmount(31337));
	print("  GetBankBalance():            " + company.GetBankBalance(AICompany.MY_COMPANY));
	print("  GetLoanAmount():             " + company.GetLoanAmount());
	print("  SetLoanAmount(10000):        " + company.SetLoanAmount(company.GetMaxLoanAmount()));
	print("  GetBankBalance():            " + company.GetBankBalance(AICompany.MY_COMPANY));
	print("  GetLoanAmount():             " + company.GetLoanAmount());
}

function Regression::Event()
{
	print("");
	print("--Event--");
	AIEventController.Test();
	local e = AIEventController.GetNextEvent();
	print("  GetNextEvent:      " + (e == null ? "null" : "instance"));
	print("    GetEventType:    " + e.GetEventType());
	local c = AIEventTest.Convert(e);
	print("    Convert:         " + (c == null ? "null" : "instance"));
	print("      GetTest:       " + c.GetTest());

	print("  DisableEvent(1):   done");
	AIEventController.DisableEvent(1);
	AIEventController.Test();
	e = AIEventController.GetNextEvent();
	print("  GetNextEvent:      " + (e == null ? "null" : "instance"));

	print("  EnableEvent(1):    done");
	AIEventController.EnableEvent(1);
	AIEventController.Test();
	e = AIEventController.GetNextEvent();
	print("  GetNextEvent:      " + (e == null ? "null" : "instance"));

	{
		print("  DisableAllEvents():done");
		AIEventController.DisableAllEvents();
		AIEventController.Test();
		e = AIEventController.GetNextEvent();
		print("  GetNextEvent:      " + (e == null ? "null" : "instance"));
	}

	print("  EnableEvent(1):    done");
	AIEventController.EnableEvent(1);
	AIEventController.Test();
	e = AIEventController.GetNextEvent();
	print("  GetNextEvent:      " + (e == null ? "null" : "instance"));
	e = AIEventController.GetNextEvent();
	print("  GetNextEvent:      " + (e == null ? "null" : "instance"));
}

function Regression::Industry()
{
	local industry = AIIndustry();
	local j = 0;

	print("");
	print("--Industry--");
	print("  GetMaxIndustryID():  " + industry.GetMaxIndustryID());
	print("  GetIndustryCount():  " + industry.GetIndustryCount());
	for (local i = -1; i < industry.GetMaxIndustryID() + 1; i++) {
		if (industry.IsValidIndustry(i)) j++;
		print("  Industry " + i);
		print("    IsValidIndustry(): " + industry.IsValidIndustry(i));
		print("    GetName():         " + industry.GetName(i));
		print("    GetLocation():     " + industry.GetLocation(i));
	}
	print("  Valid Industries:    " + j);
	print("  GetIndustryCount():  " + industry.GetIndustryCount());
}

function Regression::IndustryList()
{
	local list = AIIndustryList();

	print("");
	print("--IndustryList--");
	print("  Count():             " + list.Count());
	list.Valuate(AIIndustryListLocation());
	print("  Location ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIIndustryListDistanceManhattanToTile(30000));
	print("  DistanceManhattanToTile(30000) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIIndustryListDistanceSquareToTile(30000));
	print("  DistanceSquareToTile(30000) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIIndustryListProduction(1));
	list.KeepAboveValue(50);
	print("  KeepAboveValue(50): done");
	print("  Count():             " + list.Count());
	print("  Production ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
}

function Regression::List()
{
	local list = AIList();

	print("");
	print("--List--");

	print("  IsEmpty():     " + list.IsEmpty());
	list.AddItem(1, 1);
	list.AddItem(2, 2);
	for (local i = 1000; i < 1100; i++) {
		list.AddItem(i, i);
	}
	list.RemoveItem(1050);
	list.RemoveItem(1150);
	list.ChangeItem(1051, 12);
	print("  Count():       " + list.Count());
	print("  HasItem(1050): " + list.HasItem(1050));
	print("  HasItem(1051): " + list.HasItem(1051));
	print("  IsEmpty():     " + list.IsEmpty());
	list.Sort(AIAbstractList.SORT_BY_ITEM, true);
	print("  List Dump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIListRandomize());
	print("  Randomize ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}

	list.KeepTop(10);
	print("  KeepTop(10):");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.KeepBottom(8);
	print("  KeepBottom(8):");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.RemoveBottom(2);
	print("  RemoveBottom(2):");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.RemoveTop(2);
	print("  RemoveTop(2):");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}

	local list2 = AIList();
	list2.AddItem(1003, 0);
	list2.AddItem(1004, 0);
	list.RemoveList(list2);
	print("  RemoveList({1003, 1004}):");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list2.AddItem(1005, 0);
	list.KeepList(list2);
	print("  KeepList({1003, 1004, 1005}):");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}

	list.Clear();
	print("  IsEmpty():     " + list.IsEmpty());
}

function Regression::Map()
{
	local map = AIMap();

	print("");
	print("--Map--");
	print("  GetMapSize():     " + map.GetMapSize());
	print("  GetMapSizeX():    " + map.GetMapSizeX());
	print("  GetMapSizeY():    " + map.GetMapSizeY());
	print("  GetTileX(123):    " + map.GetTileX(123));
	print("  GetTileY(123):    " + map.GetTileY(123));
	print("  GetTileIndex():   " + map.GetTileIndex(123, 0));
	print("  GetTileIndex():   " + map.GetTileIndex(0, 123));
	print("  GetTileIndex():   " + map.GetTileIndex(0, 0));
	print("  GetTileIndex():   " + map.GetTileIndex(-1, -1));
	print("  GetTileIndex():   " + map.GetTileIndex(10000, 10000));
	print("  IsValidTile(123): " + map.IsValidTile(123));
	print("  GetTileX(124):    " + map.GetTileX(124));
	print("  GetTileY(124):    " + map.GetTileY(124));
	print("  IsValidTile(124): " + map.IsValidTile(124));
	print("  IsValidTile(0):   " + map.IsValidTile(0));
	print("  IsValidTile(-1):  " + map.IsValidTile(-1));
	print("  IsValidTile():    " + map.IsValidTile(map.GetMapSize()));
	print("  IsValidTile():    " + map.IsValidTile(map.GetMapSize() - 1));
	print("  DemolishTile():   " + map.DemolishTile(19592));
	print("  DemolishTile():   " + map.DemolishTile(19335));
	print("  Distance");
	print("    DistanceManhattan(): " + map.DistanceManhattan(1, 10000));
	print("    DistanceMax():       " + map.DistanceMax(1, 10000));
	print("    DistanceSquare():    " + map.DistanceSquare(1, 10000));
	print("    DistanceFromEdge():  " + map.DistanceFromEdge(10000));
}

function Regression::Marine()
{
	local marine = AIMarine();
	local company = AICompany();

	print("");
	print("--AIMarine--");

	print("  IsWaterDepotTile():   " + marine.IsWaterDepotTile(32116));
	print("  IsDockTile():         " + marine.IsDockTile(32116));
	print("  IsBuoyTile():         " + marine.IsBuoyTile(32116));
	print("  IsLockTile():         " + marine.IsLockTile(32116));
	print("  IsCanalTile():        " + marine.IsCanalTile(32116));

	print("  GetBankBalance():     " + company.GetBankBalance(AICompany.MY_COMPANY));
	print("  BuildWaterDepot():    " + marine.BuildWaterDepot(28479, false));
	print("  BuildDock():          " + marine.BuildDock(29253));
	print("  BuildBuoy():          " + marine.BuildBuoy(28481));
	print("  BuildLock():          " + marine.BuildLock(28487));
	print("  BuildCanal():         " + marine.BuildCanal(32127));
	print("  IsWaterDepotTile():   " + marine.IsWaterDepotTile(28479));
	print("  IsDockTile():         " + marine.IsDockTile(29253));
	print("  IsBuoyTile():         " + marine.IsBuoyTile(28481));
	print("  IsLockTile():         " + marine.IsLockTile(28487));
	print("  IsCanalTile():        " + marine.IsCanalTile(32127));
	print("  GetBankBalance():     " + company.GetBankBalance(AICompany.MY_COMPANY));

	print("  RemoveWaterDepot():   " + marine.RemoveWaterDepot(28479));
	print("  RemoveDock():         " + marine.RemoveDock(29253));
	print("  RemoveBuoy():         " + marine.RemoveBuoy(28481));
	print("  RemoveLock():         " + marine.RemoveLock(28487));
	print("  RemoveCanal():        " + marine.RemoveCanal(32127));
	print("  IsWaterDepotTile():   " + marine.IsWaterDepotTile(28479));
	print("  IsDockTile():         " + marine.IsDockTile(29253));
	print("  IsBuoyTile():         " + marine.IsBuoyTile(28481));
	print("  IsLockTile():         " + marine.IsLockTile(28487));
	print("  IsCanalTile():        " + marine.IsCanalTile(32127));
	print("  GetBankBalance():     " + company.GetBankBalance(AICompany.MY_COMPANY));

	print("  BuildWaterDepot():    " + marine.BuildWaterDepot(28479, false));
	print("  BuildDock():          " + marine.BuildDock(29253));
}

function Regression::Order()
{
	local order = AIOrder();

	print("");
	print("--Order--");
	print("  GetNumberOfOrders():   " + order.GetNumberOfOrders(11));
	print("  GetOrderDestination(): " + order.GetOrderDestination(11, 1));
	print("  AreOrderFlagsValid():  " + order.AreOrderFlagsValid(33416, AIOrder.AIOF_TRANSFER));
	print("  IsValidVehicleOrder(): " + order.IsValidVehicleOrder(11, 1));
	print("  GetOrderFlags():       " + order.GetOrderFlags(11, 1));
	print("  AppendOrder():         " + order.AppendOrder(11, 33416, AIOrder.AIOF_TRANSFER));
	print("  InsertOrder():         " + order.InsertOrder(11, 0, 33416, AIOrder.AIOF_TRANSFER));
	print("  GetNumberOfOrders():   " + order.GetNumberOfOrders(11));
	print("  IsValidVehicleOrder(): " + order.IsValidVehicleOrder(11, 1));
	print("  RemoveOrder():         " + order.RemoveOrder(11, 0));
	print("  ChangeOrder():         " + order.ChangeOrder(11, 0, AIOrder.AIOF_FULL_LOAD));
	print("  GetOrderDestination(): " + order.GetOrderDestination(11, 0));
	print("  CopyOrders():          " + order.CopyOrders(11, 1));
	print("  CopyOrders():          " + order.CopyOrders(12, 11));
	print("  ShareOrders():         " + order.ShareOrders(12, 1));
	print("  ShareOrders():         " + order.ShareOrders(12, 11));
	print("  UnshareOrders():       " + order.UnshareOrders(12));
	print("  AppendOrder():         " + order.AppendOrder(11, 33421, AIOrder.AIOF_NONE));

	local list = AIVehicleStationList(11);

	print("");
	print("--VehicleStationList--");
	print("  Count():             " + list.Count());
	list.Valuate(AIStationListLocation());
	print("  Location ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIStationListCargoWaiting(0));
	print("  CargoWaiting(0) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIStationListCargoWaiting(1));
	print("  CargoWaiting(1) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIStationListCargoRating(1));
	print("  CargoRating(1) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIStationListDistanceManhattanToTile(30000));
	print("  DistanceManhattanToTile(30000) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIStationListDistanceSquareToTile(30000));
	print("  DistanceSquareToTile(30000) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}

	list = AIStationVehicleList(3);

	print("");
	print("--StationVehicleList--");
	print("  Count():             " + list.Count());
	list.Valuate(AIVehicleListLocation());
	print("  Location ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
}

function Regression::PathFinder()
{
	local pf = AIPathFinderStupid(AIPathFinder.PATHFINDER_ROAD);
	local start = AITileList();
	local end = AITileList();

	start.AddTile(33421);
	end.AddTile(33480 + 256 * 10);

	print("");
	print("--PathFinderStupid--");
	local ret = pf.FindRoute(start, end);
	print("  FindRoute():  " + (ret ? "Route Array" : "Nil"));
	print("  BuildRoute(): " + pf.BuildRoute(ret));
	pf.FreeRoute(ret);

	local road = AIRoad();
	print("  IsRoadTile(): " + road.IsRoadTile(33425));
	print("  IsRoadTile(): " + road.IsRoadTile(33480 + 256 * 5));
}

function Regression::Road()
{
	local road = AIRoad();

	print("");
	print("--Road--");
	print("  Road");
	print("    IsRoadTile():                  " + road.IsRoadTile(33411));
	print("    BuildRoad():                   " + road.BuildRoad(0, 1));
	print("    BuildRoad():                   " + road.BuildRoad(33411, 33411));
	print("    BuildRoad():                   " + road.BuildRoad(33411, 33414));
	print("    AreRoadTilesConnected():       " + road.AreRoadTilesConnected(33412, 33413));
	print("    IsRoadTile():                  " + road.IsRoadTile(33411));
	print("    GetNeighbourRoadCount():       " + road.GetNeighbourRoadCount(33412));
	print("    RemoveRoad():                  " + road.RemoveRoad(33411, 33411));
	print("    RemoveRoad():                  " + road.RemoveRoad(33411, 33412));
	print("    RemoveRoad():                  " + road.RemoveRoad(19590, 19590));

	print("  Depot");
	print("    IsRoadTile():                  " + road.IsRoadTile(33411));
	print("    BuildRoadDepot():              " + road.BuildRoadDepot(0, 1));
	print("    BuildRoadDepot():              " + road.BuildRoadDepot(33411, 33411));
	print("    BuildRoadDepot():              " + road.BuildRoadDepot(33411, 33414));
	print("    BuildRoadDepot():              " + road.BuildRoadDepot(33411, 33412));
	print("    IsRoadTile():                  " + road.IsRoadTile(33411));
	print("    GetRoadDepotFrontTile():       " + road.GetRoadDepotFrontTile(33411));
	print("    IsRoadDepotTile():             " + road.IsRoadDepotTile(33411));
	print("    RemoveRoadDepot():             " + road.RemoveRoadDepot(33411));
	print("    RemoveRoadDepot():             " + road.RemoveRoadDepot(33411));

	print("  Station");
	print("    IsRoadTile():                  " + road.IsRoadTile(33411));
	print("    BuildRoadStation():            " + road.BuildRoadStation(0, 1, false, false));
	print("    BuildRoadStation():            " + road.BuildRoadStation(33411, 33411, false, false));
	print("    BuildRoadStation():            " + road.BuildRoadStation(33411, 33414, false, false));
	print("    BuildRoadStation():            " + road.BuildRoadStation(33411, 33412, false, false));
	print("    IsRoadTile():                  " + road.IsRoadTile(33411));
	print("    GetDriveThroughBackTile():     " + road.GetDriveThroughBackTile(33411));
	print("    GetRoadStationFrontTile():     " + road.GetRoadStationFrontTile(33411));
	print("    IsRoadStationTile():           " + road.IsRoadStationTile(33411));
	print("    IsDriveThroughRoadStationTile: " + road.IsDriveThroughRoadStationTile(33411));
	print("    RemoveRoadStation():           " + road.RemoveRoadStation(33411));
	print("    RemoveRoadStation():           " + road.RemoveRoadStation(33411));

	print("  Station Types");
	print("    BuildRoadStation(bus):         " + road.BuildRoadStation(33411, 33410, false, false));
	print("    BuildRoadStation(truck):       " + road.BuildRoadStation(33421, 33422, true,  false));
	print("    BuildRoadStation(truck):       " + road.BuildRoadStation(33412, 33413, true,  false));
	print("    BuildRoadStation(bus):         " + road.BuildRoadStation(33411 + 256, 33411, false, false));
	print("    BuildRoadStation(truck):       " + road.BuildRoadStation(33412 + 256, 33412 + 256 + 256, true,  false));
	print("    BuildRoadStation(bus-drive):   " + road.BuildRoadStation(33413, 33412, false, true));
	print("    BuildRoadStation(truck-drive): " + road.BuildRoadStation(33414, 33413, true,  true));
	print("    BuildRoadStation(bus-drive):   " + road.BuildRoadStation(33415, 33414, false, true));
	print("    BuildRoadStation(truck-drive): " + road.BuildRoadStation(33416, 33415, true,  true));
	print("    BuildRoadDepot():              " + road.BuildRoadDepot(33417, 33418));
	print("    GetRoadStationFrontTile():     " + road.GetRoadStationFrontTile(33411 + 256));
	print("    GetRoadStationFrontTile():     " + road.GetRoadStationFrontTile(33412 + 256));
	print("    IsDriveThroughRoadStationTile: " + road.IsDriveThroughRoadStationTile(33415));
	print("    GetDriveThroughBackTile():     " + road.GetDriveThroughBackTile(33415));
	print("    GetRoadStationFrontTile():     " + road.GetRoadStationFrontTile(33415));
	print("    IsRoadTile():                  " + road.IsRoadTile(33415));
}

function Regression::Sign()
{
	local sign = AISign();
	local j = 0;

	print("");
	print("--Sign--");
	print("  BuildSign(33410, 'Some Sign'):       " + sign.BuildSign(33410, "Some Sign"));
	local sign_id = sign.BuildSign(33409, "Some other Sign");
	print("  BuildSign(33409, 'Some other Sign'): " + sign_id);
	print("  RemoveSign(" + sign_id + "):                       " + sign.RemoveSign(sign_id));
	print("");
	print("  GetMaxSignID():    " + sign.GetMaxSignID());
	print("  GetSignCount():    " + sign.GetSignCount());
	for (local i = -1; i < sign.GetMaxSignID() + 1; i++) {
		if (sign.IsValidSign(i)) j++;
		print("  Sign " + i);
		print("    IsValidSign():   " + sign.IsValidSign(i));
		print("    GetText():       " + sign.GetText(i));
		print("    GetLocation():   " + sign.GetLocation(i));
	}
	print("  Valid Signs:       " + j);
	print("  GetSignCount():    " + sign.GetSignCount());
}

function Regression::Station()
{
	local station = AIStation();

	print("");
	print("--Station--");
	print("  IsValidStation(0):        " + station.IsValidStation(0));
	print("  IsValidStation(1000):     " + station.IsValidStation(1000));
	print("  GetName(0):               " + station.GetName(0));
	print("  GetLocation(1):           " + station.GetLocation(1));
	print("  GetLocation(1000):        " + station.GetLocation(1000));
	print("  GetStationID(33411):      " + station.GetStationID(33411));
	print("  GetStationID(34411):      " + station.GetStationID(34411));
	print("  GetCargoWaiting(0, 0):    " + station.GetCargoWaiting(0, 0));
	print("  GetCargoWaiting(1000, 0): " + station.GetCargoWaiting(1000, 0));
	print("  GetCargoWaiting(0, 1000): " + station.GetCargoWaiting(0, 1000));

	print("  GetCoverageRadius(bus):   " + station.GetCoverageRadius(AIStation.STATION_BUS_STOP));
	print("  GetCoverageRadius(truck): " + station.GetCoverageRadius(AIStation.STATION_TRUCK_STOP));
	print("  GetCoverageRadius(train): " + station.GetCoverageRadius(AIStation.STATION_TRAIN));

	local list = AIStationList(AIStation.STATION_BUS_STOP + AIStation.STATION_TRUCK_STOP);

	print("");
	print("--StationList--");
	print("  Count():             " + list.Count());
	list.Valuate(AIStationListLocation());
	print("  Location ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIStationListCargoWaiting(0));
	print("  CargoWaiting(0) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIStationListCargoWaiting(1));
	print("  CargoWaiting(1) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
}

function Regression::TileList()
{
	local list = AITileList();

	print("");
	print("--TileList--");
	print("  Count():             " + list.Count());
	list.AddRectangle(41895 - 256 * 2, 256 * 2 + 41895 + 8);
	print("  Count():             " + list.Count());

	list.Valuate(AITileListHeight());
	print("  Height():            done");
	print("  Count():             " + list.Count());
	print("  ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}

	list.Valuate(AITileListSlope());
	list.KeepValue(0);
	print("  Slope():             done");
	print("  KeepValue(0):        done");
	print("  Count():             " + list.Count());
	print("  ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}

	list.Valuate(AITileListBuildable());
	list.KeepValue(1);
	print("  Buildable():         done");
	print("  KeepValue(1):        done");
	print("  Count():             " + list.Count());

	list.Valuate(AITileListBuildableRectangle(3, 3));
	print("  BuildableRectangle(3, 3) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AITileListDistanceManhattanToTile(30000));
	print("  DistanceManhattanToTile(30000) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AITileListDistanceSquareToTile(30000));
	print("  DistanceSquareToTile(30000) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}

	list.Valuate(AITileListCargoAcceptance(0, 1, 1, 3));
	list.KeepAboveValue(10);
	print("  CargoAcceptance():   done");
	print("  KeepAboveValue(10):  done");
	print("  Count():             " + list.Count());
	print("  ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}

	list.Valuate(AITileListRoadTile());
	list.KeepValue(1);
	print("  RoadTile():          done");
	print("  KeepValue(1):        done");
	print("  Count():             " + list.Count());
	print("  ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}

	list.Valuate(AITileListNeighbourRoadCount());
	list.KeepValue(1);
	print("  NeighbourRoadCount():done");
	print("  KeepValue(1):        done");
	print("  Count():             " + list.Count());
	print("  ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}

	list.AddRectangle(54421 - 256 * 2, 256 * 2 + 54421 + 8);
	list.Valuate(AITileListWater());
	print("  Water():             done");
	print("  Count():             " + list.Count());
	print("  ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
}

function Regression::Town()
{
	local town = AITown();
	local j = 0;

	print("");
	print("--Town--");
	print("  GetMaxTownID():    " + town.GetMaxTownID());
	print("  GetTownCount():    " + town.GetTownCount());
	for (local i = -1; i < town.GetMaxTownID() + 1; i++) {
		if (town.IsValidTown(i)) j++;
		print("  Town " + i);
		print("    IsValidTown():   " + town.IsValidTown(i));
		print("    GetName():       " + town.GetName(i));
		print("    GetPopulation(): " + town.GetPopulation(i));
		print("    GetLocation():   " + town.GetLocation(i));
	}
	print("  Valid Towns:       " + j);
	print("  GetTownCount():    " + town.GetTownCount());
}

function Regression::TownList()
{
	local list = AITownList();

	print("");
	print("--TownList--");
	print("  Count():             " + list.Count());
	list.Valuate(AITownListLocation());
	print("  Location ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AITownListDistanceManhattanToTile(30000));
	print("  DistanceManhattanToTile(30000) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AITownListDistanceSquareToTile(30000));
	print("  DistanceSquareToTile(30000) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AITownListPopulation());
	list.KeepAboveValue(500);
	print("  KeepAboveValue(500): done");
	print("  Count():             " + list.Count());
	print("  Population ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
}

function Regression::Vehicle()
{
	local accounting = AIAccounting();
	local company = AICompany();
	local vehicle = AIVehicle();
	local j = 0;

	print("");
	print("--Vehicle--");
	for (local i = -1; i < 257; i++) {
		if (vehicle.IsValidEngine(i)) j++;
		print("  Engine " + i);
		print("    IsValidEngine():    " + vehicle.IsValidEngine(i));
	}
	print("  Valid Engines:        " + j);
	print("  IsValidVehicle(-1):   " + vehicle.IsValidVehicle(-1));
	print("  IsValidVehicle(0):    " + vehicle.IsValidVehicle(0));
	print("  IsValidVehicle(11):   " + vehicle.IsValidVehicle(11));
	print("  ISValidVehicle(9999): " + vehicle.IsValidVehicle(9999));

	for (local i = -1; i < 15; i++) {
		print("  FindBestRoadVehicle Cargo " + i);
		print("    Cost 0:             " + vehicle.FindBestRoadVehicle(i, 0,   0));
		print("    Cost 10000:         " + vehicle.FindBestRoadVehicle(i, 0,   10000));
		print("    Cost 50000:         " + vehicle.FindBestRoadVehicle(i, 0,   50000));
		print("    Reliability 0:      " + vehicle.FindBestRoadVehicle(i, 0,   1000000));
		print("    Reliability 50:     " + vehicle.FindBestRoadVehicle(i, 50,  1000000));
		print("    Reliability 100:    " + vehicle.FindBestRoadVehicle(i, 100, 1000000));
	}
	for (local i = -1; i < 15; i++) {
		print("  FindBestAirVehicle Cargo " + i);
		print("    Reliability 0:      " + vehicle.FindBestAirVehicle(i, 0,   1000000));
		print("    Reliability 50:     " + vehicle.FindBestAirVehicle(i, 50,  1000000));
		print("    Reliability 100:    " + vehicle.FindBestAirVehicle(i, 100, 1000000));
	}
	for (local i = -1; i < 15; i++) {
		print("  FindBestWaterVehicle Cargo " + i);
		print("    Reliability 0:      " + vehicle.FindBestWaterVehicle(i, 0,   1000000));
		print("    Reliability 50:     " + vehicle.FindBestWaterVehicle(i, 50,  1000000));
		print("    Reliability 100:    " + vehicle.FindBestWaterVehicle(i, 100, 1000000));
	}

	local bank = company.GetBankBalance(AICompany.MY_COMPANY);

	{
		local transaction = AITransactionMode();
		print("  BuildVehicle():       " + vehicle.BuildVehicle(33417, 153));
		print("  IsValidVehicle(11):   " + vehicle.IsValidVehicle(11));

		print("  --Transaction--");
		print("    GetCosts():         " + transaction.GetCosts());
		print("    Execute():          " + transaction.Execute());

		print("  IsValidVehicle(11):   " + vehicle.IsValidVehicle(11));
	}
	print("  CloneVehicle():       " + vehicle.CloneVehicle(33417, 11, true));

	local bank_after = company.GetBankBalance(AICompany.MY_COMPANY);

	print("  --Accounting--");
	print("    GetCosts():         " + accounting.GetCosts());
	print("    Should be:          " + (bank - bank_after));
	print("    ResetCosts():       " + accounting.ResetCosts());

	bank = company.GetBankBalance(AICompany.MY_COMPANY);

	print("  SellVehicle(12):      " + vehicle.SellVehicle(12));
	print("  IsInDepot():          " + vehicle.IsInDepot(11));
	print("  IsStoppedInDepot():   " + vehicle.IsStoppedInDepot(11));
	print("  StartStopVehicle():   " + vehicle.StartStopVehicle(11));
	print("  IsInDepot():          " + vehicle.IsInDepot(11));
	print("  IsStoppedInDepot():   " + vehicle.IsStoppedInDepot(11));
	print("  SendVehicleToDepot(): " + vehicle.SendVehicleToDepot(11));
	print("  IsInDepot():          " + vehicle.IsInDepot(11));
	print("  IsStoppedInDepot():   " + vehicle.IsStoppedInDepot(11));

	bank_after = company.GetBankBalance(AICompany.MY_COMPANY);

	print("  --Accounting--");
	print("    GetCosts():         " + accounting.GetCosts());
	print("    Should be:          " + (bank - bank_after));

	print("  GetName():            " + vehicle.GetName(11));
	print("  SetName():            " + vehicle.SetName(11, "MyVehicleName"));
	print("  GetName():            " + vehicle.GetName(11));
	print("  CloneVehicle():       " + vehicle.CloneVehicle(33417, 11, true));

	print("  --VehicleData--");
	print("    GetLocation():       " + vehicle.GetLocation(11));
	print("    GetEngineType():     " + vehicle.GetEngineType(11));
	print("    GetUnitNumber():     " + vehicle.GetUnitNumber(11));
	print("    GetAge():            " + vehicle.GetAge(11));
	print("    GetMaxAge():         " + vehicle.GetMaxAge(11));
	print("    GetAgeLeft():        " + vehicle.GetAgeLeft(11));
	print("    GetProfitThisYear(): " + vehicle.GetProfitThisYear(11));
	print("    GetProfitLastYear(): " + vehicle.GetProfitLastYear(11));
	print("    GetVehicleType():    " + vehicle.GetVehicleType(11));
	print("    IsInDepot():         " + vehicle.IsInDepot(11));
	print("    IsStoppedInDepot():  " + vehicle.IsStoppedInDepot(11));

	print("  BuildVehicle():       " + vehicle.BuildVehicle(32119, 219));
	print("  IsValidVehicle(13):   " + vehicle.IsValidVehicle(13));
	print("  IsInDepot(13):        " + vehicle.IsInDepot(13));
	print("  IsStoppedInDepot(13): " + vehicle.IsStoppedInDepot(13));
	print("  IsValidVehicle(14):   " + vehicle.IsValidVehicle(14));
	print("  IsInDepot(14):        " + vehicle.IsInDepot(14));
	print("  IsStoppedInDepot(14): " + vehicle.IsStoppedInDepot(14));

	print("  BuildVehicle():       " + vehicle.BuildVehicle(28479, 204));
	print("  IsValidVehicle(15):   " + vehicle.IsValidVehicle(15));
	print("  IsInDepot(15):        " + vehicle.IsInDepot(15));
	print("  IsStoppedInDepot(15): " + vehicle.IsStoppedInDepot(15));

	local list = AIVehicleList();

	print("");
	print("--VehicleList--");
	print("  Count():             " + list.Count());
	list.Valuate(AIVehicleListLocation());
	print("  Location ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIVehicleListEngineType());
	print("  EngineType ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIVehicleListUnitNumber());
	print("  UnitNumber ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIVehicleListAge());
	print("  Age ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIVehicleListMaxAge());
	print("  MaxAge ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIVehicleListAgeLeft());
	print("  AgeLeft ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIVehicleListProfitThisYear());
	print("  ProfitThisYear ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIVehicleListProfitLastYear());
	print("  ProfitLastYear ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIVehicleListVehicleType());
	print("  VehicleType ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
}


function Regression::Start()
{
	this.TestInit();
	this.Std();
	this.Base();
	this.List();
	this.Airport();
	this.Cargo();
	this.Company();
	this.Event();
	this.Industry();
	this.IndustryList();
	this.Map();
	this.Marine();
	this.PathFinder();
	this.Road();
	this.Sign();
	this.Station();
	this.TileList();
	this.Town();
	this.TownList();
	this.Vehicle();
	/* Order has to be after Vehicle */
	this.Order();
}

function Regression::Stop()
{
	this.stop = true;
}

class FRegression extends AIFactory {
	function GetAuthor()      { return "OpenTTD Dev Team"; }
	function GetName()        { return "Regression"; }
	function GetDescription() { return "This runs regression-tests on all commands. On the same map the result should always be the same."; }
	function GetVersion()     { return 1; }
	function GetDate()        { return "2007-03-18"; }
	function CreateInstance() { return "Regression"; }
}

/* Only enable this if you want to run the regression test.
 *  The best way to do it is to disable all other AIs, so you are sure thisone
 *  kicks in, and use a pre-made savegame of which you already know the result.
 * You can compare the output from this AI with the pre-made one, and it should
 *  match. If not, something went wrong. */
iFRegression <-FRegression();