bin/ai/regression/regression.nut
author truebrain
Fri, 13 Jun 2008 19:57:25 +0000
branchnoai
changeset 10957 7a140b4cd91d
parent 10952 d16212cc2394
child 11014 13060e4514d5
permissions -rw-r--r--
(svn r13511) [NoAI] -Fix: add a reference to objects given in Valuate(), so they remain valid during their usage. This allows nameless functions (lambda functions) in Valuate() on long lists.
import("queue.priority_queue", "PQ", 2);
import("queue.binary_heap", "BH", 1);
import("graph.aystar", "AS", 3);
import("pathfinder.road", "RPF", 1);

class Regression extends AIController {
	function Start();
}



function Regression::TestInit()
{
	print("");
	print("--TestInit--");
	print(" TickTest: " + this.GetTick());
	this.Sleep(1);
	print(" TickTest: " + this.GetTick());
	print(" SetCommandDelay: " + AISettings.SetCommandDelay(1));
	print(" IsValid(vehicle.plane_speed): " + AIGameSettings.IsValid("vehicle.plane_speed"));
	print(" vehicle.plane_speed: " + AIGameSettings.GetValue("vehicle.plane_speed"));
	require("require.nut");
	print(" min(6, 3): " + min(6, 3));
	print(" min(3, 6): " + min(3, 6));
	print(" max(6, 3): " + max(6, 3));
	print(" max(3, 6): " + max(3, 6));
}

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

function Regression::Base()
{
	print("");
	print("--AIBase--");
	print("  Rand():       " + AIBase.Rand());
	print("  Rand():       " + AIBase.Rand());
	print("  Rand():       " + AIBase.Rand());
	print("  RandRange(0): " + AIBase.RandRange(0));
	print("  RandRange(0): " + AIBase.RandRange(0));
	print("  RandRange(0): " + AIBase.RandRange(0));
	print("  RandRange(1): " + AIBase.RandRange(1));
	print("  RandRange(1): " + AIBase.RandRange(1));
	print("  RandRange(1): " + AIBase.RandRange(1));
	print("  RandRange(2): " + AIBase.RandRange(2));
	print("  RandRange(2): " + AIBase.RandRange(2));
	print("  RandRange(2): " + AIBase.RandRange(2));
	print("  RandRange(9): " + AIBase.RandRange(9));
	print("  RandRange(9): " + AIBase.RandRange(9));
	print("  RandRange(9): " + AIBase.RandRange(9));
	print("  Chance(1, 2): " + AIBase.Chance(1, 2));
	print("  Chance(1, 2): " + AIBase.Chance(1, 2));
	print("  Chance(1, 2): " + AIBase.Chance(1, 2));
}

function Regression::Airport()
{
	print("");
	print("--AIAirport--");

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

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

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

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

function Regression::Bridge()
{
	local j = 0;

	print("");
	print("--Bridge--");
	for (local i = -1; i < 14; i++) {
		if (AIBridge.IsValidBridge(i)) j++;
		print("  Bridge " + i);
		print("    IsValidBridge():    " + AIBridge.IsValidBridge(i));
		print("    GetName():          " + AIBridge.GetName(i));
		print("    GetMaxSpeed():      " + AIBridge.GetMaxSpeed(i));
		print("    GetPrice():         " + AIBridge.GetPrice(i, 5));
		print("    GetMaxLength():     " + AIBridge.GetMaxLength(i));
		print("    GetMinLength():     " + AIBridge.GetMinLength(i));
		print("    GetYearAvailable(): " + AIBridge.GetYearAvailable(i));
	}
	print("  Valid Bridges:        " + j);

	print("  IsBridgeTile():       " + AIBridge.IsBridgeTile(33160));
	print("  RemoveBridge():       " + AIBridge.RemoveBridge(33155));
	print("  GetLastErrorString(): " + AIError.GetLastErrorString());
	print("  GetOtherBridgeEnd():  " + AIBridge.GetOtherBridgeEnd(33160));
	print("  BuildBridge():        " + AIBridge.BuildBridge(AIVehicle.VEHICLE_ROAD, 5, 33160, 33155));
	print("  IsBridgeTile():       " + AIBridge.IsBridgeTile(33160));
	print("  IsBridgeTile():       " + AIBridge.IsBridgeTile(33155));
	print("  GetOtherBridgeEnd():  " + AIBridge.GetOtherBridgeEnd(33160));
	print("  BuildBridge():        " + AIBridge.BuildBridge(AIVehicle.VEHICLE_ROAD, 5, 33160, 33155));
	print("  GetLastErrorString(): " + AIError.GetLastErrorString());
	print("  RemoveBridge():       " + AIBridge.RemoveBridge(33155));
	print("  IsBridgeTile():       " + AIBridge.IsBridgeTile(33160));
}

function Regression::BridgeList()
{
	local list = AIBridgeList();

	print("");
	print("--BridgeList--");
	print("  Count():             " + list.Count());
	list.Valuate(AIBridge.GetMaxSpeed);
	print("  MaxSpeed ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIBridge.GetPrice, 5);
	print("  Price ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIBridge.GetMaxLength);
	print("  MaxLength ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIBridge.GetMinLength);
	print("  MinLength ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIBridge.GetYearAvailable);
	print("  YearAvailable ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}

	local list = AIBridgeList_Length(14);

	print("");
	print("--BridgeList_Length--");
	print("  Count():             " + list.Count());
	list.Valuate(AIBridge.GetMaxSpeed);
	print("  MaxSpeed ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIBridge.GetPrice, 14);
	print("  Price ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
}

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

function Regression::CargoList()
{
	local list = AICargoList();

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

	list.Valuate(AICargo.GetCargoIncome, 100, 100);
	print("  CargoIncomes(100, 100) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
}

function Regression::Company()
{
	print("");
	print("--Company--");

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

	print("  GetCompanyName():            " + AICompany.GetCompanyName(AICompany.MY_COMPANY));
	print("  GetPresidentName():          " + AICompany.GetPresidentName(AICompany.MY_COMPANY));
	print("  SetPresidentName():          " + AICompany.SetPresidentName("Regression AI"));
	print("  GetPresidentName():          " + AICompany.GetPresidentName(AICompany.MY_COMPANY));
	print("  GetCompanyValue():           " + AICompany.GetCompanyValue(AICompany.MY_COMPANY));
	print("  GetBankBalance():            " + AICompany.GetBankBalance(AICompany.MY_COMPANY));
	print("  GetCompanyName():            " + AICompany.GetCompanyName(240));
	print("  GetLoanAmount():             " + AICompany.GetLoanAmount());
	print("  GetMaxLoanAmount():          " + AICompany.GetMaxLoanAmount());
	print("  GetLoanInterval():           " + AICompany.GetLoanInterval());
	print("  SetLoanAmount(1):            " + AICompany.SetLoanAmount(1));
	print("  SetLoanAmount(100):          " + AICompany.SetLoanAmount(100));
	print("  SetLoanAmount(10000):        " + AICompany.SetLoanAmount(10000));
	print("  GetLastErrorString():        " + AIError.GetLastErrorString());
	print("  GetBankBalance():            " + AICompany.GetBankBalance(AICompany.MY_COMPANY));
	print("  GetLoanAmount():             " + AICompany.GetLoanAmount());
	print("  SetMinimumLoanAmount(31337): " + AICompany.SetMinimumLoanAmount(31337));
	print("  GetBankBalance():            " + AICompany.GetBankBalance(AICompany.MY_COMPANY));
	print("  GetLoanAmount():             " + AICompany.GetLoanAmount());
	print("  SetLoanAmount(10000):        " + AICompany.SetLoanAmount(AICompany.GetMaxLoanAmount()));
	print("  GetBankBalance():            " + AICompany.GetBankBalance(AICompany.MY_COMPANY));
	print("  GetLoanAmount():             " + AICompany.GetLoanAmount());
	print("  GetCompanyHQ():              " + AICompany.GetCompanyHQ(AICompany.MY_COMPANY));
	print("  BuildCompanyHQ():            " + AICompany.BuildCompanyHQ(AIMap.GetTileIndex(127, 129)));
	print("  GetCompanyHQ():              " + AICompany.GetCompanyHQ(AICompany.MY_COMPANY));
	print("  BuildCompanyHQ():            " + AICompany.BuildCompanyHQ(AIMap.GetTileIndex(129, 129)));
	print("  GetCompanyHQ():              " + AICompany.GetCompanyHQ(AICompany.MY_COMPANY));
	print("  BuildCompanyHQ():            " + AICompany.BuildCompanyHQ(AIMap.GetTileIndex(129, 128)));
	print("  GetLastErrorString():        " + AIError.GetLastErrorString());
	print("  GetAutoRenewStatus();        " + AICompany.GetAutoRenewStatus(AICompany.MY_COMPANY));
	print("  SetAutoRenewStatus(true);    " + AICompany.SetAutoRenewStatus(true));
	print("  GetAutoRenewStatus();        " + AICompany.GetAutoRenewStatus(AICompany.MY_COMPANY));
	print("  SetAutoRenewStatus(true);    " + AICompany.SetAutoRenewStatus(true));
	print("  SetAutoRenewStatus(false);   " + AICompany.SetAutoRenewStatus(false));
	print("  GetAutoRenewMonths();        " + AICompany.GetAutoRenewMonths(AICompany.MY_COMPANY));
	print("  SetAutoRenewMonths(-12);     " + AICompany.SetAutoRenewMonths(-12));
	print("  GetAutoRenewMonths();        " + AICompany.GetAutoRenewMonths(AICompany.MY_COMPANY));
	print("  SetAutoRenewMonths(-12);     " + AICompany.SetAutoRenewMonths(-12));
	print("  SetAutoRenewMonths(6);       " + AICompany.SetAutoRenewMonths(6));
	print("  GetAutoRenewMoney();         " + AICompany.GetAutoRenewMoney(AICompany.MY_COMPANY));
	print("  SetAutoRenewMoney(200000);   " + AICompany.SetAutoRenewMoney(200000));
	print("  GetAutoRenewMoney();         " + AICompany.GetAutoRenewMoney(AICompany.MY_COMPANY));
	print("  SetAutoRenewMoney(200000);   " + AICompany.SetAutoRenewMoney(200000));
	print("  SetAutoRenewMoney(100000);   " + AICompany.SetAutoRenewMoney(100000));
}

function Regression::Engine()
{
	local j = 0;

	print("");
	print("--Engine--");
	for (local i = -1; i < 257; i++) {
		if (AIEngine.IsValidEngine(i)) j++;
		print("  Engine " + i);
		print("    IsValidEngine():    " + AIEngine.IsValidEngine(i));
		print("    GetName():          " + AIEngine.GetName(i));
		print("    GetCargoType():     " + AIEngine.GetCargoType(i));
		print("    CanRefitCargo():    " + AIEngine.CanRefitCargo(i, 1));
		print("    GetCapacity():      " + AIEngine.GetCapacity(i));
		print("    GetReliability():   " + AIEngine.GetReliability(i));
		print("    GetMaxSpeed():      " + AIEngine.GetMaxSpeed(i));
		print("    GetPrice():         " + AIEngine.GetPrice(i));
		print("    GetMaxAge():        " + AIEngine.GetMaxAge(i));
		print("    GetRunningCost():   " + AIEngine.GetRunningCost(i));
		print("    GetVehicleType():   " + AIEngine.GetVehicleType(i));
		print("    GetRoadType():      " + AIEngine.GetRoadType(i));
	}
	print("  Valid Engines:        " + j);
}

function Regression::EngineList()
{
	local list = AIEngineList(AIVehicle.VEHICLE_ROAD);

	print("");
	print("--EngineList--");
	print("  Count():             " + list.Count());
	list.Valuate(AIEngine.GetCargoType);
	print("  CargoType ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIEngine.GetCapacity);
	print("  Capacity ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIEngine.GetReliability);
	print("  Reliability ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIEngine.GetMaxSpeed);
	print("  MaxSpeed ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIEngine.GetPrice);
	print("  Price ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
}

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"));

	AIEventController.EnableAllEvents();
}

function cost_callback(old_path, new_tile, self) { if (old_path == null) return 0; return old_path.GetCost() + 1; }
function estimate_callback(tile, goals, self) { return goals[0] - tile; }
function neighbours_callback(path, cur_tile, self) { return [cur_tile + 1]; }

function Regression::Graph()
{
	print("--AyStar--");
	print("  Fastest path:");
	local as = AS(cost_callback, estimate_callback, neighbours_callback);

	local path = false;
	as.InitializePath([1], [10]);
	while (path == false) path = as.FindPath(5);

	while (path != null) {
		print("    Tile " + path.GetNode());
		path = path.GetParent();
	}
}

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

	print("");
	print("--Industry--");
	print("  GetMaxIndustryID():  " + AIIndustry.GetMaxIndustryID());
	print("  GetIndustryCount():  " + AIIndustry.GetIndustryCount());
	for (local i = -1; i < AIIndustry.GetMaxIndustryID() + 1; i++) {
		if (AIIndustry.IsValidIndustry(i)) j++;
		print("  Industry " + i);
		print("    IsValidIndustry(): " + AIIndustry.IsValidIndustry(i));
		print("    GetName():         " + AIIndustry.GetName(i));
		print("    GetLocation():     " + AIIndustry.GetLocation(i));
		print("    GetProduction():   " + AIIndustry.GetProduction(i, 1));
		print("    IsCargoAccepted(): " + AIIndustry.IsCargoAccepted(i, 1));

		local cargo_list = AICargoList();
		for (local j = cargo_list.Begin(); cargo_list.HasNext(); j = cargo_list.Next()) {
			if (AIIndustry.GetProduction(i, j) > 0) {
				print("	   GetLastMonthProduction(): " + AIIndustry.GetLastMonthProduction(i, j));
				print("	   GetLastMonthTransported(): " + AIIndustry.GetLastMonthTransported(i, j));
			}
		}
	}
	print("  Valid Industries:    " + j);
	print("  GetIndustryCount():  " + AIIndustry.GetIndustryCount());
}

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

	print("");
	print("--IndustryList--");
	print("  Count():             " + list.Count());
	list.Valuate(AIIndustry.GetLocation);
	print("  Location ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIIndustry.GetDistanceManhattanToTile, 30000);
	print("  DistanceManhattanToTile(30000) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIIndustry.GetDistanceSquareToTile, 30000);
	print("  DistanceSquareToTile(30000) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIIndustry.GetAmountOfStationsAround);
	print("  GetAmountOfStationsAround(30000) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIIndustry.IsCargoAccepted, 1);
	print("  CargoAccepted(1) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIIndustry.GetProduction, 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));
	}

	list = AIIndustryList_CargoAccepting(1);
	print("--IndustryList_CargoAccepting--");
	print("  Count():             " + list.Count());
	list.Valuate(AIIndustry.GetLocation);
	print("  Location ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}

	list = AIIndustryList_CargoProducing(1);
	print("--IndustryList_CargoProducing--");
	print("  Count():             " + list.Count());
	list.Valuate(AIIndustry.GetLocation);
	print("  Location ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
}

function CustomValuator(list_id)
{
	return list_id * 4343;
}

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(CustomValuator);
	print("  Custom ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(function (a) { return a * 42; });
	print("  Custom ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIBase.RandItem);
	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));
	}
	list2.Clear();
	for (local i = 4000; i < 4003; i++) {
		list2.AddItem(i, i);
	}
	list2.AddItem(1005, 1005);
	list.AddList(list2);
	print("  AddList({1005, 4000, 4001, 4002}):");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}

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

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

function Regression::Marine()
{
	print("");
	print("--AIMarine--");

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

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

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

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

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

	local list = AIStationList_Vehicle(11);

	print("");
	print("--StationList_Vehicle--");
	print("  Count():             " + list.Count());
	list.Valuate(AIStation.GetLocation);
	print("  Location ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIStation.GetCargoWaiting, 0);
	print("  CargoWaiting(0) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIStation.GetCargoWaiting, 1);
	print("  CargoWaiting(1) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIStation.GetCargoRating, 1);
	print("  CargoRating(1) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIStation.GetDistanceManhattanToTile, 30000);
	print("  DistanceManhattanToTile(30000) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIStation.GetDistanceSquareToTile, 30000);
	print("  DistanceSquareToTile(30000) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIStation.IsWithinTownInfluence, 0);
	print("  IsWithinTownInfluence(0) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}

	list = AIVehicleList_Station(3);

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

function Regression::Pathfinder()
{
	print("");
	print("--PathFinder--");
	print("  Road Between Towns:");

	local pathfinder = RPF();

	local path = false;
	pathfinder.InitializePath([AITown.GetLocation(0)], [AITown.GetLocation(1)])
	while (path == false) path = pathfinder.FindPath(1000);

	while (path != null) {
		print("    Tile " + path.GetNode());
		path = path.GetParent();
	}
}

function Regression::QueueTest(queue)
{
	print("  Count(): " + queue.Count());
	print("  Peek():  " + queue.Peek());
	print("  Pop():   " + queue.Pop());
	queue.Insert(6, 20);
	queue.Insert(7, 40);
	queue.Insert(2, 10);
	queue.Insert(5, 15);
	queue.Insert(8, 60);
	queue.Insert(1,  5);
	queue.Insert(3, 10);
	queue.Insert(9, 90);
	queue.Insert(4, 10);
	print("  Count(): " + queue.Count());
	print("  Peek():  " + queue.Peek());
	for (local i = 4; i > 0; i--) {
		print("  Pop():   " + queue.Pop());
	}
	queue.Insert(1, 5);
	queue.Insert(10, 100);
	for (local i = queue.Count(); i > 0; i--) {
		print("  Pop():   " + queue.Pop());
	}
	print("  Peek():  " + queue.Peek());
	print("  Pop():   " + queue.Pop());
	print("  Count(): " + queue.Count());
}

function Regression::Queues()
{
	print("");
	print("--PriorityQueue--");
	QueueTest(PQ());
	print("");
	print("--BinaryHeap--");
	QueueTest(BH());
}

function Regression::Road()
{
	print("");
	print("--Road--");
	print("  Road");
	print("    IsRoadTile():                  " + AIRoad.IsRoadTile(33411));
	print("    BuildRoad():                   " + AIRoad.BuildRoad(0, 1));
	print("    BuildRoad():                   " + AIRoad.BuildRoad(33411, 33411));
	print("    HasTransportType():            " + AITile.HasTransportType(33413, AITile.TRANSPORT_ROAD));
	print("    BuildRoad():                   " + AIRoad.BuildRoad(33411, 33414));
	print("    HasTransportType():            " + AITile.HasTransportType(33413, AITile.TRANSPORT_ROAD));
	print("    AreRoadTilesConnected():       " + AIRoad.AreRoadTilesConnected(33412, 33413));
	print("    IsRoadTile():                  " + AIRoad.IsRoadTile(33411));
	print("    HasRoadType(Road):             " + AIRoad.HasRoadType(33411, AIRoad.ROADTYPE_ROAD));
	print("    HasRoadType(Tram):             " + AIRoad.HasRoadType(33411, AIRoad.ROADTYPE_TRAM));
	print("    GetNeighbourRoadCount():       " + AIRoad.GetNeighbourRoadCount(33412));
	print("    RemoveRoad():                  " + AIRoad.RemoveRoad(33411, 33411));
	print("    RemoveRoad():                  " + AIRoad.RemoveRoad(33411, 33412));
	print("    RemoveRoad():                  " + AIRoad.RemoveRoad(19590, 19590));
	print("    IsRoadTypeAvailable(Road):     " + AIRoad.IsRoadTypeAvailable(AIRoad.ROADTYPE_ROAD));
	print("    IsRoadTypeAvailable(Tram):     " + AIRoad.IsRoadTypeAvailable(AIRoad.ROADTYPE_TRAM));
	print("    SetCurrentRoadType(Tram):      " + AIRoad.SetCurrentRoadType(AIRoad.ROADTYPE_TRAM));
	print("    GetCurrentRoadType():          " + AIRoad.GetCurrentRoadType());

	print("  Depot");
	print("    IsRoadTile():                  " + AIRoad.IsRoadTile(33411));
	print("    BuildRoadDepot():              " + AIRoad.BuildRoadDepot(0, 1));
	print("    BuildRoadDepot():              " + AIRoad.BuildRoadDepot(33411, 33411));
	print("    BuildRoadDepot():              " + AIRoad.BuildRoadDepot(33411, 33414));
	print("    BuildRoadDepot():              " + AIRoad.BuildRoadDepot(33411, 33412));
	print("    HasRoadType(Road):             " + AIRoad.HasRoadType(33411, AIRoad.ROADTYPE_ROAD));
	print("    HasRoadType(Tram):             " + AIRoad.HasRoadType(33411, AIRoad.ROADTYPE_TRAM));
	print("    GetLastError():                " + AIError.GetLastError());
	print("    GetLastErrorString():          " + AIError.GetLastErrorString());
	print("    GetErrorCategory():            " + AIError.GetErrorCategory());
	print("    IsRoadTile():                  " + AIRoad.IsRoadTile(33411));
	print("    GetRoadDepotFrontTile():       " + AIRoad.GetRoadDepotFrontTile(33411));
	print("    IsRoadDepotTile():             " + AIRoad.IsRoadDepotTile(33411));
	print("    IsBuildable():                 " + AITile.IsBuildable(33411));
	print("    RemoveRoadDepot():             " + AIRoad.RemoveRoadDepot(33411));
	print("    RemoveRoadDepot():             " + AIRoad.RemoveRoadDepot(33411));

	print("  Station");
	print("    IsRoadTile():                  " + AIRoad.IsRoadTile(33411));
	print("    BuildRoadStation():            " + AIRoad.BuildRoadStation(0, 1, false, false));
	print("    BuildRoadStation():            " + AIRoad.BuildRoadStation(33411, 33411, false, false));
	print("    BuildRoadStation():            " + AIRoad.BuildRoadStation(33411, 33414, false, false));
	print("    BuildRoadStation():            " + AIRoad.BuildRoadStation(33411, 33412, false, false));
	print("    HasRoadType(Road):             " + AIRoad.HasRoadType(33411, AIRoad.ROADTYPE_ROAD));
	print("    HasRoadType(Tram):             " + AIRoad.HasRoadType(33411, AIRoad.ROADTYPE_TRAM));
	print("    IsRoadTile():                  " + AIRoad.IsRoadTile(33411));
	print("    GetDriveThroughBackTile():     " + AIRoad.GetDriveThroughBackTile(33411));
	print("    GetRoadStationFrontTile():     " + AIRoad.GetRoadStationFrontTile(33411));
	print("    IsRoadStationTile():           " + AIRoad.IsRoadStationTile(33411));
	print("    IsDriveThroughRoadStationTile: " + AIRoad.IsDriveThroughRoadStationTile(33411));
	print("    RemoveRoadStation():           " + AIRoad.RemoveRoadStation(33411));
	print("    RemoveRoadStation():           " + AIRoad.RemoveRoadStation(33411));

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

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

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

function Regression::Station()
{
	print("");
	print("--Station--");
	print("  IsValidStation(0):        " + AIStation.IsValidStation(0));
	print("  IsValidStation(1000):     " + AIStation.IsValidStation(1000));
	print("  GetName(0):               " + AIStation.GetName(0));
	print("  SetName(0):               " + AIStation.SetName(0, "Look, a station"));
	print("  GetName(0):               " + AIStation.GetName(0));
	print("  GetLocation(1):           " + AIStation.GetLocation(1));
	print("  GetLocation(1000):        " + AIStation.GetLocation(1000));
	print("  GetStationID(33411):      " + AIStation.GetStationID(33411));
	print("  GetStationID(34411):      " + AIStation.GetStationID(34411));
	print("  GetCargoWaiting(0, 0):    " + AIStation.GetCargoWaiting(0, 0));
	print("  GetCargoWaiting(1000, 0): " + AIStation.GetCargoWaiting(1000, 0));
	print("  GetCargoWaiting(0, 1000): " + AIStation.GetCargoWaiting(0, 1000));

	print("  GetStationID(33411):      " + AIStation.GetStationID(33411));
	print("  HasRoadType(3, TRAM):     " + AIStation.HasRoadType(3, AIRoad.ROADTYPE_TRAM));
	print("  HasRoadType(3, ROAD):     " + AIStation.HasRoadType(3, AIRoad.ROADTYPE_ROAD));
	print("  HasRoadType(33411, TRAM): " + AIRoad.HasRoadType(33411, AIRoad.ROADTYPE_TRAM));
	print("  HasRoadType(33411, ROAD): " + AIRoad.HasRoadType(33411, AIRoad.ROADTYPE_ROAD));
	print("  HasStationType(3, BUS):   " + AIStation.HasStationType(3, AIStation.STATION_BUS_STOP));
	print("  HasStationType(3, TRAIN): " + AIStation.HasStationType(3, AIStation.STATION_TRAIN));

	print("  GetCoverageRadius(BUS):   " + AIStation.GetCoverageRadius(AIStation.STATION_BUS_STOP));
	print("  GetCoverageRadius(TRUCK): " + AIStation.GetCoverageRadius(AIStation.STATION_TRUCK_STOP));
	print("  GetCoverageRadius(TRAIN): " + AIStation.GetCoverageRadius(AIStation.STATION_TRAIN));

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

	print("");
	print("--StationList--");
	print("  Count():             " + list.Count());
	list.Valuate(AIStation.GetLocation);
	print("  Location ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIStation.GetCargoWaiting, 0);
	print("  CargoWaiting(0) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIStation.GetCargoWaiting, 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(27631 - 256 * 1, 256 * 1 + 27631 + 2);
	print("  Count():             " + list.Count());

	list.Valuate(AITile.GetSlope);
	print("  Slope():             done");
	print("  Count():             " + list.Count());
	print("  ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
		print("    " + i + " => " + AITile.GetComplementSlope(list.GetValue(i)));
		print("    " + i + " => " + AITile.IsSteepSlope(list.GetValue(i)));
		print("    " + i + " => " + AITile.IsHalftileSlope(list.GetValue(i)));
	}
	list.Clear();

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

	list.Valuate(AITile.GetHeight);
	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(AITile.GetSlope);
	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(AITile.IsBuildable);
	list.KeepValue(1);
	print("  Buildable():         done");
	print("  KeepValue(1):        done");
	print("  Count():             " + list.Count());

	list.Valuate(AITile.IsBuildableRectangle, 3, 3);
	print("  BuildableRectangle(3, 3) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AITile.GetDistanceManhattanToTile, 30000);
	print("  DistanceManhattanToTile(30000) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AITile.GetDistanceSquareToTile, 30000);
	print("  DistanceSquareToTile(30000) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AITile.GetOwner);
	print("  GetOwner() ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}

	list.Valuate(AITile.GetCargoAcceptance, 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(AIRoad.IsRoadTile);
	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(AIRoad.GetNeighbourRoadCount);
	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(AITile.IsWaterTile);
	print("  Water():             done");
	print("  Count():             " + list.Count());
	print("  ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}

	local list = AITileList_IndustryAccepting(0, 3);
	print("");
	print("--TileList_IndustryAccepting--");
	print("  Count():             " + list.Count());
	list.Valuate(AITile.GetCargoAcceptance, 3, 1, 1, 3);
	print("  Location ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}

	local list = AITileList_IndustryProducing(1, 3);
	print("");
	print("--TileList_IndustryProducing--");
	print("  Count():             " + list.Count());
	list.Valuate(AITile.GetCargoProduction, 7, 1, 1, 3);
	print("  Location ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}

	local list = AITileList_StationType(3, AIStation.STATION_BUS_STOP);
	print("");
	print("--TileList_StationType--");
	print("  Count():             " + list.Count());
	print("  Location ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
}

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

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

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

	print("");
	print("--TownList--");
	print("  Count():             " + list.Count());
	list.Valuate(AITown.GetLocation);
	print("  Location ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AITown.GetDistanceManhattanToTile, 30000);
	print("  DistanceManhattanToTile(30000) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AITown.GetDistanceSquareToTile, 30000);
	print("  DistanceSquareToTile(30000) ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AITown.IsWithinTownInfluence, AITown.GetLocation(0));
	print("  IsWithinTownInfluence(" + AITown.GetLocation(0) + ") ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AITown.GetPopulation);
	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));
	}

	print("  HasStatue():                     " + AITown.HasStatue(list.Begin()));
	print("  GetRoadReworkDuration():         " + AITown.GetRoadReworkDuration(list.Begin()));
	print("  GetExclusiveRightsPlayer():      " + AITown.GetExclusiveRightsPlayer(list.Begin()));
	print("  GetExclusiveRightsDuration():    " + AITown.GetExclusiveRightsDuration(list.Begin()));
	print("  IsActionAvailable(BUILD_STATUE): " + AITown.IsActionAvailable(list.Begin(), AITown.TOWN_ACTION_BUILD_STATUE));
	print("  PerformTownAction(BUILD_STATUE): " + AITown.PerformTownAction(list.Begin(), AITown.TOWN_ACTION_BUILD_STATUE));
	print("  IsActionAvailable(BUILD_STATUE): " + AITown.IsActionAvailable(list.Begin(), AITown.TOWN_ACTION_BUILD_STATUE));
	print("  HasStatue():                     " + AITown.HasStatue(list.Begin()));
}

function Regression::Tunnel()
{
	print("");
	print("--Tunnel--");
	print("  IsTunnelTile():       " + AITunnel.IsTunnelTile(29050));
	print("  RemoveTunnel():       " + AITunnel.RemoveTunnel(29050));
	print("  GetOtherTunnelEnd():  " + AITunnel.GetOtherTunnelEnd(29050));
	print("  BuildTunnel():        " + AITunnel.BuildTunnel(AIVehicle.VEHICLE_ROAD, 29050));
	print("  GetOtherTunnelEnd():  " + AITunnel.GetOtherTunnelEnd(29050));
	print("  IsTunnelTile():       " + AITunnel.IsTunnelTile(29050));
	print("  IsTunnelTile():       " + AITunnel.IsTunnelTile(28026));
	print("  RemoveTunnel():       " + AITunnel.RemoveTunnel(29050));
	print("  IsTunnelTile():       " + AITunnel.IsTunnelTile(29050));

	print("  --Errors--");
	print("  BuildTunnel():        " + AITunnel.BuildTunnel(AIVehicle.VEHICLE_ROAD, 7529));
	print("  BuildTunnel():        " + AITunnel.BuildTunnel(AIVehicle.VEHICLE_ROAD, 8043));
	print("  GetLastErrorString(): " + AIError.GetLastErrorString());
	print("  RemoveTunnel():       " + AITunnel.RemoveTunnel(7529));
}

function Regression::Vehicle()
{
	local accounting = AIAccounting();

	print("");
	print("--Vehicle--");
	print("  IsValidVehicle(-1):   " + AIVehicle.IsValidVehicle(-1));
	print("  IsValidVehicle(0):    " + AIVehicle.IsValidVehicle(0));
	print("  IsValidVehicle(11):   " + AIVehicle.IsValidVehicle(11));
	print("  ISValidVehicle(9999): " + AIVehicle.IsValidVehicle(9999));

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

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

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

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

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

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

	bank = AICompany.GetBankBalance(AICompany.MY_COMPANY);

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

	bank_after = AICompany.GetBankBalance(AICompany.MY_COMPANY);

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

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

	print("  --VehicleData--");
	print("    GetLocation():       " + AIVehicle.GetLocation(11));
	print("    GetEngineType():     " + AIVehicle.GetEngineType(11));
	print("    GetUnitNumber():     " + AIVehicle.GetUnitNumber(11));
	print("    GetAge():            " + AIVehicle.GetAge(11));
	print("    GetMaxAge():         " + AIVehicle.GetMaxAge(11));
	print("    GetAgeLeft():        " + AIVehicle.GetAgeLeft(11));
	print("    GetCurrentSpeed():   " + AIVehicle.GetCurrentSpeed(11));
	print("    GetRunningCost():    " + AIVehicle.GetRunningCost(11));
	print("    GetProfitThisYear(): " + AIVehicle.GetProfitThisYear(11));
	print("    GetProfitLastYear(): " + AIVehicle.GetProfitLastYear(11));
	print("    GetVehicleType():    " + AIVehicle.GetVehicleType(11));
	print("    GetRoadType():       " + AIVehicle.GetRoadType(11));
	print("    GetCapacity():       " + AIVehicle.GetCapacity(11, 10));
	print("    GetCargoLoad():      " + AIVehicle.GetCargoLoad(11, 10));
	print("    IsInDepot():         " + AIVehicle.IsInDepot(11));
	print("    IsStoppedInDepot():  " + AIVehicle.IsStoppedInDepot(11));

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

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

	print("  --Errors--");
	print("    RefitVehicle():        " + AIVehicle.RefitVehicle(11, 0));
	print("    GetLastErrorString():  " + AIError.GetLastErrorString());
	print("    SellVehicle():         " + AIVehicle.SellVehicle(11));
	print("    GetLastErrorString():  " + AIError.GetLastErrorString());
	print("    SendVehicleToDepot():  " + AIVehicle.SendVehicleToDepot(12));
	print("    GetLastErrorString():  " + AIError.GetLastErrorString());

	local list = AIVehicleList();

	print("");
	print("--VehicleList--");
	print("  Count():             " + list.Count());
	list.Valuate(AIVehicle.GetLocation);
	print("  Location ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIVehicle.GetEngineType);
	print("  EngineType ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIVehicle.GetUnitNumber);
	print("  UnitNumber ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIVehicle.GetAge);
	print("  Age ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIVehicle.GetMaxAge);
	print("  MaxAge ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIVehicle.GetAgeLeft);
	print("  AgeLeft ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIVehicle.GetCurrentSpeed);
	print("  CurrentSpeed ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIVehicle.GetRunningCost);
	print("  RunningCost ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIVehicle.GetProfitThisYear);
	print("  ProfitThisYear ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIVehicle.GetProfitLastYear);
	print("  ProfitLastYear ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIVehicle.GetVehicleType);
	print("  VehicleType ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIVehicle.GetRoadType);
	print("  RoadType ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIVehicle.GetCapacity, 10);
	print("  VehicleType ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
	list.Valuate(AIVehicle.GetCargoLoad, 10);
	print("  VehicleType ListDump:");
	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
		print("    " + i + " => " + list.GetValue(i));
	}
}

function Regression::PrintSubsidy(subsidy_id)
{
	print("      --Subsidy (" + subsidy_id + ") --");
	print("        IsValidSubsidy():     " + AISubsidy.IsValidSubsidy(subsidy_id));
	print("        IsAwarded():          " + AISubsidy.IsAwarded(subsidy_id));
	print("        GetAwardedTo():       " + AISubsidy.GetAwardedTo(subsidy_id));
	print("        GetExpireDate():      " + AISubsidy.GetExpireDate(subsidy_id));
	print("        SourceIsTown():       " + AISubsidy.SourceIsTown(subsidy_id));
	print("        GetSource():          " + AISubsidy.GetSource(subsidy_id));
	print("        DestionationIsTown(): " + AISubsidy.DestinationIsTown(subsidy_id));
	print("        GetDestionation():    " + AISubsidy.GetDestination(subsidy_id));
	print("        GetCargoType():       " + AISubsidy.GetCargoType(subsidy_id));
}


function Regression::Start()
{
	this.TestInit();
	this.Std();
	this.Base();
	this.List();
	this.Airport();
	this.Bridge();
	this.BridgeList();
	this.Cargo();
	this.CargoList();
	this.Company();
	this.Engine();
	this.EngineList();
	this.Event();
	this.Graph();
	this.Industry();
	this.IndustryList();
	this.Map();
	this.Marine();
	this.Pathfinder();
	this.Queues();
	this.Road();
	this.Sign();
	this.Station();
	this.TileList();
	this.Town();
	this.TownList();
	this.Tunnel();
	this.Vehicle();
	/* Order has to be after Vehicle */
	this.Order();
	PrintSubsidy(0);

	/* Sleep now, to give time for events to happen */
	Sleep(4000);

	while (AIEventController.IsEventWaiting()) {
		local e = AIEventController.GetNextEvent();
		print("  GetNextEvent:          " + (e == null ? "null" : "instance"));
		print("    GetEventType:        " + e.GetEventType());
		switch (e.GetEventType()) {
			case AIEvent.AI_ET_SUBSIDY_OFFER:
				local c = AIEventSubsidyOffer.Convert(e);
				print("      EventName:         SubsidyOffer");
				PrintSubsidy(c.GetSubsidyID());
				break;

			case AIEvent.AI_ET_VEHICLE_WAITING_IN_DEPOT:
				local c = AIEventVehicleWaitingInDepot.Convert(e);
				print("      EventName:         VehicleWaitingInDepot");
				print("      VehicleID:         " + c.GetVehicleID());
				break;

			default:
				print("      Unknown Event");
				break;
		}
	}
	print("  IsEventWaiting:        false");
}